2014年2月10日月曜日

Softimage Original Script : SetHardEdge

2014 0213 追記



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

2 件のコメント:

  1. おお!素晴らしい!メモメモ
    ハードエッジ編集はmyaraさんのやつにお世話になっております。中は見ていませんが、コード参考になるかも?
    ttp://myara.web.fc2.com/mHardEdgeMarker.html

    返信削除
  2. おお、すでにmyaraさんが作ってたのね。:p 作る必要は無くなったかもw 境界エッジはRCToolsの真似です。選択ポリゴングループと、非選択ポリゴングループが、共有するエッジを抽出してます。以前解析してて、リンプルさんと驚いた物です。りんぷるさんかむばっく〜

    返信削除