最後に添付しているデータなのですが、
こんな感じの中身です。
三次元的な線なのですが、Treeを見て頂くと
ちょっと不思議な感じがしないでしょうか?
線がsketchに入っているのでは無く、Bodyに
入った状態となっています。
これはスプリクトを利用して作ったもので、恐らく手動の操作では作成出来ないだろうと思います。
実は、この状態であれば三次元の線としてエクスポート出来る事を確認しました。(Iges,Step,Sat)
実験的なスプリクトな為、不完全ですがこちらです。
#FusionAPI_python #Author-kantoku #Description-指定したスケッチの線を新規デザインでBRepWireとして作成する import adsk.core, adsk.fusion, traceback def run(context): ui = None try: app = adsk.core.Application.get() ui = app.userInterface #選択 sel = Sel('スケッチ選択','Sketches') if sel is None: return skt = sel.entity #上手く選択解除出来ない。何故? ui.activeSelections.clear() geos = GetSketchCurvesGeos(skt) #新規デザイン NewDoc(app) des = adsk.fusion.Design.cast(app.activeProduct) root = des.rootComponent #ダイレクト des.designType = adsk.fusion.DesignTypes.DirectDesignType #tempBRep tmpMgr = adsk.fusion.TemporaryBRepManager.get() crvs,_ = tmpMgr.createWireFromCurves(geos) #実体化 bodies = root.bRepBodies bodies.add(crvs) #おしまい ui.messageBox('Done') except: if ui: ui.messageBox('Failed:\n{}'.format(traceback.format_exc())) #選択 def Sel(msg, selFilter): app = adsk.core.Application.get() ui = app.userInterface try: return ui.selectEntity(msg, selFilter) except: return None def NewDoc(app): desDoc = adsk.core.DocumentTypes.FusionDesignDocumentType return app.documents.add(desDoc) def GetSketchCurvesGeos(skt): if len(skt.sketchCurves) < 1: return None adsk.fusion.SketchCurve.toGeoTF = SketchCurveToGeoTransform mat = skt.transform geos = [crv.toGeoTF(mat) for crv in skt.sketchCurves] return geos #adsk.fusion.SketchCurve def SketchCurveToGeoTransform(self,mat3d): geo = self.geometry.copy() geo.transformBy(mat3d) return geo
1)スプリクト実行後、Tree側のスケッチを選択する。
2)新規デザインに、スケッチ内の線を添付したようなBody状態が出来上がる。
○確認している問題点や制限です。
・元のスケッチを指定した側のファイルですが、スプリクト実行後
選択されたままの状態になり、操作が直ぐに出来ない状態になります。
何度かESCキーを押すと通常の状態になります。
(コードで選択解除しているのですが上手く行かないです・・・)
・指定したスケッチ内に閉じた円弧(円)、自己交差した折れ線
閉じた楕円等、一部閉じた形状がある場合、エラーになります。
(四角、単独の直線が交差していてもOK)
・基本的に直線以外は正しく表示出来ないようです。但しエクスポートした
ものは正しく出来ているようです。
左はスケッチに描いた線です。上がスプラインで下が円弧です。
中央は上記のスプリクトで作成されたBodyです。
右が処理前と処理後を重ねた状態です。
曲線に関しては始点終点でしか表示出来ないようです。(その為、閉じた円弧等はエラーとなるのかも)
手前味噌で申し訳ないですが、こちらの3D曲線インポートスプリクトで
再インポートしてみると重なっています。
又、スケッチの "3Dジオメトリを含める" を利用すると
同様に正しい形状を取得できそうです。
・スプリクト処理後に出来上がる新規デザインは、履歴をキャプチャしない
モードです。(そうしないと処理できなかったので・・・基準フューチャーもNG)
ご注意ください。
スプリクトが出来上がりました。
・表示されているスケッチの線の要素全てをエクスポートします。
(コンストラクション要素はエクスポートしません)
・フォーマットは Iges(.igs),Step(.stp),Acis(.sat)のみです。
#FusionAPI_python ExportWire Ver0.0.2 #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) msg_dic = GetMsg() #表示されているスケッチ 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(msg_dic['not_found']) 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, True) #実体化 expRoot = expDes.rootComponent bodies = expRoot.bRepBodies bodies.add(crvs) #保存 res = ExportFile(path,expDes.exportManager) #一時Docを閉じる expDoc.close(False) #おしまい if res: msg = msg_dic['done'] else: msg = msg_dic['failed'] ui.messageBox(msg) except: if ui: ui.messageBox('Failed:\n{}'.format(traceback.format_exc())) #言語別メッセージ 日本語以外は英語 def GetMsg(): langs = adsk.core.UserLanguages app = adsk.core.Application.get() lang = app.preferences.generalPreferences.userLanguage keys = ['not_found','done','failed'] if lang == langs.JapaneseLanguage: values = ['エクスポートする要素がありません!','完了','失敗しました!'] else: values = ['Export item not found!', 'Done', 'Failed!'] return dict(zip(keys, values)) #ファイルエクスポート 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 #新しいDoc def NewDoc(app): desDoc = adsk.core.DocumentTypes.FusionDesignDocumentType return app.documents.add(desDoc) #World座標でのジオメトリ取得 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]
お探しの情報が見つからないときは、コミュニティで質問しましょう。困っている人がいたら、情報を教えてあげましょう。