|
||
| Правила | Регистрация | Пользователи | Сообщения за день | | Поиск | | Справка по форуму | Файлообменник | |
|
![]() |
Поиск в этой теме |
![]() |
#1 | |
Блокировка слоев - напоминалка.
Проектировщик свиноводство
Регистрация: 21.08.2003
Сообщений: 2,290
|
||
Просмотров: 15830
|
|
||||
Сообщений: n/a
|
если бы мне припёрло я бы написал лисп, вынимающий всю информацию о слоях и анализарующий её напредмет блокировки. в случае блокировки- некое междумордие, например хотя- бы alert'ом
оный лисп я бы вызывал из acad.lsp ЗЫ. у меня acad.lsp загружается с каждым чертежом. это опционально, значит наверное можно сделать не так, хоть и не знаю зачем |
|||
|
||||
Регистрация: 21.08.2003
Штаб
Сообщений: 943
![]() |
Можно командой START запускать простую программу (например на Си), которая создает небольшое окно с атрибутом "все время наверху", в котором и будет отображаться напоминание. Тогда можно продолжать работу с Акадом и одновременно любоваться напоминанием :)
|
|||
![]() |
|
||||
LISP-программист Регистрация: 25.08.2003
Тутэйшы
Сообщений: 238
|
Думаю нужно использовать реакторы. Примерно так:
;;; Создаем реактор выполнения команды (vlr-command-reactor nil (list '(:vlr-commandEnded . gis-getLayersLockInfo))) ;;; И функцию отклика на событие "Завершение команды" (defun gis-getLayersLockInfo (vlr:reactor lst ![]() (setq vla:layersCollection (vla-get-layers (vla-get-activeDocument (vlax-get-acad-object) ) ;_ vla-get-activeDocument ) ;_ vla-get-layers ) ;_ setq (vlax-for a vla:layersCollection (if (= (vla-get-lock a) :vlax-true) (setq lst:result (cons (vla-get-name a) lst:result)) ) ;_ if ) ;_ vlax-for (if lst:result (progn (setvar "MODEMACRO" "* Locked *") (acad_strlsort lst:result) ) ;_ progn (setvar "MODEMACRO" "* Nolocked *") ) ;_ if lst:result ) ;_ defun Включаем этот текст в LISP-файл автозагрузки и в результате получаем в строке состояния текст * Locked *, если в рисунке есть блокированные слои и * Nolocked *, если нету. Данная зарисовка далека от совершенства: можно анализировать имя завершенной команды и обрабатывать только команду LAYER, нужно обрабатывать события открытия существующего рисунка и создания нового, нужно отслеживать состояния реакторов (отключать/включать по необходимости) но принцип, я думаю, ясен. :!: Примечание: функция тестировалась (в течение 2-х минут 8) ) на AutoCAD 2004 eng. Вероятность ошибок очень велика.
__________________
Там все есть для счастья - меня там только нет. Так это значит, что я там - буду! |
|||
![]() |
|
||||
Проектировщик свиноводство Регистрация: 21.08.2003
Сообщений: 2,290
|
Цитата:
Поэтому я и ставил задачу только контроля наличия хотя бы одного заблокированного слоя. |
|||
![]() |
|
||||
сисадмин Регистрация: 26.08.2003
Самара
Сообщений: 1,022
![]() |
Размерчики списка можно подправить
![]() скачайте FixCombos с http://www.cadwerx.net и установите в Appload->Content немного глючит с визуализацией кнопочки, но список огроооомный на весь экран :shock: |
|||
![]() |
|
||||
Проектировщик свиноводство Регистрация: 21.08.2003
Сообщений: 2,290
|
2 kos
На мой взгляд идея с реакторами и modemacro - самая продуктивная. (я, к примеру, в строку состояния вывожу текущий стиль и текущую высоту текста). Туда действительно можно и инфу о блокировки слоев добавить. Но! :!: К сожалению я вовсе не разбираюсь в реакторах - пока что совершенно нет времени их изучать. А твоя, kos, программа при загрузке выдала: no function definition: VLR-COMMAND-REACTOR Прошу твоей помощи! :!: Зы. А может у меня не работает, потому что Акад-2000? |
|||
![]() |
|
||||
LISP-программист Регистрация: 25.08.2003
Тутэйшы
Сообщений: 238
|
Pilot'у:
Цитата:
(vl-load-com) Кстати, я нашел еще один момент: если блокируешь/разблокируешь слои командой LAYER или чарез кнопку Layer Properties Manager (что суть тоже команда LAYER), реактор отрабатывает нормально, а если через Layers Toolbar - не работает. Так что скорее всего нужно использовать реактор не на завершение команды, а на какое-то другое событие. Я тоже не использую реакторы в повседневной работе. Так, ознакомился с целью развития кругозора. Так что не требуйте от меня полной и корректной реализации - нет времени. Да и сам ты закончил свое сообщение, открывающее тему, вопросом Идеи есть? Так это только идея. ![]()
__________________
Там все есть для счастья - меня там только нет. Так это значит, что я там - буду! |
|||
![]() |
|
||||
Проектировщик свиноводство Регистрация: 21.08.2003
Сообщений: 2,290
|
2 kos
Заработало! Большое спасибо! Причем заработало и из-под моей собственной, очень удобной кстати, проги по блокировке слоев. Ну это и понятно: я там использую (command "_layer" ...) Так что мне осталось только слить две modemacro в одну - твою с инфой о блокировке и мою с инфой о текущем текстовом стиле. А Layers Toolbar я вообще применяю крайне редко. |
|||
![]() |
|
||||
Сообщений: n/a
|
Хочу просто уберечь от возможных проблем. В LISP c реакторами надо очень осторожно. Особенно с реакторами на команды. Основные проблемы возникают, по моему, потому что LISP работает только в активном документе. А есть команды NEW, OPEN и т.д., которые приводят к смене активного документа. Часто нарывался на ошибки типа:
RunTime Error! abnormal program termination Fatal error: No Lisp context, exiting. FATAL ERROR: Unhandled Access Violation Readidng ... Причем после них ACAD сразу вываливается. Иногда даже и не предлагает сохранить изменения. Ошибки именно ВОЗМОЖНЫЕ, но не обязательные. В одном и том же файле, на одной и той же машине девять раз может все пройти нормально, а на десятый вывалиться. Чем медленнее машина и чем (в данном случае) больше слоев, тем больше вероятность ошибки. Попробуйте с подобным реактором на команды создать в чертеже побольше слоев, а потом (не закрывая этого) откройте какой-нибудь другой. С какого-то раза должна быть ошибка. В данном случае можно (как сказал kos) в начале реактора делать проверку на то, что это именно команда LAYER. Это сильно снизит вероятность подобных ошибок, но не уверен, что позволит избежать их совсем. Такие вещи лучше связывать не с командой, а с изменением базы данных чертежа (vlr-acdb-reactor). Это позволит отследить и изменение состояния слоя из Toolbar, и внутри такого реактора можно отследить, что изменение сделал именно объект LAYER. В общем где-то так: (vl-load-com) (if (not (equal (type __layer_locked_reactor__) 'vlr-acdb-reactor)) (setq __layer_locked_reactor__ (vlr-acdb-reactor nil (list '(:vlr-objectModified . __layer_locked_callback__)))) (if (not (vlr-added-p __layer_locked_reactor__)) (vlr-add __layer_locked_reactor__) );if );if (defun __layer_locked_callback__ (reac param / ) (if (and (= (type (cadr param)) 'ENAME) (= (cdr (assoc 0 (entget (cadr param)))) "LAYER") );and (__layer_locked_modemacro__) );if );defun (defun __layer_locked_modemacro__ ( / lr erlock) (setq erlock nil) (vlax-for lr (vla-get-Layers (vla-get-ActiveDocument (vlax-get-acad-object))) (if (= (vla-get-Lock lr) :vlax-true) (setq erlock t) );if );vlax-for (if erlock (setvar "MODEMACRO" "* Locked *") (setvar "MODEMACRO" "* Nolocked *") );if );defun (__layer_locked_modemacro__) И по хорошему надо еще отслеживать событие активизации документа (опять таки лучше не на LISP). Если открыто несколько чертежей - в одном могут быть заблокированные слои, а в другом нет. |
|||
|
||||
Проектировщик свиноводство Регистрация: 21.08.2003
Сообщений: 2,290
|
2 leha
Вот сколько времени прошло: более 1.5 месяцев! Текущая работа заела ![]() Но наконец-то я "внедрил" твою прогу к себе и слил вместе две modemacr-ы. Удобно :!: . Спасибо всем кто заинтересовался проблемой. Пока что все работает. Если будут глюки - сообщу. |
|||
![]() |
|
||||
Проектировщик свиноводство Регистрация: 21.08.2003
Сообщений: 2,290
|
К огромному сожалению, глюки продолжаются. И намного более серьезные:
1. В одном весьма нагруженном чертеже при запуске лисп-программы по очистке слоя от примитивов - аварийное завершение работы Акада без каких-либо предупреждений. ![]() 2. В достаточно легком чертеже при выполнении команд _saveas и _save - то же самое. ![]() После отключения программы мониторинга блокированных слоев все заработало нормально. Досадно :cry: |
|||
![]() |
|
||||
ACAD, UG, CATIA - программирование Регистрация: 17.09.2003
Таганрог
Сообщений: 9
|
> Pilot
У меня подобные проблемы были и при простой смене Layout, в пустом чертеже ![]() Могу предложить использовать VBA - события на VBA работают намного лучше, чем аналогичные реакторы в LISP. В новом проекте в окне ThisDrawing (Code) напиши: Option Explicit Private Sub AcadDocument_ObjectModified(ByVal Object As Object) If TypeName(Object) = "IAcadLayer" Then Call IsLayerLocked End Sub Private Sub AcadDocument_Activate() Call IsLayerLocked End Sub Добавь Module1, и в окне Module1 (Code) напиши: Option Explicit Public Sub IsLayerLocked() Dim LR As AcadLayer For Each LR In ActiveDocument.Layers If LR.Lock Then Call SetModeMacro("*Locked*") Exit Sub End If Next Call SetModeMacro("*No Locked*") End Sub Private Sub SetModeMacro(ByVal lckd As String) Dim oldModeMacro As String Dim mypos As Long oldModeMacro = ActiveDocument.GetVariable("MODEMACRO") mypos = InStr(oldModeMacro, "*Locked*") If mypos > 0 Then oldModeMacro = Left(oldModeMacro, mypos - 1) & _ Mid(oldModeMacro, mypos + 8) mypos = InStr(oldModeMacro, "*No Locked*") If mypos > 0 Then oldModeMacro = Left(oldModeMacro, mypos - 1) & _ Mid(oldModeMacro, mypos + 11) ActiveDocument.SetVariable "MODEMACRO", lckd & oldModeMacro End Sub Сохрани проект, например, под именем "LayerEvent.dvb". В каком-то из автозагрузочных файлов добавь: (if (setq fl (findfile "LayerEvent.dvb")) (vl-vbarun (strcat fl "!Module1.IsLayerLocked")) );if И сообщи о результатах ![]() Могут быть нюансы с тем, что в MODEMACRO должна, кроме этого, отображаться еще какая-то информация. Нужно точно знать, что ты туда передаешь и каким способом. |
|||
![]() |
|
||||
Проектировщик свиноводство Регистрация: 21.08.2003
Сообщений: 2,290
|
2 leha
Спасибо за ответ. К сожалению, на VBA я никогда не программировал. Посему такая новая для меня задача может быть отложена на неопределенное время в связи с загруженностью по работе. Если только дома... Но о реакторах: Коли они такие кривые, для чего были задуманы? Или по Черномырдину: "Хотели как лучше, а получилось как всегда" ? |
|||
![]() |
![]() |
|
|
![]() |
||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Для чего нужны фильтры слоев?Как ими пользоваться? | Aysulu | AutoCAD | 43 | 17.04.2019 10:59 |
Отключение непечатаемых слоев | Makswell | Программирование | 5 | 05.09.2007 13:30 |
Фильтр слоев | Alexander_Liseev | AutoCAD | 7 | 01.03.2006 03:18 |
Сохранить настройки слоев чертежа, обьекты | Алексей К. | AutoCAD | 6 | 24.06.2005 15:24 |
Фильтры слоев | Vova | AutoCAD | 12 | 03.12.2004 16:38 |