C#ATIA

↑タイトル詐欺 主にCATIA V5 の VBA

選択した円弧の長さを表示1

ちょっと相談?を頂いたので、久々にCATIAのマクロを書いてみました。

選択した3D円弧の長さを表示するだけのものです。
極端な話、こちらの物を流用しただけです。
線を選択しつつ、合計長さを表示する - C#ATIA

'vba  test_Circle_Length
'using-'KCL0.0.10'
'円弧の長さを表示

Option Explicit

Sub CATMain()
    'ドキュメントのチェック
    If Not CanExecute("PartDocument") Then Exit Sub
    
    '選択
    Dim msg$: msg = "円弧を選択して下さい : ESCキー 終了"
    Dim Elem As SelectedElement
    Dim Pt As Part
    Dim Ref As Reference
    Do
        Set Elem = KCL.SelectElement(msg, "HybridShape")
        If KCL.IsNothing(Elem) Then Exit Do
        Set Pt = Elem.Document.Part
        Set Ref = Elem.Reference
        If IsCircle(Ref, Pt.HybridShapeFactory) Then
            MsgBox "円弧長さは" & GetLength(Ref, Pt) & "mmです"
        Else
            MsgBox "円弧を選択してください"
        End If
    Loop
End Sub

'長さの取得
Private Function GetLength#(ByVal Ref As Reference, ByVal Pt As Part)
    GetLength = Pt.Parent.GetWorkbench("SPAWorkbench").GetMeasurable(Ref).Length
End Function

'円弧の判断
Private Function IsCircle(ByVal Ref As Reference, ByVal Fact As HybridShapeFactory) As Boolean
    Dim GeoType&: GeoType = Fact.GetGeometricalFeatureType(Ref)
    'AutomationManualの記述が間違えやすいが、
    '4-Circle になる
    IsCircle = IIf(GeoType = 4, True, False)
End Function

イロイロな事を忘れかけていました。

SelectElement2を利用する際のフィルターなのですが、今回や流用元では
"HybridShape" を利用しているのですが、選択する為の自由度と言いますか
柔軟性は "Edge" の方が良いのです。

が、その先の処理が思うように出来なかった為(リファレンスのタイプが異なる)
前回も "HybridShape" にしたんじゃないのかな? と薄っすらな記憶・・・。
CreateReferenceFromBRepNameが上手く取得出来れば、Edge" を利用したかった
のですが。

OBJファイルからサーフェス化を挑んでみました

存在は知っていたのですが、やったことが無かった為 Autodesk社の
ReMakeとFusion360を利用し、OBJファイルからサーフェス化を試してみました。

※ちょっと探した際、これらの手順が記載されたサイトが見当たらなかった為
 書きました。 他サイトに手順が書かれていた際は、間違いなくそちらが正しいです。


折角なので、それなりに手ごたえありそうなデータとしてスミソニアン博物館
から、お借りしました。

Smithsonian X 3D
(DLは要登録です)

サイトの3DViewerはAutodeskさんなんですね。手広いですな。

加工までやってみようかなぁと思い、加工しやすそうな鯨の化石を落としたの
ですがデータが大きすぎて断念。蟹さん(19MB)にしていました。


続いてReMakeの入手はこちら

Autodesk ReMake

有償・無償・学生のライセンスと15日間トライアルがあるようなのですが、
全てインストールまでは同一のファイルで行い、起動時にゴニョゴニョするようです。
(現在、英語版しかないようです)

ソフトを起動後、こんな感じのダイアログ?が表示されますが、恐らく右上の
×を押してしまえば、きっと無料版として使えるのだろうと解釈しました。
(間違っていたら教えていただけると、助かります)
f:id:kandennti:20170406190305p:plain
毎回手間なのであれば、右下にチェック入れれば良いのだろうと思います。

取り込み後はこんな感じです。
f:id:kandennti:20170406190316p:plain
スミソニアンなViewerは時間がかかりましたが、こちらはそんなに時間は
かからないです。

