C#ATIA

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

フィレットの元のエッジを探せ!!4

タイトルと内容が違うのですが、こちらの続きです。
フィレットの元のエッジを探せ!!3 - C#ATIA

前回、"子" を見つけきれなかった原因を調査します。
その為、選択した要素のentityTokenをDumpするための
スクリプトを作成しました。

# Fusion360API Python script

import traceback
import adsk.cam
import adsk.fusion
import adsk.core

_app: adsk.core.Application = None
_ui: adsk.core.UserInterface = None
_handlers = []
_selIpt: adsk.core.SelectionCommandInput = None
_dumpIpt = adsk.core.BoolValueCommandInput = None
_cmdInfo = {
    'id': 'KANTOKU_EntityTokenDump',
    'name': 'Entity TokenDump',
    'tooltip': 'Entity TokenDump',
}

class MyCommandCreatedHandler(adsk.core.CommandCreatedEventHandler):
    def __init__(self):
        super().__init__()

    def notify(self, args: adsk.core.CommandCreatedEventArgs):
        try:
            global _handlers
            cmd: adsk.core.Command = adsk.core.Command.cast(args.command)
            cmd.isOKButtonVisible = False

            inputs: adsk.core.CommandInputs = cmd.commandInputs

            onDestroy = MyCommandDestroyHandler()
            cmd.destroy.add(onDestroy)
            _handlers.append(onDestroy)

            onPreSelect = MyPreSelectHandler()
            cmd.preSelect.add(onPreSelect)
            _handlers.append(onPreSelect)

            onInputChanged = MyInputChangedHandler()
            cmd.inputChanged.add(onInputChanged)
            _handlers.append(onInputChanged)

            global _selIpt
            _selIpt = inputs.addSelectionInput(
                'selIptId',
                'select',
                ''
            )
            _selIpt.setSelectionLimits(0)

            global _dumpIpt
            _dumpIpt = inputs.addBoolValueInput(
                'dumpIptId',
                'Dump',
                False,
                '',
                False
            )

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


class MyInputChangedHandler(adsk.core.InputChangedEventHandler):
    def __init__(self):
        super().__init__()
    def notify(self, args: adsk.core.InputChangedEventArgs):
        global _dumpIpt
        if args.input != _dumpIpt:
            return

        global _selIpt
        tokens = ['** Dump entityToken **']
        tokens.extend([_selIpt.selection(idx).entity.entityToken 
            for idx in range(_selIpt.selectionCount)])

        _app.log('\n\n'.join(tokens))


class MyPreSelectHandler(adsk.core.SelectionEventHandler):
    def __init__(self):
        super().__init__()
    def notify(self, args: adsk.core.SelectionEventArgs):
        entity = args.selection.entity
        if hasattr(entity, 'entityToken'):
            token = entity.entityToken
        else:
            token = ''

        global _selIpt
        _selIpt.commandPrompt = token


class MyCommandDestroyHandler(adsk.core.CommandEventHandler):
    def __init__(self):
        super().__init__()

    def notify(self, args: adsk.core.CommandEventArgs):
        adsk.terminate()


def run(context):
    try:
        global _app, _ui
        _app = adsk.core.Application.get()
        _ui = _app.userInterface

        global _cmdInfo
        cmdDef: adsk.core.CommandDefinition = _ui.commandDefinitions.itemById(
            _cmdInfo['id']
        )

        if not cmdDef:
            cmdDef = _ui.commandDefinitions.addButtonDefinition(
                _cmdInfo['id'], _cmdInfo['name'], _cmdInfo['tooltip']
            )

        global _handlers
        onCommandCreated = MyCommandCreatedHandler()
        cmdDef.commandCreated.add(onCommandCreated)
        _handlers.append(onCommandCreated)

        cmdDef.execute()

        adsk.autoTerminate(False)

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

もう、見てくれなんてどうでも良いです。

