こちらの続きです。
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