Тема: Защитить dwg-файл

Добрый день. Стоит такая задача: защитить dwg файл от изменений, но моя программа должна уметь его отображать и изменять. Каким образом лучше это сделать?
Защита не должна быть абсолютной. Просто обеспечить невозможность открытия файла в autocad для изменений простому пользователю.
Формат не обязательно должен оставаться dwg, можно dwf или любой другой. Важно, что бы выбранный формат сохранил следующие преимущества: мало весил, быстро печатался, сохранял приемлемое качество и был редактируемым моей программой (как я понял, dwf - не редактируемый?). Файлы чертежей значительны (около 50 Мб в dwg). Пробовал pdf - не подходит из-за долгой печати. Открытые векторные форматы много весят. Растр кроме png не подходит, а png не подойдёт для изображения длиною более 4 метров (тоже очень долго печатается по сравнению с dwg).
Есть идея прятать dwg в файл своего формата, и работать с ним с помощью Teiga. Идеально было бы делать тоже самое с помощью Autocad (ведь он всё-равно лицензионный), но так, что бы пользователь не видел этого и не мог вмешаться в процесс, сохранив документ под другим именем. Так же моя программа должна уметь отображать документ (или его часть), что бы пользователь мог указать мышкой место, в котором должны произойти изменения. Возможно этого организовать, используя средства Autocad? Или придётся прибегнуть к сторонним библиотекам?
Прошу подсказать, каким путём лучше пойти, что бы решить данную задачу.

Re: Защитить dwg-файл

Шею свернёшь на этом пути.

Re: Защитить dwg-файл

Если нужно запретить доступ как для редактирования, так и для чтения, то первое, самое простое, что приходит на ум - воспользоваться шифром Виженера.
1. Размер файла остаётся тем же.
2. Ни одна CAD программа, кроме вашей, данный файл не откроет.
3. Шифрование/дешифровка выполняется моментально.

Однако, если хочется, чтобы сторонние CAD могли просматривать чертёж, тогда сложнее... Teigha конечно можно воспользоваться, создав программку, выполняющую расшифровку и отображение. Причём сделать это гораздо проще, чем может показаться: даже в wiki-учебнике по Teigha это показано в первом же Hello-World'е. Однако, стоит ли оно того, чтобы так заморачиваться? Не переоцениваете ли вы значимость своих чертежей? :)

(изменено: Евгений, 9 июля 2013г. 14:47:59)

Re: Защитить dwg-файл

Спасибо за ответ.
Для чтения запрещать не обязательно: документ должен просматриваться и печататься. Просто, на сколько мне известно, в Автокаде нельзя настроить документ "только для чтения", да ещё что бы нельзя было выполнить действие "Сохранить как..." и получить редактируемую копию. Поэтому было бы идеально использовать формат DWF - он как раз для этих целей создан. Но проблема в том, что мне нужно время от времени накладывать изображение на чертёж в то место, куда укажет пользователь. DWF для этого уже не предназначен. Поэтому на сейчас я выработал такую стратегию:
1. Чертёж экспортируется в файл формата DWF – открытый формат Autodesk для просмотра и печати чертежей (и не только). Представляет из себя zip-архив, в котором содержатся необходимые файлы.
2. В этот файл добавляется исходный dwg-файл, зашифрованный паролем или зашитый в zip, названный dsp.
3. При открытии обычными просмотрщиками файл DWF будет предоставлять возможность просмотра и печати документа.
4. При открытии с помощью моей программы, она:
а.    изымает DWG-файл из DWF-архива во временные файлы
б.    открывает его в скрытом (через ActiveX, Visible = false) автокаде (либо, возможно, с помощью Teiga)
в.    отображает документ на своей форме
г.    позволяет добавить изображение в указанном месте
д.    сохраняет документ в файл DWG
е.    экспортирует результат в DWF
ж.    внедряет DWG в новый DWF
з.    удаляет DWG из временных файлов
и.    переписывает старый DWF на новый.

Сейчас, в принципе, осталась только одна теоретическая проблема: п. 4в - как отобразить документ, открытый в автокаде, на своей форме? Попробовал с помощью this.Document.Export(filename, extension, selection_set) - экпортирует текущее окно с автокада в bmp-файл, который можно без проблем нарисовать на своей форме. Это работает с одной большой преградой: это синхронный метод и автокад ждёт когда я выделю объекты для экспорта, либо нажму Esc для экспорта всего рабочего окна документа... Пока что я эту преграду не преодолел и не думаю, что смогу... Есть идеи?

