C#ATIA

↑タイトル詐欺 主にCATIA V5 の VBA(最近はPMillマクロとFusion360APIが多い)

モーダレスなメッセージボックス

こちらを取り組んでいるのですが、昨日 "上手く動くようになった"
と思い、今日実戦投入したのですが、上手く行かない所もあり・・・。
ファンネル - C#ATIA

何かしら手掛かりが得られないか? 探していたらこちらがHit。
Dimension text location while rerouting command - DASSAULT: CATIA products - Eng-Tips
結果的に何の解決にもならなかったのですが、記載されているコードが
どうやらモーダレスなメッセージボックスのようです。

64bitも利用できるようにし、関数化しました。

Option Explicit

#If VBA7 And Win64 Then
    Declare PtrSafe Function MessageBox Lib "User32.dll" Alias "MessageBoxA" ( _
        ByVal hWnd As Long, _
        ByVal lpText As String, _
        ByVal lpCaption As String, _
        ByVal uType As Long _
    ) As Integer
#Else
    Declare Function MessageBox Lib "User32.dll" Alias "MessageBoxA" ( _
        ByVal hWnd As Long, _
        ByVal lpText As String, _
        ByVal lpCaption As String, _
        ByVal uType As Long _
    ) As Integer
#End If

'WinAPI MessageBox
Private Function MsgBoxApi(ByVal prompt As String, _
                           Optional ByVal buttons As Long = vbOKOnly, _
                           Optional ByVal title As String = " ") As VbMsgBoxResult
    MsgBoxApi = MessageBox(&H0, prompt, title, buttons)
End Function

使う場合は標準モジュールじゃないとダメだと思います。

VBAのMsgBoxと引数の順番が異なっていたので、一緒にしてみました。
・・・VBAの方はもう2個オプション引数が有るのですが、まぁこの3個で
十分だろうと思ってます。
戻り値もVBAのMsgBoxと同じで恐らく大丈夫でしょう。

実際の使い方は

    MsgBoxApi "hoge"
    
    MsgBoxApi "hoge", vbYesNo + vbQuestion

    Dim fuga
    fuga = MsgBoxApi("hoge", vbYesNoCancel + vbExclamation, "piyo")

みたいに通常のMsgBoxと変わらず使えるのですが、これでは用意してまで
使う意味が有りません。

なので、こんなコードにすると通常のMsgBoxとの違いを感じます。

    MsgBoxApi "多分、僕は使わないけどね", vbOKOnly + vbSystemModal, "無責任"

実行するとこんな感じです。
f:id:kandennti:20181030182532p:plain
このダイアログを表示したまま、CATIAの操作が出来ます。
恐らく使うことは無いのですが。

本当は、こんな事を知りたかった訳じゃないのに。

寸法の下側文字

寸法の下側文字を編集したい時が、チョロチョロ出てきました。
f:id:kandennti:20181026192317p:plain

前後はマニピュレータで表示させると便利だと、知り合いの方に
以前教わりました。
f:id:kandennti:20181026192453p:plain

設定に無いって事は、寸法の下側の文字を利用する機会が
少ないって事でしょうか?

そればっかりやるのであれば、Ait + Enter で済ませるのですが
ナカナカそればかりの作業でもないので、マクロを作りました。

'vba Modify_Dimension_LowerText ver0.0.1  using-'KCL0.0.12'  by Kantoku

Option Explicit

Private Enum Dimension_Value
    Main_Value = 1
    Dual_Value = 2
End Enum

Sub CATMain()
    'ドキュメントのチェック
    If Not CanExecute("DrawingDocument") Then Exit Sub
    
    Dim msg1$: msg1 = "下側テキストを修正する寸法を選択 // [Esc]=Cancel"
    Dim msg2$: msg2 = "修正文字を入力して下さい"
    Dim DrwDim As DrawingDimension
    Dim DimVal As Variant 'DrawingDimValue
    Dim Bfr$, Afr$, Upr$, Lwr$
    Dim txt '$
    
    Do
        Set DrwDim = KCL.SelectItem(msg1, "DrawingDimension")
        If DrwDim Is Nothing Then Exit Sub
        
        Set DimVal = DrwDim.GetValue
        Call DimVal.GetBaultText(Dimension_Value.Main_Value, _
                                 Bfr, Afr, Upr, Lwr)
        
        txt = InputBox(msg2, msg2, Lwr)
        
        If StrPtr(txt) = 0 Then Exit Sub
        
        Call DimVal.SetBaultText(Dimension_Value.Main_Value, _
                                Bfr, _
                                Afr, _
                                Upr, txt)
    Loop
    
