Запрет редактирования dwg-чертежа.

Автор Тема: Запрет редактирования dwg-чертежа.  (Прочитано 22719 раз)

0 Пользователей и 4 Гостей просматривают эту тему.

Оффлайн DenisАвтор темы

  • ADN OPEN
  • **
  • Сообщений: 63
  • Карма: 2
Здравствуйте.
Возникла необходимость защитить содержимое dwg-файла.
Нашел вот эту тему : http://adndevblog.typepad.com/autocad/2013/01/how-to-prevent-explode-on-a-block-reference.html
Все хорошо работает,кроме одного момента,после сохранения и выхода из Автокада, и последующем запуске этого же файла,блок можно взорвать.
Подскажите пожалуйста в какую сторону смотреть.
В идеальном варианте с блоком вообще ничего делать нельзя.
Заранее спасибо.

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Запрет редактирования dwg-чертежа.
« Ответ #1 : 22-09-2015, 16:32:33 »
Denis
Ты приводишь ссылку на код ObjectARX, а создаёшь тему в разделе AutoCAD .NET API. Разделом не ошибся? Важно понимать какой инструмент ты собираешься использовать.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Запрет редактирования dwg-чертежа.
« Ответ #2 : 22-09-2015, 16:41:52 »
Ну и сразу чтобы небыло никаких сомнений - защитить чертеж от редактирования нельзя. Любая защита легко обходится.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн DenisАвтор темы

  • ADN OPEN
  • **
  • Сообщений: 63
  • Карма: 2
Re: Запрет редактирования dwg-чертежа.
« Ответ #3 : 22-09-2015, 16:43:30 »
Скорее всего я перепутал,но я читал такие вот фразы:

ObjectARX
Среда программирования ObjectARX® используется для адаптации и расширения функциональных возможностей AutoCAD и продуктов на его основе. Она обеспечивает непосредственный доступ к структурам базы данных AutoCAD, графической системе и определениям встроенных команд. С помощью объектно-ориентированных интерфейсов программирования на языке C++ разработчики могут создавать приложения для AutoCAD и других продуктов, входящих в это семейство – например AutoCAD® Architecture, AutoCAD® Mechanical и AutoCAD® Civil 3D®.

.NET
В состав ObjectARX SDK входит также управляемый API, который часто называют AutoCAD .NET API. Для адаптации и расширения функциональных возможностей AutoCAD и продуктов на его основе может применяться любой язык программирования, поддерживающий .NET.

Я вроде работаю с .NET.

Но я не программист,я только учусь,сам и на практике Автокада.

Мне перенести в другую тему?

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Запрет редактирования dwg-чертежа.
« Ответ #4 : 22-09-2015, 16:45:50 »
Я вроде работаю с .NET.
Наводка. Какой язык программирования ты используешь? Если C++ - то это ObjectARX, если C# или VB.NET или F# - то AutoCAD .NET API
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн DenisАвтор темы

  • ADN OPEN
  • **
  • Сообщений: 63
  • Карма: 2
Re: Запрет редактирования dwg-чертежа.
« Ответ #5 : 22-09-2015, 16:47:46 »
Я использую C#.

Я просто нашел подобные программы по типу DWGLock и SmartLock.Суть в том, что Smartlock вообще запрещает даже выделение блоков в файле после переработки.
DWGLock все объединяет в один блок и запрещает его взрыв.

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Запрет редактирования dwg-чертежа.
« Ответ #6 : 22-09-2015, 17:10:40 »
Все хорошо работает,кроме одного момента,после сохранения и выхода из Автокада, и последующем запуске этого же файла,блок можно взорвать.
Эта защита работает только тогда, когда:
1) Загружено это приложение - если его нет, то и защиты нет
2) Приложению переданы Id блоков, которые нельзя расчленять. Т.е. ты должен их где-то хранить. Возможно в самом чертеже.
Единственный вариант, который защищает чертеж и в отсутствие приложения - это писать Custom Entity, внутри которого будут вставки блоков или он сам наследник от AcDbBlockReference. Но это задача не для ученика. Это только чистый C++/ObjectARX и много-много различных нюансов.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Андрей Бушман

  • ADN Club
  • *****
  • Сообщений: 2000
  • Карма: 163
  • Пишу программки...
    • Блог
  • Skype: Compositum78
Re: Запрет редактирования dwg-чертежа.
« Ответ #7 : 22-09-2015, 17:29:07 »
Единственный вариант, который защищает чертеж и в отсутствие приложения - это писать Custom Entity, внутри которого будут вставки блоков или он сам наследник от AcDbBlockReference.
Насколько я понимаю, это не спасёт от explodeallproxy или xproxy.