Ценность чертежей оцениваю не я, а наши проектировщики в институте и руководство :)

Re: Защитить dwg-файл

Евгений пишет:

Но проблема в том, что мне нужно время от времени накладывать изображение на чертёж в то место, куда укажет пользователь. DWF для этого уже не предназначен.

DWF совершенно спокойно может использоваться в качестве подосновы, посредством внешних ссылок.

Re: Защитить dwg-файл

Интересно. У меня сейчас получилось это сделать вручную. Осталось только сделать это через код. Однако вставка изображений... Они ведь не должны быть доступны для редактирования из автокада. Можно, конечно, затребовать указать точку, вставлять изображение, сразу конвертировать в DWF и переподгружать подложку. В правильном направлении я мыслю?

Re: Защитить dwg-файл

Дабы не изобретать велосипед, сначала следует ознакомиться с уже имеющимся в AutoCAD функционалом. Не гадайте, разберитесь с тем, как работать с внешними ссылками. Если в качестве внешней ссылки вы предоставите DWF, то его содержимое и так не будет доступно для редактирования.
тынц 1.
тынц 2.

Re: Защитить dwg-файл

Да, я понял, что содержимое DWF не будет доступно - это именно то, что мне нужно. Мне нужно так же, что бы новый файл с наложенным изображением был не доступен (и самое это изображение тоже). Лады, буду разбираться, спасибо за помощь!

Re: Защитить dwg-файл

Евгений пишет:

Мне нужно так же, что бы новый файл с наложенным изображением был не доступен (и самое это изображение тоже).

Ну так и экспортируйте его, в свою очередь, так же в DWF/DWFx.

(изменено: Евгений, 10 июля 2013г. 07:29:27)

Re: Защитить dwg-файл

Hwd,
Это работает, но не так как надо.
Во-первых, подложка при наведении мышкой на "тяжёлые" слои очень загружает автокад (чем больше увеличение, тем больше он тормозит вплоть до зависания). В оригинальном DWG такого не происходит.
Во-вторых, повторная публикация в DWF стирает информацию о слоях (хотя она не обязательна, я оставил её, что бы отключить тяжёлые слои в подложке на время).
В-третьих, при повторной публикации экспортируется только видимая часть. Масштабирование перед экспортом для полного обзора приводит к серьёзной потере качества.
В-четвёртых, изображение получается странным (см. скриншоты части документа).
DWF, полученный из DWG и используемый в качестве подложки:
Защитить dwg-файл
Не вставляется изображение... вставлю ссылкой: DWF1
DWF, полученный из подложки DWF + изображения (выглядит как пара квадратиков)
Защитить dwg-файл
DWF2

(изменено: Hwd, 10 июля 2013г. 08:29:39)

Re: Защитить dwg-файл

Евгений пишет:

Во-первых, подложка при наведении мышкой на "тяжёлые" слои очень загружает автокад (чем больше увеличение, тем больше он тормозит вплоть до зависания). В оригинальном DWG такого не происходит.

Да... Проблема всё та же: Вам ещё изучать и изучать AutoCAD... Тынц. В обозначенных настройках (окно открывается командой _.OPTIONS) снимите галочки для "When a Command Is Active" и "When No Command Is Active". Затем нажмите кнопки "Apply" и "Ok".

Евгений пишет:

Во-вторых, повторная публикация в DWF стирает информацию о слоях (хотя она не обязательна, я оставил её, что бы отключить тяжёлые слои в подложке на время).

Войдите в настройки публикации в DWF/DWFx и в включите опцию импортирования информации о слоях. При желании, там же сможете выбрать аналогично и для определений блоков.

Сейчас я дома, и на домашнем компьютере у меня AutoCAD не установлен, так что посмотреть остальные пункты не могу. Однако более чем на 100% уверен, что и в них вы накосячили. Приду на работу, тогда гляну, что там у вас за очередные "чудеса".

Вообще, настоятельно рекомендую освоить работу с подшивками. Тогда парой кликов мыши вы сможете отправлять на физ. устройство, либо публиковать в PDF/DWF/DWFx, либо упаковывать в архив для передачи заказчику сразу весь проект, либо нужную его часть. При этом, так же настоятельно, не рекомендую слушать неких "специалистов по подшивкам" направо и налево рассказывающих всем, что "подшивки это фигня". К сожалению, на форумах таких "спецов" развелось как собак нерезаных. Однако по факту, первая же пара вопросов, заданных им выясняет, что в обозначенной теме уровень их компетенции ниже плинтуса.

