C#ATIA

↑タイトル詐欺 主にCATIA V5 の VBA

選択した面の周辺の面も、選択状態にする1

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拾ってきたもので、
仕事のものでは無いです。

f:id:kandennti:20161012165133p:plain
スプリクト実行後、黄色のR面を選択します。

f:id:kandennti:20161012165140p:plain
青く選択した状態で終了します。 ・・・これだけです。
要はBRepEdgeオブジェクトのfacesプロパティを利用すると、そのエッジが共有されている
面が取得出来ます って事です。

loops経由じゃなくて直接

・・・
        edges = face.edges
・・・

こんな感じでも取得できそうな気もしたのですが、エラーになってしまうため
遠回りな感じの上記のコードにしました。(ひょっとしたら僕の勘違いかも)



本当は違うんです。 こんな事を試したかった訳では無いんです。
Helpのこちらの一番上の画像なのですが、
Help

ほぼ綺麗な階段状に表現されている中、"BRepCoEdges" "BRepCoEdge" の異質さが
浮き立っています。
これ、"ハーフエッジ構造" と呼ばれるデータ構造を保持しているようです。
僕では上手く説明できないため、興味がある方は "ハーフエッジ構造" で検索して下さい。

これにより隣の面を取得したり、隣に面が存在しているか?、シェル状態で何処にオープンな
エッジが有るか? 隣り合っている面の向きが一致しているか? 等の操作が可能です。

なので、これを利用し最初は作ったのですが、よくコードを見て整理していたら
"BRepCoEdge" オブジェクトを利用しなくても隣の面を取得できてしまいました。
ん~ ちょっと消化不良な気分。