C#ATIA

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

TSMファイル3

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

作業スペース切り替え方法が、こちらに記載されていました。
Solved: Re: Change workspace - Autodesk Community
itemByIdメソッドと作業スペースID名でWorkSpaceを取得し、アクティブに
すれば良いようです。

作業スペースのID名については、こちらに少し記載されています。
(真ん中ぐらいに記載有り)
Fusion 360 のメニューカスタマイズ ~ Workspace - Technology Perspective from Japan
記事が古いので、ちゃんと調べ直す必要が有りそうな予感はしてますが、
この辺は変わらないような気もしてます。

Debug WorkspaceとかDocumentation Workspaceとか見たことの無い
作業スペースも記載されています。何だろう?


で、時間が無くて試せていません。

TSMファイル2

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

コメントに思い付きを書いたので修正してみました。

#Fusion Python 
#TSM Import Test
import adsk.core, adsk.fusion, 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

        forms = root.features.formFeatures
        #fFeat = forms.item(0)
        fFeat = forms.add() #ここ
        
        tBodies = fFeat.tSplineBodies

        tBody = tBodies.addByTSMFile(path)
        
        ui.messageBox('done:\n{}'.format(tBody.name))
        
    except:
        if ui:
            ui.messageBox('Failed:\n{}'.format(traceback.format_exc())) 

一行だけ変えました。 結果は…同じエラーです。

ん~addByTSMFileメソッドの瞬間は、フォーム作業スペースに入らなきゃ
いけない予感が…。
出来るっぽいのですが、調べきれませんでした。宿題だな。

TSMファイル1

こちらにチラッと記載したので、簡単なテストをしてみました。
解決済み: Re: tsmファイルのデータ形式について - Autodesk Community

TSMファイルはFusion360のスカルプトのフォーマットの様です。
サーフェス・ソリッドになったものはBrepになるのかな?)

HelpによるとACIS(SAT)に似たフォーマットの様です。
確かに歴史的背景から、そうなるのだろうと思います。
ShapeManager - C#ATIA



まず、スカルプトでボディを1個以上作成し「フォームを終了」でデザインに
戻ります。(戻らずスプリクトを実行するとエラーになります)
この状態で以下のスプリクトを実行すると、無事TSMファイルがエクスポート
出来ました。

#Fusion Python 
#TSM Export Test
import adsk.core, adsk.fusion, 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

        forms = root.features.formFeatures
        fFeat = forms.item(0)
        
        tBodies = fFeat.tSplineBodies
        tBody = tBodies.item(0)
        
        tBody.saveAsTSMFile(path)
        
        ui.messageBox('done:\n{}'.format(tBody.name))
        
    except:
        if ui:
            ui.messageBox('Failed:\n{}'.format(traceback.format_exc()))

このコードでは、恐らくエクスポート出来るのは最初のスカルプトのボディ
1個だけです。


続いてインポートを試してみたのですが、上手く行きません。
取りあえず作成したのは以下のコードです。

#Fusion Python 
#TSM Import Test
import adsk.core, adsk.fusion, 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

        forms = root.features.formFeatures
        fFeat = forms.item(0)
        
        tBodies = fFeat.tSplineBodies

        tBody = tBodies.addByTSMFile(path)
        
        ui.messageBox('done:\n{}'.format(tBody.name))
        
    except:
        if ui:
            ui.messageBox('Failed:\n{}'.format(traceback.format_exc()))

何故? 間違っている気がしないのですが…。

DraftSight無償版2

まさか、続きを書くとは思わなかったのですが、こちらの続きです。
DraftSight無償版 - C#ATIA

正直に書くと、こちらに触発されたのが本音です。

DraftSight の無料版が使えなくなったあと、有料版に移行するのか、他の無料で利用できる2D-CADに移行するのかそこが問題だ! - ドローイング空間

もっと正直に書くと、お酒の力も影響してます…。


何時からか覚えていないのですが、CAD関連のFreeソフトは常に探すようになりました。
全てを試すわけでも無いのですが。

個人的に一番インパクトが強かったのが、"Alibre Design" です。
Alibre Design - Wikipedia

