Тема: Определение границ чертежа с помощью EXTMIN,EXTMAX

Прошу помочь в решении следующей задачи: как удалить примитивы из чертежа, да так, чтобы переменные EXTMIN, EXTMAX (или какие-нибудь другие) их не учитывали, определяя границы чертежа?

Re: Определение границ чертежа с помощью EXTMIN,EXTMAX

Переменные EXTMIN, EXTMAX изменяются автоматически и определяют фактические границы рисунка. Надо после удаления выполнить команду ПОКАЖИ Границы (_ZOOM _e).

Если границы не изменились, то в рисунке все таки есть примитивы (возможно невидимые, на отключенных или замороженных слоях и т.д.). Надо попробовать удалить "мусор" командой _PURGE (возможно, несколько раз).

Иногда создаются специальные объекты, типа копирайтов, которые делаются так, чтобы обычными средствами их было бы невозможно, или очень трудно, полностью удалить. Для выявления таких хитрецов можно (на копии файла для вивисекции) включить все слои, полностью стереть все, сделать PURGE и, если границы не будут меняться, просмотреть графическую базу рисунка с помощью программы _DBVIEW из библиотеки Xpress. Негодяи будут изловлены!

Re: Определение границ чертежа с помощью EXTMIN,EXTMAX

Спасибо за ответ. Однако объекты я помещаю на новый слой, который потом удаляю. Все удаляется корректно: в меню управления слоями имя удаленного слоя исчезает. Но вот эти переменные определяют старые границы как ни в чем ни бывало...Вот функция удаления всех примитивов на сое вместе со слоем:
(defun dellayer ( / U3 i Volume0 namepr)
   (setq U3 (ssget "X" '((8 . "NEWS22"))))
   (setq i 0)
   (setq Volume0 (- (sslength U3) 1))
   (while (<= i Volume0)
      (setq namepr (ssname U3 i))
      (entdel namepr)
      (setq i (+ i 1))
   )
   (command "PURGE" "LA" "NEWS22" "Y" "Y")

Заранее благодарю

Re: Определение границ чертежа с помощью EXTMIN,EXTMAX

1. Эта функция   написана очень ненадежно.
Сразу может привести к ошибке, если заданный слой пустой. Да и вообще слишком мудрая.
Вот простой, испытанный вариант:

(defun ic_DelLayer (name / s result)
   (setq result nil)
   (if (setq S (ssget "_X" (list (cons 8 name))))
     (progn
       (setq result (sslength s))
       (command "_.ERASE" S "")
     )
   )
   result
)

2. Само удаление примитивов НЕ ПРИВЕДЕТ к изменеию EXTMIN-EXTMAX. Для этого надо выполнить  _ZOOM _E
только после этого изменятся значения переменных.

3. Если надо именно удалить слой, а не только его примитивы  (чтобы и имени его не осталось) то можно  воспользоваться функцией

(bns_killayer "delete")

которая где-то валяется в библиотеке Бонуса или по ее аналогу сделать свою.

Re: Определение границ чертежа с помощью EXTMIN,EXTMAX

Еслия правильно понимаю задачу - надо определить какие будут границы чертежа для определенного набора примитивов. Раньше, я тоже для решения такой задачи удалял все не нужное на чертеже и считывал EXTMIN и EXTMAX. Но, как выяснилось, если на чертеже остается группа вытянутых объектов и граничные размеры по одному измерению намного больше чем по другому - Автокад некорректно пересчитывает EXTMIN и EXTMAX. Пришлось написать функцию, которая возвращает границы по набору любых примитивов. Вот она:(defun 3df_GetBoundingBox (Nab / Prim i MinPoint MaxPoint Lst Ok)
   (setq i 0)
   (repeat (sslength Nab)
     (setq Prim (vlax-ename->vla-object (ssname Nab i))
      i (1+ i)
      Ok (vl-catch-all-apply 'vla-getBoundingBox (list Prim 'MinPoint 'MaxPoint))
     )
     (if (not (vl-catch-all-error-p Ok))
       (setq Lst (cons (vlax-safearray->list MinPoint) (cons (vlax-safearray->list MaxPoint) Lst)))
     )
   )
   (list (apply 'mapcar (cons 'min Lst)) (apply 'mapcar (cons 'max Lst)))
)