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

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

Защита блока от редактирования с помощью реакторов

Ответ
Поиск в этой теме
Непрочитано 29.01.2020, 16:17 #1
Защита блока от редактирования с помощью реакторов
Tonic
 
Воронеж
Регистрация: 26.06.2007
Сообщений: 145

Добрый день!
Возможно ли защитить блоки (не все подряд, а только имеющие определённые расширенные данные) от попыток редактирования? Например, чтобы при событии vlr-subObjModified (изменён подпримитив объекта) или vlr-modified (объект изменён) срабатывала команда Undo.
То ли это реактор объектов (но тогда придётся всегда следить за актуальным списком объектов), то ли реактор событий изменения базы рисунка (что предпочтительнее). Может, есть готовые части программ (не нашёл, а LockObjects от Lee Mac работает не так, как нужно)?
Просмотров: 1985
 
Непрочитано 29.01.2020, 16:55
#2
Сергей812


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


ну вот пример на .Net защиты от удаления по XData. А так проще перенести на анонимный заблокированный слой, имхо.
Сергей812 вне форума  
 
Непрочитано 29.01.2020, 17:03
#3
Кулик Алексей aka kpblc
Moderator

LISP, C# (ACAD 200[9,12,13,14])
 
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 37,240


Цитата:
Сообщение от Сергей812 Посмотреть сообщение
анонимный заблокированный слой
Это как - анонимный слой?
__________________

---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 29.01.2020, 17:19
#4
Сергей812


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


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
Это как - анонимный слой?
я про это - есть подозрение, что через DXF/ActiveX это не доступно.
Сергей812 вне форума  
 
Непрочитано 29.01.2020, 17:19
#5
kp+

идущий по граблям
 
Регистрация: 26.05.2005
Днепройт
Сообщений: 4,199


Цитата:
Сообщение от Tonic Посмотреть сообщение
Возможно ли защитить блоки (не все подряд, а только имеющие определённые расширенные данные) от попыток редактирования?
А откуда дровишки от кого защищаетесь - от добропорядочных криворуких пользователей или от злобных расхитителей социалистической интеллектуальной собственности?
Если от криворуких пользователей, чтобы они не перегадили блоки, которые предназначены для автоматической обработки - то может пойти другим путем? Записать в словарь блока копию всех DXF-кодов его графических примитивов (кроме entname) и при необходимости сравнивать имеющийся с эталоном (или даже восстанавливать поврежденный).
Если от халявщиков - тогда, наверное, как сказано в #2, короче, лезть в глубину глубин кроличьей норы
__________________
Одно меня лишь радует - я это вижу сам! (С)

Последний раз редактировалось kp+, 29.01.2020 в 17:25.
kp+ вне форума  
 
Автор темы   Непрочитано 29.01.2020, 17:21
#6
Tonic


 
Регистрация: 26.06.2007
Воронеж
Сообщений: 145


Сергей812, Спасибо, но тема создана в разделе LISP, а не .NET. Интересует, возможно ли сделать это с помощью реакторов — каких и как.
kp+, простая защита от переделки блоков: понятно, что с реакторами потребуется всегда подгружать через acaddoc функцию действия (и пользователь всегда сможет отменить такую загрузку), поэтому это простая защита. Со словарями DXF работать муторно — придётся всегда дополнительно программно обрабатывать любые изменения в блоке. Хотелось бы иметь решение без использования словарей и ведения списка объектов — именно по реакции на событие изменения вызывать функцию, которая бы понимала, "наш" ли блок пытается подвергнуться изменению, и если "наш" — отменять это действие. Или что-то подобное.

Последний раз редактировалось Tonic, 29.01.2020 в 17:27.
Tonic вне форума  
 
Непрочитано 29.01.2020, 17:32
#7
Сергей812


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


имхо, дергать Undo внутри реактора изменения примитива - не самая лучшая идея. Самое простое - перенести на заблокированный слой. Можно не анонимный, анонимный предложил - чтобы обычные пользователи не смогли отключить блокировки слоя даже при сильном желании через менеджеров слоев. Ну или отслеживать запуск команд редактирования блока через vlr-command-reactor
Сергей812 вне форума  
 
Непрочитано 29.01.2020, 17:41
#8
kp+

идущий по граблям
 
Регистрация: 26.05.2005
Днепройт
Сообщений: 4,199


Цитата:
Сообщение от Tonic Посмотреть сообщение
придётся всегда дополнительно программно обрабатывать любые изменения в блоке
А я и не предлагал этого. Я предложил проверять при необходимости, не стал ли "свой" блок "чужим". Например, перед автоматической обработкой чертежа. Или перед сохранением, перед печатью. Реакторы на эти события гораздо проще и случаются они реже.
Для чего необходимо один раз, сразу после создания записать в словарь блока инфу о его "первозданном" виде.
И если перед контролируемыми действиями прога обнаружит несоответствие реального блока эталону, то выдаст предупреждение пользователю/запретит обработку-сохранение-печать/вызовет админа-службу внутренней безопасности-охотников за привидениями
__________________
Одно меня лишь радует - я это вижу сам! (С)