個人的にですが、いつもAutodeskさんのソフトはスピンとムーブは良いのですが、
ズームがやりにくい(よくわからない)と思っていたのですが、僕がCATIAの為に
3ボタンマウスを使っている事が原因なんですね。
(スクロールマウスなら直感的な操作だろうと思います)

このままエクスポートしようかとも思ったのですが、面の数を確認すると
f:id:kandennti:20170406190333p:plain
ちょっと多すぎる気がしたので、間引きまくりました。
f:id:kandennti:20170406190341p:plain
結構、形が崩れたのですが、まぁ仕方ないです。

続いて、エクスポートです。
f:id:kandennti:20170406190350p:plain
Fusion360で、ポリゴンからTスプライン化させるためには四角ポリゴンである
必要があるため、"Fusion360-OBJ(Quads)" を選択します。
f:id:kandennti:20170406190401p:plain
これ、エクスポートに非常に時間がかかりました。恐らく四角ポリゴン化させる為に
時間がかかるのだろうと思います。

そもそも、四角ポリゴンの規格を誰が考えたんだよ!って思ってました。
三角ポリゴンであれば、3点が(トレランス以内で)直線上に並ばない限り、一意の
平面が確定するのに、4点だと同一平面状に存在する保証が無い為
ものすごく迷惑だなぁ と思っていましたが、四角ポリゴンの恩恵を
初めて感じました。(でも、迷惑だと思ってます)


続いて、Fusion360です。
四角なOBJファイルをインポートする為、メッシュ作業スペースに入ります。
(基本設定のプレビューの[メッシュ]作業スペースに、チェックを入れる必要が有りそうです)
"メッシュを挿入" でOBJファイルを選択します。

f:id:kandennti:20170406190457p:plain

正直、クラウドを経由しないようなので、CADデータを開くより桁違いに速いです。

f:id:kandennti:20170406190507p:plain

おぉ 本当にメッシュが四角いですよ。
ここで初めて気がついたのですが、ReMakeで一生懸命間引きまくりましたが、
四角ポリゴンの精度(と言いますか、面の数)は(四角なOBJファイルに限り)エクスポート
の際のクオリティの依存が大きいのではないかな?と思いました。
(未確認です・・・面倒)

f:id:kandennti:20170406190532p:plain


作業スペースを "モデル" - "スカルプト" に移動(又は、"モデル" ノンパラモード)して、変換コマンド
f:id:kandennti:20170406190542p:plain
"クワッドメッシュからTスプライン" に切り替え、先程インポートした四角ボリゴンを選択。
f:id:kandennti:20170406190548p:plain

少し時間がかかりますが、無事Tスプラインなボディになりました。
f:id:kandennti:20170406190555p:plain
(実は最初は一度ここで失敗しました。 必ず変換可能なわけでは無いようです)


これではまだサーフェス(ソリッド)化できていない為、再度変換で "TスプラインからBREP"
を行います。
f:id:kandennti:20170406190606p:plain

ここも少し時間がかかります・・・しかも、待った末
f:id:kandennti:20170406190613p:plain

う~ん、これだけ面がうねった状態で出来るのかなぁ? とは思っていましたが。

念の為、よくわからないのですがスカルプト作業スペースの "ボディを修復" コマンドの
自動修復を行ってみましたが
f:id:kandennti:20170406190622p:plain
恐らく星印の部分が問題有りなのでしょう。(見た目にも非常に痛々しい…)

僕には早過ぎる技術

と、言う結論に至りました。(工業的なデータならいけるかも)
四角いポリゴンがもっと細かければ、何とか成るかも とも感じるので
ReMakeのクオリティをもっと高くすれば良いのかもしれません。(未確認です)

又、全体を一度に処理しないで、こちらのObaraさんの手法を使っていくと
ひょっとしたらたどり着けるのかも知れません。
Fusion360 スカルプ機能を使ったスキャン等stlデータに対しての面作成 : Home3Ddo

そういえば、もう何年も蟹を食べてないなぁ。

ユーザーサイドのCATIA 関連サイト4

