Работа с API КОМПАС-3D → Урок 6 → Построение дуги окружности
Продолжаем цикл статей по работе с API САПР КОМПАС-3D Сергея Норсеева, инженера-программиста АО «ВНИИ «Сигнал», автора книги «Разработка приложений под КОМПАС в Delphi». В качестве среды используется C++ Builder. В предыдущих уроках по API КОМПАС Основы и Оформление чертежа мы исходили из того, что КОМПАС не запущен, в уроке Корректное подключение к КОМПАС мы проверяли наличие уже запущенного КОМПАСа и подключались к нему. В уроке Основная надпись разбирали, как заполнить основную надпись чертежа. В прошлом уроке Графические примитивы мы начали чертить первые геометрические фигуры. В данной статье рассматриваются различные способы построения дуги окружности. В КОМПАС ее можно построить тремя различными способами. Мы рассмотрим их все.
Постановка задачи
Вначале определимся с тем, что будем строить. Для примера предлагаю взять полуокружность радиуса 10 мм с центром в точке с координатами (100, 100). Данная дуга показана на рисунке ниже.
(Картинка кликабельна).
A, B и C – вспомогательные точки, которые пригодятся нам при описании различных способов построения дуги.
По трем точкам
Первый способ основывается на том, что вам известны координаты точек A, B и C, но неизвестны координаты центра. Для построения дуги по трем точкам используется метод ksArcBy3Points интерфейса ksDocument2D. Ниже приводится его прототип.
Стили линии обсуждались в предыдущей статье цикла. В случае успеха метод возвращает указатель на построенную дугу, а в случае ошибки – значение ноль.
Для построения нашей дуги нужно определиться с координатами точек. Так, точка A имеет координаты (90, 100), точка B (100, 110), точка C (110, 100). При таких исходных данных вызов метода ksArcBy3Points должен производиться так, как показано ниже.
О том, как получить указатель на интерфейс ksDocument2D, рассказывалось в предыдущих статьях цикла.
По центру и углам
Данный способ основан на том, что вам известны координаты центра дуги и углы ее концов. Для построения дуги по этой информации используется метод ksArcByAngle интерфейса ksDocument2D. Ниже приводится прототип этого метода.
С параметрами xc, yc, rad и style, думаю, всё ясно. С ними вопросов возникнуть не должно.
Параметры f1 и f2 задают углы (в градусах) между прямыми, проходящими через центр дуги и ее конечные точки, и горизонтальной прямой. Данные углы показаны на рисунке ниже.
Теперь по поводу параметра direction. Он задает направление, в котором следует отрисовывать дугу. Если он равен 1, то дуга строится против часовой стрелки, если же он равен -1, то дуга строится по часовой стрелке. Например, дуга, изображенная на рисунке выше, отрисована против часовой стрелки, а на рисунке ниже представлена дуга, построенная с теми же параметрами, но по часовой стрелке.
В случае успеха метод ksArcByAngle возвращает указатель на построенную дугу, а в случае ошибки — значение ноль.
Вернемся к нашей задаче построения дуги. Для ее отрисовки против часовой стрелки углы должны быть заданы следующим образом: f1 = 0, f2 = 180. Для отрисовки этой же дуги по часовой стрелке значения углов нужно поменять местами (f1 = 180, f2 = 0). Код построения дуги приведен ниже.
По центру и конечным точкам
Данный способ основан на том, что вам известны координаты центра дуги и координаты конечных точек дуги. Для построения дуги по этой информации используется метод ksArcByPoint интерфейса ksDocument2D. Ниже приводится прототип этого метода.
Данный метод очень похож на рассмотренный ранее метод ksArcByAngle. Разница состоит лишь в том, что конечные точки задаются не углами, а координатами.
В случае успеха метод ksArcByPoint возвращает указатель на дугу, а в случае ошибки — ноль.
Ниже приводится код вызова этого метода для построения нашей дуги.
Внимательный читатель наверняка заметил, что параметры метода ksArcByPoint являются избыточными. Почему? Неужели ошибка создателей API? На самом деле нет. Просто нужно правильно понимать назначение точек (x1, y1) и (x2, y2). Согласно документации КОМПАС:
x1, y1 – координаты начальной точки дуги, x2, y2 – координаты конечной точки дуги.
Такое неправильное описание и создает путаницу. На самом деле точки (x1, y1) и (x2, y2) могут не принадлежать дуге. Они задают не положение конечных точек, а ориентацию вектора, на котором они находятся. Причем начало этого вектора находится в центре дуги. Рисунок ниже поясняет это более наглядно.
Исходя из этого, рассматриваемую нами дугу можно построить с помощью кода, приведенного ниже.
Обратите внимание: конечные точки не совпадают с точками A и C, но дуга все равно строится правильно.
Заключение В данной статье мы рассмотрели различные способы построения дуги окружности. Каким из них пользоваться, решайте сами. Но я думаю, что ваше решение будет определяться той информацией о дуге, которая у вас есть в данный момент времени.