C#ATIA

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

押し出しのスピードテスト3

こちらの続きのような感じです。
押し出しのスピードテスト2 - C#ATIA
が、実質こちらの続きです。
押し出しのスピードテスト1 - C#ATIA

個人的にはFusion360でのスケッチ操作は、isComputeDeferredのOffが
最速だろうと思っています。

先日気になったこちら
Super slow run time - C#ATIA
Ekins氏もスケッチに関してはisComputeDeferredの効果が大きい事を
記載しています。
但し、今回のテストのように3Dの立方体を作成する場合は
「スケッチ → 押し出し」する必要が無い為、TemporaryBRepManagerを
使用した方が格段に早いとJesusFreke氏が記載している と解釈しました。
(スケッチはオーバーヘッドがドでかい)

で、TemporaryBRepManagerを利用し、同等の立方体を作成するコードを
作りました。

#test6-TemporaryBRepManagerで直接Box作成
def test6(comp,pnts,height):
    
    #DirectDesignType
    des = comp.parentDesign
    des.designType = adsk.fusion.DesignTypes.DirectDesignType
    bodies = comp.bRepBodies
    
    #TemporaryBRepManager
    tmpBrep = adsk.fusion.TemporaryBRepManager.get()
    
    pnt3D = adsk.core.Point3D
    l_Dir = adsk.core.Vector3D.create(1.0, 0.0, 0.0)
    w_Dir = adsk.core.Vector3D.create(0.0, 1.0, 0.0)
    obb3D = adsk.core.OrientedBoundingBox3D
    
    for ((x1,y1,z1),(x2,y2,z2)) in pnts:
        obb = obb3D.create(pnt3D.create((x1+x2)*0.5,(y1+y2)*0.5,(z1+z2)*0.5), 
                           l_Dir,
                           w_Dir,
                           height,
                           height,
                           height
                           )
    
        bodies.add(tmpBrep.createBox(obb))
        
    return inspect.getframeinfo(inspect.currentframe())[2]

念の為、前回最速だったTest3の結果はこちら

test3-time:1.13s
test3-time:1.12s
test3-time:1.14s
test3-time:1.12s
test3-time:1.12s

今回のものがこちら

test6-time:0.13s
test6-time:0.13s
test6-time:0.13s
test6-time:0.13s
test6-time:0.13s

桁違いに早いです。但し欠点もあります。
TemporaryBRepManagerを利用する場合、ダイレクトモードである必要が有ります。
利用の仕方しだいですな。

愚痴

春から新人さん(中途)の教育係になってしまい、ブログのネタになりそうな
取り組みが出来ません。

マンツーマンで教えている最中に、横で寝られるのはさすがに萎えた。
これだけの連休明けだけに、眠いのもわかるのだが真横に居て説明中にとは・・・。
ゆとりドストライク世代なので、しょうがないのか?
(もっとコッソリ寝てくれ)

お前が悪いんじゃない、国が悪い。

Super slow run time

こちら、正しく理解しきれていないのですが面白いです。
Super slow run time - Autodesk Community

個人的にですが、処理量が程々であればCATIAよりFusion360の方が
ジオメトリ的な処理が速い印象があるのですが、それでも遅いとの事。

記載されたコードを試してはいないのですが、興味深い処理が幾つかありました。
時間さえあれば・・・。

スカルプト産ボディからフューチャーを取得したい2

こちらの続きです。
スカルプト産ボディからフューチャーを取得したい1 - C#ATIA

色々とHelpを調べ何となくですがわかりました。
こんなコードです。

#Fusion360 python

import adsk.core, adsk.fusion, traceback
def run(context):
    ui = None
    try:
        app = adsk.core.Application.get()
        ui  = app.userInterface
        des = adsk.fusion.Design.cast(app.activeProduct)
        
        sel = Sel('ボディを選択してください','Bodies')
        if sel is None:
            return
        
        print('-- start --')
        bdy = sel.entity
        
        fm = GetParentFormFeature(bdy, des)
        
        if fm is None:
            msg = 'スカルプトで作ったのボディではありません'
        else:
            msg = 'スカルプトで作ったのボディです!!'
        
        ui.messageBox(msg)

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

def GetParentFormFeature(bdy, des):
    pa_fm = None

    for cmp in des.allComponents:
        print('comp:{}'.format(cmp.name))
        for fm in cmp.features.formFeatures:
            print('  form:{}'.format(fm.name))
            for bd in fm.bodies:
                print('    {}:{}'.format(bd.name,bdy == bd))
                if (bdy == bd):
                    pa_fm = fm
    return pa_fm

def Sel(msg, selFilter):
    app = adsk.core.Application.get()
    ui  = app.userInterface
    try:
        return ui.selectEntity(msg, selFilter)
    except:
        return None

