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

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Как в AutoCAD программно заморозить слой на видовом экране?

Как в AutoCAD программно заморозить слой на видовом экране?

Ответ
Поиск в этой теме
Непрочитано 13.03.2015, 13:34 #1
Как в AutoCAD программно заморозить слой на видовом экране?
Bichuch
 
Регистрация: 12.03.2015
Сообщений: 7

Участвую в создании серии рисунков, показывающих последовательность сборки сооружения.
Его элементы разнесены по слоям с присвоением свойства замороженности на новых видовых экранах. Это позволяет удобно получать изображения разных стадий сборки, добавляя видовой экран и выборочно локально включая в нем нужные слои. При этом, естественно, глобально все указанные слои разморожены.
Однако, кроме элементов сооружения, известных заранее, в процессе добавляются заранее неизвестные части сборочной оснастки. Чтобы их видимостью можно было независимо управлять, каждая вставляется на свой новый слой.
И тут возникает вынесенная в название темы задача. Новый слой создается видимым во всех существующих в файле видовых экранах. Приходится каждый раз их включать, заходить внутрь и локально замораживать этот слой. Поэтому было бы очень удобно создавать слой и сразу автоматически локально замораживать его во всех экранах. Тогда останется только разморозить этот слой в одном или нескольких нужных видовых экранах.
Как решить задачу?
Просмотров: 6043
 
Непрочитано 13.03.2015, 14:34
#2
VVA

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


Посмотри команду _vpLayer (Вслой)

----- добавлено через ~1 мин. -----
Обрати внимание, что опции у этой команды в пространстве модели и пространстве листа разные!
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Непрочитано 16.03.2015, 14:18
#3
WhiteShark


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


Вам сюда http://forum.dwg.ru/showthread.php?t=118745
WhiteShark вне форума  
 
Автор темы   Непрочитано 16.03.2015, 20:43
#4
Bichuch


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


VVA
Спасибо за наводку! Действительно, о такой команде я не знал. Посмотрев ту тему понял, что моя задача решается очень просто. В окне слоев надо создавать новый слой не четвертой в строке кнопкой, а пятой. И не только не нужно программирование, но и применять команду _VPLAYER тоже!

WhiteShark
Это круто. Оказалось, что тема актуальна... Однако разнообразные длинные слова
Код:
меня пугают. На простом не-VLISP уровне я делал c видовыми экранами
Код:
[Выделить все]
 (entget (car (entsel)))
и видел там кучу групп 331. Потом прочитал в помощи, что функция
Код:
неприменима к видовым экранам. Загрустил и обратился на форум.
Bichuch вне форума  
 
Автор темы   Непрочитано 03.04.2015, 22:16
#5
Bichuch


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


Однако история на этом не закончилась.

Появилась новая задача: копирование видовых экранов с настроенным локальным замораживанием слоев между файлами. При собственно копировании эти настройки теряются, поэтому возможность программной работы снова стала актуальной.
Была написана программа, сохраняющая в текстовый файл список локально замороженных в данном видовом экране слоев:
Код:
[Выделить все]
 (defun c:FrLaySav ( / dVPdata dOutList dFile)
  (while (not
           (and  
             (princ "Укажите VIEWPORT!")
             (setq dVPdata (entget (car (entsel))))
             (= (cdr (assoc 0 dVPdata)) "VIEWPORT")
           )
         )
  )
  (setq dOutList '())
  (while (setq dVPdata (cdr dVPdata))
    (if (= (car (car dVPdata)) 331)
      (setq dOutList
        (append dOutList
          (list (cdr (assoc 2 (entget (cdr (car dVPdata))))))
        )
      )
    )
  )
  (setq dFile (open (strcat (getvar "TEMPPREFIX") "$q$q$.$$$") "w"))
  (prin1 dOutList dFile)
  (close dFile)
  dOutList
)
И программа, которая их считывает из текстового файла и применяет к указанному видовому экрану, в том же или другом DWG-файле:
Код:
[Выделить все]
 (defun c:FrLayLoa ( / dVPdata dOutList dFilNam dFilPtr)
  (while (not
           (and  
             (princ "Укажите VIEWPORT!")
             (setq dVPdata (entget (car (entsel))))
             (= (cdr (assoc 0 dVPdata)) "VIEWPORT")
           )
         )
  )
  (setq dFilNam (strcat (getvar "TEMPPREFIX") "$q$q$.$$$"))
  (if (setq dFilPtr (open dFilNam "r"))
    (progn
      (setq dOutList (read (read-line dFilPtr)))
      (close dFilPtr)
      (setq dVPdata (cdr (assoc -1 dVPdata)))
      (mapcar
        '(lambda (x)
           (WS-VpLayFreeze x dVPdata)
        )
        dOutList
      )
    )
    (princ (strcat "\nФайл \"" dFilNam "\" не найден!\n"))
  )
  (princ)
)
Здесь функция
Код:
[Выделить все]
 WS-VpLayFreeze
