Проверь есть ли у них метод explode - если есть попробуй воспользоваться им. Если нет, то попробуй через команду Explode.
Кстати, речь идёт об Autodesk SPDS Extenstion или СПДС GraphiCS?
Я перебираю объекты типа Object, метода explode у него нет.Что для этих объектов возвращает метод ObjectName?
А как провернуть эту операцию через команду explode?Как-то так. Для каждого из объектов получаем его метку (свойство Handle) и передаём в эту функцию:
Что для этих объектов возвращает метод ObjectName?Возвращает имена с префиксом mcsDbObject.
Возвращает имена с префиксом mcsDbObject.Ага. Это объекты СПДС GraphiCS. Уточни у производителя нет ли готовой команды, которая бы расчленяла все их объекты.
Суть в том, что обычный _explode прекрасно справляется с этими объектами при выполнении операции руками.Возвращает имена с префиксом mcsDbObject.Ага. Это объекты СПДС GraphiCS. Уточни у производителя нет ли готовой команды, которая бы расчленяла все их объекты.
Кажется вот эта команда: spexplodeall
Проверил ваш код. Внёс единственную правку - добавил пробел после финальной скобки перед кавычкой. Работает. Спасибо! Финальный вариант:А как провернуть эту операцию через команду explode?Как-то так. Для каждого из объектов получаем его метку (свойство Handle) и передаём в эту функцию:Код - Visual Basic [Выбрать]Код не тестировал - перепроверь его.
Private Sub ExplodeObj(entHandle As String) Dim qM As String qM = """" ThisDrawing.SendCommand "(command " & qM & "_EXPLODE" & qM & " " & "(handent " & qM & entHandle & qM & ")) DoEvents End Sub
Icu,Да, с этим буду эксперементировать. Можете дать какую-нибудь наводку? С определениями блоков пока ни разу не сталкивался.
Открытый вопрос остаётся с объектами СПДС внутри блоков.
Тут боюсь, что командой не обойтись. Нужно анализировать состав всех блоков и если есть объекты СПДС, то входить в редактор блоков расчленять объекты, и закрывать блок с сохранением изменений.Icu,Да, с этим буду эксперементировать. Можете дать какую-нибудь наводку? С определениями блоков пока ни разу не сталкивался.
Открытый вопрос остаётся с объектами СПДС внутри блоков.
Тут боюсь, что командой не обойтись. Нужно анализировать состав всех блоков и если есть объекты СПДС, то входить в редактор блоков расчленять объекты, и закрывать блок с сохранением изменений.В общем, ситуация такая: могу программно войти в редактор блока, а выйти - уже никак. _blclose работает, только выдавая диалог подтверждения сохранения. Но это не все и не самое главное: способ "подрыва" объектов, использованный ранее, не срабатывает внутри редактора блока. Получаю цепочку сообщений в командной строке:
Команда: (command "_EXPLODE" (handent "87426")) _EXPLODEНе могу понять, в чем дело.
Выберите объект: <Неверное имя объекта: E0F94E60>
nil
Выберите объект: *Прервано*
Команда:
Команда: (command "_EXPLODE" (handent "87427")) _EXPLODE
Выберите объект:
Не могу понять, в чем дело.А как ты получаешь примитивы внутри блока?
_blclose работает, только выдавая диалог подтверждения сохранения.Можешь её запускать через lisp:
А как ты получаешь примитивы внутри блока?Вот так, сначала проверяю, есть ли нужные мне объекты внутри блока (т.е. спдс или прокси-объекты), затем, если хотя бы один такой объект найден, открываю редактор блока:
Когда ты входишь в блок (команда _BEDIT), то блок становится Пространством модели. Соответственно тебе нужно выполнять итерацию не по блоку, а по Пространству модели.Интересная мысль, попробую.
Соответственно тебе нужно выполнять итерацию не по блоку, а по Пространству модели.Нет, все равно не получается разорвать спдс. Придется отказаться от блоков, разрывать их сначала, а потом обрабатывать все спдс в чертеже.
Нет, все равно не получается разорвать спдс.Что происходит? И если ты вручную запускаешь _EXPLODE внутри блока (т.е. в команде _BEDIT), то объекты СПДС расчленяются? Если нет, то конечно ничего не получится. Если да - то это где-то у тебя в коде ошибка.
Что происходит? И если ты вручную запускаешь _EXPLODE внутри блока (т.е. в команде _BEDIT), то объекты СПДС расчленяются? Если нет, то конечно ничего не получится. Если да - то это где-то у тебя в коде ошибка.Да, вручную все расчленяется хорошо, где ошибка, я пока не могу понять, вызов функции расчленения совершенно тот же, что и выше в коде.
вызов функции расчленения совершенно тот же, что и выше в коде.Значит объекты передаёшь не те. Покажи последнее состояние функции. Сразу скажу, что ModelSpace нужно получать уже после ThisDrawing.SendCommand comm (которая вызывает _BEDIT)
Значит объекты передаёшь не те. Покажи последнее состояние функции.Нашел ошибку!!Скопипастил фрагмент кода, а имя переменной-объекта не поменял! Сейчас в роде все расчленяет хорошо, осталось научить правильно закрывать редактор.
осталось научить правильно закрывать редактор.
Можешь её запускать через lisp:Так работает. Соответственно на VBA как-то так:
Код - Auto/Visual Lisp [Выбрать]
(command "_bclose" "_save")
Я так предполагаю, что все внутренние команды автокада отрабатываются именно лиспами?Нет. ObjectARX и AutoCAD .NET API.
Ещё мне стоит рассмотреть вариант вложенных блоков.Это не нужно, если ты пройдёшься просто по таблице блоков (ThisDrawing.Blocks) и проанализируешь/расчленишь СПДС-объекты в каждом из них. Таким образом ты пройдёшься и через ModelSpace и через PaperSpace. Рекурсия не понадобится.
Нет. ObjectARX.Похоже, это следующее, чем я буду овладевать. C++ - очень мощный, гибкий и удобный инструмент. В условиях цейтнота пока бросаюсь на то, что умею - VBA. С++ требует основательного изучения.
С++ требует основательного изучения.Рекомендую C# - если не писать профессионально для AutoCAD собственные объекты/примитивы. Для всего остального его достаточно и местами он удобнее.
В моём тексте акцент был не на профессионализм, а на написание собственных объектов/примитивов (Custom Object/Entity). На C# можно писать очень профессионально и некоторые модули в самом AutoCAD написаны на нём.Off-Topic: показать
Существует ли способ загнать все нужные объекты в какой-нибудь SelectionSet и взорвать их одним разом?Нет. Так не получится, да и врядли будут существенно быстрее. Существенно быстрее будет если переписать с помощью ObjectARX или AutoCAD .NET API
да и врядли будут существенно быстрееКогда руками все выделяю (много раз через qselect), разрыв происходит очень быстро.
потом передаю его в команду на лиспеИ как ты его собираешься передать? SelectionSet в lisp прямо передать нельзя. А непрямая передача будет очень не быстрой...
И как ты его собираешься передать? SelectionSet в lisp прямо передать нельзя.Ну, как-нибудь по указателю :)) Типа по handle'у нельзя передать?
Типа по handle'у нельзя передать?Так можно передать по одному примитиву. У SelectionSet нет ничего подобного Handle.
Как бы их подружить.Не нужно их дружить. Нужно переписать весь алгоритм на lisp, а еще лучше на AutoCAD .NET API.
У Selection Set'а есть уникальное имя, его как-то можно использовать.Типа по handle'у нельзя передать?Так можно передать по одному примитиву. У SelectionSet нет ничего подобного Handle.
Алгоритм: выбираю объекты в правильный Selection Set, выделяю, затем по окончании макроса взрываю кнопкой _Explode?Нет. Тем более, что ты собираешься это сделать не только с объектами в ModelSpace/PaperSpace, но и в блоках.
На блоки я бы временно подзабил :) У меня основная часть СПДС объектов лежит в модели (примерно несколько тысяч), а для блоков хватит и той скорости макроса, которая есть.Алгоритм: выбираю объекты в правильный Selection Set, выделяю, затем по окончании макроса взрываю кнопкой _Explode?Нет. Тем более, что ты собираешься это сделать не только с объектами в ModelSpace/PaperSpace, но и в блоках.
У Selection Set'а есть уникальное имя, его как-то можно использовать.Теоретически используя расширения VisualLisp это можно сделать, но потом эти все объекты нужно перегонять из SelectionSet в PickSet для использования в команде AutoCAD. Это займёт тоже немалое время.
У меня основная часть СПДС объектов лежит в модели (примерно несколько тысяч), а для блоков хватит и той скорости макроса, которая есть.Тогда теоретически для расчленения их всех должно быть достаточно такого lisp-выражения:
Как правильно воспользоваться этим кодом? С лиспом практически не имел дела.Сохрани в файл с именем spdsexp.lsp и загрузи его при помощи команды _APPLOAD.