広告
*[[OpenSCAD:http://www.openscad.org/]] [#fe522902] プログラミングして3Dモデルを作製する。~ 形が決まれば変数の値(高さや直径など)を変えるだけで様々な大きさ(Parametric)のものができるので便利。~ C言語に似た専用のスクリプトを書いてモデリングするので使い慣れたエディタで書いても良い。~ -[[雑多なこと>OpenSCAD/tips]] --簡単な例、変わった形の図形(楕円体)など -[[hull()の使い方>OpenSCAD/hull]] --図形の角を丸めるなどに便利 -[[minkowski()の使い方>OpenSCAD/minkowski]] --図形の角を丸めるなどに便利 -[[作製例>OpenSCAD/Examples]] --いろいろ製作例 **インストール [#qdfd73dc] DebianやUbuntuには公式パッケージがあるので簡単にインストールできる。 **簡単な使い方 [#n6705099] -立ち上げるとエディタパネルと表示パネルとメッセージパネルが入ったウインドウが開く。 -エディタでプログラミングする --他のエディタでプログラミングしたものを読み込んでも良い。 -「Design」メニューから「Compile」を実行すると表示パネルにできたモデルが表示される。 -良ければ「Design」メニューから「Compile and Render」を実行する。 -「Design」メニューから「Compile」(2015年3月バージョンからは「Preview」)を実行すると表示パネルにできたモデルが表示される。 -良ければ「Design」メニューから「Compile and Render」(2015年3月バージョンからは「Render」)をを実行する。 -「File」の「Export」から「Export as STL」を選べばSTLファイルが生成される。 **表示切り替え [#xccff80f] -Ctrl+1:辺(ワイヤフレーム)を表示・非表示 -Ctrl+2:軸を表示・非表示 -Ctrl+3:交差線を表示・非表示 **プログラミング [#if41eefb] -[[チートシート:http://www.openscad.org/cheatsheet/]]が便利 -変数の定義が決まったところでしかできないが、将来的にはどこでも出来るようになるらしい。 --少なくとも開発バージョンではできるらしい。 --forの中やunionの中で使えないので非常に不便 -配列に新しい要素を追加するということができないが、将来はできるようになるらしい --concat()という関数でやることになるようだ。 -立方体(cube)や円柱(cylinder)など元々3次元の図形を用いる方法と、四角形(square)や円(circle)、ポリゴン(polygon)で2次元平面を作って伸ばしたり(linear_extrude)、回転させたり(rotate_extrude)して作る。 -[[Wikibooksにあるマニュアル:https://ja.wikibooks.org/wiki/OpenSCAD_User_Manual]] ***変数の問題点 [#ze8bb184] [[ユーザーマニュアル:https://ja.wikibooks.org/wiki/OpenSCAD_User_Manual/General]]にある通り,「変数は実行時ではなくコンパイル時に格納される」のでいろいろ不便 上記のマニュアルにある通り,変数の値を途中で変えると最後の値が全部に反映してしまう! つまり, 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などの問題 [#m18a45ea] includeで他のスクリプトを読み込む場合,同じ名前の変数があるとうまく動かない~ なので,includeされる側の変数名は気をつけたほうがいい. useを使うと読み込んだ方にある命令は実行されない ***よく使うもの [#l3d051d5] まず真ん中付近に図形を書いて移動や回転をして所望の位置に持ってくる。~ 3次元の物体も最初に作るときは方向が決まっているので回転したり、移動したりして所望の位置に持ってくる~ &color(Red){単位は「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; **特殊な変数 [#a05ce1b0] -$fn --円や円弧、曲線の分割数 $fn=50; とするとプログラム内で円は50角形になる。~ 6角形を作りたかったら circle(d=d,$fn=6); などとする。 --[[FreeCADにインポートする>OpenSCAD/tips]]時はポリゴン最大面数をこれ以下にして曲線として認識されるようにする -$fa --円や円弧、曲線の最小分割角度 -$fs --円や円弧、曲線の最小分割サイズ ***旧バージョンでの問題 [#nee23dea] -2015年3月バージョン以前は変数の定義が決まったところでしかできない。 --少なくとも開発バージョンではできるらしい。 --forやif、unionの中で使えないので非常に不便 --moduleの中では使える -2015年3月バージョンからは配列に新しい要素を追加するということができる。 --concat()という関数でやる。 **リンク [#q09a18a5] -[[DobloFactory:https://github.com/dmtaub/DobloFactory]] --LEGOのDobloシリーズ互換のライブラリ -[[OpenSCAD Dimensioned Drawings:http://www.cannymachines.com/entries/9/openscad_dimensioned_drawings]] --三面図を表示 -[[MCAD:http://reprap.org/wiki/MCAD]] --ギアを作製するライブラリ -[[thingiverseでOpenSCADを使っているもの:http://www.thingiverse.com/search?q=openscad]] -[[Round-Anything:https://github.com/Irev-Dev/Round-Anything]] --いろいろなところにRをつける --minkowsk()を使っているので時間が掛かる。 -[[nSpline() library:https://www.thingiverse.com/thing:1208001]] --プロペラ、ラッパ、結び目など複雑な図形を作製できる -[[Tieing It Together With Hull():https://hackaday.com/2018/02/13/openscad-tieing-it-together-with-hull/]] --hull()使いまくり -[[Universal Angle Bracket:https://www.thingiverse.com/thing:1827297]] --hull()を使ってR面を作っている。 --すごい 広告 |