Skip to content

Commit d51b687

Browse files
committed
1 parent fa7dc9f commit d51b687

File tree

4 files changed

+64
-5
lines changed

4 files changed

+64
-5
lines changed

solid/__init__.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
from .solidpython import OpenSCADObject, IncludedOpenSCADObject
77
from .objects import *
88
from .patch_euclid import run_euclid_patch
9+
from .scad_interface import ScadInterface
910

1011
# Type hints
11-
from .objects import P2, P3, P4, Vec3 , Vec4, Vec34, P3s, P23, Points, Indexes, ScadSize, OpenSCADObjectPlus
12+
from .objects import P2, P3, P4, Vec3 , Vec4, Vec34, P3s, P23, Points, Indexes, ScadSize, OpenSCADObjectPlus
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
from solid import *
2+
3+
scad = ScadInterface()
4+
5+
scad.set_global_var("$fn", 6)
6+
7+
scad.register_customizer_var("cyl_pos", "[1, 2, 3]")
8+
9+
cube_pos = scad.get("cyl_pos")
10+
11+
c = translate(cube_pos) (
12+
cylinder(r=scad.inline("$t * 3"), h=scad.inline("$t * 10"))
13+
)
14+
15+
scad_render_to_file(c, scad_interface=scad)

solid/scad_interface.py

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
from .solidpython import OpenSCADObject
2+
3+
class OpenSCADConstant(OpenSCADObject):
4+
def __init__(self, code):
5+
super().__init__("not valid openscad code !?!?!", {})
6+
self.code = code
7+
8+
def __repr__(self):
9+
return self._render()
10+
11+
def _render(self, render_holes=42):
12+
return self.code
13+
14+
class ScadInterface:
15+
def __init__(self):
16+
self.header = ''
17+
18+
def register_customizer_var(self, name, value, options=''):
19+
self.header += f'{name} = {value}; //{options}\n'
20+
21+
def set_global_var(self, name, value):
22+
self.header += f'{name} = {value};\n'
23+
24+
def get_header_str(self):
25+
return self.header
26+
27+
def register_font(self, filename):
28+
self.header += f'use <{filename}>\n'
29+
30+
@staticmethod
31+
def get(name):
32+
return ScadInterface.inline(name)
33+
34+
@staticmethod
35+
def inline(code):
36+
return scad_inline(code)
37+
38+
def scad_inline(code):
39+
return OpenSCADConstant(code)
40+

solid/solidpython.py

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -395,7 +395,6 @@ def _get_include_path(self, include_file_path):
395395
# No loadable SCAD file was found in sys.path. Raise an error
396396
raise ValueError(f"Unable to find included SCAD file: {include_file_path} in sys.path")
397397

398-
399398
# =========================================
400399
# = Rendering Python code to OpenSCAD code=
401400
# =========================================
@@ -412,7 +411,7 @@ def _find_include_strings(obj: Union[IncludedOpenSCADObject, OpenSCADObject]) ->
412411
include_strings.update(_find_include_strings(param))
413412
return include_strings
414413

415-
def scad_render(scad_object: OpenSCADObject, file_header: str = '') -> str:
414+
def scad_render(scad_object: OpenSCADObject, file_header: str = '', scad_interface=None) -> str:
416415
# Make this object the root of the tree
417416
root = scad_object
418417

@@ -424,6 +423,9 @@ def scad_render(scad_object: OpenSCADObject, file_header: str = '') -> str:
424423
includes = ''.join(include_strings) + "\n"
425424
scad_body = root._render()
426425

426+
if scad_interface != None:
427+
file_header += scad_interface.get_header_str()
428+
427429
if file_header and not file_header.endswith('\n'):
428430
file_header += '\n'
429431

@@ -507,14 +509,15 @@ def scad_render_to_file(scad_object: OpenSCADObject,
507509
filepath: PathStr=None,
508510
out_dir: PathStr=None,
509511
file_header: str='',
510-
include_orig_code: bool=True) -> str:
512+
include_orig_code: bool=True,
513+
scad_interface = None) -> str:
511514
header = file_header
512515
if include_orig_code:
513516
version = _get_version()
514517
date = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")
515518
header = f"// Generated by SolidPython {version} on {date}\n" + file_header
516519

517-
rendered_string = scad_render(scad_object, header)
520+
rendered_string = scad_render(scad_object, header, scad_interface=scad_interface)
518521
return _write_code_to_file(rendered_string, filepath, out_dir, include_orig_code)
519522

520523
def _write_code_to_file(rendered_string: str,

0 commit comments

Comments
 (0)