API
CAD/CAM
July 2015 31

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, примеры
+8
8.9k 25
Leave a comment
Top of the day