51216


IJCAD 2018 MechanicalでC#を使用してAutoCADのソースを移植する作業を行っております。

処理の一つに図面を印刷する機能があるのですが  
図面が小さい場合はモデル空間に作図された図面をそのまま印刷し、  
図面が大きい場合はレイアウト空間に図面を移動させて  
範囲を指定してズームを行い、分割して印刷する機能があります。

レイアウト空間に移動を行う理由は、印刷対象となる図面には図枠が存在するのですが  
その図枠の中だけを拡大したいため、ビューポートを利用しているからです。

図面が小さい場合の印刷は正常にできるのですが、  
図面が大きい場合のレイアウト空間に移動を行う処理で  
BlockTableRecordのNameに値を設定しても反映されない不具合が発生しています。

[code]

    Document acDoc = Application.DocumentManager.MdiActiveDocument;
    Database acCurDb = acDoc.Database;
    
    using (acDoc.LockDocument())
    using (Transaction acTrans = acCurDb.TransactionManager.StartTransaction())
    {
        // カレントレイアウトの切替
        LayoutManager acLayoutMgr = LayoutManager.Current;
    
        // テンプレートファイル読み込み用データベース
        Database acExDb = new Database(false, true);
        acExDb.ReadDwgFile("テンプレートファイルパス", FileOpenMode.OpenForReadAndAllShare, true, "");
    
        // テンプレートファイル読み込み用データベースのトランザクション
        using (Transaction acTransEx = acExDb.TransactionManager.StartTransaction())
        {
            // レイアウト情報取得
            DBDictionary layoutsEx = acTransEx.GetObject(acExDb.LayoutDictionaryId, OpenMode.ForRead) as DBDictionary;
    
    　　　　// 指定レイアウトの存在チェック
    　　　　if (layoutsEx.Contains("レイアウト名"))
    　　　　{
               // 実レイアウト取得
               Layout layEx = layoutsEx.GetAt("レイアウト名").GetObject(OpenMode.ForRead) as Layout;
               BlockTableRecord blkBlkRecEx = acTransEx.GetObject(layEx.BlockTableRecordId, OpenMode.ForRead) as BlockTableRecord;
    
               // レイアウト用オブジェクトコレクション設定
               ObjectIdCollection idCol = new ObjectIdCollection();
               foreach (ObjectId id in blkBlkRecEx)
               {
                   idCol.Add(id);
               }
    
               // カレント図面のブロックテーブルを書き込みモードでオープン
               BlockTable blkTbl = acTrans.GetObject(acCurDb.BlockTableId, OpenMode.ForWrite) as BlockTable;
    
               using (BlockTableRecord blkBlkRec = new BlockTableRecord())
               {
                   int layoutCount = layoutsEx.Count - 1;
    
                   blkTblRec.Name = "*Paper_Space" + layoutCount.ToString(); // ←ブレークで止めて実行してもエラーにはならないがNameの中身が""のまま
    
    　　　　        blkTbl.Add(blkBlkRec); // ←ここでエラーeEmptyRecordNameが発生する
    
                   acTrans.AddNewlyCreatedDBObject(blkTblRec, true);
    
                   using (IdMapping icMap = new IdMapping())
                   {
                       acExDb.WblockCloneObjects(idCol,
                                                 blkTblRec.ObjectId,
                                                 icMap,
                                                 DuplicateRecordCloning.Ignore,
                                                 false);
                   }
    
[/code]

AutoCADと同じソースなのですが、AutoCADではblkTblRec.Nameに値が設定され  
blkTbl.Add(blkBlkRec)が正常に動くのですが  
IJCADではblkTblRec.Nameが""のままでblkTbl.Add(blkBlkRec)で落ちてしまいます。

eEmptyRecordNameで検索したり  
IJCADの公式の「レイアウトを印刷する」ヘルプなどを調べたりしましたが、  
解決することができませんでした。

なぜNameに値が設定できないのでしょうか。


CC BY-SA 4.0
2018-12-14T07:29:52.793
51202
2018-12-17T04:34:22.097
2018-12-17T04:34:22.097
30311
30311
question
.net ijcad
IJCADで印刷処理を行う時にBlockTableRecordのNameに値を設定しても反映されない


IJCADではAutoCADと違い、"*Paper_Space"のようにペーパー空間名をBlockTableBlock.Nameプロパティに割り当てることは出来ません。  
IJCADで外部の図面からレイアウトを読み込むのであれば、LayoutManager.CreateLayoutメソッドでレイアウトを作成した後に、レイアウトのブロックテーブルレコードに読み込む元のオブジェクトをコピーすることで実現できると思います。

[code]

    var path = "filepath";
    var layoutName = "TESTLAYOUT";
    var db = HostApplicationServices.WorkingDatabase;
    using (var exDb = new Database(false, true))
    {
        exDb.ReadDwgFile(path, FileOpenMode.OpenForReadAndAllShare, true, "");
        using (var exTr = exDb.TransactionManager.StartTransaction())
        {
            var exLayout = exDb.LayoutDictionaryId.GetObject(OpenMode.ForRead) as DBDictionary;
            if(exLayout.Contains(layoutName))
            {
                var exLay = exLayout.GetAt(layoutName).GetObject(OpenMode.ForRead) as Layout;                 var exBtr = exLay.BlockTableRecordId.GetObject(OpenMode.ForRead) as BlockTableRecord;
                var exIds = new ObjectIdCollection(exBtr.Cast<ObjectId>().ToArray());
    
                var LayMgr = LayoutManager.Current;
                var layId = LayMgr.CreateLayout(layoutName);
    
                using (var tr = db.TransactionManager.StartTransaction())
                {
                    using (var lay = layId.GetObject(OpenMode.ForRead) as Layout)
                    {
                        using (var map = new IdMapping())
                        {
                            exDb.WblockCloneObjects(exIds, lay.BlockTableRecordId, map, DuplicateRecordCloning.Ignore, false);
                        }
                    }
                    tr.Commit();
                }
            }
        }
    }
    
[/code]


CC BY-SA 4.0
2018-12-14T09:00:10.897
51216
2018-12-14T09:00:10.897
51202
answer