ボディから直接フォームフューチャーを取得出来る方法が無さそうな為、
全てのフォームフューチャー内に狙ったボディが含まれているか?
を調べまくりました。
GetParentFormFeature関数のげっそりするような3重ループ・・・。
本来であれば、内包表現かFlattenを利用すべきでしょう。

こんな感じでテストです。
f:id:kandennti:20190425174229p:plain
結果的に一部しか上手くいきません。
・ルートコンポーネントで作成したスカルプト産ボディ - OK
・ルートコンポーネントで作成したスカルプト産ボディを
 「ボディからコンポーネントを作成」で移動したボディ - NG
・ルートコンポーネント以外で作成したスカルプト産ボディ - NG
何でかな? フォームの編集モード時のみ動くようにすれば大丈夫なのかな・・・。

スカルプト産ボディからフューチャーを取得したい1

こちらのサンプルコードを活かしたいともがいています。
TSMファイル1 - C#ATIA

確かにエクスポートが可能なのですが、”どれをエクスポートするのか?” が
全く出来ていないので、何とかしたいです。

スケッチで押し出して作ったボディとスカルプトで作ったボディとの
判断方法を探しています。
f:id:kandennti:20190424185658p:plain
Tree又は画面上のボディを選択し、タイムラインの "フォーム1" を取得すれば
判断出来るのですが、上手くいかないです。

ん~。

TSMファイル5

こちらの続きです。
TSMファイル4 - C#ATIA

まずお詫びです。サンプルコード内に記載していた拡張子が間違っていました。
さすがに恥ずかし過ぎたので修正しました。

前回試した作業スペースIDを調べましたが、こちらも必要ありませんでした。
インポートに成功したコードがこちらです。

#Fusion360 python
import adsk.core, traceback

def run(context):
    try:
        #インポートファイルパス
        path = r'C:\temp\tsm_test.tsm'
        
        #おまじない的な準備
        app = adsk.core.Application.get()
        ui  = app.userInterface

        product = app.activeProduct
        des = adsk.fusion.Design.cast(product)
        root = des.rootComponent
        
        #タイムライン内のformFeatureのコンテナ取得
        forms = root.features.formFeatures
        
        #新たにformFeatureを作る
        fFeat = forms.add()
        
        #tSplineBodyのコンテナを取得
        tBodies = fFeat.tSplineBodies
        
        #formFeatureの編集に入る!!!
        fFeat.startEdit()
        
        #tsmファイルをインポート
        tBody = tBodies.addByTSMFile(path)
        
        #formFeatureの編集から抜ける
        fFeat.finishEdit()
        
        ui.messageBox('done:\n{}'.format(tBody.name))
        
    except:
        if ui:
            ui.messageBox('Failed:\n{}'.format(traceback.format_exc()))

スカルプトの作業スペースをアクティブにするのではなく、FormFeatureを
取得し(今回は新作しましたが、タイムライン上のものを取得しても大丈夫なはず)
編集モードに入った上でインポートすると大丈夫でした。

無理矢理メリットを探し出すとすれば、通常の場合はBrep(サーフェスやソリッド)
状態でしか他ファイルにコピーできないのですが、tsmファイルを利用すれば
スカルプトの状態を他ファイルにコピーすることが可能です。
(コピー後もスカルプトで変更が可能な状態でコピー出来ます)

使い道無いな…。

TSMファイル4

こちらの続きです。
TSMファイル3 - C#ATIA

作業スペースのID名を調べるために、こんな感じのコードを
作ってみました。(って 程のものでもないのですが・・・)

#Fusion360 python
import adsk.core, traceback

def run(context):
    try:
        
        app = adsk.core.Application.get()
        ui  = app.userInterface

        for ws in ui.workspaces:
            print('{}-{}'.format(ws.name,ws.id))
        
        ui.messageBox('done')
        
    except:
        if ui:
            ui.messageBox('Failed:\n{}'.format(traceback.format_exc()))

実行結果はこちら

フォーム-TSplineEnvironment
デザイン-FusionSolidEnvironment
ジェネレーティブデザイン-GenerativeEnvironment
モデルを編集-GenWorkingModelEnv
検討-ExploreEnvironment
サーフェス-FusionSurfaceEnvironment
シート メタル-FusionSheetMetalEnvironment
PCB-PCBEnvironment
メッシュ-MeshEnvironment
レンダリング-FusionRenderEnvironment
アニメーション-Publisher3DEnvironment
シミュレーション-SimulationEnvironment
単純化-WorkingModelEnv
比較-SimCompareEnvironment
製造-CAMEnvironment
デバッグ-DebugEnvironment
モデリング-FusionModelingEnvironment
アセンブリ-FusionAssembleEnvironment
視覚化-FusionVisualizationEnvironment
図面-FusionDocumentationEnvironment
図面ブロック エディタ-FusionDrawingsBlockEditorEnv
モデリング-CAMModelingEnvironment

確かにデバッグがありました。他にも見慣れない作業スペースが
わんさか・・・。

ちっとも進まない。牛歩戦術並み。