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

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > Lisp. Выключение видимости всех видовых экранов

Lisp. Выключение видимости всех видовых экранов

Ответ
Поиск в этой теме
Непрочитано 02.03.2016, 13:32 #1
Lisp. Выключение видимости всех видовых экранов
800x600
 
Регистрация: 19.03.2008
Сообщений: 30

Здравствуйте, помогите пожалуйста отредактировать код.

Есть вот такой лисп, он блокирует все видовые экраны в файле.
Мне нужно переделать его так чтобы он не блокировал, а отключал видимость видовых экранов.
Пробовал заменить свойство "displaylocked" на "viewporton" (это свойство видимости) это не помогло.



Код:
[Выделить все]
   (defun c:VP_Lock (/ fen n sel tot) 

  (vl-load-com)

  (vla-startundomark (vla-get-activedocument (vlax-get-acad-object)))
  (if (setq sel (ssget "x" (list (cons 0 "VIEWPORT"))))
    (progn
      (setq n 0 tot 0)
      (while (ssname sel n)
        (if (and (= (logand (cdr (assoc 90 (entget (ssname sel n)))) 16384) 0) (/= (cdr (assoc 69 (entget (ssname sel n)))) 1))
          (progn
            (setq fen (vlax-ename->vla-object (ssname sel n)))
            (vlax-put-property fen "displaylocked" :vlax-true)
            (setq tot (1+ tot))
          )
        )
        (setq n (1+ n))
      )
      (princ (strcat "\n"  (itoa tot) " VPorts locked )"))
    )
    (princ "\nNO VPorts ! ")
  )
  (vla-endundomark (vla-get-activedocument (vlax-get-acad-object)))
  (princ)
)

(princ "\nVP_Lock loaded - VP_Lock to run ... ")
(princ)
Просмотров: 3519
 
Непрочитано 02.03.2016, 14:15
#2
Валерий Мемрук


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


Цитата:
Сообщение от 800x600 Посмотреть сообщение
чтобы он не блокировал, а отключал видимость
Проставь хоть один размер, появится слой "Defpoits". Перенеси все видовые окна на этот слой, будут заблокированы видовые окна от дурака. Создай слои для работы в пространстве листов, а слои в пространстве модели отключи - появится "видимость-невидимость" содержимого видовых окон.
Валерий Мемрук вне форума  
 
Непрочитано 02.03.2016, 14:23
#3
kacugu

начинающий инженер-гидротехник
 
Регистрация: 18.04.2010
Санкт-Петербург
Сообщений: 893


если
Код:
[Выделить все]
 (vlax-put-property fen "displaylocked" :vlax-true)
заменить на
Код:
[Выделить все]
 (vlax-put-property fen "viewporton" :vlax-false)
и перед применением сохранить чертеж, то всё работает

Последний раз редактировалось kacugu, 02.03.2016 в 15:24. Причина: ошибка при копировании
kacugu вне форума  
 
Автор темы   Непрочитано 02.03.2016, 14:35
#4
800x600


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


----- добавлено через ~4 мин. -----
Цитата:
Сообщение от Валерий Мемрук Посмотреть сообщение
Проставь хоть один размер, появится слой "Defpoits". Перенеси все видовые окна на этот слой, будут заблокированы видовые окна от дурака. Создай слои для работы в пространстве листов, а слои в пространстве модели отключи - появится "видимость-невидимость" содержимого видовых окон.
К сожалению этот вариант не подойдет. Много уже готовых файлов, это раз. Во-вторых, заставить работать по слоям проектировщиков других организаций не могу

----- добавлено через ~39 мин. -----
Цитата:
Сообщение от kacugu Посмотреть сообщение
и перед применением сохранить чертеж, то всё работает
Странно, а у меня пишет ошибка: Ошибка Automation. Не в пространстве листа

У меня ACAD 2011x64

И еще сохранять файл перед применением лиспа очень бы не хотелось. т.к. у нас система электронного документооборота. dwg-файлы хранятся в этой системе и открываются только для чтения.
Кстати исходный лисп (который блокирует ВЭ) работает без сохранения DWG файла

