Проблема с обновлением количества объектов (Асинхронность работы с объектами)

Автор Тема: Проблема с обновлением количества объектов (Асинхронность работы с объектами)  (Прочитано 14503 раз)

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

Оффлайн Пашин ЕвгенийАвтор темы

  • ADN PRO
  • *
  • Сообщений: 662
  • Карма: 12
  • Skype: pashin.evgeniy
Добрый вечер, очередная проблема:
1. В листах нахожу блоки и взрываю их
2. Нахожу количество объектов до взрыва и после взрыва.
3. Количество объектов после взрыва показывает неверно. Вернее показывает так, словно копирование блоков прошло, а сами блоки не взорваны. По завершению процедуры количество объектов значительно отличается от того, что показывает AutoCAD.

Попробую еще проще объяснить:
1. Открываем чертеж
2. Создаем лист
3. В листе создаем прямоугольник и внутри прямоугольника 100 любых объектов (линии, круги и т.п.)
4. Превращаем все эти объекты в блок
5. Удаляем все посторонние объекты, затем в этот же лист вставляем блок (внутри блока 101 объект)
6. Если выделить все объекты листа, то в свойствах можно увидеть, что объект лишь 1!
7. Затем выполняем процедуру, которая написана в коде
8. В результате количество объектов до взрыва будет 2 (туда, видимо спрятался скрытый видовой экран), а после взрыва покажет 3 объекта!
9. Теперь выделяем все объекты на экране и что мы видим? 102 объекта!

И как теперь быть?


