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;
// делаем плоскость скрытой
iOffsetPlaneEntity.Hidden := true;
// создаем вспомогательную плоскость
iOffsetPlaneEntity.Create;
end;
end;
// эскиз первого выреза между зубьями
iSketch2Entity := ksEntity(iPart.NewEntity(o3d_sketch));
if (iSketch2Entity <> nil) then
begin
iSketch2Def := ksSketchDefinition(iSketch2Entity.GetDefinition);
if (iSketch2Def <> nil) then
begin
// базовая плоскость – вспомогательная iOffsetPlaneEntity
iSketch2Def.SetPlane(iOffsetPlaneEntity);
iSketch2Entity.Create;
doc := ksDocument2D(iSketch2Def.BeginEdit);
alfa1 := 360/z;
doc.ksMtr(0, 0, 90, 1, 1);
// вычерчивание изображения эскиза
// вместо эвольвент для простоты
// берем обычные дуги по трем точкам
// код пропущен
doc.ksDeleteMtr;
iSketch2Def.EndEdit;
end;
end;
// интерфейс второго эскиза выреза между зубьями
iSketch3Entity := ksEntity(iPart.NewEntity(o3d_sketch));
if (iSketch3Entity <> nil) then
begin
iSketch3Def := ksSketchDefinition(iSketch3Entity.GetDefinition);
if (iSketch3Def <> nil) then
Читать дальше
Конец ознакомительного отрывка
Купить книгу