C#ATIA

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

複数面に線を描きたい4

こちらの続きです。
複数面に線を描きたい3 - C#ATIA

気が重い。2枚のサーフェス上に1本の線を描くことは恐らく
出来ないと思われるため、各点から相手の点に向かってお互いに
UV的な直線を作ってみます。
f:id:kandennti:20200512130731p:plain

手がかりを掴みたく、こちらを作りました。

#Fusion360API Python script

import adsk.core, adsk.fusion, traceback

_app = adsk.core.Application.cast(None)
_ui = adsk.core.UserInterface.cast(None)

def run(context):
    try:
        global _app, _ui
        _app = adsk.core.Application.get()
        _ui = _app.userInterface
        des  :adsk.fusion.Design = _app.activeProduct
        root :adsk.fusion.Component = des.rootComponent

        # get body
        body :adsk.fusion.BRepBody = root.bRepBodies.item(0)

        # get face
        face :adsk.fusion.BRepFace = body.faces.item(0)

        # get point
        pnt1 :adsk.fusion.ConstructionPoint = root.constructionPoints.item(0)
        pnt2 :adsk.fusion.ConstructionPoint = root.constructionPoints.item(1)

        # BRepFace.evaluator
        faceEva :adsk.core.SurfaceEvaluator = face.evaluator

        # get parameter
        prm1 = adsk.core.Point2D.cast(None)
        prm2 = adsk.core.Point2D.cast(None)
        _, prm1 = faceEva.getParameterAtPoint(pnt1.geometry)
        _, prm2 = faceEva.getParameterAtPoint(pnt2.geometry)
        print('prm1:{}'.format(faceEva.isParameterOnFace(prm1)))
        print('prm2:{}'.format(faceEva.isParameterOnFace(prm2)))

        # init line2D
        lin2D = adsk.core.Line2D.create(prm1, prm2)

        # get BRepFace.geometry.evaluator
        geoEva :adsk.core.SurfaceEvaluator = face.geometry.evaluator

        # init curve3D list
        crvs = geoEva.getModelCurveFromParametricCurve(lin2D)

        # add sketch
        skt :adsk.fusion.Sketch = root.sketches.add(root.xYConstructionPlane)
        skt.isComputeDeferred = True
        sktCrvs :adsk.fusion.SketchCurves = skt.sketchCurves

        for crv in crvs:
            if hasattr(crv,'asNurbsCurve'):
                crv = crv.asNurbsCurve

            if crv.objectType == 'adsk::core::NurbsCurve3D':
                sktElm = sktCrvs.sketchFittedSplines.addByNurbsCurve(crv)

            else:
                s = crv.startPoint
                e = crv.endPoint
                sktElm = sktCrvs.sketchLines.addByTwoPoints(s,e)

        skt.isComputeDeferred = False

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

これでは片側しか線を描かない為、こちらのItem部分を修正して2回実行します。

        ・・・
        # get face
        face :adsk.fusion.BRepFace = body.faces.item(1)
        ・・・

f:id:kandennti:20200512131232p:plain
紫が手動で作ったもので、青の点が表示されているものが今回のもの。
上手くいかないのはやる前から分かっていたのですが、いざ目の前にすると辛い。

ん~お互いの面が共有するエッジ上で通過点を取得し、それぞれ2点から
エッジ上の点に向かってUV的な直線を描けば良いのですが、
f:id:kandennti:20200512131800p:plain
どうやれば良いのかな? Fusion360のコマンド使うと履歴的に汚くなるので
内部的にゴリゴリやりたい。

・・・気が重い。