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

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

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  или в Обозревателе Объектов.