Skip to content

Commit

Permalink
fix rotate operator for b1scad
Browse files Browse the repository at this point in the history
  • Loading branch information
bat52 committed Jan 2, 2025
1 parent 36a9734 commit d6b3027
Show file tree
Hide file tree
Showing 6 changed files with 29 additions and 32 deletions.
6 changes: 4 additions & 2 deletions src/b13d/api/core.py
Original file line number Diff line number Diff line change
Expand Up @@ -223,7 +223,7 @@ def rotate_y(self, ang: float) -> Shape: ...
@abstractmethod
def rotate_z(self, ang: float) -> Shape: ...

def rotate(self, ang: tuple[float,float,float] | float, direction: Direction = Direction.Z) -> Shape:
def rotate(self, ang: float | tuple[float,float,float], direction: Direction = Direction.Z) -> Shape:
""" Generate a cone, with direction as parameter """

if direction.upper() == Direction.X:
Expand All @@ -232,7 +232,9 @@ def rotate(self, ang: tuple[float,float,float] | float, direction: Direction =
return self.rotate_y(ang)
if direction.upper() == Direction.Z:
return self.rotate_z(ang)
assert False

# default implemntation, if not available
return self.rotate_x(ang[0]).rotate_y(ang[1]).rotate_z(ang[2])

@abstractmethod
def scale(self, x: float, y: float, z: float) -> Shape: ...
Expand Down
4 changes: 4 additions & 0 deletions src/b13d/api/mf.py
Original file line number Diff line number Diff line change
Expand Up @@ -221,6 +221,10 @@ def rotate_y(self, ang: float) -> MFShape:
def rotate_z(self, ang: float) -> MFShape:
self.solid = self.solid.rotate((0, 0, ang))
return self

def rotate(self, ang: tuple[float,float,float]) -> MFShape:
self.solid = self.solid.rotate((ang[0], ang[1], ang[2]))
return self

def scale(self, x: float, y: float, z: float) -> MFShape:
if x == 1 and y == 1 and z == 1:
Expand Down
4 changes: 4 additions & 0 deletions src/b13d/api/sp2.py
Original file line number Diff line number Diff line change
Expand Up @@ -192,6 +192,10 @@ def rotate_y(self, ang: float) -> Sp2Shape:
def rotate_z(self, ang: float) -> Sp2Shape:
self.solid = self.solid.rotate([0, 0, ang])
return self

def rotate(self, ang: tuple[float,float,float]) -> Sp2Shape:
self.solid = self.solid.rotate(ang)
return self

def scale(self, x: float, y: float, z: float) -> Sp2Shape:
self.solid = self.solid.scale([x, y, z])
Expand Down
32 changes: 8 additions & 24 deletions src/b1scad/scad/model15.scad
Original file line number Diff line number Diff line change
@@ -1,29 +1,13 @@

hull() {
union() {
translate(v = [-1.5, -2.0, -1.0]) {
sphere($fn = 16, r = 1);
difference() {
rotate(a = [0, 90, 0]) {
translate(v = [0, 0, -2.5]) {
cylinder($fn = 24, h = 5, r1 = 2.5, r2 = 2.5);
}
translate(v = [-1.5, -2.0, 1.0]) {
sphere($fn = 16, r = 1);
}
translate(v = [-1.5, 2.0, -1.0]) {
sphere($fn = 16, r = 1);
}
translate(v = [-1.5, 2.0, 1.0]) {
sphere($fn = 16, r = 1);
}
translate(v = [1.5, -2.0, -1.0]) {
sphere($fn = 16, r = 1);
}
translate(v = [1.5, -2.0, 1.0]) {
sphere($fn = 16, r = 1);
}
translate(v = [1.5, 2.0, -1.0]) {
sphere($fn = 16, r = 1);
}
translate(v = [1.5, 2.0, 1.0]) {
sphere($fn = 16, r = 1);
}
rotate(a = [0, 90, 0]) {
translate(v = [0, 0, -3.0]) {
cylinder($fn = 19, h = 6, r1 = 1.5, r2 = 1.5);
}
}
}
13 changes: 8 additions & 5 deletions src/b1scad/scad2py.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,8 @@
from sly import Parser

import sys, os
sys.path.append(os.path.join(os.path.dirname(__file__), "../../"))
sys.path.append(os.path.join(os.path.dirname(__file__), "../"))

from b13d.api.utils import gen_scad_foo, snake2camel, file_replace_extension
from b1scad.scad2ast import scad2ast, OpenSCADLexer

Expand Down Expand Up @@ -58,7 +59,7 @@ def op(self, p):

@_('ROTATE LPAREN named_vector RPAREN LBRACE shape_set RBRACE')
def op(self, p):
return f"{p.shape_set}.rotate({p.named_vector})"
return f"{p.shape_set}.rotate([{p.named_vector}])"

@_('SCALE LPAREN named_vector RPAREN LBRACE shape_set RBRACE')
def op(self, p):
Expand Down Expand Up @@ -242,13 +243,15 @@ def scad2py(infname: str, execute_en: bool = True):

return output_path, modelname

# Example usage:
if __name__ == "__main__":
def b1scad():
if len(sys.argv)<2:
infname = "model.scad"
print(f'Unspecified input file, generate default {infname}')
gen_scad_foo(infname, module_en=False)
else:
infname = sys.argv[1]

scad2py(infname)
scad2py(infname)

if __name__ == "__main__":
b1scad()
2 changes: 1 addition & 1 deletion src/b1scad/test.py
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ class B1scadTestMethods(unittest.TestCase):
"""Pylele Test Class"""
def test_all_scad(self):
scaddir = os.path.join(os.path.abspath(os.path.dirname(__file__)),"scad")
for idx in range(15):
for idx in range(16):
fname = f"model{idx:02}"
scadfname = f"{fname}.scad"
fullscadfile = os.path.join(scaddir,scadfname)
Expand Down

0 comments on commit d6b3027

Please sign in to comment.