AcedOsnap () библиотечная функция берет точку как параметр, и возвращает точку в результате. Это объявлено следующим образом:

int acedOsnap(pt, mode, result)

ads_point pt;

char *mode;

ads_point result;

AcedOsnap () функция ведет себя подобно AutoLISP osnap функция. Требуется точка (запятая) и некоторые режимы объектной привязки (указанный в строковом режиме), и возвращает самую близкую точку (в результате). Значение int, что acedOsnap () возвращения - код состояния, который указывает успех (RTNORM) или отказ{*неудачу*}.

Следующий кодовый фрагмент вызывает acedOsnap ():

int findendpoint(ads_point oldpt, ads_point newpt)

{

ads_point ptres;

int foundpt;

foundpt = acedOsnap(oldpt, "end", ptres);

if (foundpt == RTNORM) {

ads_point_set(ptres, newpt);

}

return foundpt;

}

Поскольку точки - массивы, oldpt и ptres автоматически проходят к acedOsnap () ссылкой (то есть как указатели на первый элемент каждого массива) скорее чем значением. AcedOsnap () функция возвращает ее результат (в противоположность ее состоянию) устанавливая значение newpt параметра.

ObjectARX определяет указатель на точку, когда указатель необходим вместо типа массива.

typedef ads_real *ads_pointp;

Матрицы Преобразования

Функции acedDragGen (), acedGrVecs (), acedNEntSelP (), и acedXformSS () умножают входные векторы на матрицу преобразования, определенную как 4x4 массив реальных значений.

typedef ads_real ads_matrix [4] [4];

Первые три столбца матрицы определяют масштабирование и вращение. Четвертый столбец матрицы - вектор сдвига. ObjectARX определяет символ T, чтобы представить координату этого вектора, следующим образом:

НЕ нашли? Не то? Что вы ищете?

#define T 3

Матрица может быть выражена следующим образом:

М. 00

М. 01

М. 02

М. 03

М. 10

М. 11

М. 12

М. 13

М. 20

М. 21

М. 22

М. 23

0.0

0.0

0.0

1.0

Следующая функция инициализирует единичную матрицу.

void ident_init(ads_matrix id)

{

int i, j;

for (i=0; i<=3; i++)

for (j=0; j<=3; j++)

id[i][j] = 0.0;

for (i=0; i<=3; i++)

id[i][i] = 1.0;

}

Функции, которые передают параметры типа ads_matrix, обращаются с точкой как вектор столбца измерения 4. Точка выражена в гомогенных координатах, где четвертый элемент вектора точки - коэффициент масштаба, который обычно устанавливается в 1.0. Конечная{*заключительная*} строка матрицы имеет номинальное значение [0,0,0,1]; это игнорируется функциями тот проход ads_matrix параметры. В этом случае, следующие матричные результаты умножения от приложения преобразования к точке:

X '

М.00

М.01

М.02

М.03

X

Y '

=

М.10

М.11

М.12

М.13

x

Y

Z '

М.20

М.21

М.22

М.23

Z

1.0

0.0

0.0

0.0

1.0

1.0

Это умножение дает нам индивидуальные координаты точки следующим образом:

X ' = М. 00 X + М. 01 Y + М. 02 Z + М. 03 (1.0)

Y ' = М. 10 X + М. 11 Y + М. 12 Z + М. 13 (1.0)

Z ' = М. 20 X + М. 21 Y + М. 22 Z + М. 23 (1.0)

Как этот показ уравнений, коэффициент масштаба и последняя строка матрицы не имеет никакой эффект и игнорируется. Это известно как афинное преобразование.

ПРИМЕЧАНИЕ, чтобы преобразовать вектор скорее чем точка, не добавьте в векторе сдвига М3 М13 М23 (от четвертого столбца матрицы преобразования).

Следующая функция осуществляет предыдущие уравнения, чтобы преобразовать единственную точку:

void xformpt(xform, pt, newpt)

ads_matrix xform;

ads_point pt, newpt;

{

int i, j;

newpt[X] = newpt[Y] = newpt[Z] = 0.0;

for (i=X; i<=Z; i++) {

for (j=X; j<=Z; j++)

newpt[i] += xform[i][j] * pt[j];

// Add the translation vector.

newpt[i] += xform[i][T];

}

}