Re: Защитить dwg-файл

Hwd,
Изучать автокад приходится по ходу. Я с ним впервые столкнулся, хотя уже переписал несколько старых скриптов с VBA на c# через .NET. Сейчас вот появилась эта задача.
Нашёл и отключил следующие галочки во вкладке "Выбор": "Когда активна команда" и "Если активных команд нет". С торможением ничего не изменилось - по прежнему подвисает автокад, когда мышкой водишь по изображению слоёв. При увеличении масштаба подвисания усиливаются. Может это только в 2008-м так?

По поводу слоёв в DWF: я же написал, что уже включил информацию о слоях. Но, при повторном экспорте получается только один слой, потому что в моём новом документе оказывается один слой: в котором лежит многослойная подложка и моё изображение. Надеюсь что можно как-то сохранять слои подложек и их качество. Буду ждать вашего совета, пока больше не на кого надеяться. Спасибо!

Re: Защитить dwg-файл

1. По поводу торможения:
Откройте вкладку system. Нажмите кнопку "Performance Settings". Откроется окошко. В нём, справа, будет ещё несколько кнопок. Нажмите ту, на которой написано что-то вроде  "Настройка вручную". Откроется очередное диалоговое окно. В нём проверьте, что включен DirectX или OpenGL. Поэкспериментируйте, устанавливая либо тот либо этот. Предварительно снимите галочку их использования и снова включите. В моей практике был случай, что галочка была установлена, но по факту DirectX не был задействован. Банальное снятие галочки, сохранение настроек, и повторная её установка исправили ситуацию (нет софта без багов). После смены обозначенных настроек AutoCAD лучше на всякий случай перегружать, дабы настройки обработки видео гарантированно применились.

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

Re: Защитить dwg-файл

Нет, тормозит не из-за этого (попробовал с выходом из автокада - не изменилось ничего), ведь сам dwg так не делает, только dwf в подложке.
Написал вам в личку.

Re: Защитить dwg-файл

Да увидел проблему. Ваш чертёж очень большой (более 40Мб), а чем больше документ, тем медленнее приложение будет работать (это логично). Сам DWG файл работает довольно таки шустро (я, на всякий случай, дважды выполнил _.Purge _ALL, почистив его от лишнего хлама).

Пробовал в качестве подложки DWF и DWFx в AutoCAD 2009 SP3 и AutoCAD 2014. Курсор залипает и скачет почти  одинаково в обоих версиях... Разве что в 2014-й, чем дальше от листа, тем быстрее курсор движется.

В AutoCAD 2014 я так же попробовал экспорт в PDF и использовать в качестве подложки полученный PDF (в нём так же можно слои включать/отключать), однако прироста в скорости не ощутил (даже ещё медленнее стало). Правда в случае с PDF проблемы несколько иного рода: торможения не при движении мышкой по PDF контенту (в том-то случае как раз всё нормально), но торможения проявляются при панорамировании, зуммировании и регенерации.

Из контекстного меню вставленной подосновы я выбрал обрезку PDF, указал некоторую прямоугольную область. Однако скорость работы не увеличилась. Похоже, что AutoCAD продолжает обсчитывать даже те примитивы, которые находятся вне обрезанного контура. Тут сразу вылезла ещё одна проблема: по PDF изображению мышка путешествует без проблем, но как только она попадает на обрезочный контур - тут же зависает на длительное время.

В общем да, какая-то фигня... Можно, конечно, было бы обратиться в Autodesk с обозначенной проблемой, тем более, что у вас есть готовый файл, демонстрирующий проблему... Однако, я не думаю, что Autodesk отреагирует на это. Хотя, возможно, что и исправят, но лишь в будущих версиях, преподнося это как "фишку", ради которой стоит покупать новую версию акада.

Re: Защитить dwg-файл

Да, о размерах файла я писал в самом первом сообщении. Спасибо что проверили разные варианты!

Возвращаясь к способу решения проблемы: возможно ли как-то перехватить отображение окна документа в скрытом Автокаде, что бы показывать его в своей программе? Либо заблокировать возможность изменения документа DWG, что бы пользователь мог только изображения накладывать в указанные места, а остальные действия блокировать?

