понедельник, 12 октября 2009 г.

Интеграция TDMS и AutoCAD 2

На новом месте работы, где я занят внедрением системы электронного архива и документооборота TDMS в основном производстве, как и на прежнем месте, столкнулся с той же задачей, что решал раньше, а именно, интеграцией Autodesk AutoCAD и TDMS. Разумеется, имея ранее полученный опыт, решить аналогичную задачу оказалось проще. Но, как всегда бывает, в каждой ситуации возникают свои особенности…
Во-первых, в прежнем решении я отталкивался от того, что вся графическая документация оформляется по принципу "один файл - один лист". Теперь я столкнулся с тем фактом, что на предприятии активно используется оформление чертежей с использованием листов (Layout'ов), т.е. оформляется по принципу "один файл – несколько листов".
Во-вторых, как выяснилось позже, мной не был учтен тот факт, что если имена файлов объекта зависят от значения атрибута, который может изменится, то связи внутри компонентного документа нарушаются. Такое изменение необходимо отслеживать.
В-третьих, использование последовательной нумерации файлов внутри объекта имеет отрицательную сторону в том случае, если изменяется порядок файлов являющихся компонентами главного файла.
Преодоление первого препятствия.
Обдумывание решения о хранении многолистового документа привело к решению, простому как "три копейки". Если один файл хранит несколько листов, значит в TDMS должен быть объект-контейнер, который также может хранить несколько объектов. Таким образом совместно с коллегами было решено создать два типа объектов для хранения информации о чертежах: Чертеж и Лист.
На объект Чертеж возложена почетная обязанность хранить главный файл dwg и другие сопутствующие ему файлы (контекстный, растровые и компоненты, если надо). Набор атрибутов весьма скромен, в основном обозначение и количество листов, причем оба атрибута заполняются автоматически.
На объект Лист возложена ответственная обязанность хранить всю информацию о листе, который он олицетворяет. В частности, обозначение, наименование, перечень ответственных лиц, формат листа и т.п.
Таким образом, в TDMS хранится информация, как о файле, так и обо всех листах в нем размещенных, правда при работе с файлом пришлось ввести некоторые правила.
Правило 1.
Имя листа (layout) должно соответствовать номеру листа в TDMS.
Правило 2.
Количество листов в файле неограниченно и не контролируется, т.к. отследить все мыслимые манипуляции пользователя с листам практически невозможно. Однако, при переключении листов происходит проверка имени листа и, если в TDMS о нем нет информации, то AutoCAD выдает соответствующее предупреждение, но не запрещает пользователю с ним работать в дальнейшем.
Технически, реализация отслеживания переключения листов довольно проста: AlxdLSwitcher.rar
Обоим типам объектов соответствует команда Открыть, которая открывает документ в приложении. В случае, если команда вызвана объектом Лист то, кроме открытия файла, происходит переключение на соответствующий лист в нем. Таким образом, пользователям обеспечена предельная прозрачность работы с файлами через объекты TDMS. Напротив, если файл уже открыт в приложении, то TDMS просто активизирует его и переключит на нужный лист при необходимости.
Реализация кода на VBscript описанной функциональности не представляет труда: cmd_drawing_open.rar
Преодоление второго и третьего препятствий
Исключить проблему с именованием файлов объекта, было решено изменением принципа именования. Прежде всего, отказался от последовательной нумерации файлов в объекте. Однако, оставить имя файла самим по себе нельзя, т.к. возможны ситуации, когда появится два файла с одинаковым именем в одном объекте. Вместо номера файла появился четырехзначный уникальный идентификатор.
Отслеживание копирования или изменения обозначения объекта, которое влечет за собой изменение имен файлов реализовано непростым механизмом. В объекте TDMS присутствует служебный табличный атрибут, который хранит историю изменения имен файлов объекта. Анализируя его содержимое можно сделать вывод о том, какое имя файла должно быть у соответствующего файла в настоящий момент. Дополнительный модуль написанный на Lisp берет на себя такую ответственность. Функция (copy2tdms) вызывается при каждом открытии файла и проверяет необходимость изменения имен файлов.
В остальном, никаких особых препятствий преодолевать не пришлось, реализация интеграции AutoCAD и TDMS осталась очень похожа на описанную в предыдущей записи блога. Исходный код основных модулей:
Преимущества решения для инженера:
  • прозрачность работы с файлами и листами из TDMS
  • исключение операций с файлами при их переименовании
  • возможность использовать для оформления листы в чертеже AutoCAD
Недостатки:
  • если растровое изображение уже размещено на T:, но удалено из объекта, то код не отслеживает этого факта и файл может быть утерян.
Применение:

Комментариев нет:

Отправить комментарий