C#ATIA

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

トリム前後で同一の線と判断したい1

わかりにくいタイトルです。

要はこんなお話です。
f:id:kandennti:20220408162903p:plain
左の様に円を2個描きます。その後、小さい円を利用して、
大きい円をトリムした際、トリム前の大きな円が
トリム後の円弧になっている事を知りたいんです。

GUIで作業している分には円(閉じている)と円弧(開いている)
がトリムによって変わったことは一目瞭然なのですが、
APIだと難しいです。(人間の目と脳は素晴らしい)
何故なら、円と円弧ではオブジェクトが異なるからです。
Fusion 360 Help
Fusion 360 Help
・・・メンドクサイ。

トリム自体をAPIで行うのであれば、見失う事は無いのですが、
GUIでトリムされたものをAPIで見つけ出すのが難しい。

とりあえずサンプルです。

# Fusion360API Python script

import traceback
import adsk.fusion
import adsk.core

def run(context):
    ui: adsk.core.UserInterface = None
    try:
        app: adsk.core.Application = adsk.core.Application.get()
        ui = app.userInterface
        des: adsk.fusion.Design = app.activeProduct
        root: adsk.fusion.Component = des.rootComponent

        skt: adsk.fusion.Sketch = root.sketches.add(
            root.xYConstructionPlane
        )
        circles: adsk.fusion.SketchCircles = skt.sketchCurves.sketchCircles
        
        cir1: adsk.fusion.SketchCircle = circles.addByCenterRadius(
            adsk.core.Point3D.create(1,1,0),
            2.0
        )
        cir2: adsk.fusion.SketchCircle = circles.addByCenterRadius(
            adsk.core.Point3D.create(2,2,0),
            1.0
        )

        dumpInfo(cir1)

        tools: adsk.core.ObjectCollection = adsk.core.ObjectCollection.create()
        tools.add(cir2)

        res = cir1.trim(
            adsk.core.Point3D.create(3,3,0),
        )
        dumpInfo(cir1)

        ark1 = res.item(0)
        dumpInfo(ark1)

    except:
        if ui:
            ui.messageBox('Failed:\n{}'.format(traceback.format_exc()))


def dumpInfo(sktEnt: adsk.fusion.SketchEntity) -> None:

    def isVisible(sktEnt: adsk.fusion.SketchEntity) -> bool:
        try:
            if not hasattr(sktEnt, 'isVisible'):
                return False

            return sktEnt.isVisible
        except:
            return False

    def getToken(sktEnt: adsk.fusion.SketchEntity) -> str:
        try:
            return sktEnt.entityToken
        except:
            return ''

    # *********
    msg = '-------\n'
    msg += f'classType | {sktEnt.classType()}\n'
    msg += f'isVisible | {isVisible(sktEnt)}\n'
    msg += f'token | {getToken(sktEnt)}'

    adsk.core.Application.get().log(msg)

entityTokenは、それぞれ固有の要素を示すIDのようなもの(ハッシュ)
です。その為、実行する度に代わってしまいますがその一例の結果です。

 -------
classType | adsk::fusion::SketchCircle
isVisible | True
token | /v4BAAAARlJLZXkAH4sIAAAAAAAA/zNQsFAwAEJDBSMgBrOMLIAsQwUTkIiZwj4uq0Xvt7r6rXnWEJLRzsgNVGGkYGymYGmeZmhhYJSsa5ZqZqprYpFkpptolmiga2ppmJJmZmaRaGxgAlYLNIMBDYDtM1AAW2dqaASx1hyo1ADIBgDODUKvkgAAAA==
 -------
classType | adsk::fusion::SketchCircle
isVisible | False
token | 
 -------
classType | adsk::fusion::SketchArc
isVisible | True
token | /v4BAAAARlJLZXkAH4sIAAAAAAAA/zNQsFAwAEJDBSMgBrOMLIAsQwUTkIiZwj4uq0Xvt7r6rXnWEJLRzsgNVGGkYGymYGmeZmhhYJSsa5ZqZqprYpFkpptolmiga2ppmJJmZmaRaGxgAlYLNIMBDYDtM1AAW2dqaASx1hyo1ACELQCa35eclAAAAA==

大きい円(cir1)はトリム後に見失っています。(isVisible | False)
大きい円(cri1)とトリム後の円弧(ark1)のentityTokenは似ているのですが、
ここから判断するのは無理・・・。
そもそもentityTokenの文字列に意味を求めても無駄だと、ドキュメントに
記載されていた記憶があります。

諦めようかとも思っていたのですが、書いているうちに属性は引き継いで
くれそうな予感がしてきました。
近いうちに試そう。(3度目のワクチンから回復したら・・・)