Pull to refresh

Работаем с КОМПАС 3D из DELPHI

Reading time8 min
Views6.6K
imageimageПриветствую тебя, %username%.
Куда нас только не закидывает судьбинушка. С какими только порождениями ума человеческого не приходится сталкиваться. Вот и мне пришлось копнуть тему, касаемую API Компас от Аскон.
Информации по данной теме я нашёл не достаточно. Нулевому разработчику даётся SDK Help и ряд примеров, всё в комплекте с программой.
Поддержка на форуме http://forum.ascon.ru/index.php/board,4.0.html — практически никакая (на 80% вопросов пользователи отвечают сами себе).
Но программа всё-же достаточно популярная (Особенно честно взломанные версии), посему вопросы задаются. Чтобы как то помочь тем, кто волею судеб (злого рока, руководства, либо истеричного заказчика) столкнётся с данным продуктом, эта статья.
Тут я выложу «прожиточный минимум», старт, оттолкнувшись от которого, можно писать не самые плохие программы, да и зарабатывать при желании, как показала практика.

Сразу предупрежу, что прежде, чем писать под Компас, необходимо обладать хотя бы минимальными представлениями о системе (черчение, создание модели, параметризация, работа с переменными)

Замечу сразу, что информация к данной статье была взята из разных источников, многих уже и не помню… Писалась самостоятельно… все намёки на копипаст в игнор, кроме некоторых кусков кода, ибо велосипед дело хорошее, но лично мне удобнее использовать готовые наработки.

1. Установка

Ни чего нового тут не изобретено. Стандартно устанавливаем компоненту для Delphi. Следим, чтоб пути были прописаны.
2. После установки

Рекомендую позапускать (посмотреть) Демки, идущие в комплекте.
3. Как запустить Компас из нашей программы

(общая структура, чисто для примера):

Copy Source | Copy HTML
  1. uses
  2.   ActiveX, Db, IniFiles, LDefin2D,LDefin3D, ksConstTLB,
  3. {$IFDEF __LIGHT_VERSION__}
  4.   klTLB;
  5. {$ELSE}
  6.   ksTLB, CheckLst;
  7. {$ENDIF}
  8.  
  9. var kompas:KompasObject;
  10.     doc2:ksDocument2D;


Copy Source | Copy HTML
  1. // Создать объект автоматизации KOMPAS_Graphic
  2.       if Kompas = nil then begin
  3.          {$IFDEF __LIGHT_VERSION__}
  4.          Kompas:= KompasObject( CreateOleObject('KompasLT.Application.5') );
  5.          {$ELSE}
  6.          Kompas:= KompasObject( CreateOleObject('Kompas.Application.5') );
  7.          {$ENDIF}
  8.          if Kompas <> nil then Kompas.Visible := true;
  9.       end;
  10.  
  11.       doc2:= ksDocument2D( kompas.Document2D );
  12.       if FileIsThere(FileName) then // FileName - имя шаблона+путь       
  13.          doc2.ksOpenDocument(FileName,false) // Открываем чертеж
  14.       else MessageBox(self.Handle,Pchar(FileName),'Файл не найден',MB_OK);
  15.       if doc2<>nil then begin
  16.  
  17.      //ТУТ РАБОТАЕМ С ДОКУМЕНТОМ
  18.  
  19.         doc2.ksSaveDocument(FileName1);//FileName1 - имя готового документа+путь
  20.       end;
  21.  
  22.       //Когда закончим - Kompas:=nil; 


Функция FileIsThere — выдрана из примеров help Delphi.

Напомню, что как и при работе с любыми сторонними приложениями (написанными кем-то), по возможности необходимо проверять все возвращаемые результаты.
Работать с Компас API можно в двух вариантах: Внешняя программа и встроенная библиотека. Здесь будет рассмотрено только внешнее управление системой, ибо разница не велика (в смысле суть взаимодействия с Компас).

В демках SDK есть примеры непосредственного черчения в Компас, я же предпочитаю чертить вручную, тем более, что обычно на выходе требуются варианты одного изделия с разными размерами, а значит мы можем использовать шаблоны.

4. И так… работаем с деталью

4.1. Подготовка шаблонов

Для начала создадим шаблон. Допустим, это будет трёхступенчатый вал. Пока простой (без излишеств всяких).
Чертим 3D вал.
Параметризируем его. Переменные L1,D1,L2,D2,D3,L3 — Длины и Диаметры ступеней. Сделаем их внешними переменными.
Назначьте Обозначение, Наименование детали и создайте Объект спецификации.
Не забудьте сохранить.

Далее на основе данного 3d шаблона, нам необходим чертёж, создайте его.
Убедитесь, что проставленные размеры правильно привязаны к элементам чертежа.
Сохраните уже, да приступим к программированию.

4.2. Подготовка формы программы

Создадим форму, кинем на неё 6 элементов TEdit, обзовём их по именам наших внешних переменных edL1...edD3.
Кинем на форму 3 кнопки. Напишем на них «Запуск», «Выход» и «Применить».
Так же нам потребуется TSaveDialog.
Остальное, по желанию трудящихся: 2 элемента TEdit под Обозначение и наименование детали (можно этого не делать, а назначать программно).

Переменные:

Copy Source | Copy HTML
  1. var doc: ksDocument3D;
  2.     doc2:ksDocument2D;
  3.     Kompas :KompasObject;


Кнопке «Запуск» назначаем код:

