ObjectARX, AutoCAD. Среда программирования библиотеки C++

       

Калибровка Таблетки


Пользователи AutoCAD с таблеткой отцифровывания могут калибровать таблетку,  используя команду TABLET. С acedTablet () функция, приложения может управлять калибровками,  устанавливая их непосредственно и сохраняя назначения калибровки для будущего использования. Функция берет два параметра, список и результат, каждый из которых - список буфера результата. Первый буфер результатов в первом списке - целочисленный код, который должен быть 0, чтобы отыскать текущую калибровку (в результате), или 1, чтобы установить калибровку согласно остающимся буферам в списке. Калибровки выражены как четыре трехмерных точки (в дополнение к коду). Первые три из них - направляющие — row1, row2, и row3 —  три строки матрицы преобразования таблетки. Четвертая точка - вектор, направление, которое является нормальным на план поверхности таблетки (выраженное в WCS).

ОБРАТИТЕ ВНИМАНИЕ На TABMODE средство управления переменной системы, установлен ли режим Tablet в На (1) или От (0). Вы можете управлять это,  используя acedSetVar().

Следующая последовательность кода отыскивает текущую калибровку таблетки, и сохраняет это в calibr2. В этом примере, пользователь использовал команду TABLET, чтобы калибровать матрицу, и режим Tablet включен.

struct resbuf *calibr1, *calibr2;

struct resbuf varbuf, rb;

// Retrieve the current calibration.

calibr1 = acutBuildList(RTSHORT, 0, RTNONE);

if (acedTablet(calibr1, &calibr2) != RTNORM) {

acdbFail("Calibration not obtainable\n");

return BAD;

}

Код, возвращенный в параметре результата, calibr2 в примере, автоматически установлен в 1. Чтобы сбрасывать калибровку к значениям, отысканным предшествующим примером, Вы могли использовать следующий код:

if (acedTablet(calibr2, &calibr1) != RTNORM) {



acdbFail("Couldn’t reset calibration\n");

return BAD;

}

rb.restype = RTSHORT;

rb.resval.rint = 1;

acedSetVar("TABMODE", &rb);

acedGetVar("TABMODE" &varbuf);

if (varbuf.resval.rint == 0) {


acdbFail("Couldn’t set TABMODE\n");

return BAD;

}

В этом примере, calibr1 теперь содержит результат калибровки. Поскольку это возможно идентично calibr2 (который был инициализирован acedTablet ()), Вы не обязательно нуждаетесь в этом результате. Когда Вы устанавливаете калибровку, Вы можете определить результат NULL, который заставляет acedTablet () устанавливать калибровку “ тихо. ”

if (acedTablet(calibr2, NULL) != RTNORM) { . . . }

Матрица преобразования прошла, поскольку row1, row2, и row3 - 3x3, матрица преобразования хотела преобразовать 2-ую точку. 2-ая точка выражена как вектор столбца в гомогенных координатах (добавляя 1.0 как третий элемент), так что преобразование напоминает это:

X'

M 00 M 01 M 02

X'

Y'

=

M 10 M 11 M 12

x

Y'

D'

M 20 M 21   1.0

1.0

Вычисление точки подобно трехмерному случаю. AutoCAD преобразовывает точку,  используя следующие формулы:

X' = M 00 X + M 01 Y + M 02

Y' = M 10 X + M 11 Y + M 12

D' = M 20 X + M 21 Y + 1.0

Чтобы поворачивать заканчивающийся вектор назад в 2-ую точку, первые два компонента разделены третью, коэффициентом масштаба, выдавая точку D ' (X '/D ', Y '/D ').

Для проективного преобразования, которое является,  большинство общего случая, acedTablet () делает полное вычисление. Но для афинных и ортогональных преобразований, и - оба 0, удет быть 1.0 - также.

Вычисление опущено; заканчивающаяся 2-ая точка - просто.

Афинное преобразование - специальный, однородный случай проективного преобразования. Ортогональное преобразование - специальный случай афинного преобразования: не только являются и 0, но и  и.

М. 20 М. 21 D '

( X ', Y ')

М. 20 М. 21 М. 00 = М. 11

М. 10 = - М. 01

ОБРАТИТЕ ВНИМАНИЕ, когда Вы устанавливаете калибровку, результат не равняется параметру списка, если направление в списке не было нормализовано; AutoCAD нормализует вектор направления прежде, чем это возвращает это. Также, это гарантирует, что третий элемент в третьем столбце (row3 [Z]) равен 1. Эта ситуация не должна возникнуть, если Вы устанавливаете калибровку, используя значения, отысканные из AutoCAD посредством acedTablet (). Однако, это может случаться, если ваша программа вычисляет преобразование непосредственно.


Содержание раздела