C#ATIA

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

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

こちらの続きです。
プロファイルの入れ子問題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()))

これを実行した結果がこちらです。

完璧です!! 出来た瞬間、"おぉ"と声を出してしまった事は内緒です。

入れ子状態のプロファイルも判断出来ます!
(説明無しで終わっちゃいそう)