3 - 2008

TDMS и NormaCS

Александр Щетинин

Этап 1. Сбор текстовой информации из документа

Этап 2. Анализ текстовой информации

Этап 3. Сравнение ссылок с базой NormaCS

Эта мысль родилась у меня в процессе запуска системы TDMS (www.tdms.ru) в проектном институте: поскольку в системе хранится вся проектно-сметная документация, а доступ к ней программным путем предельно упрощен, можно автоматизировать многие аналитические операции.

Одна из задач отдела технической экспертизы в части нормоконтроля — выявление в проектно-сметной документации устаревших ссылок на нормативные документы. Следовательно, при каждой проверке документации неизбежно сравнение существующих ссылок на ГОСТ, ОСТ, СНиП и т.п. с соответствующей базой данных.

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

Во-первых, как уже сказано, в качестве электронного архива используется TDMS, где каждый документ любого объекта доступен с помощью кода, написанного на VBScript.

Во-вторых, необходима база данных нормативно-технической документации, к которой можно было бы обращаться запросами либо SQL, либо существующего API. Выбираем NormaCS (www.normacs.ru) — продукт с открытой архитектурой. В программе реализована COM-модель для работы с базой и получения доступа к документам и их атрибутам.

В-третьих, нужен программист, который уверенно пишет на VBScript и AutoLISP. С таким особых проблем нет. Сначала я писал сам (особенно в части AutoLISP), а окончательную доводку передал коллеге.

Итак, что имеется:

  • TDMS — электронный архив проектно-сметной документации;
  • NormaCS — электронный архив нормативно-технической документации;
  • пара рук и одна голова.

Этап 1. Сбор текстовой информации из документа

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

Наибольший интерес представляет сбор текстовых строк из чертежа AutoCAD, то есть из формата DWG. Сбор осложняется тем, что текст может храниться самым разным образом — в объектах типа AcDbAttributeReference, AcDbMText, AcDbText.

Эта задача решается, что называется, в лоб: перебираются все объекты, а при обнаружении объектов нужного типа текстовые строки добавляются к списку. Код написан на AutoLISP:

(defun alxd:text_from_drawing( / oDoc oBlocks oBlkDef oObj sObjName ret)
  (setq
    oDoc (vlax-get-property (vlax-get-acad-object) ‘ActiveDocument)
    oBlocks (vlax-get-property oDoc ‘Blocks)
    ret (list)
  )

  (vlax-for oBlkDef oBlocks
    (vlax-for oObj oBlkDef
      (setq sObjName (vlax-get-property oObj ‘ObjectName))

 

      (if (or (= sObjName «AcDbText») (= sObjName «AcDbMText») (= sObjName «AcDbAttributeReference»))
        (setq ret (append ret (list (vlax-get-property oObj ‘TextString))))
      )

 

    )
  )

  (vlax-release-object oBlocks)
  (vlax-release-object oDoc)

  ret
)

 

Выполнение кода происходит в момент закрытия документа в приложении.

В начало В начало

Этап 2. Анализ текстовой информации

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

Приводить весь код нет необходимости — ограничимся лишь одним шаблоном регулярного выражения. Здесь это самое главное:

Set rexp = CreateObject(«VBScript.RegExp»)

 rexp.Global = True

 rexp.IgnoreCase = False

 rexp.Pattern = «([A-Я][A-Яa-я]+[ -]?[A-Яa-я]?[ ]?\d[0-9.-]+\d\*?)»

 Set mchs = rexp.Execute(context)

В начало В начало

Этап 3. Сравнение ссылок с базой NormaCS

Итак, мы извлекли из текста все ссылки на нормативные документы. Осталось сравнить их с базой NormaCS.

  Set fnd = NormacsApplication.Find

  if rexp.Test(code) then     

      Set mchs = rexp.Execute(code)

      fnd.Index  = mchs(0).SubMatches(0)     

      fnd.Number = mchs(0).SubMatches(1)       

      if Len(fnd.Index) = 0 or Len(fnd.Number ) = 0 then exit function 

      fndres = fnd.Execute

      if fndres = true then result = 1 

      if fndres = true and fnd.Documents(1).IsActual then

        result = 2

      end if

  end if

В итоге сравнение идет по двум критериям: наличию в базе и актуальности документа.

Следует помнить, что предлагаемое решение не позволяет автоматически искать ссылки, которые существуют в виде растрового изображения в документе. Есть и другие ограничения: найденный в NormaCS документ невозможно открыть средствами TDMS, а при огромных объемах текстовых данных не следует ждать высокой скорости выполнения операций. Однако при этом инженер получает возможность уже на ранней стадии проектирования проверить актуальность используемого нормативно-технического документа. И уж тем более очевидны преимущества для специалиста по нормоконтролю:

  • не требуется искать ссылки на нормативные документы, изучая исходный документ;
  • не нужно сверять все найденные ссылки с базой нормативно-технической документации;
  • от нормоконтролера требуется только проверить адекватность и актуальность ссылок на нормативные документы, не обнаруженные в автоматическом режиме.

Александр Щетинин

Начальник отдела информационных технологий ОАО «Институт «Нефтегазпроект» (Тюмень).

В начало В начало

САПР и графика 3`2008