C#ATIA

↑タイトル詐欺 主にCATIA V5 の VBA(最近はPMillマクロとFusion360APIが多い)

3Dな線のエクスポート1

こちらの続きです。
3Dな線のエクスポート考え中 - C#ATIA

コメント欄にも書いたのですが、行列の積は交換法則成り立たないんですね。
行列の積の交換法則 | 高校数学応援ブログ web問題集
スケッチ位置を変換してから、オカレンスの位置を変換にしたら上手くいきました。

#FusionAPI_python ExportWire Ver0.0.1
#Author-kantoku
#Description-表示されている全てのスケッチの線をエクスポート
#コンストラクションは変換しない

import adsk.core, adsk.fusion, traceback
from itertools import chain
import os.path

def run(context):
    ui = None
    try:
        app = adsk.core.Application.get()
        ui  = app.userInterface
        doc = app.activeDocument
        des = adsk.fusion.Design.cast(app.activeProduct)
        
        #表示されているスケッチ
        skts = [skt
                for comp in des.allComponents if comp.isSketchFolderLightBulbOn
                for skt in comp.sketches if skt.isVisible]
        ui.activeSelections.clear()
        
        #正しい位置でジオメトリ取得       
        geos = list(chain.from_iterable(GetSketchCurvesGeos(skt) for skt in skts))
        if len(geos) < 1:
            ui.messageBox('エクスポートする線がありません')
            return
        
        #ファイルパス
        path = Get_Filepath(ui)
        if path is None:
            return
        
        #新規デザイン
        expDoc = NewDoc(app)
        expDes = adsk.fusion.Design.cast(app.activeProduct)
        doc.activate()
        
        #ダイレクト
        expDes.designType = adsk.fusion.DesignTypes.DirectDesignType

        #tempBRep
        tmpMgr = adsk.fusion.TemporaryBRepManager.get()
        crvs,_ = tmpMgr.createWireFromCurves(geos)
        
        #実体化
        expRoot = expDes.rootComponent
        bodies = expRoot.bRepBodies
        bodies.add(crvs)
        
        #保存
        res = ExportFile(path,expDes.exportManager)
        
        #一時Docを閉じる
        expDoc.close(False)
        
        #おしまい
        if res:
            msg = 'Done'
        else:
            msg = 'エクスポート出来ませんでした'
        
        ui.messageBox(msg)
        
    except:
        if ui:
            ui.messageBox('Failed:\n{}'.format(traceback.format_exc()))

def ExportFile(path,expMgr):
    _, ext = os.path.splitext(path)
    
    if 'igs' in ext:
        expOpt = expMgr.createIGESExportOptions(path)
    elif 'stp' in ext:
        expOpt = expMgr.createSTEPExportOptions(path)
    elif 'sat' in ext:
        expOpt = expMgr.createSATExportOptions(path)
    else:
        return False
        
    expMgr.execute(expOpt)
    return True
    
#ファイルパス
def Get_Filepath(ui):
    dlg = ui.createFileDialog()
    dlg.title = '3DCurvesExport'
    dlg.isMultiSelectEnabled = False
    dlg.filter = 'IGES(*.igs);;STEP(*.stp);;SAT(*.sat)'
    if dlg.showSave() != adsk.core.DialogResults.DialogOK :
        return
    return dlg.filename
        
def NewDoc(app):
    desDoc = adsk.core.DocumentTypes.FusionDesignDocumentType
    return app.documents.add(desDoc)

def GetSketchCurvesGeos(skt):
    if len(skt.sketchCurves) < 1:
        return None
    
    #extension
    adsk.fusion.SketchCurve.toGeoTF = SketchCurveToGeoTransform
    adsk.fusion.Component.toOcc = ComponentToOccurrenc
    
    mat = skt.transform.copy()
    occ = skt.parentComponent.toOcc()
    
    if not occ is None:
        mat.transformBy(occ.transform)
        
    geos = [crv.toGeoTF(mat) for crv in skt.sketchCurves if not crv.isConstruction]
    
    return geos

#adsk.fusion.SketchCurve
def SketchCurveToGeoTransform(self,mat3d):
    geo = self.geometry.copy()
    geo.transformBy(mat3d)
    
    return geo

#adsk.fusion.Component 拡張メソッド
#コンポーネントからオカレンスの取得 ルートはNone
def ComponentToOccurrenc(self):
    root = self.parentDesign.rootComponent
    if self == root:
        return None
        
    occs = [occ
            for occ in root.allOccurrencesByComponent(self)
            if occ.component == self]
    return occs[0]

まだ、ちょっとエラーになる時があり、調査中ですが
基本的に手動でスケッチに描いた線はエクスポート出来る
はずです。

こちらで確認はしています。
Autodesk Viewer | Free Online File Viewer