

IJCAD 2018 MechanicalでC#で開発を行っております。

プログラム上で図面全体の矩形座標を取得する際に  
図面からかなり離れた座標を取得してしまうことがあります。

対象の図面を開いてクイック選択をしたり、ZOOMコマンドでEを実行したりしても  
その座標には何も存在しません。  
PURGEコマンドを実行して図面を保存してから再度プログラムで処理を行っても  
やはり大きい座標が取得されてしまいます。

図面の矩形座標を取得するプログラムは下記の通りです。

[code]

    minX = double.MaxValue;
    minY = double.MaxValue;
    maxX = double.MinValue;
    maxY = double.MinValue;
    Document acDoc = GrxCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument;
    Database acCurDb = acDoc.Database;
    try
    {
        // ドキュメントをロックする
        using (acDoc.LockDocument())
        using (Transaction acTrans = acCurDb.TransactionManager.StartTransaction())
        using (LayerTable acLayTbl = acTrans.GetObject(acCurDb.LayerTableId, OpenMode.ForWrite) as LayerTable)
        {
            // オブジェクトを取得
            PromptSelectionResult acRes = acDoc.Editor.SelectAll();
            if (acRes.Value.Count != 0)
            {
                foreach (ObjectId acObjId in acRes.Value.GetObjectIds())
                {
                    using (Entity acEnt = acTrans.GetObject(acObjId, OpenMode.ForRead) as Entity)
                    {
                        // 非表示を除外する
                        if (acLayTbl.Has(acEnt.Layer))
                        {
                            using (LayerTableRecord acLyrTblRec = acTrans.GetObject(acLayTbl[acEnt.Layer], OpenMode.ForWrite) as LayerTableRecord)
                            {
                                if (acLyrTblRec.IsOff)
                                {
                                    continue;
                                }
                            }
                        }
                        if (acEnt.Visible == false)
                        {
                            continue;
                        }
    
                        if (acEnt.Bounds.HasValue)
                        {
                            if (acEnt.GeometricExtents.MinPoint.X.CompareTo(minX) < 0)
                            {
                                minX = acEnt.GeometricExtents.MinPoint.X;
                            }
                            if (acEnt.GeometricExtents.MaxPoint.X.CompareTo(maxX) > 0)
                            {
                                // おかしな値を取得する
                                maxX = acEnt.GeometricExtents.MaxPoint.X;
                            }
                            if (acEnt.GeometricExtents.MinPoint.Y.CompareTo(minY) < 0)
                            {
                                minY = acEnt.GeometricExtents.MinPoint.Y;
                            }
                            if (acEnt.GeometricExtents.MaxPoint.Y.CompareTo(maxY) > 0)
                            {
                                // おかしな値を取得する
                                maxY = acEnt.GeometricExtents.MaxPoint.Y;
                            }
                        }
                    }
                }
            }
        }
    }
    
[/code]

上記のプログラム上でmaxXやmaxYを見ると  
500前後のオブジェクトに加えて7000近い値のオブジェクトが混ざってしまいます。

どのようにすれば図面からそのオブジェクトを削除する  
あるいはプログラム上でそのオブジェクトを判断して除外することが  
できるのでしょうか？


CC BY-SA 4.0
2019-04-19T06:37:39.143
54315
2019-10-07T14:31:52.407
2019-04-19T07:41:17.250
3060
30311
question
c# .net ijcad
IJCAD 2018 Mechanicalで座標を取得する時に図面から大きく離れた座標を取得してしまう


すべての図形を取得したいという場合、モデル空間もしくはレイアウト空間ブロックに対してオブジェクトのイテレータを使うのもありです。  
SelectAll()に図形フィルタを渡して、非表示の画層は除外する(GC8で非表示画層を指定して、-4のNOT式を併用)、一時的に非表示(GC60)の図形も除外するというのを渡せば、ループの中で図形を除外する必要はなくなります。  
図形境界は加算が可能なのでそれを使ってみてはいかがでしょうか？

[code]

        public void cmdGetExtents2()
        {
            var doc = Application.DocumentManager.MdiActiveDocument;
            var ed = doc.Editor;
            var res = ed.SelectAll();
            var ext = new Extents3d();
            using (var tr = doc.TransactionManager.StartTransaction())
            {
                foreach(SelectedObject obj in res.Value)
                {
                    var ent = tr.GetObject(obj.ObjectId, OpenMode.ForRead) as Entity;
                    ext.AddExtents( ent.GeometricExtents);
                }
                ed.WriteMessage("\nEXT={0}", ext.ToString());
                tr.Commit();
            }
        }
    
[/code]


CC BY-SA 4.0
2019-10-07T14:31:52.407
59540
2019-10-07T14:31:52.407
36080
54315
answer