Следующее рисунок суммирует некоторые основные геометрические преобразования.

( Значения в ads_matrix - фактически ads_real, но им показывают здесь как целые числа для удобочитаемости и соответствовать математическому соглашению.)

1

0

0

0

1

0

0

TX

SX

0

0

0

cos

-sin

0

0

0

1

0

0

0

1

0

TY

0

SY

0

0

sin

cos

0

0

0

0

1

0

0

0

1

TZ

0

0

SZ

0

0

0

1

0

0

0

0

1

0

0

0

1

0

0

0

1

0

0

0

1

Translation scaling 2D rotation (in the XY plane)

AcedXformSS () функция — в отличие от acedDragGen(), acedGrVecs(), или acedNEntSelP() функции — требует, чтобы матрица делала однородное масштабирование. То есть в матрице преобразования, которую Вы проходите к acedXformSS (), элементы в векторе масштабирования S X S Y S Z, должны весь быть равными; в матричном примечании, М. 00 = М. 11 = М. 22. Трехмерное вращение - слегка различный случай, как показано в следующем рисунке:

cos

-sin

0

0

1

0

0

0

cos

0

sin

0

sin

cos

0

0

0

cos

-sin

0

0

1

0

0

0

0

1

0

0

sin

cos

0

-sin

0

cos

0

0

0

0

1

0

0

0

1

0

0

0

1

rotation in the XY plane rotation in the YZ plane rotation in the XY plane

Для однородных вращений, 3x3 субматрица, разграниченная [0,0] и [2,2] - orthonormal. То есть каждая строка - вектор модуля и перпендикулярна к другим строкам; скалярное (точечное) программа двух строк нулевое. Столбцы - также векторы модуля, которые являются перпендикулярными к друг другу. Программа orthonormal матрицы и ее, чтобы переместить равняется единичной матрице. Два дополнительных вращения не имеют никакого результирующего влияния.

Сложные преобразования могут быть выполнены, объединяя{*комбинируя*} (или составляя) значения нетождества в единственной{*отдельной*} матрице.

ОБРАТИТЕ ВНИМАНИЕ На acedTablet () функция использует 3x3 матрицу, чтобы преобразовать 2-ые точки. AcedNEntSel () функция использует 4x3 матрицу преобразования, которая является подобной 4x4 матрица преобразования, но это обращается с точкой как строка.

Имена примитивов и наборов выбора

В AutoLISP имена примитивов и наборов выбора - пары длинных целых чисел.

ObjectARX сохраняет этот стандарт, определяя такие имена как тип массива, следующим образом:

typedef long ads_name[2];

Как с ads_point переменными, ads_name переменные всегда проходят ссылкой, но должен быть назначенный элемент элементом.

Вы можете также копировать примитив или имя набор выбора, вызывая ads_name_set () макрокоманда. Как с ads_point_set () и функциями ObjectARX, результат - второй параметр к макрокоманде.

Следующие типовые кодовые наборы имя newname, чтобы равняться oldname.

ads_name oldname, newname;

if (acdbEntNext(NULL, oldname) == RTNORM)

ads_name_set(oldname, newname);

ОБРАТИТЕ ВНИМАНИЕ на макрокоманду This, подобно ads_point_set () макрокоманда, определен по-другому, в зависимости от того, действительно ли символ __ STDC __ (который замещает стандарт C), определен. Стандартная версия C ads_name_set () требует, чтобы ваша программа включила string. h.

Ads_name_equal () макрокоманда сравнивает названия{*имена*} в следующем примере:

if (ads_name_equal (oldname, newname))

...

Чтобы назначать null значение имени, вызовите ads_name_clear () макрокомандой, и испытанием на null примитив или имя набора выбора с макрокомандой ads_name_nil().

Следующий типовой код очищает набор oldname в предыдущем примере:

Ads_name_clear (oldname);

И следующий код проверяет, является ли имя NULL:

Если (ads_name_nil (oldname))

...

ObjectARX создает следующий тип данных для ситуаций, которые требуют, чтобы имя было указателем скорее чем массив:

typedef long *ads_namep;

Полезные значения

ObjectARX определяет следующие директивы препроцессора:

#define TRUE 1

#define FALSE 0

Из за большого объема этот материал размещен на нескольких страницах:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132