Последний раз редактировалось 800x600, 02.03.2016 в 15:17.
800x600 вне форума  
 
Непрочитано 02.03.2016, 15:24
#5
frostmourn


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


Цитата:
Сообщение от kacugu Посмотреть сообщение
:vlax-flax
Что-что, простите?
frostmourn вне форума  
 
Непрочитано 02.03.2016, 15:27
#6
kacugu

начинающий инженер-гидротехник
 
Регистрация: 18.04.2010
Санкт-Петербург
Сообщений: 893


Цитата:
Сообщение от 800x600 Посмотреть сообщение
Странно, а у меня пишет ошибка: Ошибка Automation. Не в пространстве листа
ошибка при копировании: false превратилось во flax
kacugu вне форума  
 
Автор темы   Непрочитано 03.03.2016, 14:08
#7
800x600


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


Вариант
Цитата:
(vlax-put-property fen "viewporton" :vlax-false)
не подошел. Если много листов, то срабатывает через раз, иногда пишет
Цитата:
ошибка: Ошибка Automation. Не в пространстве листа
и только после того как переходишь на другой лист и повторно выполняешь команду начинает срабатывать.
800x600 вне форума  
 
Непрочитано 03.03.2016, 14:36
#8
P_S


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


Методом Display надо активировать каждый из видовых экранов для работы с ним:
Код:
[Выделить все]
 (vlax-invoke-method fen "Display" :vlax-true)
            (vlax-put-property fen "viewporton" :vlax-false)
P_S вне форума  
 
Непрочитано 03.03.2016, 15:38
#9
kacugu

начинающий инженер-гидротехник
 
Регистрация: 18.04.2010
Санкт-Петербург
Сообщений: 893


