C#ATIA

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

Sketchをクローンする

CATIAの場合、普通にスケッチのクローンはコピペで簡単に出来るのですが
Fusion360では出来ないんですよね。結構不便な気がします。
どうしても行いたい場合は、
・予めコピー元のスケッチに入り、全ての要素をコピー
・目的のスケッチを作成
・スケッチに入りペースト
で出来ないことは無いのですが、やっぱりスケッチのクローンを作る
操作としてはイメージが異なりませんかね?

Helpをよく見ると、sketch.copyメソッドがあるじゃないですか。
Fusion 360 Help

じゃあ出来るじゃない と思い作ったのがこちら

#Author-kantoku
#Description-Clone Sketch
#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
        filter =[
            # 'Sketches'
            # 'SketchConstraints',
            'Profiles',
            'Texts',
            'SketchCurves',
            'SketchLines',
            'SketchCircles',
            'SketchPoints']

        # select sketch entity
        msg :str = 'Select Sketch Entity'
        selFiltter :str = ','.join(filter)
        sel :adsk.core.Selection = selectEnt(_ui, msg ,selFiltter)
        if not sel: return

        # get sketch entities
        skt :adsk.fusion.Sketch = getSketch(sel.entity)
        objs :adsk.core.ObjectCollection = getSketchAllEntities(skt)

        # clone sketch
        support = skt.referencePlane
        comp :adsk.fusion.Component = skt.parentComponent
        mat = adsk.core.Matrix3D.create()
        clone :adsk.fusion.Sketch = comp.sketches.add(support)
        skt.copy(objs, mat, clone)

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

def getSketch(
    ent
    ) -> adsk.fusion.Sketch:

    skt = adsk.fusion.Sketch.cast(ent)
    if skt:
        return skt
    
    return ent.parentSketch

def getSketchAllEntities(
    skt :adsk.fusion.Sketch
    ) -> adsk.core.ObjectCollection:

    objs = adsk.core.ObjectCollection.create()
    [objs.add(e) for e in skt.sketchPoints if not e.isReference]
    [objs.add(e) for e in skt.sketchCurves]
    [objs.add(e) for e in skt.sketchTexts]

    return objs

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

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

原点までクローンされるのは困るのですが、避ける方法がちょっとわかりませんでした。