入り組んだブランチの線に太さを与え、NC用のカットラインデータを作る2

すべての作業ルーティンをスクリプト化することはできそうですが、実行中に起こるエラーなどを考えて、カットの1シートずつ作業をするプロセスを書きます。

手前から順番に進めます。
手前の1枚目サーフェースとその面に載るブランチのカーブを選択します。

NC_test_AA_01-6

コマンド: invert

で選択を反転します。

NC_test_AA_01-7

コマンド: hide

で一時的に作業しない部分を非表示にします。

NC_test_AA_01-8

再度
コマンド: 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:

とコマンドに出ますので、マウスでカット面のサーフェースを選択します。

NC_test_AA_01-9

選択が終わると続けて

select curves:

と問われるので、ブランチのカーブを全て(複数)選択し、リターンキーを押す(あるいはマウス右クリック)。

NC_test_AA_01-10

すると作業が実行されます。対話型の部分はスクリプトの4、5行目です。

スクリプトの作業は以下のようなフローになっています。

カット面のサーフェースを選択→
ブランチのカーブを全て選択→
ブランチのカーブ全てに対しパイプコマンド(半径1.0、 キャップをround に設定)を実行→
ブランチのカーブを全て削除→
出来上がったパイプそれぞれと、カット面のサーフェースが接するカーブを取り出す→
パイプを全て削除

↓の様な状態になります。

NC_test_AA_01-11

この結果に対して、次のスクリプトを実行します。再び
コマンド: 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:

とコマンドに出ますので、マウスでカット面のサーフェースを選択します。

NC_test_AA_01-13

続けて

select curves:

と問われるので、ブランチのカーブを全て(複数)選択し、リターンキーを押す(あるいはマウス右クリック)。

NC_test_AA_01-12

すると作業が実行されます。このスクリプトの作業フローは

カット面のサーフェースを選択→
ブランチのアウトラインカーブを全て選択→
ブランチのアウトラインカーブをひとつ取り出し、y方向に 1 の大きさ押し出す extrude→
押し出したextrude surface を使ってカット面のサーフェースを 分割 Split→
ブランチのアウトラインカーブをバウンダリー(境界線)とした平面サーフェースをつくる→
分割されたサーフェースの重心の点が、バウンダリーから作ったサーフェースの上にあるサーフェースを削除→
ブランチのアウトラインカーブを削除→
カーブがなくなるまで繰り返し

途中でコマンドが失敗することもあります。
NC_test_AA_01-14失敗したばあい。
その場合は、カーブの選択を全てでなく、↓部分的に選択して、数回に分けて実行してみてください。
NC_test_AA_01-15

マシンスペックにもよりますが、一回の実行で数分かかることもあります。フリーズしたように見えてもすこし待ってみてください。

↓のようなくりぬかれたサーフェースができます。サーフェースが分かれている場合が多いので、管理のためにも選択して ctrl + ‘G’ でグループ化しておくといいでしょう。NC_test_AA_01-16

これでやっとひとつの層のカットラインの基ができました。これをすべての層に対して作業します。

ここまでの作業を行ったモデルファイル(4層分作業してあります): NC_test_AA_03.3dm

入り組んだブランチの線に太さを与え、NC用のカットラインデータを作る3 に続く

 

 

Comments are closed.