Тема: Определение границ чертежа с помощью EXTMIN,EXTMAX
Прошу помочь в решении следующей задачи: как удалить примитивы из чертежа, да так, чтобы переменные EXTMIN, EXTMAX (или какие-нибудь другие) их не учитывали, определяя границы чертежа?
Информационный портал для профессионалов в области САПР
Вы не вошли. Пожалуйста, войдите или зарегистрируйтесь.
Форумы CADUser → Программирование → Разное → Определение границ чертежа с помощью EXTMIN,EXTMAX
Страницы 1
Чтобы отправить ответ, вы должны войти или зарегистрироваться
Прошу помочь в решении следующей задачи: как удалить примитивы из чертежа, да так, чтобы переменные EXTMIN, EXTMAX (или какие-нибудь другие) их не учитывали, определяя границы чертежа?
Переменные EXTMIN, EXTMAX изменяются автоматически и определяют фактические границы рисунка. Надо после удаления выполнить команду ПОКАЖИ Границы (_ZOOM _e).
Если границы не изменились, то в рисунке все таки есть примитивы (возможно невидимые, на отключенных или замороженных слоях и т.д.). Надо попробовать удалить "мусор" командой _PURGE (возможно, несколько раз).
Иногда создаются специальные объекты, типа копирайтов, которые делаются так, чтобы обычными средствами их было бы невозможно, или очень трудно, полностью удалить. Для выявления таких хитрецов можно (на копии файла для вивисекции) включить все слои, полностью стереть все, сделать PURGE и, если границы не будут меняться, просмотреть графическую базу рисунка с помощью программы _DBVIEW из библиотеки Xpress. Негодяи будут изловлены!
Спасибо за ответ. Однако объекты я помещаю на новый слой, который потом удаляю. Все удаляется корректно: в меню управления слоями имя удаленного слоя исчезает. Но вот эти переменные определяют старые границы как ни в чем ни бывало...Вот функция удаления всех примитивов на сое вместе со слоем:
(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")
)
Заранее благодарю
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")
которая где-то валяется в библиотеке Бонуса или по ее аналогу сделать свою.
Еслия правильно понимаю задачу - надо определить какие будут границы чертежа для определенного набора примитивов. Раньше, я тоже для решения такой задачи удалял все не нужное на чертеже и считывал 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)))
)
Страницы 1
Чтобы отправить ответ, вы должны войти или зарегистрироваться
Форумы CADUser → Программирование → Разное → Определение границ чертежа с помощью EXTMIN,EXTMAX
Форум работает на PunBB, при поддержке Informer Technologies, Inc