отсюда http://www.thecadforums.com/threads/...76/#post-97569
Код:
[Выделить все]
 (defun c:vpoff (/ old-ctab ss count ent)
(vl-load-com)
(setq old-ctab (getvar "ctab"))
(foreach layout (layoutlist)
(if (and (not (= (strcat layout) "MODEL"))
(setq ss (ssget "x" (list '(0 . "VIEWPORT")(cons 410 layout))))
(setvar "ctab" layout)
)
(progn
(setq count -1)
(while (< (setq count (1+ count)) (1- (sslength ss)))
(setq ent (vlax-ename->vla-object (ssname ss count)))
(vla-display ent :vlax-false)
(vla-put-viewporton ent :vlax-false)
)
)
)
)
(setvar "ctab" old-ctab)
(princ)
)
kacugu вне форума  
 
Автор темы   Непрочитано 10.03.2016, 08:02
#10
800x600


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


Пример kacugu подошел. Спасибо всем, кто откликнулся
800x600 вне форума  
 
Непрочитано 10.03.2016, 09:57
#11
VVA

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


Еще вариант без перехода по листам. Вроде работает
Код:
[Выделить все]
 
(defun C:ALLVPOFF nil
  (princ (strcat "\n"(itoa(1-(length(_vponoff :vlax-false))))" viewports updated"))(princ))
(defun C:ALLVPON nil
  (princ (strcat "\n"(itoa(1-(length(_vponoff :vlax-true))))" viewports updated"))(princ))
(defun _vponoff	(what / ss)
;;;what - :vlax-false or :vlax-true
;;;Use
;;; (_vponoff :vlax-false)
  (vl-load-com)
 (if (and (not (equal (getvar "tilemode") 1))(not (equal (getvar "cvport") 1)))(command "_.PSPACE"))
 ;;; (setvar "tilemode" 1)
  (if (setq
	ss (ssget "_x"
		  (list (cons 0 "VIEWPORT") '(-4 . "<>") (cons 69 1))
	   )
      )
    (mapcar (function (lambda (vp)
			(if (vlax-write-enabled-p vp)
			  (progn
			   ;_ (vl-catch-all-apply 'vla-display (list vp what))
			    (vl-catch-all-apply 'vla-put-viewporton (list vp what))
			  )
			)
		      )
	    )
	    (mapcar
	      (function vlax-ename->vla-object)
	      (vl-remove-if
		(function listp)
		(mapcar (function cadr) (ssnamex ss))
	      ) ;_ vl-remove-if
	    )
    )
    )
)
PS. Для включения/отключения регенерации листов см переменную LayoutRegenCtl
__________________
Как использовать код на Лиспе читаем здесь

Последний раз редактировалось VVA, 14.03.2016 в 18:11. Причина: новая версия
VVA вне форума  
 
Автор темы   Непрочитано 10.03.2016, 14:02
#12
800x600


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


Реализовать вариант без перехода по листам было бы намного интереснее. Но увы, если в файле больше одного листа, то данный код срабатывает только со второго раза. В первый раз выдает ошибку"Ошибка Automation. Не в пространстве листа"

Цитата:
Сообщение от VVA Посмотреть сообщение
Еще вариант без перехода по листам. Вроде работает
Код:
[Выделить все]
 
(defun C:ALLVPOFF nil (_vponoff :vlax-false) (princ))
(defun C:ALLVPON nil (_vponoff :vlax-true) (princ))
(defun _vponoff	(what / ss)
;;;what - :vlax-false or :vlax-true
  (vl-load-com)
  (setvar "tilemode" 1)
  (if (setq
	ss (ssget "_x"
		  (list (cons 0 "VIEWPORT") '(-4 . "<>") (cons 69 1))
	   )
      )
    (mapcar (function (lambda (vp)
			(if (vlax-write-enabled-p vp)
			  (progn
			    (vla-display vp what)
			    (vla-put-viewporton vp what)
			  )
			)
		      )
	    )
	    (mapcar
	      (function vlax-ename->vla-object)
	      (vl-remove-if
		(function listp)
		(mapcar (function cadr) (ssnamex ss))
	      ) ;_ vl-remove-if
	    )
    )
  )
)
800x600 вне форума  
 
Непрочитано 10.03.2016, 18:07
#13
VVA

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


Цитата:
Сообщение от 800x600 Посмотреть сообщение
если в файле больше одного листа, то данный код срабатывает только со второго раза. В первый раз выдает ошибку"Ошибка Automation. Не в пространстве листа"
Я проверял работу так же на нескольких листах. Приложи файл с примером, где вылетает. А так же сообщи версию и разрядность Автокада.
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Автор темы   Непрочитано 14.03.2016, 09:46
#14
800x600


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


Цитата:
Сообщение от VVA Посмотреть сообщение
Я проверял работу так же на нескольких листах. Приложи файл с примером, где вылетает. А так же сообщи версию и разрядность Автокада.
Вот файл. У меня ACAD 2011 x64
Вложения
Тип файла: dwg
DWG 2007
Чертеж1.dwg (134.5 Кб, 10 просмотров)
800x600 вне форума  
 
Непрочитано 14.03.2016, 15:02
1 | #15
VVA

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


Обновил #11
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Автор темы   Непрочитано 14.03.2016, 15:23
#16
800x600


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


Вот сейчас стало работать идеально. VVA спасибо!
800x600 вне форума  
 
Непрочитано 14.03.2016, 16:53
#17
VVA

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


если нужно, то не сложно сделать команду для вкл/откл ВЭ только текущего листа
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Автор темы   Непрочитано 14.03.2016, 17:14
#18
800x600


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


Цитата:
Сообщение от VVA Посмотреть сообщение
если нужно, то не сложно сделать команду для вкл/откл ВЭ только текущего листа
такая команда уже есть. Проверено, работает нормально. Вот она



Код:
[Выделить все]
 ;============включает и гасит ВЭ только на текущем листе

; VPST :        active/desactive toutes les fenetres de l'onglet courant/tous les onglets
; VPAON :       active toutes les fenetres de tous les onglets
; VPON :        active toutes les fenetres de l'onglet courant
; VPAOFF :      desactive toutes les fenetres de tous les onglets
; VPOFF :       desactive toutes les fenetres de l'onglet courant

(defun c:vpon ()
  (gc:AllViewportOn :vlax-true (getvar 'ctab))
  (princ)
)

(defun c:vpaon ()
  (gc:AllViewportOn :vlax-true nil)
  (princ)
)


(defun c:vpoff ()
  (gc:AllViewportOn :vlax-false (getvar 'ctab))
  (princ)
)

(defun c:vpaoff ()
  (gc:AllViewportOn :vlax-false nil)
  (princ)
)

(defun c:vpst (/ option)
        (princ "\nActive/desactive toutes les fenetres de l'onglet courant/tous les onglets")
        (initget "DT AT D A")
        (setq option (getkword "\nChoisissez une option [Desactiver Tous/Activer Tous/Desactiver courant/Activer courant] <Desactiver Tous>: "))
        (cond
                ((= option "AT") (c:vpaon))
                ((= option "A") (c:vpon))
                ((= option "D") (c:vpoff))
                ( T (c:vpaoff))
        )
  (princ)
)


(defun gc:AllViewportOn (bool layout / *error* lrc ss)
  (vl-load-com)
  (or *acad* (setq *acad* (vlax-get-acad-object)))
  (or *acdoc* (setq *acdoc* (vla-get-activeDocument *acad*)))

  (defun *error* (msg)
    (and msg
                (or
                        (member (strcase msg) '("FUNCTION CANCELLED" "QUIT / EXIT ABORT" "FONCTION ANNULEE" "QUITTER / SORTIR ABANDON"))
                        (princ (strcat "\nErreur : " msg))
                )
        )
    (setvar 'layoutregenctl lrc)
    (princ)
  )
  
  (setq lrc (getvar 'layoutregenctl))
  (setvar 'layoutregenctl 0)
  
  (if layout
                (or
                        (/= layout "Model")
                        (progn
                                (princ "\n** Commande non autorisee dans l'onglet Objet**")
                                (quit)
                        )
                )
                (setq layout "~Model")
        )

  (if (ssget "_X" (list(cons 0 "VIEWPORT") (cons 410 layout) (cons -4 "/=") (cons 69 1)))
    (vlax-for vp (setq ss (vla-get-ActiveSelectionSet *acdoc*))
      (vla-put-ViewportOn vp bool)
    )
  )

  (and ss (vla-Delete ss))
  (*error* nil)
)

(princ "\nCommandes: VPST ou VPON, VPOFF, VPAON, VPAOFF")
(princ)
800x600 вне форума  
 
Непрочитано 27.10.2016, 12:02
#19
perpetule


 
Регистрация: 23.09.2008
Волгоград
Сообщений: 810
<phrase 1= Отправить сообщение для perpetule с помощью Skype™


Цитата:
Вот сейчас стало работать идеально. VVA спасибо!
По лиспу #11 выяснился опасный баг, если выключить лиспом ВЭ и попереключать вкладки , вернувшись в отличную от той в которой выключались ВЭ, затем включить их - сбивается место на которое смотрели ВЭ.

P.S. Слава богу вовремя заметил и восстановился из BAK файла, переименовав его же как временный - смоделировал описанный баг и он повторился.
__________________
tc71

Последний раз редактировалось perpetule, 27.10.2016 в 12:07.
perpetule вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > Lisp. Выключение видимости всех видовых экранов

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Создание дополнительных параметров Visibility Set в динамических блоках. Supermax Программирование 708 12.04.2021 14:54
AutoCAD 2011. Проблема с заданием масштабов видовых экранов. Demyan AutoCAD 1 28.11.2010 10:42
Как отключить сетку во всех лайаутах и во всех видовых окнах за раз? dextron3 AutoCAD 12 19.02.2009 16:22
копирование видовых экранов i_s AutoCAD 16 17.12.2005 14:05
Как слой включить сразу во всех видовых экранах ilka_t AutoCAD 4 26.04.2004 11:20