Вероятно, многие читатели слышали о программе SolidWorks (см. оф.сайт). В настоящей статье она нас интересует с точки зрения автоматизации разработки изделий (деталей и сборок) на этапе проектирования промышленного производства.
Постановка задачи аналогична описанной в статье Tekla Structure API (c#): подключение и получение дерева объектов, за исключением технологии реализации, — получить дерево объектов модели, т.е. сборки, которые входят в модель и детали, которые входят в сборки, их взаимосвязи и параметры.
Используемая система разработки — Borland Delphi 7.
SolidWorks имеет свой api, который поставляется вместе с самой программой. В справках по api (здесь) довольно хорошо описаны классы и даны примеры на языках c# и Visual Basic, в целом все интуитивно понятно, разобраться не сложно. Также со всеми вопросами можно обратиться за поддержкой в личный кабинет на портале SolidWorks.
Если программа SolidWorks установлена корректно, то в Project->Import Type Library… находим
Не забудьте подключить SldWorks_TLB и SwConst_TLB в uses к проекту.
Здесь помогла статья Знакомимся с SolidWorks из Delphi: Подключение.
Обратите внимание на то, что если программа SolidWorks уже запущена, то мы подключаемся к ней и открываем новый документ в ней, если же она еще не запущена, то осуществляем запуск в невидимом режиме. Если для каких-либо целей нужно сделать запущенный 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, примеры