Разорвать СПДС-объекты программно

Автор Тема: Разорвать СПДС-объекты программно  (Прочитано 17890 раз)

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

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

  • Administrator
  • *****
  • Сообщений: 13830
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Разорвать СПДС-объекты программно
« Ответ #15 : 03-11-2019, 18:52:02 »
Когда ты входишь в блок (команда _BEDIT), то блок становится Пространством модели. Соответственно тебе нужно выполнять итерацию не по блоку, а по Пространству модели.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • Сообщений: 25
  • Карма: 0
Re: Разорвать СПДС-объекты программно
« Ответ #16 : 03-11-2019, 18:54:47 »
А как ты получаешь примитивы внутри блока?
Вот так, сначала проверяю, есть ли нужные мне объекты внутри блока (т.е. спдс или прокси-объекты), затем, если хотя бы один такой объект найден, открываю редактор блока:
Код - Visual Basic [Выбрать]
  1.     For Each item In BlkDef
  2.                 If InStr(item.ObjectName, SPDS_prefix) > 0_
  3.                       Or InStr(item.ObjectName, PROXY_name) > 0 Then
  4.                     Dim comm As String,  command_name As String, block_name As String
  5.                     command_name = "-BEDIT"
  6.                     block_name = BlkDef.Name                  
  7.                     comm = command_name & " " & block_name & vbCrLf                  
  8.                     ThisDrawing.SendCommand comm
  9.                     For Each obj In BlkDef
  10.                       If InStr(item.ObjectName, SPDS_prefix) > 0_
  11.                           Or InStr(item.ObjectName, PROXY_name) > 0 Then ExplodeObj (obj.handle)
  12.                     Next                  
  13.                     ThisDrawing.SendCommand ("_bclose ")    
  14.                   Exit For                          
  15.                 End If          
  16.      Next
  17.  
« Последнее редактирование: 03-11-2019, 18:55:29 от Александр Ривилис »

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

  • ADN OPEN
  • Сообщений: 25
  • Карма: 0
Re: Разорвать СПДС-объекты программно
« Ответ #17 : 03-11-2019, 18:55:32 »
Когда ты входишь в блок (команда _BEDIT), то блок становится Пространством модели. Соответственно тебе нужно выполнять итерацию не по блоку, а по Пространству модели.
Интересная мысль, попробую.

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

  • Administrator
  • *****
  • Сообщений: 13830
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Разорвать СПДС-объекты программно
« Ответ #18 : 03-11-2019, 18:56:03 »
Icu,
Напоминаю про правило форматирования кода на форуме!
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • Administrator
  • *****
  • Сообщений: 13830
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Разорвать СПДС-объекты программно
« Ответ #19 : 03-11-2019, 18:58:16 »
Icu,
Но вот с анонимными блоками (например, получившимися в результате модификации динамического блока) так не получится, так как имя таких блоков начинается с "*" и _BEDIT их не воспринимает.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • Сообщений: 25
  • Карма: 0
Re: Разорвать СПДС-объекты программно
« Ответ #20 : 03-11-2019, 19:05:20 »
Соответственно тебе нужно выполнять итерацию не по блоку, а по Пространству модели.
Нет, все равно не получается разорвать спдс. Придется отказаться от блоков, разрывать их сначала, а потом обрабатывать все спдс в чертеже.

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

  • Administrator
  • *****
  • Сообщений: 13830
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Разорвать СПДС-объекты программно
« Ответ #21 : 03-11-2019, 19:10:42 »
Нет, все равно не получается разорвать спдс.
Что происходит? И если ты вручную запускаешь _EXPLODE внутри блока (т.е. в команде _BEDIT), то объекты СПДС расчленяются? Если нет, то конечно ничего не получится. Если да - то это где-то у тебя в коде ошибка.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • Сообщений: 25
  • Карма: 0
Re: Разорвать СПДС-объекты программно
« Ответ #22 : 03-11-2019, 19:23:51 »
Что происходит? И если ты вручную запускаешь _EXPLODE внутри блока (т.е. в команде _BEDIT), то объекты СПДС расчленяются? Если нет, то конечно ничего не получится. Если да - то это где-то у тебя в коде ошибка.
Да, вручную все расчленяется хорошо, где ошибка, я пока не могу понять, вызов функции расчленения совершенно тот же, что и выше в коде.

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

  • Administrator
  • *****
  • Сообщений: 13830
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Разорвать СПДС-объекты программно
« Ответ #23 : 03-11-2019, 19:29:15 »
вызов функции расчленения совершенно тот же, что и выше в коде.
Значит объекты передаёшь не те. Покажи последнее состояние функции. Сразу скажу, что ModelSpace нужно получать уже после ThisDrawing.SendCommand comm (которая вызывает _BEDIT)
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • Сообщений: 25
  • Карма: 0
Re: Разорвать СПДС-объекты программно
« Ответ #24 : 03-11-2019, 19:31:02 »

Значит объекты передаёшь не те. Покажи последнее состояние функции.
Нашел ошибку!!Скопипастил фрагмент кода, а имя переменной-объекта не поменял! Сейчас в роде все расчленяет хорошо, осталось научить правильно закрывать редактор.

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

  • Administrator
  • *****
  • Сообщений: 13830
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Разорвать СПДС-объекты программно
« Ответ #25 : 03-11-2019, 19:32:54 »
осталось научить правильно закрывать редактор.
Можешь её запускать через lisp:
Код - Auto/Visual Lisp [Выбрать]

    (command "_bclose" "_save")
Так работает. Соответственно на VBA как-то так:
Код - Visual Basic [Выбрать]
  1. ThisDrawing.SendCommand "(command ""_bclose"" ""_save"") "
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • Сообщений: 25
  • Карма: 0
Re: Разорвать СПДС-объекты программно
« Ответ #26 : 03-11-2019, 19:45:51 »
Теперь всё работает, как надо!! Спасибо!

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

  • ADN OPEN
  • Сообщений: 25
  • Карма: 0
Re: Разорвать СПДС-объекты программно
« Ответ #27 : 03-11-2019, 19:56:42 »
Да, лиспы - это сила. Я так предполагаю, что все внутренние команды автокада отрабатываются именно лиспами? Ещё мне стоит рассмотреть вариант вложенных блоков. По сути, Model_Space - это блок, внутри которого могут быть другие блоки, соответственно, намечается повод для рекурсии.

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

  • Administrator
  • *****
  • Сообщений: 13830
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Разорвать СПДС-объекты программно
« Ответ #28 : 03-11-2019, 20:05:31 »
Я так предполагаю, что все внутренние команды автокада отрабатываются именно лиспами?
Нет. ObjectARX и AutoCAD .NET API.
Ещё мне стоит рассмотреть вариант вложенных блоков.
Это не нужно, если ты пройдёшься просто по таблице блоков (ThisDrawing.Blocks) и проанализируешь/расчленишь СПДС-объекты в каждом из них. Таким образом ты пройдёшься и через ModelSpace и через PaperSpace. Рекурсия не понадобится.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • Сообщений: 25
  • Карма: 0
Re: Разорвать СПДС-объекты программно
« Ответ #29 : 03-11-2019, 20:12:34 »
Нет. ObjectARX.
Похоже, это следующее, чем я буду овладевать. C++ - очень мощный, гибкий и удобный инструмент. В условиях цейтнота пока бросаюсь на то, что умею - VBA. С++ требует основательного изучения.