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

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > Заморозка/разморозка определенного слоя видового экрана в пространстве layout

Заморозка/разморозка определенного слоя видового экрана в пространстве layout

Ответ
Поиск в этой теме
Непрочитано 04.10.2021, 13:19 #1
Заморозка/разморозка определенного слоя видового экрана в пространстве layout
Sege
 
Санкт-Петебург
Регистрация: 05.07.2007
Сообщений: 110

Коллеги!

Есть модель, где имеются разные объекты на разных слоях. В примере это слои 1...4 с объектами:
- на слое "1" - "объекты слоя 1"
- на слое "2" - "объекты слоя 2"
- на слое "3" - "объекты слоя 3"
- на слое "4" - "объекты слоя 4"

Есть листы (в примере это 1...4), на каждом из которых сформированы свой видовой экран. В параметрах видового экрана замораживается/размораживается определенный слой:
- на листе "1" размораживается только слой "1". Остальные слои - "заморожены"
- на листе "2" размораживается только слой "2". Остальные слои - "заморожены"
- на листе "3" размораживается только слой "3". Остальные слои - "заморожены"
- на листе "4" размораживается только слой "4". Остальные слои - "заморожены"

Как на LISP выбрать на текущем листе видовой экран и в параметрах модели видового экрана разморозить только требуемый слой.
Для простоты название листа, в котором надо разморозить нужный слой, соответствует названию слоя. Получаем активное имя текущего листа -> размораживаем слой равный имени листа

исходный файл DWG здесь

----- добавлено через ~1 ч. -----
Собственно накидал простенький код

Код:
[Выделить все]
 
(defun c:layfroz ()
(vl-load-com)
(command "cmdecho" 0)
(setq name_lay (getvar "ctab")) ; получаем имя текущего листа
(setq lay_start (getstring "Enter start layer number: ")); формируем список слоев-листов (начальный номер) 
(setq lay_end (getstring "Enter end layer number: ")); формируем список слоев-листов (конечный номер) 
(setq delta (1+ (- (atoi lay_end) (atoi lay_start)))) 
(setq a (atoi lay_start))
(command "_.MSPACE") ; переходим на листе из VPORT в текущее отображение из модели 
(repeat delta
(setq cur_lay_of (itoa a))
(vl-cmdf "_-layer" "_F" cur_lay_of "") ; последовательно отключаем видимость всех слоев согласно списку номеров слоев
(setq a (1+ a))
)
(vl-cmdf "_-layer" "_T" name_lay "") ; включаем видимость текущего слоя, полученного из текущего листа getvar "ctab"
(command "_.PSPACE"); переходим из vport-модель в vport-лист
(command "cmdecho" 1)
)

Однако почему-то замораживаются и размораживаются все слои в том числе и в пространстве модели, а не только на текущем видовом экране листа

Последний раз редактировалось Sege, 04.10.2021 в 15:10.
Просмотров: 3259
 
Непрочитано 04.10.2021, 15:04
#2
Boxa

КЖ; C#
 
Регистрация: 03.11.2005
Санкт-Петербург
Сообщений: 2,611


если я правильно помню, то в vport есть отдельные методы переопределения слоёв, по крайней мере в .NET так, но если этого нет, то можно и ручками, эти данные в XData vport-а лежат...
Boxa вне форума  
 
Автор темы   Непрочитано 04.10.2021, 15:17
#3
Sege


 
Регистрация: 05.07.2007
Санкт-Петебург
Сообщений: 110


Цитата:
Сообщение от Boxa Посмотреть сообщение
если я правильно помню, то в vport есть отдельные методы переопределения слоёв, по крайней мере в .NET так, но если этого нет, то можно и ручками, эти данные в XData vport-а лежат...
Здесь просто в командной строке отключается текущий параметр слоя.
Интересно, можно ли с помощью командной строки задать параметр для отключения ВЭ?

upd:
кажется что это все-таки относится не слою, а к VIEWPORT
и у него есть код 341, который отвечает за ID замороженного слоя

Последний раз редактировалось Sege, 04.10.2021 в 15:56.
Sege вне форума  
 
Непрочитано 04.10.2021, 16:11
1 | #4
koMon


 
Блог
 
Регистрация: 26.09.2017
Сообщений: 1,809


