How to use C# to traverse all objects in DWG?

How to use C# to traverse all objects in DWG?

zhengyunyang2019
Advocate Advocate
4,681 Views
9 Replies
Message 1 of 10

How to use C# to traverse all objects in DWG?

zhengyunyang2019
Advocate
Advocate

I need to traverse all objects, and then get the data type of each object. I am using .net api for the first time, I have used objectARX before.

0 Likes
Accepted solutions (1)
4,682 Views
9 Replies
Replies (9)
Message 2 of 10

Alexander.Rivilis
Mentor
Mentor

All objects in ModelSpace/PaperSpace or all objects in Database?

First case is very simple. Second case is more complicated.

Відповідь корисна? Клікніть на "ВПОДОБАЙКУ" цім повідомленням! | Do you find the posts helpful? "LIKE" these posts!
Находите сообщения полезными? Поставьте "НРАВИТСЯ" этим сообщениям!
На ваше запитання відповіли? Натисніть кнопку "ПРИЙНЯТИ РІШЕННЯ" | Have your question been answered successfully? Click "ACCEPT SOLUTION" button.
На ваш вопрос успешно ответили? Нажмите кнопку "УТВЕРДИТЬ РЕШЕНИЕ"


Alexander Rivilis / Александр Ривилис / Олександр Рівіліс
Programmer & Teacher & Helper / Программист - Учитель - Помощник / Програміст - вчитель - помічник
Facebook | Twitter | LinkedIn
Expert Elite Member

0 Likes
Message 3 of 10

_gile
Consultant
Consultant
Accepted solution

@Alexander.Rivilis Not so complicated...

 

Here's an example for both: all objects and all entities in spaces.

 

using Autodesk.AutoCAD.DatabaseServices;
using Autodesk.AutoCAD.Runtime;

using System.Collections.Generic;

using AcAp = Autodesk.AutoCAD.ApplicationServices.Core.Application;

namespace GetAllObjectsInDatabase
{
    public class Commands
    {
        [CommandMethod("TEST1")]
        public static void Test1()
        {
            var doc = AcAp.DocumentManager.MdiActiveDocument;
            var db = doc.Database;
            var ed = doc.Editor;
            foreach (var item in GetAllObjects(db))
            {
                ed.WriteMessage($"\n{item.Key.Handle,-6} {item.Value}");
            }
        }


        [CommandMethod("TEST2")]
        public static void Test2()
        {
            var doc = AcAp.DocumentManager.MdiActiveDocument;
            var db = doc.Database;
            var ed = doc.Editor;
            foreach (var item in GetAllEntities(db))
            {
                ed.WriteMessage($"\n{item.Key.Handle,-6} {item.Value}");
            }
        }

        static Dictionary<ObjectId, string> GetAllObjects(Database db)
        {
            var dict = new Dictionary<ObjectId, string>();
            for (long i = 0; i < db.Handseed.Value; i++)
            {
                if (db.TryGetObjectId(new Handle(i), out ObjectId id))
                    dict.Add(id, id.ObjectClass.Name);
            }
            return dict;
        }

        static Dictionary<ObjectId, string> GetAllEntities(Database db)
        {
            var dict = new Dictionary<ObjectId, string>();
            using (var tr = db.TransactionManager.StartOpenCloseTransaction())
            {
                var bt = (BlockTable)tr.GetObject(db.BlockTableId, OpenMode.ForRead);
                foreach (var btrId in bt)
                {
                    var btr = (BlockTableRecord)tr.GetObject(btrId, OpenMode.ForRead);
                    if (btr.IsLayout)
                    {
                        foreach (var id in btr)
                        {
                            dict.Add(id, id.ObjectClass.Name);
                        }
                    }
                }
                tr.Commit();
            }
            return dict;
        }
    }
}


Gilles Chanteau
Programmation AutoCAD LISP/.NET
GileCAD
GitHub

Message 4 of 10

Alexander.Rivilis
Mentor
Mentor

@_gile 

If you change

for (long i = 0; i < db.Handseed.Value; i++)

with

