こちらの続きです。
オブジェクトとして提供されない要素を選択する3 - C#ATIA
説明の順番を間違えています・・・。まずコンポーネントのボディ内にグループを
作成します。
GUIとテキストコマンドで試すと、こちらのボディを選択状態にして、
Commands.Start FusionCreateSurfaceGroupCommand
を実行する事で実現する事が分かっています。
そこで、上記の操作をそのままスクリプトにして実行してみます。
# Fusion360API Python script import adsk.core, adsk.fusion, traceback _app = adsk.core.Application.cast(None) _ui = adsk.core.UserInterface.cast(None) def run(context): try: global _app, _ui _app = adsk.core.Application.get() _ui = _app.userInterface des :adsk.fusion.Design = _app.activeProduct root :adsk.fusion.Component = des.rootComponent # オカレンスの<ボディ>を取得 occ :adsk.fusion.Occurrence = root.occurrences[0] bodies :adsk.fusion.BRepBodies = occ.component.bRepBodies # 又はコンポーネントの<ボディ>を取得 # bodies :adsk.fusion.BRepBodies = occ.component.bRepBodies # 選択状態にする sels :adsk.core.Selections = _ui.activeSelections sels.clear() sels.add(bodies) # グループ作成コマンド実行 _app.executeTextCommand('Commands.Start FusionCreateSurfaceGroupCommand') except: if _ui: _ui.messageBox('Failed:\n{}'.format(traceback.format_exc()))
オカレンスとしてでもコンポーネントとしてでも、残念な事にここで
sels.add(bodies)
エラーとなってしまいます。ルートコンポーネントではエラーとならないのですが・・・。
イロイロと試しているうちにテキストコマンドの
Selections.Add <paths>
の場合は選択可能だと言う事が分かりました。SelectionsオブジェクトのAddメソッドとは
異なるようです。全く表記が表記が同じなのですが・・・。
する事が出来ない為、オカレンスを選択状態として
import os ・・・ # Selections取得 sels :adsk.core.Selections = _ui.activeSelections sels.clear() # オカレンスを選択状態にする sels.add(occ) # オカレンスの<paths>を取得 linesep = os.linesep # os別の改行コードを取得 occPaths = _app.executeTextCommand(u'Selections.List').rstrip(linesep)
ここからオカレンスのentityIDを取得し、プロパティを見てみます。
import json import neu_server ・・・ # オカレンスのentityIDを取得 occId = str(occPaths).split(':')[-1] # 最後の数字がentityID # プロパティの表示 propTxt = neu_server.get_entity_properties(occId) prop = json.loads(json.dumps(propTxt)) print(str(json.dumps(propTxt, indent=2)))
{ "interfaceId": "Ns::Comp::ComponentInstance", "segment": 8, "creationIndex": 1, "lastSavedTargetRevisionGuid": "f88c7cb0-7f91-4563-a215-b3b01d5df3af", "persistentId": "54aabc9a-62f8-4c98-a881-66e78560a09c", "rOwningDeriveFeature": {}, "rTargetComponent": { "segId": 8, "entityId": 173, "rootId": "" }, "transform": [ [ 1, 0, 0, 0 ], [ 0, 1, 0, 0 ], [ 0, 0, 1, 0 ], [ 0, 0, 0, 1 ] ], "userName": "", "xAssetLinkName": "", "rClientObject": {}, "rParent": { "segId": 8, "entityId": 4, "rootId": "" } }
"Ns::Comp::ComponentInstance" には<ボディ>に関する情報を持っていません。
"rTargetComponent"キーの"entityId"を利用して、コンポーネントのプロパティ
を見てみます。
# コンポーネントのentityIDを取得 compId = prop['rTargetComponent']['entityId'] # プロパティの表示 propTxt = neu_server.get_entity_properties(compId) prop = json.loads(json.dumps(propTxt)) print(str(json.dumps(propTxt, indent=2)))
c:\Users\n-ooshima\OneDrive\fusion360API\Script\a1 { "interfaceId": "Na::FusionComponent", "segment": 8, "isAsBuiltPositions": true, "opacity": 1, "rCanvases": { "segId": 8, "entityId": 217, "rootId": "" }, ・・・ "rAltBodies": { "segId": 8, "entityId": 178, "rootId": "" }, "rBodies": { "segId": 8, "entityId": 176, "rootId": "" }, "rContactSets": { "segId": 8, "entityId": 186, "rootId": "" }, ・・・ }
長すぎるので省略しましたが、"rBodies" が目的のキーです。
これを
オカレンスの<paths> + ':' + コンポーネントID + ':' + <ボディ>のID
となった文字列がオカレンスのボディの
# <ボディ>のentityIDを取得 bodiesId = prop['rBodies']['entityId'] # <ボディ>の<paths> bodiesPaths = '{}:{}:{}'.format(occPaths, compId, bodiesId)
これで選択状態を作ることが出来ます。
# <ボディ>を選択 sels.clear() _app.executeTextCommand(u'Selections.add {}'.format(bodiesPaths)) # グループ作成コマンド実行 _app.executeTextCommand('Commands.Start FusionCreateSurfaceGroupCommand')
これを実行すると無事目的のグループが作成されます。
細切れにコードを表示したので、こちらが全体的なものになります。
# Fusion360API Python script import adsk.core, adsk.fusion, traceback import os import json import neu_server _app = adsk.core.Application.cast(None) _ui = adsk.core.UserInterface.cast(None) def run(context): try: global _app, _ui _app = adsk.core.Application.get() _ui = _app.userInterface des :adsk.fusion.Design = _app.activeProduct root :adsk.fusion.Component = des.rootComponent # オカレンスの取得 occ :adsk.fusion.Occurrence = root.occurrences[0] # Selections取得 sels :adsk.core.Selections = _ui.activeSelections sels.clear() # オカレンスを選択状態にする sels.add(occ) # オカレンスの<paths>を取得 linesep = os.linesep # os別の改行コードを取得 occPaths = _app.executeTextCommand(u'Selections.List').rstrip(linesep) # オカレンスのentityIDを取得 occId = str(occPaths).split(':')[-1] # 最後の数字がentityID # プロパティの表示 propTxt = neu_server.get_entity_properties(occId) prop = json.loads(json.dumps(propTxt)) print(str(json.dumps(propTxt, indent=2))) # コンポーネントのentityIDを取得 compId = prop['rTargetComponent']['entityId'] # プロパティの表示 propTxt = neu_server.get_entity_properties(compId) prop = json.loads(json.dumps(propTxt)) print(str(json.dumps(propTxt, indent=2))) # <ボディ>のentityIDを取得 bodiesId = prop['rBodies']['entityId'] # <ボディ>の<paths> bodiesPaths = '{}:{}:{}'.format(occPaths, compId, bodiesId) # <ボディ>を選択 sels.clear() _app.executeTextCommand(u'Selections.add {}'.format(bodiesPaths)) # グループ作成コマンド実行 _app.executeTextCommand('Commands.Start FusionCreateSurfaceGroupCommand') except: if _ui: _ui.messageBox('Failed:\n{}'.format(traceback.format_exc()))
通常の方法に比べ、桁違いに面倒です。しかし、通常のFusion360APIでは選択出来ない要素が
選択可能となり、大幅に処理が出来るものが増えます。
上手く伝わるかな? APIフォーラムを見ても他の方が気が付いていないようなので、
専売特許状態でも良いのは良いのですが。