Fusion360は一つの面から、周辺の面を取得することが可能なんですね。
面を選択し、選択した面とその面に接する面を選択した状態で
終了するスプリクトです。(言葉で表現するとわかりにくい・・・)
#FusionAPI_python #Author-kantoku #Description-Surface_Around_Select #選択した面と接する周囲の面を選択状態にする import adsk.core, adsk.fusion, traceback from itertools import chain _app = adsk.core.Application.get() _ui = _app.userInterface def run(context): try: global _ui #面選択 selFilters = 'Faces' sel = Sel('面を選択/ESC-中止', selFilters ) if sel is None: return face = sel.entity #選択状態クリア _ui.activeSelections.clear() #全ループ取得 loops = face.loops #全エッジ取得 edges = [loop.edges for loop in loops] edgelist = list(chain.from_iterable([edge for edge in edges])) #エッジを共有している面の取得 facelist = list(chain.from_iterable([edge.faces for edge in edgelist])) #重複している面を削除 - tempIdをキーとしたdictで facedict ={} [facedict.update({f.tempId:f}) for f in facelist] #選択状態化 [_ui.activeSelections.add(f) for f in facedict.values()] _ui.messageBox('done') except: if _ui: _ui.messageBox('エラー\n{}'.format(traceback.format_exc())) #選択 #param: msg-string, selFilter-SelectionFilters #return: selection def Sel(msg, selFilter): global _ui try: return _ui.selectEntity(msg, selFilter) except: return None
実行例です。 ・・・念の為、データはGrabCAD拾ってきたもので、
仕事のものでは無いです。
スプリクト実行後、黄色のR面を選択します。
青く選択した状態で終了します。 ・・・これだけです。
要はBRepEdgeオブジェクトのfacesプロパティを利用すると、そのエッジが共有されている
面が取得出来ます って事です。
loops経由じゃなくて直接
・・・ edges = face.edges ・・・
こんな感じでも取得できそうな気もしたのですが、エラーになってしまうため
遠回りな感じの上記のコードにしました。(ひょっとしたら僕の勘違いかも)
本当は違うんです。 こんな事を試したかった訳では無いんです。
Helpのこちらの一番上の画像なのですが、
Help
ほぼ綺麗な階段状に表現されている中、"BRepCoEdges" "BRepCoEdge" の異質さが
浮き立っています。
これ、"ハーフエッジ構造" と呼ばれるデータ構造を保持しているようです。
僕では上手く説明できないため、興味がある方は "ハーフエッジ構造" で検索して下さい。
これにより隣の面を取得したり、隣に面が存在しているか?、シェル状態で何処にオープンな
エッジが有るか? 隣り合っている面の向きが一致しているか? 等の操作が可能です。
なので、これを利用し最初は作ったのですが、よくコードを見て整理していたら
"BRepCoEdge" オブジェクトを利用しなくても隣の面を取得できてしまいました。
ん~ ちょっと消化不良な気分。