すべての作業ルーティンをスクリプト化することはできそうですが、実行中に起こるエラーなどを考えて、カットの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.