Найти все примитивы, по типу, из которых состоят блоки в чертеже.

Автор Тема: Найти все примитивы, по типу, из которых состоят блоки в чертеже.  (Прочитано 15769 раз)

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

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

  • ADN Club
  • *****
  • Сообщений: 624
  • Карма: 158
    • ПГСу Бложик
Да, другой, более надежный и быстрый подход.
Выбор объектов с помощью         
CadSelectionSet.Select(AcSelect.acSelectionSetAll, , , F1, F2)
не вполне надежен, т.к. зависит от редактора и может не возвращать объекты находящиеся вне экрана, по крайней мере так было в VBA, который использует тот же подход.  Нужно ли рисковать и наступать на грабли, которые можно обойти?

Оффлайн D_TRex

  • ADN OPEN
  • ***
  • Сообщений: 104
  • Карма: 0
Код - vb.net [Выбрать]
  1. CadSelectionSet.Select(AcSelect.acSelectionSetAll, , , F1, F2)
Тут более гибкий поиск, я допустим сразу указывал слой, а перебор всех элементов по моему где то на форуме обсуждался и решили что медленно работает.

Но в принципе спасибо за код, я взял начало и считал всё что мне надо, а вот как записать в определённый объект какие либо данные, в частности мне хотелось бы Mtext и мультивыноска править настройки, так как когда настройки хранятся внутри текста, то он не реагирует ни на настройки стиля, ни на изменение текста, а когда собираешь чертежи разных исполнителей, а начальник требует что бы шрифт был везде одинаков приходится заходить в каждый примитив и заменять.
Код - vb.net [Выбрать]
  1. ObjectIdToObject
Я так понял так не обратиться к примитиву?

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

  • ADN Club
  • *****
  • Сообщений: 624
  • Карма: 158
    • ПГСу Бложик
Окрыть объект для чтения (это работает быстро):
Код - vb.net [Выбрать]
  1. Using ml = TryCast(id.Open(OpenMode.ForRead), MLeader)
  2.   'тут читаем свойства мультивыноски
  3.   '....
  4. End Using
Открыть объект для записи(работает медленнее):
Код - vb.net [Выбрать]
  1. Using ml = TryCast(id.Open(OpenMode.ForWrite), MLeader)
  2.     'тут пишем в объект
  3.     '....
  4. End Using

либо открыв для чтения и узнав, что объект нужно изменить, то можно обновить открытие объекта до записи:
Код - vb.net [Выбрать]
  1.  Using ml = TryCast(id.Open(OpenMode.ForRead), MLeader)
  2.   'тут читаем свойства мультивыноски
  3.   '....
  4.   ml.UpgradeOpen();
  5.   'тут пишем в объект
  6.   '......
  7. End Using

Все написанное выше работает без транзакции, т.е. то же самое можно сделать и при помощи транзакции.
Все это очень подробно расписано в справке.

ЗЫ.
От VB кровь из глаз... какой же он корявый... и многословный

Оффлайн D_TRex

  • ADN OPEN
  • ***
  • Сообщений: 104
  • Карма: 0
Спасибо попробую, я просто синтаксис не понимаю Using... что и зачем я использую. Про ненависть к VB на форуме я в курсе, но начинал с макросов очень давно и теперь переучиваться - тем более что это не профильное занятие вообще не охото. В справке наверное написано, но это когда знаешь где искать, а так там:
Код - Visual Basic [Выбрать]
  1. Dim splineObj As AcadSpline
  2. Dim objectID As Long
  3. objectID = splineObj.objectID
  4. Dim tempObj As AcadObject
  5. Set tempObj = ThisDrawing.ObjectIdToObject(objectID)
то есть ID созданного объекта записан в переменную, а потом использован.
Как бы то ни было я первые результаты (кода начал пробовать написание плагина) получил недели через две.

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
а перебор всех элементов по моему где то на форуме обсуждался и решили что медленно работает.
Не медленнее, чем метод Select(AcSelect.acSelectionSetAll...). В большинстве случаев быстрее.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн D_TRex

  • ADN OPEN
  • ***
  • Сообщений: 104
  • Карма: 0
Я пришёл с конкретным вопросом переменные для -
Код - vb.net [Выбрать]
  1. CadSelectionSet.Select(AcSelect.acSelectionSetAll, , , F1, F2)
и кстати не знаю в каких случаях он работает медленнее, так как здесь можно сразу задать фильтр, а там перебирать.
Я может не понимаю, но вот тут я не вижу где ObjectID для обращения к конкретному примитиву, а перебор (допустим у меня один из тестовых файлов вмещает 12 000 МТекстов и перебор даёт о себе знать.
Код - vb.net [Выбрать]
  1. Using ml = TryCast(id.Open(OpenMode.ForWrite), MLeader)
  2.     'тут пишем в объект
  3.     '....
  4. End Using
В данном случае мне по ходу проще заюзать SelectAtPoint это будет быстрее работать правда элемент возможно всё так же будет недоступен для редактирования.
Спасибо Ваш метод выбора мне понравился, я разом выбирал 4 типа примитивов - буду пробовать дальше.

Оффлайн D_TRex

  • ADN OPEN
  • ***
  • Сообщений: 104
  • Карма: 0
Всё разобрался более или менее
Код - vb.net [Выбрать]
  1.         cadMT = CadDoc.ObjectIdToObject(CLng(тут ранее считанный ObjectID.ToString))
  2.         cadMT.TextString = "Trex"
  3.         cadMT.color = ACAD_COLOR.acRed
  4.         cadMT.Update()
Изменяются свойства нужного объекта по его ObjectID полученного предоставленным Вами кодом ранее, теперь буду тестировать и раскидывать на остальные примитивы

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

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

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
В данном случае мне по ходу проще заюзать SelectAtPoint это будет быстрее работать правда элемент возможно всё так же будет недоступен для редактирования.
Не рекомендую. Во-первых, если переданная точка вне видимой области чертежа, то ничего не выберется. Плюс есть еще некоторые нюансы, связанные с точностью выбора, зависящие от размера апертуры.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн D_TRex

  • ADN OPEN
  • ***
  • Сообщений: 104
  • Карма: 0
Ты не понимаешь, что в действительности код самого ядра AutoCAD, который реализует этот фильтр, выполняет перебор всех примитивов и отбирает их по фильтру?
Буду знать, пока всё равно пробую и предоставленные примеры и то что нахожу в справке.

Оффлайн D_TRex

  • ADN OPEN
  • ***
  • Сообщений: 104
  • Карма: 0
Не рекомендую. Во-первых, если переданная точка вне видимой области чертежа, то ничего не выберется. Плюс есть еще некоторые нюансы, связанные с точностью выбора, зависящие от размера апертуры.
Спасибо, я этого не знал. Ну у меня вроде получилось обратиться через ObjectIdToObject правда тоже есть нюансы.