Удаление примитивов из чертежа при помощи набора ssget

Автор Тема: Удаление примитивов из чертежа при помощи набора ssget  (Прочитано 10893 раз)

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

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

  • ADN OPEN
  • Сообщений: 23
  • Карма: 1
Создаю таблицу автокада


Далее ее расчленяю (не спрашивайте зачем). У самой первой строки таблицы отключена видимость линий границ ячеек сверху, слева и справа (они окрашены серым цветом; номер этого цвета - 8 ). Если вывестие на печать таблицу (до расчленения),  эти линии не видны, но после того, как таблица расчленена, эти линии становятся обычными отрезками, которые будут печататься, поэтому они становятся для меня "лишними".  Удаляю я их следующим способом:
Код - Auto/Visual Lisp [Выбрать]
  1. ; сохраняем длину таблицы
  2. (setq tableWidth (vla-Get-Width table))
  3.  
  4. ; сохраняем высоту таблицы
  5. (setq tableHeight (vla-Get-Height table))
  6.  
  7. ; взрываем таблицу
  8. (vl-cmdf "_.EXPLODE" (vlax-vla-object->ename table))
  9.  
  10. ; выключаем объектную привязку
  11. (setvar "OSMODE" 0)
  12.  
  13. ; выделяем отрезки для удаления
  14. (setq selSet nil)
  15. (setq
  16.   selSet
  17.    (ssget
  18.      "_C"
  19.      (list (car gPoint) (cadr gPoint))
  20.      (list (+ (car gPoint) tableWidth) (- (cadr gPoint) tableHeight))
  21.      '((0 . "LINE") (62 . 8)
  22.    )
  23. )
  24.  
  25. ; возвращаем значение объектной привязки
  26. (setvar "OSMODE" oldOsmode)
  27.  
  28. ; удаляем отрезки
  29. (setq i 0)
  30. (repeat (sslength selSet) (vla-delete (vlax-ename->vla-object (ssname selSet i))) (setq i (1+ i)))
где gPoint - точка вставки таблицы (левый верхний угол).
Теоретически должно работать и работает, но не всегда стабильно (примерно один раз из десяти могут удалится не все отрезки). Причину такого поведения я для себя не установил.
Вопросы: на сколько данный метод вообще рационален и оправдан для такой задачи? Какие более надежные методы следует использовать?

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

  • Administrator
  • *****
  • Сообщений: 13886
  • Карма: 1788
  • Рыцарь ObjectARX
  • Skype: rivilis
Вопросы: на сколько данный метод вообще рационален и оправдан для такой задачи? Какие более надежные методы следует использовать?
1. Использование (ssget "_C" ....) требует чтобы указанные точки были в ПСК (UCS) и (!!!) были видны на экране.
2. Удаление примитива во время итерации набора примитивов может испортить набор примитивов.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • Сообщений: 23
  • Карма: 1
1. Использование (ssget "_C" ....) требует чтобы указанные точки были в ПСК (UCS) и (!!!) были видны на экране.
это я, наверное, не всегда могу контролировать, следовательно, предложенный мною код, уже можно назвать не стабильным
2. Удаление примитива во время итерации набора примитивов может испортить набор примитивов.
то есть следует, например, создать список из vla-объектов (отрезков), а затем их уже удалять, вызывая из списка?

Александр, вы можете подсказать, как правильно следует удалить эти отрезки, если абстрагироваться от способа, предложенного мной? Может после расчленения таблицы в этих примитивах хранится информация о своем "родительском" объекте (таблице), за которую можно зацепиться? Или что-то в этом роде.

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

  • Administrator
  • *****
  • Сообщений: 13886
  • Карма: 1788
  • Рыцарь ObjectARX
  • Skype: rivilis
