Главная » Delphi, OLE, САПР » Построение прямой касательной к двум окружностям Постановка задачи – КОМПАС в DELPHI

0

Предположим, что вам нужно построить фрагмент чертежа вида:

Данный фрагмент состоит из одного отрезка и двух дуг окружностей разного радиуса. Основная сложность построения такого чертежа состоит в определении точек касания между отрезком и дугами. Можно конечно вычислить их самому, вспомнив школьный курс геометрии. А можно поступить умнее: возложить все расчеты на систему КОМПАС, по аналогии с тем как мы строили дугу окружности касательную двум прямым в предыдущей главе. Как это сделать?

Интерфейс ksTAN

Для описания точек касания используется интерфейс ksTAN. Получить этот интерфейс можно с помощью метода GetParamStruct интерфейса KompasObject. Для этого последнему в качестве параметра нужно передать константу ko_tan.

Согласно документации КОМПАС у данного интерфейса нет свойств, но есть 4 метода. Но на самом деле это не так. Дело в том, что у данного

интерфейса нет методов, но есть 4 свойства. Давайте по порядку.

Интерфейс ksTAN содержит информацию о двух точках касания прямой с двумя окружностями. Данная информация заключается в координатах соответствующих точек касания. Отсюда и возникают 4 метода1 или свойства (по две координаты на каждую точку). Весь вопрос в том, как получить значения этих координат.

1 К сожалению, интерфейс ksTAN не содержит метода GetCount (или какого-либо его аналога), в отличие от интерфейса ksCON.

Согласно документации для этого используется 4 метода GetX1, GetY1, GetX2 и GetY2, которые в качестве единственного параметра принимают индекс найденной точки касания.

Но   на   самом   деле   для   обращения   к   полученным   решениям

используются свойства X1, Y1, X2 и Y2, каждый из которых представляет собой массив значений соответствующей координаты соответствующей точки. Индекс элемента массива соответствует индексу найденной точки касания. То есть, для того, чтобы получить координату X первой точки касания первого найденного решения нужно обратиться так: X1[0]. Нумерация найденных решений осуществляется с нуля.

На рисунке ниже представлен ряд возможных решений для построения прямой касательной к двум окружностям (сами окружности выделены штриховой линией):

Как получить координаты точек касания

Для получения координат точек касания используется интерфейс ksMathematic2D. Для получения данного интерфейса используется метод GetMathematic2D интерфейса KompasObject. Среди всех методов интерфейса ksMathematic2D наибольший интерес для нас представляет метод KsTanCircleCircle. Именно этот метод отвечает за получение координат точек касания между прямой и двумя окружностями. Вот прототип этого метода:

ksTanCircleCircle(

xc1: Double; yc1: Double; //Координаты центра первой окружности

radius1: Double;         //Радиус первой окружности

xc2: Double; yc2: Double; //Координаты центра второй окружности

radius2: Double;         //Радиус второй окружности

const param: IDispatch   //Интерфейс ksTAN

): WordBool;

В случае успеха (точки касания найдены) данная функция возвращает значение true, а в случае ошибки – false.

При этом в случае успеха в интерфейс KsTAN, который передается в виде параметра param, будут записаны координаты найденных точек касания.

Решение задачи

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

var

kompas: KompasObject; Document2D: ksDocument2D; Mathematic2D: ksMathematic2D; TAN: ksTAN;

………

Begin

………

//Получаем необходимые нам интерфейсы

Mathematic2D:=ksMathematic2D(kompas.GetMathematic2D());

TAN := ksTAN(kompas.GetParamStruct(ko_tan));

//Рассчитываем координаты точек касания

Mathematic2D.ksTanCircleCircle(100, 100, 10,

150, 150, 20, TAN);

//Строим отрезок между двумя рассчитанными точками касания

Document2D.ksLineSeg(TAN.x1[2],TAN.y1[2],TAN.x2[2], TAN.y2[2], 1);

//Строим дуги окружностей

Document2D.ksArcByPoint(100, 100, 10, TAN.x1[2], TAN.y1[2], 90, 100, -1, 1);

Document2D.ksArcByPoint(150, 150, 20, TAN.x2[2], TAN.y2[2], 170, 150, -1, 1);

………

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

По теме:

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