End Sub

任意の寸法をクリックしたら、インプットBoxが出てきて文字を修正
を連続で出来ます。

あまりInputBoxを使わないので、キャンセルボタンの判断のやり方を
迷いました。
キャンセルボタンは vbnullsting が返って来るものかと思っていたのですが
違うんですね。調べた所こちらがHit
Office TANAKA - Excel VBA Tips[実は奥が深いInputBox]

試したところ・・・ん 違う。Application.InputBoxだからかな?
まぁ何となく、試す前から違うような香りはしていたのですが。

もっと調べるとこちらがHit
InputBox関数でキャンセルされたときの処理-StrPtr関数:エクセルマクロ・Excel VBAの使い方-VBA関数

あまり使わないから覚書です。

ファンネル

累進寸法のファンネルをマクロで変更したいので挑戦中

f:id:kandennti:20181025192341p:plain

寸法補助線が DrawingDimensionクラスのGetDimExtLineプロパティで
取得できる事がわかりました。
r1 DrawingDimExtLine (Object)
ひょっとしたら前回の角度も取得できるかも。

試しにGetFunnelメソッドを使ったのですが、どうしてもエラーになり断念。
ひょっとしたらC#とかだと上手く動くかもしれません。

GetでダメだからSetもダメだろうと思っていたのですが、何故か
SetFunnelメソッドは機能します。
但し、「ファンネル」の横のチェックボックスのONOFFがわからない・・・。

そもそもこんな事、自動でバババって出来るのだから、マクロでやる
必要が無いのですが、全て仕上記号 ▽▽ のせいです。

寸法の角度

久々にCATIAです。 苦戦中です・・・。
f:id:kandennti:20181023180458p:plain
マクロで、赤い矢印付近をSelectElement2でクリックした際
矢印で示した補助線の角度を知りたいのですが・・・探しきれてません。
ご存知の方いらっしゃいませんか?
最悪、寸法値の文字の角度でも構わないのですが、

DrawingDimValue.ValueAngle

では、望んでいる値とは異なりました。
(こちらも探しきれていません)

昔、y4yamaさんが作っ公開していたマクロと同じようなものを
作成しようとしているのですが、確か寸法線ではなく
形状の線だったような・・・。
仕上記号 ▽▽ とか、もう諦めて欲しい・・・・。
(手間ばかりでメリット0)

シェイプ最適化

中途半端な空き時間が出来たので、折角使えるようになった
Fusion360のシェイプ最適化を試してみました。

何処かに参考になるようなサイトが無いものか探したのですが、
"ほら!出来るよ!!" と言う感じのサイトばかりで(今回のうちも例外無く)
細かく説明されているサイトは結局Helpぐらいでした。
Help

ん! この形見たことある!! って以前試したやつと同じもののようです。
ロボットのグリッパアーム - C#ATIA
出所が同じなのでそうなったんでしょう。

結果的にHelpにしたがって進めただけです。大まかに
・シェイプ最適化の準備
 ↓
・解析(シェイプ最適化)実行
 ↓
・結果のプロモート(メッシュ)
 ↓
・形状修正
 ↓
スタディのクローン
 ↓
・解析(静的応力)実行
実際やってみると、前回の形状の詰めの甘さ(前回のはゴツ過ぎる)を感じます。
十分な程のメリットがありそうですね、シェイプ最適化。設計しないからわからないけど。
f:id:kandennti:20181019144600p:plain
安全率2.0切っちゃいました。練習なのでご勘弁。形状を修正後、静的応力で再度確認させる
ところは、案外丁寧なチュートリアルかなぁと感じました。

ところがです・・・、OKと判断した修正後の形状を使おうとすれば、デザイン作業スペースに
戻りたいのですが、戻ると
f:id:kandennti:20181019144614p:plain
あれ? 解析前の形状に戻っちゃうの? そういえば修正した時の作業スペースは
"モデル" じゃ無くて "単純化" だったなぁ。
f:id:kandennti:20181019144623p:plain

ひょっとしたら何処かに記載されているのかも知れませんが、色々と探し回った結果
恐らくエクスポートするしか方法が無さそうな予感です・・・。しかもわかりにくい・・・。

