すべての作業ルーティンをスクリプト化することはできそうですが、実行中に起こるエラーなどを考えて、カットの1シートずつ作業をするプロセスを書きます。
手前から順番に進めます。
手前の1枚目サーフェースとその面に載るブランチのカーブを選択します。
コマンド: invert
で選択を反転します。
コマンド: hide
で一時的に作業しない部分を非表示にします。
再度
コマンド: editpythonscript
でエディタを出します。キーボードから ctrl + ‘n’ として 新しい Empty Script として、下のスクリプトを貼ります。
import rhinoscriptsyntax as rs import Rhino.Geometry as rg sf = rs.GetObject("select section surface", rs.filter.surface) cvs = rs.GetObjects("select curves", rs.filter.curve, True, True ) pipes = [] for cv in cvs: pipe = rs.AddPipe(cv,0,1.0,0,2) pipes.append(pipe) rs.DeleteObjects(cvs) for pipe in pipes: print rs.IntersectBreps(sf,pipe) rs.DeleteObjects(pipes)
このスクリプトは冒頭の部分が対話型になっています。
実行すると、
select section surface:
とコマンドに出ますので、マウスでカット面のサーフェースを選択します。
選択が終わると続けて
select curves:
と問われるので、ブランチのカーブを全て(複数)選択し、リターンキーを押す(あるいはマウス右クリック)。
すると作業が実行されます。対話型の部分はスクリプトの4、5行目です。
スクリプトの作業は以下のようなフローになっています。
カット面のサーフェースを選択→
ブランチのカーブを全て選択→
ブランチのカーブ全てに対しパイプコマンド(半径1.0、 キャップをround に設定)を実行→
ブランチのカーブを全て削除→
出来上がったパイプそれぞれと、カット面のサーフェースが接するカーブを取り出す→
パイプを全て削除
↓の様な状態になります。
この結果に対して、次のスクリプトを実行します。再び
コマンド: editpythonscript
でエディタを出します。キーボードから ctrl + ‘n’ として 新しい Empty Script として、下のスクリプトを貼ります。
import rhinoscriptsyntax as rs import Rhino.Geometry as rg sfs = rs.GetObjects("select section surfaces", rs.filter.surface) cvs = rs.GetObjects("select curves", rs.filter.curve, True, True ) rs.Command ("_SelAll") rs.Command("_CloseCrv", False) rs.UnselectAllObjects() expth = rs.AddLine([0,0,0],[0,1,0]) for cv in cvs: pts = rs.CurvePoints(cv) cp = rg.Point3d(0,0,0) for pt in pts: cp += pt if len(pts) != 0: cp /= len(pts) ext = rs.ExtrudeCurve(cv,expth) plsf = rs.AddPlanarSrf(cv) dlist = [] for sf1 in sfs: if rs.coercebrep(sf1): list = rs.SplitBrep(sf1,ext,True) if list != None: if len(list) > 1: for l in list: ar = rs.SurfaceArea(l) ccp = rs.SurfaceAreaCentroid(l) if ccp != None and plsf != None: if rs.coercesurface(plsf): if rs.IsPointOnSurface(plsf,ccp[0]): dlist.append(l) rs.DeleteObject(cv) else: sfs.append(l) if len(dlist): rs.DeleteObjects(dlist) if ext != None: rs.DeleteObject(ext) if plsf != None: rs.DeleteObject(plsf)
これも冒頭は同じ対話型です。
select section surface:
とコマンドに出ますので、マウスでカット面のサーフェースを選択します。
続けて
select curves:
と問われるので、ブランチのカーブを全て(複数)選択し、リターンキーを押す(あるいはマウス右クリック)。
すると作業が実行されます。このスクリプトの作業フローは
カット面のサーフェースを選択→
ブランチのアウトラインカーブを全て選択→
ブランチのアウトラインカーブをひとつ取り出し、y方向に 1 の大きさ押し出す extrude→
押し出したextrude surface を使ってカット面のサーフェースを 分割 Split→
ブランチのアウトラインカーブをバウンダリー(境界線)とした平面サーフェースをつくる→
分割されたサーフェースの重心の点が、バウンダリーから作ったサーフェースの上にあるサーフェースを削除→
ブランチのアウトラインカーブを削除→
カーブがなくなるまで繰り返し
途中でコマンドが失敗することもあります。
失敗したばあい。
その場合は、カーブの選択を全てでなく、↓部分的に選択して、数回に分けて実行してみてください。
マシンスペックにもよりますが、一回の実行で数分かかることもあります。フリーズしたように見えてもすこし待ってみてください。
↓のようなくりぬかれたサーフェースができます。サーフェースが分かれている場合が多いので、管理のためにも選択して ctrl + ‘G’ でグループ化しておくといいでしょう。
これでやっとひとつの層のカットラインの基ができました。これをすべての層に対して作業します。
ここまでの作業を行ったモデルファイル(4層分作業してあります): NC_test_AA_03.3dm
入り組んだブランチの線に太さを与え、NC用のカットラインデータを作る3 に続く
Comments are closed.