C#ATIA

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

オブジェクトとして提供されない要素を選択する1

忘れないうちにメモっておきたい。
Fusion360APIでオブジェクトとして提供されていない要素を、
選択した状態にしたいことが今までに何度かありました。

こちらもそうです。
Solved: Feature Request? : API for creating and managing "Group"s in browser - Autodesk Community
f:id:kandennti:20201201125404p:plain
Treeが長ったらしくならないように "ボディ" の中にグループを作成することが出来きます。
(この機能欲しいな と思っていたのですが存在する事を知りませんでした・・・)
この "グループ" を選択状態にしたかったのですが、APIのオブジェクトとして提供されていません。


今回も、こちらの記載が非常に役に立ちました。
ものすごく重要なヒントを見つけ出してもらったと、今でも思っています。
Re: Access Section Analysis? - Autodesk Community
また、古いですがこちらも調べまくることになります。
Fusion360_Small_Tools_for_Developers/TextCommands_txt_Ver2_0_8176.txt at master · kantoku-code/Fusion360_Small_Tools_for_Developers · GitHub


最初のこちらのコマンド

PAsset.RootIds 

ver2.0.9313の時点で、僅かに9個しか表示されません。

PAsset.RootIds 
["AssetSettings","ComponentInstancesRoot","ComponentsRoot",
"NamedTrackedEntitySet","ProteinAssetManager","UnitSystems",
"VisualAnalyses","WorkingModelPlaceholderRoot","rootInstance"]

これ自体が何を表すのかも、おぼろげな理解しかしていないのです。(説明も出来ない・・・)

続いて、こちらの類似したコマンドを実行すると

PAsset.EntityIds

大量に表示されるものの、殆ど空です。しかし "PAsset.RootIds" で表示される文字が
チラチラ見えます。JSONっぽいのでこんな感じにすると

        entityIdsStr = _app.executeTextCommand(u'PAsset.EntityIds')

        # Convert to json
        import json
        entityIds = json.loads(entityIdsStr)

f:id:kandennti:20201201125608p:plain
RootIdを持っている要素は、entityIdが "-1" になるようです。
で、これが恐らくオブジェクトの型のような役割を果たしている、要素毎のIDでは
無いかな? と感じています。

但し、中身が空っぽすぎて何を示しているものか分かりません。
そこで

PEntity.Properties <EntityRef>

を使用します。幾つか試しているうちに は先程の "entityId" が利用出来る事に
気が付きました。
色々ありまして、ボディのグループの "entityId" は既に "21" と言う事は気が付いていたので
試したところ

PEntity.Properties 21
{ 
    "interfaceId" : "Ns::BREP::SurfaceGroups", 
    "segment" : 137, 
    "rUnstitchedGroup" : {}, 
    "highWaterMark" : 2, 
    "rClientObject" : {}, 
    "children" : [{"segId":137,"entityId":366,"rootId":""} , {"segId":137,"entityId":367,"rootId":""}], 
    "rParent" : {"segId":137,"entityId":3,"rootId":""}
}

"interfaceId" は、C++の型?名前空間?のような表記です。恐らくこれが型となるのでしょう。
"children" は、子供です。SurfaceGroupsがコレクションと考えれば、SurfaceGroupになるのでしょう。

GUIでボディのグループを選択し、

ObjectPaths.Show

を実行した感じはこちら。(これは選択された要素の情報を表示するコマンドの様です)
f:id:kandennti:20201201125627p:plain
つじつまが合いまくる。恐らくSurfaceGroupsのようなコレクション的な物の "entityId" は
固定なのではなろうか?と思ってます。
("children" に入っている要素(恐らくインスタンス)の "entityId" は流動的)

そして、"PAsset.RootIds" で得られるものしか利用出来ないと思い込んでいた "Managed"
に関しても

Managed.Children <entityId>
Managed.Child <entityId> <IndexNo>

これらでアクセス出来る事が分かりました。


そのうちFusion360解体新書が書けるようになるかもしれない(無い)