взята из рекомендованной мне темы.

Результат пока отрицательный. Окно слоев показывает, что их локальная заморозка происходит. Однако на деле отображение в соответствующем видовом экране не меняется, такую же информацию показывает и раскрывающийся список слоев - без локальной заморозки!
Работа ведется в русском AutoCAD2012.
Я склоняюсь к мысли, что WS-VpLayFreeze работает не совсем. В какой системе ее испытывали?

Последний раз редактировалось Bichuch, 06.04.2015 в 12:58.
Bichuch вне форума  
 
Непрочитано 04.04.2015, 21:49
#6
WhiteShark


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


Всё работает. Но есть одна известная проблема обновления отображения этого на экране. Достаточно переключиться между моделью и лэйаутами. Или добавить следущее в код:

(setq lrc (getvar "LAYOUTREGENCTL"))
(setvar "LAYOUTREGENCTL" 0)
(setvar "tilemode" 1)
(setvar "tilemode" 0)
(setvar "LAYOUTREGENCTL" lrc)
WhiteShark вне форума  
 
Автор темы   Непрочитано 06.04.2015, 18:36
#7
Bichuch


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


WhiteShark
Спасибо! Да, после вставления новых операторов все работает, как изначально предполагалось. Вот новый текст:
Код:
[Выделить все]
 (defun c:FrLayLoa ( / dVPdata dOutList dFilNam dFilPtr dOldLRC)
  (while (not
           (and  
             (princ "Укажите VIEWPORT!")
             (setq dVPdata (entget (car (entsel))))
             (= (cdr (assoc 0 dVPdata)) "VIEWPORT")
           )
         )
  )
  (setq dFilNam (strcat (getvar "TEMPPREFIX") "$q$q$.$$$"))
  (if (setq dFilPtr (open dFilNam "r"))
    (progn
      (setq dOutList (read (read-line dFilPtr)))
      (close dFilPtr)
      (setq dVPdata (cdr (assoc -1 dVPdata)))
      (mapcar
        '(lambda (x)
           (if (tblsearch "LAYER" x)
             (WS-VpLayFreeze x dVPdata)
             (princ (strcat "\nСлой \"" x "\" отсутствует в данном DWG-файле"))
           )
        )
        dOutList
      )
      (princ "\n")
      (setq dOldLRC (getvar "LAYOUTREGENCTL"))
      (setvar "LAYOUTREGENCTL" 0)
      (setvar "TILEMODE" 1)
      (setvar "TILEMODE" 0)
      (setvar "LAYOUTREGENCTL" dOldLRC)
    )
    (princ (strcat "\nФайл \"" dFilNam "\" не найден!\n"))
  )
  (princ)
)
Однако... Ваша функция добавляет к свойствам видового экрана информацию о локально замороженных слоях. Она не может обеспечить именно копирование настроек слоев, т.к. в общем случае для это может требоваться и удаление каких-то слоев из набора локально замороженных. Получается, что сейчас сначала надо вручную очистить этот набор, а потом с помощью программы заполнить заново. Поэтому было бы очень полезно иметь функцию для программной очистки данных о локально замороженных в видовом экране слоях. Тогда можно было бы реализовать именно копирование состояния слоев между видовыми экранами с бОльшей автоматизацией действий.
Bichuch вне форума  
 
Автор темы   Непрочитано 10.04.2015, 21:12
#8
Bichuch


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


