Одна из задач отдела технической экспертизы в части нормоконтроля — выявление
Поначалу выглядит нереальной даже частичная автоматизация такой работы. Тем не менее, если разбить задачу на части и вооружиться подходящими инструментами, проблема оказывается вполне разрешимой.
Итак, что имеется:
- 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, а при огромных объемах текстовых данных не следует ждать высокой скорости выполнения операций. Однако при этом инженер получает возможность уже на ранней стадии проектирования проверить актуальность используемого
- не требуется искать ссылки на нормативные документы, изучая исходный документ;
- не нужно сверять все найденные ссылки с базой
нормативно-технической документации; - от нормоконтролера требуется только проверить адекватность и актуальность ссылок на нормативные документы, не обнаруженные в автоматическом режиме.