SolidWorks API (Delphi): подключение и получение дерева объекта

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

    Постановка задачи аналогична описанной в статье Tekla Structure API (c#): подключение и получение дерева объектов, за исключением технологии реализации, — получить дерево объектов модели, т.е. сборки, которые входят в модель и детали, которые входят в сборки, их взаимосвязи и параметры.

    Используемая система разработки — Borland Delphi 7.

    SolidWorks имеет свой api, который поставляется вместе с самой программой. В справках по api (здесь) довольно хорошо описаны классы и даны примеры на языках c# и Visual Basic, в целом все интуитивно понятно, разобраться не сложно. Также со всеми вопросами можно обратиться за поддержкой в личный кабинет на портале SolidWorks.

    Подключение библиотек SolidWorks


    Если программа SolidWorks установлена корректно, то в Project->Import Type Library… находим
    • SldWorks 2015 Type Library (Version ___)
    • SOLIDWORKS 2015 Constant type library (Version ___)

    Не забудьте подключить SldWorks_TLB и SwConst_TLB в uses к проекту.

    Подключение к SolidWorks


    Здесь помогла статья Знакомимся с SolidWorks из Delphi: Подключение.
    procedure SldWrkConnect;
    var
       swApp: ISldWorks;
       fileName,fileExt: String;
       fileerror,filewarning: LongInt;
       DocType: swDocumentTypes_e;
       swModel: IModelDoc2;
    begin
       fileName := 'C:\Model.SLDASM';  
       
       fileExt := AnsiUpperCase(ExtractFileExt(fileName));
       if fileExt = '.SLDASM' then
         DocType := swDocASSEMBLY   //сборка
       else
       if fileExt = '.SLDPRT' then
         DocType := swDocPART  //деталь
       else
       if fileExt = '.SLDDRW' then
         DocType := swDocDRAWING   //чертеж
       else
         begin
            ShowMessage('Неизвестный тип данных!');
            DocType := swDocNONE;
         end;
    
       swApp := IUnknown(CreateOleObject('SldWorks.application')) as ISldWorks; 
       swApp.OpenDoc6(fileName,DocType,swOpenDocOptions_Silent,'',fileerror, filewarning); 
       swModel := swapp.ActiveDoc as IModelDoc2; //получаем открытую модель
       ...
      //по окончании работы необходимо завершить процесс
      if not swApp.Visible then   
         begin
            swApp.CloseAllDocuments(true);
            swApp.ExitApp;
         end;
    end;
    

    Обратите внимание на то, что если программа SolidWorks уже запущена, то мы подключаемся к ней и открываем новый документ в ней, если же она еще не запущена, то осуществляем запуск в невидимом режиме. Если для каких-либо целей нужно сделать запущенный SolidWorks видимым, используем следующее:
    swApp.Visible := true;  
    

    Получение параметров модели


    procedure SldWrkConnect;
    var
       ...
       author,dataCreate,nameParam: String;
       vCustomInfo: OleVariant;
       j: Integer;
    begin
       ...
       //параметры из вкладки "Суммарная информация"   
       author := swModel.SummaryInfo[swSumInfoAuthor];
       dataCreate := swModel.SummaryInfo[swSumInfoCreateDate];
       //параметры из вкладки "Настройка"
       vCustomInfo := swModel.GetCustomInfoNames;  //получаем все параметры с их значениями
       for j := VarArrayLowBound(vCustomInfo,1) to VarArrayHighBound(vCustomInfo,1) do  
          if 'НАИМ_ПАРАМ' = AnsiUpperCase(vCustomInfo[j]) then      //ищем интересующий параметр
               nameParam := swModel.GetCustomInfoValue('',vCustomInfo[j]);
       ...
    end;
    

    Получение конфигураций


    Модель может иметь несколько отличных друг от друга конфигураций (с разными деталями, параметрами, связями и т.д.). В рамках текущей задачи нам необходимо получить все конфигурации со всеми их составляющими.
    procedure SldWrkConnect;
    var
       ...
       vConfArr: array of String;
       k: Integer;
       swComp: Component2;
       swConf: IConfiguration;
    begin
          ...
          k := swModel.GetConfigurationCount;
          setLength(vConfArr,k);
          vConfArr := swModel.GetConfigurationNames; 
          
          for i:=0 to k-1 do
            begin
              swConf := swModel.IGetConfigurationByName(vConfArr[i]);
              swComp := swConf.GetRootComponent3(true);          
              if DocType = swDocASSEMBLY then   //если сборка, то получим её дочерние элементы
                 Traverse(swComp,nil);
           end
    end;
    

    Возможно получение только активной на данный момент конфигурации:
    swConf:= swModel.IGetActiveConfiguration;
    

    Получение дерева объектов для конфигурации


    procedure Traverse(swComp:Component2; node:TTreeNode);
    var
      vChildArr: OleVariant;
      i:Integer;
      nodeChild: TTreeNode;
    begin
       if (node = nil) then
         nodeChild := TreeView.Items.Add(nil,swComp.Name2)
      else
         nodeChild := TreeView.Items.AddChild(node,swComp.Name2);
    
      vChildArr:= swComp.GetChildren;
      if not VarIsNull(vChildArr) then  
           for i := VarArrayLowBound(vChildArr, 1) to VarArrayHighBound(vChildArr, 1) do
              Traverse(IUnknown(vChildArr[i]) as IComponent2, nodeChild);
    end;
    

    Итак, поставленная задача решена.

    Используемые при написании кода источники


    1. forum.solidworks.com
    2. справки по api, примеры
    Поделиться публикацией

    Комментарии 0

    Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

    Самое читаемое