for (long i = db.BlockTableId.Handle.Value; i < db.Handseed.Value; i++)

it will be more useful. IMHO.

 

 

Відповідь корисна? Клікніть на "ВПОДОБАЙКУ" цім повідомленням! | Do you find the posts helpful? "LIKE" these posts!
Находите сообщения полезными? Поставьте "НРАВИТСЯ" этим сообщениям!
На ваше запитання відповіли? Натисніть кнопку "ПРИЙНЯТИ РІШЕННЯ" | Have your question been answered successfully? Click "ACCEPT SOLUTION" button.
На ваш вопрос успешно ответили? Нажмите кнопку "УТВЕРДИТЬ РЕШЕНИЕ"


Alexander Rivilis / Александр Ривилис / Олександр Рівіліс
Programmer & Teacher & Helper / Программист - Учитель - Помощник / Програміст - вчитель - помічник
Facebook | Twitter | LinkedIn
Expert Elite Member

Message 5 of 10

_gile
Consultant
Consultant

@Alexander.Rivilis  From the tests I did, the BlockTable handle is always 1 😉



Gilles Chanteau
Programmation AutoCAD LISP/.NET
GileCAD
GitHub

0 Likes
Message 6 of 10

Alexander.Rivilis
Mentor
Mentor

@_gile wrote:

@Alexander.Rivilis  From the tests I did, the BlockTable handle is always 1 😉


I have a problem with some dwg-files, posted to me, which start handle is very-very big value.

Відповідь корисна? Клікніть на "ВПОДОБАЙКУ" цім повідомленням! | Do you find the posts helpful? "LIKE" these posts!
Находите сообщения полезными? Поставьте "НРАВИТСЯ" этим сообщениям!
На ваше запитання відповіли? Натисніть кнопку "ПРИЙНЯТИ РІШЕННЯ" | Have your question been answered successfully? Click "ACCEPT SOLUTION" button.
На ваш вопрос успешно ответили? Нажмите кнопку "УТВЕРДИТЬ РЕШЕНИЕ"


Alexander Rivilis / Александр Ривилис / Олександр Рівіліс
Programmer & Teacher & Helper / Программист - Учитель - Помощник / Програміст - вчитель - помічник
Facebook | Twitter | LinkedIn
Expert Elite Member

0 Likes
Message 7 of 10

_gile
Consultant
Consultant

@Alexander.Rivilis  You're right, your silution is more robust and efficient.



Gilles Chanteau
Programmation AutoCAD LISP/.NET
GileCAD
GitHub

0 Likes
Message 8 of 10

zhengyunyang2019
Advocate
Advocate

I can't distinguish between all objects in the model space and all objects in the database, I think they are the same. I want to get all the graphics-related data in the drawing. My job is to use another graphics engine to redraw these data.

 

I remember you, you helped me many times in the objectARX forum, thank you.😀

0 Likes
Message 9 of 10

zhengyunyang2019
Advocate
Advocate

I am learning your code, thank you

0 Likes
Message 10 of 10

Alexander.Rivilis
Mentor
Mentor

@zhengyunyang2019 wrote:

I can't distinguish between all objects in the model space and all objects in the database, I think they are the same...

No. And if you check @_gile  code you can find big difference.

For example, layer, block, layout, etc. also objects but not a part of model space.

Відповідь корисна? Клікніть на "ВПОДОБАЙКУ" цім повідомленням! | Do you find the posts helpful? "LIKE" these posts!
Находите сообщения полезными? Поставьте "НРАВИТСЯ" этим сообщениям!
На ваше запитання відповіли? Натисніть кнопку "ПРИЙНЯТИ РІШЕННЯ" | Have your question been answered successfully? Click "ACCEPT SOLUTION" button.
На ваш вопрос успешно ответили? Нажмите кнопку "УТВЕРДИТЬ РЕШЕНИЕ"


Alexander Rivilis / Александр Ривилис / Олександр Рівіліс
Programmer & Teacher & Helper / Программист - Учитель - Помощник / Програміст - вчитель - помічник
Facebook | Twitter | LinkedIn
Expert Elite Member