Оффлайн DenisАвтор темы

  • ADN OPEN
  • **
  • Сообщений: 63
  • Карма: 2
Re: Запрет редактирования dwg-чертежа.
« Ответ #8 : 22-09-2015, 17:58:01 »
Спасибо за ответы.
Маленькое уточнение.DWGLock дает запрет на взрыв блока, а в контекстном меню не появляется вариант Edit block.
Может быть вот это как-то делается?

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Запрет редактирования dwg-чертежа.
« Ответ #9 : 22-09-2015, 18:56:11 »
Маленькое уточнение.DWGLock дает запрет на взрыв блока, а в контекстном меню не появляется вариант Edit block.
Выложи такой чертеж и укажи какой именно блок.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Запрет редактирования dwg-чертежа.
« Ответ #10 : 22-09-2015, 18:58:30 »
Насколько я понимаю, это не спасёт от explodeallproxy или xproxy.
Результат расчленения может быть настолько плохим, что он ничего не даст (например рамка вокруг блока) и всё-равно придётся перечерчивать вручную.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Запрет редактирования dwg-чертежа.
« Ответ #11 : 23-09-2015, 00:04:08 »
Из спортивного интереса (и только!!!) я установил Trial версию DWGLock ( http://www.autodwg.com/dwglock ) и сконвертировал для проверки один файл, в котором был Мультитекст, Дуга, Прямоугольник (т.е. полилиния) и Сплайн. После этого открыл его в AutoCAD 2015 и сразу сделал следующие выводы:
1) Для конвертации использовалось приложение не на платформе AutoCAD (вероятнее всего Teigha)
2) В чертеж добавляются прокси примитивы-заместители (вместо стандартных примитивов AutoCAD), множество описаний атрибутов блока и всё это помещается в неименованный MInsert, что сразу делает его нерасчленяемым:

Вот код, который я написал на коленке и который делает этот чертеж редактируемым:
Код - C# [Выбрать]
  1. using System;
  2. using Autodesk.AutoCAD.Runtime;
  3. using Autodesk.AutoCAD.ApplicationServices;
  4. using Autodesk.AutoCAD.DatabaseServices;
  5. using Autodesk.AutoCAD.Geometry;
  6. using Autodesk.AutoCAD.EditorInput;
  7.  
  8. [assembly: CommandClass(typeof(Rivilis.MinsertToInsert))]
  9.  
  10. namespace Rivilis
  11. {
  12.   public class MinsertToInsert
  13.   {
  14.     [CommandMethod("MI2I", CommandFlags.Modal)]
  15.     public void MI2I()
  16.     {
  17.       Document doc = Application.DocumentManager.MdiActiveDocument;
  18.       if (doc == null) return;
  19.       Editor ed = doc.Editor;
  20.       PromptEntityOptions prOpts =
  21.         new PromptEntityOptions("Выберите MInsert:");
  22.       prOpts.SetRejectMessage("Это не MInsert!");
  23.       prOpts.AddAllowedClass(typeof(MInsertBlock), false);
  24.       PromptEntityResult rs = ed.GetEntity(prOpts);
  25.       if (rs.Status == PromptStatus.OK)
  26.       {
  27.         using (MInsertBlock mRef =
  28.           rs.ObjectId.Open(OpenMode.ForWrite) as MInsertBlock)
  29.         {
  30.           ObjectId newBtrId = ObjectId.Null;
  31.           using (BlockTable bt =
  32.             doc.Database.BlockTableId.Open(OpenMode.ForWrite) as BlockTable)
  33.           {
  34.             using (BlockTableRecord newBtr = new BlockTableRecord())
  35.             {
  36.               Guid guid = Guid.NewGuid(); // Выбираем новое имя блока
  37.               newBtr.Name = guid.ToString();
  38.               newBtrId = bt.Add(newBtr);
  39.               using (BlockTableRecord btr =
  40.                 mRef.BlockTableRecord.Open(OpenMode.ForWrite) as BlockTableRecord)
  41.               {
  42.                 ObjectIdCollection ids = new ObjectIdCollection();
  43.                 foreach (ObjectId id in btr) ids.Add(id);
  44.                 newBtr.AssumeOwnershipOf(ids); // Перемещаем примитивы из одного блока в другой
  45.               }
  46.             }
  47.             using (BlockTableRecord btr =
  48.               mRef.OwnerId.Open(OpenMode.ForWrite) as BlockTableRecord)
  49.             {
  50.               using (BlockReference bref = new BlockReference(mRef.Position, newBtrId))
  51.               {
  52.                 btr.AppendEntity(bref); // Добавляем вставку нового блока
  53.               }
  54.             }
  55.             // Проходимся по новому блоку, расчленяем прокси-примитивы и удаляем
  56.             // описания атрибутов
  57.             using (BlockTableRecord btr =
  58.               newBtrId.Open(OpenMode.ForWrite) as BlockTableRecord)
  59.             {
  60.               ObjectIdCollection ids = new ObjectIdCollection();
  61.               foreach (ObjectId id in btr) ids.Add(id);
  62.               foreach (ObjectId id in ids)
  63.               {
  64.                 using (DBObject obj = id.Open(OpenMode.ForWrite))
  65.                 {
  66.                   if (obj.IsAProxy && obj is Entity)
  67.                   {
  68.                     DBObjectCollection objs = new DBObjectCollection();
  69.                     Entity en = obj as Entity;
  70.                     try
  71.                     {
  72.                       en.Explode(objs);
  73.                       if (objs.Count > 0)
  74.                       {
  75.                         // Расчленяем прокси и избавляемся от него
  76.                         // через HandOverTo, т.к. он неудаляемый
  77.                         // (ProxyFlags == 0)
  78.                         en.HandOverTo(objs[0], true, true);
  79.                         objs[0].Close();
  80.                         for (int i = 1; i < objs.Count; i++)
  81.                         {
  82.                           btr.AppendEntity(objs[i] as Entity);
  83.                           objs[i].Close();
  84.                         }
  85.                         en.Dispose();
  86.                       }
  87.                     }
  88.                     catch { }
  89.                   } else if (obj.GetRXClass() == RXClass.GetClass(typeof(AttributeDefinition)))
  90.                   {
  91.                     obj.Erase();
  92.                   }
  93.                 }
  94.               }
  95.             }
  96.           }
  97.           mRef.Erase(); // Удаляем саму вставку блока
  98.         }
  99.       }
  100.     }
  101.   }
  102. }

