1010from smithers .io .obj import ObjHandler , WavefrontOBJ
1111from 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
1429class 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