Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Лисп. Заменитель функции entmode
Диалог специалистов АВОК > ФАЙЛОТЕКА СПЕЦИАЛИСТА > Программы, расчеты
Алекс_Глoz
здравствуйте.
Кто может ответить - на какую функцию заменили entmode ?
Есть ли у кого готовая программа замены layers на другие (сразу нескольких).
kpblc
Ну, entmod как была, так и осталась. А что там со слоями? Поподробнее бы...
Алекс_Глoz
Допустим мы запроектировали проект. Вдруг заказчик требует заменить наши слои на определенные им.Чтобы сделать разом на каждом файле а не по слою. Попробовал написать лисп с помощью функций entnext, entget, entmode. Получаю сообщение Функция entmode не определена. не обращайте внимание на текст - писал быстро.

(defun C:CHLAY_ich () ;(/ SS i spl name ceva)
(setq *ERROR* STOP)
(princ "\nSelect Objects to be Changed...")
(initget 1)
(ustmla "HVAC_CHNL_OAIR" 6)
(ustmla "HVAC_CHNL_SPLY" 4)
(ustmla "HVAC_CHNL_EXH" 5)
(ustmla "HVAC_CHNL_FC" 4)
(ustmla "HVAC_CHNL_RA" 3)
(ustmla "HVAC_CHNL_SMOK" 5)
(ustmla "HVAC_CWS" 4)
(ustmla "HVAC_CWR" 4)
(ustmla "HVAC_HWS" 5)
(ustmla "HVAC_HWR" 5)
(ustmla "HVAC_CHWS" 3 )
(ustmla "HVAC_CHWR" 3)
(setq en (entnext))
(setq ed (entget en) spl ed)
; (setq ss (ssadd))
; (ssadd e1 ss)
(setq SS (ssget) lnab (sslength ss))
; (if SS
; (progn
; (setq oll (if (= (sslength ss) 1)
; (cdr (assoc 8 (entget(ssname ss 0))))
; "varies"))
(setq i 0 j 0)
(while (< i lnab)
; (setq spl (entget (ssname ss i)))
; (setq en (entnext))


(if ( = (cdr (assoc 8 spl)) "dfa")
(progn
(setq spl (subst (cons 8 "HVAC_CHNL_OAIR") (assoc 8 spl) spl ))
(entmode spl)
)
)
(if ( = (cdr (assoc 8 spl)) "ds")
(progn
(setq spl (subst (cons 8 "HVAC_CHNL_SPLY") (assoc 8 spl) spl ))
(entmode spl)
)
)
(if ( = (cdr (assoc 8 spl)) "dr")
(progn
(setq spl (subst (cons 8 "HVAC_CHNL_RA") (assoc 8 spl) spl ))
(entmode spl)
)
)

(if ( = (cdr (assoc 8 spl)) "dv")
(progn
(setq spl (subst (cons 8 "HVAC_CHNL_EXH") (assoc 8 spl) spl ))
(entmode spl)
)
)
(if ( = (cdr (assoc 8 spl)) "hws")
(progn
(setq spl (subst (cons 8 "HVAC_CHWS") (assoc 8 spl) spl ))
(entmode spl)
)
)
(if ( = (cdr (assoc 8 spl)) "hwr")
(progn
(setq spl (subst (cons 8 "HVAC_CHWR") (assoc 8 spl) spl ))
(entmode spl)
)
)
(if ( = (cdr (assoc 8 spl)) "cws")
(progn
(setq spl (subst (cons 8 "HVAC_CWS") (assoc 8 spl) spl ))
(entmode spl)
)
)
(if ( = (cdr (assoc 8 spl)) "cwr")
(progn
(setq spl (subst (cons 8 "HVAC_CWR") (assoc 8 spl) spl ))
(entmode spl)
)
)


(setq i (+ 1 i) j (+ 1 j))

; )
)
(setq en (entnext))
wink.gif
(princ)
;*************************************************
)
(defun ustmla (mla ceva )
(if (= nil (tblsearch "Layer" mla))
(progn
(command "Layer" "m" mla "")
(command "Layer" "c" ceva "")
(command "")
)
(command "Layer" "s" mla "")
)
)
kpblc
Правильно. Есть функция entmod, но никто не говорил про entmode...
---
Добавлено:
В качестве первичных прикидок:
Код
(vl-load-com)

(defun c:change-layers-ent (/ adoc selset)

  (vla-startundomark (setq adoc (vla-get-activedocument (vlax-get-acad-object))))
  (if (= (type (setq selset (vl-catch-all-apply
                              (function
                                (lambda ()
                                  (ssget "_:L")
                                  );_ end of lambda
                                );_ end of function
                              );_ end of vl-catch-all-apply
                     );_ end of setq
               );_ end of type
         'pickset
         );_ end of =
    (progn
      (foreach ent (mapcar
                     (function (lambda (x)
                                 (cons x (strcase (cdr (assoc 8 (entget x))) t))
                                 );_ end of lambda
                               );_ end of function
                     ((lambda (/ tab item)
                        (repeat (setq tab  nil
                                      item (sslength selset)
                                      );_ end setq
                          (setq tab (cons (ssname selset (setq item (1- item))) tab))
                          );_ end of repeat
                        );_ end of lambda
                      )
                     );_ end of mapcar
        (vl-catch-all-apply
          (function
            (lambda ()
              (entmod
                (subst
                  (cons 8
                        (cond
                          ((= (cdr ent) "dfa") "HVAC_CHNL_OAIR")
                          ((= (cdr ent) "ds") "HVAC_CHNL_SPLY")
                          ((= (cdr ent) "dr") "HVAC_CHNL_RA")
                          ((= (cdr ent) "dv") "HVAC_CHNL_EXH")
                          ((= (cdr ent) "hws") "HVAC_CHWS")
                          ((= (cdr ent) "hwr") "HVAC_CHWR")
                          ((= (cdr ent) "cws") "HVAC_CWS")
                          ((= (cdr ent) "cwr") "HVAC_CWR")
                          );_ end of cond
                        );_ end of cons
                  (assoc 8 (entget (car ent)))
                  (entget (car ent))
                  );_ end of subst
                );_ end of entmod
              (entupd (car ent))
              );_ end of lambda
            );_ end of function
          );_ end of vl-catch-all-apply
        );_ end of foreach
      );_ end of progn
    );_ end of if
  (vla-endundomark adoc)
  (princ)
  );_ end of defun
Алекс_Глoz
Спасибо. На самом деле просто неправильно написал функцию. А если теперь задачу усложнить: если в этих слоях установлены блоки и нужно заменить уровни во вложенных блоках и у атрибутов на новые?
kpblc
Если блоки сделаны "нормально" (то есть все их примитивы на слое "0", и слои атрибутов не переназначались принудительно), то код и так нормально обработает вхождения этих блоков.
Алекс_Глoz
А если блоки создавались програмно и в слоях например DS включая атрибуты в этих же слоях. Это было сделано специально чтобы блоки (например отвод воздуховода) имел тот же слой что и сам воздуховод.
kpblc
Странноватая немного логика ИМХО... Кто мешает сделать все примитивы блока в слое "0", со свойствами "ByBlock", а помещать вхождение блока уже на слой воздуховода (или кого-то там еще)? Это, мне кажется, сделает всю работу намного более гибкой и универсальной. Сейчас код писать не получается, но в качестве идеи:
1. Разблокировать и разморозить все слои, запомнив их начальное состояние
2. Создать недостающие слои
3. Пройтись по всем описаниям блоков текущего файла, исключая блоки внешних ссылок
4. Внутри каждого блока пройтись по всем примитивам, переназначая им слой
5. Восстановить начальное состояние слоев.
P.S. Решение на ActiveX получается достаточно простое, хотя и (если смотреть на размер кода) громоздкое...
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Форум IP.Board © 2001-2025 IPS, Inc.