это я, наверное, не всегда могу контролировать, следовательно данный код не стабилен
Ну теоретически ты можешь менять вид, чтобы точки были видны.
Александр, вы можете подсказать, как правильно следует удалить эти отрезки, если абстрагироваться от способа, предложенного мной? Может после расчленения таблицы в этих примитивах хранится информация о своем "родительском" объекте (таблице), за которую можно зацепиться?
Нет. Но ты можешь зафиксировать последний примитив в чертеже (при помощи (entlast)) до _EXPLODE, а затем найти все новые примитивы (при помощи (entnext))
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • Сообщений: 23
  • Карма: 1
Но ты можешь зафиксировать последний примитив в чертеже (при помощи (entlast)) до _EXPLODE, а затем найти все новые примитивы (при помощи (entnext))
Спасибо за идею. Это я попробую.

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

  • Administrator
  • *****
  • Сообщений: 1116
  • Карма: 173
Я бы попробовал написать свой аналог "explode" для таблицы. Что-нибудь типа такого:
Код - Auto/Visual Lisp [Выбрать]
  1. (vl-load-com)
  2. (defun explode-table (ent erase / adoc def ent_lst res_lst ins)
  3.   ;; (setq ent (car (entsel)))
  4.   (if (and (setq ent (cond ((= (type ent) 'ename) ent)
  5.                            ((= (type ent) 'vla-object) (vlax-vla-object->ename ent))
  6.                            ) ;_ end of cond
  7.                  ) ;_ end of setq
  8.            (setq def (vla-item (vla-get-blocks (setq adoc (vla-get-activedocument (vlax-get-acad-object))))
  9.                                (cdr (assoc 2 (entget ent)))
  10.                                ) ;_ end of vla-item
  11.                  ) ;_ end of setq
  12.            ) ;_ end of and
  13.     (progn (vlax-for ent def (setq ent_lst (cons ent ent_lst)))
  14.            (setq ins     (vla-get-insertionpoint (vlax-ename->vla-object ent))
  15.                  res_lst (vla-copyobjects adoc
  16.                                           (vlax-make-variant
  17.                                             (vlax-safearray-fill (vlax-make-safearray vlax-vbobject (cons 0 (1- (length ent_lst)))) ent_lst)
  18.                                             ) ;_ end of vlax-make-variant
  19.                                           (vla-get-modelspace adoc)
  20.                                           ) ;_ end of vla-copyobjects
  21.                  ) ;_ end of setq
  22.            (foreach ent (vlax-safearray->list (vlax-variant-value res_lst))
  23.              (vla-move ent (vlax-3d-point '(0. 0. 0.)) ins)
  24.              ) ;_ end of foreach
  25.            (if erase
  26.              (entdel ent)
  27.              ) ;_ end of if
  28.            ) ;_ end of progn
  29.     ) ;_ end of if
  30.   ) ;_ end of defun
Здесь ent - указатель на вхождение таблицы; erase - удалять исходник или нет. Конечно, представленный код не завершен (хотя бы потому, что надо "эксплодить" не в пространство модели, а в пространство владельца таблицы). Но, думаю, общий принцип понятен.
Все, что сказано - личное мнение.

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

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

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

  • ADN OPEN
  • Сообщений: 23
  • Карма: 1
если честно, я не понял, что дает ваша функция

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

  • Administrator
  • *****
  • Сообщений: 13886
  • Карма: 1788
  • Рыцарь ObjectARX
  • Skype: rivilis
если честно, я не понял, что дает ваша функция
Ну то что Алексей написал:
аналог "explode" для таблицы.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • Сообщений: 23
  • Карма: 1
Я понял, что эта функция расчленяет таблицу. Просто я не понял, как это поможет отыскать искомые отрезки для их последующего удаления.
У себя в программе выбор необходимых отрезков я переделал, используя вашу идею из #3, а от использования набора ssget полностью отказался.

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

  • Administrator
  • *****
  • Сообщений: 1116
  • Карма: 173
После расчленения таблицы моей функцией "невидимые" отрезки помещаются на слой Defpoints и выводиться на печать не будут.
Все, что сказано - личное мнение.

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

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

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

  • ADN OPEN
  • Сообщений: 23
  • Карма: 1
теперь понял. спасибо за ваше решение