Skip to content

Commit db3af4f

Browse files
authored
add rotation and scale for blade iges faces (#115)
* add rotation and scale for blade iges faces
1 parent 67538e7 commit db3af4f

File tree

3 files changed

+85
-19
lines changed

3 files changed

+85
-19
lines changed

bladex/blade.py

Lines changed: 69 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -404,6 +404,7 @@ def rotate(self, deg_angle=None, rad_angle=None, axis='x'):
404404
elif deg_angle is not None:
405405
cosine = np.cos(np.radians(deg_angle))
406406
sine = np.sin(np.radians(deg_angle))
407+
rad_angle = deg_angle * np.pi / 180
407408
else:
408409
raise ValueError(
409410
'You have to pass either the angle in radians or in degrees.')
@@ -429,6 +430,39 @@ def rotate(self, deg_angle=None, rad_angle=None, axis='x'):
429430
self.blade_coordinates_down = np.einsum('ij, kjl->kil',
430431
rot_matrix, self.blade_coordinates_down)
431432

433+
# TODO: working but ugly
434+
for id, face in enumerate([self.upper_face, self.lower_face,
435+
self.tip_face, self.root_face]):
436+
from OCC.Core.BRepBuilderAPI import BRepBuilderAPI_Transform
437+
from OCC.Core.gp import gp_Pnt
438+
from OCC.Core.gp import gp_Dir
439+
from OCC.Core.gp import gp_Ax1
440+
from OCC.Core.gp import gp_Trsf
441+
442+
origin = gp_Pnt(0, 0, 0)
443+
if axis == 'y':
444+
direction = gp_Dir(0, 1, 0)
445+
elif axis == 'z':
446+
direction = gp_Dir(0, 0, 1)
447+
elif axis == 'x':
448+
direction = gp_Dir(1, 0, 0)
449+
else:
450+
raise ValueError('Axis must be either x, y, or z.')
451+
ax1 = gp_Ax1(origin, direction)
452+
trsf = gp_Trsf()
453+
trsf.SetRotation(ax1, rad_angle)
454+
455+
brep_tr = BRepBuilderAPI_Transform(face, trsf, True, True)
456+
face = brep_tr.Shape()
457+
if id == 0:
458+
self.upper_face = face
459+
elif id == 1:
460+
self.lower_face = face
461+
elif id == 2:
462+
self.tip_face = face
463+
elif id == 3:
464+
self.root_face = face
465+
432466
def scale(self, factor):
433467
"""
434468
Scale the blade coordinates by a specified factor.
@@ -438,11 +472,29 @@ def scale(self, factor):
438472
from OCC.Core.BRepBuilderAPI import BRepBuilderAPI_Transform
439473
self.blade_coordinates_up *= factor
440474
self.blade_coordinates_down *= factor
441-
# for face in [self.upper_face, self.lower_face, self.tip_face, self.root_face]:
442-
# brepgp_Trsf = BRepBuilderAPI_Transform()
443-
# brepgp_Trsf.SetScale(gp_Pnt(0, 0, 0), factor)
444-
# brepgp_Trsf.Perform(face, True)
445-
# face = brepgp_Trsf.Shape()
475+
476+
for id, face in enumerate([self.upper_face, self.lower_face,
477+
self.tip_face, self.root_face]):
478+
from OCC.Core.BRepBuilderAPI import BRepBuilderAPI_Transform
479+
from OCC.Core.gp import gp_Pnt
480+
from OCC.Core.gp import gp_Dir
481+
from OCC.Core.gp import gp_Ax1
482+
from OCC.Core.gp import gp_Trsf
483+
484+
origin = gp_Pnt(0, 0, 0)
485+
trsf = gp_Trsf()
486+
trsf.SetScale(origin, factor)
487+
488+
brep_tr = BRepBuilderAPI_Transform(face, trsf, True, True)
489+
face = brep_tr.Shape()
490+
if id == 0:
491+
self.upper_face = face
492+
elif id == 1:
493+
self.lower_face = face
494+
elif id == 2:
495+
self.tip_face = face
496+
elif id == 3:
497+
self.root_face = face
446498

447499
def plot(self, elev=None, azim=None, ax=None, outfile=None):
448500
"""
@@ -944,3 +996,15 @@ def __str__(self):
944996
string += '\nInduced rake from skew (in unit length)'\
945997
' for the sections = {}'.format(self.induced_rake)
946998
return string
999+
1000+
def display(self):
1001+
"""
1002+
Display the propeller with shaft.
1003+
"""
1004+
from OCC.Display.SimpleGui import init_display
1005+
display, start_display = init_display()[:2]
1006+
display.DisplayShape(self.upper_face, update=True)
1007+
display.DisplayShape(self.lower_face, update=True)
1008+
display.DisplayShape(self.root_face, update=True)
1009+
display.DisplayShape(self.tip_face, update=True)
1010+
start_display()

bladex/propeller.py

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -27,17 +27,27 @@ def __init__(self, shaft, blade, n_blades):
2727
self.shaft_solid = shaft.generate_solid()
2828

2929
blade.build(reflect=True)
30+
import copy
31+
32+
self.blades = [copy.deepcopy(blade) for _ in range(n_blades)]
33+
[
34+
blade.rotate(rad_angle=i * 2.0 * np.pi / float(n_blades))
35+
for i, blade in enumerate(self.blades)
36+
]
37+
3038
blade_solid = blade.generate_solid()
3139
blades = []
3240
blades.append(blade_solid)
3341
for i in range(n_blades - 1):
3442
blade.rotate(rad_angle=1.0 * 2.0 * np.pi / float(n_blades))
3543
blade_solid = blade.generate_solid()
3644
blades.append(blade_solid)
37-
blades_combined = blades[0]
45+
46+
blade_solids = [blade_.generate_solid() for blade_ in self.blades]
47+
blades_combined = blade_solids[0]
3848
for i in range(len(blades) - 1):
3949
print(i)
40-
boolean_union = BRepAlgoAPI_Fuse(blades_combined, blades[i + 1])
50+
boolean_union = BRepAlgoAPI_Fuse(blades_combined, blade_solids[i + 1])
4151
boolean_union.Build()
4252
if not boolean_union.IsDone():
4353
raise RuntimeError("Unsuccessful assembling of blade")
@@ -245,4 +255,4 @@ def display(self):
245255
"""
246256
display, start_display = init_display()[:2]
247257
display.DisplayShape(self.sewed_full_body, update=True)
248-
start_display()
258+
start_display()

tests/test_blade.py

Lines changed: 3 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -338,7 +338,7 @@ def test_blade_rotate_exceptions_no_transformation(self):
338338

339339
def test_rotate_deg_section_0(self):
340340
blade = create_sample_blade_NACA_10()
341-
blade.apply_transformations()
341+
blade.build()
342342
blade.rotate(deg_angle=90)
343343
rotated_coordinates = np.array([
344344
0.2969784, 0.2653103, 0.2146533, 0.1597801, 0.1024542,
@@ -361,9 +361,9 @@ def test_rotate_deg_section_0(self):
361361
np.testing.assert_almost_equal(blade.blade_coordinates_up[0][2],
362362
rotated_coordinates)
363363

364-
def test_rotate_rad_section_1_xdown(self):
364+
def test_rotate_rad(self):
365365
blade = create_sample_blade_NACA_10()
366-
blade.apply_transformations()
366+
blade.build()
367367
blade.rotate(rad_angle=np.pi / 2.0)
368368
rotated_coordinates = np.array([
369369
0.23913475, 0.17512439, 0.12479053, 0.07749333, 0.03196268,
@@ -372,21 +372,13 @@ def test_rotate_rad_section_1_xdown(self):
372372
np.testing.assert_almost_equal(blade.blade_coordinates_down[1][0],
373373
rotated_coordinates)
374374

375-
def test_rotate_rad_section_1_ydown(self):
376-
blade = create_sample_blade_NACA_10()
377-
blade.apply_transformations()
378-
blade.rotate(rad_angle=np.pi / 2.0)
379375
rotated_coordinates = np.array([
380376
-0.3488408, -0.3576312, -0.3719492, -0.3844258, -0.3936846,
381377
-0.3989522, -0.3997457, -0.3957593, -0.3867917, -0.3726862
382378
])
383379
np.testing.assert_almost_equal(blade.blade_coordinates_down[1][1],
384380
rotated_coordinates)
385381

386-
def test_rotate_rad_section_1_zdown(self):
387-
blade = create_sample_blade_NACA_10()
388-
blade.apply_transformations()
389-
blade.rotate(rad_angle=np.pi / 2.0)
390382
rotated_coordinates = np.array([
391383
0.19572966, 0.17916459, 0.14715217, 0.11052969, 0.07079877,
392384
0.02893379, -0.01426232, -0.05809137, -0.10194212, -0.14527558

0 commit comments

Comments
 (0)