

IJCAD2021 PROのカスタマイズコマンドをC#にて作成しております。  
現在開発中のアプリケーションで、とあるダイナミックブロックの図面を別図面にコピーする処理を考えています。  
しかし、実際にプログラムでコピーを行うとダイナミックブロックで可視性などのカスタムをしていた情報が  
失われてしまい、通常のブロックになってしまいます。  
コピー処理にはWblockCloneObjectsメソッドを使用していたのですが  
DeepCloneObjectsメソッドに変えてみた所、図面に図形が表示されなくなってしまい期待通りにはなりませんでした。  
カスタム情報を維持したまま別図面にコピーする方法をご教授いただけませんでしょうか。

[code]

        public static void Main()
        {
            string filePath = @"C:\sample.dwg"; // ダイナミックブロックファイル
    
            Document document = Application.DocumentManager.MdiActiveDocument;
            using ( Transaction transaction = document.Database.TransactionManager.StartTransaction() )
            using ( var blockTable = transaction.GetObject( document.Database.BlockTableId, OpenMode.ForRead ) as BlockTable )
            using ( var blockTableRecord = transaction.GetObject( document.Database.CurrentSpaceId, OpenMode.ForWrite ) as BlockTableRecord )
            using ( var symbolBlock = new BlockTableRecord() )
            using ( var symbolDwgDatabase = new Database( false, true ) )
            {
                symbolBlock.Name = "testName";
                blockTable.UpgradeOpen();
                ObjectId symbolBlockId = blockTable.Add( symbolBlock );
                transaction.AddNewlyCreatedDBObject( symbolBlock, true );
    
                symbolDwgDatabase.ReadDwgFile( filePath, FileOpenMode.OpenForReadAndAllShare, false, string.Empty );
                symbolDwgDatabase.CloseInput( true );
                using ( Transaction symbolDwgTransaction = symbolDwgDatabase.TransactionManager.StartTransaction() )
                using ( var symbolDwgBlockTable = symbolDwgTransaction.GetObject( symbolDwgDatabase.BlockTableId, OpenMode.ForRead ) as BlockTable )
                using ( var symbolDwgBlock = symbolDwgTransaction.GetObject( symbolDwgBlockTable[ "sampleBlock" ], OpenMode.ForRead ) as BlockTableRecord )
                {
                    var symbolDwgIds = new ObjectIdCollection();
                    foreach ( var objectId in symbolDwgBlock )
                    {
                        symbolDwgIds.Add( objectId );
                    }
                    using ( var icMap = new IdMapping() )
                    {
                        // DeepCloneObjectsでは図面に反映されない
                        //symbolDwgDatabase.DeepCloneObjects( symbolDwgIds, symbolBlockId, icMap, false );
                        symbolDwgDatabase.WblockCloneObjects( symbolDwgIds, symbolBlockId, icMap, DuplicateRecordCloning.Replace, false );
                    }
                    symbolDwgTransaction.Commit();
                }
    
                using ( var blockReference = new BlockReference( Point3d.Origin, symbolBlockId ) )
                {
                    blockReference.UpgradeOpen();
                    blockReference.Layer = "0";
                    blockTableRecord.AppendEntity( blockReference );
                    transaction.AddNewlyCreatedDBObject( blockReference, true );
                }
                transaction.Commit();
            }
        }
    
[/code]


CC BY-SA 4.0
2021-12-17T06:59:03.610
85192
2022-02-10T07:07:05.440
30311
question
c# .net ijcad
IJCAD2021 PROのダイナミックブロックのコピーについて


> ダイナミックブロックの図面を別図面にカスタム情報を維持したまま  
>  コピーする方法をご教授いただけませんでしょうか。

図面を別図面にブロックとしてコピーする場合は、  
図面全体が丸ごと1つのブロックとして定義される為、  
カスタム情報はそのブロックが参照する構成要素のダイナミックブロックが保持しています。

そのため、コピーした図面のブロックを挿入後にEXPLODEで分解するか、  
図面に定義されている各々のダイナミックブロックを  
それぞれ複写先の図面にコピーする必要があります。

> DeepCloneObjectsメソッドに変えてみた所、  
>  図面に図形が表示されなくなってしまい期待通りにはなりませんでした。

Database.DeepCloneObjects()メソッドは、  
同じ図面データベース内でのディープクローンで使用するAPIです。  
異なる図面間でブロックを複写する方法は以下などがあります。  
・Database.WblockCloneObjects()メソッドで、図面間で指定したオブジェクトをコピーする  
・Database.Wblock()メソッドで指定したオブジェクトを別図面に書き出し、  
Database.Insert()メソッドで挿入する


CC BY-SA 4.0
2022-02-10T07:07:05.440
86249
2022-02-10T07:07:05.440
51364
85192
answer