Либо нужно ожидать библиотеки от Teiga...

Re: Защитить dwg-файл

В любом случае, для того, чтобы заработал дополнительный функционал, пусть даже и ограничивающий работу с DWG, необходимо, чтобы этот дополнительный функционал был установлен и на компьютере того, кто пытается открывать ваши чертежи. А поскольку у заказчика этого софта нет (да он ему и не нужен, т.к. зачем ему себя ограничивать), то на мой взгляд - без вариантов.

В DWG файле можно ставить пароль на открытие чертежа, но в вашем случае эта защита так же не годится. Я не знаю простого решения обозначенной задачи.

Re: Защитить dwg-файл

В том то и дело, что заказчику не нужны исходники (оригинальный dwg), только DWF или другой формат (например, PDF, но его можно легко получить из DWF). Поэтому заказчику не нужно никаких дополнительных программ, они нужны только нашему институту - тут мы поставим мои программы без проблем.

(изменено: Hwd, 11 июля 2013г. 11:53:39)

Re: Защитить dwg-файл

Ещё раз перечитал это:

Поэтому было бы идеально использовать формат DWF - он как раз для этих целей создан. Но проблема в том, что мне нужно время от времени накладывать изображение на чертёж в то место, куда укажет пользователь.

Так кто это наложение должен делать? Это наложение будете делать вы в своих DWG файлах (куда заказчик укажет) или же нет? Заказчику нужно только просматривать и печатать ваши чертежи, или же он должен иметь возможность и использовать их в качестве подосновы для своих DWG файлов?

Если заказчику нужны только просмотр и печать, то проблема решается очень просто: вы свои чертежи оформляете в виде подшивки автокада, выполняете её публикацию в DWF и отправляете заказчику. Заказчик смотрит DWF и при необходимости печатает, посредством приложения Autodesk Design Review. Причём качество и скорость печати намного выше той, которая будет у этого же чертежа при использовании формата PDF (многократно проверено на практике).

А вы, в свою очередь, можете использовать свои DWG карты в качестве внишних ссылок для др. своих DWG файлов. Скорость работы вполне приемлемая, а если вы ещё и выполните обрезку внешней ссылки, оставив только то, что вам реально нужно в этом чертеже, то вообще всё отлично по скорости (проверил на вашем чертеже).

Re: Защитить dwg-файл

Так нам нужно запретить изменения для своих. DWG должен быть защищён от изменений людьми, что бы быть уверенными, что он не поменялся после утверждения (только программа накладывает специальные изображения на указанные нашими проектировщиками места). Когда вставляются изображения, файл никто не имеет права уже менять (и не должен иметь возможности, в этом цель программы).
Заказчику будет отправляться результирующий файл только для просмотра и печати (DWF).

Re: Защитить dwg-файл

Я тут обнаружил интересную статью http://through-the-interface.typepad.co … autoc.html уже опробовал - 2D фигуры не рисуются, только 3D-построение. Может возможно как-то подобно и с двухмерными объектами поступить? У меня не получилось...
Нашёл правда один способ: https://www.caduser.ru/forum/topic29638.html
но он работает только при условии, что автокад отображается и не свёрнут. А мне нужно скрыть. Как вариант, можно, конечно за пределы экрана его уводить, но это не очень хорошо...

(изменено: Hwd, 11 июля 2013г. 12:02:33)

Re: Защитить dwg-файл

Евгений пишет:

Так нам нужно запретить изменения для своих. DWG должен быть защищён от изменений людьми, что бы быть уверенными, что он не поменялся после утверждения

Млин... Ну так сразу бы и писали. Решение есть, причём родное, от Autodesk: подпись чертежей. Как только чертёж будет кем-то изменён, автокад сразу вас об этом будет уведомлять при открытии этого документа, т.к. подпись становится недействительной.

Re: Защитить dwg-файл

Цифровая подпись - не вполне то, что нужно, хотя близко. Дело в том, что она накладывается только один раз, а утверждений должно быть несколько (не одновременных, разными людьми). Цифровую подпись тоже можно в конце наложить, согласен. Но как быть с момента первого утверждения до момента последнего?

Re: Защитить dwg-файл

Евгений пишет:

Дело в том, что она накладывается только один раз,

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

Но как быть с момента первого утверждения до момента последнего?

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

Re: Защитить dwg-файл

Идея с цифровой подписью не подходит... Никто не хочет заморачиваться с центрами сертификации.