Сообщество программистов Autodesk в СНГ

ADN Club => AutoCAD .NET API => Тема начата: Пашин Евгений от 17-09-2015, 14:27:53

Название: Проблема с обновлением количества объектов (Асинхронность работы с объектами)
Отправлено: Пашин Евгений от 17-09-2015, 14:27:53
Добрый вечер, очередная проблема:
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
Название: Re: Проблема с обновлением количества объектов (Асинхронность работы с объектами)
Отправлено: Алексей Кулик от 17-09-2015, 15:44:31
А разве у вхождения блока нет метода Explode? Правда, у него есть определенные особенности работы, но (насколько я помню) они хотя бы документированы :)
Я бы сразу после строки MsgBox("Before: " & acDoc.ActiveLayout.Block.Count) прошел бы по описанию блока и вывел названия объектов, попавших в него.
P.S. Код может запросто не работать: обработка т.н. NUS-блоков (с разными масштабированиями по разным направлениям) вообще не отслеживается, ну да бог с ним.
P.P.S. Даже если забыть про ненужность Interop, код выглядит недоработанным. Зачем набор примитивов создавать? А если такой набор уже есть?
Название: Re: Проблема с обновлением количества объектов (Асинхронность работы с объектами)
Отправлено: Алексей Кулик от 17-09-2015, 15:48:17
Быстренько создал лист и в него поместил вхождение блока (ВЭ удален, естественно). Прошелся (лиспом, но это неважно) по описанию блока листа и получил список вставленных объектов: "AcDbBlockReference" и "AcDbViewport". Вариантов "добраться" до вхождения нужного блока на нужном листе - немеряно (даже на лиспе; про .net молчу - его я знаю отвратительно).
Название: Re: Проблема с обновлением количества объектов (Асинхронность работы с объектами)
Отправлено: Дмитрий Загорулькин от 17-09-2015, 15:59:13
Off-Topic: показать
Лучше 1 раз увидеть  ;)
https://screencast.autodesk.com/
Название: Re: Проблема с обновлением количества объектов (Асинхронность работы с объектами)
Отправлено: Алексей Кулик от 17-09-2015, 16:00:53
Off-Topic: показать
Лично я на работе не могу использовать этот сервис :(
Название: Re: Проблема с обновлением количества объектов (Асинхронность работы с объектами)
Отправлено: Дмитрий Загорулькин от 17-09-2015, 16:15:27
Off-Topic: показать
Ну так это лишь один из вариантов... http://bit.ly/1LAbG13
Название: Re: Проблема с обновлением количества объектов (Асинхронность работы с объектами)
Отправлено: Александр Ривилис от 17-09-2015, 16:39:16
И как теперь быть?
Забросить COM/ActiveX и написать нормальный код. Ты не понимаешь, что SendCommand срабатывает асинхронно в большинстве случаев?
Название: Re: Проблема с обновлением количества объектов (Асинхронность работы с объектами)
Отправлено: Windcastle от 17-09-2015, 21:15:00
А разве у вхождения блока нет метода Explode

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

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

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

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

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

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

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

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

Я зашел в тупик...
Название: Re: Проблема с обновлением количества объектов (Асинхронность работы с объектами)
Отправлено: Алексей Кулик от 17-09-2015, 21:41:48
Может, проще будет через VBA поиграться с этими примитивами и попытаться понять, что и как там хранится? Я так понимаю, что это совсем не блоки, а какие-то CustomEntity, созданные с использованием ObjectARX. Возможно, для них не предоставляется СОМ-интерфейс (или за него придется платить).
Взрывание объектов и последующее уничтожение полученных примитивов = замусоривание и фрагментация БД чертежа. Я предпочитаю такое не делать.
Можешь предоставить образец такого файла? Честное слово, просто интересно покопаться будет (если завтра меня на работе опять не напрягут по самое не балуй).
Название: Re: Проблема с обновлением количества объектов (Асинхронность работы с объектами)
Отправлено: Алексей Кулик от 17-09-2015, 21:42:13
Естественно, помимо самого файла, опиши еще и задачку. Хотя бы в первом приближении.
Название: Re: Проблема с обновлением количества объектов (Асинхронность работы с объектами)
Отправлено: Александр Ривилис от 17-09-2015, 23:45:27
Увы, я не обладаю временем, чтобы учиться, а потом (когда-нибудь), эту задачу сдать... Людям нужно работать сейчас. Я учусь... в час по чайной ложке.
Я зашел в тупик...
Это как раз тот случай, когда ты должен бросить всё и учится. Иначе из тупика ты не выйдешь.
У обычных блоков есть, но у меня необычные блоки и примитивы. У них нет метода "Object.Explode", увы.
Если это AcDbBlockReference, то это вставка блока и метод Object.Explode должен работать. Разве что у описания блока стоит признак нерасчленяемости (object.Explodable). Тогда этот признак нужно убрать, а потом уже расчленять.
Название: Re: Проблема с обновлением количества объектов (Асинхронность работы с объектами)
Отправлено: Пашин Евгений от 18-09-2015, 06:43:18
Мне казалось, что я зашел в тупик, но у меня есть решение... и если все пройдет хорошо, ответ выложу здесь. (Алилуйя, мне выслали необходимые библиотеки!!!)

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

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

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

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

Думаю это только начало: нашел еще объекты ISiberiaBreaking, но в нем вроде ничего интересующего меня нет.
Название: Re: Проблема с обновлением количества объектов (Асинхронность работы с объектами)
Отправлено: Пашин Евгений от 18-09-2015, 07:25:41
Можешь предоставить образец такого файла? Честное слово, просто интересно покопаться будет (если завтра меня на работе опять не напрягут по самое не балуй).

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

Заранее, благодарю.
Название: Re: Проблема с обновлением количества объектов (Асинхронность работы с объектами)
Отправлено: Алексей Кулик от 18-09-2015, 09:22:20
В файле объекты СПДС GraphiCS и SPDS Extension. Если соответствующие (хотя бы) ObjectEnabler'ы загружены - станет намного проще работать именно с соответствующими типами объектов. У меня, к сожалению, нет возможности устанавливать эти дополнения - так что помочь не смогу :(
Название: Re: Проблема с обновлением количества объектов (Асинхронность работы с объектами)
Отправлено: Пашин Евгений от 18-09-2015, 10:23:55
так что помочь не смогу

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

Найду решение все равно!
Название: Re: Проблема с обновлением количества объектов (Асинхронность работы с объектами)
Отправлено: Александр Ривилис от 23-09-2015, 13:22:19
Тему разделил. Часть связанную с получением информации о рамке/формате из Autodesk SPDS перенёс сюда: http://adn-cis.org/forum/index.php?topic=3039.0