こちらで面白そうで難しい問題を見つけました。
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ヶ所押し出してます。
もうちょっとなんだよな・・・