Schöck
dwg.ru forum rss xml
| Правила | Регистрация | Пользователи | Поиск | Сообщения за день | Все разделы прочитаны |  Справка по форуму |

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

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

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

Zaghim вне форума Вставить имя

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

Инженер LISP
 
Регистрация: 11.05.2005
Минск
Сообщений: 6,718
Отправить сообщение для VVA с помощью ICQ Отправить сообщение для VVA с помощью Skype™


Например так:
Код:
[Выделить все]
(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,718
Отправить сообщение для VVA с помощью ICQ Отправить сообщение для VVA с помощью Skype™


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

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


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


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

Инженер LISP
 
Регистрация: 11.05.2005
Минск
Сообщений: 6,718
Отправить сообщение для VVA с помощью ICQ Отправить сообщение для VVA с помощью Skype™


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


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


Еще один вариант, но насколько он теперь нужен - не знаю (работы было многовато, вовремя не успел ) 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
Воронеж
Сообщений: 571


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

Код:
[Выделить все]
(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
Воронеж
Сообщений: 571


Цитата:
Сообщение от 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
Воронеж
Сообщений: 571


Цитата:
Сообщение от 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
Сообщений: 349


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

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

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

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

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Для чего нужны фильтры слоев?Как ими пользоваться? Aysulu AutoCAD 31 17.02.2016 16:59
Unreconciled new layers при Xref Red Nova AutoCAD 16 15.05.2012 10:54
Проблема с диалогом лиспа при переходе ра русифицированный акад 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

|| Главная || Каталог САПР || Тендеры || Публикации || Объявления || Биржа труда || Download || Галерея ||
|| Библиотека || Кунсткамера || Каталог предприятий || Контакты || Файлообменник || Блоги ||