C#ATIA

↑タイトル詐欺 主にFusion360API 偶にCATIA V5 VBA(絶賛ネタ切れ中)

クリックした位置に点を作成する

前から "マウスでクリックした位置をワールド座標で取得したい" と思っていたのですが、
ガッカリするほど簡単に出来ました。

実は、こちらのスクリーン座標からワールド座標に計算しなきゃダメかな?
って思っていたんです。
MouseMoveEvent サンプル - C#ATIA
Fusion360のウィンドウサイズは取得できるのですが、探しても探しても
Fusion360のウィンドウの左上の座標値を取得する方法がわからなかったんです。

"あぁCATIAなら、Selectionクラスで取得できるのになぁ" と思っていたら
Fusion360でもSelectionクラスで取得できました。

#FusionAPI_python
#Author-kantoku
#Description-ClickPoint
#クリックして点を作成

import adsk.core, adsk.fusion, traceback

_app = adsk.core.Application.get()
_ui = _app.userInterface

def run(context):
    try:
        global _app, _ui
        des = adsk.fusion.Design.cast(_app.activeProduct)
        comp = des.rootComponent
        
        isParm = IsParametric()
        if isParm :
            baseF = comp.features.baseFeatures.add()
            baseF.startEdit()
        
        selFilters = 'ConstructionPoints,\
                      Edges,\
                      ConstructionLines,\
                      Faces,\
                      ConstructionPlanes,\
                      Sketches,\
                      Features'
                      
        while True:
            #選択
            sel = Sel('点作成中/ESC-中止', selFilters )
            if sel is None:
                _ui.messageBox('キャンセル')
                return
                
            #クリック位置
            pnt = sel.point
            
            #点作成
            CreatePnt(comp, pnt)
        
        _ui.messageBox('終了')
    except:
        if _ui:
            _ui.messageBox('エラー\n{}'.format(traceback.format_exc()))
    finally:
        if isParm :
            baseF.finishEdit()

#点作成
#param: comp-Component, pnt3d-point3d
#return - constructionPoint
def CreatePnt(comp, pnt3d):
    pnt = comp.constructionPoints.createInput()
    pnt.setByPoint(adsk.core.Point3D.create(pnt3d.x, pnt3d.y, pnt3d.z))
    return comp.constructionPoints.add(pnt)

#選択
#param: msg-string, selFilter-SelectionFilters
#return: selection
def Sel(msg, selFilter):
    global _ui
    try:
        return _ui.selectEntity(msg, selFilter)
    except:
        return None

#パラメトリックチェック
#return: boolean
def IsParametric():
    global _app
    isPara = False
    design = adsk.fusion.Design.cast(_app.activeProduct)
    if design.designType == adsk.fusion.DesignTypes.ParametricDesignType:
        isPara = True
    return isPara

スプリクト実行後、何か要素をクリックするとクリックした位置に点を作成します。
(何も無い空間では、点は作成できません)
ん~こうなるとやっぱり、オールマイティなフィルターが欲しいなぁ。