Следующий запрос к acedCommand () вызывает команду ZOOM и затем использует символ ПАУЗЫ так, чтобы пользователь мог выбирать одну из опций ZOOM.
result = acedCommand(RTSTR, "Zoom", RTSTR, PAUSE, RTNONE);
Следующий запрос начинает команду CIRCLE, устанавливает среднюю точку как (5,5), и затем делает паузу, чтобы позволить пользователю перетаскивать радиус круга на экране. Когда пользователь определяет выбранную точку (или вводит выбранный радиус), функциональные резюме, тянущий линию от (5,5) до (7,5).
result = acedCommand(RTSTR, "circle", RTSTR, "5,5",
RTSTR, PAUSE, RTSTR, "line", RTSTR, "5,5", RTSTR,
"7,5", RTSTR, "", 0);
Принятие указения точки командой AutoCAD
Некоторые команды AutoCAD (типа TRIM, EXTEND и FILLET) требует, чтобы пользователи определили точку указки также как примитив. Чтобы передавать такие пары примитива и данных точки посредством acedCommand (), Вы должны определить имя примитива сначала и включать пару в RTLB и коды типа результата RTLE.
Следующий типовой кодовый фрагмент создает круг, центрированный в (5,5) и линию, которая простирается от (1,5) до (8,5); это предполагает, что круг и линия созданы в пустом рисунке. Это тогда использует точку указки с командой TRIM, чтобы урезать линию в крае круга. AcdbEntNext () функция находит следующий примитив в рисунке, и acdbEntLast () функция находит последний примитив в рисунке.
ads_point p1;
ads_name first, last;
acedCommand(RTSTR, "Circle", RTSTR, "5,5", RTSTR, "2", 0);
acedCommand(RTSTR, "Line", RTSTR, "1,5", RTSTR, "8,5", RTSTR, "", 0);
acdbEntNext(NULL, first); // Get circle.
acdbEntLast(last); // Get line.
// Set pick point.
p1[X] = 2.0;
p1[Y] = 5.0;
p1[Z] = 0.0;
acedCommand(RTSTR, "Trim", RTENAME, first, RTSTR, "",
RTLB, RTENAME, last, RTPOINT, p1, RTLE,
RTSTR, "", 0);
Системные Переменные
Пара функций, acedGetVar () и acedSetVar (), дает возможность ObjectARX-приложениям осматривать и изменить значение переменных системы AutoCAD.
Эти функции используют строку, чтобы определить имя переменной (или в верхнем регистре или нижнем регистре), и (одиночном) буфере результатов для типа и значения переменной.
Буфер результатов требуется в этом случае, потому что переменные системы AutoCAD входят в разнообразие типов: целые числа, реальные значения, строки, 2-ые точки, и трехмерные точки.
Следующий типовой кодовый фрагмент гарантирует, что последующие команды FILLET используют радиус по крайней мере 1.
struct resbuf rb, rb1;
acedGetVar("FILLETRAD", &rb);
rb1.restype = RTREAL;
rb1.resval. rreal = 1.0;
if (rb. resval. rreal < 1.0)
if (acedSetVar("FILLETRAD", &rb1) != RTNORM)
return BAD; // Setvar failed.
В этом примере, буфер результатов распределен как динамическая локальная переменная, когда это объявлено в приложении. Приложение должно явно не управлять использованием памяти буфера, поскольку это делает с динамически распределенными буферами.
Если переменная системы AutoCAD - строковый тип, acedGetVar () распределяет пространство для строки. Приложение ответствено за освобождение этого пространства{*пробела*}. Вы можете делать это, вызывая функцию стандартной библиотеки для C свободный (), как показано в следующем примере:
acedGetVar("TEXTSTYLE", &rb);
if (rb. resval. rstring!= NULL)
// Release memory acquired for string:
free(rb. resval. rstring);
Символы AutoLISP
Функции acedGetSym () и acedPutSym () позволяют ObjectARX-приложениям осматривать и изменять{*заменять*} значение переменных AutoLISP.
В первом примере, пользователь вводит следующие выражения AutoLISP:
Command: (setq testboole t)
T
Command: (setq teststr “HELLO, WORLD”)
“HELLO, WORLD”
Command: (setq sset1 (ssget))
<Selection set: 1>
Тогда следующий типовой код показывает, как acedGetSym() отыскивает новые значения символов.
struct resbuf *rb;
int rc;
long sslen;
rc = acedGetSym("testboole", &rb);
if (rc == RTNORM && rb->restype == RTT)
acutPrintf("TESTBOOLE is TRUE\n");
acutRelRb(rb);
rc = acedGetSym("teststr", &rb);
if (rc == RTNORM && rb->restype == RTSTR)
acutPrintf("TESTSTR is %s\n", rb->resval. rstring);
acutRelRb(rb);
rc = acedGetSym("sset1", &rb);
if (rc == RTNORM && rb->restype == RTPICKS) {
rc = acedSSLength(rb->resval. rlname, &sslen);
acutPrintf("SSET1 contains %lu entities\n", sslen);
}
acutRelRb(rb);
Наоборот, acedPutSym () может создавать или изменять связывание символов AutoLISP, следующим образом:
ads_point pt1;
pt1[X] = pt1[Y] = 1.4; pt1[Z] = 10.9923;
rb = acutBuildList(RTSTR, "GREETINGS", 0);
rc = acedPutSym("teststr", rb);
acedPrompt("TESTSTR has been reset\n");
acutRelRb(rb);
rb = acutBuildList(RTLB, RTSHORT, -1,
RTSTR, "The combinations of the world",
RTSTR, "are unstable by nature.", RTSHORT, 100,
RT3DPOINT, pt1,
RTLB, RTSTR, "He jests at scars",
RTSTR, "that never felt a wound.", RTLE, RTLE, 0);
rc = acedPutSym("longlist", rb);
acedPrompt("LONGLIST has been created\n");
acutRelRb(rb);
Чтобы устанавливать переменную AutoLISP в ноль, делайте следующее назначение и функциональный запрос:
rb->restype = RTNIL;
acedPutSym("var1", rb);
Пользователи могут отыскивать эти новые значения. (Как показано в примере, ваша программа должна уведомить пользователей относительно любых изменений.)
TESTSTR has been reset.
LONGLIST has been created.
Command: !teststr
(“GREETINGS”)
Command: !longlist
((-1 “The combinations of the world” “are unstable by nature.” 100 (1.4 1.4
10.9923) (“He jests at scars” “that never felt a wound.”)))
Поиск Файла
AcedFindFile () функция дает возможность приложению искать файл специфического имени. Приложение может определить каталог, чтобы искать, или это может использовать поток путь библиотеки AutoCAD.
В следующем типовом кодовом фрагменте, acedFindFile () ищет требуемое имя файла согласно пути библиотеки AutoCAD.
char *refname = "refc. dwg";
char fullpath[100];
.
.
.
if (acedFindFile(refname, fullpath) != RTNORM) {
acutPrintf("Could not find file %s.\n", refname);
return BAD;
Если запрос к acedFindFile () успешен, fullpath параметр установлен в полностью квалифицированную строку имени пути, типа следующего:
/home/work/ref/refc. dwg
Вы можете также запрашивать пользователей вводить имя файла посредством стандарта файловое диалоговое окно AutoCAD. Чтобы отображать файловое диалоговое окно, вызовите acedGetFileD ().
Следующий типовой кодовый фрагмент использует файловое диалоговое окно, чтобы запросить пользователей относительно имени ObjectARX-приложения.
struct resbuf *result;
int rc, flags;
if (result = acutNewRb(RTSTR) == NULL) {
acdbFail("Unable to allocate buffer\n");
return BAD;
}
result->resval. rstring=NULL;
flags = 2; // Disable the "Type it" button.
rc = acedGetFileD("Get ObjectARX Application", // Title
"/home/work/ref/myapp", // Default pathname
NULL, // The default extension: NULL means "*".
flags, // The control flags
result); // The path selected by the user.
if (rc == RTNORM)
rc = acedArxLoad(result->resval. rstring);
Объектная Привязка
AcedOsnap () функция находит точку, используя один из Режимов объектной привязки AutoCAD. Поспешные режимы определены в строковом параметре.
В следующем примере, запрос к acedOsnap () ищет midpoint линии около pt1.
acedOsnap(pt1, "midp", pt2);
Следующий запрос ищет или midpoint или оконечную точку линии, или центра дуги или круга —, какой бы ни - самый близкий pt1.
acedOsnap(pt1, "midp, endp, center", pt2);
Третий параметр (pt2 в примерах) установлен в поспешную точку, если найдены. AcedOsnap () функциональные возвращения RTNORM, если точка найдена.
ОБРАТИТЕ ВНИМАНИЕ, что переменная системы APERTURE определяет допустимую близость выбранной точки к примитиву при использовании Объектной Привязки.
Описатели Области просмотра
Функция acedVports (), подобно функции AutoLISP (vports), получает список описателей текущих областей просмотра и их местоположений.
Следующий типовой код получает текущую конфигурацию области просмотра и передает это назад к AutoLISP для дисплея.
struct resbuf *rb;
int rc;
rc = acedVports(&rb);
acedRetList(rb);
acutRelRb(rb);
Например, учитывая конфигурацию с одиночной областью просмотра со включенным TILEMODE, предшествующий код может возвращать список, показанный в следующем рисунке.

Точно так же, если четыре области просмотра равняться-размера расположены в четырех углах экрана, и TILEMODE включен, предшествующий код может возвращать конфигурацию, показанную в следующем рисунке.

Описатель текущей области просмотра - всегда сначала в списке. В списке, показанном в предшествующем числе{*рисунке*}, номер 5 области просмотра - текущая область просмотра.
Геометрические Утилиты
Одна группа функций дает возможность приложениям получить геометрическую информацию.
AcutDistance () функция находит, что расстояние между двумя точками, acutAngle () находит угол между линией, и X ось текущих ВЕРХНИХ РЕГИСТРОВ (в КООРДИНАТНОМ плане), и acutPolar () находит точку посредством полярных координат (относительно начальной точки). В отличие от большинства функций ObjectARX, эти функции не возвращают значение состояния. AcdbInters () функция находит пересечение двух линий; это возвращает RTNORM, если это находит точку, которая соответствует спецификации.
|
Из за большого объема этот материал размещен на нескольких страницах:
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 |


