打开参数类型

时间:2015-08-02 14:58:48

标签: module overloading openscad

使用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的结果是九值向量,而我的代码只忽略最后六个值。

它有效但只是因为在单值的情况下我想要的是复制值。是否有一般方法可以打开参数类型并根据该类型执行不同的操作?

1 个答案:

答案 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();