前から "マウスでクリックした位置をワールド座標で取得したい" と思っていたのですが、
ガッカリするほど簡単に出来ました。
実は、こちらのスクリーン座標からワールド座標に計算しなきゃダメかな?
って思っていたんです。
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
スプリクト実行後、何か要素をクリックするとクリックした位置に点を作成します。
(何も無い空間では、点は作成できません)
ん~こうなるとやっぱり、オールマイティなフィルターが欲しいなぁ。