Вероятно, многие читатели слышали о программе 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;
Итак, поставленная задача решена.
Используемые при написании кода источники
- forum.solidworks.com
- справки по api, примеры
ссылка на оригинал статьи http://habrahabr.ru/post/263133/
Добавить комментарий