Главная » Delphi, OLE, САПР » Заштриховывание двух и более непересекающихся областей – КОМПАС в DELPHI

0

Постановка задачи

Очень часто на разрезах встречаются сквозные отверстия. Из-за них вся заштриховываемая область разбивается на две или более непересекающихся друг с другом области. Причем все эти области должны быть заштрихованы однообразно. На рисунке ниже представлено две однообразно заштрихованные непересекающиеся прямоугольные области.

Как их заштриховать? Можно конечно заштриховать их по отдельности с одинаковыми параметрами штриховки. Да, внешне это будет выглядеть как одна штриховка, но на самом деле их будет две. Нам же нужна одна штриховка.

Решение задачи первым способом

Рассмотрим, как решается эта задача при построении штриховки первым способом (см. главу 31). Ниже приводится фрагмент исходного текста программы решающей эту задачу.

var

kompas: KompasObject; Document2D: ksDocument2D;

RectangleParam1, RectangleParam2: ksRectangleParam;

…………………………………………………

Begin

…………………………………………………

//Строим первый прямоугольник, который будем заштриховывать

RectangleParam1:=ksRectangleParam(kompas.GetParamStruct(ko_RectangleParam)); RectangleParam1.x:=100;

RectangleParam1.y:=100; RectangleParam1.ang:=0; RectangleParam1.height:=10; RectangleParam1.width:=10; RectangleParam1.style:=1; Document2D.ksRectangle(RectangleParam1, 0);

//Строим второй прямоугольник, который будем закрашивать

RectangleParam2:=ksRectangleParam(kompas.GetParamStruct(ko_RectangleParam));

RectangleParam2.x:=120; RectangleParam2.y:=100; RectangleParam2.ang:=0; RectangleParam2.height:=10; RectangleParam2.width:=10; RectangleParam2.style:=1; Document2D.ksRectangle(RectangleParam2, 0);

//Строим саму штриховку

Document2D.ksHatch(15, 45, 1, 0, 101, 101);

Document2D.ksRectangle(RectangleParam1, 0);

Document2D.ksRectangle(RectangleParam2, 0); Document2D.ksEndObj(); kompas.Visible:=true;

end;

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

Обратите внимание, что мы дважды получаем интерфейс параметров прямоугольника ksRectangleParam. Построить прямоугольники можно было и с одним интерфейсом ksRectangleParam, изменяя значения его свойств для каждого прямоугольника. Прямоугольники при этом будут правильно построены, но вот штриховка будет построена неправильно. Поэтому мы вынуждены использовать два интерфейса ksRectangleParam.

Добавление объекта к группе объектов

Прежде чем рассмотреть решение поставленной задачи вторым способом нужно сначала вспомнить теорию. В главе 32 я говорил, что интерфейс параметров штриховки ksHatchParam требует указания идентификатора группы геометрических объектов, образующих заштриховываемую область.

Там же я говорил, что получить этот идентификатор можно с помощью

метода ksMakeEncloseContours интерфейса ksDocument2D. Проблема в том, что данный метод позволяет получить идентификатор только одного замкнутого контура. А в нашей задаче два контура. Поэтому нам необходимо объединить эти два контура в один. Делается это с помощью метода ksAddObjGroup интерфейса ksDocument2D. Вот прототип этого метода:

ksAddObjGroup(

g: Integer; //Идентификатор группы объектов (контура)

p: Integer //Идентификатор объекта добавляемого в группу

): Integer;

Данный метод служит для добавления геометрического объекта к группе объектов. В случае успешного выполнения данный метод возвращает значение 1, а в случае ошибки – значение нуль.

Хотя в документации КОМПАС это нигде явно не указано, но в роли добавляемого объекта может быть использована группа объектов. В этом случае метод ksAddObjGroup присоединяет группу объектов p к группе объектов g.

Решение задачи вторым способом

Ниже      приводится      фрагмент      исходного      кода      программы, демонстрирующей решение задачи вторым способом.

var

kompas: KompasObject; Document2D: ksDocument2D;

RectangleParam: ksRectangleParam; HatchParam: ksHatchParam;

GroupID: integer; RectID: integer;

………………………

Begin

………………………

//Строим первый прямоугольник, который будем заштриховывать

RectangleParam:=ksRectangleParam(kompas.GetParamStruct(ko_RectangleParam)); RectangleParam.x:=100;

RectangleParam.y:=100; RectangleParam.ang:=0;

RectangleParam.height:=10; RectangleParam.width:=10; RectangleParam.style:=1; Document2D.ksRectangle(RectangleParam, 0);

//Получаем идентификатор контура, состоящего из первого прямоугольника

GroupID:=Document2D.ksMakeEncloseContours(0,101,101);

//Строим второй прямоугольник, который будем заштриховывать RectangleParam.x:=120; RectID:=Document2D.ksRectangle(RectangleParam, 0);

//Добавляем второй прямоугольник к контуру первого прямоугольника

Document2D.ksAddObjGroup(GroupID, RectID);

//Получаем интерфейс параметров штриховки HatchParam:=ksHatchParam(kompas.GetParamStruct(ko_HatchParam)); HatchParam.ang := 45;

HatchParam.boundaries := GroupID;

HatchParam.color := $000000; //цвет линий – черный

HatchParam.sheeting:= 0; HatchParam.step:=1; HatchParam.style:=0; //металл HatchParam.width:=0;

HatchParam.x:=101; HatchParam.y:=101;

//Строим саму штриховку Document2D.ksHatchByParam(HatchParam); kompas.Visible:=true;

end;

Обратите внимание, что здесь мы используем всего один интерфейс параметров прямоугольника ksRectangleParam.

Если у нас несколько сложных контуров, то заштриховать их следует

так:

1)                             с помощью метода ksMakeEncloseContours (см. главу 32) получить идентификатор каждого контура;

2)                             с помощью метода ksAddObjGroup объединить эти контуры в один контур;

3)                             заштриховать полученный контур;

Источник: Норсеев Сергей, «РАЗРАБОТКА ПРИЛОЖЕНИЙ ПОД КОМПАС В DELPHI»

По теме:

  • Комментарии