Skip to content

Commit 4f2ffe4

Browse files
committed
fix iges propeller
1 parent db3af4f commit 4f2ffe4

File tree

3 files changed

+87
-34
lines changed

3 files changed

+87
-34
lines changed

bladex/blade.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -711,7 +711,7 @@ def generate_solid(self):
711711
self.upper_face, self.lower_face, self.tip_face, self.root_face
712712
]
713713

714-
sewer = BRepBuilderAPI_Sewing(1e-2)
714+
sewer = BRepBuilderAPI_Sewing(1e-7)
715715
for face in faces:
716716
sewer.Add(face)
717717
sewer.Perform()

bladex/intepolatedface.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@
1414

1515
class InterpolatedFace:
1616

17-
def __init__(self, pts, max_deg=3, tolerance=1e-10):
17+
def __init__(self, pts, max_deg=1, tolerance=1e-6):
1818

1919
print(pts.shape)
2020
if pts.ndim not in [2, 3]:

bladex/propeller.py

Lines changed: 85 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,21 @@
1010
from smithers.io.obj import ObjHandler, WavefrontOBJ
1111
from smithers.io.stlhandler import STLHandler
1212

13+
from OCC.Core.BRep import BRep_Builder
14+
from OCC.Core.TopoDS import TopoDS_Compound
15+
import copy
16+
17+
def make_compound(shapes):
18+
builder = BRep_Builder()
19+
comp = TopoDS_Compound()
20+
builder.MakeCompound(comp)
21+
22+
for s in shapes:
23+
if s is None:
24+
raise ValueError("make_compound: shape is None")
25+
builder.Add(comp, s)
26+
27+
return comp
1328

1429
class Propeller(object):
1530
"""
@@ -23,47 +38,85 @@ class Propeller(object):
2338
:cvar OCC.Core.TopoDS.TopoDS_Shell sewed_full_body: propeller with shaft shell
2439
"""
2540

26-
def __init__(self, shaft, blade, n_blades):
27-
self.shaft_solid = shaft.generate_solid()
41+
def __init__(self, shaft, blade, n_blades, reflect_blade=False):
42+
self.shaft = shaft
2843

29-
blade.build(reflect=True)
30-
import copy
44+
blade.build(reflect=reflect_blade)
3145

3246
self.blades = [copy.deepcopy(blade) for _ in range(n_blades)]
3347
[
3448
blade.rotate(rad_angle=i * 2.0 * np.pi / float(n_blades))
3549
for i, blade in enumerate(self.blades)
3650
]
3751

38-
blade_solid = blade.generate_solid()
39-
blades = []
40-
blades.append(blade_solid)
41-
for i in range(n_blades - 1):
42-
blade.rotate(rad_angle=1.0 * 2.0 * np.pi / float(n_blades))
43-
blade_solid = blade.generate_solid()
44-
blades.append(blade_solid)
4552

46-
blade_solids = [blade_.generate_solid() for blade_ in self.blades]
47-
blades_combined = blade_solids[0]
48-
for i in range(len(blades) - 1):
49-
print(i)
50-
boolean_union = BRepAlgoAPI_Fuse(blades_combined, blade_solids[i + 1])
51-
boolean_union.Build()
52-
if not boolean_union.IsDone():
53-
raise RuntimeError("Unsuccessful assembling of blade")
54-
blades_combined = boolean_union.Shape()
55-
self.blades_solid = blades_combined
56-
57-
boolean_union = BRepAlgoAPI_Fuse(self.shaft_solid, blades_combined)
58-
boolean_union.Build()
59-
result_compound = boolean_union.Shape()
53+
def tmp_stl(self, filename, linear_deflection=0.1):
54+
"""
55+
56+
"""
57+
from OCC.Core.BRepMesh import BRepMesh_IncrementalMesh
58+
from OCC.Core.StlAPI import StlAPI_Writer
59+
shapes = []
60+
for blade_ in self.blades:
61+
62+
sewer = BRepBuilderAPI_Sewing(1e-2)
63+
sewer.Add(blade_.upper_face)
64+
sewer.Add(blade_.lower_face)
65+
sewer.Add(blade_.root_face)
66+
sewer.Add(blade_.tip_face)
67+
sewer.Perform()
68+
sewed_shape = sewer.SewedShape()
69+
shapes.append(sewed_shape)
70+
71+
blades_compound = make_compound(shapes)
72+
triangulation = BRepMesh_IncrementalMesh(blades_compound, linear_deflection, True)
73+
triangulation.Perform()
74+
75+
writer = StlAPI_Writer()
76+
writer.SetASCIIMode(False)
77+
writer.Write(blades_compound, filename)
78+
79+
@property
80+
def shape(self):
81+
if hasattr(self, '_shape'):
82+
return self._shape
83+
84+
solid = self.solid
6085

6186
sewer = BRepBuilderAPI_Sewing(1e-2)
62-
sewer.Add(result_compound)
87+
sewer.Add(solid)
6388
sewer.Perform()
64-
self.sewed_full_body = sewer.SewedShape()
89+
90+
self._shape = sewer.SewedShape()
91+
return self._shape
92+
93+
@property
94+
def solid(self):
95+
"""
96+
Docstring for build
97+
98+
:param self: Description
99+
"""
100+
if hasattr(self, '_solid'):
101+
return self._solid
102+
103+
shaft_solid = self.shaft.generate_solid()
104+
blade_solids = [blade_.generate_solid() for blade_ in self.blades]
105+
blades_compound = make_compound(blade_solids)
106+
107+
fuse = BRepAlgoAPI_Fuse(shaft_solid, blades_compound)
108+
# fuse.SetRunParallel(True) # if available in your build
109+
fuse.SetFuzzyValue(1e-4)
110+
111+
fuse.Build()
112+
if not fuse.IsDone():
113+
raise RuntimeError("Fuse shaft + blades failed")
114+
115+
self._solid = fuse.Shape()
116+
return self._solid
117+
65118

66-
def generate_iges(self, filename):
119+
def export_iges(self, filename):
67120
"""
68121
Export the .iges CAD for the propeller with shaft.
69122
@@ -73,10 +126,10 @@ def generate_iges(self, filename):
73126
completed successfully
74127
"""
75128
iges_writer = IGESControl_Writer()
76-
iges_writer.AddShape(self.sewed_full_body)
129+
iges_writer.AddShape(self.shape)
77130
iges_writer.Write(filename)
78131

79-
def generate_stl(self, filename):
132+
def export_stl(self, filename):
80133
"""
81134
Export the .stl CAD for the propeller with shaft.
82135
@@ -85,7 +138,7 @@ def generate_stl(self, filename):
85138
:raises RuntimeError: if the solid assembling of blades is not
86139
completed successfully
87140
"""
88-
write_stl_file(self.sewed_full_body, filename)
141+
write_stl_file(self.shape, filename)
89142

90143
def generate_obj(self, filename, region_selector="by_coords", **kwargs):
91144
"""
@@ -254,5 +307,5 @@ def display(self):
254307
Display the propeller with shaft.
255308
"""
256309
display, start_display = init_display()[:2]
257-
display.DisplayShape(self.sewed_full_body, update=True)
310+
display.DisplayShape(self.shape, update=True)
258311
start_display()

0 commit comments

Comments
 (0)