C#ATIA

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

プロファイルの入れ子問題1

こちらで面白そうで難しい問題を見つけました。
Extrude DXF which has a lot of details - Autodesk Community
ChatGPTで書かせたスクリプトが上手く行かない との事です。
イヤイヤ、結構書けていると思いますよ。(記載のコードは未実行)

結論としては、押し出すプロファイルを判断する必要があると言う事です。

赤印は単純に単体のプロファイルなので、問題無く押し出す。
青印は表現が正しくないのですが、押し出すプロファイル内の中に
あるプロファイルなので、押し出さないプロファイル。
緑印がさらに厄介で、押し出すプロファイル内にある押し出さない
プロファイル内にあるプロファイルで、これは押し出すプロファイルです。

ちょっとどんな考え方をしたかは眠いので次回記載しますが、
こんな感じで作成しました。
(添付されていたDXFをルートコンポーネントのXY平面にインポート
した状態でスクリプトを実行しています)

# Fusion360API Python script

import traceback
import adsk
import adsk.core as core
import adsk.fusion as fusion

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

        skt: fusion.Sketch = root.sketches.itemByName("stamp")

        tmpMgr: fusion.TemporaryBRepManager = fusion.TemporaryBRepManager.get()

        extFeats: fusion.ExtrudeFeatures = root.features.extrudeFeatures
        checkBodies = []
        for prof in skt.profiles:
            checkBodies.append(
                extFeats.addSimple(
                    prof,
                    core.ValueInput.createByReal(1.0),
                    fusion.FeatureOperations.NewBodyFeatureOperation,
                )
            )

        vec: core.Vector3D = skt.yDirection
        tmpBodies = []

        for prof in skt.profiles:
            hitPoints: core.ObjectCollection = core.ObjectCollection.create()
            res: core.ObjectCollection = root.findBRepUsingRay(
                prof.face.pointOnFace,
                vec,
                fusion.BRepEntityTypes.BRepFaceEntityType,
                -1,
                True,
                hitPoints,
            )

            print(f"hitPoints:{len(hitPoints)}")
            pointsDict = {}
            for p in hitPoints:
                key = f"{round(p.x, 6)},{round(p.y, 6)},{round(p.z, 6)}"
                pointsDict.setdefault(key, 1)

            print(f"pointsDict:{len(pointsDict)}")

            if len(pointsDict.keys()) % 2:
                tmpBodies.append(tmpMgr.copy(prof.face))

        baseFeat: fusion.BaseFeature = None
        if des.designType == fusion.DesignTypes.ParametricDesignType:
            baseFeat = root.features.baseFeatures.add()

        bodies: fusion.BRepBodies = root.bRepBodies
        if baseFeat:
            baseFeat.startEdit()
            for body in tmpBodies:
                try:
                    bodies.add(body, baseFeat)
                except:
                    pass
            baseFeat.finishEdit()
        else:
            for body in tmpBodies:
                bodies.add(body)

        for b in checkBodies:
            b.deleteMe()

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

結果はこんな感じです。

押し出し不足が2ヶ所で、押し出し不要な部分を6ヶ所押し出してます。
もうちょっとなんだよな・・・