ネタ切れ以上に、何もかもにヤル気が湧かない・・・。

こちらの続きのつもりです。
ユーザーサイドのCATIA 関連サイト3 - C#ATIA



○scripts4all
Catia, Excel (& other) Tools
要登録のようですが、3つ程ツールが有りました。
試してはいませんが "TxtOnCurve" は過去に僕がC#で作ろうかな?
と思っていたものとほぼ同等なもののようです。


〇CATIA V5
CATIA V5
CATIA関連のブログでは、死んでいるものは多々あるのですが、
更新が続いているブログです。
ちょっとしたTipsが記載されておりますが、それ程知らなかった
操作は有りませんでした。
英語なんですが、URLが ".jp" です。 何故?

円筒的矢視図を作りたい

久々にCATIAネタです。
少し前に業務で行った、円筒形部品の図面を描く際の悩みです。
タイトルでは "円筒的矢視図" と書きましたが、正しい名称すらよくわかって
おりません。(展開図と表記すると望んでいない答えが返ってくるもので)


本来円筒形部品のお話ですが、簡略化する為、真っ二つにした状態で
進めます。

こんな感じの部品の図面化をしたいのですが、
f:id:kandennti:20170328191210p:plain

手抜きですが、こんな図面ならそれ程苦にはならないです。
f:id:kandennti:20170328191215p:plain

実際に欲しいのは、外側の形状だけで構わないので、こんな感じの
図面なんです。(テキトーに描いてます)
f:id:kandennti:20170328191224p:plain
Y軸は単位が長さで、X軸の単位は角度で欲しいんです。
(逆でも構いませんが・・・)


高価なライセンスが無いのですが、こちらの手法を利用すれば
ゴールまでたどり着けそうなものが、ひょっとしたらあるのかな?
とは、薄々感じています。
ライセンスの無いコマンドを使用する - C#ATIA

とりあえず面倒なのですが、展開コマンドを主要な面に対して2回
行った結果がこちら。
f:id:kandennti:20170328191245p:plain
プレスの展開図を作成するには良いのですが、ちょっと望んでいる
結果にはなりません。

続いて、シェイプモーフィングコマンド。 正直、このコマンドの使い方が
イマイチわかっていないのですが、ターゲットとなる緑のラインを2本作成し
赤のエッジを基準にさせてみました。
f:id:kandennti:20170328191250p:plain

結果がこちら。
f:id:kandennti:20170328191255p:plain
一見良さそうに見えたのですが、やっぱり望んでいるものとは
ちょっと違うんです。

緑のラインの長さが違うからかな? と思い水色のターゲットを作成
しましたが、やっぱり望んだものとは異なります。
f:id:kandennti:20170328191301p:plain


イメージとしては、形状より外側にガイドになる円弧を描き、
ガイド上から中心軸に向かってカメラ(黄色矢印)を設置し、グルッと
ガイド上を走査する(緑色矢印)ような状態で欲しいんです。
f:id:kandennti:20170328191308p:plain

そこで、ガイドになる円弧を押し出し、この押し出し面に対し
エッジをチマチマ投影(まとめて行うとおかしくなる)。
この投影されたラインを平面に展開できれば良いのですが、
その為のコマンドが存在するものかどうかが、わからないんです。
f:id:kandennti:20170328191314p:plain
これの逆、平面にデザインしたラインを曲面に配置するディベロップコマンドの
存在は知っているのですが、このコマンドでは逆は出来ないんです。

ワイヤーで処理するのを諦め、さっきの投影したラインからスイープで
ガイド面(薄いピンク)に直角な面(紫)を作成し、ラップサーフェスコマンドで
作ったものが水色の面。
f:id:kandennti:20170328191320p:plain

これを平面的に見ると、かなり望んでいるものになります。
f:id:kandennti:20170328191328p:plain
惜しいのは、Φ10の閉じた円弧が楕円になってしまうのですが、
まぁこれぐらいなら2D側で修正しても良いかな?とは感じてます。
(恐らく投影時の処理が望んでいない状態を生み出している)


