| Правила | Регистрация | Пользователи | Поиск | Сообщения за день | Все разделы прочитаны |  Справка по форуму | Файлообменник |

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > AutoLisp. Восстановить состояние слоев

AutoLisp. Восстановить состояние слоев

Ответ
Поиск в этой теме
Непрочитано 13.12.2010, 15:07 #1
AutoLisp. Восстановить состояние слоев
Zaghim
 
Регистрация: 01.07.2010
Сообщений: 521

Друзья, подскажите каком образом вначале работы программ запомнить состояние всех слоев, т.е. какие-то замороженые, какие-то выключены и тд., в какую-нибудь переменную. А после завершения работы программы восстановить эту переменную и, следовательно, восстановить состояние всех слоев. Просто в ходе работы программы изменяю состояние различных слоев и layerp не совсем подходит, т.к. кол-во изменений может быть разным.
Просмотров: 3719
 
Непрочитано 13.12.2010, 15:17
1 | #2
VVA

Инженер LISP
 
Регистрация: 11.05.2005
Минск
Сообщений: 6,994


Например так:
Код:
[Выделить все]
(defun C:TEST (  / *error* Doc)
  (vl-load-com)  
  (defun *error* (msg)(princ msg)
   (bg:layer-status-restore)
   (vla-endundomark doc)(princ)
  )
(setq Doc (vla-get-activedocument (vlax-get-acad-object)))
(bg:layer-status-save)(vla-startundomark Doc)

  ;;;...........................
  ;;; Что-то делаем
  ;;;...........................
(bg:layer-status-restore)(vla-endundomark Doc)
(princ)
)
Ф-ции bg:layer-status-save и bg:layer-status-restore можно взять здесь
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Автор темы   Непрочитано 13.12.2010, 15:29
#3
Zaghim


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


Спасибо. Сейчас попробую
Zaghim вне форума  
 
Непрочитано 14.12.2010, 14:01
1 | #4
VVA

Инженер LISP
 
Регистрация: 11.05.2005
Минск
Сообщений: 6,994


Zaghim, Пример команды по шаблону из #2
__________________
Как использовать код на Лиспе читаем здесь

Последний раз редактировалось VVA, 14.12.2010 в 14:48.
VVA вне форума  
 
Непрочитано 14.12.2010, 14:33
1 | #5
Лиспер


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


VVA, в ссылке ошибка
__________________
(/= RegDate StartReadDate)
Лиспер вне форума  
 
Непрочитано 14.12.2010, 14:48
1 | #6
VVA

Инженер LISP
 
Регистрация: 11.05.2005
Минск
Сообщений: 6,994


Лиспер, Спасибо, исправил
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Непрочитано 14.12.2010, 15:11
1 | #7
Лиспер


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


Еще один вариант, но насколько он теперь нужен - не знаю (работы было многовато, вовремя не успел ) VVA, если не трудно, окинь профессиональным глазом...
Код:
[Выделить все]
(vl-load-com)

(defun _lsp-layer-status-save (doc lst / res)
                                ;|
*    Функция сохранения состояния слоев документа
*    Параметры вызова:
	doc		vla-указатель на обрабатываемый документ. nil -> текущий
	lst		список дополнительных параметров вида
		'(("staylock" . <t | nil>)		; оставлять слои заблокированными
			("stayfreeze" . <t | nil>)	; оставлять слои замороженными
			)
*    Возвращает список вида
	'((<vla-указатель на слой> ("lock" . <vlax-true | vlax-false>) ("freeze" . <vlax-true | vlax-false>))
		(<vla-указатель на слой> ("lock" . <vlax-true | vlax-false>) ("freeze" . <vlax-true | vlax-false>))
		<...>
		(<vla-указатель на слой> ("lock" . <vlax-true | vlax-false>) ("freeze" . <vlax-true | vlax-false>))
		)