・”シミュレーション” 時の "ファイル" - "エクスポート" で.f3d
 → これは全く同じものをエクスポートなのでNG
f:id:kandennti:20181019144631p:plain
念の為、社内にも一人いるのですが、"シミュ" レーションが一般的です。
"趣味" レーションじゃないです。 昔は "しゅみれーしょん" を変換しても
絶対にカタカナにならなかったんですけど、最近は変換されちゃいますね。

・”単純化” 時の "ファイル" - "エクスポート" で.f3d
 → これも全く同じものをエクスポートなのでNG
f:id:kandennti:20181019144640p:plain

・”単純化” 時の ルートコンポーネントコンテキストメニュー
  - "エクスポート" で.f3d
 → ”単純化” で作業した状態がデザインになっているのでOK
f:id:kandennti:20181019144646p:plain

修正した分の履歴も残っています。
f:id:kandennti:20181019144653p:plain
・・・修正する前の履歴は捨てちゃうことになっちゃいますね。


CAMのデータを保持してエクスポートする際は、"ファイル" - "エクスポート"
しなきゃならないので、ルートコンポーネントからのエクスポートは
普段使わないんですよ。 恐らくこの方法しか無いんじゃないかな?

IFCフォーマット

Fusion360のフォーラムで、何度か変換に関して見かけたIFCフォーマット。
Industry Foundation Classes - Wikipedia

自分には縁のない建築っぽい業界?のBIM関係の3Dデータの中間フォーマット
のようです。
BIMナビ/BIMを知る、始める、活用する。BIMの情報サイト | CAD Japan.com

聞いた話では、建築関係はまだまだ2D主流で3Dへの対応は遅れ気味とか。


対応するソフトも少なくは無いようですが、無料となるとビュアーぐらいで、
コンバータは結果的に "IfcOpenShell" 一択となるようです。
IfcOpenShell
GitHub - IfcOpenShell/IfcOpenShell: Open source IFC library and geometry engine

日本語の情報が無いです・・・。
幾つかソフトが有りますが、個人的に試せそうなのが IfcConvert ぐらいなので
こちらのVer0.5.0 のWin64bitを試してみました。
IfcOpenShell

サンプルデータとしてはこちらをお借りしました。
3D CAD Model Collection | GrabCAD Community Library

"IfcConvert.exe" にIFCファイルをD&Dしても実行されるのですが、
変換後はOBJになってしまう為、コマンドプロンプト起動して
行いました。(もし頻繁に必要ならバッチファイルを作成した方が良いと思います)

実際にIges,Step,OBJを試しましたが、Igesは変換後のファイルがエラーとなり
CATIAでもFusion360でもインポート出来ませんでした。
IFCはStepに近いフォーマットのようなので、Stepが一番良いのかも知れません。

f:id:kandennti:20181019110053p:plain
左がStepで、右がOBJ。
Stepは部品毎にコンポーネント+ボディとなり、
OBJは部品毎にメッシュボディとしてインポートされました。

当然、逆(MCAD→IFC)は出来ないの? と思うのですが、出来ないっぽいです。
理由がはっきりしないのですが、こちらをチラッと読んだ感じですが
BIMアプリケーションの使いこなし 第3回:IFC を使ってデータ互換(前編) / 全5回|大塚商会
BIMアプリケーションの使いこなし 第4回:IFC を使ってデータ互換(後編) / 全5回|大塚商会
IFCの場合、データは単なる形状としてでは無く、柱・梁・壁・床等の属性がある様で
その辺が絡んでいて、安易にMCADデータからの変換を許さないようにも感じました。
(・・・MCADだって要素の重複は許しちゃだめですよ)

比較的最近の規格でも無いようなのですが、メジャーなフォーマットなものかどうかも
良くわからなかったです・・・。(需要は結構あるようには感じました)

3Dな線のエクスポート2

こちらの続きです。
3Dな線のエクスポート1 - C#ATIA

こちらにUpしましたが、、、
Re: 3Dな線を3DCAD中間ファイルでエクスポートする - Autodesk Community
結局大して修正しませんでした。
・自己交差している要素がある場合でもエラー回避
・日本語設定以外の時には英語で表記
ぐらいです、確か。

インポートのマクロは楕円が抜け落ちる事を確認しているのですが、
修正する元気が出ません。