Последний раз редактировалось kp+, 29.01.2020 в 17:50.
kp+ вне форума  
 
Непрочитано 29.01.2020, 18:10
#9
Boxa

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


Как тут не вспомнить про механизм стандартов, который в ОднойКомпании придумали, пару пробных плагинов написали, да и плюнули... дальше ползуны сами пишите... А ведь он тут прям в кассу....
__________________
_бложиг
Boxa вне форума  
 
Автор темы   Непрочитано 29.01.2020, 18:15
#10
Tonic


 
Регистрация: 26.06.2007
Воронеж
Сообщений: 145


kp+, для этого варианта при каждой вставке блока нужно будет проходить по всем входящим примитивам, вычленять некоторые DXF-группы и сохранять их. Затем в определённый момент (например, при вызове операции сохранения файла) нужно запускать функцию, которая должна пройтись по всем тысячам блоков чертежа, и у "наших" блоков пройтись внутри по входящим примитивам, сопоставляя эти DXF-коды. Есть ли вариант проще? Без отсроченной реакции на произошедшие изменения, а с запретом (или откатом) этих изменений.
Tonic вне форума  
 
Непрочитано 29.01.2020, 18:28
#11
Кулик Алексей aka kpblc
Moderator

LISP, C# (ACAD 200[9,12,13,14])
 
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 37,240


Tonic, не путай вхождения блоков и их определения.
__________________

---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 29.01.2020, 18:35
#12
nickname2019


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


https://forum.dwg.ru/showthread.php?t=18934 #19
https://forum.dwg.ru/showthread.php?t=11502&page=2
nickname2019 вне форума  
 
Непрочитано 29.01.2020, 18:43
#13
Кулик Алексей aka kpblc
Moderator

LISP, C# (ACAD 200[9,12,13,14])
 
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 37,240


Offtop: Ага, и тут же в FAQ - "Как снять защиту"?
__________________

---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 29.01.2020, 18:56
#14
nickname2019


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


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
Offtop: Ага, и тут же в FAQ - "Как снять защиту"?
Имхо, для бытовой защиты - самое то. А не снимаемую я не знаю как делать. Может как-то данные писать в блокчейн параллельно с созданием блока, а потом читать из блокчейна и перезаписывать блок когда надо (доступ на чтение брать из внешней защищенной базы по имени блока, а не из чертежа)?

Может кто замутит тему, как сделать неломаемую защиту данных?

Последний раз редактировалось nickname2019, 29.01.2020 в 19:03.
nickname2019 вне форума  
 
Непрочитано 29.01.2020, 19:22
#15
kp+

идущий по граблям
 
Регистрация: 26.05.2005
Днепройт
Сообщений: 4,199


Цитата:
Сообщение от nickname2019 Посмотреть сообщение
Может как-то данные писать в блокчейн параллельно с созданием блока, а потом читать из блокчейна и перезаписывать блок когда надо (доступ на чтение брать из внешней защищенной базы по имени блока, а не из чертежа)
А я так и предложил в #5. Ну только до блокчейна не добрался (а куда ж без него в современном мире), всего лишь внутренний словарь определения блока.

Цитата:
Сообщение от nickname2019 Посмотреть сообщение
Может кто замутит тему, как сделать неломаемую защиту данных?
Да мутили уже все кому не лень. Ищите по форуму, найдете много интересного.
Краткое резюме: пока такую защиту не сделает сам Автодеск (где-то в вер. 2050), все остальное будет костылями разной степени костыльности:
- надежно, но требует дополнительного, весьма специфического ПО, которое надо ставить отдельно, что многим не подходит;
- реализовано встроенными средствами, но защищает только от тех, кого в гугле забанили.
__________________
Одно меня лишь радует - я это вижу сам! (С)
kp+ вне форума  
 
Непрочитано 29.01.2020, 20:58
#16
Сергей812


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


Цитата:
Сообщение от nickname2019 Посмотреть сообщение
Может кто замутит тему, как сделать неломаемую защиту данных?
не бывает. Да и не нужно защищать блоки от изменения - просто пакетный контроль определений блоков с выдачей праздничных "пряников" тем - кто замечен в злонамеренном их искажении.
Сергей812 вне форума  
 
Автор темы   Непрочитано 29.01.2020, 23:27
#17
Tonic


 
Регистрация: 26.06.2007
Воронеж
Сообщений: 145