По аналогии с (WS-VpLayFreeze ...) была испытана такая функция:
Код:
[Выделить все]
 (defun ClearVpLayFreeze (VpEnt / dData dValue dDataNew dValueNew dTmp dOldLRC)
  (vl-load-com)
  (vla-GetXData (vlax-ename->vla-object VpEnt) "ACAD" 'dData 'dValue)
  (setq dData (vlax-safearray->list dData))
  (setq dValue (vlax-safearray->list dValue))
  (setq dDataNew '())
  (setq dValueNew '())
  (mapcar
    '(lambda (data value)
      (if (/= data 1003)
        (progn
          (setq dDataNew (append dDataNew (list data)))
          (setq dValueNew (append dValueNew (list value)))
        )
      )
    )
    dData
    dValue
  )
  (setq dTmp (cons 1 (length dDataNew)))
  (setq dData (vlax-make-safearray vlax-vbinteger dTmp))
  (setq dValue (vlax-make-safearray vlax-vbvariant dTmp))
  (setq dDataNew (vlax-safearray-fill dData dDataNew))
  (setq dValueNew (vlax-safearray-fill dValue dValueNew))
  (vla-SetXData (vlax-ename->vla-object VpEnt) dDataNew dValueNew)
  (setq dOldLRC (getvar "LAYOUTREGENCTL"))
  (setvar "LAYOUTREGENCTL" 0)             
  (setvar "TILEMODE" 1)                   
  (setvar "TILEMODE" 0)                   
  (setvar "LAYOUTREGENCTL" dOldLRC)       
)
Она отрабатывает без ошибок, но и не приводит к желаемому результату. Локальная заморозка слоев в видовом окне не убирается.
Успешным оказался только программный вызов команды _VPLAYER, что привело к новой версии:
Код:
[Выделить все]
 (defun c:FrLayLoa ( / dVPdata dOutList dFilNam dFilPtr dOldLRC)
  (while (not
           (and  
             (princ "Укажите VIEWPORT!")
             (setq dVPdata (entget (car (entsel))))
             (= (cdr (assoc 0 dVPdata)) "VIEWPORT")
           )
         )
  )
  (setq dFilNam (strcat (getvar "TEMPPREFIX") "$q$q$.$$$"))
  (if (setq dFilPtr (open dFilNam "r"))
    (progn
      (setq dOutList (read (read-line dFilPtr)))
      (close dFilPtr)
      (setq dVPdata (cdr (assoc -1 dVPdata)))
      (command "_.VPLAYER" "_T" "*" "_S" dVPdata "" "")
      (mapcar
        '(lambda (x)
           (if (tblsearch "LAYER" x)
             (WS-VpLayFreeze x dVPdata)
             (princ (strcat "\nСлой \"" x "\" отсутствует в данном DWG-файле"))
           )
        )
        dOutList
      )
      (princ "\n")
      (setq dOldLRC (getvar "LAYOUTREGENCTL"))
      (setvar "LAYOUTREGENCTL" 0)             
      (setvar "TILEMODE" 1)                   
      (setvar "TILEMODE" 0)                   
      (setvar "LAYOUTREGENCTL" dOldLRC)       
    )
    (princ (strcat "\nФайл \"" dFilNam "\" не найден!\n"))
  )
  (princ)
)
Таким образом, обеспечивается копирование состояния локальной замороженности всех слоев между видовыми экранами.
Bichuch вне форума  
 
Автор темы   Непрочитано 13.04.2015, 17:58
#9
Bichuch


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


После некоторых размышлений понял, что все надо делать проще:
Код:
[Выделить все]
 (defun c:FrLayLoa ( / dVPdata dOutList dFilNam dFilPtr)
  (while (not
           (and  
             (princ "Укажите VIEWPORT!")
             (setq dVPdata (entget (car (entsel))))
             (= (cdr (assoc 0 dVPdata)) "VIEWPORT")
           )
         )
  )
  (setq dFilNam (strcat (getvar "TEMPPREFIX") "$q$q$.$$$"))
  (if (setq dFilPtr (open dFilNam "r"))
    (progn
      (setq dOutList (read (read-line dFilPtr)))
      (close dFilPtr)
      (setq dVPdata (cdr (assoc -1 dVPdata)))
      (command "_.VPLAYER" "_T" "*" "_S" dVPdata "" "")
      (mapcar
        '(lambda (x)
           (if (tblsearch "LAYER" x)
             (command "_.VPLAYER" "_F" x "_S" dVPdata "" "")
             (princ (strcat "\nСлой \"" x "\" отсутствует в данном DWG-файле."))
           )
        )
        dOutList
      )
      (princ "\n")
    )
    (princ (strcat "\nФайл \"" dFilNam "\" не найден!\n"))
  )
  (princ)
)
А использование (WS-VpLayFreeze ...) является в моей задаче избыточным.

Последний раз редактировалось Bichuch, 13.04.2015 в 18:04.
Bichuch вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Как в AutoCAD программно заморозить слой на видовом экране?

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Видеоуроки AutoCAD kosmax AutoCAD 173 17.02.2017 15:08
В русской версии AutoCAD 2010 SP1 32-bit файл Acad.PGP содержит ошибки. hwd Баги и пожелания в Autodesk 21 21.04.2010 20:27
При приближении "уплывает" чертеж в видовом экране _Sly_ AutoCAD 25 19.11.2009 10:13
Информация по идентификационным кодам программ в сетевых лицензиях Autodesk KSI AutoCAD 1 14.09.2009 15:59