LISP. Обнуление координаты Z (аналог FLATTEN ) - Страница 6
| Правила | Регистрация | Пользователи | Сообщения за день |  Справка по форуму | Файлообменник |

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Готовые программы > LISP. Обнуление координаты Z (аналог FLATTEN )

LISP. Обнуление координаты Z (аналог FLATTEN )

Ответ
Поиск в этой теме
Непрочитано 08.10.2008, 16:06 3 |
LISP. Обнуление координаты Z (аналог FLATTEN )
VVA
 
Инженер LISP
 
Минск
Регистрация: 11.05.2005
Сообщений: 6,996

Программа написана Joe Burke и опубликована здесь: SuperFlatten
Там же будут публиковаться последующие версии. Начиная с версии 1.2c адаптирована к локализованным версиям Автокада.
Первая версия публиковалась здесь: Проклятая Z координата
Запускать:
SF или SuperFlatten
Кроме того с помощью опций можно устанавливать:
Rename blocks - переименовывать блоки, объекты в которых нужно плющить
Explodable blocks - сделать все блоки расчленяемыми
Overkill - запускает Express'овскую команду Overkill
Proxies - плющит прокси объекты
Должна работать начиная с 2000 версии Автокада. Для корректной работы всех опций нужен Автокад 2006 и позже и установленные Express Tools

1. SuperFlatten 2.0b beta VVA.rar - Обработка блоков, в имени которых есть UNICOD символы
2. Другие варианты см. #2
3. SuperFlatten 2.0c при "обнулении" взрывал мультивыноски см пост #91

Вложения
Тип файла: zip SuperFlatten 1.2g.zip (27.4 Кб, 1268 просмотров)
Тип файла: zip SuperFlatten 2.0c.zip (30.1 Кб, 3350 просмотров)


Последний раз редактировалось VVA, 22.05.2021 в 10:10. Причина: Добавлена версия SuperFlatten 2.0c
Просмотров: 184703
 
Непрочитано 19.09.2024, 16:32
#101
posetitel


 
Регистрация: 16.10.2013
Сообщений: 395


ну ок, ограничение в использовании лиспа - только международная система координат, без диких координат Y типа 1Е+80.
а почему мой блок такой простой и элементарный в МСК улетал в ад то?
posetitel вне форума  
 
Непрочитано 20.09.2024, 09:39
#102
posetitel


 
Регистрация: 16.10.2013
Сообщений: 395


пробовал также лиспом Z0 от VAA из сообщения https://forum.dwg.ru/showpost.php?p=...1&postcount=23 блок почему-то перемещается в координату Z=2776.13, а не в 0, как требуется (да и X и Y улетают)
posetitel вне форума  
 
Непрочитано 20.09.2024, 10:21
1 | #103
Кулик Алексей aka kpblc
Moderator

LISP, C# (ACAD 200[9,12,13,14])
 
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,431


Код:
[Выделить все]
 (cdr(assoc 210 (entget (Car(entsel)))))
(-2.42309e-05 -0.00473025 0.999989)
Это нормаль твоего блока. А должно быть (0.0 0.0 1.0). Штатный flatten эту проблему решает, если что
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 20.09.2024, 10:46
#104
posetitel


 
Регистрация: 16.10.2013
Сообщений: 395


Спасибо.
Мне на будущее, как посмотреть нормаль блока?
Да и как такое вообще получилось: топографы криво выгрузили из своих программ, или изначально кто-то блок крутил-вертел и затаскал до изменения нормали, и вообще такие подлянки распространенные?
posetitel вне форума  
 
Непрочитано 27.06.2025, 10:21 Ловите)))
1 | #105
igor.kurgin


 
Регистрация: 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)
igor.kurgin вне форума  
 
Непрочитано 07.07.2025, 18:52
#106
MorganSpb


 
Регистрация: 10.07.2008
Сообщений: 93


Zeroz-sel при выборе блока, не обнуляет в нем z координату, или так и должно?
MorganSpb вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Готовые программы > LISP. Обнуление координаты Z (аналог FLATTEN )

Реклама i


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Аналог функции 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