C#ATIA

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

3D曲線と遊ぶ1

時間が無い。とりあえず程度のコード。

#Fusion360API Python script
#Author-kantoku
#Description-3DCurve test

import adsk.core, adsk.fusion, traceback

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

        sktNames = [
            'Curvature',
            'Tangent',
            'FirstDerivative', 
            'SecondDerivative', 
            'ThirdDerivative']

        msg :str = 'Select SketchCurve'
        selFiltter :str = 'SketchCurves'

        sel :adsk.core.Selection = selectEnt(ui, msg ,selFiltter)
        if not sel: return

        crv = sel.entity
        geo = crv.worldGeometry
        eva = geo.evaluator

        _, startPnt, endPnt = eva.getEndPoints()
        _, endPrms = eva.getParametersAtPoints([startPnt, endPnt])

        step = 0.1
        prms = list(dRange(endPrms[0], endPrms[1], step))
        prms.append(endPrms[1])

        skts = [initSkt(root, s) for s in sktNames]
        for skt in skts:
            skt.isComputeDeferred = True

        vecs = [None for s in sktNames]

        for prm in prms:
            _, pnt = eva.getPointAtParameter(prm)
            dumpPnt3D(prm, pnt)
            _, vecs[0], curvature = eva.getCurvature(prm)
            _, vecs[1] = eva.getTangent(prm)
            _, vecs[2] = eva.getFirstDerivative(prm)
            _, vecs[3] = eva.getSecondDerivative(prm)
            _, vecs[4] = eva.getThirdDerivative(prm)

            [initLine(skt, pnt, vecs[idx]) for idx, skt in enumerate(skts)]

        for skt in skts:
            skt.isComputeDeferred = False
 

        ui.messageBox('Done')

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

def dumpPnt3D(
    prm :float,
    pnt : adsk.core.Point3D):
    print('{}| x:[{}]y:[{}]z:[{}]'.format(prm,pnt.x,pnt.y,pnt.z))


def dRange(begin, end, step):
    n = begin
    while n + step < end:
        yield n
        n += step


def initLine(
    skt :adsk.fusion.Sketch,
    pnt :adsk.core.Point3D,
    vec :adsk.core.Vector3D):

    endPnt = pnt.copy()
    endPnt .translateBy(vec)
    lins = skt.sketchCurves.sketchLines
    lins.addByTwoPoints(pnt, endPnt)


def initSkt(
    comp :adsk.fusion.Component,
    name :str) -> adsk.fusion.Sketch:

    skt = comp.sketches.add(comp.xYConstructionPlane)
    skt.name = name

    return skt


def selectEnt(
        ui :adsk.core.UserInterface,
        msg :str, 
        filtterStr :str) -> adsk.core.Selection :

    try:
        sel = ui.selectEntity(msg, filtterStr)
        return sel
    except:
        return None

スクリプト実行後、スケッチの曲線を選択すると、接戦やら何やらのベクトルを
可視化するためのスケッチを作ります。
(ベクトルのサイズは戻り値のままで、深い意味は調べてません)

f:id:kandennti:20191205115634p:plain
接戦と第一デリバティブ(一次微分)は同じものが返ってきます。