SIはポリゴンの周囲をハード化する物が無い。
rcToolsのポリゴンの境界を選択 > ハードエッジ
の手間が面倒だったので、スクリプト化した。
SetHardEdge
選択したエッジ、
選択したポリゴンの境界のエッジを
ハードエッジ化するスクリプト
使用方法
ポリゴンを選択、または、エッジを選択して実行
Coad
#edgeHard # #選択したポリゴンの境界線。 #選択したエッジをハードエッジにするスクリプト # # 2014 0209 ハードエッジの調整 # app = Application; log = app.LogMessage dbug = False def dlog(in_str): if dbug == True: log(in_str) def markHardEdge(oObj,oEdgeIndecies): oIDs = oEdgeIndecies dlog(oObj) oGeo = oObj.ActivePrimitive.Geometry oEdges = oGeo.Segments for i in oIDs: edge = oEdges[i] if edge.IsHard: dlog("oEdgeID : " +str(edge.Index) + " : " + "is Hard") nSub = oGeo.CreateSubComponent("edge",oEdgeIndecies) app.ApplyOp("MarkHardEdgeVertex", nSub, 3, "siPersistentOperation", "", 0) #ポリゴンの境界線のエッジを取得 def getPolyUnionEdges(oSel): oSub = oSel.SubComponent oObj = oSub.Parent3DObject oColl = oSub.ComponentCollection oGeo = oObj.ActivePrimitive.Geometry polys = oGeo.Facets nbPoly = polys.Count log(nbPoly) aPolyIDs = oColl.IndexArray bPolyIDs = [] for i in range(nbPoly): flg = False for aID in aPolyIDs: if i == aID: flg = True continue if flg == False: bPolyIDs.append(i) #dlog(str(aPolyIDs)) #dlog(str(bPolyIDs)) aEdges = [] bEdges = [] for i in aPolyIDs: edges = polys[i].Edges for eID in edges: aEdges.append(eID.Index) for i in bPolyIDs: edges = polys[i].Edges for eID in edges: bEdges.append(eID.Index) aSet = set(aEdges) bSet = set(bEdges) return list(aSet & bSet) #ポリゴンの境界線を調整 def polyEdgeMark(oSel): oSub = oSel.SubComponent oObj = oSub.Parent3DObject oEdges = getPolyUnionEdges(oSel) markHardEdge(oObj,oEdges) def main(): oSels = app.Selection for oSel in oSels: #seltype dlog(oSel.Type) if oSel.Type == "polySubComponent": polyEdgeMark(oSel) if oSel.Type == "edgeSubComponent": oObj = oSel.SubComponent.Parent3DObject oEdges = oSel.SubComponent.ComponentCollection markHardEdge(oObj,oEdges.IndexArray) main()
メモ
ことの起こりは、ハードエッジ化したエッジの、ハードエッジのプロパティの解除が目的だった
が、SDKを確認しても、
ハードエッジの状態は取得出来るが、
解除に関しては、その記載が無かった。
WEBを調べると、ハードエッジの消去は、
そのエッジを選択、MarkHardEdgeで、
ハードエッジ化をもう一度行い
そのプロパティのチェックを外す。
という物だった orz
ハードエッジ自体は、
その性質上(オペレータスタック)
オペレーター駆動で行っているらしい。
というわけで、
解除する為にはオペレーターコマンドで
作業しないとダメっぽい。
※こんなやつ
Application.ApplyOp("MarkHardEdgeVertex", nSub, 3, "siPersistentOperation", "", 0)
ハードエッジ作業が今後も増えるようだったら、
・ハードエッジの追加
・ハードエッジの削除
・作業途中で出来た、クラスターの削除
・フリーズかを含めたツールがひつようかも。
また、ハードエッジの仕様が気になるところ。
外部ツールは頂点を増やして対応してるのか、
UserNormalで対応してるのかが、謎ね。
既知のバグ
・選択状態が解除される。・複数のオブジェクトに対応してない(選択状態がはずれる?)
追記 2014 0213
mayaraさんが、ハードエッジを作る、削除するプラグインを作ってた〜(ymt3Dさんに教えてもらいました
mHard Edge Marker
おお!素晴らしい!メモメモ
返信削除ハードエッジ編集はmyaraさんのやつにお世話になっております。中は見ていませんが、コード参考になるかも?
ttp://myara.web.fc2.com/mHardEdgeMarker.html
おお、すでにmyaraさんが作ってたのね。:p 作る必要は無くなったかもw 境界エッジはRCToolsの真似です。選択ポリゴングループと、非選択ポリゴングループが、共有するエッジを抽出してます。以前解析してて、リンプルさんと驚いた物です。りんぷるさんかむばっく〜
返信削除