最近、加工をあまりしていなかったのでPowerMillネタから離れていましたが
フォーラムにはチョロチョロ参加してます。
今日教わった内容はこちら
Solved: command list - Autodesk Community
「Helpに載ってないコマンド類はこれで調べるしか方法無いよ」と、
AutodeskのPowerMillでは重鎮、5axisさんから直々にDMしてもらいました。
以前、これを読んだいたのに忘れていたので、覚書。
最近、加工をあまりしていなかったのでPowerMillネタから離れていましたが
フォーラムにはチョロチョロ参加してます。
今日教わった内容はこちら
Solved: command list - Autodesk Community
「Helpに載ってないコマンド類はこれで調べるしか方法無いよ」と、
AutodeskのPowerMillでは重鎮、5axisさんから直々にDMしてもらいました。
以前、これを読んだいたのに忘れていたので、覚書。
DrawingTextの中心座標を取得したい との記載を見て思い付きで書きました。
Size of the textbox on a drawing - DASSAULT: CATIA products - Eng-Tips
最初に、”遅いよ” って書いたんですけどね。
リトルクトゥルフさんがアッサリ答えを書いてくれました。
・・・やっぱりレベルが違いすぎですね。
コードが書かれていなかったので、作ってみたものの
リーダー(引き出し線)の削除でエラーになっちゃいます。
DrawingText.Leaders.Remove(0)
ん~ エラーにはなるものの削除は出来てます。
仕方ないので On Error Resume Next でエラーを回避するように
したのは良いのですが、すっきりしない。
探しまくってやっとCOEの記載を発見しました。
COE : Forums : Text box size
どうやっているのかな? と思い見てみると
やっぱり On Error Resume Next してます・・・。
僕だけじゃないようなので、すっきり。
先日のマクロですが、上手く動かないらしいのです。
draw with a catia all the Dual Geodesic Icosahedra - DASSAULT: CATIA products - Eng-Tips
原因が良くわからないのですが、CATIAのリリース違いが
影響するような程の最新の機能は使っていないはずです。
知識が無い為何とも言えないのですが、残る可能性は
言語の違いかと思っています。
マクロの内容的に、処理を速めるために正規表現を利用しているのですが
この辺がエンコードで上手く機能しないとか、エクスポートしたVBAファイル
(~.bas,~cls)が、他の言語だと文字化けし機能しないとか・・・。
何か情報をお持ちの方、教えて頂けると助かります。
こちらの続きです。
Dual Geodesic Icosahedra2 - C#ATIA
完成したので、テストデータと共にGrabCADにUpしました。
恐らく誰にも役には立たないでしょう。
3D CAD Model Collection | GrabCAD Community Library
結局一番苦労したのは、正規表記のパターンでした。
未だに宝探しをしている気分です。
面の作成に失敗していた理由がわかりました。
Visual PolyhedraのサイトにUpされている座標データの中に
こんな感じの☆型の面を、5個の頂点だけで表現している
データがあります。
フィルサーフェスを利用して面を作成している為、こんな感じの自己交差
した状態ではエラーになる為、面が抜けてしまったようです。
対応策を考えるのも面倒な為、そのままにしました。
実は、こんなスケッチでもFusion360は面が作れるんですよね。
こちらでそれを利用したものを作りました。
Solved: How to remove inner sketch lines from an intersection sketch? - Autodesk Community
スケッチの考え方の違いを利用しています。
Upしたマクロファイルの "SurfaceFactory.cls" ですが(生意気なネーミングで申し訳ないのです)
このマクロだけではなく、他にも利用できるように考えて作っています。
英語じゃ書けそうになかったので、こちらで説明を。
3D点:array(double,double,double) でXYZの順です。都合上ArrayVariantです。
一枚の面:array(3D点,3D点,3D点…)です。各頂点を表す為、当然3点以上が必要です。
複数の面:array(一枚の面,一枚の面,一枚の面・・・)です。
一枚だけ面を作成したい場合は、ary(ary,・・・) な感じです。
Sub Example_Single() 'パートドキュメント Dim doc As PartDocument: Set doc = CATIA.Documents.Add("Part") '座標値 Dim pos As Variant pos = Array(Array(0, 0, 0), Array(1, 0, 0), Array(0, 1, 0)) 'SurfaceFactoryインスタンス Dim surfFact As SurfaceFactory: Set surfFact = New SurfaceFactory '面を作成するパートドキュメントをセット Call surfFact.SetPartDoc(doc) '座標値から面を作成 - 形状セットには入りません! '戻りは HybridShapeSurfaceExplicit Dim surf As HybridShapeSurfaceExplicit Set surf = surfFact.CreateSurf(pos) '形状セットに挿入 Dim hBody As HybridBody: Set hBody = doc.Part.hybridBodies.Add() Call hBody.AppendHybridShape(surf) 'インスタンス破棄 - 破棄することで内部の一時的なものを削除します。 Set surfFact = Nothing End Sub
複数面であれば、ary(ary(ary,・・・),・・・) な感じです。
Sub Example_Multi() 'パートドキュメント Dim doc As PartDocument: Set doc = CATIA.Documents.Add("Part") '座標値郡 Dim posary As Variant posary = Array( _ Array(Array(0, 0, 0), Array(1, 0, 0), Array(0, 1, 0)), _ Array(Array(0, 0, 0), Array(0, 1, 0), Array(-1, 1, 0)), _ Array(Array(0, 0, 0), Array(-1, 0, 0), Array(0, -1, 0)), _ Array(Array(0, 0, 0), Array(0, -1, 0), Array(1, -1, 0))) 'SurfaceFactoryインスタンス Dim surfFact As SurfaceFactory: Set surfFact = New SurfaceFactory '面を作成するパートドキュメントをセット Call surfFact.SetPartDoc(doc) '座標値郡から面郡を作成 - 形状セットには入りません! '戻りは Collectiont Dim surfs As Collection Set surfs = surfFact.CreateSurfs(posary) '形状セットに挿入 Dim hBody As HybridBody: Set hBody = doc.Part.hybridBodies.Add() Dim surf As HybridShapeSurfaceExplicit For Each surf In surfs Call hBody.AppendHybridShape(surf) Next 'インスタンス破棄 - 破棄することで内部の一時的なものを削除します。 Set surfFact = Nothing End Sub
で、折れ線とフィルで作成可能な面が作れます。
その為、STLや3DDXF等のポリゴンっぽいものも、座標値配列にさえすれば
流用可能です。 恐らく使わないですが。
こちらの続きです。
Dual Geodesic Icosahedra - C#ATIA
結局、格好悪い方法で挑戦中。
やっと形になるようにはなりました。
但し、自己交差しているタイプのもので、何面か抜けるものがあり
原因調査中。
接合するわけじゃないので、自己交差が原因の訳ではないような
気がしているのですが・・・。
こちらに楽しそうなネタが。
draw with a catia all the Dual Geodesic Icosahedra - DASSAULT: CATIA products - Eng-Tips
リンクされているHelpのページ・・・探しましたよ。
GSDの真ん中ぐらいにありました。
何処にマクロがあるのかな? と思っていたらExcelにマクロが入ってました。
ご興味あれば是非。
(僕が使用しているPCでは動かないです)
'Dual Geodesic Icosahedra' を、マクロじゃなくてパラメータで
イロイロと変更出来るファイルが作れると、カッコイイと思うのですが。
これみたいに。
3D CAD Model Collection | GrabCAD Community Library
これを読ませて頂きました。
僕の場合、呼び出し順では無いのですが、エントリーポイント(最初に実行される関数)は、
先頭に書いてます。このブログの場合、CATIA・PowerMillではそんな形になってます。
Fusion360は勉強中なので最後にエントリーポイントになっていますが、何れ同じようにします。
アプリケーションの場合は、エントリーポイント自体にあまり意味が無い(と、までは言わないのですが)
ものですが、マクロの場合は大半が一方通行な処理な為、全体的に上から下に流れていくのが
自然に思えます。
僕自身としては、まず全体がどんな処理をするのかを把握したいのが本音です。
それをエントリーポイントに書くようにし、簡単なコメントを入れています。
必要なデータを用意し関数に投げて、それを受け取る。この繰り返し
をエントリーポイントで行うように自然になりました。
(エントリーポイント内ではループは基本しない(ありえない)ですし、IFは関数の戻り値で
キャンセルするかどうか? の判断ぐらいにしています。)
エントリーポイントは森で、関数が木ですかね、僕の中では。関数が内部的にどんな処理を
するかはどうでも良くて、投げるものがわかっていて戻ってくるものが何か?
さえわかっていれば、あまり気にしていないです。(本音は気になります)
エントリーポイントを最後に記載する習慣は、確かC言語だったような気がします。
先に必要なものを定義してから実行しないと、未定義だよって扱いだったような。
コンパイラの力ですかね。
PowerMillの場合、ライブラリ類のインポートを最後に書いてもOKなんですよね。
もっと早い時間に書こうと思っていたのですが、t-hom’sさんのところコメント出来ないんですよね。
(酔っぱらっていますので、適切な表現ではない部分有ると思いますが、ご了承ください)