|
広告
プログラミングして3Dモデルを作製する。
形が決まれば変数の値(高さや直径など)を変えるだけで様々な大きさ(Parametric)のものができるので便利。
C言語に似た専用のスクリプトを書いてモデリングするので使い慣れたエディタで書いても良い。
インストール
DebianやUbuntuには公式パッケージがあるので簡単にインストールできる。
簡単な使い方
- 立ち上げるとエディタパネルと表示パネルとメッセージパネルが入ったウインドウが開く。
- エディタでプログラミングする
- 他のエディタでプログラミングしたものを読み込んでも良い。
- 「Design」メニューから「Compile」(2015年3月バージョンからは「Preview」)を実行すると表示パネルにできたモデルが表示される。
- 良ければ「Design」メニューから「Compile and Render」(2015年3月バージョンからは「Render」)をを実行する。
- 「File」の「Export」から「Export as STL」を選べばSTLファイルが生成される。
表示切り替え
- Ctrl+1:辺(ワイヤフレーム)を表示・非表示
- Ctrl+2:軸を表示・非表示
- Ctrl+3:交差線を表示・非表示
プログラミング
- チートシートが便利
- 立方体(cube)や円柱(cylinder)など元々3次元の図形を用いる方法と、四角形(square)や円(circle)、ポリゴン(polygon)で2次元平面を作って伸ばしたり(linear_extrude)、回転させたり(rotate_extrude)して作る。
- Wikibooksにあるマニュアル
変数の問題点
ユーザーマニュアルにある通り,「変数は実行時ではなくコンパイル時に格納される」のでいろいろ不便
上記のマニュアルにある通り,変数の値を途中で変えると最後の値が全部に反映してしまう!
つまり,
a=5;
echo (a);
a=10;
echo (a);
とした場合,期待される表示は最初は5,次が10のはずだけど,どちらも10となってしまう.
また,IF文の中で変数の値を変えることができない!これは不便
じゃあどうするか?
「?」を使った条件式なら何故かOK
a=1; b=2; c= a==b ? 4 : 5 ;
とやるとcに5が入る
もっと複雑にするには,面倒だけど引数にしてモジュールに渡す.
例えば
if(a==5){
m(5,6);
}else if(a==6){
m(6,7);
}
module m(c,d){
e=c+d;
f=d-c;
echo (e);
echo (f);
}
って感じ
includeなどの問題
includeで他のスクリプトを読み込む場合,同じ名前の変数があるとうまく動かない
なので,includeされる側の変数名は気をつけたほうがいい.
useを使うと読み込んだ方にある命令は実行されない
よく使うもの
まず真ん中付近に図形を書いて移動や回転をして所望の位置に持ってくる。
3次元の物体も最初に作るときは方向が決まっているので回転したり、移動したりして所望の位置に持ってくる
単位は「mm」
- 変数へ数値を入れる:Cに似ているけど変数の型(intとかdoubleとか)を指定する必要はない。もちろん計算式も代入できる
a=12;
b=1.5;
angle = i*360/20;
- 円を描く (2次元)
circle(); //中心が(0,0)で半径1の円を描く
circle(r = 10); //中心が(0,0)で半径10の円を描く
circle(d = 20); //中心が(0,0)で直径20の円を描く
circle(2, $fn=50); //中心が(0,0)で半径2の50角形を描く
- 四角を描く (2次元)
square ([2,2],center = true); //横(x方向)2、縦(y方向)2の四角を描く。
//center = trueだと四角の中心が(0,0)に来る。center = falseまたは略すと角が(0,0)に来る
- 多角形を描く (2次元)
polygon(points = [ [x, y], ... ]); //
- 箱を描く (3次元)
cube(size = 1, center = false); //一辺が1の立方体を作る。角が(0,0)に位置する
cube(size = [1,2,3], center = true); //xが1、yが2、zが3の直方体を作り、真ん中が(0,0)に位置する
- 球を描く (3次元)
sphere(r = 5); //中心が(0,0)で半径5の球をに描く
sphere(d = 2); //中心が(0,0)で直径2の球をに描く
- 円柱を描く (3次元)
cylinder(h = 10, r=20); //中心が(0,0)で高さ10、半径20の円柱を描く。底面がZ=0
cylinder(h = 10, r1 = 10, r2 = 20, center = false); //中心が(0,0)で高さ10、底面の半径が10、上面の半径20の円柱(逆テーパー)を描く。底面がZ=0
- 多面体を描く (3次元)
polyhedron(points = [ [x, y, z], ... ], faces = [ [p1, p2, p3..], ... ], convexity = N);
- 移動
translate(v = [x, y, z]) //次「;」までの図形をx,y,z方向に移動
translate([x, y, z]) //「v=」を省略しても良い
//半径1の球をx=5,y=0,z=0の位置に移動
translate([5,0,0])
sphere(1,center = true); //半径1の球
//{}でくくっても良い。複数、複雑なもの用
translate([5,0,0]){
sphere(1,center = true); //半径1の球
}
- 回転:回転角度は度
rotate(a=[0,180,0]) //y軸周りに180度回転
rotate([0,180,0]) //「a=」を省略しても良い
rotate(a=45, v=[1,1,0]) //回転軸をxyz以外に指定できる。
rotate(a=[0,180,0])
cube(size = [1,2,3], center = true);
//{}でくくっても良い。複数、複雑なもの用
rotate(a=[0,180,0]){
cube(size = [1,2,3], center = true);
}
- Z軸に引き伸し
linear_extrude(height = fanwidth, center = true, convexity = 10, twist = -fanrot, slices = 20, scale = 1.0) {...}
- 回転引き伸ばし
rotate_extrude(convexity = 10)
translate([2, 0, 0])
circle(r = 1, $fn = 100);
- 図形の足し算(離れているものはくっつかない)
//円柱と回転した円柱を足す
union() {
cylinder (h = 4, r=1, center = true, $fn=100);
rotate ([90,0,0]) cylinder (h = 4, r=0.9, center = true, $fn=100);
}
- 図形の引き算
//円柱から回転した円柱を引く
difference() {
cylinder (h = 4, r=1, center = true, $fn=100);
rotate ([90,0,0]) cylinder (h = 4, r=0.9, center = true, $fn=100);
}
- 図形の共通部
//円柱と回転した円柱の共通部分のみ残す
intersection() {
cylinder (h = 4, r=1, center = true, $fn=100);
rotate ([90,0,0]) cylinder (h = 4, r=0.9, center = true, $fn=100);
}
- モジュール:図形をモジュール化する。値は返さないっぽい
module hole(distance, rot, size) {
rotate(a = rot, v = [1, 0, 0]) {
translate([0, distance, 0]) {
cylinder(r = size, h = 100, center = true);
}
}
}
- 関数:値を返す
function r_from_dia(dia) = dia / 2;
特殊な変数
- $fn
- 円や円弧、曲線の分割数
$fn=50;
とするとプログラム内で円は50角形になる。
6角形を作りたかったら
circle(d=d,$fn=6);
などとする。
- FreeCADにインポートする時はポリゴン最大面数をこれ以下にして曲線として認識されるようにする
- $fa
- $fs
旧バージョンでの問題
- 2015年3月バージョン以前は変数の定義が決まったところでしかできない。
- 少なくとも開発バージョンではできるらしい。
- forやif、unionの中で使えないので非常に不便
- moduleの中では使える
- 2015年3月バージョンからは配列に新しい要素を追加するということができる。
リンク
広告
|
|