C#ATIA

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

2017年を振り返る

今年もイロイロと他人には役立たない事を書きました。

PowerMillはこれが一番ヒットでした。
"group" フォルダは犠牲にした、プルダウンリストライブラリ - C#ATIA
機能が多く、まだまだ使いこなせずマクロより
手動操作を覚えている段階。 来年はもっと楽をしたいところ。


加工については、こちらは放置したまま
Cube in a Cube 1(予告) - C#ATIA
現場に材料と治具と工具が転がったままなのですが、
モチベーションが上がらない。


CATIAではこれが役に立ってます。
手抜きマクロ起動用メニュー1 - C#ATIA
確実に楽になりました。
こちらは来年の宿題。
樹木曲線も作りたかったのに - C#ATIA
本当はドラゴン曲線まで行きたい。
これも自己満足ですが、きちっと説明しているサイトが
無かったので満足です。
スパインの理解 - C#ATIA


C#を再度やるとは思っていなかったのですが
こちらも宿題。
バインディングに苦しむ - C#ATIA
3年越しぐらいなんですが、まとまった時間が確保できないと
取り組みにくい。


Fusion360は、sirenを利用してこちらを作りました。
Re: 3DCAD中間ファイルの3Dな点・曲線をインポートするスプリクト - Autodesk Community
エクスポートはモチベーションが上がらない。
フォーラムの方では、使っていないくせにポストコンフィグをイロイロ
と修正してみました。
C++はわからないのですが、こちらは少し興味があるので
Pythonの宿題にしています。
C++でのEdgeの選択方法について - Autodesk Community


来年は他人に役立つものを作りたい。良いお年を。

差分を抽出をもう少し掘り下げたい

こちらのsauvignon1962さんからコメント頂いた件ですが、
折角なので画像も有った方がわかりやすいかな? と思い記載します。
二つのボディ/形状セットを比較して、差分を抽出する2 - C#ATIA

CATIAでまともな図面を描くことが無いのですが、
僕の場合であれば、ほぼ対称形状の図面を描く場合は
こんな感じにしています。

f:id:kandennti:20171226123015p:plain

注記に「指示なきB部品寸法は、A部品と対称形状とする」のような
表記で付け加えておきます。
(これが一般的な方法かどうかは知りません・・・)

sauvignon1962さんの文面からして恐らく、こんな感じの
図面を作成したいのだろうと思います。

f:id:kandennti:20171226123028p:plain

あちらの差分を抽出するマクロの一番の問題点は、本来
変更されたと判断されたくない面も抽出してしまう事だとは
当時も認識していました。
実際に実行してみるとこのような結果になります。

f:id:kandennti:20171226123041p:plain

原因は単純で、一致すると判断するアルゴリズム
面の重心位置と表面積な為なんです。

本来 「欲しい」と思う面は、抽出した面のもう一つ内側の
なるのが自然だろうとは感じており、せめて
こんな風に一致しないエッジ部分も抽出できたら良いだろうな
とは感じていました。

f:id:kandennti:20171226123141p:plain

結局は、処理が難しそうなので取り組まずに終わらせて
しまっています。

一本のスケッチラインで押し出す

Fusion360を練習していてちょっと感じたのですが、
こんな感じで離れたボディ同士にフィレット付けたい時
ありませんかね?
f:id:kandennti:20171222170918p:plain
カバーみたいな製品で、円柱部分は部品取り付けボルトの為の
ボス形状を付けたい時とか。

CATIAの場合、2面を指定する [フェースフェースフィレット] コマンドが有るの
ですが、離れたものの場合こんなエラーが出ますよね?
f:id:kandennti:20171222170930p:plain
エラーの意味もわかりにくい…。

知られた手法だと思うのですが、こんな感じのスケッチを描いて
f:id:kandennti:20171222170941p:plain

パッドの厚みを指定しつつ、くっ付けた状態にすると
f:id:kandennti:20171222170950p:plain

フィレットが作れるんですよね。
f:id:kandennti:20171222171002p:plain

サーフェス育ちの人間としては、CATIA固有の問題かな?
と思っていたのですが、考えたらフィレット付いた逆側の部分を
どんな処理すれば良いのか? ソフトには決められないんでしょうね。
f:id:kandennti:20171222171017p:plain
(GSDのシェイプフィレットだと、一度に両側出来るじゃないか…)


で、Fusion360も同じなのですが、2点程問題が。
・離れた状態では、一つのボディとしては扱えない
・2面指定のフィレットコマンドが無い
結果的には、CATIA同様くっ付けてエッジフィレットしか
方法が無さそうなのですが、ここでもう一つ問題が。

[押し出し]コマンドには厚みを指定する方法が無いんです。
その為、こんないい加減な線1本のスケッチを作って
押し出してくっ付ける事が出来ないんです。
f:id:kandennti:20171222171031p:plain
もちろん、長方形を描くコマンドでやれば良いだけなのですが
そもそも消えてしまう形状なので、面倒なんです。