要素を選択して、"Dump" を押すとテキストコマンドウィンドウに
entityTokenを垂れ流します。


左は押し出してフィレット1を付けた状態で、
右はその後フィレット2を付けました。

左のオレンジ部はフィレット2によって消えるエッジです。
紫部はフィレット2によって長さが変更されるエッジです。
緑部はフィレット2には影響を受けないエッジです。

ここで、フィレット2を付ける前と付けた後の紫部のentityToken
を調べると・・・

/v4BAAAARlJLZXkAH4sIAAAAAAAA/21QOw7CMAxl4hzmAJGc2LRhYiozExuqAkkRG4LObJyME3ABxBW4Ac4HCaomkf3y/GwnRjCAsrV4nZGxgjRwZCp4Pbe+Xzaz2/2xvk7fF1EYoApc19W1NUH5LswVux0rZxeonNgKbc1eu6SVGpPBSv0QUjsGAkMWxLGwqXEME+rk01syQV+ChgrzQyAEfwjtOeyPp9B61ztowILS5RhYyRUjjKBwmyyhkWAEJgIsc6E4gWLH8+ivQJ4up0zOv/kAIATvVXcBAAA=

/v4BAAAARlJLZXkAH4sIAAAAAAAA/3VQuw0CMQylYg4zQCTHDnehojpqKjp0CiSH6BBcTcdkTMACiBXYAOeDBCdIovjl+dmOHgIBytYSdUZkBWkwkangcV/7ft5MLtfb8jx+nkRBwBW4rqtrS0H5LkyVcRujnJ2hcnJXaGvjtUta6TEarDQPIY0zwEBsQYIRNg2OaUadYvpLJvhN8FBBHwRC8LvQHsN2fwitd72DBiwoXQ7BQp4YYQSFW2UJ/0hGQBFg8YWjAymaP3X81SC7a0pF9JleTJqPAncBAAA=

文字列の意味を調べても意味が無いので無視しますが、
変わっている事が確認出来ます。何故?面か?


フィレット2を付ける前後で青部のエッジを調べると

/v4BAAAARlJLZXkAH4sIAAAAAAAA/22NsQ3CMBBFqZjjM4Cl89lJTEUVaio6FBnsIDoEqemYjAlYALECG3B2IgER9sn/+/n7jsAg2VpU946dOA2bSInnYxO6RT273u6ry/R1lgTDlPBtW1WOowptLJT1W6u8m5PycpbkKhu0z1npMRmtPI+Qx1kYMJUQsULz4PRsSGeVKsZAjwF/AUIM+9ic4u5wjE3wnUcNB6WHYizlSskmM7B1HzEf9pPiZFLv/znz80Fyb9WnErlXAQAA

/v4BAAAARlJLZXkAH4sIAAAAAAAA/22NsQ3CMBBFqZjjM4Cl89lJTEUVaio6FBnsIDoEqemYjAlYALECG3B2IgER9sn/+/n7jsAg2VpU946dOA2bSInnYxO6RT273u6ry/R1lgTDlPBtW1WOowptLJT1W6u8m5PycpbkKhu0z1npMRmtPI+Qx1kYMJUQsULz4PRsSGeVKsZAjwF/AUIM+9ic4u5wjE3wnUcNB6WHYizlSskmM7B1HzEf9pPiZFLv/znz80Fyb9WnErlXAQAA

細かく見比べていませんが、恐らく変わってません。
実はエッジがフィレット2の影響を受けていなくても、
エッジを所有している面の形状が変わった場合は、
面の境界となる全てのエッジのentityTokenも変更されるのでは?
と思ったのですが、青部が変更されないとなると
思惑が外れました。

”フィレット1のエッジを利用して、面取り1が作られている”
(=面取り1は、フィレット1の "子")と言う事を知る為には
どうすれば良いのだろうか? facesの面達の隣の面も含めて
entityTokenで管理・・・しても駄目だな。 困った。