この方法でも結構手間な上、曲線は正しくないものが出来そうな
予感はしています。(手間な部分はマクロ化してしまっても良いのですが)

この話は、サポートにも相談したのですが上手く伝わらなかったのか、
やっぱりシートメタル的な展開図の機能を紹介されてしまいます。

CATIAに限らず、この様な機能を持っているソフト等をご存知の方が
いらっしゃいましたら、教えて頂けると助かります。

・最終的に欲しいのは2Dなので、サーフェス等では無くても構いません
・CATIAに拘りません
・全てを一発で処理する必要は無く、部分的なマクロでも十分です

平面的な座標軸の片側が長さで、もう片方が角度で表現出来ていれば
良いので、円筒座標系があれば良いのですが、CATIAには直交座標系
しか無さそうです。

そんなに難しい事でも無さそうなのですが、CATIAのマクロでは
3Dラインから得られる情報がほぼ無い為、お手上げです。
Fusion360のスプリクトでは3Dラインから情報はかなり得られるのですが、
そこまで作り上げる能力が僕には無い為、こちらもお手上げです。

結構需要があるんじゃないかな?

工具コンテキストメニューから工具変更

計算済みツールパスの工具を変更したい時があります。 かなり、頻繁に・・・。
手動で行うと結構手間で、正直モチベーションが落ちまくります。
手順はこんな感じです。
・任意のツールパスをアクティブ
・変更したい工具をアクティブ
・ツールパスのコンテキストメニューで '工具変更' (しかもメニュー位置が深い・・・)

実際の操作はこんな感じです。


これを楽しようと思いマクロを作成したのですが、PowerMillのマクロの
呼び出し方が複数有り、今回は操作的に直感的なので工具のコンテキストメニューを
利用しての呼び出しにしました。
この呼び出し方法、実は知りませんでした。(Helpには記載されています)
こちらが非常に参考になりました。
Solved: Create macro to pick folder and activate it - Autodesk Community


前回のプルダウンリストを利用して、複数のツールパスに対して工具変更が出来るように
しています。(但し、スクエア・ボール・ラジアス・テーパーボールエンドミルのみです。)

マクロ本体です。

//PMill_Macro
//ReplaceTool.mac
//Treeの指定した工具のコンテキストメニューから工具交換

function main(string toolname) {
	//選択工具
	entity act = entity('tool', $toolname)
	
	//交換可能リスト
	string list paths = {}
	call Get_PathList($act, $paths) 
	if is_empty($paths) {
		message error  '交換可能なツールパスがありません!!'
		return
	}
	
	//ユーザー確認
	string msg = '[' + $act.name + ']' + 'に工具交換するツールパスを選択してください'
	call Exec_DownMenu($paths, $msg, 1, $paths)
	
	//工具交換
	call Set_ActTool($act, $paths)
	
	//終了
	message info  'Done'
}

//工具交換
function Set_ActTool(entity ActTool, string list Lst) {
	call Exec_Cmd('ACTIVATE TOOL "' + $ActTool.name + '"')
	foreach path in $Lst {
		call Exec_Cmd('EDIT TOOLPATH "' + $path + '" REPLACE_TOOL ;')
	}	
}

//交換可能リスト取得
function Get_PathList(entity ActTool, output string list OutLst) {
	string list lst = {}
	bool geoeql = 0
	foreach path in folder('toolpath') {
		call ToolNose_Equal($path.tool, $ActTool, $geoeql)
		if $geoeql {
			int dmy = add_last($lst, $path.name)
		}
	}
	$OutLst = $lst
}

