2015-08-02 4 views
1

Используя 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 является девятизначным вектором, а мой код просто игнорирует последние шесть значений.

Это работает, но только потому, что то, что я хочу в случае с одним значением, - это репликация значения. Есть ли общий способ включения типа аргумента и делать разные вещи в зависимости от этого типа?

ответ

2

Если тип размера может быть только одно значение или вектор с 3-х значений, тип может helpwise быть найдены специальным значением 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) и написать код opencad с назначением переменных в файл, который может быть включен в opencad- файл, вот мой короткий тест-код:

#!/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(); 
Смежные вопросы