Skip to content

Commit f485a2e

Browse files
committed
Rework polyline fillet
1 parent 6a26b38 commit f485a2e

File tree

2 files changed

+36
-21
lines changed

2 files changed

+36
-21
lines changed

declaracad/occ/impl/occ_fillet.py

Lines changed: 21 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,7 @@ def fillet_polyline(self, child: OccPolyline) -> TopoDS_Shape:
7979
d = self.declaration
8080
points = child.declaration.points
8181
operations = d.operations if d.operations else child.topology.vertices
82-
wires = []
82+
filleted_wires = []
8383

8484
# Fillet each segment of the wire
8585
for i in range(1, len(points) - 1):
@@ -118,36 +118,37 @@ def fillet_polyline(self, child: OccPolyline) -> TopoDS_Shape:
118118
fillet.AddFillet(middle_vertex, radius)
119119
result = Topology.cast_shape(fillet.Shape())
120120
wire = BRepTools.OuterWire_(result)
121-
wires.append(wire)
121+
filleted_wires.append((radius, wire))
122122

123-
assert wires
124-
if len(wires) == 1:
125-
return wires[0] # No merging needed
123+
assert filleted_wires
124+
if len(filleted_wires) == 1:
125+
r, wire = filleted_wires[0]
126+
return wire # No merging needed
126127

127128
# Merge filleted edges by taking the intersection of overlapping segments
128129
edges = []
129-
last_index = len(wires) - 1
130-
for i in range(1, len(wires)):
131-
last_wire = wires[i - 1]
132-
wire = wires[i]
133-
last_topo = Topology(shape=last_wire)
130+
last_index = len(filleted_wires) - 1
131+
last_radius, last_wire = filleted_wires[0]
132+
last_topo = Topology(shape=last_wire)
133+
edges.extend(last_topo.edges[0:-1])
134+
for i in range(1, len(filleted_wires)):
135+
radius, wire = filleted_wires[i]
134136
topo = Topology(shape=wire)
135-
if last_topo.end_point == topo.start_point:
136-
# No fillet
137-
edges.extend(last_topo.edges)
137+
if last_radius is None and radius is None:
138+
edges.append(topo.edges[0]) # Add common edge with no fillets
138139
else:
139-
if i == 1:
140-
# Add starting edges
141-
edges.extend(last_topo.edges[0:-1])
142140
common = BRepAlgoAPI_Common(last_wire, wire)
143141
common.Build()
144142
common_edges = Topology(shape=common.Shape()).edges
145143
assert common_edges, "Fillet radius too large"
146144
edges.extend(common_edges)
147-
edges.append(topo.edges[1]) # Add filleted edge
148-
if i == last_index and len(topo.edges) > 2:
149-
# Add final edge
150-
edges.extend(topo.edges[2:])
145+
if i == last_index:
146+
edges.extend(topo.edges[1:]) # Add all remaining edges
147+
elif radius is not None:
148+
edges.append(topo.edges[1]) # Add only the filleted edge
149+
last_wire = wire
150+
last_topo = topo
151+
last_radius = radius
151152

152153
# Create a wire
153154
shapes = TopTools_ListOfShape()

examples/polyline_fillet.enaml

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ enamldef Assembly(Part):
1919
]
2020

2121
Fillet:
22+
color = 'red'
2223
operations = [
2324
(5, children[0].topology.vertices[2]),
2425
]
@@ -40,4 +41,17 @@ enamldef Assembly(Part):
4041
(10, -20, 5),
4142
(1, -20, 5),
4243
(1, -20, 10),
43-
]
44+
]
45+
Fillet:
46+
color = 'purple'
47+
operations = [
48+
(5, children[0].topology.vertices[3]),
49+
]
50+
Polyline:
51+
points = [
52+
(26, 0),
53+
(26, 20),
54+
(28, 20),
55+
(28, 40),
56+
(10, 40),
57+
]

0 commit comments

Comments
 (0)