当時、Freeの3DCAD自体が非常に少なく、僕自身Space-e(非パラメトリック
しか使った事が無かった為、パラメトリックな3DCADがFreeで登場した事に
非常に驚きました。 しかもSpace-eと同じACISカーネル

規模の小さい企業で3DCADを導入していなかった所では、主力CADとして
利用し始めていたかも知れません。

しかし、1・2年程度で無償版が無くなってしまった為、過去にバックアップして
いたデータがネイティブなファイルしか無く、バックアップを中間フォーマットに
変換するだけを目的に、有償版導入せざるを得ない と言う企業も
あったのではないか? とすら思ってます。
(僕の場合は少しテストしただけでした)


この時に強く感じたのは "Freeソフトは業務の主力ソフトには出来ない"
と言う事です。 ”そんなの当たり前じゃん” と思われるかも知れませんが
ついついお手軽で強力なFreeソフトの場合、頼ってしまいます。


もう一つは "Rapidform XOM" です。こちらは本来の目的とは異なり、
変換ソフトとして利用していました。
ラピッドフォーム・ジャパン、無償の3Dスキャンデータ処理ソフトウェア「Rapidform XOM」をリリース|ラピッドフォーム・ジャパン株式会社のプレスリリース
残念ながら、こちらは無くなってしまいました。

駄目だ、睡魔が限界・・・。

スケッチのスピードテスト2

こちらの続きです。
スケッチのスピードテスト - C#ATIA

先日のUpdateで、以前の最後の方に記載した
「”点の表示” をOFFにすることで速度向上することがわかっておりAPIで操作出来ないか?」
が実装されました。 それのテストです。

今回は自宅の非力なPCでのテストの為、前回の速度と一概には比較できない為
test1と2を再テスト。

test1-time:19.54s
test1-time:20.17s
test1-time:20.33s
test1-time:21.97s
test1-time:20.73s

test2-time:1.59s
test2-time:1.55s
test2-time:1.48s
test2-time:1.43s
test2-time:1.41s

性能的に半分以下です・・・。


点の表示OFFは、arePointsShownプロパティです。

#test7 arePointsShown
def test7(root,lst):
    skt = root.sketches.add(root.xYConstructionPlane)
    skt.arePointsShown = False
    
    [initBox(skt,a1,a2) for (a1,a2) in lst]
       
    skt.arePointsShown = True

    f = inspect.currentframe()
    return inspect.getframeinfo(f)[2]

結果はこちら。

test7-time:20.49s
test7-time:18.14s
test7-time:17.78s
test7-time:18.03s
test7-time:18.97s

全然ダメじゃないか! と思ったのですが、よく考えたら
スケッチの点を全く作成しなかった為、効果があるわけありませんね。


APIのHelpがまた落ちている。あれしか頼れるもの無いから
勘弁して欲しい。

岡野工業

何冊か本を読んで知っていた会社なのですが、
少し前に知りました。残念です。
「さようなら!私たちは御社を忘れない」惜しい廃業3選 - M&A online
廃業したんですね。廃業してもお金に困ることは無いのだろうけど・・・。
恐らく困るのは関係していた企業さんたちでしょう。アマダさんとか。

検索すると大量にHitしますが、この辺が詳しいかな?
ぼくの尊敬する技術者、『世界一の職人』岡野工業の代表社員、岡野雅行氏をご紹介します。 : こだまんの人生研究所

本で読んだ記憶だと、娘婿さんが居たはずなのだが・・・と思っていたら
最初の動画にも出てきていましたが、年齢的にリタイヤされているのかも・・・。

こちらも面白いです。
匠の息吹を伝える~“絶対”なき技術の伝承~ (18)最先端を追求する秘伝~金型・深絞りプレス加工~ |サイエンス チャンネル

兎に角残念。

ディテールシートの未使用のビューを削除

図面を作成する際、面倒なので新規のDrawファイルからでは無くて
他のファイルを流用して作りますよね?(・・・違うかな)
最大の理由はカタログから呼び出した際、分離してディテールシートに
残しているのですが、再度同じものをカタログから呼び出すのが面倒だからです。

差し替えが上手くいけば問題無いですし、UUID違いもこちらのマクロで
それなりの事が出来るようになりました。
異なるUUIDのDraw参照元ファイルを差し替える3 - C#ATIA
(知り合いの方から、新規に作成した方が早いんじゃない? と
アドバイスを頂きました。 ・・・確かにそうです。)

ビューの原点も(イロイロ問題は有りますが)こちらで変更できるようになりました。
Drawビューの原点を変更する1 - C#ATIA

こんな感じで流用していると、つまらない意地と言いますか、見栄と言いますか
ディテールシートに未使用のビューが幾つか残ったりするのですが、嫌なんです。
使用している物を削除しようとすると警告してくれるので、手動でも出来ない
ことは無いのですが、、、面倒なんです。

そこでDrawファイル内で、2Dコンポーネントとして使用されていない
ディテールシートのビューを削除するマクロを作成しました。

'vba DetailSheetCleaner_ver0.0.1  using-'KCL0.0.13'  by Kantoku
Option Explicit

Sub CATMain()
    
    Dim msg As String
    
    'ドキュメントのチェック
    If Not CanExecute(Array("DrawingDocument")) Then Exit Sub
    
    Dim doc As DrawingDocument
    Set doc = CATIA.ActiveDocument
    
    'ディテールシート
    Dim dets As Collection
    Set dets = GetDetailSheet(doc)
    If dets.Count < 1 Then
        MsgBox "ディテールシートが有りません!"
        Exit Sub
    End If
    
    '全コンポーネント 空の可能性も有り
    Dim cmps As Collection
    Set cmps = GetComps(doc.Sheets)
    
    'ディテールシートビュー辞書
    Dim compDic As Object
    Set compDic = InitDetailDic(dets)
    
    '未使用ディテールシートビュー
    Dim UnuseComps As Collection
    Set UnuseComps = GetUnuseCompsList(compDic, cmps)
    If UnuseComps.Count < 1 Then
        MsgBox "削除対象のビューが有りません!"
        Exit Sub
    End If
    
    '確認
    msg = UnuseComps.Count & _
        "個の未使用ディテールシートのビューが有ります。" & vbCrLf & _
        "全て削除しますか?"

    If MsgBox(msg, vbQuestion + vbYesNo) = vbNo Then
        Exit Sub
    End If
    
    '削除
    Call RemoveComps(UnuseComps)
    
    MsgBox "Done"
End Sub

Private Sub RemoveComps( _
    ByVal lst As Collection)
    
    Dim sel As selection
    Set sel = CATIA.ActiveDocument.selection
    
    CATIA.HSOSynchronized = False
    
    Dim vi As DrawingView
    
    With sel
        .Clear
        For Each vi In lst
            .Add vi
        Next
        .Delete
    End With
    
    CATIA.HSOSynchronized = True
    
End Sub

Private Function GetComps( _
    ByVal shts As DrawingSheets) As Collection
    
    Dim cmps As Collection
    Set cmps = New Collection
    
    Dim st As DrawingSheet
    Dim vi As DrawingView
    Dim i As Long
    For Each st In shts
        For Each vi In st.views
            For i = 1 To vi.Components.Count
                cmps.Add vi.Components.Item(i)
            Next
        Next
    Next
    
    Set GetComps = cmps
    
End Function

Private Function GetUnuseCompsList( _
    ByVal compDic As Object, ByVal cmps As Collection) _
    As Collection
        
    Dim cmp As DrawingComponent
    Dim key As String
    For Each cmp In cmps
        key = GetKeyString(cmp.CompRef)
        If compDic.Exists(key) Then
            compDic(key) = Array(True, compDic(key)(1))
        End If
    Next
    
    Dim lst As Collection
    Set lst = New Collection
    
    Dim ary As Variant
    For Each ary In compDic.Items
        If ary(0) = False Then
            lst.Add ary(1)
        End If
    Next
    
    Set GetUnuseCompsList = lst
    
End Function

Private Function GetKeyString( _
    ByVal vi As DrawingView) As String
    
    GetKeyString = vi.Parent.Parent.Name & "@" & _
        KCL.GetInternalName(vi)
End Function

Private Function InitDetailDic( _
    ByVal dets As Collection) As Object
    
    Dim dic As Object
    Set dic = KCL.InitDic()
    
    Dim st As DrawingSheet
    Dim i As Long
    Dim vi As DrawingView
    For Each st In dets
        For i = 3 To st.views.Count
            Set vi = st.views.Item(i)
            dic.Add GetKeyString(vi), Array(False, vi)
        Next
    Next
    
    Set InitDetailDic = dic
    
End Function

Private Function GetDetailSheet( _
    ByVal doc As DrawingDocument) As Collection
    
    Dim dets As Collection
    Set dets = New Collection
    
    Dim st As DrawingSheet
    For Each st In doc.Sheets
        If st.IsDetail Then
            dets.Add st
        End If
    Next
    
    Set GetDetailSheet = dets
    
End Function

言葉だけではわかりにくいので、こんな感じです。

ディテールシートに「maru」と「shikaku」を作成します。
f:id:kandennti:20190410172837p:plain
えぇネーミングセンス0です。

シートで「maru」だけインスタンスを作成して貼り付けます。
f:id:kandennti:20190410172850p:plain

この状態でマクロを実行すると
f:id:kandennti:20190410172901p:plain
「shikaku」は未使用なので削除します。