Спасибо за ответы, но анонимные блоки, тем более *безымянные — это не то, что нужно. Блоки уже есть, как данность, и часть содержит расширенные данные. Идеи с реакторами нежизнеспособны?
Tonic вне форума  
 
Непрочитано 30.01.2020, 10:27
#18
kp+

идущий по граблям
 
Регистрация: 26.05.2005
Днепройт
Сообщений: 4,199


Цитата:
Сообщение от Tonic Посмотреть сообщение
Идеи с реакторами нежизнеспособны?
На первый взгляд - нежизнеспособны.
Но кто ж это проверит до конца путем написания и тестирования кода, кроме Вас?
Может, при правильном использовании в рамках именно Вашей задачи это вполне жизнеспособное и эффективное решение.
Отсюда ведь не видно, какие у Вас есть блоки, как выглядят, из чего состоят и как выполняются проекты, какими еще средствами автоматизации Вы пользуетесь.
__________________
Одно меня лишь радует - я это вижу сам! (С)

Последний раз редактировалось kp+, 30.01.2020 в 10:49.
kp+ вне форума  
 
Автор темы   Непрочитано 30.01.2020, 13:34
#19
Tonic


 
Регистрация: 26.06.2007
Воронеж
Сообщений: 145


Это сути не меняет. Блоки могут быть любыми (ну пусть это квадратик с текстом внутри), содержат расширенные данные, позволяющие их отличить от других блоков. При запрете изменения этих блоков будет подгружена только функция действия реакторов (ну или другой необходимый код), без какой-либо другой автоматизации.
Понятно, что писать и тестировать мне, но я обратился на форум, чтобы не пробовать всё подряд — наверняка тут кто-нибудь в курсе, как это проще реализовать, а как делать не стоит. С реакторами объектов не задалось (пропуск одного объекта в общем списке сразу сведёт все действия на нет), с реактором изменения базы рисунка пока не выходит — примеров в сети почти нет.
Tonic вне форума  
 
Непрочитано 30.01.2020, 15:25
#20
skkkk


 
Регистрация: 20.03.2008
Московская область
Сообщений: 2,383


У меня вот такая штука получилась
Код:
[Выделить все]
 (vl-load-com)
;;; Создаем реактор
(setq Cmnd_Reac 
	(vlr-command-reactor "Реактор комманд"
		(list '(:VLR-commandWillStart . commandWillStart))
	)
)

;;; функция действия
(defun commandWillStart(reac data / ) 
	(setq CMD (car data))
	(setq TMP "AA") ; создаем пробное условие для проверки
	(cond 
	  (	(and 
			(member	CMD (list "_BEDIT" "BEDIT" "-BEDIT")) 
			(= TMP "AA") ;;; сюда добавить свое условие
		)
		(alert "Tonic запрещает редактировать блоки!")
		(vla-SendCommand (vla-get-ActiveDocument (vlax-get-acad-object)) "(vl-cmdf \"_BCLOSE\") ")
	  )
    )
)
Загрузить код, попробовать отредактировать блок.

----- добавлено через ~23 мин. -----
Добавлено.
Да, знаю, что (command) в фунциях действия назначать нельзя, поэтому такой изврат. Прервать (не допустить) запуска команды тоже не выходит, хотя и получается вызвать окно alert до начала редактирования. К тому же, в Полещуке написано, что
Цитата:
Нельзя из функции действия, обрабатывающей событие, выполнять операции,
которые могли бы привести к отмене данного события (это может вызвать зацикливание).

Однако, возникает вопрос: раз уж всем юзерам нужно будет ставить эти реакторы, то почему просто не назначить им всем в Операциях при двукратном нажатии на блок свою функцию, которая сперва проверит нужные данные, а затем либо даст либо не даст редактировать блок? Или вообще - не переопределить _BEDIT? Может, кто и догадается вызывать ее с точкой (непереопределенную), но такие персонажи также уже будут совсем не далеки от того, чтобы и этот реактор обойти. Они же, как правило, не творят прямо-таки откровенную дичь, особенно, если им объяснить, что порушится алгоритм какой-то программы.
skkkk на форуме  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > Защита блока от редактирования с помощью реакторов

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Лисп для редактирования объектов блока. Можно ли без захода в редактор? RrRR LISP 5 06.08.2018 19:08
Вставка блока. Окно редактирования атрибута. JKF AutoCAD 4 13.03.2018 13:14
Имеется ли возможность ссылаться изнутри при создании блока на его же будущий номер ObjId ? Tyhig AutoCAD 6 14.08.2017 17:56
Вставка блока с помощью иконки RomanS Программирование 50 02.04.2010 11:33
Перевод имени блока в имя переменной и обратно Supermax Программирование 11 14.12.2009 23:26