Выбрать главу

procedure LibraryEntry(command: WORD); pascal;

var GearsForm : TGearsForm;

begin

kompas := KompasObject(CreateKompasObject);

if (kompas = nil) then exit;

// получаем дескриптор главного окна КОМПАС

Application.Handle := kompas.ksGetHWindow;

// запрещаем доступ к главному окну

kompas.ksEnableTaskAccess(0);

// создаем объект диалогового окна

GearsForm := TGearsForm.Create(Application);

GearsForm.ks := kompas;

// выводим диалог на экран

GearsForm.ShowModal;

// удаляем объект

GearsForm.Free;

// возвращаем доступ к окну

kompas.ksEnableTaskAccess(1);

Application.Handle := 0;

kompas := nil;

end;

В приведенном фрагменте кода есть одна, на первый взгляд, непонятная строка – GearsForm.ks := kompas;. В действительности, здесь все просто. Поскольку обработка построения зубчатого колеса будет выполнена внутри класса формы TGearsForm, то для того, чтобы в нем не получать заново указатель на интерфейс KompasObject, этот указатель передается внешней переменной ks класса TGearsForm. Разумеется, эту переменную (типа KompasObject) необходимо предварительно добавить в раздел public описания класса формы. Перед этим подключите в разделе uses модуля BuildUnit следующие файлы (модули): ksTLB, ksAuto, ksConstTLB, LDefin3D, LDefin2D и math (последний не относится к КОМПАС API, это стандартный модуль математических функций Delphi).

Скомпилируйте проект и подключите полученную библиотеку Gears3D.rtw к КОМПАС. Запустите ее и убедитесь, что после выполнения ее единственной команды в центре главного окна появляется созданное нами диалоговое окно.

Перейдем к реализации обработчиков щелчка на кнопках. Начнем со второй (Отмена), поскольку ее обработчик чрезвычайно прост. Щелкните дважды в редакторе форм на кнопке Отмена и в обработчике, автоматически созданном в редакторе кода, введите всего одну строку, закрывающую форму (листинг 6.11).

Листинг 6.11. Обработчик щелчка на кнопке Отмена

procedure TGearsForm.Button2Click(Sender: TObject);

begin

if CloseQuery then Close;

end;

Процедура обработки нажатия кнопки Построение намного сложнее. Условно ее можно разделить на три части.

1. Расчет геометрических параметров зубчатого колеса по введенным исходным данным.

2. Создание пустого документа КОМПАС-Деталь.

3. Собственно построение модели зубчатого колеса.

Программное построение модели колеса реализуем такой последовательностью трехмерных операций.

1. Сначала программно в плоскости XOY создается эскиз, содержащий контур половины сечения колеса (такой же, какой мы выполняли при моделировании вручную в гл. 3). На основании этого эскиза выполняется операция вращения, формирующая заготовку зубчатого колеса.

2. Далее в плоскости YOZ строится второй эскиз с четырьмя окружностями, над которыми выполняется операция вырезания в два направления. Таким образом, мы получим отверстия в диске.

3. Следующим шагом является выполнение выреза между зубьями в венце колеса. Для построения выреза воспользуемся первым из способов, предложенных в гл. 3. Напомню, этот способ заключается в построении выреза с помощью операции Вырезать по сечениям. При этом в модели колеса строится ряд эскизов-сечений, плоскости которых удалены от боковой поверхности колеса на величину l = i · b / (nс – 1) (где b – ширина колеса, nс – количество сечений или эскизов, i – порядковый номер эскиза). Для нашей библиотеки достаточно будет трех эскизов: по два на торцевых плоскостях колеса и один посредине – на плоскости YOZ. Это значит, что библиотека должна будет построить две вспомогательные плоскости, удаленные в обе стороны от плоскости YOZ на половину ширины венца зубчатого колеса. В каждой из трех плоскостей (двух вспомогательных и ортогональной YOZ) будет создано изображение эскиза выреза между зубьями, повернутое относительно вертикальной оси на угол α = 2 · l · tg β / dк, где β – угол наклона линии зуба, dк – делительный диаметр зубчатого колеса (обоснование этой зависимости приведено в гл. 3). Для первой плоскости вместо l необходимо подставить 0, для второй (YOZ) – b/2, для третьей – b.

4. В завершении создается ось на пересечении плоскостей XOZ и XOY. Относительно этой оси формируется массив по концентрической сетке вырезов между зубьями колеса. Количество копий устанавливается равным количеству зубьев колеса.

