Skip to content

Commit b883cfa

Browse files
committed
added support for (non)optional arguments
1 parent c749460 commit b883cfa

File tree

4 files changed

+36
-11
lines changed

4 files changed

+36
-11
lines changed

solid/examples/basic_scad_include.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
def demo_import_scad():
1414
scad_path = Path(__file__).parent / 'scad_to_include.scad'
1515
scad_mod = import_scad(scad_path)
16+
scad_mod.optional_nondefault_arg(1)
1617
return scad_mod.steps(5)
1718

1819

solid/examples/scad_to_include.scad

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ module steps(howmany=3){
1313
}
1414
}
1515

16-
module blub(a) cube([a, 2, 2]);
16+
module blub(a, b=1) cube([a, 2, 2]);
1717

1818
function scad_points() = [[0,0], [1,0], [0,1]];
1919

solid/py_scadparser/scad_parser.py

Lines changed: 24 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ class ScadTypes(Enum):
1414
FUNCTION = 2
1515
USE = 3
1616
INCLUDE = 4
17+
PARAMETER = 5
1718

1819
class ScadObject:
1920
def __init__(self, scadType):
@@ -37,17 +38,31 @@ def __init__(self, name):
3738
super().__init__(ScadTypes.GLOBAL_VAR)
3839
self.name = name
3940

40-
class ScadModule(ScadObject):
41-
def __init__(self, name, parameters):
42-
super().__init__(ScadTypes.MODULE)
41+
class ScadCallable(ScadObject):
42+
def __init__(self, name, parameters, scadType):
43+
super().__init__(scadType)
4344
self.name = name
4445
self.parameters = parameters
4546

46-
class ScadFunction(ScadObject):
47+
def __repr__(self):
48+
return f'{self.name} ({self.parameters})'
49+
50+
class ScadModule(ScadCallable):
51+
def __init__(self, name, parameters):
52+
super().__init__(name, parameters, ScadTypes.MODULE)
53+
54+
class ScadFunction(ScadCallable):
4755
def __init__(self, name, parameters):
48-
super().__init__(ScadTypes.FUNCTION)
56+
super().__init__(name, parameters, ScadTypes.FUNCTION)
57+
58+
class ScadParameter(ScadObject):
59+
def __init__(self, name, optional=False):
60+
super().__init__(ScadTypes.PARAMETER)
4961
self.name = name
50-
self.parameters = parameters
62+
self.optional = optional
63+
64+
def __repr__(self):
65+
return self.name + "=..." if self.optional else self.name
5166

5267
precedence = (
5368
('nonassoc', "THEN"),
@@ -202,7 +217,7 @@ def p_parameter_list(p):
202217
def p_parameter(p):
203218
'''parameter : ID
204219
| ID "=" expression'''
205-
p[0] = p[1]
220+
p[0] = ScadParameter(p[1], len(p) == 4)
206221

207222
def p_function(p):
208223
'''function : FUNCTION ID "(" opt_parameter_list ")" "=" expression
@@ -269,11 +284,11 @@ def parseFileAndPrintGlobals(scadFile):
269284

270285
print("Modules:")
271286
for m in modules:
272-
print(f' {m.name}({m.parameters})')
287+
print(f' {m}')
273288

274289
print("Functions:")
275290
for m in functions:
276-
print(f' {m.name}({m.parameters})')
291+
print(f' {m}')
277292

278293
print("Global Vars:")
279294
for m in globalVars:

solid/solidpython.py

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -618,7 +618,16 @@ def parse_scad_callables(filename: str) -> List[dict]:
618618

619619
callables = []
620620
for c in modules + functions:
621-
callables.append({'name': c.name, 'args': [], 'kwargs': c.parameters})
621+
args = []
622+
kwargs = []
623+
624+
for p in c.parameters:
625+
if p.optional:
626+
kwargs.append(p.name)
627+
else:
628+
args.append(p.name)
629+
630+
callables.append({'name': c.name, 'args': args, 'kwargs': kwargs})
622631

623632
return callables
624633

0 commit comments

Comments
 (0)