*    Из обработки исключаются слои внешних ссылок
*    Примеры вызова:
(_lsp-layer-status-save nil nil)	; разблокировать и разморозить слои текущего документа
(_lsp-layer-status-save nil '(("staylock" . t))) ; разморозить слои текущего документа, оставив блокировку "как есть"
(_lsp-layer-status-save nil '(("stayfreeze" . t))) ; разблокировать слои текущего документа, оставив заморозку "как есть"
|;
  (setq lst (mapcar
              (function
                (lambda (x)
                  (cons (substr (car x) 5) (cdr x))
                  ) ;_ end of lambda
                ) ;_ end of function
              lst
              ) ;_ end of mapcar
        ) ;_ end of setq
  (if (setq doc (cond
                  ((and (= (type doc) 'vla-object)
                        (vlax-property-available-p doc 'modelspace)
                        ) ;_ end of and
                   doc
                   )
                  ((not doc) (vla-get-activedocument (vlax-get-acad-object)))
                  ) ;_ end of cond
            ) ;_ end of setq
    (progn
      (vlax-for item (vla-get-layers doc)
        (if (not (wcmatch (vla-get-name item) "*|*"))
          (setq res (cons
                      (cons item
                            (mapcar
                              (function
                                (lambda (x / tmp)
                                  (setq tmp (cons x (vlax-get-property item x)))
                                  (if (not (cdr (assoc x lst)))
                                    (vl-catch-all-apply
                                      (function
                                        (lambda ()
                                          (vlax-put-property item x :vlax-false)
                                          ) ;_ end of lambda
                                        ) ;_ end of function
                                      ) ;_ end of vl-catch-all-apply
                                    ) ;_ end of if
                                  ) ;_ end of lambda
                                ) ;_ end of function
                              '("lock" "freeze")
                              ) ;_ end of mapcar
                            ) ;_ end of list
                      res
                      ) ;_ end of cons
                ) ;_ end of setq
          ) ;_ end of if
        ) ;_ end of vlax-for
      ) ;_ end of progn
    ) ;_ end of if
  ) ;_ end of defun

(defun _lsp-layer-status-restore (lst)
                                   ;|
*    Восстанавливает состояние слоев документа
*    Параметры вызова:
	lst		список вида
	'((<vla-указатель на слой> ("lock" . <vlax-true | vlax-false>) ("freeze" . <vlax-true | vlax-false>))
		(<vla-указатель на слой> ("lock" . <vlax-true | vlax-false>) ("freeze" . <vlax-true | vlax-false>))
		<...>
		(<vla-указатель на слой> ("lock" . <vlax-true | vlax-false>) ("freeze" . <vlax-true | vlax-false>))
		)
*    Документ-владелец слоев должен быть открыт.
*    Примеры вызова:
(setq lst (_lsp-layer-status-save nil nil))
; <...>
(_lsp-layer-status-restore lst)
|;
  (foreach item lst
    (foreach prop (cdr item)
      (vl-catch-all-apply
        (function
          (lambda ()
            (vlax-put-property (car item) (car prop) (cdr prop))
            ) ;_ end of lambda
          ) ;_ end of function
        ) ;_ end of vl-catch-all-apply
      ) ;_ end of foreach
    ) ;_ end of foreach
  ) ;_ end of defun
__________________
(/= RegDate StartReadDate)
Лиспер вне форума  
 
Автор темы   Непрочитано 14.12.2010, 15:40
#8
Zaghim


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


Да в той ссылке и в коде все ок... все работает, только единственное перед принком добавил регеналл еще один, т.к. слои восстанавливались, но не показывались)
Всем спасибо!!! Очень помогли!
Zaghim вне форума  
 
Непрочитано 15.12.2010, 08:50
1 | #9
TararykovDG

Программист-энтузиаст
 
Регистрация: 17.07.2009
Воронеж
Сообщений: 575


Еще вариант, так просто на суд форумчан

Код:
[Выделить все]
(defun c:Layer_State_Save()
  (setq *layer_state* (vla-GetInterfaceObject (vlax-get-acad-object) (strcat "AutoCAD.AcadLayerStateManager." (substr (getvar 'acadver) 1 2))))
  (vla-SetDatabase *layer_state* (vla-get-Database (vla-get-ModelSpace (vla-get-ActiveDocument (vlax-get-acad-object)))))
  (vla-Save *layer_state* "LayerState" acLsAll)
  ); end c:Layer_State_Save

(defun c:Layer_State_Restore()
  (vla-Restore *layer_state* "LayerState")
  (vla-Delete *layer_state* "LayerState")
  ); end c:Layer_State_Restore
__________________
cadtools
TararykovDG вне форума  
 
Непрочитано 15.12.2010, 09:15
2 | #10
Vildar

AutoCAD
 
Регистрация: 26.07.2007
Москва
Сообщений: 1,064


TararykovDG, в таком случае ведь будет сохраняться не только состояние лампочки и заморозки, но и всего остального. Это ведь Конфигурации слоев.(команда СЛОЙСОСТ)
Vildar вне форума  
 
Автор темы   Непрочитано 15.12.2010, 09:24
#11
Zaghim


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


А вот такой вопрос. Если я сохранил состояние всех слоев, дальше работаю и создаю новый слой, затем восстанавливаю все и выхожу. Новый слой удалится?
Zaghim вне форума  
 
Непрочитано 15.12.2010, 09:36
#12
TararykovDG

Программист-энтузиаст
 
Регистрация: 17.07.2009
Воронеж
Сообщений: 575


Цитата:
Сообщение от Vildar Посмотреть сообщение
TararykovDG, в таком случае ведь будет сохраняться не только состояние лампочки и заморозки, но и всего остального. Это ведь Конфигурации слоев.(команда СЛОЙСОСТ)
Ну так я так и хотел, вспомним как звучит вопрос автора
Цитата:
Друзья, подскажите каком образом вначале работы программ запомнить состояние всех слоев, т.е. какие-то замороженые, какие-то выключены и тд.,
Что подразумевается под словами и т. д.
Ну если надо только заморозку и откл/вкл слоев, то можно так
Код:
[Выделить все]
(defun c:Layer_State_Save()
  (setq *layer_state* (vla-GetInterfaceObject (vlax-get-acad-object) (strcat "AutoCAD.AcadLayerStateManager." (substr (getvar 'acadver) 1 2))))
  (vla-SetDatabase *layer_state* (vla-get-Database (vla-get-ModelSpace (vla-get-ActiveDocument (vlax-get-acad-object)))))
  (vla-Save *layer_state* "LayerState" (+ acLsOn	; - включение
                                          acLsFrozen	; - заморозка
                                          ;acLsLocked
                                          ...
                                          )
            )
  ); end c:Layer_State_Save

(defun c:Layer_State_Restore()
  (vla-Restore *layer_state* "LayerState")
  (vla-Delete *layer_state* "LayerState")
  ); end c:Layer_State_Restore
Цитата:
А вот такой вопрос. Если я сохранил состояние всех слоев, дальше работаю и создаю новый слой, затем восстанавливаю все и выхожу. Новый слой удалится?
Нет новый слой не удалиться, а вот если Ты удалил слой, то он восстановиться
__________________
cadtools
TararykovDG вне форума  
 
Автор темы   Непрочитано 15.12.2010, 09:53
#13
Zaghim


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


Интересно)))
Zaghim вне форума  
 
Непрочитано 15.12.2010, 09:57
#14
Vildar

AutoCAD
 
Регистрация: 26.07.2007
Москва
Сообщений: 1,064


Цитата:
Сообщение от Zaghim Посмотреть сообщение
Новый слой удалится?
Нет, но он выключится. Попробуй сам.

Цитата:
Сообщение от TararykovDG Посмотреть сообщение
а вот если Ты удалил слой, то он восстановиться
Не восстанавливается. Пробую в ручную. Без лиспа.

Вообще тогда, зачем лисп. Если есть стандартная команда. :unknown:
Vildar вне форума  
 
Непрочитано 15.12.2010, 10:21
#15
TararykovDG

Программист-энтузиаст
 
Регистрация: 17.07.2009
Воронеж
Сообщений: 575


Цитата:
Сообщение от Vildar Посмотреть сообщение
Не восстанавливается. Пробую в ручную. Без лиспа.
Действительно не восстанавливается, спасибо за поправку

Цитата:
Сообщение от Vildar Посмотреть сообщение
Вообще тогда, зачем лисп. Если есть стандартная команда. :unknown:
Так надо же ходе программы сначало запомнить, а потом поработав со слоями восстановить исходное состояние, зачем же здесь команды, к тому же, я что-то не обнаружил у комады СЛОЙСОСТ режима работы в командной строке (т. е. только через диалоговое окно)
__________________
cadtools
TararykovDG вне форума  
 
Непрочитано 15.12.2010, 10:48
#16
Vildar

AutoCAD
 
Регистрация: 26.07.2007
Москва
Сообщений: 1,064


Цитата:
Сообщение от TararykovDG Посмотреть сообщение
Так надо же ходе программы сначало запомнить, а потом поработав со слоями восстановить исходное состояние
Ах да. Я-то, с позиции юзера смотрю.
Vildar вне форума  
 
Непрочитано 24.10.2018, 17:19
#17
allar8


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


Цитата:
Сообщение от Vildar Посмотреть сообщение
TararykovDG, в таком случае ведь будет сохраняться не только состояние лампочки и заморозки, но и всего остального. Это ведь Конфигурации слоев.(команда СЛОЙСОСТ)
Лучшее решение но почему то не экспортируются слои внешних ссылок - жаль

Еще лучшее решение для моей задачи сброс свойств слоев помог
allar8 вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > AutoLisp. Восстановить состояние слоев

Размещение рекламы
Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Для чего нужны фильтры слоев?Как ими пользоваться? Aysulu AutoCAD 43 17.04.2019 10:59
Unreconciled new layers при Xref Red Nova AutoCAD 17 10.01.2019 13:00
Проблема с диалогом лиспа при переходе ра русифицированный акад Main Urod LISP 9 21.01.2009 16:54
Состояние слоев в чертеже с внешними ссылками Alxd AutoCAD 8 08.05.2007 16:30
Создание слоев в autolisp Badulaque Прочее. Программное обеспечение 3 26.10.2005 10:05