そこで思い付いたのが、シートメタルを使う方法です。
[フランジ] コマンドであれば、線一本でも大丈夫なんです。
f:id:kandennti:20171222171047p:plain
押し出した厚みは、シートメタルのルールに基づくんですけど。

後は[結合]で一つのボディにし
f:id:kandennti:20171222171057p:plain

[フィレット] を複数回やれば完成です。
f:id:kandennti:20171222171112p:plain

モデルで作成したボディとシートメタルで作成したボディが
結合できるのはちょっと不思議な感じがしたのですが、
そんなものなのでしょうか?

これであれば、センターラインだけでリブを作成出来るから
楽だと思いますね。(図面では、リブ位置を端面で指定しないで欲しい)

「最初からその形状でスケッチ作れば良いじゃん」って思われますが
金型等で抜き勾配を設置すると、一定Rサイズの面ではなくなる為
フィレットのコマンドで作りたいんです!凹形状の場合、加工しにくいんです!

3Dなテキスト

文字のモデリングは、それなりに需要があると思うのですが
CATIAには標準な機能としては無いですね。
お手軽なDraw利用する方法だったり、サードパーティ製品も有ったりマクロが有ったり。

僕も過去に挑戦しましたが、辞めました。能力が足りないです。
使った事は無いのですが、恐らく考えていたものがこちらのリンク先に
有りそうなのです。
ユーザーサイドのCATIA 関連サイト4 - C#ATIA

Fusion360だとスケッチの標準機能としてあるんですよね。
こんなのが簡単に作れちゃいますね。
f:id:kandennti:20171220185014p:plain
そういえばSpace-eにも文字のモデリング機能は有ったような…。
無いのはCATIAぐらいなのかも。

少し前に知ったのですが、曲面でも文字のモデリングが出来るんですね。
今年になって追加されたシートメタルの機能を利用すると
こんな感じのものも作れちゃいます。
f:id:kandennti:20171220185519p:plain

↓ ビュアー上手く表示出来るかな?

すごいなぁ、使わないけど。

ネタ元はこちらの中段辺りです。
実質無料の3DCAD「Autodesk Fusion360」がもっと楽しく知っていると便利な裏技・裏情報トピック【パート2新着情報】 - 3Dモデリングによる3Dデータの活用法とデジタル・ファブリケーションの実践!

短時間でクリスマスツリー

以前、海外の方が一人でCATIAのTips動画を100本ぐらいUpされていました。
内容的には幾つか知らない操作があった程度だったのですが、
CADのサイズを小さくしての録画だった為、何のコマンドを使用しているのか?
と思った際、アイコンが見えていたので非常にわかりやすかったのですが、
残念な事に現在は一本も残っておりません。

Tipsとは別に短時間でクリスマスツリーを作る動画も有ったのですが、
最初はどの様に行うのか想像出来ませんでしたが、見て非常に感心したのを
覚えています。

と言うことで、真似てみました。

案外、クリスマスツリーに見えるんですよ。
但しFusion360では、この方法出来ないんですよね。

スパインの理解

先日、思うところがあったため折角の機会だと思い・・・。

"スパイン" について説明がされているサイトを見かけないので、
僕なりの理解を記載しておきます。
(違うよ ってご意見等有りましたらよろしくお願いします)


実際に検索してみると
CATIA やUGNX などの三次元CADに関する質問です。ボディにフィ... - Yahoo!知恵袋
あまりに抽象的過ぎて質問者に伝わっていない気がしてます。

"Unofficial CATIA User Forum" では、ここなさんが
「スパインは画面上では線として表現されているけど、実際は平面の羅列です」
と言った表現をされていました。
個人的にはこの表現で、おぼろげだった理解がすっきりとしました。

簡単な例を。

XY平面・ZX平面にそれぞれスケッチを作成しスプラインを描きます。
この2本の線を合成コマンドで3D的な自由曲線を作成します。
f:id:kandennti:20171211142045p:plain

この曲線上に点を作成します。
f:id:kandennti:20171211142053p:plain

曲線と点を元にすると、接線を作成する事が出来ます。
f:id:kandennti:20171211142104p:plain
どんな曲線であっても、線上の点を指定すれば接戦を描くことは
可能です。(数学的には微分です)

この接線を方向ベクトルと捉え点を指定することで平面が
作成出来ます。
f:id:kandennti:20171211142113p:plain
・・・別に接線を作成しなくても、同一の平面は作成可能なのですが
接線が平面の向きになることをお伝えしたかった為です。

つまり、どんな曲線であっても曲線上の点は接線ベクトルを持ち
平面が作成可能だということになります。

GSDにはこんなコマンドがあるので、イメージとしてはこんな感じです。
f:id:kandennti:20171211142124p:plain
「線に見えるけど、平面の羅列」とはこんな事を意味していると
解釈しました。


