|
||
| Правила | Регистрация | Пользователи | Сообщения за день | | Поиск | | Справка по форуму | Файлообменник | |
|
![]() |
Поиск в этой теме |
|
||||
Регистрация: 16.10.2013
Сообщений: 395
|
пробовал также лиспом Z0 от VAA из сообщения https://forum.dwg.ru/showpost.php?p=...1&postcount=23 блок почему-то перемещается в координату Z=2776.13, а не в 0, как требуется (да и X и Y улетают)
|
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,431
|
Код:
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Регистрация: 16.10.2013
Сообщений: 395
|
Спасибо.
Мне на будущее, как посмотреть нормаль блока? Да и как такое вообще получилось: топографы криво выгрузили из своих программ, или изначально кто-то блок крутил-вертел и затаскал до изменения нормали, и вообще такие подлянки распространенные? |
|||
![]() |
|
||||
Регистрация: 27.06.2025
Сообщений: 1
|
;; Версия для обнуления координаты Z всех объектов включая содержимое блоков
(defun C:ZEROZ ( / ent entdata processed enttype total-count block-processed) (princ "\nОбнуление координаты Z всех объектов (включая содержимое блоков)...") (setq processed 0) (setq total-count 0) (setq block-processed 0) ;; Сначала обрабатываем определения блоков (setq block-processed (process-block-definitions)) ;; Начинаем с первого объекта в базе данных (setq ent (entnext)) ;; Проходим по ВСЕМ объектам в чертеже (while ent (setq total-count (1+ total-count)) (setq entdata (entget ent)) ;; Проверяем что данные объекта получены успешно (if entdata (progn (setq enttype (cdr (assoc 0 entdata))) ;; Обрабатываем объект если он подходящего типа (if (member enttype '("LINE" "CIRCLE" "ARC" "POINT" "TEXT" "MTEXT" "INSERT" "LWPOLYLINE" "POLYLINE" "VERTEX" "ELLIPSE" "SPLINE" "HATCH" "SOLID" "3DFACE" "DIMENSION" "LEADER" "MLINE" "ATTDEF" "ATTRIB")) (if (zero-z-entity ent entdata) (setq processed (1+ processed)) ) ) ) ) ;; Переходим к следующему объекту (setq ent (entnext ent)) ) ;; Регенерируем чертеж для обновления блоков (command "_.REGEN") (princ (strcat "\nПроверено объектов: " (itoa total-count))) (princ (strcat "\nОбработано объектов: " (itoa processed))) (princ (strcat "\nОбработано определений блоков: " (itoa block-processed))) (princ "\nГотово!") (princ) ) ;; Функция для обработки определений блоков (defun process-block-definitions ( / block-table block-name block-def ent processed) (setq processed 0) (setq block-table (tblnext "BLOCK" T)) ; Первая запись в таблице блоков (while block-table (setq block-name (cdr (assoc 2 block-table))) ;; Пропускаем системные блоки (начинающиеся с *) (if (and block-name (/= (substr block-name 1 1) "*") (/= (substr block-name 1 1) "~")) (progn ;; Получаем определение блока (setq block-def (tblobjname "BLOCK" block-name)) (if block-def (progn ;; Обрабатываем все объекты в определении блока (setq ent (entnext block-def)) (while (and ent (/= (cdr (assoc 0 (entget ent))) "ENDBLK")) (if (zero-z-entity ent (entget ent)) (setq processed (1+ processed)) ) (setq ent (entnext ent)) ) ) ) ) ) ;; Переходим к следующему блоку (setq block-table (tblnext "BLOCK")) ) processed ) ;; Функция для обнуления Z координат конкретного объекта (defun zero-z-entity (ent entdata / enttype modified point-codes current-point) (setq enttype (cdr (assoc 0 entdata))) (setq modified nil) ;; Обнуляем уровень (elevation) - код 38 (if (assoc 38 entdata) (progn (setq entdata (subst (cons 38 0.0) (assoc 38 entdata) entdata)) (setq modified T) ) ) ;; Определяем коды точек для разных типов объектов (setq point-codes (cond ((= enttype "LINE") '(10 11)) ((member enttype '("CIRCLE" "ARC" "POINT" "TEXT" "MTEXT" "INSERT" "ATTDEF" "ATTRIB")) '(10)) ((= enttype "VERTEX") '(10)) ((= enttype "LWPOLYLINE") '(10)) ((= enttype "POLYLINE") '(10)) ((= enttype "ELLIPSE") '(10 11)) ((= enttype "SPLINE") '(10)) ((= enttype "3DFACE") '(10 11 12 13)) ((= enttype "SOLID") '(10 11 12 13)) ((member enttype '("DIMENSION" "LEADER")) '(10 11 12 13 14 15 16)) (T '(10)) ) ) ;; Обрабатываем все точки с найденными кодами (foreach code point-codes (if (assoc code entdata) (progn (setq current-point (cdr (assoc code entdata))) (if (and current-point (>= (length current-point) 3)) (progn (setq entdata (subst (cons code (list (car current-point) (cadr current-point) 0.0)) (assoc code entdata) entdata)) (setq modified T) ) ) ) ) ) ;; Обновляем объект если были изменения (if modified (progn (entmod entdata) (entupd ent) T ) nil ) ) ;; Альтернативная команда - взрывает блоки и обрабатывает результат (defun C:ZEROZ-EXPLODE ( / ss i ent entdata processed exploded-count) (princ "\nВыберите блоки для взрыва и обнуления Z координат:") (setq ss (ssget '((0 . "INSERT")))) (if ss (progn (setq processed 0) (setq exploded-count 0) (setq i 0) (while (< i (sslength ss)) (setq ent (ssname ss i)) (setq entdata (entget ent)) ;; Взрываем блок (command "_.EXPLODE" ent) (setq exploded-count (1+ exploded-count)) (setq i (1+ i)) ) ;; Теперь обрабатываем все объекты заново (setq ent (entnext)) (while ent (setq entdata (entget ent)) (if entdata (progn (setq enttype (cdr (assoc 0 entdata))) (if (member enttype '("LINE" "CIRCLE" "ARC" "POINT" "TEXT" "MTEXT" "LWPOLYLINE" "POLYLINE" "VERTEX" "ELLIPSE" "SPLINE" "HATCH" "SOLID" "3DFACE" "DIMENSION" "LEADER" "MLINE" "ATTRIB")) (if (zero-z-entity ent entdata) (setq processed (1+ processed)) ) ) ) ) (setq ent (entnext ent)) ) (princ (strcat "\nВзорвано блоков: " (itoa exploded-count))) (princ (strcat "\nОбработано объектов: " (itoa processed))) (princ "\nГотово!") ) (princ "\nБлоки не выбраны.") ) (princ) ) ;; Команда для обработки только выбранных объектов (defun C:ZEROZ-SEL ( / ss i ent entdata processed) (princ "\nВыберите объекты для обнуления координаты Z:") (setq ss (ssget)) (if ss (progn (setq processed 0) (setq i 0) (while (< i (sslength ss)) (setq ent (ssname ss i)) (setq entdata (entget ent)) (if (zero-z-entity ent entdata) (setq processed (1+ processed)) ) (setq i (1+ i)) ) (princ (strcat "\nОбработано объектов: " (itoa processed) " из " (itoa (sslength ss)))) (princ "\nГотово!") ) (princ "\nОбъекты не выбраны.") ) (princ) ) (princ "\nЗагружены команды:") (princ "\n ZEROZ - обнуление Z координат всех объектов + содержимое блоков") (princ "\n ZEROZ-SEL - обнуление Z координат выбранных объектов") (princ "\n ZEROZ-EXPLODE - взрыв выбранных блоков и обнуление Z координат") (princ) |
|||
![]() |
![]() |
|
|
![]() |
||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Аналог функции EVAL (LISP) в Exele | kp+ | LISP | 11 | 01.04.2010 16:52 |
Сменить быстро координату Z у нескольких сплайнов. | andrey25 | AutoCAD | 11 | 18.09.2008 16:28 |
Координаты точки пересечения line и pline (LISP) | paradoxvaha | LISP | 3 | 10.07.2007 13:04 |
загрузка DOS прог через LISP | Gaa | LISP | 15 | 12.08.2005 19:19 |