こちらの続きです。
プロファイルの入れ子問題2 - C#ATIA
上手く行かない原因が分かりました。詳しく説明すると
途中で睡魔に負けそうなのでサラっと記載しておきますが、
findBRepUsingRayメソッドは1枚の面に対しては1度しか
Hitしていないようです。
それが分かったのでちょっと工夫してみました。
# 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, ) ) rayDirect: core.Vector3D = skt.yDirection tmpBodies = [] vec: core.Vector3D = rayDirect.copy() vec.normalize vec.scaleBy(0.001) for prof in skt.profiles: p: core.Point3D = prof.face.pointOnFace hits = [] while True: hitPoints: core.ObjectCollection = core.ObjectCollection.create() root.findBRepUsingRay( p, rayDirect, fusion.BRepEntityTypes.BRepFaceEntityType, -1, True, hitPoints, ) if hitPoints.count < 1: break p = hitPoints[0] hits.append(p) p.translateBy(vec) pointsDict = {} for p in hits: key = f"{round(p.x, 6)},{round(p.y, 6)},{round(p.z, 6)}" pointsDict.setdefault(key, 1) 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()))
これを実行した結果がこちらです。
完璧です!! 出来た瞬間、"おぉ"と声を出してしまった事は内緒です。
入れ子状態のプロファイルも判断出来ます!
(説明無しで終わっちゃいそう)