Давайте поговорим о работе в нашей всеми любимой системе специалистов инженеров. Основная задача инженера – думать. Но думать это нечто нематериальное, поэтому результат его мысли фиксируется в документах, таких как технические условия, спецификации, руководство по эксплуатации.… Этот список очень большой и зависит от направления, в котором работает специалист. Но все же, основным результатом инженерной мысли является чертеж!
А теперь давайте наложим работу нашего специалиста на электронный документооборот. С большей частью документов проблем не возникает, так как большинство из них выполняется в общепринятых форматах, например в формате 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. Но идея была схожа. Итого много лет сотрудники пользуются решением, хотя по-началу и называли "лажей". Андрей, удачи.
Авторизуйтесь, чтобы написать комментарий