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

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

Блокировка слоев - напоминалка.

Ответ
Поиск в этой теме
Непрочитано 09.09.2003, 10:57 #1
Блокировка слоев - напоминалка.
Pilot
 
Проектировщик свиноводство
 
Регистрация: 21.08.2003
Сообщений: 2,260

В последнее время получил вкус к блокировке слоев. Ранее как-то не пользовался, но оказалось очень удобно.

Но всплыла одна проблема - собственная память: заблокировал пару слоев, поработал, поработал и забыл. А потом при дальнейшем редактировании начинают увечиться чертежи.

Итак. Каким образом можно (и можно ли) на экране выдавать постоянно висящее предупреждение, что хотябы один слой заблокирован? Не исключаю, что проблему придется решать программно, может быть даже на Дизеле. Идеи есть?

Советы тренировать память не пройдут
Просмотров: 13185
 
Непрочитано 09.09.2003, 12:25
#2
Shtirlitz

Работаю, знаете-ли.
 
Регистрация: 21.08.2003
Ukranian
Сообщений: 28


Присоединяюсь к просьбе Pilot'а. Буду признателен.
Shtirlitz вне форума  
 
Непрочитано 09.09.2003, 13:26
#3
DronT


 
Сообщений: n/a


если бы мне припёрло я бы написал лисп, вынимающий всю информацию о слоях и анализарующий её напредмет блокировки. в случае блокировки- некое междумордие, например хотя- бы alert'ом

оный лисп я бы вызывал из acad.lsp

ЗЫ. у меня acad.lsp загружается с каждым чертежом. это опционально, значит наверное можно сделать не так, хоть и не знаю зачем
 
 
Непрочитано 09.09.2003, 14:35
#4
Torino


 
Регистрация: 21.08.2003
Штаб
Сообщений: 943
<phrase 1=


Можно командой START запускать простую программу (например на Си), которая создает небольшое окно с атрибутом "все время наверху", в котором и будет отображаться напоминание. Тогда можно продолжать работу с Акадом и одновременно любоваться напоминанием :)
Torino вне форума  
 
Непрочитано 09.09.2003, 14:50
#5
Vova

Engineer
 
Регистрация: 05.09.2003
New-York
Сообщений: 10,288


У нас на черт. могут быть сотни и сотни слоев, десятки из которых заблокированы. В окошке контроля слоев есть символы, на которые надо смотреть.
Vova вне форума  
 
Непрочитано 09.09.2003, 14:52 Блокировка слоев
#6
Arkady

AutoCad Development and Support
 
Регистрация: 21.08.2003
Israel
Сообщений: 183
Отправить сообщение для Arkady с помощью Skype™


Можно и на VBA(VB) ,но по моему это лишние сложности.
Arkady вне форума  
 
Непрочитано 09.09.2003, 14:58
#7
kos

LISP-программист
 
Регистрация: 25.08.2003
Тутэйшы
Сообщений: 238


Думаю нужно использовать реакторы. Примерно так:

;;; Создаем реактор выполнения команды
(vlr-command-reactor nil (list '(:vlr-commandEnded . gis-getLayersLockInfo)))

;;; И функцию отклика на событие "Завершение команды"
(defun gis-getLayersLockInfo
(vlr:reactor lstaram / vla:layersCollection lst:result)
(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. Вероятность ошибок очень велика.
__________________
Там все есть для счастья - меня там только нет.
Так это значит, что я там - буду!
kos вне форума  
 
Автор темы   Непрочитано 09.09.2003, 15:21
#8
Pilot

Проектировщик свиноводство
 
Регистрация: 21.08.2003
Сообщений: 2,260


Цитата:
Сообщение от Vova
...В окошке контроля слоев есть символы, на которые надо смотреть.
Но для этого окошко (список) нужно раскрывать, а если он длинный, то еще и прокручивать.
Поэтому я и ставил задачу только контроля наличия хотя бы одного заблокированного слоя.
Pilot вне форума  
 
Непрочитано 09.09.2003, 19:22
#9
Startrek

AutoCAD/AutoLISP
 
Регистрация: 27.08.2003
Seattle/USA
Сообщений: 1,133


A ETO NE TO LI CHTO VI ISHITE? SM KARTINKU
[ATTACH]1063120936.jpg[/ATTACH]
Startrek вне форума  
 
Непрочитано 09.09.2003, 19:44
#10
vk

сисадмин
 
Регистрация: 26.08.2003
Самара
Сообщений: 1,022
<phrase 1=


Размерчики списка можно подправить
скачайте FixCombos с http://www.cadwerx.net и установите в Appload->Content
немного глючит с визуализацией кнопочки, но список огроооомный на весь экран :shock:
vk вне форума  
 
Автор темы   Непрочитано 10.09.2003, 09:16
#11
Pilot

Проектировщик свиноводство
 
Регистрация: 21.08.2003
Сообщений: 2,260


2 kos

На мой взгляд идея с реакторами и modemacro - самая продуктивная.
(я, к примеру, в строку состояния вывожу текущий стиль и текущую высоту текста). Туда действительно можно и инфу о блокировки слоев добавить.

Но! :!:

К сожалению я вовсе не разбираюсь в реакторах - пока что совершенно нет времени их изучать.

А твоя, kos, программа при загрузке выдала:

no function definition: VLR-COMMAND-REACTOR

Прошу твоей помощи! :!:

Зы. А может у меня не работает, потому что Акад-2000?
Pilot вне форума  
 
Непрочитано 10.09.2003, 09:51
#12
kos

LISP-программист
 
Регистрация: 25.08.2003
Тутэйшы
Сообщений: 238


Pilot'у:

Цитата:
А твоя, kos, программа при загрузке выдала:

no function definition: VLR-COMMAND-REACTOR
Действительно, выдала! Это есть результат написания функции "за 5 минут". Нужно добавить перед приведенным мною текстом функцию
(vl-load-com)

Кстати, я нашел еще один момент: если блокируешь/разблокируешь слои командой LAYER или чарез кнопку Layer Properties Manager (что суть тоже команда LAYER), реактор отрабатывает нормально, а если через Layers Toolbar - не работает. Так что скорее всего нужно использовать реактор не на завершение команды, а на какое-то другое событие.

Я тоже не использую реакторы в повседневной работе. Так, ознакомился с целью развития кругозора. Так что не требуйте от меня полной и корректной реализации - нет времени. Да и сам ты закончил свое сообщение, открывающее тему, вопросом Идеи есть? Так это только идея.
__________________
Там все есть для счастья - меня там только нет.
Так это значит, что я там - буду!
kos вне форума  
 
Автор темы   Непрочитано 10.09.2003, 11:14
#13
Pilot

Проектировщик свиноводство
 
Регистрация: 21.08.2003
Сообщений: 2,260


2 kos

Заработало! Большое спасибо!
Причем заработало и из-под моей собственной, очень удобной кстати, проги по блокировке слоев. Ну это и понятно: я там использую (command "_layer" ...)

Так что мне осталось только слить две modemacro в одну - твою с инфой о блокировке и мою с инфой о текущем текстовом стиле.

А Layers Toolbar я вообще применяю крайне редко.
Pilot вне форума  
 
Непрочитано 10.09.2003, 14:04
#14
leha


 
Сообщений: 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). Если открыто несколько чертежей - в одном могут быть заблокированные слои, а в другом нет.
 
 
Автор темы   Непрочитано 03.11.2003, 13:56
#15
Pilot

Проектировщик свиноводство
 
Регистрация: 21.08.2003
Сообщений: 2,260


2 leha
Вот сколько времени прошло: более 1.5 месяцев! Текущая работа заела .
Но наконец-то я "внедрил" твою прогу к себе и слил вместе две modemacr-ы. Удобно :!: . Спасибо всем кто заинтересовался проблемой.
Пока что все работает. Если будут глюки - сообщу.
Pilot вне форума  
 
Автор темы   Непрочитано 03.11.2003, 14:47
#16
Pilot

Проектировщик свиноводство
 
Регистрация: 21.08.2003
Сообщений: 2,260


Обнаружился первый глюк, который, впрочем, был спрогнозирован:
В многодокументном режиме инфа о наличии блокированных слоев взаимно игнорируется в разных чертежах.
Pilot вне форума  
 
Автор темы   Непрочитано 05.11.2003, 11:19
#17
Pilot

Проектировщик свиноводство
 
Регистрация: 21.08.2003
Сообщений: 2,260


К огромному сожалению, глюки продолжаются. И намного более серьезные:

1. В одном весьма нагруженном чертеже при запуске лисп-программы по очистке слоя от примитивов - аварийное завершение работы Акада без каких-либо предупреждений.

2. В достаточно легком чертеже при выполнении команд _saveas и _save - то же самое.

После отключения программы мониторинга блокированных слоев все заработало нормально.
Досадно :cry:
Pilot вне форума  
 
Непрочитано 05.11.2003, 11:55
#18
leha

ACAD, UG, CATIA - программирование
 
Регистрация: 17.09.2003
Таганрог
Сообщений: 9


> Pilot
У меня подобные проблемы были и при простой смене Layout, в пустом чертеже При варианте kos Вт Сен 09, 2003 14:58 такого не было, но были те же проблемы при смене документа. ИМХО, реакторы в LISP вообще штука не очень надежная. Написал бы на мыло, я сюда не часто захожу.
Могу предложить использовать 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 должна, кроме этого, отображаться еще какая-то информация. Нужно точно знать, что ты туда передаешь и каким способом.
leha вне форума  
 
Непрочитано 05.11.2003, 12:04
#19
leha

ACAD, UG, CATIA - программирование
 
Регистрация: 17.09.2003
Таганрог
Сообщений: 9


В процедуре SetModeMacro вместо рожицы должна быть восьмерка с закрывающейся скобкой.
leha вне форума  
 
Автор темы   Непрочитано 05.11.2003, 12:07
#20
Pilot

Проектировщик свиноводство
 
Регистрация: 21.08.2003
Сообщений: 2,260


2 leha
Спасибо за ответ.
К сожалению, на VBA я никогда не программировал. Посему такая новая для меня задача может быть отложена на неопределенное время в связи с загруженностью по работе. Если только дома...

Но о реакторах: Коли они такие кривые, для чего были задуманы? Или по Черномырдину: "Хотели как лучше, а получилось как всегда" ?
Pilot вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Блокировка слоев - напоминалка.

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Для чего нужны фильтры слоев?Как ими пользоваться? 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