2つの図面でのオブジェクトコピーとアクティブ図面の切替

2つの図面でのオブジェクトコピーとアクティブ図面の切替

yoshiyuki.todaka.2019
Explorer Explorer
570件の閲覧回数
1件の返信
メッセージ1/2

2つの図面でのオブジェクトコピーとアクティブ図面の切替

yoshiyuki.todaka.2019
Explorer
Explorer

お世話になります。

 

.NETで開いたファイルのモデル空間にあるすべてのオブジェクトをコピーして、テンプレートファイルを元に作成した新しいファイルに貼り付けたくコードを書いているのですが、新しいファイルへの操作切り替えが出来ていない感じで上手くいきません。アドバイスを頂けないでしょうか。よろしくお願い申し上げます。

 

具体的なコードは下記で、オブジェクトの取得は500ぐらいカウントされており、コピーができていそうで、新しいファイルも問題無く作成されております。そこから新しいファイルをアクティブにしてオブジェクトを貼り付けたいのですが、実行しても元ファイルのコマンドのところに出力されるだけで、新しいファイルでコマンドが実行されている感じがありません。またed2.WriteMessage(""); とするとエラーが発生します。

 

CAD側での出力(元ファイル側)は下記のような感じです。

コマンド: visionchange
COPYBASE基点を指定:
オブジェクトを選択:
コピー完了
選択したオブジェクトの数:504
コピー完了
PASTECLIP*無効な選択*
点を指定 または 窓(W)/最後(L)/交差(C)/直方体(BOX)/すべて(ALL)/フェンス(F)/ポリゴン窓(WP)/ポリゴン交差(CP)/グループ(G)/追加(A)/除外(R)/複数(M)/直前(P)/元に戻す(U)/自動モード(AU)/単一(SI)
オブジェクトを選択: 1 個見つかりました

 

public class Class1
{
[CommandMethod("visionchange")]
public void SetLayerAndLineWeight()
{
// アクティブなCADドキュメントをセットしそのDB情報を取得する
Document doc = Application.DocumentManager.MdiActiveDocument;
Database db = doc.Database;
Editor ed = doc.Editor;

 

// 全てのオブジェクトを選択
PromptSelectionResult selRes = ed.SelectAll();
if (selRes.Status != PromptStatus.OK)
{
ed.WriteMessage("\nエラー:オブジェクトの選択に失敗しました。");
return;
}

// 選択したオブジェクトをクリップボードにコピー
ed.Command("COPYBASE", new Point3d(0, 0, 0));
ed.WriteMessage("\nコピー完了\n");

// 選択したオブジェクトの数を取得
int numObjects = selRes.Value.Count;

// 選択したオブジェクトの数をコンソールに出力
ed.WriteMessage($"\n選択したオブジェクトの数:{numObjects}\n");

ed.WriteMessage("\nコピー完了\n");

 

// setting.dwtを元に新規図面を作成
Document settingDoc = Application.DocumentManager.Add("setting.dwt");
Application.DocumentManager.MdiActiveDocument = settingDoc;

 

// 新規ドキュメントが完全にロードされるのを待つ
Application.UpdateScreen();


// アクティブなCADドキュメントをセットしそのDB情報を取得する
Database db2 = settingDoc.Database;
Editor ed2 = settingDoc.Editor;
settingDoc.Window.Focus();

 

// アクティブなドキュメントが正しく設定されたか確認
if (Application.DocumentManager.MdiActiveDocument == settingDoc)
{
ed.WriteMessage("\n移動成功\n");
}
else
{
ed.WriteMessage("\n移動失敗\n");
// return;
}

}

// 新規図面にオブジェクトを貼り付け
ed2.Command("PASTECLIP", new Point3d(0, 0, 0));
ed.WriteMessage("\n貼り付け完了\n");

}

 

 

0 件のいいね
解決済み
571件の閲覧回数
1件の返信
返信 (1)
メッセージ2/2

yoshiyuki.todaka.2019
Explorer
Explorer
解決済み

自己解決しました。下記でコピーに成功しました。

public class Class1
{
[CommandMethod("visionchange")]
public void SetLayerAndLineWeight()
{

Document sourceDoc = Application.DocumentManager.MdiActiveDocument;
Database sourceDb = sourceDoc.Database;
Editor sourceEd = sourceDoc.Editor;

PromptSelectionResult res = sourceEd.SelectAll();
if (res.Status != PromptStatus.OK)
return;

ObjectId[] selectedIds = res.Value.GetObjectIds();

// Create a new ObjectIdCollection and add the selected object ids to it
ObjectIdCollection idsToCopy = new ObjectIdCollection();
foreach (ObjectId id in selectedIds)
{
idsToCopy.Add(id);
}

Document destDoc = Application.DocumentManager.Add("");
Database destDb = destDoc.Database;

using (DocumentLock docLock = destDoc.LockDocument())
{
using (Transaction trans = destDb.TransactionManager.StartTransaction())
{
BlockTable destBt = (BlockTable)trans.GetObject(destDb.BlockTableId, OpenMode.ForWrite);
BlockTableRecord destBtr = (BlockTableRecord)trans.GetObject(destBt[BlockTableRecord.ModelSpace], OpenMode.ForWrite);

IdMapping idMap = new IdMapping();
sourceDb.WblockCloneObjects(idsToCopy, destBtr.ObjectId, idMap, DuplicateRecordCloning.Replace, false);

trans.Commit();
}
}

}