Давайте поговорим о работе в нашей всеми любимой системе специалистов инженеров. Основная задача инженера – думать. Но думать это нечто нематериальное, поэтому результат его мысли фиксируется в документах, таких как технические условия, спецификации, руководство по эксплуатации.… Этот список очень большой и зависит от направления, в котором работает специалист. Но все же, основным результатом инженерной мысли является чертеж!
А теперь давайте наложим работу нашего специалиста на электронный документооборот. С большей частью документов проблем не возникает, так как большинство из них выполняется в общепринятых форматах, например в формате doc. Открыть и посмотреть такой документ не будет проблемой ни для кого. Но что же делать с чертежами, разработанными в ПО, установленном не на всех ПК? Что делать с таким документом, когда его необходимо согласовать с человеком, у которого нет необходимого ПО? Ответ на данный вопрос прост - преобразуем документ в общедоступный формат!
Ради эксперимента возьмём самый распространённый САПР, например AutoCAD. Преобразовывать будем, конечно же, в PDF.
А теперь давайте подумаем, как можно организовать данное преобразование, ведь стандартными средствами это сделать не получится. Возможны три варианта:
1) Заставлять инженера самостоятельно преобразовывать документ и заносить его в систему;
2) Автоматизировать преобразование;
3) Поставить необходимое программное обеспечение на все компьютеры.
Конечно же, нас устраивает только второй вариант.
Как можно автоматизировать преобразование?
Первый вариант – использование специализированных программ для преобразования одного формата документа в другой.
Давайте рассмотрим этот вариант поподробнее.
Первое что нам нужно – выбрать подходящую утилиту. Я остановил свой выбор на утилите Acme CAD Converter.
Что она позволяет:
1) Конвертирование файлов DWG, DXF, DWF в PDF, WMF, JPEG, TIFF, EPS, SVG, CGM...
2) Поддерживает командную строку. Более подробно можно почитать на официальном сайте.
Эта утилита позволяет нам выполнять необходимое преобразование.
Теперь давайте посмотрим, как можно использовать эту утилиту в прикладном коде:
TMPFolder = GetTempFolder() & 'ConvertDWG\'
//Поиск документов AutoCAD
SearchFactory = Application.SearchFactory
SeachDiscription = SearchFactory.Load('EDOCUMENT_SEARCH')
Criteria = SeachDiscription.SearchCriteria
EditorCriterion = Criteria.Add('ISBEDocEditor')
EditorCriterion.SetCompleteValue('AutoCAD')
SeachDiscription.Show(ssmMultiSelect; True)
SelectedFails = SeachDiscription.SelectedContents
EDocumentList = CreateList()
VersionList = CreateList()
Versions = ''
LastVersion = ''
if Assigned(SelectedFails)
DialogExe = CreateOpenDialog()
DialogExe.Filter = 'exe file (*.exe)|*.exe'
DialogExe.FilterIndex = 1
DialogExe.MultiSelect = FALSE
if DialogExe.Execute
ExeFile = DialogExe.Result
else
Exit("Не выбран исполняемый файл AcmeCAD")
endif
foreach Element in SelectedFails
EDocumentID = Element.ID
EDocument = EDocuments.GetObjectByID(EDocumentID)
ExportFileName = TMPFolder & EDocument.SYSREQ_EDOC_NAME & '.DWG'
EDocument.Export(1; ExportFileName; False)
Cmd = Format('"%s" /r /ad /ls /p 1 /f 104 /w 33in /h 23in /res 400 /a -2 "%s"'; ArrayOf(ExeFile; ExportFileName))
ExecuteProcess(Cmd; smHidden; wmYes; 120000)
//Импорт документа в новую версию
ImportFileName = TMPFolder & EDocument.SYSREQ_EDOC_NAME & '.pdf'
EDocument.ImportFromFile(-1; "Новая версия"; ImportFileName; False)
DeleteFile(ExportFileName)
DeleteFile(ImportFileName)
endforeach
endif
Подробности ключей запуска Acme CAD можно почитать в документации к утилите.
Теперь давайте посмотрим на результат работы:
Исходный документ:
Документ после преобразования:
Второй вариант – использовать тот набор ПО, который уже есть у нашего инженера.
А у нашего инженера есть только тот САПР, в котором он разрабатывал чертеж, в данном случае AutoCAD.
Давайте посмотрим, возможно ли реализовать преобразование при помощи AutoCAD.
AutoCAD очень мощный САПР, обладающий большими возможностями как для проектирования так и для программистов, которые хотят автоматизировать работы в системе. DIRECTUM предоставляет нам возможность общаться со сторонними утилитами при помощи COM интерфейса. А AutoCAD предоставляет нам богатую объектную модель, к которой можно обращаться через COM интерфейс.
Подробно изучить объектную модель AutoCAD можно тут.
Теперь давайте посмотрим, как можно преобразовать чертеж, используя объектную модель AutoCAD.
Вот небольшая последовательность действий:
TMPFolder = GetTempFolder() & 'ConvertDWG\'
ENVIRONMENT_EX = "'acad.exe'"
DELAY_FIVE_SEC = 5000
DELAY_TEN_SEC = 10000
BACK_GROUND_PLOT = "BACKGROUNDPLOT"
PLOT_NAME = 'DWG To PDF.pc3'
PlotFlag = FALSE
//Поиск документов AutoCAD
SearchFactory = Application.SearchFactory
SeachDiscription = SearchFactory.Load('EDOCUMENT_SEARCH')
Criteria = SeachDiscription.SearchCriteria
EditorCriterion = Criteria.Add('ISBEDocEditor')
EditorCriterion.SetCompleteValue('AutoCAD')
SeachDiscription.Show(ssmSelect; True)
SelectedFails = SeachDiscription.SelectedContents
if Assigned(SelectedFails)
EDocumentID = SelectedFails.Value.ID
EDocument = EDocuments.GetObjectByID(EDocumentID)
ExportFileName = TMPFolder & EDocument.SYSREQ_EDOC_NAME & '.DWG'
ImportFileName = TMPFolder & EDocument.SYSREQ_EDOC_NAME & '.pdf'
EDocument.Export(1; ExportFileName; False)
// Создаем COM объект AutoCAD
AutoCad = CreateObject('AutoCAD.Application')
// Страховочная задержка, что бы AutoCAD успел инициализироваться
CallProcedure('kernel32.dll'; 'Sleep'; 'EE'; DELAY_FIVE_SEC)
// Открываем документ
Doc = AutoCad.Documents.Open(ExportFileName)
// Получаем параметры настройки
Layout = Doc.ActiveLayout
// Обновляем информацию о устройствах печати
Layout.RefreshPlotDeviceInfo
// Получаем список имен принтеров
Plots = Layout.GetPlotDeviceNames()
// Проверяем наличие виртуального принтера
if not PlotFlag
foreach Plot in CArrayElement(Plots)
if Plot == PLOT_NAME
PlotFlag = TRUE
endif
endforeach
endif
if PlotFlag
// Режим фоновой печати
Doc.SetVariable(BACK_GROUND_PLOT; 1)
// выключение окон с предупреждениями
Doc.Plot.QuietErrorMode = TRUE
// Печать файла в PDF
SuccessPrint = Doc.Plot.PlotToFile(ImportFileName; PLOT_NAME)
// Ждем пока закончится печать
if SuccessPrint
while not FileExists(ImportFileName)
CallProcedure('kernel32.dll'; 'Sleep'; 'EE'; DELAY_TEN_SEC)
endwhile
endif
endif
// закрываем документ
Doc.Close(FALSE)
/* Когда AutoCAD преобразует файл, создается второй процесс acad, если закрывать AutoCAD до завершения работы этого процесса, вызывается окно с предупреждением отмены фоновой печати. Что бы исключить этой ситуации проверяем количество запущенных процессов acad и еслиих больше одного, делаем задержку */
NumEnvProc = 2
while NumEnvProc > 1
ScriptControl = CreateObject("MSScriptControl.ScriptControl")
ScriptControl.Language = "VBScript"
ScriptControl.Reset
Command = Format(
'Function EnvProc()
Set objWMIService = GetObject("winmgmts:\\.\root\CIMV2")
Set colItems = objWMIService.ExecQuery( _
"SELECT * FROM Win32_Process WHERE Caption = %s ",,48)
For Each objItem in colItems
EnvProc = EnvProc + 1
Next
End Function'; ArrayOf(ENVIRONMENT_EX))
ScriptControl.AddCode(Command)
NumEnvProc = ScriptControl.Run('EnvProc')
CallProcedure('kernel32.dll'; 'Sleep'; 'EE'; DELAY_FIVE_SEC)
endwhile
AutoCad.Quit
//Импорт документа в новую версию
EDocument.ImportFromFile(-1; "Новая версия"; ImportFileName; False)
DeleteFile(ExportFileName)
DeleteFile(ImportFileName)
endif
В результате мы получили вот такой документ:
У данного способа тоже есть свои недостатки, AutoCAD работает медленно. Процесс создания объекта AutoCAD и сама печать в PDF занимает достаточно много времени.
Но есть и плюсы: во-первых, если в чертеже использовались какие-то надстройки, преобразовать их в PDF сможет только сам AutoCAD, а во-вторых, использование объектной модели дает богатые возможности для управления чертежом.
Кроме этих способов можно найти еще множество вариантов решения задачи, главное не боятся пробовать и экспериментировать. Но не забывать, эксперименты лучше проводить в тестовой БД.
Андрей, очень круто! Молодец!
Не, не, не. Ни в коем случае так делать нельзя, именно после такой автоматизации получается полная хрень. По всей видимости статью писал человек очень далекий от AutoCAD. Предположительно это прогаммист, который не вкурсе что в dwg есть модель, листы, масштабы, внешние ссылки и т.д. Ни в коем случае нельзя запускать второй автокад на windows x32, т.к. это минус 300-400 мб от оперативки + 10 мб*N самого dwg, что нименуемо приводит к crash, т.к. запускать если только на х64 и автокад x64 да и то если диск sata, а не ssd это будет совсем не быстро.
Про сторонние программы конверторы dwg - это обман, т.к. нет идеальных подкотовленных dwg для этих программ.
Ничего крутого в статье нет - есть только ужас от прочитанного.
Максисмум что можно сделать для пользователя - это сделать команду (кнопку) в автокаде которая создаст pdf ОТКРЫТОГО чертежа в автокаде (из директума) с обязательным ПРЕДПРОСМОТРОМ создаваемого pdf и автоматическим созданием версии документа, а не выбором dwg из поиска без предпросмотра - 95 % будет хрень.
Итого: данная статья вводит в заблуждение пользователей после прочтения что всё хорошо, а на самом деле всё совершенно не так.
Какой громкий негативный отзыв:) Сходу возник вопрос (не для критики, для себя) - каков средний объем ОЗУ на ПК пользователей в вашей организации?
А по поводу решения-хорошее и рабочее. Несмотря на то, что "писал программист" (а кто ж еще напишет, пользователь, работающий с autocad?), принято и успешно обкатано теми, кто работает с autocad. Но и пожелания прозвучали дельные - их бы и докрутить.
Минимум 2 Гб ОП
Лет 6 назад решал аналогичную ситуацию, правда вместо AutoCAD был SolidEdge, a вместо DIRECTUM - Smarteam PLM. Но идея была схожа. Итого много лет сотрудники пользуются решением, хотя по-началу и называли "лажей". Андрей, удачи.
Авторизуйтесь, чтобы написать комментарий