Начнем с первого этапа реализации построения: расчета геометрических характеристик создаваемого колеса (листинг 6.12).

Листинг 6.12. Расчет параметров колеса

procedure TGearsForm.Button1Click(Sender: TObject);

var

// раздел объявления переменных

// все объекты приведенных интерфейсов используются при построении

doc3 : ksDocument3D;

iPart : ksPart;

PlaneXOY : ksEntity;

PlaneXOZ : ksEntity;

PlaneYOZ : ksEntity;

SketchEntity : ksEntity;

iSketchDef : ksSketchDefinition;

doc : ksDocument2D;

r : reference;

iBaseRotatedEntity : ksEntity;

Color : ksColorParam;

iBaseRotatedDef : ksBaseRotatedDefinition;

iSketch1Entity : ksEntity;

iSketch1Def : ksSketchDefinition;

iCutExtrusion : ksEntity;

iCutExtrusionDef : ksCutExtrusionDefinition;

iOffsetPlaneEntity : ksEntity;

iOffsetPlaneDef : ksPlaneOffsetDefinition;

iSketch2Entity : ksEntity;

iSketch2Def : ksSketchDefinition;

iSketch3Entity : ksEntity;

iSketch3Def : ksSketchDefinition;

iOffsetPlane1Entity : ksEntity;

iOffsetPlane1Def : ksPlaneOffsetDefinition;

iSketch4Entity : ksEntity;

iSketch4Def : ksSketchDefinition;

iCutLoftEntity : ksEntity;

iCutLoftDef : ksCutLoftDefinition;

Collect : ksEntityCollection;

iAxis : ksEntity;

iAxis2PlDef : ksAxis2PlanesDefinition;

iCircularCopy : ksEntity;

iCirCopyDef : ksCircularCopyDefinition;

Collect1 : ksEntityCollection;

// геометрические параметры колеса

module : double;

Lm, Dm : double;

Dv : double;

b_k, c : double;

d_k, d_fk, d_ak : double;

delta0 : double;

z : integer;

beta : double;

Dotv : double;

alfa1, alfa2 : double;

begin

Hide; // прячем диалоговое окно

// считываем параметры, введенные пользователем в окне

module := StrToFloat(Edit1.Text);

z := StrToInt(Edit2.Text);

Lm := StrToFloat(Edit3.Text);

beta := StrToFloat(Edit4.Text);

// диаметр отверстия под вал

Dv := round(Lm/1.4);

// ширину маточины и ширину колеса принимаем равными

b_k := Lm;

// диаметр маточины

Dm := 1.8*Dv;

// толщина диска, соединяющего маточину с ободом

c := round(0.35*b_k);

// толщина обода

delta0 := round(2.5*module/cos(DegToRad(beta)));

d_k := module*z; // делительный диаметр колеса

d_ak := d_k+2*module; // диаметр выступов

d_fk := d_k-2.5*module; // диаметр впадин

// диаметр размещения центров отверстий в диске

Dotv := (d_fk – 2*delta0 + Dm)/2;

// создание детали...

// построение модели...

Close; // закрываем форму

end;

Если сейчас собрать приложение и попробовать запустить библиотеку, ничего происходить не будет, потому что пока ничего не создается и не строится.

Следующий этап построения намного более интересен – он заключается в программном создании документа КОМПАС-Деталь (листинг 6.13). В данном листинге раздел описания переменных и расчет параметров колеса пропущен, а приведен только фрагмент кода, реализующий создание документа-детали. В процедуру построения (обработчик нажатия кнопки Построение) этот фрагмент должен быть вставлен сразу после расчетов.

Листинг 6.13. Создание документа детали

// получаем указатель на интерфейс трехмерного документа

doc3 := ksDocument3D(ks.Document3D());

// создаем документ

// параметр false – в видимом режиме

// параметр true – документ-деталь

if doc3.Create(false, true) then

begin

// заполняем параметры документа

doc3.author := “Максим Кидрук”;

doc3.comment := “Зубчатое колесо”;

doc3.drawMode := 3;

doc3.perspective := true;

doc3.UpdateDocumentParam();

end else exit;

// проверяем, как прошла инициализация

if (doc3 = nil) then

begin

ks.ksMessage(“Не удалось создать документ!”);

exit;

end;

Откомпилировав и запустив приложение, вы сможете наблюдать, как после закрытия диалогового окна (нажатия кнопки Построение) программа сама создаст пустой документ КОМПАС-Деталь.