目次
参考資料
install
sudo add-apt-repository ppa:openscad/releases
sudo apt-get install openscad
CUIインターフェース
- C言語と同じノリで簡単に可能
openscad -o model.stl a.scad
文法
- 単位はmm, deg
- 制御分はmodule内でしか使えない
制御文
- for
- for (condition) {expression;}
- conditionがi=[1,3]で1と3, i=[1:3]で1,2,3,i=[1:0.1:3]で1,1.1...3.0
- {}は条件1行では省略可能
- 二重for
for (xpos=[0:3], ypos = [0,2,6]) // 3要素の配列を範囲によって4回繰り返す
translate([xpos, ypos, 0]) cube([0.5, 0.5, 0.5]);
- if
物体
- 円柱
- xy平面上にrの円,h方向に円柱が伸びる
- cylinder(h=10,r=20); //デフォルトcenter=false
- cylinder(h=10,r1=10,r2=20,center=true); // center=trueだと底面が-h/2になる
- 直方体
- 原点から[x,y,z]の直方体が生成
- cube([x,y,z]);
- cube([x,y,z], center=true);
- 球
- 中心原点半径rの球を生成
- fs=最小分割長さmm, $fn=分割数
移動
-
書式
- [移動]* 物体;
- [移動] {小ノード} // 座標系を移したままで何か作業したい場合
-
回転
- rotate([0,180,0]) // y軸180度回転
- rotate(a=45, v=[1,1,0]) //v軸周りにa度回転
-
移動
- translate([1,1,0]) // x方向1,y方向1
-
例
rotate([0, 180, 0]) cylinder(h=10,r=20);
rotate([0, 180, 0]) {
cylinder(h=10,r=20);
}
鏡面反転
- 原点を通り法線が[x,y,z]の平面に対して鏡面の座標系を構成する(おそらく右手座標系から左手座標系になっている?)
- mirror([1,0,0]);
- 例
mirror([1,0,0]) translate([1,0,0]) rotate([0,0,10]) cube([3,2,1]);
演算
- 書式
- 演算(){[物体;]*}
- 加算
- union
- 差分
- difference
- 1つ目から2つ目以降を引く
- 積
- intersection
- ミンコフスキー和
- 1つ目の図形の全点に,2つ目の図形を描画した時にできる立体.
- 数学的には∃(x_i,y_i,z_i) (x,y,z)=Σ(x_i,y_i,z_i)なる(x,y,z)の集合からなる立体
- (可換演算)
$fn=50;
minkowski()
{
cylinder(r=2,h=1);
cube([10,10,1]);
}
2D
- 押出し
- 二次元図形をheightだけ押し出す.
- linear_extrude(height = fanwidth, center = true, convexity = 10, twist = -fanrot, slices = 20, scale = 1.0) [二次元図形];
関数
モジュール
// 高さ100mmの円柱
module hole(distance, rot, size) {
rotate(a = rot, v = [1, 0, 0])
translate([0, distance, 0])
cylinder(r = size, h = 100, center = true);
}
- 引数にはデフォルトが設定できる
module house(roof="flat",paint=[1,0,0]) {}
数値関数
function r_from_dia(dia) = dia / 2;
ライブラリ
- .scadをincludeすると使える.
- MCADライブラリを/home/ryo/MCADにおく
ギア
include </home/ryo/MCAD/involute_gears.scad>
gear(number_of_teeth=17,circular_pitch=500,circles=4);
translate([0,0,30])
gear(number_of_teeth=17,circular_pitch=100,circles=4);
morphology
他
面取り
- round, fillet, chanferの作り方
minkowski
hull
x = size[0];
y = size[1];
z = size[2];
linear_extrude(height=z)
hull()
{
// place 4 circles in the corners, with the given radius
translate([(-x/2)+(radius/2), (-y/2)+(radius/2), 0])
circle(r=radius);
translate([(x/2)-(radius/2), (-y/2)+(radius/2), 0])
circle(r=radius);
translate([(-x/2)+(radius/2), (y/2)-(radius/2), 0])
circle(r=radius);
translate([(x/2)-(radius/2), (y/2)-(radius/2), 0])
circle(r=radius);
}
出力
- STL出力する前にはRenderしなければならない