//工具先端一致判断
function ToolNose_Equal(entity T1, entity T2, output bool OutBool) {
	$OutBool = 0
	string T1_type = $T1.type
	string T2_type = $T2.type
	
	if $T1_type != $T2_type {
		return
	}
	
	if $T1.Diameter != $T2.Diameter {
		return
	}
	
	Switch T1_type {
		case 'end_mill'
			$OutBool = 1
			return
			break
		case 'ball_nosed'
			$OutBool = 1
			return
			break
		case 'tip_radiused'
			if $T1.TipRadius == $T2.TipRadius {
				$OutBool = 1
			}
			return
			break				
		case 'taper_spherical'
			if $T1.TipRadius == $T2.TipRadius and $T1.TaperAngle == $T2.TaperAngle {
				$OutBool = 1
			}
			return
			break				
	}
}

//コマンド
function Exec_Cmd(string cmd) {
	docommand $cmd
}

function Msgoff() {
	graphics lock
	dialogs message off
	dialogs error off
}

function Msgon() {
	graphics unlock
	dialogs message on
	dialogs error on
}

include downmenu.inc

最後のインクルードは、前回のプルダウンリストのライブラリです。

続いて、工具のコンテキストメニューに追加する為の "tool.XML" です。
既に他で利用されている場合は、buttonタグ部分を追記すればOKです。
又、今まで利用していない場合は、環境変数の追加や指定されたフォルダを
作成する必要があるため、Helpを参考にすると良いかと思います。
(上記のマクロは同一フォルダ内に配置しておく必要が有ります)

<?xml version="1.0"  encoding="utf-8" ?>

<menupage>

<button label="工具変更"
command='MACRO ReplaceTool.mac "%s"'
/>

</menupage>


実際に利用した感じはこちら。

桁違いに楽。

"group" フォルダは犠牲にした、プルダウンリストライブラリ

相変わらず、PowerMillが使いこなせていない・・・。

方向性を定める為、イロイロと試していた為マクロの製作も止めていました。
少しづつ迷いが取れきたので、少しマクロで楽をしたいところ。

使い回しが出来そうなので、"group" フォルダは犠牲にしたプルダウンリストを
ライブラリ化しました。 こちらのものに近いものです。
アクティブなブロックを未計算ツールパスに反映させる - C#ATIA

//PMill_Macro
//downmenu.inc

//ダウンメニュー
//pram  :Lst-選択肢リスト
//pram  :Msg-メッセージ
//pram  :AbortFg-未選択時の処理 0-空を返す 1-終了
//return:OutLst-選択されたリスト
function Exec_DownMenu(string list Lst, string Msg, bool  AbortFg, output string list OutLst) {
	$OutLst = {}
	string allword = '全て'
	
	//実行確認
	call Can_Exec()
	
	//先頭に全てを追記
	int dmy = add_first($Lst, $allword)
	
	//ダミー
	call Create_DmyGroup($Lst) 
	
	//ユーザー選択
	entity list grps =  input entity multiple group $Msg
	DELETE GROUP ALL
	EDIT RECYCLER DELETE Group ALL
	if is_empty(grps) {
		if $AbortFg==1 {
			macro abort
		} else {
			return
		}
	}
	string list sels = extract(grps , 'name')
	
	//選択要素
	if $sels[0] == $allword {
		string tmp = remove_first($Lst)
		$OutLst = $Lst
	} else {
		$OutLst = $sels	
	}
	return
}

//選択用ダミー作成
function Create_DmyGroup(string list Lst) {
	foreach txt in $Lst {
		CREATE GROUP ;
		RENAME Group "1" $txt
	}
}

//条件確認
function Can_Exec() {
	if not (is_empty(folder('group'))) {
		string msg = 'グループフォルダを利用する為、グループフォルダをクリアします。' + crlf + '宜しいですか?'
		bool yn = 0
		$yn = QUERY $msg
		if not $yn {
			macro abort	
		}
		DELETE GROUP ALL
	}
}

これ自体は特に何かが出来るものでは無いため、説明は割愛。
使用例はそのうちUpします。(出来ると良いな・・・)

何処で販売しているのか見つけられない

何となくこんな記事を見つけました。

キヤノンITS、SOLIDWORKSの“かゆいところ”に手が届くツール61種を販売 - MONOist(モノイスト)

よく見ていませんが、そのうちCATIAのマクロのネタに出来るかも知れない。