Впрочем не всё так хорошо. Дуга и окружность развалились на кучу составляющих дуг,  прямоугольник на кучу отрезков. Сплайн и Мультитекст остались целыми. И это всё в простейшем варианте чертежа.
Таким образом редактировать дальше такой чертеж представляется затруднительным.
Прикладываю три чертежа:
1. Исходный (1lock.dwg)
2. Обработанный DWGLock (1lock_l-1.dwg)
3. Обработанный командой MI2I с последующей очисткой (1lock_l-2.dwg).
« Последнее редактирование: 23-09-2015, 00:42:50 от Александр Ривилис »
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Андрей Бушман

  • ADN Club
  • *****
  • Сообщений: 2000
  • Карма: 163
  • Пишу программки...
    • Блог
  • Skype: Compositum78
Re: Запрет редактирования dwg-чертежа.
« Ответ #12 : 23-09-2015, 00:18:50 »
Значит это:
Цитировать
Powerful encryption, protect the entities in drawing from copying and modifying
лапша на уши. А это:
Цитировать
Receivers can view protected drawing file and add lines and markups to it
свидетельствует о том, что разработчик не знает что такое Design Review и пытается изобретать велосипед.

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Запрет редактирования dwg-чертежа.
« Ответ #13 : 23-09-2015, 00:48:25 »
Значит это:
Цитировать

    Powerful encryption, protect the entities in drawing from copying and modifying

лапша на уши.
Ну не совсем так в силу того, что редактировать такой чертёж - сплошная мука.
А это:
Цитировать

    Receivers can view protected drawing file and add lines and markups to it

свидетельствует о том, что разработчик не знает что такое Design Review и пытается изобретать велосипед.
Ну насколько я помню DWGLock появилось задолго до Design Review. Во всяком случае я о его существовании слышал еще лет 20 назад. Впрочем за все эти годы я не удосужился на него посмотреть, так как считаю, что такие методы защиты чертежей малопригодны и бессмысленны. Или чертеж не нужно показывать вообще, а если уж показал, то защищать его не имеет смысла, т.к. даже с бумажной копии его можно перечертить. Это потребует какого-то времени, но...
Всё вышесказанное IMHO.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Дима_

  • ADN Club
  • ****
  • Сообщений: 473
  • Карма: 66
Re: Запрет редактирования dwg-чертежа.
« Ответ #14 : 23-09-2015, 02:29:24 »
Или чертеж не нужно показывать вообще, а если уж показал, то защищать его не имеет смысла,
Вот про это я уже устал убеждать не один год - надо давать либо нормальный dwg файл, либо не давать его вообще (а отдавать, например Pdf). Все методы по взрыву и залочиванию - бредовы по своей сути и попахивают "школьничеством".