cosplay: Touhou/Houjuu Nue #4
|
@ -54,6 +54,8 @@ class MountingBox(Model):
|
||||||
|
|
||||||
generate_side_tags: bool = True
|
generate_side_tags: bool = True
|
||||||
|
|
||||||
|
flip_y: bool = False
|
||||||
|
|
||||||
@target(kind=TargetKind.DXF)
|
@target(kind=TargetKind.DXF)
|
||||||
def profile(self) -> Cq.Sketch:
|
def profile(self) -> Cq.Sketch:
|
||||||
bx, by = 0, 0
|
bx, by = 0, 0
|
||||||
|
@ -88,8 +90,10 @@ class MountingBox(Model):
|
||||||
if self.generate_side_tags:
|
if self.generate_side_tags:
|
||||||
result.faces("<Y").workplane(origin=result.vertices("<X and <Y and >Z").val().Center()).tagPlane("left")
|
result.faces("<Y").workplane(origin=result.vertices("<X and <Y and >Z").val().Center()).tagPlane("left")
|
||||||
result.faces(">Y").workplane(origin=result.vertices("<X and >Y and >Z").val().Center()).tagPlane("right")
|
result.faces(">Y").workplane(origin=result.vertices("<X and >Y and >Z").val().Center()).tagPlane("right")
|
||||||
result.faces("<X").workplane(origin=result.vertices("<X and <Y and >Z").val().Center()).tagPlane("bot")
|
|
||||||
result.faces(">X").workplane(origin=result.vertices(">X and <Y and >Z").val().Center()).tagPlane("top")
|
c_y = ">Y" if self.flip_y else "<Y"
|
||||||
|
result.faces("<X").workplane(origin=result.vertices(f"<X and {c_y} and >Z").val().Center()).tagPlane("bot")
|
||||||
|
result.faces(">X").workplane(origin=result.vertices(f">X and {c_y} and >Z").val().Center()).tagPlane("top")
|
||||||
result.faces(">Z").tag("dir")
|
result.faces(">Z").tag("dir")
|
||||||
return result
|
return result
|
||||||
|
|
||||||
|
|
|
@ -57,9 +57,21 @@ class Parameters(Model):
|
||||||
n_tooth=24
|
n_tooth=24
|
||||||
))
|
))
|
||||||
|
|
||||||
wing_r1: MW.WingProfile = field(default_factory=lambda: MW.WingProfile(name="r1"))
|
wing_r1: MW.WingR = field(default_factory=lambda: MW.WingR(name="r1"))
|
||||||
wing_r2: MW.WingProfile = field(default_factory=lambda: MW.WingProfile(name="r2"))
|
wing_r2: MW.WingR = field(default_factory=lambda: MW.WingR(name="r2"))
|
||||||
wing_r3: MW.WingProfile = field(default_factory=lambda: MW.WingProfile(name="r3"))
|
wing_r3: MW.WingR = field(default_factory=lambda: MW.WingR(name="r3"))
|
||||||
|
wing_l1: MW.WingL = field(default_factory=lambda: MW.WingL(
|
||||||
|
name="l1",
|
||||||
|
wrist_angle=-45.0,
|
||||||
|
))
|
||||||
|
wing_l2: MW.WingL = field(default_factory=lambda: MW.WingL(
|
||||||
|
name="l2",
|
||||||
|
wrist_angle=-30.0,
|
||||||
|
))
|
||||||
|
wing_l3: MW.WingL = field(default_factory=lambda: MW.WingL(
|
||||||
|
name="l3",
|
||||||
|
wrist_angle=0.0,
|
||||||
|
))
|
||||||
|
|
||||||
trident: MT.Trident = field(default_factory=lambda: MT.Trident())
|
trident: MT.Trident = field(default_factory=lambda: MT.Trident())
|
||||||
|
|
||||||
|
@ -83,6 +95,15 @@ class Parameters(Model):
|
||||||
@submodel(name="wing-r3")
|
@submodel(name="wing-r3")
|
||||||
def submodel_wing_r3(self) -> Model:
|
def submodel_wing_r3(self) -> Model:
|
||||||
return self.wing_r3
|
return self.wing_r3
|
||||||
|
@submodel(name="wing-r1")
|
||||||
|
def submodel_wing_l1(self) -> Model:
|
||||||
|
return self.wing_l1
|
||||||
|
@submodel(name="wing-l2")
|
||||||
|
def submodel_wing_l2(self) -> Model:
|
||||||
|
return self.wing_l2
|
||||||
|
@submodel(name="wing-l3")
|
||||||
|
def submodel_wing_l3(self) -> Model:
|
||||||
|
return self.wing_l3
|
||||||
|
|
||||||
@assembly()
|
@assembly()
|
||||||
def wings_harness_assembly(self, parts: Optional[list[str]] = None) -> Cq.Assembly:
|
def wings_harness_assembly(self, parts: Optional[list[str]] = None) -> Cq.Assembly:
|
||||||
|
@ -95,16 +116,31 @@ class Parameters(Model):
|
||||||
.add(self.wing_r1.assembly(parts), name="wing_r1")
|
.add(self.wing_r1.assembly(parts), name="wing_r1")
|
||||||
.add(self.wing_r2.assembly(parts), name="wing_r2")
|
.add(self.wing_r2.assembly(parts), name="wing_r2")
|
||||||
.add(self.wing_r3.assembly(parts), name="wing_r3")
|
.add(self.wing_r3.assembly(parts), name="wing_r3")
|
||||||
|
.add(self.wing_l1.assembly(parts), name="wing_l1")
|
||||||
|
.add(self.wing_l2.assembly(parts), name="wing_l2")
|
||||||
|
.add(self.wing_l3.assembly(parts), name="wing_l3")
|
||||||
)
|
)
|
||||||
self.hs_hirth_joint.add_constraints(result, "harness/r1", "wing_r1/s0/hs", offset=9)
|
self.hs_hirth_joint.add_constraints(result, "harness/r1", "wing_r1/s0/hs", offset=11)
|
||||||
self.hs_hirth_joint.add_constraints(result, "harness/r2", "wing_r2/s0/hs", offset=8)
|
self.hs_hirth_joint.add_constraints(result, "harness/r2", "wing_r2/s0/hs", offset=10)
|
||||||
self.hs_hirth_joint.add_constraints(result, "harness/r3", "wing_r3/s0/hs", offset=7)
|
self.hs_hirth_joint.add_constraints(result, "harness/r3", "wing_r3/s0/hs", offset=9)
|
||||||
|
self.hs_hirth_joint.add_constraints(result, "harness/l1", "wing_l1/s0/hs", offset=6)
|
||||||
|
self.hs_hirth_joint.add_constraints(result, "harness/l2", "wing_l2/s0/hs", offset=7)
|
||||||
|
self.hs_hirth_joint.add_constraints(result, "harness/l3", "wing_l3/s0/hs", offset=8)
|
||||||
return result.solve()
|
return result.solve()
|
||||||
|
|
||||||
@submodel(name="trident")
|
@submodel(name="trident")
|
||||||
def submodel_trident(self) -> Model:
|
def submodel_trident(self) -> Model:
|
||||||
return self.trident
|
return self.trident
|
||||||
|
|
||||||
|
def stat(self) -> dict[str, float]:
|
||||||
|
a = self.wings_harness_assembly()
|
||||||
|
bbox = a.toCompound().BoundingBox()
|
||||||
|
return {
|
||||||
|
"wing-span": bbox.xlen,
|
||||||
|
"wing-thickness": bbox.ylen,
|
||||||
|
"wing-height": bbox.zlen,
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
p = Parameters()
|
p = Parameters()
|
||||||
|
|
|
@ -27,26 +27,15 @@ class Test(unittest.TestCase):
|
||||||
|
|
||||||
def test_hs_joint_parent(self):
|
def test_hs_joint_parent(self):
|
||||||
p = M.Parameters()
|
p = M.Parameters()
|
||||||
obj = p.hs_joint_parent()
|
obj = p.harness.hs_joint_parent()
|
||||||
self.assertIsInstance(obj.val().solids(), Cq.Solid, msg="H-S joint must be in one piece")
|
self.assertIsInstance(obj.val().solids(), Cq.Solid, msg="H-S joint must be in one piece")
|
||||||
|
|
||||||
def test_wing_root(self):
|
|
||||||
p = M.Parameters()
|
|
||||||
obj = p.wing_root()
|
|
||||||
assert isinstance(obj, Cq.Assembly)
|
|
||||||
#self.assertIsInstance(obj.solids(), Cq.Solid, msg="Wing root must be in one piece")
|
|
||||||
bbox = obj.toCompound().BoundingBox()
|
|
||||||
|
|
||||||
msg = "Must fix 256^3 bbox"
|
|
||||||
self.assertLess(bbox.xlen, 255, msg=msg)
|
|
||||||
self.assertLess(bbox.ylen, 255, msg=msg)
|
|
||||||
self.assertLess(bbox.zlen, 255, msg=msg)
|
|
||||||
def test_wings_assembly(self):
|
def test_wings_assembly(self):
|
||||||
p = M.Parameters()
|
p = M.Parameters()
|
||||||
p.wings_assembly()
|
p.wings_harness_assembly()
|
||||||
def test_trident_assembly(self):
|
def test_trident_assembly(self):
|
||||||
p = M.Parameters()
|
p = M.Parameters()
|
||||||
assembly = p.trident_assembly()
|
assembly = p.trident.assembly()
|
||||||
bbox = assembly.toCompound().BoundingBox()
|
bbox = assembly.toCompound().BoundingBox()
|
||||||
length = bbox.zlen
|
length = bbox.zlen
|
||||||
self.assertGreater(length, 1300)
|
self.assertGreater(length, 1300)
|
||||||
|
|
|
@ -19,7 +19,10 @@ class WingProfile(Model):
|
||||||
|
|
||||||
name: str = "wing"
|
name: str = "wing"
|
||||||
|
|
||||||
base_joint: HirthJoint = field(default_factory=lambda: HirthJoint())
|
base_joint: HirthJoint = field(default_factory=lambda: HirthJoint(
|
||||||
|
radius=30.0,
|
||||||
|
radius_inner=20.0,
|
||||||
|
))
|
||||||
root_width: float = 80.0
|
root_width: float = 80.0
|
||||||
hs_joint_corner_dx: float = 30.0
|
hs_joint_corner_dx: float = 30.0
|
||||||
hs_joint_corner_hole_diam: float = 6.0
|
hs_joint_corner_hole_diam: float = 6.0
|
||||||
|
@ -28,7 +31,7 @@ class WingProfile(Model):
|
||||||
spacer_thickness: float = 25.4 / 8
|
spacer_thickness: float = 25.4 / 8
|
||||||
|
|
||||||
shoulder_joint: ShoulderJoint = field(default_factory=lambda: ShoulderJoint(
|
shoulder_joint: ShoulderJoint = field(default_factory=lambda: ShoulderJoint(
|
||||||
height=100.0,
|
height=60.0,
|
||||||
))
|
))
|
||||||
shoulder_width: float = 30.0
|
shoulder_width: float = 30.0
|
||||||
shoulder_tip_x: float = -200.0
|
shoulder_tip_x: float = -200.0
|
||||||
|
@ -42,11 +45,6 @@ class WingProfile(Model):
|
||||||
),
|
),
|
||||||
flip=False,
|
flip=False,
|
||||||
))
|
))
|
||||||
elbow_height: float = 110
|
|
||||||
elbow_x: float = 240
|
|
||||||
elbow_y: float = 30
|
|
||||||
# Tilt of elbow w.r.t. shoulder
|
|
||||||
elbow_angle: float = 20
|
|
||||||
|
|
||||||
s2_thickness: float = 25.0
|
s2_thickness: float = 25.0
|
||||||
|
|
||||||
|
@ -56,33 +54,28 @@ class WingProfile(Model):
|
||||||
),
|
),
|
||||||
flip=True,
|
flip=True,
|
||||||
))
|
))
|
||||||
wrist_height: float = 70
|
|
||||||
# Bottom point of the wrist
|
|
||||||
wrist_x: float = 400
|
|
||||||
wrist_y: float = 200
|
|
||||||
|
|
||||||
# Tile of wrist w.r.t. shoulder
|
|
||||||
wrist_angle: float = 40
|
|
||||||
|
|
||||||
s3_thickness: float = 25.0
|
s3_thickness: float = 25.0
|
||||||
|
|
||||||
# Extends from the wrist to the tip of the arrow
|
|
||||||
arrow_height: float = 300
|
|
||||||
arrow_angle: float = 7
|
|
||||||
|
|
||||||
# Relative (in wrist coordinate) centre of the ring
|
|
||||||
ring_x: float = 40
|
|
||||||
ring_y: float = 20
|
|
||||||
ring_radius_inner: float = 22
|
|
||||||
|
|
||||||
mat_panel: Material = Material.ACRYLIC_TRANSLUSCENT
|
mat_panel: Material = Material.ACRYLIC_TRANSLUSCENT
|
||||||
mat_bracket: Material = Material.ACRYLIC_TRANSPARENT
|
mat_bracket: Material = Material.ACRYLIC_TRANSPARENT
|
||||||
mat_hs_joint: Material = Material.PLASTIC_PLA
|
mat_hs_joint: Material = Material.PLASTIC_PLA
|
||||||
role_panel: Role = Role.STRUCTURE
|
role_panel: Role = Role.STRUCTURE
|
||||||
|
|
||||||
|
# Subclass must populate
|
||||||
|
elbow_x: float
|
||||||
|
elbow_y: float
|
||||||
|
elbow_angle: float
|
||||||
|
elbow_height: float
|
||||||
|
wrist_x: float
|
||||||
|
wrist_y: float
|
||||||
|
wrist_angle: float
|
||||||
|
wrist_height: float
|
||||||
|
|
||||||
|
flip: bool = False
|
||||||
|
|
||||||
def __post_init__(self):
|
def __post_init__(self):
|
||||||
super().__init__(name=self.name)
|
super().__init__(name=self.name)
|
||||||
assert self.ring_radius > self.ring_radius_inner
|
|
||||||
|
|
||||||
self.elbow_theta = math.radians(self.elbow_angle)
|
self.elbow_theta = math.radians(self.elbow_angle)
|
||||||
self.elbow_c = math.cos(self.elbow_theta)
|
self.elbow_c = math.cos(self.elbow_theta)
|
||||||
|
@ -92,20 +85,15 @@ class WingProfile(Model):
|
||||||
self.wrist_c = math.cos(self.wrist_theta)
|
self.wrist_c = math.cos(self.wrist_theta)
|
||||||
self.wrist_s = math.sin(self.wrist_theta)
|
self.wrist_s = math.sin(self.wrist_theta)
|
||||||
self.wrist_top_x, self.wrist_top_y = self.wrist_to_abs(0, self.wrist_height)
|
self.wrist_top_x, self.wrist_top_y = self.wrist_to_abs(0, self.wrist_height)
|
||||||
self.arrow_theta = math.radians(self.arrow_angle)
|
|
||||||
self.arrow_x, self.arrow_y = self.wrist_to_abs(0, -self.arrow_height)
|
|
||||||
self.arrow_tip_x = self.arrow_x + (self.arrow_height + self.wrist_height) \
|
|
||||||
* math.sin(self.arrow_theta - self.wrist_theta)
|
|
||||||
self.arrow_tip_y = self.arrow_y + (self.arrow_height + self.wrist_height) \
|
|
||||||
* math.cos(self.arrow_theta - self.wrist_theta)
|
|
||||||
# [[c, s], [-s, c]] * [ring_x, ring_y]
|
|
||||||
self.ring_abs_x = self.wrist_top_x + self.wrist_c * self.ring_x - self.wrist_s * self.ring_y
|
|
||||||
self.ring_abs_y = self.wrist_top_y + self.wrist_s * self.ring_x + self.wrist_c * self.ring_y
|
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def root_height(self) -> float:
|
def root_height(self) -> float:
|
||||||
return self.shoulder_joint.height
|
return self.shoulder_joint.height
|
||||||
|
|
||||||
|
@property
|
||||||
|
def shoulder_height(self) -> float:
|
||||||
|
return self.shoulder_joint.height
|
||||||
|
|
||||||
@target(name="profile-s0", kind=TargetKind.DXF)
|
@target(name="profile-s0", kind=TargetKind.DXF)
|
||||||
def profile_s0(self) -> Cq.Sketch:
|
def profile_s0(self) -> Cq.Sketch:
|
||||||
tip_x = self.shoulder_tip_x
|
tip_x = self.shoulder_tip_x
|
||||||
|
@ -150,6 +138,7 @@ class WingProfile(Model):
|
||||||
holes=holes,
|
holes=holes,
|
||||||
hole_diam=self.shoulder_joint.parent_conn_hole_diam,
|
hole_diam=self.shoulder_joint.parent_conn_hole_diam,
|
||||||
centred=(True, True),
|
centred=(True, True),
|
||||||
|
flip_y=self.flip,
|
||||||
)
|
)
|
||||||
@submodel(name="spacer-s0-shoulder")
|
@submodel(name="spacer-s0-shoulder")
|
||||||
def spacer_s0_base(self) -> MountingBox:
|
def spacer_s0_base(self) -> MountingBox:
|
||||||
|
@ -170,6 +159,7 @@ class WingProfile(Model):
|
||||||
holes=holes,
|
holes=holes,
|
||||||
hole_diam=self.hs_joint_corner_hole_diam,
|
hole_diam=self.hs_joint_corner_hole_diam,
|
||||||
centred=(True, True),
|
centred=(True, True),
|
||||||
|
flip_y=self.flip,
|
||||||
)
|
)
|
||||||
|
|
||||||
def surface_s0(self, top: bool = False) -> Cq.Workplane:
|
def surface_s0(self, top: bool = False) -> Cq.Workplane:
|
||||||
|
@ -199,13 +189,16 @@ class WingProfile(Model):
|
||||||
(self.spacer_s0_shoulder().generate(), "shoulder"),
|
(self.spacer_s0_shoulder().generate(), "shoulder"),
|
||||||
(self.spacer_s0_base().generate(), "base")
|
(self.spacer_s0_base().generate(), "base")
|
||||||
]:
|
]:
|
||||||
|
top_tag, bot_tag = "top", "bot"
|
||||||
|
if self.flip:
|
||||||
|
top_tag, bot_tag = bot_tag, top_tag
|
||||||
(
|
(
|
||||||
result
|
result
|
||||||
.addS(o, name=tag,
|
.addS(o, name=tag,
|
||||||
role=Role.STRUCTURE | Role.CONNECTION,
|
role=Role.STRUCTURE | Role.CONNECTION,
|
||||||
material=self.mat_bracket)
|
material=self.mat_bracket)
|
||||||
.constrain(f"{tag}?bot", f"bot?{tag}", "Plane")
|
.constrain(f"{tag}?{bot_tag}", f"bot?{tag}", "Plane")
|
||||||
.constrain(f"{tag}?top", f"top?{tag}", "Plane")
|
.constrain(f"{tag}?{top_tag}", f"top?{tag}", "Plane")
|
||||||
.constrain(f"{tag}?dir", f"top?{tag}_dir", "Axis")
|
.constrain(f"{tag}?dir", f"top?{tag}_dir", "Axis")
|
||||||
)
|
)
|
||||||
hirth = self.base_joint.generate(is_mated=True)
|
hirth = self.base_joint.generate(is_mated=True)
|
||||||
|
@ -218,6 +211,10 @@ class WingProfile(Model):
|
||||||
|
|
||||||
|
|
||||||
### s1, s2, s3 ###
|
### s1, s2, s3 ###
|
||||||
|
def profile(self) -> Cq.Sketch:
|
||||||
|
"""
|
||||||
|
Generates profile from shoulder and above
|
||||||
|
"""
|
||||||
|
|
||||||
def _assembly_insert_spacer(
|
def _assembly_insert_spacer(
|
||||||
self,
|
self,
|
||||||
|
@ -251,12 +248,6 @@ class WingProfile(Model):
|
||||||
"Axis", param=angle)
|
"Axis", param=angle)
|
||||||
)
|
)
|
||||||
|
|
||||||
@property
|
|
||||||
def ring_radius(self) -> float:
|
|
||||||
dx = self.ring_x
|
|
||||||
dy = self.ring_y
|
|
||||||
return (dx * dx + dy * dy) ** 0.5
|
|
||||||
|
|
||||||
def elbow_to_abs(self, x: float, y: float) -> Tuple[float, float]:
|
def elbow_to_abs(self, x: float, y: float) -> Tuple[float, float]:
|
||||||
elbow_x = self.elbow_x + x * self.elbow_c - y * self.elbow_s
|
elbow_x = self.elbow_x + x * self.elbow_c - y * self.elbow_s
|
||||||
elbow_y = self.elbow_y + x * self.elbow_s + y * self.elbow_c
|
elbow_y = self.elbow_y + x * self.elbow_s + y * self.elbow_c
|
||||||
|
@ -267,77 +258,30 @@ class WingProfile(Model):
|
||||||
return wrist_x, wrist_y
|
return wrist_x, wrist_y
|
||||||
|
|
||||||
|
|
||||||
def profile(self) -> Cq.Sketch:
|
|
||||||
"""
|
|
||||||
Net profile of the wing starting from the wing root with no divisions
|
|
||||||
"""
|
|
||||||
result = (
|
|
||||||
Cq.Sketch()
|
|
||||||
.segment(
|
|
||||||
(0, 0),
|
|
||||||
(0, self.shoulder_joint.height),
|
|
||||||
tag="shoulder")
|
|
||||||
.arc(
|
|
||||||
(0, self.shoulder_joint.height),
|
|
||||||
(self.elbow_top_x, self.elbow_top_y),
|
|
||||||
(self.wrist_top_x, self.wrist_top_y),
|
|
||||||
tag="s1_top")
|
|
||||||
#.segment(
|
|
||||||
# (self.wrist_x, self.wrist_y),
|
|
||||||
# (wrist_top_x, wrist_top_y),
|
|
||||||
# tag="wrist")
|
|
||||||
.arc(
|
|
||||||
(0, 0),
|
|
||||||
(self.elbow_x, self.elbow_y),
|
|
||||||
(self.wrist_x, self.wrist_y),
|
|
||||||
tag="s1_bot")
|
|
||||||
)
|
|
||||||
result = (
|
|
||||||
result
|
|
||||||
.segment(
|
|
||||||
(self.wrist_x, self.wrist_y),
|
|
||||||
(self.arrow_x, self.arrow_y)
|
|
||||||
)
|
|
||||||
.segment(
|
|
||||||
(self.arrow_x, self.arrow_y),
|
|
||||||
(self.arrow_tip_x, self.arrow_tip_y)
|
|
||||||
)
|
|
||||||
.segment(
|
|
||||||
(self.arrow_tip_x, self.arrow_tip_y),
|
|
||||||
(self.wrist_top_x, self.wrist_top_y)
|
|
||||||
)
|
|
||||||
)
|
|
||||||
# Carve out the ring
|
|
||||||
result = result.assemble()
|
|
||||||
result = (
|
|
||||||
result
|
|
||||||
.push([(self.ring_abs_x, self.ring_abs_y)])
|
|
||||||
.circle(self.ring_radius, mode='a')
|
|
||||||
.circle(self.ring_radius_inner, mode='s')
|
|
||||||
.clean()
|
|
||||||
)
|
|
||||||
return result
|
|
||||||
|
|
||||||
def _mask_elbow(self) -> list[Tuple[float, float]]:
|
def _mask_elbow(self) -> list[Tuple[float, float]]:
|
||||||
"""
|
"""
|
||||||
Polygon shape to mask out parts above the elbow
|
Polygon shape to mask out parts above the elbow
|
||||||
"""
|
"""
|
||||||
abscissa = 200
|
l = 200
|
||||||
return [
|
return [
|
||||||
(0, -abscissa),
|
(0, -l),
|
||||||
|
(self.elbow_x, -l),
|
||||||
(self.elbow_x, self.elbow_y),
|
(self.elbow_x, self.elbow_y),
|
||||||
(self.elbow_top_x, self.elbow_top_y),
|
(self.elbow_top_x, self.elbow_top_y),
|
||||||
(0, abscissa)
|
(self.elbow_top_x, l),
|
||||||
|
(0, l)
|
||||||
]
|
]
|
||||||
|
|
||||||
def _mask_wrist(self) -> list[Tuple[float, float]]:
|
def _mask_wrist(self) -> list[Tuple[float, float]]:
|
||||||
abscissa = 200
|
l = 200
|
||||||
return [
|
return [
|
||||||
(0, -abscissa),
|
(0, -l),
|
||||||
(self.wrist_x, -abscissa),
|
(self.wrist_x, -l),
|
||||||
(self.wrist_x, self.wrist_y),
|
(self.wrist_x, self.wrist_y),
|
||||||
(self.wrist_top_x, self.wrist_top_y),
|
(self.wrist_top_x, self.wrist_top_y),
|
||||||
(0, abscissa),
|
(self.wrist_top_x, l),
|
||||||
|
(0, l),
|
||||||
]
|
]
|
||||||
|
|
||||||
|
|
||||||
|
@ -649,3 +593,214 @@ class WingProfile(Model):
|
||||||
result.solve()
|
result.solve()
|
||||||
|
|
||||||
return result
|
return result
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@dataclass(kw_only=True)
|
||||||
|
class WingR(WingProfile):
|
||||||
|
"""
|
||||||
|
Right side wings
|
||||||
|
"""
|
||||||
|
|
||||||
|
elbow_height: float = 111.0
|
||||||
|
elbow_x: float = 363.0
|
||||||
|
elbow_y: float = 44.0
|
||||||
|
# Tilt of elbow w.r.t. shoulder
|
||||||
|
elbow_angle: float = 30.0
|
||||||
|
|
||||||
|
wrist_height: float = 60.0
|
||||||
|
# Bottom point of the wrist
|
||||||
|
wrist_x: float = 403.0
|
||||||
|
wrist_y: float = 253.0
|
||||||
|
|
||||||
|
# Tile of wrist w.r.t. shoulder
|
||||||
|
wrist_angle: float = 40
|
||||||
|
# Extends from the wrist to the tip of the arrow
|
||||||
|
arrow_height: float = 300
|
||||||
|
arrow_angle: float = 8
|
||||||
|
|
||||||
|
# Relative (in wrist coordinate) centre of the ring
|
||||||
|
ring_x: float = 45
|
||||||
|
ring_y: float = 25
|
||||||
|
ring_radius_inner: float = 22
|
||||||
|
|
||||||
|
def __post_init__(self):
|
||||||
|
super().__post_init__()
|
||||||
|
self.arrow_theta = math.radians(self.arrow_angle)
|
||||||
|
self.arrow_x, self.arrow_y = self.wrist_to_abs(0, -self.arrow_height)
|
||||||
|
self.arrow_tip_x = self.arrow_x + (self.arrow_height + self.wrist_height) \
|
||||||
|
* math.sin(self.arrow_theta - self.wrist_theta)
|
||||||
|
self.arrow_tip_y = self.arrow_y + (self.arrow_height + self.wrist_height) \
|
||||||
|
* math.cos(self.arrow_theta - self.wrist_theta)
|
||||||
|
# [[c, s], [-s, c]] * [ring_x, ring_y]
|
||||||
|
self.ring_abs_x = self.wrist_top_x + self.wrist_c * self.ring_x - self.wrist_s * self.ring_y
|
||||||
|
self.ring_abs_y = self.wrist_top_y + self.wrist_s * self.ring_x + self.wrist_c * self.ring_y
|
||||||
|
assert self.ring_radius > self.ring_radius_inner
|
||||||
|
|
||||||
|
@property
|
||||||
|
def ring_radius(self) -> float:
|
||||||
|
dx = self.ring_x
|
||||||
|
dy = self.ring_y
|
||||||
|
return (dx * dx + dy * dy) ** 0.5
|
||||||
|
|
||||||
|
def profile(self) -> Cq.Sketch:
|
||||||
|
"""
|
||||||
|
Net profile of the wing starting from the wing root with no divisions
|
||||||
|
"""
|
||||||
|
result = (
|
||||||
|
Cq.Sketch()
|
||||||
|
.segment(
|
||||||
|
(0, 0),
|
||||||
|
(0, self.shoulder_joint.height),
|
||||||
|
tag="shoulder")
|
||||||
|
.spline([
|
||||||
|
(0, self.shoulder_joint.height),
|
||||||
|
(self.elbow_top_x, self.elbow_top_y),
|
||||||
|
(self.wrist_top_x, self.wrist_top_y),
|
||||||
|
],
|
||||||
|
tag="s1_top")
|
||||||
|
#.segment(
|
||||||
|
# (self.wrist_x, self.wrist_y),
|
||||||
|
# (wrist_top_x, wrist_top_y),
|
||||||
|
# tag="wrist")
|
||||||
|
.spline([
|
||||||
|
(0, 0),
|
||||||
|
(self.elbow_x, self.elbow_y),
|
||||||
|
(self.wrist_x, self.wrist_y),
|
||||||
|
],
|
||||||
|
tag="s1_bot")
|
||||||
|
)
|
||||||
|
result = (
|
||||||
|
result
|
||||||
|
.segment(
|
||||||
|
(self.wrist_x, self.wrist_y),
|
||||||
|
(self.arrow_x, self.arrow_y)
|
||||||
|
)
|
||||||
|
.segment(
|
||||||
|
(self.arrow_x, self.arrow_y),
|
||||||
|
(self.arrow_tip_x, self.arrow_tip_y)
|
||||||
|
)
|
||||||
|
.segment(
|
||||||
|
(self.arrow_tip_x, self.arrow_tip_y),
|
||||||
|
(self.wrist_top_x, self.wrist_top_y)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
# Carve out the ring
|
||||||
|
result = result.assemble()
|
||||||
|
result = (
|
||||||
|
result
|
||||||
|
.push([(self.ring_abs_x, self.ring_abs_y)])
|
||||||
|
.circle(self.ring_radius, mode='a')
|
||||||
|
.circle(self.ring_radius_inner, mode='s')
|
||||||
|
.clean()
|
||||||
|
)
|
||||||
|
return result
|
||||||
|
|
||||||
|
@dataclass(kw_only=True)
|
||||||
|
class WingL(WingProfile):
|
||||||
|
|
||||||
|
elbow_x: float = 230.0
|
||||||
|
elbow_y: float = 110.0
|
||||||
|
elbow_angle: float = -10.0
|
||||||
|
elbow_height: float = 80.0
|
||||||
|
|
||||||
|
wrist_x: float = 480.0
|
||||||
|
wrist_y: float = 0.0
|
||||||
|
wrist_angle: float = -45
|
||||||
|
wrist_height: float = 43.0
|
||||||
|
|
||||||
|
shoulder_bezier_ext: float = 80.0
|
||||||
|
elbow_bezier_ext: float = 100.0
|
||||||
|
wrist_bezier_ext: float = 30.0
|
||||||
|
|
||||||
|
arrow_length: float = 135.0
|
||||||
|
arrow_height: float = 120.0
|
||||||
|
|
||||||
|
flip: bool = True
|
||||||
|
|
||||||
|
def __post_init__(self):
|
||||||
|
super().__post_init__()
|
||||||
|
assert self.wrist_height <= self.shoulder_joint.height
|
||||||
|
|
||||||
|
def arrow_to_abs(self, x, y) -> Tuple[float, float]:
|
||||||
|
return self.wrist_to_abs(x * self.arrow_length, y * self.arrow_height / 2 + self.wrist_height / 2)
|
||||||
|
|
||||||
|
def profile(self) -> Cq.Sketch:
|
||||||
|
result = (
|
||||||
|
Cq.Sketch()
|
||||||
|
.segment(
|
||||||
|
(0,0),
|
||||||
|
(0, self.shoulder_height)
|
||||||
|
)
|
||||||
|
#.spline([
|
||||||
|
# (0, 0),
|
||||||
|
# self.elbow_to_abs(0, 0),
|
||||||
|
# self.wrist_to_abs(0, 0),
|
||||||
|
#])
|
||||||
|
#.spline([
|
||||||
|
# (0, self.shoulder_height),
|
||||||
|
# self.elbow_to_abs(0, self.elbow_height),
|
||||||
|
# self.wrist_to_abs(0, self.wrist_height),
|
||||||
|
#])
|
||||||
|
.bezier([
|
||||||
|
(0, 0),
|
||||||
|
(self.shoulder_bezier_ext, 0),
|
||||||
|
self.elbow_to_abs(-self.elbow_bezier_ext, 0),
|
||||||
|
self.elbow_to_abs(0, 0),
|
||||||
|
])
|
||||||
|
.bezier([
|
||||||
|
(0, self.shoulder_joint.height),
|
||||||
|
(self.shoulder_bezier_ext, self.shoulder_joint.height),
|
||||||
|
self.elbow_to_abs(-self.elbow_bezier_ext, self.elbow_height),
|
||||||
|
self.elbow_to_abs(0, self.elbow_height),
|
||||||
|
])
|
||||||
|
.bezier([
|
||||||
|
self.elbow_to_abs(0, 0),
|
||||||
|
self.elbow_to_abs(self.elbow_bezier_ext, 0),
|
||||||
|
self.wrist_to_abs(-self.wrist_bezier_ext, 0),
|
||||||
|
self.wrist_to_abs(0, 0),
|
||||||
|
])
|
||||||
|
.bezier([
|
||||||
|
self.elbow_to_abs(0, self.elbow_height),
|
||||||
|
self.elbow_to_abs(self.elbow_bezier_ext, self.elbow_height),
|
||||||
|
self.wrist_to_abs(-self.wrist_bezier_ext, self.wrist_height),
|
||||||
|
self.wrist_to_abs(0, self.wrist_height),
|
||||||
|
])
|
||||||
|
)
|
||||||
|
# arrow base positions
|
||||||
|
base_u, base_v = 0.3, 0.3
|
||||||
|
result = (
|
||||||
|
result
|
||||||
|
.bezier([
|
||||||
|
self.wrist_to_abs(0, self.wrist_height),
|
||||||
|
self.wrist_to_abs(self.wrist_bezier_ext, self.wrist_height),
|
||||||
|
self.arrow_to_abs(base_u, base_v),
|
||||||
|
])
|
||||||
|
.bezier([
|
||||||
|
self.wrist_to_abs(0, 0),
|
||||||
|
self.wrist_to_abs(self.wrist_bezier_ext, 0),
|
||||||
|
self.arrow_to_abs(base_u, -base_v),
|
||||||
|
])
|
||||||
|
)
|
||||||
|
# Create the arrow
|
||||||
|
arrow_beziers = [
|
||||||
|
[
|
||||||
|
(0, 1),
|
||||||
|
(0.3, 1),
|
||||||
|
(0.8, .2),
|
||||||
|
(1, 0),
|
||||||
|
],
|
||||||
|
[
|
||||||
|
(0, 1),
|
||||||
|
(0.1, 0.8),
|
||||||
|
(base_u, base_v),
|
||||||
|
]
|
||||||
|
]
|
||||||
|
arrow_beziers = [
|
||||||
|
l2
|
||||||
|
for l in arrow_beziers
|
||||||
|
for l2 in [l, [(x, -y) for x,y in l]]
|
||||||
|
]
|
||||||
|
for line in arrow_beziers:
|
||||||
|
result = result.bezier([self.arrow_to_abs(x, y) for x,y in line])
|
||||||
|
return result.assemble()
|
||||||
|
|
|
@ -57,29 +57,32 @@ typing-extensions = ">=4.6.0,<5"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "cadquery"
|
name = "cadquery"
|
||||||
version = "2.4.0"
|
version = "2.5.0.dev0"
|
||||||
description = "CadQuery is a parametric scripting language for creating and traversing CAD models"
|
description = "CadQuery is a parametric scripting language for creating and traversing CAD models"
|
||||||
optional = false
|
optional = false
|
||||||
python-versions = ">=3.8"
|
python-versions = ">=3.9"
|
||||||
files = [
|
files = []
|
||||||
{file = "cadquery-2.4.0-py3-none-any.whl", hash = "sha256:66c865b1e5db205b81a5ddc8533d4741577291292cf2dc80b104ae9e3085b195"},
|
develop = false
|
||||||
{file = "cadquery-2.4.0.tar.gz", hash = "sha256:38e8e302060f2e50943ab0f8acab985c37a73009e972c7b02767c90bef7fb3e7"},
|
|
||||||
]
|
|
||||||
|
|
||||||
[package.dependencies]
|
[package.dependencies]
|
||||||
cadquery-ocp = ">=7.7.0a0,<7.8"
|
cadquery-ocp = ">=7.7.0a0,<7.8"
|
||||||
casadi = "*"
|
casadi = "*"
|
||||||
ezdxf = "*"
|
ezdxf = "*"
|
||||||
multimethod = "1.9.1"
|
multimethod = ">=1.11,<2.0"
|
||||||
nlopt = "*"
|
nlopt = "*"
|
||||||
nptyping = "2.0.1"
|
|
||||||
path = "*"
|
path = "*"
|
||||||
typish = "*"
|
typish = "*"
|
||||||
|
|
||||||
[package.extras]
|
[package.extras]
|
||||||
dev = ["black (==19.10b0)", "click (==8.0.4)", "docutils", "ipython", "pytest"]
|
dev = ["black @ git+https://github.com/cadquery/black.git@cq", "docutils", "ipython", "pytest"]
|
||||||
ipython = ["ipython"]
|
ipython = ["ipython"]
|
||||||
|
|
||||||
|
[package.source]
|
||||||
|
type = "git"
|
||||||
|
url = "https://github.com/CadQuery/cadquery.git"
|
||||||
|
reference = "HEAD"
|
||||||
|
resolved_reference = "8ea37a71d40d383b55b8009c68987526f47a7613"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "cadquery-ocp"
|
name = "cadquery-ocp"
|
||||||
version = "7.7.2"
|
version = "7.7.2"
|
||||||
|
@ -188,13 +191,13 @@ files = [
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "exceptiongroup"
|
name = "exceptiongroup"
|
||||||
version = "1.2.1"
|
version = "1.2.2"
|
||||||
description = "Backport of PEP 654 (exception groups)"
|
description = "Backport of PEP 654 (exception groups)"
|
||||||
optional = false
|
optional = false
|
||||||
python-versions = ">=3.7"
|
python-versions = ">=3.7"
|
||||||
files = [
|
files = [
|
||||||
{file = "exceptiongroup-1.2.1-py3-none-any.whl", hash = "sha256:5258b9ed329c5bbdd31a309f53cbfb0b155341807f6ff7606a1e801a891b29ad"},
|
{file = "exceptiongroup-1.2.2-py3-none-any.whl", hash = "sha256:3111b9d131c238bec2f8f516e123e14ba243563fb135d3fe885990585aa7795b"},
|
||||||
{file = "exceptiongroup-1.2.1.tar.gz", hash = "sha256:a4785e48b045528f5bfe627b6ad554ff32def154f42372786903b7abcfe1aa16"},
|
{file = "exceptiongroup-1.2.2.tar.gz", hash = "sha256:47c2edf7c6738fafb49fd34290706d1a1a2f4d1c6df275526b62cbb4aa5393cc"},
|
||||||
]
|
]
|
||||||
|
|
||||||
[package.extras]
|
[package.extras]
|
||||||
|
@ -216,45 +219,45 @@ tests = ["asttokens (>=2.1.0)", "coverage", "coverage-enable-subprocess", "ipyth
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "ezdxf"
|
name = "ezdxf"
|
||||||
version = "1.3.1"
|
version = "1.3.2"
|
||||||
description = "A Python package to create/manipulate DXF drawings."
|
description = "A Python package to create/manipulate DXF drawings."
|
||||||
optional = false
|
optional = false
|
||||||
python-versions = ">=3.9"
|
python-versions = ">=3.9"
|
||||||
files = [
|
files = [
|
||||||
{file = "ezdxf-1.3.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:25b0523d0fb15c830689c1d9e313b4e8c278fbd6df4670394f427cece8c5f8e3"},
|
{file = "ezdxf-1.3.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:6f4eacaa8d55ddcbd64795409ff4f5e452c4b066f4e33b210bc4c6189c71ec6f"},
|
||||||
{file = "ezdxf-1.3.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:5b613573cf8b5373e5e5fb12127b17c70138a6307ac520d001d36f1ba8f1bf0d"},
|
{file = "ezdxf-1.3.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:35d1fa27f175d2b648f3aa5f31448b81ae8fe3627b0e908862a15983bdeb191b"},
|
||||||
{file = "ezdxf-1.3.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a2a79e0908d789fe4a92630b991248aca01907c069c4269c34a8f0d2a2facb95"},
|
{file = "ezdxf-1.3.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:240f7e894fe0364585d28e8f697c12e93db6fbb426c37d6a3f43a027c57d6dbf"},
|
||||||
{file = "ezdxf-1.3.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2db0790c414151cc0343bac13d81fc02b2b9c4974a17d2c0e0d40fd8d5f4a735"},
|
{file = "ezdxf-1.3.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5c20adceb7c78e1370f117615c245a293bc7fe65525457eeb287d24fa4cd96c8"},
|
||||||
{file = "ezdxf-1.3.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a7095d899c7fdf884dce2b8a629000d594894ef014b5e00d529860f0a46eed76"},
|
{file = "ezdxf-1.3.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a311c455a84e7c2f03cefa0922fa4919d6950e9207e8e7175893507889852012"},
|
||||||
{file = "ezdxf-1.3.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:92b08ac7adac6d91768b9dd6179dd35a23c7eef9382aebc14125e055eb85de28"},
|
{file = "ezdxf-1.3.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:8c2955db7f41596b7245441090d02b083cae060110fd595abc2f3347bfd3cb09"},
|
||||||
{file = "ezdxf-1.3.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:eebb9bb3caa7b150bf828f431807762174e06c497dc4c2d9251e8dabe84e660d"},
|
{file = "ezdxf-1.3.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:120273751ca4818d87a216cfd0f74d0fc73518b5ec052aa8c17bad9711463e48"},
|
||||||
{file = "ezdxf-1.3.1-cp310-cp310-win_amd64.whl", hash = "sha256:44e08030a365550ab31bcf3839c948cb9074e1b477174f44aa089de5ec9adc1b"},
|
{file = "ezdxf-1.3.2-cp310-cp310-win_amd64.whl", hash = "sha256:90274032eb4b047af2b38f71bca749dc6bff2110bb2f4c818f5f48e6864e6a97"},
|
||||||
{file = "ezdxf-1.3.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:bcaaf578a6651497bb759260ecffa221f7637b42771439b28a6af7bc1fe4c1ec"},
|
{file = "ezdxf-1.3.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:464689421c55e1c9d193da46ea461bfc82a1c0ab0007a37cbaefb44189385b04"},
|
||||||
{file = "ezdxf-1.3.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:45981c25860a21ae3329c7978517ff3b0be0a2f65ea456df24798970c10545e4"},
|
{file = "ezdxf-1.3.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:7a39234e9ccb072e2362b086f511706ce76ac5774ddb618fe7ca6710b5418f72"},
|
||||||
{file = "ezdxf-1.3.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:965096be7d02fe7edc66086b3903801a7f0673c96a1704710259ee5ec02f0512"},
|
{file = "ezdxf-1.3.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:193f5146e6c8b93e6293248467d8b0c38fa12fc41b85507300f15e85b73ce219"},
|
||||||
{file = "ezdxf-1.3.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c4a3b7c80507d4ca1a1aa5f14b02fdeced58c8b5638850b045b01b3bcb47c3b1"},
|
{file = "ezdxf-1.3.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e37534530c9734c927f6afafe1f3f5a6fdbde2bbf438a661173ff0ba86de8937"},
|
||||||
{file = "ezdxf-1.3.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:99d0479c6a02085d7b539dd0d89d08549b2d665bb7f5fa9f3a97d6deadfc0829"},
|
{file = "ezdxf-1.3.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6118e375852f6db04b66c0111ded47c0e0acd42869a43aaa302815b947c5e8de"},
|
||||||
{file = "ezdxf-1.3.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:37b36b49f1f8663d72f4ccff58fc1fa50ca87748c3b3df6a181b6cbb0a947e5a"},
|
{file = "ezdxf-1.3.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:420b6d7f80fa1bff374c7fb611ba8aef071d5523dbab9ad3a64465f7b2ac82cc"},
|
||||||
{file = "ezdxf-1.3.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:ef8bc194cc3892cbb02d08cfa9e50c9143bad5653db34018f3dde9c263559652"},
|
{file = "ezdxf-1.3.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:f60ada8f7b0d232a6d45cbfec4b205dc7a1beb94bb90a2518893e7a9b43681c6"},
|
||||||
{file = "ezdxf-1.3.1-cp311-cp311-win_amd64.whl", hash = "sha256:c03852a0b18cae7d4573e6ed84ca157d89373076af4f4539f740396d635c25c4"},
|
{file = "ezdxf-1.3.2-cp311-cp311-win_amd64.whl", hash = "sha256:06550cf39bf60f62a1db3ee43426a8c66485fc946a44324d921a901f7d35bfe7"},
|
||||||
{file = "ezdxf-1.3.1-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:29a11a8fe5d4552ca8bb1338c7b6fed513fc4f4857b30d8817eaa1309a67af7f"},
|
{file = "ezdxf-1.3.2-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:1a1bcda7d2d97f3aa3fb0db14006c91000ad51cd5aa16d51b73d42b3e88a794e"},
|
||||||
{file = "ezdxf-1.3.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:c5c016a35295e558cd9d78345b6a5bb1ab2491ff42deb52490320c25b7ea13a4"},
|
{file = "ezdxf-1.3.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:cd36e1430b6150e071466f1bd712aad8552c986a165fcabd1c74b47cf72684d6"},
|
||||||
{file = "ezdxf-1.3.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:5c000f95503851490150ad8a9b60f4a0efae6f566472543ea8d59bbd17971ad9"},
|
{file = "ezdxf-1.3.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:0e6a645036c3874c1693e6e2411647645ab67882e5c0c762f700e55ac9a0dc56"},
|
||||||
{file = "ezdxf-1.3.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:317b73a19407c0705d1f3430148154f719e65cf68e958218c80dd7bd59d1cddc"},
|
{file = "ezdxf-1.3.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c12e9602abc8444dc5606e0c39cb6826df17e7c1a01d576d586f0a39696d539d"},
|
||||||
{file = "ezdxf-1.3.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6e00ea19fed35b0e22d8256fa67fdffe99f33738133ea5974d360a7e3d8411bf"},
|
{file = "ezdxf-1.3.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:77aed29c3d14067c2e7986057b6fe6842167b89d6a35df5d1636b6627e1ea117"},
|
||||||
{file = "ezdxf-1.3.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:99bb5a3810a8657a601e075ad5827a6519a61d91dc651f1e3776dd0bc7cb223f"},
|
{file = "ezdxf-1.3.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:3e0881f8fb4fa6386ef963a657bc7291f5ec3029844ba6e7a905c9f9b713ccae"},
|
||||||
{file = "ezdxf-1.3.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:de3b08f85c79cc8bb9a579fd1b7a4951cc6a9f497f5ade2d9b3d92ca9d057288"},
|
{file = "ezdxf-1.3.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:fddf6cfd0bf7fe78273918986f917b4f515d9a6371ee1b8cf310d4cd879d33e9"},
|
||||||
{file = "ezdxf-1.3.1-cp312-cp312-win_amd64.whl", hash = "sha256:4d53bf7e069e7775c342378f328af8167238429824e49869b794d8688dd85575"},
|
{file = "ezdxf-1.3.2-cp312-cp312-win_amd64.whl", hash = "sha256:d504f843c20e9b7c2d331352ac91710bd6ebd14cf56c576a3432dacdfdde7106"},
|
||||||
{file = "ezdxf-1.3.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:37f49f6d0006a5969a736183889d38aab608d35ec2a13d9b7798271f785cde3e"},
|
{file = "ezdxf-1.3.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:b3bcd10a9ac39728d949d0edfd7eb460707d4b4620d37db41b4790c3c871dbab"},
|
||||||
{file = "ezdxf-1.3.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:aac05ab36290aac4a442d3d7bf3294a1e61a4a2ab1f275a740817d7908407cc7"},
|
{file = "ezdxf-1.3.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:4795843993061f9a3127e41328c5c02483ba619fda53b91bbe1e764b4294ad31"},
|
||||||
{file = "ezdxf-1.3.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:83cc14ec51278791f37c7369f6db961535810e3391f24e355517f11c014a85f3"},
|
{file = "ezdxf-1.3.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:cfcb2bee332917b1f7353f30d8cfe1e24774034e86d1f1360eaa0675b2c402bf"},
|
||||||
{file = "ezdxf-1.3.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d22b62a82d1031200e2217eaf0caee01d150e94f6cc9f3aaeaf621ba520d6848"},
|
{file = "ezdxf-1.3.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a13acf2a25854d735b23ba569500aa9222ae34862a5dc39a3bb867089b884274"},
|
||||||
{file = "ezdxf-1.3.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:9c344bb0e09ccc90b50b4f4833126ca6ace6b23be1fe32dd276875ee5e6bbae9"},
|
{file = "ezdxf-1.3.2-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:f3fd73b9f654491864e37153d86ceb14cfae6cc78d0693259cea49bdcd935882"},
|
||||||
{file = "ezdxf-1.3.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:819877f43dcf623c18f0fc00b9bf34180976f0078dbd6fb022ad402759379489"},
|
{file = "ezdxf-1.3.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:5629cb3a21ccc3895b57a507f046951a76836b9aaafff7dd5c1cda67ef258271"},
|
||||||
{file = "ezdxf-1.3.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:7ffad1495c0f0a44d1ff53cd5e766ec631026227d2dde3e5940d5acd38784e13"},
|
{file = "ezdxf-1.3.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:6615464a6b2a6af282716f0ab3f218e0a8abf27604e2cc638ee27285b29c8034"},
|
||||||
{file = "ezdxf-1.3.1-cp39-cp39-win_amd64.whl", hash = "sha256:3f8910132479ebd829d8c47e123db6ba0f5a8e9f7dfe79f104407a25517972c2"},
|
{file = "ezdxf-1.3.2-cp39-cp39-win_amd64.whl", hash = "sha256:e4f3dd9c93623c25488f7cddbd2914a9a18b29fc32c7ae5a95a3915b149836dc"},
|
||||||
{file = "ezdxf-1.3.1-py3-none-any.whl", hash = "sha256:68ba8a6f87b04bcdf43808adb7fed0c32a9ad158126415481b19bf4a9a8178a4"},
|
{file = "ezdxf-1.3.2-py3-none-any.whl", hash = "sha256:4451a04765323e93df943a0584db50f3851be0ca4aa8b8a4ee809faf492b3a5d"},
|
||||||
{file = "ezdxf-1.3.1.zip", hash = "sha256:160c8e0bbc8bc0d199a2299a6b489df5fa88ab724550243783c81c4ad3e409dd"},
|
{file = "ezdxf-1.3.2.zip", hash = "sha256:ecaa9e69f20fb66245164f235e616dd0789a11ac8a72a0302780b77621e1c354"},
|
||||||
]
|
]
|
||||||
|
|
||||||
[package.dependencies]
|
[package.dependencies]
|
||||||
|
@ -271,53 +274,53 @@ draw5 = ["Pillow", "PyMuPDF (>=1.20.0)", "PyQt5", "matplotlib"]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "fonttools"
|
name = "fonttools"
|
||||||
version = "4.53.0"
|
version = "4.53.1"
|
||||||
description = "Tools to manipulate font files"
|
description = "Tools to manipulate font files"
|
||||||
optional = false
|
optional = false
|
||||||
python-versions = ">=3.8"
|
python-versions = ">=3.8"
|
||||||
files = [
|
files = [
|
||||||
{file = "fonttools-4.53.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:52a6e0a7a0bf611c19bc8ec8f7592bdae79c8296c70eb05917fd831354699b20"},
|
{file = "fonttools-4.53.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:0679a30b59d74b6242909945429dbddb08496935b82f91ea9bf6ad240ec23397"},
|
||||||
{file = "fonttools-4.53.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:099634631b9dd271d4a835d2b2a9e042ccc94ecdf7e2dd9f7f34f7daf333358d"},
|
{file = "fonttools-4.53.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:e8bf06b94694251861ba7fdeea15c8ec0967f84c3d4143ae9daf42bbc7717fe3"},
|
||||||
{file = "fonttools-4.53.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e40013572bfb843d6794a3ce076c29ef4efd15937ab833f520117f8eccc84fd6"},
|
{file = "fonttools-4.53.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b96cd370a61f4d083c9c0053bf634279b094308d52fdc2dd9a22d8372fdd590d"},
|
||||||
{file = "fonttools-4.53.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:715b41c3e231f7334cbe79dfc698213dcb7211520ec7a3bc2ba20c8515e8a3b5"},
|
{file = "fonttools-4.53.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a1c7c5aa18dd3b17995898b4a9b5929d69ef6ae2af5b96d585ff4005033d82f0"},
|
||||||
{file = "fonttools-4.53.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:74ae2441731a05b44d5988d3ac2cf784d3ee0a535dbed257cbfff4be8bb49eb9"},
|
{file = "fonttools-4.53.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:e013aae589c1c12505da64a7d8d023e584987e51e62006e1bb30d72f26522c41"},
|
||||||
{file = "fonttools-4.53.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:95db0c6581a54b47c30860d013977b8a14febc206c8b5ff562f9fe32738a8aca"},
|
{file = "fonttools-4.53.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:9efd176f874cb6402e607e4cc9b4a9cd584d82fc34a4b0c811970b32ba62501f"},
|
||||||
{file = "fonttools-4.53.0-cp310-cp310-win32.whl", hash = "sha256:9cd7a6beec6495d1dffb1033d50a3f82dfece23e9eb3c20cd3c2444d27514068"},
|
{file = "fonttools-4.53.1-cp310-cp310-win32.whl", hash = "sha256:c8696544c964500aa9439efb6761947393b70b17ef4e82d73277413f291260a4"},
|
||||||
{file = "fonttools-4.53.0-cp310-cp310-win_amd64.whl", hash = "sha256:daaef7390e632283051e3cf3e16aff2b68b247e99aea916f64e578c0449c9c68"},
|
{file = "fonttools-4.53.1-cp310-cp310-win_amd64.whl", hash = "sha256:8959a59de5af6d2bec27489e98ef25a397cfa1774b375d5787509c06659b3671"},
|
||||||
{file = "fonttools-4.53.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:a209d2e624ba492df4f3bfad5996d1f76f03069c6133c60cd04f9a9e715595ec"},
|
{file = "fonttools-4.53.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:da33440b1413bad53a8674393c5d29ce64d8c1a15ef8a77c642ffd900d07bfe1"},
|
||||||
{file = "fonttools-4.53.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:4f520d9ac5b938e6494f58a25c77564beca7d0199ecf726e1bd3d56872c59749"},
|
{file = "fonttools-4.53.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:5ff7e5e9bad94e3a70c5cd2fa27f20b9bb9385e10cddab567b85ce5d306ea923"},
|
||||||
{file = "fonttools-4.53.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:eceef49f457253000e6a2d0f7bd08ff4e9fe96ec4ffce2dbcb32e34d9c1b8161"},
|
{file = "fonttools-4.53.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c6e7170d675d12eac12ad1a981d90f118c06cf680b42a2d74c6c931e54b50719"},
|
||||||
{file = "fonttools-4.53.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fa1f3e34373aa16045484b4d9d352d4c6b5f9f77ac77a178252ccbc851e8b2ee"},
|
{file = "fonttools-4.53.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bee32ea8765e859670c4447b0817514ca79054463b6b79784b08a8df3a4d78e3"},
|
||||||
{file = "fonttools-4.53.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:28d072169fe8275fb1a0d35e3233f6df36a7e8474e56cb790a7258ad822b6fd6"},
|
{file = "fonttools-4.53.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:6e08f572625a1ee682115223eabebc4c6a2035a6917eac6f60350aba297ccadb"},
|
||||||
{file = "fonttools-4.53.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:4a2a6ba400d386e904fd05db81f73bee0008af37799a7586deaa4aef8cd5971e"},
|
{file = "fonttools-4.53.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:b21952c092ffd827504de7e66b62aba26fdb5f9d1e435c52477e6486e9d128b2"},
|
||||||
{file = "fonttools-4.53.0-cp311-cp311-win32.whl", hash = "sha256:bb7273789f69b565d88e97e9e1da602b4ee7ba733caf35a6c2affd4334d4f005"},
|
{file = "fonttools-4.53.1-cp311-cp311-win32.whl", hash = "sha256:9dfdae43b7996af46ff9da520998a32b105c7f098aeea06b2226b30e74fbba88"},
|
||||||
{file = "fonttools-4.53.0-cp311-cp311-win_amd64.whl", hash = "sha256:9fe9096a60113e1d755e9e6bda15ef7e03391ee0554d22829aa506cdf946f796"},
|
{file = "fonttools-4.53.1-cp311-cp311-win_amd64.whl", hash = "sha256:d4d0096cb1ac7a77b3b41cd78c9b6bc4a400550e21dc7a92f2b5ab53ed74eb02"},
|
||||||
{file = "fonttools-4.53.0-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:d8f191a17369bd53a5557a5ee4bab91d5330ca3aefcdf17fab9a497b0e7cff7a"},
|
{file = "fonttools-4.53.1-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:d92d3c2a1b39631a6131c2fa25b5406855f97969b068e7e08413325bc0afba58"},
|
||||||
{file = "fonttools-4.53.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:93156dd7f90ae0a1b0e8871032a07ef3178f553f0c70c386025a808f3a63b1f4"},
|
{file = "fonttools-4.53.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:3b3c8ebafbee8d9002bd8f1195d09ed2bd9ff134ddec37ee8f6a6375e6a4f0e8"},
|
||||||
{file = "fonttools-4.53.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bff98816cb144fb7b85e4b5ba3888a33b56ecef075b0e95b95bcd0a5fbf20f06"},
|
{file = "fonttools-4.53.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:32f029c095ad66c425b0ee85553d0dc326d45d7059dbc227330fc29b43e8ba60"},
|
||||||
{file = "fonttools-4.53.0-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:973d030180eca8255b1bce6ffc09ef38a05dcec0e8320cc9b7bcaa65346f341d"},
|
{file = "fonttools-4.53.1-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:10f5e6c3510b79ea27bb1ebfcc67048cde9ec67afa87c7dd7efa5c700491ac7f"},
|
||||||
{file = "fonttools-4.53.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:c4ee5a24e281fbd8261c6ab29faa7fd9a87a12e8c0eed485b705236c65999109"},
|
{file = "fonttools-4.53.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:f677ce218976496a587ab17140da141557beb91d2a5c1a14212c994093f2eae2"},
|
||||||
{file = "fonttools-4.53.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:bd5bc124fae781a4422f61b98d1d7faa47985f663a64770b78f13d2c072410c2"},
|
{file = "fonttools-4.53.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:9e6ceba2a01b448e36754983d376064730690401da1dd104ddb543519470a15f"},
|
||||||
{file = "fonttools-4.53.0-cp312-cp312-win32.whl", hash = "sha256:a239afa1126b6a619130909c8404070e2b473dd2b7fc4aacacd2e763f8597fea"},
|
{file = "fonttools-4.53.1-cp312-cp312-win32.whl", hash = "sha256:791b31ebbc05197d7aa096bbc7bd76d591f05905d2fd908bf103af4488e60670"},
|
||||||
{file = "fonttools-4.53.0-cp312-cp312-win_amd64.whl", hash = "sha256:45b4afb069039f0366a43a5d454bc54eea942bfb66b3fc3e9a2c07ef4d617380"},
|
{file = "fonttools-4.53.1-cp312-cp312-win_amd64.whl", hash = "sha256:6ed170b5e17da0264b9f6fae86073be3db15fa1bd74061c8331022bca6d09bab"},
|
||||||
{file = "fonttools-4.53.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:93bc9e5aaa06ff928d751dc6be889ff3e7d2aa393ab873bc7f6396a99f6fbb12"},
|
{file = "fonttools-4.53.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:c818c058404eb2bba05e728d38049438afd649e3c409796723dfc17cd3f08749"},
|
||||||
{file = "fonttools-4.53.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:2367d47816cc9783a28645bc1dac07f8ffc93e0f015e8c9fc674a5b76a6da6e4"},
|
{file = "fonttools-4.53.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:651390c3b26b0c7d1f4407cad281ee7a5a85a31a110cbac5269de72a51551ba2"},
|
||||||
{file = "fonttools-4.53.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:907fa0b662dd8fc1d7c661b90782ce81afb510fc4b7aa6ae7304d6c094b27bce"},
|
{file = "fonttools-4.53.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e54f1bba2f655924c1138bbc7fa91abd61f45c68bd65ab5ed985942712864bbb"},
|
||||||
{file = "fonttools-4.53.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3e0ad3c6ea4bd6a289d958a1eb922767233f00982cf0fe42b177657c86c80a8f"},
|
{file = "fonttools-4.53.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c9cd19cf4fe0595ebdd1d4915882b9440c3a6d30b008f3cc7587c1da7b95be5f"},
|
||||||
{file = "fonttools-4.53.0-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:73121a9b7ff93ada888aaee3985a88495489cc027894458cb1a736660bdfb206"},
|
{file = "fonttools-4.53.1-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:2af40ae9cdcb204fc1d8f26b190aa16534fcd4f0df756268df674a270eab575d"},
|
||||||
{file = "fonttools-4.53.0-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:ee595d7ba9bba130b2bec555a40aafa60c26ce68ed0cf509983e0f12d88674fd"},
|
{file = "fonttools-4.53.1-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:35250099b0cfb32d799fb5d6c651220a642fe2e3c7d2560490e6f1d3f9ae9169"},
|
||||||
{file = "fonttools-4.53.0-cp38-cp38-win32.whl", hash = "sha256:fca66d9ff2ac89b03f5aa17e0b21a97c21f3491c46b583bb131eb32c7bab33af"},
|
{file = "fonttools-4.53.1-cp38-cp38-win32.whl", hash = "sha256:f08df60fbd8d289152079a65da4e66a447efc1d5d5a4d3f299cdd39e3b2e4a7d"},
|
||||||
{file = "fonttools-4.53.0-cp38-cp38-win_amd64.whl", hash = "sha256:31f0e3147375002aae30696dd1dc596636abbd22fca09d2e730ecde0baad1d6b"},
|
{file = "fonttools-4.53.1-cp38-cp38-win_amd64.whl", hash = "sha256:7b6b35e52ddc8fb0db562133894e6ef5b4e54e1283dff606fda3eed938c36fc8"},
|
||||||
{file = "fonttools-4.53.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:7d6166192dcd925c78a91d599b48960e0a46fe565391c79fe6de481ac44d20ac"},
|
{file = "fonttools-4.53.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:75a157d8d26c06e64ace9df037ee93a4938a4606a38cb7ffaf6635e60e253b7a"},
|
||||||
{file = "fonttools-4.53.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:ef50ec31649fbc3acf6afd261ed89d09eb909b97cc289d80476166df8438524d"},
|
{file = "fonttools-4.53.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:4824c198f714ab5559c5be10fd1adf876712aa7989882a4ec887bf1ef3e00e31"},
|
||||||
{file = "fonttools-4.53.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7f193f060391a455920d61684a70017ef5284ccbe6023bb056e15e5ac3de11d1"},
|
{file = "fonttools-4.53.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:becc5d7cb89c7b7afa8321b6bb3dbee0eec2b57855c90b3e9bf5fb816671fa7c"},
|
||||||
{file = "fonttools-4.53.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ba9f09ff17f947392a855e3455a846f9855f6cf6bec33e9a427d3c1d254c712f"},
|
{file = "fonttools-4.53.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:84ec3fb43befb54be490147b4a922b5314e16372a643004f182babee9f9c3407"},
|
||||||
{file = "fonttools-4.53.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:0c555e039d268445172b909b1b6bdcba42ada1cf4a60e367d68702e3f87e5f64"},
|
{file = "fonttools-4.53.1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:73379d3ffdeecb376640cd8ed03e9d2d0e568c9d1a4e9b16504a834ebadc2dfb"},
|
||||||
{file = "fonttools-4.53.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:5a4788036201c908079e89ae3f5399b33bf45b9ea4514913f4dbbe4fac08efe0"},
|
{file = "fonttools-4.53.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:02569e9a810f9d11f4ae82c391ebc6fb5730d95a0657d24d754ed7763fb2d122"},
|
||||||
{file = "fonttools-4.53.0-cp39-cp39-win32.whl", hash = "sha256:d1a24f51a3305362b94681120c508758a88f207fa0a681c16b5a4172e9e6c7a9"},
|
{file = "fonttools-4.53.1-cp39-cp39-win32.whl", hash = "sha256:aae7bd54187e8bf7fd69f8ab87b2885253d3575163ad4d669a262fe97f0136cb"},
|
||||||
{file = "fonttools-4.53.0-cp39-cp39-win_amd64.whl", hash = "sha256:1e677bfb2b4bd0e5e99e0f7283e65e47a9814b0486cb64a41adf9ef110e078f2"},
|
{file = "fonttools-4.53.1-cp39-cp39-win_amd64.whl", hash = "sha256:e5b708073ea3d684235648786f5f6153a48dc8762cdfe5563c57e80787c29fbb"},
|
||||||
{file = "fonttools-4.53.0-py3-none-any.whl", hash = "sha256:6b4f04b1fbc01a3569d63359f2227c89ab294550de277fd09d8fca6185669fa4"},
|
{file = "fonttools-4.53.1-py3-none-any.whl", hash = "sha256:f1f8758a2ad110bd6432203a344269f445a2907dc24ef6bccfd0ac4e14e0d71d"},
|
||||||
{file = "fonttools-4.53.0.tar.gz", hash = "sha256:c93ed66d32de1559b6fc348838c7572d5c0ac1e4a258e76763a5caddd8944002"},
|
{file = "fonttools-4.53.1.tar.gz", hash = "sha256:e128778a8e9bc11159ce5447f76766cefbd876f44bd79aff030287254e4752c4"},
|
||||||
]
|
]
|
||||||
|
|
||||||
[package.extras]
|
[package.extras]
|
||||||
|
@ -336,13 +339,13 @@ woff = ["brotli (>=1.0.1)", "brotlicffi (>=0.8.0)", "zopfli (>=0.1.4)"]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "ipython"
|
name = "ipython"
|
||||||
version = "8.25.0"
|
version = "8.26.0"
|
||||||
description = "IPython: Productive Interactive Computing"
|
description = "IPython: Productive Interactive Computing"
|
||||||
optional = false
|
optional = false
|
||||||
python-versions = ">=3.10"
|
python-versions = ">=3.10"
|
||||||
files = [
|
files = [
|
||||||
{file = "ipython-8.25.0-py3-none-any.whl", hash = "sha256:53eee7ad44df903a06655871cbab66d156a051fd86f3ec6750470ac9604ac1ab"},
|
{file = "ipython-8.26.0-py3-none-any.whl", hash = "sha256:e6b347c27bdf9c32ee9d31ae85defc525755a1869f14057e900675b9e8d6e6ff"},
|
||||||
{file = "ipython-8.25.0.tar.gz", hash = "sha256:c6ed726a140b6e725b911528f80439c534fac915246af3efc39440a6b0f9d716"},
|
{file = "ipython-8.26.0.tar.gz", hash = "sha256:1cec0fbba8404af13facebe83d04436a7434c7400e59f47acf467c64abd0956c"},
|
||||||
]
|
]
|
||||||
|
|
||||||
[package.dependencies]
|
[package.dependencies]
|
||||||
|
@ -369,7 +372,7 @@ nbformat = ["nbformat"]
|
||||||
notebook = ["ipywidgets", "notebook"]
|
notebook = ["ipywidgets", "notebook"]
|
||||||
parallel = ["ipyparallel"]
|
parallel = ["ipyparallel"]
|
||||||
qtconsole = ["qtconsole"]
|
qtconsole = ["qtconsole"]
|
||||||
test = ["pickleshare", "pytest", "pytest-asyncio (<0.22)", "testpath"]
|
test = ["packaging", "pickleshare", "pytest", "pytest-asyncio (<0.22)", "testpath"]
|
||||||
test-extra = ["curio", "ipython[test]", "matplotlib (!=3.2.0)", "nbformat", "numpy (>=1.23)", "pandas", "trio"]
|
test-extra = ["curio", "ipython[test]", "matplotlib (!=3.2.0)", "nbformat", "numpy (>=1.23)", "pandas", "trio"]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
|
@ -407,13 +410,13 @@ traitlets = "*"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "multimethod"
|
name = "multimethod"
|
||||||
version = "1.9.1"
|
version = "1.12"
|
||||||
description = "Multiple argument dispatching."
|
description = "Multiple argument dispatching."
|
||||||
optional = false
|
optional = false
|
||||||
python-versions = ">=3.7"
|
python-versions = ">=3.9"
|
||||||
files = [
|
files = [
|
||||||
{file = "multimethod-1.9.1-py3-none-any.whl", hash = "sha256:52f8f1f2b9d5a4c7adfdcc114dbeeebe3245a4420801e8807e26522a79fb6bc2"},
|
{file = "multimethod-1.12-py3-none-any.whl", hash = "sha256:fd0c473c43558908d97cc06e4d68e8f69202f167db46f7b4e4058893e7dbdf60"},
|
||||||
{file = "multimethod-1.9.1.tar.gz", hash = "sha256:1589bf52ca294667fd15527ea830127c763f5bfc38562e3642591ffd0fd9d56f"},
|
{file = "multimethod-1.12.tar.gz", hash = "sha256:8db8ef2a8d2a247e3570cc23317680892fdf903d84c8c1053667c8e8f7671a67"},
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
|
@ -446,24 +449,6 @@ files = [
|
||||||
[package.dependencies]
|
[package.dependencies]
|
||||||
numpy = ">=1.14"
|
numpy = ">=1.14"
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "nptyping"
|
|
||||||
version = "2.0.1"
|
|
||||||
description = "Type hints for NumPy."
|
|
||||||
optional = false
|
|
||||||
python-versions = ">=3.7"
|
|
||||||
files = [
|
|
||||||
{file = "nptyping-2.0.1-py3-none-any.whl", hash = "sha256:0fc5c4d76c65e12a77e750b9e2701dab6468d00926c8c4f383867bd70598a532"},
|
|
||||||
]
|
|
||||||
|
|
||||||
[package.dependencies]
|
|
||||||
numpy = ">=1.20.0"
|
|
||||||
|
|
||||||
[package.extras]
|
|
||||||
build = ["codecov (>=2.1.0)", "invoke (>=1.6.0)", "pip-tools (>=6.5.0)"]
|
|
||||||
dev = ["autoflake", "beartype (<0.10.0)", "beartype (>=0.10.0)", "black", "codecov (>=2.1.0)", "coverage", "invoke (>=1.6.0)", "isort", "mypy", "pip-tools (>=6.5.0)", "pylint", "setuptools", "typeguard", "wheel"]
|
|
||||||
qa = ["autoflake", "beartype (<0.10.0)", "beartype (>=0.10.0)", "black", "coverage", "isort", "mypy", "pylint", "setuptools", "typeguard", "wheel"]
|
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "numpy"
|
name = "numpy"
|
||||||
version = "1.26.4"
|
version = "1.26.4"
|
||||||
|
@ -685,45 +670,45 @@ tests = ["flake8", "loguru", "pytest", "pytest-asyncio", "pytest-cov", "pytest-m
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "scipy"
|
name = "scipy"
|
||||||
version = "1.13.1"
|
version = "1.14.0"
|
||||||
description = "Fundamental algorithms for scientific computing in Python"
|
description = "Fundamental algorithms for scientific computing in Python"
|
||||||
optional = false
|
optional = false
|
||||||
python-versions = ">=3.9"
|
python-versions = ">=3.10"
|
||||||
files = [
|
files = [
|
||||||
{file = "scipy-1.13.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:20335853b85e9a49ff7572ab453794298bcf0354d8068c5f6775a0eabf350aca"},
|
{file = "scipy-1.14.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:7e911933d54ead4d557c02402710c2396529540b81dd554fc1ba270eb7308484"},
|
||||||
{file = "scipy-1.13.1-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:d605e9c23906d1994f55ace80e0125c587f96c020037ea6aa98d01b4bd2e222f"},
|
{file = "scipy-1.14.0-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:687af0a35462402dd851726295c1a5ae5f987bd6e9026f52e9505994e2f84ef6"},
|
||||||
{file = "scipy-1.13.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cfa31f1def5c819b19ecc3a8b52d28ffdcc7ed52bb20c9a7589669dd3c250989"},
|
{file = "scipy-1.14.0-cp310-cp310-macosx_14_0_arm64.whl", hash = "sha256:07e179dc0205a50721022344fb85074f772eadbda1e1b3eecdc483f8033709b7"},
|
||||||
{file = "scipy-1.13.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f26264b282b9da0952a024ae34710c2aff7d27480ee91a2e82b7b7073c24722f"},
|
{file = "scipy-1.14.0-cp310-cp310-macosx_14_0_x86_64.whl", hash = "sha256:6a9c9a9b226d9a21e0a208bdb024c3982932e43811b62d202aaf1bb59af264b1"},
|
||||||
{file = "scipy-1.13.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:eccfa1906eacc02de42d70ef4aecea45415f5be17e72b61bafcfd329bdc52e94"},
|
{file = "scipy-1.14.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:076c27284c768b84a45dcf2e914d4000aac537da74236a0d45d82c6fa4b7b3c0"},
|
||||||
{file = "scipy-1.13.1-cp310-cp310-win_amd64.whl", hash = "sha256:2831f0dc9c5ea9edd6e51e6e769b655f08ec6db6e2e10f86ef39bd32eb11da54"},
|
{file = "scipy-1.14.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:42470ea0195336df319741e230626b6225a740fd9dce9642ca13e98f667047c0"},
|
||||||
{file = "scipy-1.13.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:27e52b09c0d3a1d5b63e1105f24177e544a222b43611aaf5bc44d4a0979e32f9"},
|
{file = "scipy-1.14.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:176c6f0d0470a32f1b2efaf40c3d37a24876cebf447498a4cefb947a79c21e9d"},
|
||||||
{file = "scipy-1.13.1-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:54f430b00f0133e2224c3ba42b805bfd0086fe488835effa33fa291561932326"},
|
{file = "scipy-1.14.0-cp310-cp310-win_amd64.whl", hash = "sha256:ad36af9626d27a4326c8e884917b7ec321d8a1841cd6dacc67d2a9e90c2f0359"},
|
||||||
{file = "scipy-1.13.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e89369d27f9e7b0884ae559a3a956e77c02114cc60a6058b4e5011572eea9299"},
|
{file = "scipy-1.14.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:6d056a8709ccda6cf36cdd2eac597d13bc03dba38360f418560a93050c76a16e"},
|
||||||
{file = "scipy-1.13.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a78b4b3345f1b6f68a763c6e25c0c9a23a9fd0f39f5f3d200efe8feda560a5fa"},
|
{file = "scipy-1.14.0-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:f0a50da861a7ec4573b7c716b2ebdcdf142b66b756a0d392c236ae568b3a93fb"},
|
||||||
{file = "scipy-1.13.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:45484bee6d65633752c490404513b9ef02475b4284c4cfab0ef946def50b3f59"},
|
{file = "scipy-1.14.0-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:94c164a9e2498e68308e6e148646e486d979f7fcdb8b4cf34b5441894bdb9caf"},
|
||||||
{file = "scipy-1.13.1-cp311-cp311-win_amd64.whl", hash = "sha256:5713f62f781eebd8d597eb3f88b8bf9274e79eeabf63afb4a737abc6c84ad37b"},
|
{file = "scipy-1.14.0-cp311-cp311-macosx_14_0_x86_64.whl", hash = "sha256:a7d46c3e0aea5c064e734c3eac5cf9eb1f8c4ceee756262f2c7327c4c2691c86"},
|
||||||
{file = "scipy-1.13.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:5d72782f39716b2b3509cd7c33cdc08c96f2f4d2b06d51e52fb45a19ca0c86a1"},
|
{file = "scipy-1.14.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9eee2989868e274aae26125345584254d97c56194c072ed96cb433f32f692ed8"},
|
||||||
{file = "scipy-1.13.1-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:017367484ce5498445aade74b1d5ab377acdc65e27095155e448c88497755a5d"},
|
{file = "scipy-1.14.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9e3154691b9f7ed73778d746da2df67a19d046a6c8087c8b385bc4cdb2cfca74"},
|
||||||
{file = "scipy-1.13.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:949ae67db5fa78a86e8fa644b9a6b07252f449dcf74247108c50e1d20d2b4627"},
|
{file = "scipy-1.14.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:c40003d880f39c11c1edbae8144e3813904b10514cd3d3d00c277ae996488cdb"},
|
||||||
{file = "scipy-1.13.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:de3ade0e53bc1f21358aa74ff4830235d716211d7d077e340c7349bc3542e884"},
|
{file = "scipy-1.14.0-cp311-cp311-win_amd64.whl", hash = "sha256:5b083c8940028bb7e0b4172acafda6df762da1927b9091f9611b0bcd8676f2bc"},
|
||||||
{file = "scipy-1.13.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:2ac65fb503dad64218c228e2dc2d0a0193f7904747db43014645ae139c8fad16"},
|
{file = "scipy-1.14.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:bff2438ea1330e06e53c424893ec0072640dac00f29c6a43a575cbae4c99b2b9"},
|
||||||
{file = "scipy-1.13.1-cp312-cp312-win_amd64.whl", hash = "sha256:cdd7dacfb95fea358916410ec61bbc20440f7860333aee6d882bb8046264e949"},
|
{file = "scipy-1.14.0-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:bbc0471b5f22c11c389075d091d3885693fd3f5e9a54ce051b46308bc787e5d4"},
|
||||||
{file = "scipy-1.13.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:436bbb42a94a8aeef855d755ce5a465479c721e9d684de76bf61a62e7c2b81d5"},
|
{file = "scipy-1.14.0-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:64b2ff514a98cf2bb734a9f90d32dc89dc6ad4a4a36a312cd0d6327170339eb0"},
|
||||||
{file = "scipy-1.13.1-cp39-cp39-macosx_12_0_arm64.whl", hash = "sha256:8335549ebbca860c52bf3d02f80784e91a004b71b059e3eea9678ba994796a24"},
|
{file = "scipy-1.14.0-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:7d3da42fbbbb860211a811782504f38ae7aaec9de8764a9bef6b262de7a2b50f"},
|
||||||
{file = "scipy-1.13.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d533654b7d221a6a97304ab63c41c96473ff04459e404b83275b60aa8f4b7004"},
|
{file = "scipy-1.14.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d91db2c41dd6c20646af280355d41dfa1ec7eead235642178bd57635a3f82209"},
|
||||||
{file = "scipy-1.13.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:637e98dcf185ba7f8e663e122ebf908c4702420477ae52a04f9908707456ba4d"},
|
{file = "scipy-1.14.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a01cc03bcdc777c9da3cfdcc74b5a75caffb48a6c39c8450a9a05f82c4250a14"},
|
||||||
{file = "scipy-1.13.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:a014c2b3697bde71724244f63de2476925596c24285c7a637364761f8710891c"},
|
{file = "scipy-1.14.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:65df4da3c12a2bb9ad52b86b4dcf46813e869afb006e58be0f516bc370165159"},
|
||||||
{file = "scipy-1.13.1-cp39-cp39-win_amd64.whl", hash = "sha256:392e4ec766654852c25ebad4f64e4e584cf19820b980bc04960bca0b0cd6eaa2"},
|
{file = "scipy-1.14.0-cp312-cp312-win_amd64.whl", hash = "sha256:4c4161597c75043f7154238ef419c29a64ac4a7c889d588ea77690ac4d0d9b20"},
|
||||||
{file = "scipy-1.13.1.tar.gz", hash = "sha256:095a87a0312b08dfd6a6155cbbd310a8c51800fc931b8c0b84003014b874ed3c"},
|
{file = "scipy-1.14.0.tar.gz", hash = "sha256:b5923f48cb840380f9854339176ef21763118a7300a88203ccd0bdd26e58527b"},
|
||||||
]
|
]
|
||||||
|
|
||||||
[package.dependencies]
|
[package.dependencies]
|
||||||
numpy = ">=1.22.4,<2.3"
|
numpy = ">=1.23.5,<2.3"
|
||||||
|
|
||||||
[package.extras]
|
[package.extras]
|
||||||
dev = ["cython-lint (>=0.12.2)", "doit (>=0.36.0)", "mypy", "pycodestyle", "pydevtool", "rich-click", "ruff", "types-psutil", "typing_extensions"]
|
dev = ["cython-lint (>=0.12.2)", "doit (>=0.36.0)", "mypy (==1.10.0)", "pycodestyle", "pydevtool", "rich-click", "ruff (>=0.0.292)", "types-psutil", "typing_extensions"]
|
||||||
doc = ["jupyterlite-pyodide-kernel", "jupyterlite-sphinx (>=0.12.0)", "jupytext", "matplotlib (>=3.5)", "myst-nb", "numpydoc", "pooch", "pydata-sphinx-theme (>=0.15.2)", "sphinx (>=5.0.0)", "sphinx-design (>=0.4.0)"]
|
doc = ["jupyterlite-pyodide-kernel", "jupyterlite-sphinx (>=0.13.1)", "jupytext", "matplotlib (>=3.5)", "myst-nb", "numpydoc", "pooch", "pydata-sphinx-theme (>=0.15.2)", "sphinx (>=5.0.0)", "sphinx-design (>=0.4.0)"]
|
||||||
test = ["array-api-strict", "asv", "gmpy2", "hypothesis (>=6.30)", "mpmath", "pooch", "pytest", "pytest-cov", "pytest-timeout", "pytest-xdist", "scikit-umfpack", "threadpoolctl"]
|
test = ["Cython", "array-api-strict", "asv", "gmpy2", "hypothesis (>=6.30)", "meson", "mpmath", "ninja", "pooch", "pytest", "pytest-cov", "pytest-timeout", "pytest-xdist", "scikit-umfpack", "threadpoolctl"]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "six"
|
name = "six"
|
||||||
|
@ -857,4 +842,4 @@ files = [
|
||||||
[metadata]
|
[metadata]
|
||||||
lock-version = "2.0"
|
lock-version = "2.0"
|
||||||
python-versions = "^3.10"
|
python-versions = "^3.10"
|
||||||
content-hash = "ec47ccffd60fbda610a5c3725fc064a08b1b794f23084672bd62beb20b1b19f7"
|
content-hash = "3403086281e26faefd12217e6dec4c0696e3468c5a9d8c952f8d988857aafba0"
|
||||||
|
|
|
@ -7,11 +7,14 @@ readme = "README.md"
|
||||||
|
|
||||||
[tool.poetry.dependencies]
|
[tool.poetry.dependencies]
|
||||||
python = "^3.10"
|
python = "^3.10"
|
||||||
cadquery = "^2.4.0"
|
cadquery = {git = "https://github.com/CadQuery/cadquery.git"}
|
||||||
build123d = "^0.5.0"
|
build123d = "^0.5.0"
|
||||||
numpy = "^1.26.4"
|
numpy = "^1.26.4"
|
||||||
colorama = "^0.4.6"
|
colorama = "^0.4.6"
|
||||||
|
|
||||||
|
# cadquery dependency
|
||||||
|
multimethod = "^1.12"
|
||||||
|
|
||||||
[build-system]
|
[build-system]
|
||||||
requires = ["poetry-core"]
|
requires = ["poetry-core"]
|
||||||
build-backend = "poetry.core.masonry.api"
|
build-backend = "poetry.core.masonry.api"
|
||||||
|
|
Loading…
Reference in New Issue