では、実際のモデリングでは何を意味するのでしょうか?

XY平面に四角を描いた上、2つの面に45度の勾配を付けます。
f:id:kandennti:20171211142137p:plain

この2つの45度面が交差するエッジ部分にエッジフィレットを付けてみます。
(仮にサイズ10mmです)
f:id:kandennti:20171211142152p:plain
まぁフィレット面が出来るだけなのですが、ここでフィレットを作成した際に
指定したRのサイズが何処に存在するのでしょうか?

一見、端部の形状が指定したRサイズになっているようにも感じますが、
実際に測定すると違う事がわかります。
f:id:kandennti:20171211142200p:plain
では何処に? ここでスパインが登場します。

履歴を戻り、フィレット作成した時に指定したエッジを使用しエッジに直交する
平面を作成します。
f:id:kandennti:20171211142227p:plain
最初に説明したように、どんな曲線(今回は直線)であっても、
平面の作成が可能ですね。

履歴を進み、先程の平面で分割。 切り口となったフィレット面の
端部を測定すると、指定したRサイズが見つかりました。
f:id:kandennti:20171211142236p:plain
つまりエッジフィレットは
”指定したエッジをスパインとするR曲面を作成する”
コマンドだったわけです。全ての3DCADを調べることは現実的では
無いのですが、恐らく全ての3DCADでは同じ事だと思っています。
実際はスパインを指定するわけでは無いのですが、自動的に
設定されているのだろうと思います。

逆にフィレットの端部を指定したRサイズとしたい場合は、
除変フィレットとし円形フィレットのスパインをZ軸とすれば
(エッジフィレットではスパインの指定が出来ません)
f:id:kandennti:20171211142248p:plain
意図していた形状になると思います。
f:id:kandennti:20171211142259p:plain
このようなフィレットが欲しい時は、あまり無いとは思いますが・・・。

GSDの場合、スイープ・ロフト・ブレンド辺りのコマンドでスパイン指定可能な
ものが多いのですが、細かな違いは有れど
指定した断面が、どの平面上に存在しているか?
を示すのがスパインなんだろうと思っています。


少し前にこちらを投稿したのですが
解決済み: R形状のサーフェイスの作り方について - Autodesk Community
本当はスパインについても書こうと思っていたのですが
Fusion360にはスパインのコマンドが無く、無い機能について
グダグダ書いても仕方ないと思い、こちらに記載してみました。

背景色を変更・復元する3

こちらの続きで、保留していた宿題です。
背景色を変更・復元する2 - C#ATIA

ご要望としては、PartでもProductでも同様の処理を行いたい
と言うことなので、修正してみました。

PartDocumentの取得方法を変更する必要があるため、
こちらの部分を修正します。

Private Sub UserForm_Initialize()
    'Form設定
    Me.CommandButton1.Caption = "背景色-白"
    Me.CommandButton2.Caption = "背景色-復元"
    
    '一時的な背景色
    mBackColor = Array(255, 255, 255)
    
    'CATIA情報
    Set mDoc = Get_PartDoc(CATIA.ActiveDocument)
    If mDoc Is Nothing Then
        MsgBox "Partファイルが見つかりません"
        Me.CommandButton1.Enabled = False
        Me.CommandButton2.Enabled = False
        Exit Sub
    End If
    Set mPt = mDoc.Part
    Set mSel = mDoc.Selection
    Set mVis = mSel.VisProperties
    Set mVisSetAtt = CATIA.SettingControllers.Item( _
        "CATVizVisualizationSettingCtrl")
End Sub

そして実際にPartDocumentを取得する為の関数を
追加します。(再帰で一番上部にあるPartDocumentを探しています)

Private Function Get_PartDoc(Doc As Document) As PartDocument
    If Not Get_PartDoc Is Nothing Then Exit Function
    
    Dim Pros As Products
    Dim i As Long
    
    Select Case TypeName(Doc)
        Case "PartDocument"
            Set Get_PartDoc = Doc
            Exit Function
    
        Case "ProductDocument"
            Set Pros = Doc.Product.Products
            If Pros.Count < 1 Then Exit Function
            
            For i = 1 To Pros.Count
                Set Get_PartDoc = _
                    Get_PartDoc(Pros.Item(i).ReferenceProduct.Parent)
                If Not Get_PartDoc Is Nothing Then Exit Function
            Next
        
        Case Else
            Exit Function
    End Select
End Function

Part・Product両方で動くマクロを作成する際、結論としては
どうやってPartDocumentを取得するか? だけの違いで他の部分は
共通です行えます。

Productの場合、例えデザインモードでPartファイルを操作している状態で
あっても

   set Doc = CATIA.ActiveDocument

を実行した場合、一番上のProductのDocumentが取得されます。
(子ウィンドウの一番上と言うイメージです)