Код - vb.net [Выбрать]
  1. Imports Autodesk.AutoCAD.Runtime
  2. Imports Autodesk.AutoCAD.Interop
  3. Imports Autodesk.AutoCAD.Interop.Common
  4.  
  5.     <CommandMethod("GALAUTODESKENTITIESSHOW", CommandFlags.Session)> _
  6.     Public Sub SPDS_Autodesk_Entities()
  7.         Dim acApp As IAcadApplication = Autodesk.AutoCAD.ApplicationServices.Application.AcadApplication
  8.         Dim acDoc As IAcadDocument = acApp.ActiveDocument
  9.  
  10.         For Each acLayout As IAcadLayout In acDoc.Layouts
  11.             acDoc.ActiveLayout = acLayout
  12.             acApp.ZoomExtents()
  13.  
  14.             Select Case Strings.Trim(acLayout.Name)
  15.                 Case "Model", "Модель", "Элементы оформления"
  16.                 Case Else
  17.  
  18.                     Dim acSelSet As IAcadSelectionSet = acDoc.SelectionSets.Add("SS" & acLayout.Name)
  19.                     acSelSet.SelectOnScreen()
  20.  
  21.                     MsgBox("Before: " & acDoc.ActiveLayout.Block.Count) ' Здесь есть подвох (какой? не понятно!)
  22.  
  23.                     acDoc.SendCommand("_ctab" & vbCr & acLayout.Name & vbCr)
  24.  
  25.                     For Each acEntity As IAcadObject In acSelSet
  26.                         Select Case acEntity.ObjectName
  27.                             Case "AcDbBlockReference"
  28.                                 Dim acEntityCopy As IAcadEntity = acEntity.Copy
  29.                                 acEntityCopy.Layer = "Exploded_Entities"
  30.                                 acDoc.SendCommand("_explode" & vbCr & "(handent """ & acEntityCopy.Handle & """)" & vbCr & vbCr)
  31.                         End Select
  32.                     Next
  33.  
  34.                     MsgBox("After: " & acDoc.ActiveLayout.Block.Count) ' Объектная модель видимо не обновилась!
  35.  
  36.             End Select
  37.  
  38.         Next
  39.  
  40.     End Sub
« Последнее редактирование: 17-09-2015, 15:14:38 от Пашин Евгений »

Оффлайн Алексей Кулик

  • Administrator
  • *****
  • Сообщений: 1115
  • Карма: 173
А разве у вхождения блока нет метода Explode? Правда, у него есть определенные особенности работы, но (насколько я помню) они хотя бы документированы :)
Я бы сразу после строки MsgBox("Before: " & acDoc.ActiveLayout.Block.Count) прошел бы по описанию блока и вывел названия объектов, попавших в него.
P.S. Код может запросто не работать: обработка т.н. NUS-блоков (с разными масштабированиями по разным направлениям) вообще не отслеживается, ну да бог с ним.
P.P.S. Даже если забыть про ненужность Interop, код выглядит недоработанным. Зачем набор примитивов создавать? А если такой набор уже есть?
Все, что сказано - личное мнение.

Правила форума существуют не просто так!

Приводя в сообщении код, не забывайте про его форматирование!

Оффлайн Алексей Кулик

  • Administrator
  • *****
  • Сообщений: 1115
  • Карма: 173
Быстренько создал лист и в него поместил вхождение блока (ВЭ удален, естественно). Прошелся (лиспом, но это неважно) по описанию блока листа и получил список вставленных объектов: "AcDbBlockReference" и "AcDbViewport". Вариантов "добраться" до вхождения нужного блока на нужном листе - немеряно (даже на лиспе; про .net молчу - его я знаю отвратительно).
Все, что сказано - личное мнение.

Правила форума существуют не просто так!

Приводя в сообщении код, не забывайте про его форматирование!


Оффлайн Алексей Кулик

  • Administrator
  • *****
  • Сообщений: 1115
  • Карма: 173
Off-Topic: показать
Лично я на работе не могу использовать этот сервис :(
Все, что сказано - личное мнение.

Правила форума существуют не просто так!

Приводя в сообщении код, не забывайте про его форматирование!

Оффлайн Дмитрий Загорулькин

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 737

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
И как теперь быть?
Забросить COM/ActiveX и написать нормальный код. Ты не понимаешь, что SendCommand срабатывает асинхронно в большинстве случаев?
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Windcastle

  • ADN OPEN
  • **
  • Сообщений: 58
  • Карма: 0
А разве у вхождения блока нет метода Explode

У обычных блоков есть, но у меня необычные блоки и примитивы. У них нет метода "Object.Explode", увы.

Зачем набор примитивов создавать? А если такой набор уже есть?

Мне нужно поискать во взорванных объектах некую информацию: размеры области, занимаемые каждым из объектов внутри блока; цвет; слой, на котором объекты находятся; стиль линии каждого объекта; у текстов - значение текста (ищу все тексты с символами ", ЦВ") и т.д. Разработчики данных блоков и примитивов не хотят делиться своими библиотеками - разработками... Приходится их взрывать.

После того, как я соберу всю информацию, я удалю все эти объекты. Исходные блоки и примитивы остаются нетронутыми. Как будто я и не копался в чертеже.

Забросить COM/ActiveX и написать нормальный код.

Увы, я не обладаю временем, чтобы учиться, а потом (когда-нибудь), эту задачу сдать... Людям нужно работать сейчас. Я учусь... в час по чайной ложке.

Ты не понимаешь, что SendCommand срабатывает асинхронно в большинстве случаев?

Понимаю, но мы уже решали этот вопрос с помощью CommandFlags.Session. И оно действительно работает. Кроме этого случая.

Я зашел в тупик...

Оффлайн Алексей Кулик

  • Administrator
  • *****
  • Сообщений: 1115
  • Карма: 173
Может, проще будет через VBA поиграться с этими примитивами и попытаться понять, что и как там хранится? Я так понимаю, что это совсем не блоки, а какие-то CustomEntity, созданные с использованием ObjectARX. Возможно, для них не предоставляется СОМ-интерфейс (или за него придется платить).
Взрывание объектов и последующее уничтожение полученных примитивов = замусоривание и фрагментация БД чертежа. Я предпочитаю такое не делать.
Можешь предоставить образец такого файла? Честное слово, просто интересно покопаться будет (если завтра меня на работе опять не напрягут по самое не балуй).
Все, что сказано - личное мнение.

Правила форума существуют не просто так!

Приводя в сообщении код, не забывайте про его форматирование!

Оффлайн Алексей Кулик

  • Administrator
  • *****
  • Сообщений: 1115
  • Карма: 173
Естественно, помимо самого файла, опиши еще и задачку. Хотя бы в первом приближении.
Все, что сказано - личное мнение.

Правила форума существуют не просто так!

Приводя в сообщении код, не забывайте про его форматирование!

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Увы, я не обладаю временем, чтобы учиться, а потом (когда-нибудь), эту задачу сдать... Людям нужно работать сейчас. Я учусь... в час по чайной ложке.
Я зашел в тупик...
Это как раз тот случай, когда ты должен бросить всё и учится. Иначе из тупика ты не выйдешь.
У обычных блоков есть, но у меня необычные блоки и примитивы. У них нет метода "Object.Explode", увы.
Если это AcDbBlockReference, то это вставка блока и метод Object.Explode должен работать. Разве что у описания блока стоит признак нерасчленяемости (object.Explodable). Тогда этот признак нужно убрать, а потом уже расчленять.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Пашин ЕвгенийАвтор темы

  • ADN PRO
  • *
  • Сообщений: 662
  • Карма: 12
  • Skype: pashin.evgeniy
Мне казалось, что я зашел в тупик, но у меня есть решение... и если все пройдет хорошо, ответ выложу здесь. (Алилуйя, мне выслали необходимые библиотеки!!!)

Это как раз тот случай, когда ты должен бросить всё и учится. Иначе из тупика ты не выйдешь.

Согласен, но в первую очередь у меня стоит C#!

Если это AcDbBlockReference, то это вставка блока и метод Object.Explode должен работать.

Таковой один из трех объектов, с ним я так и поступаю (я имею ввиду IAcadBlockReference) ))) Остальные имеют другой тип ISiberiaFormat (в этом объекте я ищу уйму всевозможной информации) и ISiberiaNodeMark (от него мне нужен только текст). К последним двум, как раз, у меня и есть "претензии"!

Думаю это только начало: нашел еще объекты ISiberiaBreaking, но в нем вроде ничего интересующего меня нет.

Оффлайн Пашин ЕвгенийАвтор темы

  • ADN PRO
  • *
  • Сообщений: 662
  • Карма: 12
  • Skype: pashin.evgeniy
Можешь предоставить образец такого файла? Честное слово, просто интересно покопаться будет (если завтра меня на работе опять не напрягут по самое не балуй).

Да, конечно! Подготовлю чертеж и документ. Приложу к этому же сообщению.

Заранее, благодарю.
« Последнее редактирование: 18-09-2015, 08:16:23 от Пашин Евгений »

Оффлайн Алексей Кулик

  • Administrator
  • *****
  • Сообщений: 1115
  • Карма: 173
В файле объекты СПДС GraphiCS и SPDS Extension. Если соответствующие (хотя бы) ObjectEnabler'ы загружены - станет намного проще работать именно с соответствующими типами объектов. У меня, к сожалению, нет возможности устанавливать эти дополнения - так что помочь не смогу :(
Все, что сказано - личное мнение.

Правила форума существуют не просто так!

Приводя в сообщении код, не забывайте про его форматирование!

Оффлайн Пашин ЕвгенийАвтор темы

  • ADN PRO
  • *
  • Сообщений: 662
  • Карма: 12
  • Skype: pashin.evgeniy
так что помочь не смогу

Ничего страшного  :)

Найду решение все равно!