使用Open SCAD,我有一个模块,像cube()
一样,有一个size
参数,可以是单个值,也可以是三个值的向量。最终,我想要一个三个值的向量。
如果调用者传递单个值,我希望向量的所有三个值都相同。我没有在语言文档中看到有关检测参数类型的任何内容。所以我想出了这个黑客:
module my_cubelike_thing(size=1) {
dimensions = concat(size, size, size);
width = dimensions[0];
length = dimensions[1];
height = dimensions[2];
// ... use width, length, and height ...
}
当size
是单个值时,concat
的结果正是我想要的:值的三个副本。
当size
是三值向量时,concat
的结果是九值向量,而我的代码只忽略最后六个值。
它有效但只是因为在单值的情况下我想要的是复制值。是否有一般方法可以打开参数类型并根据该类型执行不同的操作?
答案 0 :(得分:2)
如果大小类型只能是单个值或带有3个值的向量,那么可以通过特殊值undef找到该类型:
a = [3,5,8];
// a = 5;
if (a[0] == undef) {
dimensions = concat(a, a, a);
// do something
cube(size=dimensions,center=false);
}
else {
dimensions = a;
// do something
cube(size=dimensions,center=false);
}
但是分配仅在定义它们的范围内有效, documnetation of openscad。 因此,在每个子树中需要很多代码,我会优先验证外部脚本中的大小类型(例如python3),并将openscad-code编写为将变量赋值给文件,该文件可以包含在openscad文件中,这是我的简短测试代码:
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import os
# size = 20
size = [20,15,10]
if type(size) == int:
dimensions = [size, size, size]
elif type(size) == list:
dimensions = size
else:
# if other types possible
pass
with open('variablen.scad', 'w') as wObj:
for i, v in enumerate(['l', 'w', 'h']):
wObj.write('{} = {};\n'.format(v, dimensions[i]))
os.system('openscad ./typeDef.scad')
variablen.scad的内容:
l = 20;
w = 15;
h = 10;
和typeDef.scad看起来像这样
include <./variablen.scad>;
module my_cubelike_thing() {
linear_extrude(height=h, center=false) square(l, w);
}
my_cubelike_thing();