読者です 読者をやめる 読者になる 読者になる

C#ATIA

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

他ファイルの全てのピクチャを取り込む

AdvanceCAD

連日、"AdvanceCAD" のデータをコピペする作業があり、さすがにウンザリ。
根本的な原因は、CADデータの運用の問題があるのは十分
わかっているのですが、今更運用方法を変更する事に
理解してもらえるはずが無い為、マクロで対応何とか
してしまえと思い、作成してみました。


ファイルAのデータを、ファイルBの同一ピクチャに全て取り込みます。
(ひょっとしたらこの機能は標準で有るのでしょうか?)
すんなり出来そうに無かったので、2段階の作業となります。

○エクスポート
ファイルAのデータをエクスポートする為の情報を取得するマクロです。

/* AdvanceCAD_macro */
/* MDLExport.MAC */
/* 他のAcadファイルの全てのピクチャを同一ピクチャに取り込むマクロです */
/* エクスポート側 */

/* --- 設定 --- */
/* リストパス インポートとエクスポート一致させて下さい*/
listPath = "C:/temp/";
listFileName = "MDLInportList.MAC";
/* ------------ */

clear();
/* ファイル名の取得 */
extern filepath = fname("#MODEL#",#CURFILNAME);
vdump(listPath + listFileName,"w",filepath);

/* 全ピクチャのアイテムの有無 */
/* 1:あり -1:なし */
picmax = 63;
extern picItem,drwScl,picScl;
picItem = array(picmax + 1);
drwScl = picScl = picItem;
startpic=#CURPIC ;
LIST/OFF <CE>
for ( i=1;i<picmax + 1;i+=1 ) {
	picItem[i] = getitm(0,i)>0?1:-1;
	if(picItem[i] >0){
		PIC [i] <CE> 
		drwScl[i] = #CURDRWSCF;
		picScl[i] = #CURPICSCF;
	}
}
PIC [startpic] <CE> 
LIST/ONN <CE>
vdump(listPath + listFileName,"a",picItem);
vdump(listPath + listFileName,"a",drwScl);
vdump(listPath + listFileName,"a",picScl);

echo "エクスポートしました";
exit;

必要な情報は "vdump" で出力しています。本来デバッグの為の
機能なのですが、出力したファイルは外部マクロとしてそのまま実行
できる為お手軽な上、非常に便利です。

○インポート
続いてファイルBにファイルAのデータを取り込むマクロです。
コピペではなく、サブモデル-分解の状態で取り込むため
元のデータと同じ状態です。

/* AdvanceCAD_macro */
/* MDLInport.MAC */
/* 他のAcadファイルの全てのピクチャを同一ピクチャに取り込むマクロです */
/* インポート側 */

/* --- 設定 --- */
/* リストパス インポートとエクスポート一致させて下さい*/
listPath = "C:/temp/";
listFileName = "MDLInportList.MAC";
/* ------------ */

msg=" ";
clear();
CLA/EVT <CE>
/* モデル変更チェック */
if (dbchgd()==1) {msg="モデルを保存して実行してください!!";goto bye;}

/* インポート情報取得 */
extern filepath,picItem;
extern drwScl,picScl;
tmp=fstat(listPath + listFileName,"exist");
if(tmp==0){msg="インポート情報が見つかりません";goto bye;}
MACRO NEW [listPath + listFileName] <CE>

/* インポート情報チェック */
tmp=vtype(filepath);
if(tmp!=4){msg="インポート情報が不正です(listPath)";goto bye;}
tmp=fstat(filepath ,"exist");
if(tmp==0){msg="インポートファイルが見つかりません";goto bye;}
tmp=vtype(picItem);
if(tmp!=30){msg="インポート情報が不正です(picItem)";goto bye;}
tmp=vtype(drwScl);
if(tmp!=30){msg="インポート情報が不正です(drwScl)";goto bye;}
tmp=vtype(picScl);
if(tmp!=30){msg="インポート情報が不正です(picScl)";goto bye;}

/* インポート-サブモデル分解 */
picmax = 63;
LIST/OFF <CE>
for ( i=1;i<picmax + 1;i+=1 ) {
	tmp=vtype(picItem[i]);
	if(tmp!=3){msg="ピクチャ情報が不正です(picItem)";goto bye;}
	tmp=vtype(drwScl[i]);
	if(tmp!=3){msg="ピクチャ情報が不正です(drwScl)";goto bye;}
	tmp=vtype(picScl[i]);
	if(tmp!=3){msg="ピクチャ情報が不正です(picScl)";goto bye;}
	if(picItem[i]>0){
		PIC [i] <CE> 
		s=drwScl[i];DRWSCF [s] <CE> 
		s=picScl[i];PICSCF [s] <CE> 
		SUB [filepath] RDPIC [i] ITMXPD <CE><CE> <0,0> <CE>
		ZOOM/ALL <CE>
	}
}
msg="終了しました。確認してください。";

/* Exit Program */
bye:
CLA/EVT <CE>
RPT/ALL <CE>
LIST/ONN <CE>
echo msg;
exit;

インポート側の同一ピクチャに、問答無用で取り込むため変更されている
ファイル(未保存の状態)では、マクロを実行しないようにしています。
又、取り込む際は出来るだけ元のファイルと同じ状態にしたい為
元のピクチャの "ピクチャスケール" "ドローイングスケール" と同じ値にしています。
f:id:kandennti:20151226184952p:plain
(うちでは、ドローイングスケールはあまり使わないですが)


今年のブログはこれでおしまいです。 正直、こんなに続けると
思いませんでした。 CATIAの "ファイル間リンクの取得" は来年の宿題
にします。 良いお年を。