КОМПАС-3D V10 на 100%. Максим Иванович Кидрук компас3d v10 на 100 %
Скачать 13.81 Mb.
|
Совет Любая создаваемая вами на Delphi библиотека будет иметь три указанные функции. Вы можете сохранить проект на данном этапе в какую-либо другую папку и в дальнейшем при разработках новых библиотек использовать его как заготовку. Теперь нужно сделать так, чтобы библиотека стала рабочей. Сначала необходимо в раздел uses добавить еще один подключаемый модуль – ksAuto, а сам файл этого модуля (ksAuto.pas) перенести в каталог FirstLib\dcu. Файл ksAuto.pas вместе с другими файлами библиотек API системы КОМПАС находится в каталоге SDK\Include папки, в которой установлена текущая версия КОМПАС-3D. Внутри ksAuto.pas есть многочисленные ссылки на другие файлы с определением классов КОМПАС API. Явно подключать их в разделе uses не нужно, но следует перенести в один каталог с файлом ksAuto.pas. Для данного проекта достаточно всего четыре файла (для более сложных понадобятся, конечно, и другие): ks2DCOM- TLB.pas, LDefin2D.pas, LibTool.pas и LtDefine.pas. Просто скопируйте эти файлы из SDK\Include в папку FirstLib\dcu вашего проекта. В файле проекта объявите глобальную переменную kompas типа KompasObject, а в процедуру входа в библиотеку добавьте следующий код (листинг 6.9). Листинг 6.9. Вывод текстового сообщения uses SysUtils, Classes, ksTLB, ksAuto; {$E rtw} {$R *.res} // глобальная переменная приложения КОМПАС API var kompas : KompasObject; // код пропущен procedure LibraryEntry(command: WORD); pascal; begin // инициализация объекта KompasObject // с помощью функции CreateKompasObject kompas := KompasObject(CreateKompasObject); // если все прошло успешно if (kompas = nil) then exit; // выводим первое сообщение kompas.ksMessage(“Привет из КОМПАСа!”); // обнуляем переменную kompas kompas := nil; end; Сохраните и скомпилируйте проект, после чего запустите библиотеку и выполните ее единственную команду. В результате библиотека выдаст первое приветственное сообщение (рис. 6.23). Рис. 6.23. Сообщение, посланное библиотекой Внимание! При компиляции проекта прикладная библиотека должна быть обязательно отключена в менеджере библиотек, иначе компилятор сообщит об ошибке. Исходные файлы этой простейшей библиотеки, а также сам исполняемый файл приложения Hello_KOMPAS.rtw находятся на прилагаемом к книге компакт-диске в папке Examples\Глава 6\Delphi Programming\FirstLib. При попытке компиляции исходных файлов на своем компьютере вы должны учитывать, что куда бы ни были скопированы исходники с диска, пути к файлам библиотек КОМПАС, указанные в настройках проекта, будут отличаться. По этой причине перед компиляцией обязательно отредактируйте эти пути (см. рис. 6.22) и лишь после этого выполняйте сборку библиотеки. Разработка мини-САПР зубчатых колес Для лучшего усвоения прочитанного материала разработаем мини-САПР, создающую по минимальному количеству исходных данных 3D-модель зубчатого колеса (как прямозубого, так и косозубого). В общих чертах задача такова: после вызова библиотеки пользователем появляется диалоговое окно, в котором он задает модуль, количество зубьев, ширину зубчатого венца, а также угол наклона зубьев колеса. По введенным параметрам, после нажатия кнопки Построение, библиотека должна сгенерировать трехмерную модель колеса. Выполните заготовку конструкторской библиотеки, как это было описано в предыдущем разделе. Чтобы немного облегчить себе задачу, вы можете воспользоваться готовым шаблоном, для чего скопируйте все исходные файлы предыдущего примера в новую директорию (назовем ее Gears3D) и сохраните проект под новым именем (Gears3D.dpr). Обязательно отредактируйте пути к файлам библиотек КОМПАС (то есть к папке Gears3D\dcu) в настройках проекта. Измените название библиотеки на Gears miniCAD и оставьте старый идентификатор библиотеки. Скопируйте из папки SDK\Include в каталог Gears3D\dcu еще один файл с описаниями констант, использующимися при инициализации различных интерфейсов, – ksConstTLB.pas. Затем можно, наконец, приступать к выполнению проекта. Поскольку взаимодействие с пользователем планируется осуществлять с помощью диалогового окна, в проект необходимо добавить диалоговую форму. Для этого выполните команду File → New → Form, после чего в инспекторе объектов настройте часть свойств формы (табл. 6.8), оставив остальные заданными по умолчанию. Таблица 6.8. Настройка свойств формы диалогового окна библиотеки После создания формы Delphi автоматически сгенерировал модуль (unit) с кодом ее описания. Удалите из этого модуля описание глобальной переменной GearsForm типа TGearsForm и сохраните модуль под именем BuildUnit.pas. Добавьте на форму по четыре текстовых метки (TLabel) и поля ввода (TEdit), а также две кнопки (TButton). Присвойте им заголовки Построение и Отмена. Разместите указанные элементы управления приблизительно так, как показано на рис. 6.24. Рис. 6.24. Форма будущего диалогового окна библиотеки После создания формы необходимо обеспечить ее вывод в окне КОМПАС. Задача, на первый взгляд, сложная, но решается просто. Для вывода диалогового окна библиотеки нужно сделать следующее. 1. Получить дескриптор главного окна КОМПАС. 2. Запретить доступ пользователю к главному окну программы. 3. Создать объект диалогового окна и вывести его на экран в модальном режиме. 4. После закрытия пользователем окна библиотеки уничтожить окно и вернуть управление главным окном КОМПАС пользователю. 5. Обнулить дескриптор приложения. Реализовать эту последовательность действий лучше всего в процедуре точки входа в библиотеку (листинг 6.10). Листинг 6.10. Вывод диалогового окна библиотеки 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; Откомпилировав и запустив приложение, вы сможете наблюдать, как после закрытия диалогового окна (нажатия кнопки Построение) программа сама создаст пустой документ КОМПАС-Деталь. В листинге 6.14 приведен с небольшими сокращениями код построения трехмерной модели. Недостающие фрагменты кода вы можете взять из файла Examples\Глава 6\Delphi Programming\Gears3D\BuildUnit.pas на диске. Фрагмент кода содержит достаточно подробные комментарии, поэтому, полагаю, разобраться в нем будет несложно. Листинг 6.14. Построение модели колеса // получаем указатель на интерфейс детали iPart := ksPart(doc3.GetPart(pNew_Part)); if (iPart <> nil) then begin // интерфейсы ортогональных плоскостей PlaneXOY := ksEntity(iPart.GetDefaultEntity(o3d_planeXOY)); PlaneXOZ := ksEntity(iPart.GetDefaultEntity(o3d_planeXOZ)); PlaneYOZ := ksEntity(iPart.GetDefaultEntity(o3d_planeYOZ)); // интерфейс эскиза (половина контура сечения колеса) iSketchEntity := ksEntity(iPart.NewEntity(o3d_sketch)); if (iSketchEntity <> nil) then begin // интерфейс параметров эскиза iSketchDef := ksSketchDefinition(iSketchEntity.GetDefinition); if (iSketchDef <> nil) then begin if (PlaneXOY <> nil) then begin // устанавливаем плоскость, // на которой создается эскиз iSketchDef.SetPlane(PlaneXOY); iSketchEntity.Create; // запускаем процесс редактирования эскиза // doc – указатель на интерфейс ksDocument2D doc := ksDocument2D(iSketchDef.BeginEdit); if (doc <> nil) then begin // вычерчиваем изображение эскиза // с помощью методов интерфейса ksDocument2D // код пропущен end; // завершение редактирования эскиза iSketchDef.EndEdit; end; end; end; // интерфейс базовой операции вращения iBaseRotatedEntity := ksEntity(iPart.NewEntity(o3d_baseRotated)); // интерфейс параметров цвета и визуальных свойств Color := ksColorParam(iBaseRotatedEntity.ColorParam); Color.specularity := 0.8; Color.shininess := 1; if (iBaseRotatedEntity <> nil) then begin // интерфейс параметров вращения iBaseRotatedDef := ksBaseRotatedDefinition(iBaseRotatedEntity.GetDefinition); if (iBaseRotatedDef <> nil) then begin // настройка параметров вращения iBaseRotatedDef.SetThinParam(false, dtNormal, 1, 1); iBaseRotatedDef.SetSideParam(true, 360); iBaseRotatedDef.toroidShapeType := false; iBaseRotatedDef.SetSketch(iSketchEntity); // создаем операцию вращения // результат – заготовка зубчатого колеса iBaseRotatedEntity.Create; end; end; // интерфейс эскиза (отверстия в диске) iSketch1Entity := ksEntity(iPart.NewEntity( o3d_sketch )); if (iSketch1Entity <> nil) then begin iSketch1Def := ksSketchDefinition(iSketch1Entity.GetDefinition); if (iSketch1Def <> nil) then begin if (PlaneYOZ <> nil) then begin // размещаем эскиз на плоскости YOZ iSketch1Def.SetPlane(PlaneYOZ); iSketch1Entity.Create; doc := ksDocument2D(iSketch1Def.BeginEdit); if (doc <> nil) then begin // изображение в эскизе – 4 окружности // создаются вызовом метода ksDocument2D::ksCircle doc.ksCircle(0, Dotv/2, 0.4*(d_fk/2-delta0-Dm/2), 1); doc.ksCircle(0, -Dotv/2, 0.4*(d_fk/2-delta0-Dm/2), 1); doc.ksCircle(Dotv/2, 0, 0.4*(d_fk/2-delta0-Dm/2), 1); doc.ksCircle(-Dotv/2, 0, 0.4*(d_fk/2-delta0-Dm/2), 1); end; iSketch1Def.EndEdit; end; end; end; // интерфейс операции Вырезать выдавливанием iCutExtrusion := ksEntity(iPart.NewEntity(o3d_cutExtrusion)); if (iCutExtrusion <> nil) then begin // интерфейс параметров вырезания iCutExtrusionDef := ksCutExtrusionDefinition(iCutExtrusion.GetDefinition); if (iCutExtrusionDef <> nil) then begin // настройка параметров iCutExtrusionDef.SetSketch(iSketch1Entity); // направление iCutExtrusionDef.directionType := dtBoth; // величина вырезания по каждому из направлений iCutExtrusionDef.SetSideParam(true, etBlind, c/2, 0, false); iCutExtrusionDef.SetSideParam(false, etBlind, c/2, 0, false); iCutExtrusionDef.SetThinParam(false, 0, 0, 0); // создаем отверстия в диске iCutExtrusion.Create; end; end; // интерфейс смещенной плоскости iOffsetPlaneEntity := ksEntity(iPart.NewEntity(o3d_planeOffset)); if (iOffsetPlaneEntity <> nil) then begin // интерфейс параметров смещенной плоскости iOffsetPlaneDef := ksPlaneOffsetDefinition(iOffsetPlaneEntity.GetDefinition); if (iOffsetPlaneDef <> nil) then begin // величина, базовая плоскость и другие параметры смещения iOffsetPlaneDef.Offset := b_k/2; iOffsetPlaneDef.SetPlane(PlaneYOZ); iOffsetPlaneDef.direction := false; |