Преобразование чертежей в PDF

18 8

Давайте поговорим о работе в нашей всеми любимой системе специалистов инженеров. Основная задача инженера – думать. Но думать это нечто нематериальное, поэтому результат его мысли фиксируется в документах, таких как технические условия, спецификации, руководство по эксплуатации.… Этот список очень большой и зависит от направления, в котором работает специалист. Но все же, основным результатом инженерной мысли является чертеж!

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

Кроме этих способов можно найти еще множество вариантов решения задачи, главное не боятся пробовать и экспериментировать. Но не забывать, эксперименты лучше проводить в тестовой БД.

Отредактировал Андрей Дозоров, 07.07.2013 в 22:56
Алексей Пестерев

Андрей, очень круто! Молодец!

Александр Павлов

Не, не, не. Ни в коем случае так делать нельзя, именно после такой автоматизации получается полная хрень. По всей видимости статью писал человек очень далекий от AutoCAD. Предположительно это прогаммист, который не вкурсе что в dwg есть модель, листы, масштабы, внешние ссылки и т.д. Ни в коем случае нельзя запускать второй автокад на windows x32, т.к. это минус 300-400 мб от оперативки + 10 мб*N самого dwg, что нименуемо приводит к crash, т.к. запускать если только на х64 и автокад x64 да и то если диск sata, а не ssd это будет совсем не быстро.

Про сторонние программы конверторы dwg - это обман, т.к. нет идеальных подкотовленных dwg для этих программ.

Ничего крутого в статье нет - есть только ужас от прочитанного.

Максисмум что можно сделать для пользователя - это сделать команду (кнопку) в автокаде которая создаст  pdf ОТКРЫТОГО чертежа в автокаде (из директума) с обязательным ПРЕДПРОСМОТРОМ создаваемого pdf и автоматическим созданием версии документа, а не выбором dwg из поиска без предпросмотра - 95 % будет хрень.  

Итого: данная статья вводит в заблуждение пользователей после прочтения что всё хорошо, а на самом деле всё совершенно не так.

Какой громкий негативный отзыв:) Сходу возник вопрос (не для критики, для себя) - каков средний объем ОЗУ на ПК пользователей в вашей организации?

А по поводу решения-хорошее и рабочее. Несмотря на то, что "писал программист" (а кто ж еще напишет, пользователь, работающий с autocad?wink), принято и успешно обкатано теми, кто работает с autocad. Но и пожелания прозвучали дельные - их бы и докрутить.

Александр Павлов

Минимум 2 Гб ОП

 

принято и успешно обкатано теми, кто работает с autocad
это сколько человек? 5, 10, 50, 100, 500?
 
По поводу статьи - если импортировать pdf в документ dwg, то он станет pdf и через поиск не отобразится  при повторной попытке импорта.
Андрей Дозоров
это сколько человек? 5, 10, 50, 100, 500?

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

Ошибаетесь, в курсе. Я с вами согласен что AutoCAD крайне сложный САПР, который использует большое количество всевозможных объектов. Код, который написан в статье - это исследование, но оно положило начало довольно таки сложному решению. Само собой если взять этот код и вставить в сценарий, сценарий сможет более менее нормально работать только с самыми простыми чертежами. Решение, которое разработано для заказчика, абсолютно другое и Константин верно сказал, оно принято заказчиком. Выкладывать решение, разработанное для заказчика, мы не имеем права, существует понятие интеллектуальной собственности.
Александр Павлов
Мы не можем разглашать количество пользователей, существует понятие коммерческой тайны.

Вот это уже очень странно - сообщить о каком порядке цифр идет речь ни как не является коммерческой тайной. Речь идет о единицах, десятках или сотнях человек?
 
Выкладывать разработанные решения вас никто не просит, а вот совсем краткое описание сложного решения просьба расказать. Краткое описание сложного разработанного решения ни как не пересекается с понятием интелектуальной собственности.
Алексей Пестерев
Вот это уже очень странно - сообщить о каком порядке цифр идет речь ни как не является коммерческой тайной. Речь идет о единицах, десятках или сотнях человек?

Александр, существует проекты, где разглашение даже этих данных влечет множество санкций, поэтому это не "странности", а особенности проектов.
Айрат Сибгатуллин

Лет 6 назад решал аналогичную ситуацию, правда вместо AutoCAD был SolidEdge, a вместо DIRECTUM - Smarteam PLM. Но идея была схожа. Итого много лет сотрудники пользуются решением, хотя по-началу и называли "лажей". Андрей, удачи.

Авторизуйтесь, чтобы написать комментарий