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, примеры

ссылка на оригинал статьи http://habrahabr.ru/post/263133/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *