コミュニティ
Fusion - 日本語
製品テクニックや情報を共有、質問、解答したり、情報を検索など使い方は様々です。お役立てください。
キャンセル
次の結果を表示 
表示  限定  | 次の代わりに検索 
もしかして: 

3Dな線を3DCAD中間ファイルでエクスポートする

1件の返信1
返信
メッセージ1/2
kandennti
622 件の閲覧回数, 1 件の返信

3Dな線を3DCAD中間ファイルでエクスポートする

1.png

 

 

最後に添付しているデータなのですが、
こんな感じの中身です。

 

三次元的な線なのですが、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)

 

・基本的に直線以外は正しく表示出来ないようです。但しエクスポートした
 ものは正しく出来ているようです。

 

2.png

 

 

 

左はスケッチに描いた線です。上がスプラインで下が円弧です。

中央は上記のスプリクトで作成されたBodyです。
右が処理前と処理後を重ねた状態です。

 

曲線に関しては始点終点でしか表示出来ないようです。(その為、閉じた円弧等はエラーとなるのかも)

手前味噌で申し訳ないですが、こちらの3D曲線インポートスプリクトで
再インポートしてみると重なっています。

https://forums.autodesk.com/t5/fusion-360-ri-ben-yu/3dcad-zhong-jianfairuno3dna-dian-qu-xianwoinpoto...

 


3.png

 

 

 

 

 

 

 

 

 

又、スケッチの "3Dジオメトリを含める" を利用すると

同様に正しい形状を取得できそうです。

 

 

 

 

・スプリクト処理後に出来上がる新規デザインは、履歴をキャプチャしない
 モードです。(そうしないと処理できなかったので・・・基準フューチャーもNG)
 ご注意ください。

タグ(1)
1件の返信1
メッセージ2/2
kandennti
次のアカウントへの返信: kandennti

スプリクトが出来上がりました。

・表示されているスケッチの線の要素全てをエクスポートします。

 (コンストラクション要素はエクスポートしません)

・フォーマットは 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]
タグ(1)

お探しの情報が見つからないときは、コミュニティで質問しましょう。困っている人がいたら、情報を教えてあげましょう。

フォーラムに投稿