При монтаже иерархии xrecord объектов (добавление монопольного использования или ссылки указателя к объекту), тот объект должен уже существовать в базе данных, и, таким образом, иметь законное имя примитива. Поскольку acdbEntMake () не возвращает имя примитива, и acdbEntLast () только признает графические объекты, Вы должны использовать acdbEntMakeX () если Вы ссылаетесь на неграфические объекты.
AcdbEntMakeX () функция возвращает имя примитива объекта, добавленного к базе данных (или графический или неграфический). Начальный Выпуск 13 выполнения acdbEntMake () только поддержанные объекты, чей класс диктовал его определенный объект контейнера владельца в текущем рисунке (типа входов таблицы идентификаторов, весь снабженный Выпуск 13 типов примитива, и объекты словаря), и зарегистрировал новый объект с его владельцем. Эти функции продолжат делать это для того же самого набора встроенных объектных классов, включая примитивы. Для xrecords и всех классов пользователя, эти функции добавят объект к базе данных, оставляя это до приложения, чтобы установить его связи{*ссылки*} монопольных использований снова до словари имен объектов. AcdbEntMakeX () функция добавляет объект к базе данных для всех типов объекта, включая, которые идут С AutoCAD. Так, даже при использовании этой функции на существующих типах примитива, ваша программа ответствена за установку монопольного использования.
Доступ к таблицам идентификаторов
AcdbTblNext() функция последовательно просматривает входы таблицы идентификаторов, и acdbTblSearch () функция возвращает определенные входы. Названия{*имена*} Таблицы определены строками. Допустимыеимена - “LAYER”, “LTYPE”, “VIEW”, “STYLE”, “BLOCK”, “UCS”, “VPORT”, and “APPID”. Обе из этих функций возвращают входы как списки буфера результата с кодами группы DXF.
Первый запрос к acdbTblNext() возвращает первый вход в указанной таблице.
Последующее звонит, которые определяют, что та же самая таблица возвращает последовательные входы, если второй параметр к acdbTblNext() (перемотка) не отличный от нуля, когда acdbTblNext() возвращает первый вход снова.
В следующем примере, функция getblock() возвращает первый блок (если любой) в текущем рисунке, и вызывает printdxf() функцией, чтобы отобразить содержание того блока в формате списка.
void getblock()
{
struct resbuf *bl, *rb;
bl = acdbTblNext("BLOCK", 1); // First entry
acutPrintf("\nResults from getblock():\n");
// Print items in the list as "assoc" items.
for (rb = bl; rb!= NULL; rb = rb->rbnext)
printdxf(rb);
// Release the acdbTblNext list.
acutRelRb(bl);
}
Входы, отысканные в таблице БЛОКОВ, содержат группа -2, которая содержит имя первого примитива на блочном определении. В рисунке к одиночному блоку по имени ПОЛЕ, запрос к getblock () печатает следующий (значение имени изменяется от сеанса до сеанса):
Результаты от getblock ():
(0 . "BLOCK")
(2 . "BOX")
(70 . 0)
(10 9.0 2.0 0.0)
(-2 . <Entity name: 40000126>)
Первый параметр к acdbTblSearch () - строка, которая называет таблицу, но второй параметр - строка, которая называет специфический символ в таблице. Если символ найден, acdbTblSearch () возвращает его данные. Эта функция имеет третий параметр, setnext, который может использоваться, чтобы координировать операции с acdbTblNext (). Если setnext нулевой, acdbTblSearch () запрос не имеет никакого эффекта на acdbTblNext (), но если setnext отличный от нуля, следующий запрос к acdbTblNext () возвращает вход таблицы, который следует за входом, найденным acdbTblSearch ().
Setnext опция особенно полезна, когда имеющий дело с VPORT таблицей идентификаторов, потому что все области просмотра в специфической конфигурации области просмотра имеют то же самое имя (типа *ACTIVE).
Имейте в виду, что, если к VPORT таблице идентификаторов обращаются, когда TILEMODE выключен, изменения{*замены*} не имеют никакого видимого эффекта, пока TILEMODE не поворачивает обратно на. (TILEMODE установлен или командой SETVAR или, вводя ее имя непосредственно.) Не путают VPORT таблицу идентификаторов с примитивами области просмотра.
Чтобы находить и обрабатывать каждую область просмотра в конфигурации, названной 4VIEW, Вы могли бы использовать следующий код:
struct resbuf *v, *rb;
v = acdbTblSearch("VPORT", "4VIEW", 1);
while (v!= NULL} {
for (rb = v; rb!= NULL; rb = rb->rbnext)
if (rb->restype == 2)
if (strcmp(rb->resval. rstring, "4VIEW") == 0) {
.// Process the VPORT entry
.
.
acutRelRb(v);
// Get the next table entry.
v = acdbTblNext("VPORT", 0);
} else {
acutRelRb(v);
v = NULL; // Break out of the while loop.
break; // Break out of the for loop.
}
}
Глава10. Глобальные Функции для Взаимодействия с AutoCAD
Глобальные функции, описанные в этой главе позволяют вашему приложению связываться с AutoCAD. Эта глава обсуждает функции для регистрации команд с AutoCAD, обработка ввода пользователя, обработка преобразований данных, и установки внешних устройств типа таблетки.
- Запросы AutoCAD и Команды Получение Ввода Пользователя Преобразования Обработка Символьного типа Преобразования Системы координат Управление Дисплея Калибровка Таблетки Универсальное сопоставление
Запросы AutoCAD и Команды
Функции, описанные в этом разделе обращаются к командам AutoCAD и услугам.
Общий Доступ
Большинство генерала функций, которые обращаются К AutoCAD - acedCommand () и acedCmd (). Подобно функции (команды) в AutoLISP, эти функции посылают команды и другой ввод непосредственно к Приглашению ко вводу команды AutoCAD.
Int
AcedCommand (int rtype, ...);
Int
AcedCmd (struct resbuf *rbp);
В отличие от большинства других функций взаимодействия AutoCAD, acedCommand () имеет список параметров переменной длины: параметры к acedCommand () обработаны как пары если бы не RTLE и RTLB, которые необходимы, чтобы передать точку указки. Первый из каждой пары параметра идентифицирует тип результата параметра, который следует, и второй содержит фактические данные. Заключительный параметр в списке - одиночный параметр, чей значение является или 0 или RTNONE. Как правило, первый параметр к acedCommand () - тип, закодируют RTSTR, и второй параметр данных - строка, которая является именем команды, чтобы вызвать. Следующие пары параметра определяют опции или данные, которых указанная команда требует.
Коды типа в acedCommand () список параметров - типы результата.
Параметры данных должны соответствовать типам данных и значениям, ожидаемым последовательностью подсказки той команды. Они могут быть строки, реальные значения, целые числа, точки, названия{*имена*} примитива, или названия{*имена*} набора выбора. Данные типа углов, расстояний, и точек можно пропускать или как строки (поскольку пользователь мог бы вводить их) или как значения непосредственно (то есть как целое число, реальное, или направлять значения).
Пустая строка (“ ”) эквивалентна вводу пространства{*пробела*} на клавиатуре.
Из-за идентификаторов типа, acedCommand () список параметров - не тот же самый как список параметров для AutoLISP подпрограмма (команды). Знайте это, если Вы преобразовываете подпрограмму AutoLISP в ObjectARX-приложение.
Имеются ограничения на команды, которые acedCommand () может вызывать, которые являются сопоставимыми ограничениям на AutoLISP функция (команды).
ОБРАТИТЕ ВНИМАНИЕ На acedCommand () и acedCmd () функции могут вызывать команду SAVE ИЛИ SAVEAS AutoCAD. Когда они делают так, AutoLISP выпускает kSaveMsg сообщение к всем другим ObjectARX-приложениям, в настоящее время загруженным, но не к приложению, которое вызвало SAVE. Сопоставимый код послан, когда эти функции вызывают NEW, OPEN, END, или QUIT от приложения.
Следующая типовая функция показывает несколько, вызывает к acedCommand ().
int docmd()
{
ads_point p1;
ads_real rad;
if (acedCommand(RTSTR, "circle", RTSTR, "0,0", RTSTR, "3,3", 0) != RTNORM)
return BAD;
if (acedCommand(RTSTR, "setvar", RTSTR, "thickness", RTSHORT, 1, 0) != RTNORM)
return BAD;
p1[X] = 1.0; p1[Y] = 1.0; p1[Z] = 3.0;
rad = 4.5;
if (acedCommand(RTSTR, "circle", RT3DPOINT, p1, RTREAL, rad, 0) != RTNORM)
return BAD;
return GOOD;
}
При условии, что AutoCAD - в Приглашении ко вводу команды, когда эта функция вызвана{*названа*}, AutoCAD исполняет следующие действия:
1 Рисует круг, который проходит до (3.0,3.0) и чей центр - в (0.0,0.0).
2 Изменяют текущую толщину к 1.0. Обратите внимание, что первый запрос к acedCommand () передает точки как строки, в то время как секунда передает короткое целое число. Любой метод возможен.
3 Рисует другой (вытесненный) круг, чей центр - в (1.0,1.0,3.0) и чей радиус - 4.5. Этот последний{*прошлый*} запрос к acedCommand () использует трехмерную точку и реальный (с двойной точностью с плавающей точкой) значение. Обратите внимание, что точки пропускает ссылка, потому что ads_point - тип массива.
Использование acedCmd ()
AcedCmd() функция эквивалентна acedCommand(), но передает значения к AutoCAD в форме списка буфера результата. Это полезно в ситуациях, где сложная логика вовлечена в построение списка команд AutoCAD. AcutBuildList () функция полезен для построения списков команд.
AcedCmd() функция также имеет преимущество, что список команд может изменяться во время выполнения скорее чем быть установленным во времени компиляции. Его недостаток - то, что требуется слегка дольше, чтобы выполниться. Для получения дополнительной информации, см. ObjectARX Ссылку.
Следующий типовой кодовый фрагмент заставляет AutoCAD исполнять REDRAW на экране графики потока (или область просмотра).
struct resbuf *cmdlist;
cmdlist = acutBuildList(RTSTR, "redraw", 0);
if (cmdlist == NULL) {
acdbFail("Couldn’t create list\n");
return BAD;
}
acedCmd(cmdlist);
acutRelRb(cmdlist);
Приостановка ввода пользователя
Если команда AutoCAD происходит, и AutoCAD сталкивается с символом ПАУЗЫ как параметр к acedCommand () или acedCmd (), команда временно приостановлена, чтобы позволить прямой ввод пользователя, включая перемещение. Символ ПАУЗЫ состоит из строки, которая содержит одиночную наклонную черту влево. Это подобно наклонной черте влево механизм паузы, предусмотренный меню.
|
Из за большого объема этот материал размещен на нескольких страницах:
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 |