ну вот если тыкать на вэ и использовать функции et, то выполнить поставленную задачу так:
Layout 1 -> (acet-viewport-frozen-layer-list-set (car(entsel)) '("2" "3" "4"))
Layout 2 -> (acet-viewport-frozen-layer-list-set (car(entsel)) '("1" "3" "4"))
Layout 3 -> (acet-viewport-frozen-layer-list-set (car(entsel)) '("1" "2" "4"))
Layout 4 -> (acet-viewport-frozen-layer-list-set (car(entsel)) '("1" "2" "3"))

Последний раз редактировалось koMon, 04.10.2021 в 16:42.
koMon вне форума  
 
Автор темы   Непрочитано 05.10.2021, 07:58
#5
Sege


 
Регистрация: 05.07.2007
Санкт-Петебург
Сообщений: 110


Цитата:
Сообщение от koMon Посмотреть сообщение
ну вот если тыкать на вэ и использовать функции et, то выполнить поставленную задачу так:
Layout 1 -> (acet-viewport-frozen-layer-list-set (car(entsel)) '("2" "3" "4"))
Layout 2 -> (acet-viewport-frozen-layer-list-set (car(entsel)) '("1" "3" "4"))
Layout 3 -> (acet-viewport-frozen-layer-list-set (car(entsel)) '("1" "2" "4"))
Layout 4 -> (acet-viewport-frozen-layer-list-set (car(entsel)) '("1" "2" "3"))
Спасибо!

----- добавлено через ~2 ч. -----
Кстати, как с помощью ssget (или другого способа) получить имя видового экрана на текущем листе?
(ssget "_X" '((0 . "VIEWPORT"))) выдает первый попавшийся ему видовой экран, скорее всего на 1-й вкладке

----- добавлено через ~34 мин. -----
(ssget "_X" '((0 . "VIEWPORT") (cons 410 (getvar 'ctab))))
; ошибка: неверный список SSGET
что не правильно?

Последний раз редактировалось Sege, 05.10.2021 в 09:36.
Sege вне форума  
 
Непрочитано 05.10.2021, 10:34
#6
koMon


 
Блог
 
Регистрация: 26.09.2017
Сообщений: 1,809


Если на листе всего один вэ для чертежа, то имя его примитива можно определить так:
Код:
[Выделить все]
 (if (= "*Paper_Space" (vla-get-name (vla-get-block (setq active_layout (vla-get-activelayout (vla-get-activeDocument (vlax-get-acad-object)))))))
		(repeat (sslength (setq index 0 l_viewports (ssget "_x" (list (cons 0 "VIEWPORT")(cons 410 (setq p_space (vla-get-name active_layout)))))))
			(if (not (equal (ssname l_viewports index)
					   		(cdr (assoc 331 (entget (vlax-vla-object->ename (vla-item (vla-get-layouts (vla-get-activedocument (vlax-get-acad-object))) p_space)))))
					 )
				)
				(progn
					(princ (ssname l_viewports index))
					(princ " VP листа \"")
					(princ (vla-get-name active_layout))
					(princ "\"")
				)
			)
			(setq index (1+ index))
		)
		(princ "\nВы не в бумажном прстранстве")
)
(princ)
А если их несколько, то ...
koMon вне форума  
 
Автор темы   Непрочитано 05.10.2021, 10:37
#7
Sege


 
Регистрация: 05.07.2007
Санкт-Петебург
Сообщений: 110


Задача конечно специфическая и, возможно, одноразовая.
Просто есть около 30 файлов, где в каждом файле присутствуют около 20-60 листов и каждый лист сделан в своем слое в пространстве модели (лист 1 - слой "1", ..... , лист 60 - слой "60") . И все это надо было вывести в layout на каждый свой лист

Код допилил.

Спасибо koMon за подсказку acet-viewport-frozen-layer-list-set

Код:
[Выделить все]
 
(defun c:layfroz ()
(vl-load-com)
(command "cmdecho" 0)
(setq name_lay (itoa (atoi (getvar "ctab"))))
(setq nabor (ssget "X" '((0  . "VIEWPORT"))))
(setq name_viport (entget (ssname nabor 0)))
(if (= lay_start nil) (setq lay_start (getstring "Enter start layer number: ")))
(if (= lay_end nil) (setq lay_end (getstring "Enter end layer number: ")))
(setq delta (1+ (- (atoi lay_end) (atoi lay_start)))) 
(setq nabor (list lay_start))
(setq b (atoi lay_start))
(repeat (1- delta)
(setq b (1+ b))
(setq nabor (append nabor (list (itoa b))))
)
(setq vp (ssname (ssget "_X" (list '(0 . "VIEWPORT") (cons 410 (getvar "ctab")))) 0))
(acet-viewport-frozen-layer-list-set vp (vl-remove (itoa (atoi (getvar "ctab"))) nabor))
(command "cmdecho" 1)
)
Sege вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > Заморозка/разморозка определенного слоя видового экрана в пространстве layout



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Отобразить границы видового экрана на листе в пространстве модели Modis AutoCAD 3 19.08.2016 18:06
Как у видового экрана на листе убрать границы невидимости (при печати не виден текст у рамки видового экрана)? erikbond AutoCAD 36 08.07.2015 10:15
Как границы видового экрана пространства листа, отразить на модели? VOVAKA331 AutoCAD 3 06.07.2015 15:35
При работе на листе за границы видового экрана отражается весь чертеж с модели Engineering RUS AutoCAD 11 16.01.2015 12:36
Как задать "глубину" видового экрана? СергейА AutoCAD 5 04.10.2007 01:29