C#ATIA

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

2D属性リンクを扱いたい3

大した進展も無いまま、こちらの続きです。(忘れそうなので)
2D属性リンクを扱いたい2 - C#ATIA

こちらのC#で作ったやつ、正常に動きませんでした・・・。
3D CAD Model Collection | GrabCAD Community Library
何でだろう、と思ったのでVS立ち上げて実行したら動きました。
f:id:kandennti:20190219194451p:plain
Attributeも、ちゃんと取得出来てます。

とりあえずビルドしたらexeファイルでも動いたので、少し安心しました。
VS立ち上がる際、何かUpdateしていたのでその辺が原因だったのかも。

但し、VBAと絡めて実行する際ちょっとばかり使い勝手が悪いので
何か対策を取らないと。
3年前なのでVBAのコードもイマイチで、その分自分が成長したんだろう
と思っておきたい。

2D属性リンクを扱いたい2

こちらの続きです。
2D属性リンクを扱いたい1 - C#ATIA

属性リンクを使ったことが無い為、イロイロと確認です。

3DでXY平面状に点を作成し、2Dでテキストを作成。
属性リンクをH→X、V→Yとして作ります。
f:id:kandennti:20190219130051p:plain
属性リンクパネルの「現行の選択」は多分、インターナルネームかな?
恐らく、式で利用できるパラメータ類が使えるのだろうと思います。

3D側で数値を変え、2D側を強制更新すると反映されます。
f:id:kandennti:20190219130120p:plain
リンクしているにも関わらず、ビューのアイコンはリンクしていない
ものでも出来るので、軽く罠のような雰囲気です。
強制更新に関してはこちらが役に立ちそうです。
任意のビューのみを強制更新 - C#ATIA

編集-リンク であればリンクしていることが確認出来ますね。
f:id:kandennti:20190219130142p:plain

ここで疑問だったのが、参照しているものが削除された場合は
どうなるの? か。
f:id:kandennti:20190219130157p:plain
知らん顔してテキストはそのままなんですね。
何らかの確認方法を確立しなければならない雰囲気がヒシヒシと。
(属性リンク使わなきゃいいのに・・・)

属性リンクを作るのは、InsertVariableメソッド出来そうだな
とは感じているのですが、リンクを削除する方法が良くわからないです。
直接textプロパティを書き換えてしまう為、こんな手抜きなものを
実行します。

Sub CATMain()

    Dim dDoc As DrawingDocument
    Set dDoc = CATIA.ActiveDocument
    
    Dim txt As DrawingText
    Set txt = dDoc.Sheets.ActiveSheet.views.ActiveView.Texts.Item(1)
    
    txt.Text = "hoge"

End Sub

実行だけしてみると
f:id:kandennti:20190219130215p:plain
おーまた知らん顔してる。リンクしている要素無いのにリンクしてます
って出ちゃうんだ。属性リンクは同期しないんだなぁ。
強制更新してもダメでした。

ダブルクリック等でテキストエディターを立ち上げ終了すると
f:id:kandennti:20190219130228p:plain
無事リンクが無くなってます。

便利以上に、リスクの方が大きいように感じるんだけどなぁ。

Fusion360ユーザーカード

Fusion360ユーザーカード、僕もやりました。
写真のUpが上手く行かなかったのですが。
Fusion 360 User Card

Twitterで ”もうお一方いらっしゃいますが秘密"
って流されている Fusion 360 Expert Elite は僕です。

f:id:kandennti:20190218234244p:plain

控えめの入力の結果ですが、背伸びしても変わらな
そうなので…。

そのうち、クビになるかも知れないなぁ。

2D属性リンクを扱いたい1

3Dのパラメータ等の値を、2Dテキストにリンクさせた状態を作る方法を
薄々は知っていたのですが、「僕には関係ない」と思い調べずにいたのですが
使用する必要性が出てきた(逃げられそうに無い)ので、重い腰を上げる事に
しました。

Helpで調べたり、頂いた資料を眺めたり、知人に相談したり、サポートに
問い合わせてみたり・・・。使い方は直ぐにわかったのですが、量が多いため
劇的にメンドクサイ。

調べてみるとマクロでも作成出来そうなことはわかりました。
あまり良いサンプルが見つからなかったのですが、
こちらでチラッと出てくる、InsertVariableメソッドがそのようです。
Macro To Add Additional Sheets to a Drawing - DASSAULT: CATIA products - Eng-Tips

これですね。
r1 DrawingText (Object)


困るのが、何処を参照しているのか? の確認方法です。
あのメソッド名からしても、戻り値で参照先を
得られそうに無いです。
他のプロパティ・メソッドでも得られそうな気がしないのですが、
どうでしょうか?

属性リンクを作ったその時は、まだ不安も無いのですが、
時間が経てば正しい参照先なのかどうか? の不安が残りませんか?