Copy Source | Copy HTML
  1. begin
  2.   // Создать объект автоматизации KOMPAS_Graphic
  3.   if Kompas = nil then
  4.   begin
  5. {$IFDEF __LIGHT_VERSION__}
  6.     Kompas:= KompasObject( CreateOleObject('KompasLT.Application.5') );
  7. {$ELSE}
  8.     Kompas:= KompasObject( CreateOleObject('Kompas.Application.5') );
  9. {$ENDIF}
  10.     if Kompas <> nil then
  11.       Kompas.Visible := true;
  12.   end;
  13. end;


Кнопке «Выход» назначаем код:

Copy Source | Copy HTML
  1. begin
  2.      if doc2d<>nil then doc2d:=nil;
  3.      if doc3d<>nil then doc3d:=nil;
  4.      if Kompas <> nil then begin
  5.         //принудительно закрыть
  6.         Kompas.Quit;
  7.         Kompas := nil;
  8.      end;
  9. end;


Сохраним проект и запустим его. Компас открывается, Компас закрывается, что не может не радовать.

4.3. Работаем с внешними переменными 3d

Обработаем ввод значений в TEdit. Нам нужны только числа.
И начнём работать с кнопкой «Применить».
Сделаем проверку на наличие привязанного объекта компас и введёные параметры. Сообщения об ошибках расписывать не буду сознательно, т.к. у нас чистая демонстрация, уж простите за моветон.

Я вынес всю обработку детали в отдельную процедуру, чтобы при необходимости можно было работать с разными изделиями.
procedure TForm2.ReBuildPart(FileName:String);
вызов делаем из обработчика нажатия кнопки «Применить» ReBuildPart('Shaft.m3d');
где, как все уже догадались, 'Shaft.m3d'название файла с нашим валом.

Переменные, с которыми будем работать:
Copy Source | Copy HTML
  1. Var
  2.   part: ksPart; //Тут храним нашу деталь
  3.   varCol: ksVariableCollection; //Коллекция переменных детали
  4.   variable: ksVariable; //Активная переменная
  5.   i,count: integer; //Счётчики
  6.   Patch:String; //Путь до файла - шаблона


Начнём с открытия файла шаблона модели. (У меня он сохранён в поддиректории «draw», для удобства)
Сама процедура обработки внешних переменных детали:

Copy Source | Copy HTML
  1. Begin
  2.   Patch:=ExtractFilePath(Paramstr(0))+'draw\'; //Шаблоны у меня в каталоге "draw"
  3.   if Kompas <> nil then begin
  4.     if FileIsThere(Patch+FileName) then begin
  5.       doc3d := ksDocument3D( Kompas.Document3D );
  6.       if doc3d <> nil then
  7.         doc3d.Open(Patch+FileName, false );
  8.     end else exit;
  9.   end else exit;
  10.   part := ksPart( doc3d.GetPart(pTop_Part) ); // первая деталь в сборке
  11.                                               // в нашем случае, наша деталь.
  12.   if part <> nil then begin
  13.      // работа с массивом внешних переменных
  14.      varCol := ksVariableCollection(part.VariableCollection() );
  15.      if varCol <> nil then
  16.         begin
  17.            variable := ksVariable( kompas.GetParamStruct(ko_VariableParam) );
  18.        if variable = nil then exit; //Проверим, а есть ли они?
  19.            count := varCol.GetCount(); //Количество внешних переменных
  20.            for i := 0 to count - 1 do //Пробежим по всем переменным
  21.               begin
  22.          variable := ksVariable( varCol.GetByIndex(i) );
  23.                  // Смотрим имя переменной, если наше, то присваиваем значение.
  24.                  if variable.Name='L1' then variable.Value := StrToFloat(edL1.Text);
  25.                  if variable.Name='L2' then variable.Value := StrToFloat(edL2.Text);
  26.                  if variable.Name='L3' then variable.Value := StrToFloat(edL3.Text);
  27.                  if variable.Name='D1' then variable.Value := StrToFloat(edD1.Text);
  28.                  if variable.Name='D2' then variable.Value := StrToFloat(edD2.Text);
  29.                  if variable.Name='D3' then variable.Value := StrToFloat(edD3.Text);
  30.               end;
  31.  
  32.            // Здесь вставим запонение спецификации.
  33.  
  34.            part.needRebuild:=true;
  35.            part.Update;
  36.            part.RebuildModel(); // перестроение модели детали
  37.  
  38.         end;
  39.   end;
  40.  
  41.   doc3d.treeNeedRebuild:=true;
  42.   doc3d.RebuildDocument; // перестроение модели документа
  43.  
  44.   //Перезаписываем файл.
  45.   doc3d.Save;
  46.   doc3d.close; //Опционально... не люблю, когда много всего открыто...
  47.               //Для познавательного момента, можно и закомментировать.
  48.  
  49. End;


Сразу возникают вопросы: «А зачем столько раз перестраивать модель?»
Сразу и отвечу: «Иногда не срабатывает. То переменную „не зацепит“, то остальные значения „не примет“. Бывает… У разных потребителей разные версии, от лицензионной с изредка всплывающими ошибками, до ломаной, иногда идеально работающей...»
(Это не призыв отказаться от покупки лицензионной версии, это скорее просьба к местным дистрибьюторам попытаться качественно решать проблемы, пусть иногда «криворуких», но Клиентов.)

Опробуем созданный код в действии.

За сим пока всё… Если будут силы, желание и настроение, то возможно увидим в части второй:

4.4. Работаем со спецификацией

4.5. Работаем с наименованием детали

4.6. Работаем с чертежом

5. Маленькие «обходные пути». Или не всегда вредные советы
Tags:
Hubs:
+13
Comments3

Articles