Тема: Запись в открытый DWG напрямую.

Такая проблема: В DWG файл вписана небольшая база данных, которая формируется и вписывается до открытия автокада.
После того как автокад открыл этот чертеж, программа открывает базу данных и, вычленив её из DWG, вносит изменения в этот чертеж. База данных считывается с помощью Filemode:=fmShareDenyNone; - ни каких проблем. Но возникла ситуация когда надо вписывать данные прямо в открытый DWG, filemode в данном случае не помогает, вылетает ошибка невозможности записи в открытый файл. Приходится закрывать
Dwg, записывать и снова открывать, что медленно. Как организовать доступ для записи в уже открытый файл?

Re: Запись в открытый DWG напрямую.

Запись в открытый файл AutoCAD - никак. Это тупиковый подход - пытаться в DWG хранить какие-то базы данных. Самое неподходящее место, какое можно придумать.
Имеется вообще-то технология одновременного редактирования одного DWG. Ранее это был отдельный продукт - ADE, теперь это встроено в AutoCAD Map. Но практического применения для настоящей, полноценной работы вроде бы не нашло (в пределах доступных мне сведений). Но это сложный продукт, тесно интегрированный с ядром AutoCAD.

Re: Запись в открытый DWG напрямую.

в одном проекте я реализовывал хранение "табличной" информации в чертеже, в специально создаваемом для этого дела словаре.
.
конечно скорость открытия такого хранилища очень(!!!) сильно зависит от хранящегося в нем объема информации... но работает  :)

Re: Запись в открытый DWG напрямую.

Проблема в том, что приложение уже написано и в нем работают тьма людей. Хранение данных в DWG мера вынужденная, мне это тоже страшно еритичным кажется: Часть людей вбивают исходные данные в базу данных, после чего другие люди работают в автокаде, на основе вбитых данных программа формирует практически весь пакет чертежей и документов.( базы данных довольно большого объема, поэтому словарь для этого не подходит из-за проблем совместного доступа и скорости. На этапе формирования данных речь об автокаде даже не идет). Все эти чертежи копируются куда угодно на ноутбуки, обратно в сеть, а уровень знания компьютера большинства работников =0. Им не под силу знать то что есть еще и какая-то внешняя база данных, есть только DWG и открывают его Автокадом! База данных клиент-серверная, чтобы все работали одновременно и по сетке и локально. Вообще проблем никаких нет и не было, за всем следит приложение. Сейчас я дописываю один из компонентов этого приложения, и возникла проблема записи. Пробовал решить её так: изменения вносятся после закрытия документа- всё прекрасно! Но значительная часть пользователей не закрывают чертежи по завершению работы с ними, а просто выдергивают сетевой шнур из розетки - "Чтоб пожара не было"

Re: Запись в открытый DWG напрямую.

> Илья
Я не буду критиковать то, как сделано Ваше приложение - это Ваше право. А идейку подскажу. Напишите небольшой arx-файл, который и будет записывать данные в чертеж. И синхронизуйте свое приложение с этим arx-файлом (вариантов в Windows API - море).

Re: Запись в открытый DWG напрямую.

ARX здесь не поможет, проблема не совсем в этом. Внешняя база данных дописана в конец файла DWG. Доступ только для чтения к ней, даже если файл DWG открыт автокадом, я сделал. В общем запись данных в чертеж (рисование всего что надо) из базы уже написана и работает. При закрытии чертежа копия базы данных снова дописывается в конец DWG. Но если сохранить чертеж, а после этого не закрывая его или всё приложение автокада дернуть
сетевой шнур, база данных будет потеряна. Сейчас
временно проблема решена так: После сохранения чертежа он закрывается, пописывается база, затем снова открывается, что невыносимо долго.
Переписать весь движок я не могу. Потому что, по большому счету,в базе данных лишь список заданий которые необходимо выполнить при открытии документа и это единственное слабое звено проекта.

Re: Запись в открытый DWG напрямую.

Все эти проблемы решаются просто.
База данных - на настоящем SQL-сервере. Или хотя-бы на файл-сервере. У него-то шнур не выдергивают?
"Выдергивание шнуров" и прочее лечатся быстро и дешево. Людям надо четко и доходчиво объяснить, "что такое хорошо и что такое плохо". А потом, для еретиков, одна показательная казнь. И хватает. Пусть кричат: "всех не перевешаете", пусть в честь казненного через 100 лет город назовут.
Сервер БД решит и проблемы с нечаянным отключением, не по вине пользователей. Для этого в нем все предусмотрено.
Работникам и не надо знать, что с DWG связана БД. Она сама должна подключаться, вот для этого и надо программы делать. В чертеже может быть только ссылка на БД. Делается это достаточно просто. Пусть Ваша Delphi-программа работает с БД (это она сумеет очень хорошо), а не с DWG - это она если и сумеет, то будет делать плохо и ненадежно.

Re: Запись в открытый DWG напрямую.

Так оно у нас и работает,как у всех людей. Сервак следит за всем. Проблема касается переносных компов. Когда часть еретиков едет в командировку где нет серваков или когда сервак временно умирает(редко но бывает), и вообще когда всё плохо, они берут нужные DWG, в которых есть копии баз, запускается модуль имитирующий работу сервера, всё простенько бесшумно и локально. Иногда они находят другие компы в командировке, на которых им удобнее работать, в общем вот так. Регулярные публичные казни не помогают, из 100 чел фирмы 95, включая директора - еретики.
******************************************
А есть ли в автокаде средство для хранения текста? я подумал файлы базы можно и ужать до 100-300кБ и вписать код получившихся файлов средствами автокада во что-нибудь(может в dictionary?), без всякой дозаписи в конец, а при открытии-закрытии чертежа записывать сей код во временный внешний файл. Есть ли в Автокаде какие-либо средства для хранения текстовой информации большого объема?
******************************************

Re: Запись в открытый DWG напрямую.

> Илья
А вот это уже более разумный подход. Во всяком случае здесь информация не будет потеряна. Хранить можно в чем угодно. Хоть в примитиве MTEXT с выключенным флагом visibility (чтобы на экране не было видно), хоть в xrecord'ах и dictionary. Второй вариант IMHO предпочтительней.

Re: Запись в открытый DWG напрямую.

А что такое IMHO?

Re: Запись в открытый DWG напрямую.

> Илья
smile https://www.caduser.ru/forum/topic5655.html

Re: Запись в открытый DWG напрямую.

Пожалуй второй вариант оставим на самый крайний случай.
Подскажите кто-нибудь как работает в Xrecordе
SetXRecordData(vr1,vd1); Какие параметры передавать в него?
На VB пример из хелпа работает, работает также
метод GetXRecordData(vr1,vd1) обращенный к записи созданной на VB, получается  применять
SetXRecordData(vr1,vd1) к ранее вызванному GetXRecordData(vr1,vd1) с модифицированными vr1 и vd1, а вот применять к новенькому Xrecordу в дельфе,как и в си++  SetXRecordData(vr1,vd1) не получается, говорит неправильные параметры, хотя во всех случаях вроде бы vr1:=VarArray([0,3],VarSmallInt) //{1,0,1,0}, а vd1:=VarArray([0,3],VarVariant) //{'a','','a',''} например, заполненные как и в работающих извлеченных массивах.

Re: Запись в открытый DWG напрямую.

Разобрался, оказывается в setxrecord(vr1,vd1) надо вписывать в vr1 - массив из VarshortInt вместо Varinteger, а в vd1 VarVariant и всё заработало