唯一確認出来そうな方法が、編集-リンクで表示されるダイアログ
のような気がするので、こちらを利用すれば可能なのかと
感じております。
3D CAD Model Collection | GrabCAD Community Library
ファイル間リンクの取得6 - C#ATIA
ファイル間リンクの取得7 - C#ATIA

届くかな?

断面図から断面を切った位置の座標値を取得

こちらでコメント頂いた
「断面図から断面を切った位置の座標値を取得」
についてです。
図面の断面のネーミング - C#ATIA


結論から書くと、取得出来そうに有りませんでした。
念のためこんな感じのコードは作りました。

'vba using-'KCL0.0.12'  by Kantoku
'断面図から断面元のビューと断面数の取得

Sub CATMain()
    'ドキュメントのチェック
    If Not CanExecute("DrawingDocument") Then Exit Sub
    
    '断面図選択
    Dim msg As String
    msg = "DrawViewを選択して下さい : ESCキー 終了"
    
    Dim secvi As DrawingView
    Set secvi = SelViewSection(msg)
    If secvi Is Nothing Then Exit Sub
    
    '断面元取得
    Dim refvi As DrawingView
    Set refvi = secvi.ReferenceView
    If refvi Is Nothing Then
        MsgBox "断面図の元のビューが取得出来ませんでした"
        Exit Sub
    End If
    
    '断面数取得
    Dim seccnt As Long
    seccnt = GetSectCount(refvi)
    
    msg = "選択ビュー:" & secvi.name & vbCrLf & _
          "断面元ビュー:" & refvi.name & vbCrLf & _
          "断面元の断面数:" & seccnt
    MsgBox msg
    
End Sub

Private Function GetSectCount( _
    vi As DrawingView) As Long
    
    CATIA.HSOSynchronized = False
    
    Dim sel As selection
    Set sel = CATIA.ActiveDocument.selection
    
    With sel
        .Clear
        .Add vi
        .Search "(CATDrwSearch.DrwCallout),sel"
        GetSectCount = .Count2
        .Clear
    End With
    
    CATIA.HSOSynchronized = True
    
End Function

Private Function SelViewSection( _
    ByVal msg) As DrawingView
    
    Set SelViewSection = Nothing
    Dim vi As DrawingView
    
Continue:
    Set vi = SelectItem(msg, "DrawingView")
    If vi Is Nothing Then Exit Function
    
    If vi.ViewType = catViewSection Then
        Set SelViewSection = vi
        Exit Function
    End If
    
    MsgBox "断面のビューを選択してください"
    GoTo Continue
End Function

断面元のビューの特定は可能ですが、断面のライン自体が取得出来ませんでした。
(Arrowは、本当に矢印の要素でした)

可能な事は、上記で示したとおり検索でヒットさせる方法ですが
ここからオブジェクトを取得しても、DrawingViewとなってしまい
実質マクロで扱うのは不可能だと判断しました。

「どうしても」となれば、3Dとのリンクを分断することで断面の線が
単なる線となる為、これを何かしらの方法で座標値を見つける事が
出来るかも知れませんが、リンクを切るのはリスクの方が大きいようにも
感じます。(マクロでUndoを行えば、戻るのは確かですが・・・)

安全を考慮してビュー自体を何処かにコピペして、分断出来れば
良いのですが、ビューのコピペでは断面の線はコピー出来ないようなので
お手上げです。

曲線の始点終点どっちが近いのかな?判断

これ、誰も答えないのでマクロを作ろうかな? と思っているのですが
Catia VBA startpoint, endpoint - DASSAULT: CATIA products - Eng-Tips
思ったより手強い。

スプラインだけじゃなく、直線・円弧にも対応させて、
閉じているかどうかもチェックしたいのですが、時間が無いです。

直線:FirstUptoElemとSecondUptoElemでリファレンス取得し距離測定

円弧:中心と半径と始点ベクトルと終点ベクトル使ってかな?
   始点終点のリファレンスは取れないのかな?
r1 HybridShapeCircle (Object)

スプライン:GetNbControlPointでポイント数取得して
      GetPointで最初と最後のリファレンス取得し距離測定かな?
r1 HybridShapeSpline (Object)


一時的に曲線上に点を作成して、距離測定したほうが手っ取り早いのに・・・。
HybridShapeFactory内だけで処理すれば、ゴミ残らないんだけどなぁ。

Home3Ddo

Fusion360でエキスパートエリートの小原さんのブログですが
← リンクを追加しました。

内容はFusion360だけではないのですが、Fusion360の記載が充実しています。
Fusion360 勉強部屋」は機能毎にまとめられており、うちとは大違いで
目的の内容を探しやすいです。

一方、リバースエンジニアリングなヤツは一向に進展せず。
しかもちっともザックリでない雰囲気に・・・。