Общие вопросы по иерархии

Автор Тема: Общие вопросы по иерархии  (Прочитано 7286 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн LucaАвтор темы

  • ADN OPEN
  • ***
  • Сообщений: 114
  • Карма: 0
Здравствуйте, Уважаемые форумчане.
Совсем заблудился я в этой иерархии. "кто кому Рабинович?" - совсем непонятно стало.
хочу выделить (предварительный выбор) и из выбранного разобрать блоки "в одну сторону", а полилинии "в другую сторону".
для сокращения using и прочие не принципиальные, в данном вопросе, места буду сокращать
начинается всё стандартно:
Код - C# [Выбрать]
  1. public void getAllBlocksByName()
  2.         {
  3.             Document document;
  4.             Editor   editor;
  5.             Database database;
  6.             List<BlockReference> listOfBlocks = new List<BlockReference>(); // для блоков
  7.             List<Polyline> listOfPolylines = new List<Polyline>(); // для полилиний
  8.             using (Transaction transaction = database.TransactionManager.StartTransaction())
  9.                         {
  10.                         PromptSelectionResult promptSelectionResult = editor.SelectImplied();
  11.                         SelectionSet selectionSet;
  12.                         ObjectId[] idArrayEmpty = new ObjectId[0];
  13.                         editor.SetImpliedSelection(idArrayEmpty);
  14.                         promptSelectionResult = editor.GetSelection();
  15.                         if (promptSelectionResult.Status == PromptStatus.OK)
  16.                         {
  17.                             selectionSet = promptSelectionResult.Value;
  18.                             Application.ShowAlertDialog("Number of objects selected: " + selectionSet.Count.ToString());
  19.                             foreach (SelectedObject selectionSetObject in selectionSet)
  20.                             {
  21.                                  if (selectionSetObject != null)
  22.                                 {
  23.                                     Entity entity = transaction.GetObject(selectionSetObject.ObjectId, OpenMode.ForRead) as Entity;
  24.                                     if (entity is BlockReference) { // здесь мне говорят да
  25.                                         Application.ShowAlertDialog("Object is a BlockReference " + entity.ToString());
  26.                                         // output: "Object is a BlockReference Autodesk.AutoCAD.DatabaseServices.Blockreference"
  27.                                         listOfBlocks.Add(entity); // а здесь мне говорят нет: нельзя entity привести к Blockreference
  28.  
  29.                                     }
чего-то я уже ничего не понимаю...
как мне проверить, что есть что в выделенном и разобрать по полочкам??
зачем постоянно "перекладывать" из одного объекта в другой?
нельзя разве получить так, чтобы это была коллекция, итерируя которую сразу понимаешь, что это полилиния, это блок такой-то, это блок такой-то. я понимаю, что entity - сущность, но дальше то что...

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Общие вопросы по иерархии
« Ответ #1 : 13-11-2019, 14:27:10 »
Luca,
Правила форматирования кода на форуме никто не отменял. Исправь!
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Общие вопросы по иерархии
« Ответ #2 : 13-11-2019, 14:28:29 »
Luca,
Я не увидел вопроса. И причем здесь иерархия?
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн LucaАвтор темы

  • ADN OPEN
  • ***
  • Сообщений: 114
  • Карма: 0
Re: Общие вопросы по иерархии
« Ответ #3 : 13-11-2019, 14:36:38 »
Я не увидел вопроса. И причем здесь иерархия?
случайно нажал, до того как полностью сформулировать

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Общие вопросы по иерархии
« Ответ #4 : 13-11-2019, 14:46:11 »
чего-то я уже ничего не понимаю...
Ты хоть один готовый пример посмотрел? У тебя не код, а бред сивой кобылы.
1. Ты присвоил значение document, editor, database? Нет. Почему?
2. Ты воспользовался editor.SelectImplied() для получения набора предварительного выбора. Замечательно. А зачем ты его сразу чистишь?
listOfBlocks.Add(entity); // а здесь мне говорят нет: нельзя entity привести к Blockreference
Ты должен сам привести к BlockReference. BlockReference всегда автоматом приводится к Entity, т.к. BlockReference наследник Entity. А вот обратное преобразование автоматически не происходит, т.к. Entity далеко не всегда BlockReference. Например, может быть Polyline.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн LucaАвтор темы

  • ADN OPEN
  • ***
  • Сообщений: 114
  • Карма: 0
Re: Общие вопросы по иерархии
« Ответ #5 : 13-11-2019, 14:56:36 »
1. Ты присвоил значение document, editor, database? Нет. Почему?
для сокращения using и прочие не принципиальные, в данном вопросе, места буду сокращать

2. Ты воспользовался editor.SelectImplied() для получения набора предварительного выбора. Замечательно. А зачем ты его сразу чистишь?
здесь не в этом дело, опять же для простоты!
сбрасываю для того, чтобы ничего лишнего не попало в предварительный выбор.
как приводить?
Код - C# [Выбрать]
  1. (BlockReference)entity?
  2.  
где все эти зависимости посмотреть можно?
в https://help.autodesk.com/view/OARX/2020/ENU/?guid=OARX-ManagedRefGuide

они просто по алфавиту всё расположили, а если хочешь, что-то проследить, то начинается инструкция jmp
Off-Topic: показать

о вкусах не спорят, но имхо acSSPrompt; acDocEd - бред сивой кабылы, как вы сказали. зачем такое?? интеллисенс хорошо работает, память экономить нет необходимости - загадка...

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Общие вопросы по иерархии
« Ответ #6 : 13-11-2019, 15:02:42 »
Цитата: Luca от 13-11-2019, 13:25:17

    для сокращения using и прочие не принципиальные, в данном вопросе, места буду сокращать

Больше так не делай. Сюда выкладывай нормальный код, а не какие-то куски.
Цитата: Александр Ривилис от 13-11-2019, 13:46:11

    2. Ты воспользовался editor.SelectImplied() для получения набора предварительного выбора. Замечательно. А зачем ты его сразу чистишь?

здесь не в этом дело, опять же для простоты!
сбрасываю для того, чтобы ничего лишнего не попало в предварительный выбор.
Бред. Какая простота? Ты его полностью очистил, т.е. у тебя набор стал пустым (ни одного примитива в нём нет).  Что дальше ты будешь обрабатывать?
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Общие вопросы по иерархии
« Ответ #7 : 13-11-2019, 15:03:46 »
(BlockReference)entity?
Да. Или (entity as BlockReference)
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Общие вопросы по иерархии
« Ответ #8 : 13-11-2019, 15:05:56 »
где все эти зависимости посмотреть можно?
В составе ObjectARX SDK есть classmap\classmap.dwg - в нём иерархия классов.
Ну и тут кратко и немного упрощенно: https://help.autodesk.com/view/OARX/2020/ENU/?guid=GUID-7E64FDE7-C818-4566-ADF8-C40D50D91E32
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн LucaАвтор темы

  • ADN OPEN
  • ***
  • Сообщений: 114
  • Карма: 0
Re: Общие вопросы по иерархии
« Ответ #9 : 13-11-2019, 15:55:57 »
как-то так получилось
Код - C# [Выбрать]
  1. using System;
  2. using System.Collections.Generic;
  3. using Autodesk.AutoCAD.ApplicationServices; // Application
  4. using Autodesk.AutoCAD.DatabaseServices; // Database
  5. using Autodesk.AutoCAD.EditorInput;
  6. // using  activeGeometry = Autodesk.AutoCAD.Geometry;
  7. using Autodesk.AutoCAD;
  8. using Autodesk.AutoCAD.Runtime;
  9. // types
  10. using Transaction = Autodesk.AutoCAD.DatabaseServices.Transaction;
  11. using Database = Autodesk.AutoCAD.DatabaseServices.Database;
  12. // Application
  13. using application = Autodesk.AutoCAD.ApplicationServices.Application;
  14.  
  15. namespace Automation
  16. {
  17.     public class AFS
  18.     {
  19.         [CommandMethod("getAllSelected")]
  20.         public void getAllBlocksByName()
  21.         {
  22.             Document document = Application.DocumentManager.MdiActiveDocument; if (document == null) { Console.WriteLine("Ошибка. Не удалось получить доступ к Document..."); Console.ReadLine(); }
  23.             Editor editor = Application.DocumentManager.MdiActiveDocument.Editor; if (editor == null) { Console.WriteLine("Ошибка. Не удалось получить доступ к Editor..."); Console.ReadLine(); }
  24.             Database database = document.Database; if (database == null) { Console.WriteLine("Ошибка. Не удалось получить доступ к Database..."); Console.ReadLine(); }
  25.             List<BlockReference> listOfBlocks = new List<BlockReference>();
  26.             List<Polyline> listOfPolylines = new List<Polyline>();
  27.             try
  28.             {
  29.                 using (document.LockDocument())
  30.                 {
  31.                     using (Transaction transaction = database.TransactionManager.StartTransaction())
  32.                     {
  33.                         PromptSelectionResult promptSelectionResult = editor.SelectImplied();
  34.                         SelectionSet selectionSet;
  35.                         ObjectId[] idArrayEmpty = new ObjectId[0];
  36.                         editor.SetImpliedSelection(idArrayEmpty);
  37.  
  38.                         promptSelectionResult = editor.GetSelection();
  39.                         if (promptSelectionResult.Status == PromptStatus.OK)
  40.                         {
  41.                             selectionSet = promptSelectionResult.Value;
  42.  
  43.                             Application.ShowAlertDialog("Number of objects selected: " + selectionSet.Count.ToString());
  44.                             foreach (SelectedObject selectionSetObject in selectionSet)
  45.                             {
  46.                                 if (selectionSetObject != null)
  47.                                 {
  48.                                     Entity entity = transaction.GetObject(selectionSetObject.ObjectId, OpenMode.ForRead) as Entity;
  49.                                     if (entity is BlockReference)
  50.                                     {
  51.                                         listOfBlocks.Add((BlockReference)entity);
  52.                                         continue;
  53.                                     }
  54.                                     if (entity is Polyline)
  55.                                     {
  56.                                         listOfPolylines.Add((Polyline)entity);
  57.                                         continue;
  58.                                     }
  59.                                 }                            
  60.                             }
  61.                             Application.ShowAlertDialog(" Game over ");
  62.                             Application.ShowAlertDialog(" Blocks = " + listOfBlocks.Count);
  63.                             Application.ShowAlertDialog(" Polylines = " + listOfPolylines.Count);
  64.                         }
  65.                         transaction.Commit();
  66.                     }
  67.                 }
  68.             }
  69.             catch (Autodesk.AutoCAD.Runtime.Exception exc)
  70.             {
  71.                 editor.WriteMessage("{0}\n", exc.Message);
  72.             }
  73.             application.UpdateScreen();
  74.         }
  75.     }
  76. }
  77.  
а как блоки различать, тк они разные? я так понял Name - это на уровень выше и MgdDbg (не знаю почему полностью не написать было) не показывает такое свойство или я снова не туда смотрю?

Оффлайн LucaАвтор темы

  • ADN OPEN
  • ***
  • Сообщений: 114
  • Карма: 0
Re: Общие вопросы по иерархии
« Ответ #10 : 13-11-2019, 16:03:11 »
Ну и тут кратко и немного упрощенно: https://help.autodesk.com/view/OARX/2020/ENU/?guid=GUID-7E64FDE7-C818-4566-ADF8-C40D50D91E32
это слишком упрощенно )
В составе ObjectARX SDK есть classmap\classmap.dwg - в нём иерархия классов.
это уже "ближе к телу", "как говорил Мопасан". надо будет повнимательнее посмотреть.
Off-Topic: показать
просто сегодня у меня уже 12 часовой рабочий день заканчивается...

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Общие вопросы по иерархии
« Ответ #11 : 13-11-2019, 16:12:41 »
Luca,
1. Чем дальше, тем больше я понимаю что ты не внимательно читаешь то, что я тебе пишу. Я писал, что открытые в транзакции объекты, не доступны после завершения транзакции.
2. В AutoCAD не используют Console.WriteLine и Console.ReadLine. Для этой цели используют Editor.WriteMessage и Editor.GetString
3. Строки 35 - 38 выкинуть.
4.
а как блоки различать, тк они разные?
По имени (Name).
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн LucaАвтор темы

  • ADN OPEN
  • ***
  • Сообщений: 114
  • Карма: 0
Re: Общие вопросы по иерархии
« Ответ #12 : 13-11-2019, 16:36:01 »
Чем дальше, тем больше я понимаю что ты не внимательно читаешь то, что я тебе пишу. Я писал, что открытые в транзакции объекты, не доступны после завершения транзакции.
вопрос не в чтении, а в понимании написанного.  а где за границами операторных скобок {} пытаюсь обратиться к объекту, который открыл?
Off-Topic: показать

для меня транзакция это что другое:
document.transaction.start()
  //code
document.transaction.end()
транзакция это просто операция, которая ограничивает доступ к структуре данных, например, на момент действия кода, чтобы не было коллизий, а здесь мы каким-то образом из тразакции что-то еще и получаем...
В AutoCAD не используют Console.WriteLine и Console.ReadLine. Для этой цели используют Editor.WriteMessage и Editor.GetString
как использовать едитор, если я его ещё не получил или не смог получить
вообще нельзя? (я не пробовал, но имхо с открытием консоли не должно быть проблем)
Off-Topic: показать

в JavaScript намного всё проще:
надо получить что-то по id
Код - Javascript [Выбрать]
  1. document.getElementById("element_id")
  2.  
надо получить по какому-то общему свойству и посмотреть, что лежит внтури - пожалуйста https://jsfiddle.net/wtvb4aoy/
Код - Javascript [Выбрать]
  1. let elements = document.querySelectorAll(''params")
  2. elements.forEach(x=>console.table(x))
  3.  
  4.  


Строки 35 - 38 выкинуть.
те сбрасывать не нужно? а вдруг уже что-то выделенное есть и попадет то, что не должно попасть? или оно само сброситься?

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Общие вопросы по иерархии
« Ответ #13 : 13-11-2019, 16:47:05 »
а где за границами операторных скобок {} пытаюсь обратиться к объекту, который открыл?
Ты добавил объекты в коллекции для какой-то цели...
для меня транзакция это что другое:
Что для тебя транзакция - это абсолютно не важно. Ты собираешься программировать для AutoCAD? Вот и разбирайся что такое Transaction в AutoCAD и как с этим можно и нужно работать.
как использовать едитор, если я его ещё не получил или не смог получить
вообще нельзя?
Это вряд ли. В обычной команде и Document не null и соответственно Editor не null. И если у тебя Document равен null, то у тебя не открыт ни один чертеж и соответственно ты просто должен завершить команду и ничего не выдавать - тебе нечего в такой ситуации делать.
я не пробовал, но имхо с открытием консоли не должно быть проблем
А ты попробуй. Воообще-то AutoCAD - не консольное приложение.
е сбрасывать не нужно? а вдруг уже что-то выделенное есть и попадет то, что не должно попасть? или оно само сброситься?
Запусти уже наконец свой код в AutoCAD под отладчиком и посмотри что получится.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн avc

  • ADN Club
  • *****
  • Сообщений: 805
  • Карма: 166
    • Мои плагины к Автокаду
Re: Общие вопросы по иерархии
« Ответ #14 : 13-11-2019, 16:48:41 »
Короче так:
Код - C# [Выбрать]
  1.                                     if (entity is BlockReference br)
  2.                                     {
  3.                                         listOfBlocks.Add(br);
  4.                                         if (br.Name== ........ ) ..............
  5.                                         continue;
  6.                                     }
  7.                                     if (entity is Polyline pl)
  8.                                     {
  9.                                         listOfPolylines.Add(pl);
  10.                                         continue;
  11.                                     }
а если еще надо добавить типов, то уже однозначно в switch(entity) { case Polyline pl: .....
И к тому же нет смысла открывать все подряд entity. Лучше заранее проверить тип ObjectId.ObjectClass. А  в общем случае еще бы не плохо проверять ObjectId на IsNull, IsValid, IsErased
А различать ссылки на блок можно не только по имени но и по BlockTableRecord. Предвижу, что далее тебе понадобятся свойства самого блока, а не ссылки - открывай BTR.
Какой класс от кого унаследован прекрасно видно в VisualStudio по F12  или в Обозревателе Объектов.

Оффлайн LucaАвтор темы

  • ADN OPEN
  • ***
  • Сообщений: 114
  • Карма: 0
Re: Общие вопросы по иерархии
« Ответ #15 : 14-11-2019, 04:29:47 »
А ты попробуй. Воообще-то AutoCAD - не консольное приложение.
просто консоль не запустилась. хотя не понятно почему я не могу в stdout что-то отправить... фиг с ней, с консолью. убрал все эти проверки.
Запусти уже наконец свой код в AutoCAD под отладчиком и посмотри что получится.
это как? ))) "О, сколько нам открытий чудных..." где об этом можно узнать?
Ты добавил объекты в коллекции для какой-то цели...
хотите сказать, что за границами операторных скобок ссылки на объекты, которые я получил "битые"? А ObjectId, я так понял, константные и их можно хоть в текстовом файле хранить и при следующем случае получать снова тот же объект по id?



И к тому же нет смысла открывать все подряд entity. Лучше заранее проверить тип ObjectId.ObjectClass.
для меня это пустые слова - я искренне не понимаю о чем речь - как на китайском!
А различать ссылки на блок можно не только по имени но и по BlockTableRecord. Предвижу, что далее тебе понадобятся свойства самого блока, а не ссылки - открывай BTR.
снова китайская грамота... (
для меня btr - это блок, в первую очередь... а получается, что блок-блок и полилиния - блок... я полагал, что есть таблица блоков, в которой хранятся все блоки и есть бтр - интстанс конкретного блока, а получается, что вообще всё есть btr что ли?


Оффлайн trir

  • ADN Club
  • ****
  • Сообщений: 470
  • Карма: 63
Re: Общие вопросы по иерархии
« Ответ #16 : 14-11-2019, 10:53:45 »
Цитировать
это как?
https://docs.microsoft.com/ru-ru/visualstudio/debugger/attach-to-running-processes-with-the-visual-studio-debugger?view=vs-2019

Цитировать
А ObjectId, я так понял, константные и их можно хоть в текстовом файле хранить и при следующем случае получать снова тот же объект по id?
нет

Цитировать
хотите сказать, что за границами операторных скобок ссылки на объекты, которые я получил "битые"?
да

Цитировать
я искренне не понимаю о чем речь
учи dxf

Оффлайн Владимир Шу

  • ADN Club
  • *****
  • Сообщений: 611
  • Карма: 155
    • ПГСу Бложик
Re: Общие вопросы по иерархии
« Ответ #17 : 14-11-2019, 11:09:47 »
для меня это пустые слова - я искренне не понимаю о чем речь - как на китайском!
Код - C# [Выбрать]
  1. if (id.ObjectClass.IsDerivedFrom(Rtm.RXObject.GetClass(typeof(Db.BlockReference))))
  2. {
  3. }

Оффлайн trir

  • ADN Club
  • ****
  • Сообщений: 470
  • Карма: 63
Re: Общие вопросы по иерархии
« Ответ #18 : 14-11-2019, 11:12:10 »
Код - vb.net [Выбрать]
  1.     Public Shared Function CrTbl(acDoc As MyAcAs.Document) As MyTable
  2.         'Создаём таблицу
  3.         Dim ed As Editor = acDoc.Editor
  4.         Dim objIdArray() As ObjectId = MyTable.GetSelect(ed) 'Получаем от пользователя набор данных для парсинга
  5.         If objIdArray IsNot Nothing Then
  6.             Dim dbObj As DBObject
  7.             Dim wList As New List(Of Line)
  8.             Dim wTList As New List(Of DBText)
  9.             Dim wMTList As New List(Of MText)
  10.             Using tr As Transaction = acDoc.Database.TransactionManager.StartTransaction
  11.                 Try
  12.                     For Each objId As ObjectId In objIdArray
  13.                         dbObj = tr.GetObject(objId, OpenMode.ForRead)
  14.                         'Сортируем полученные объекты
  15.                         Select Case True
  16.                             Case TypeOf dbObj Is Line
  17.                                 wList.Add(dbObj)
  18.                             Case TypeOf dbObj Is Polyline
  19.                                 wList.AddRange(MyTable.PolyToLine(dbObj))
  20.                             Case TypeOf dbObj Is DBText
  21.                                 wTList.Add(dbObj)
  22.                             Case TypeOf dbObj Is MText
  23.                                 wMTList.Add(dbObj)
  24.                         End Select
  25.                     Next
  26.                     tr.Commit()
  27.                 Catch ex As Exception
  28.                     ed.WriteMessage(ex.ToString())
  29.                     tr.Abort()
  30.                 End Try
  31.             End Using
  32.             '
  33.             Dim wMTbl As MyTable = MyTable.CrTbl(wList)
  34.             'Заполняем текстом
  35.             For Each wt In wTList
  36.                 wMTbl.SetValue(wt)
  37.             Next
  38.             For Each wmt In wMTList
  39.                 wMTbl.SetValue(wmt)
  40.             Next
  41.             Return wMTbl
  42.         Else
  43.             Return Nothing
  44.         End If
  45.     End Function
https://github.com/triroakenshield/tblPrs/blob/master/TableParser/MyTable.vb

Оффлайн avc

  • ADN Club
  • *****
  • Сообщений: 805
  • Карма: 166
    • Мои плагины к Автокаду
Re: Общие вопросы по иерархии
« Ответ #19 : 14-11-2019, 11:18:32 »
хотите сказать, что за границами операторных скобок ссылки на объекты, которые я получил "битые"?
Хоспидя... Объекты открытые в транзакции принадлежат ей и диспозятся ей. Как только вы вызываете Commit, Abort или Dispose транзакции (а вы его вызываете не явно, а через using) - объекты уничтожаются. Так что создавайте ваши массивы ВНУТРИ блока using(Transaction...
А ObjectId, я так понял, константные и их можно хоть в текстовом файле хранить
Нельзя. У них есть OldIdPtr который уникален во всей БД чертежа, но он меняется при перезагрузках. И есть Handle, который хранится в чертеже, не меняется. Но с ним другая проблема - он не уникален, т.к. объекты во внешних ссылках запросто могут иметь такие же Handle. Если надо сохранять ссылки на объекты чертежа, для этого есть особые типы записей в xData. Но вообще другая тема. Короче, используйте ObjectId так как во всех примерах.

Оффлайн avc

  • ADN Club
  • *****
  • Сообщений: 805
  • Карма: 166
    • Мои плагины к Автокаду
Re: Общие вопросы по иерархии
« Ответ #20 : 14-11-2019, 11:33:00 »
для меня btr - это блок, в первую очередь... а получается, что блок-блок и полилиния - блок... я полагал, что есть таблица блоков, в которой хранятся все блоки и есть бтр - интстанс конкретного блока, а получается, что вообще всё есть btr что ли?
Я писал про ссылки на блок (BlockReference). Да btr - это и есть блок. В btr модели и листов хранятся все видимые Entity чертежа. В чертеж (т.е. в BTR "ModelSpace") вставляется ссылка (BlockReference) на блок (BTR). Таким образом получает сколько угодно уровней вложенности блоков в блоки. И один блок (BTR) может быть сколько угодно раз вставлен в чертеж и в другие блоки за счет использования BlockReference.
А таблица блоков просто хранит список ObjectId всех BTR, чтоб их можно было как-то найти, перебрать, выбрать нужный по имени. В том числе в ней всегда можно найти идентификатор модели.
Инстанс - это терминология ООП, а не базы данных чертежа DWG.
Полилиния тут не при чем. Это обычный Entity, не блок. Она, как и все остальные Entity может сохраняться только в каком нибудь BTR. Например, в модели.

Оффлайн avc

  • ADN Club
  • *****
  • Сообщений: 805
  • Карма: 166
    • Мои плагины к Автокаду
Re: Общие вопросы по иерархии
« Ответ #21 : 14-11-2019, 11:49:15 »
Код - C# [Выбрать]
  1. if (id.ObjectClass.IsDerivedFrom(Rtm.RXObject.GetClass(typeof(Db.BlockReference))))
  2. {
  3. }
Вот так, через IsDerivedFrom,  можно получить все блоки, плюс массивы, плюс таблицы и все что унаследовано от блоков. Иногда это полезно. Но в данном случае скорее всего нужны именно блоки, заменяем на == или сравниваем типы по имени id.ObjectClass.Name  == "AcDbBlockReference"

Оффлайн Владимир Шу

  • ADN Club
  • *****
  • Сообщений: 611
  • Карма: 155
    • ПГСу Бложик
Re: Общие вопросы по иерархии
« Ответ #22 : 14-11-2019, 11:52:54 »
Вот так, через IsDerivedFrom,  можно получить все блоки, плюс массивы, плюс таблицы и все что унаследовано от блоков. Иногда это полезно.
Тут немного другое, тут проверяется что объект с заданным id наследован от класса BlockReference. (Дословно Is Derived From == Производный от)

Оффлайн avc

  • ADN Club
  • *****
  • Сообщений: 805
  • Карма: 166
    • Мои плагины к Автокаду
Re: Общие вопросы по иерархии
« Ответ #23 : 14-11-2019, 11:54:22 »
Да, да. Я именно про это и пытался написать максимально простыми словами :)

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Общие вопросы по иерархии
« Ответ #24 : 14-11-2019, 11:57:06 »
Вот так, через IsDerivedFrom,  можно получить все блоки, плюс массивы, плюс таблицы и все что унаследовано от блоков. Иногда это полезно.
Тут немного другое, тут проверяется что объект с заданным id наследован от класса BlockReference. (Дословно Is Derived From == Производный от)
Table унаслендован от BlockReference - соответственно таблицы тоже могут пройти этот фильтр, а это в данном случае лишнее.
Об этом avc как раз и писал.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Владимир Шу

  • ADN Club
  • *****
  • Сообщений: 611
  • Карма: 155
    • ПГСу Бложик
Re: Общие вопросы по иерархии
« Ответ #25 : 14-11-2019, 12:02:22 »
ага, по разному поняли друг друга. Подумалось, что получить все, это из чертежа получить... =)