#include "Adslib. h"
ObjectARX-приложение не должно включить ol_errno. h, если это не использует символические коды, определенные там, чтобы обработать значение ERRNO. Приложение не должно включить adsdlg. h, если это не создает диалоговые окна.
Приложения Загрузки: ADS против ObjectARX
Загрузка Приложения в среде программы ObjectARX более гибка чем в среде программы ADS. В среде программы ADS, приложение ADS всегда остается в памяти.
И в ObjectARX и средах программы ADS, приложение может быть загружено автоматически, когда AutoCAD вызван, если прикладное имя перечислено в acad. rx или acad. ads, соответственно.
В среде программы ObjectARX, некоторые приложения, типа Выполняют, могут быть вызваны, когда одна из ее функций вызвана{*названа*}. Эта возможность сохраняет память для больших приложений подобно, выполняют, потому что это загружает приложение только в течение короткого времени в течение сессии рисунка.
ObjectARX и загрузка приложения ADS отличен следующими способами:
§ когда рисунок закрыт или когда другой рисунок открыт, ObjectARX-приложения не разгружены. ObjectARX-приложение разгружено, когда AutoCAD закончен или когда приложение не имеет никаких иждивенцев и acedArxUnload () или эквивалентная функция вызвана{*названа*}.
§ В среде программы ObjectARX, рисунок присутствует, когда или kLoadDwg или kUnloadDwg сообщения или оба получены. Эти сообщения получены в случае цикл, когда или ADS или ObjectARX-приложение инициализирован или разгружен.
§ В среде программы ADS, рисунок присутствует, когда kInitAppMsg или kUnloadAppMsg получены.
ОБРАТИТЕ ВНИМАНИЕ В среде программы ObjectARX, не предположите, что рисунок присутствует, когда kInitAppMsg или kUnloadAppMsg получены.
§ В среде программы ObjectARX, вызовите (arxload) или acedArxLoad () чтобы загрузить приложения. В среде программы ADS, вызовите (xload) или ads_xload () чтобы загрузить приложения.
§ ObjectARX-приложения, перечисленные в acad. rx загружены автоматически, когда AutoCAD вызван, и в отличие от приложений ADS, приложения ObjectARX инициализированы прежде, чем рисунок присутствует и прежде, чем ADS или Визуальные среды LISP инициализирован. В среде программы ADS, коллега{*копия*} acad. rx - acad. ads. Поместите названия{*имена*} модулей прикладных программ в соответствующем файле, одно имя в линию.
Формирование ADS приложения в среде ObjectARX
Приложения ADS осуществлены под ObjectARX как DLLs и имеют заданное по умолчанию расширение файла. arx. Для команд при формировании приложений ADS в среде программы ObjectARX, см. AutoCAD readdev. hlp файл.
Процедура, описанная в AutoCAD readdev. hlp файл для отладки приложений ADS в среде программы ADS также применяется в среде программы ObjectARX.
Типовое ObjectARX-приложение
Сравните типовые приложения программ факториала, распределенных с AutoCAD. Программа fact. ccp - для среды программы ObjectARX, в то время как fact. c - для среды программы ADS. Следующая версия fact. cpp объявляет и осуществляет acrxEntryPoint (); иначе, fact. cpp почти идентичен fact. c. Функция acrxEntryPoint () заменяет главное в fact. c:
#include <stdio. h>
#include "adslib. h"
#include "rxdefs. h"
// Utility definition to get an array’s element count (at compile
// time). For example:
//
// int arr[] = {1,2,3,4,5};
// ...
// printf("%d", ELEMENTS(arr));
//
// would print a five. ELEMENTS("abc") can also be used to tell
// how many bytes are in a string constant INCLUDING THE TRAILING
// NULL.
#define ELEMENTS(array) (sizeof(array)/sizeof((array)[0]))
// All the functions that we’ll define will be listed in a single
// table, together with the internal function that we call to handle
// each. The functions all take a single argument (the resbuf that
// has the arguments) and return an integer (RTNORM or RTERROR for
// good or bad status).
// First, define the structure of the table: a string giving the
// AutoCAD name of the function, and a pointer to a function
// returning type int.
struct func_entry {
char *func_name;
int (*func) _((struct resbuf *));
};
// Here we declare the functions that handle the calls; at the moment
// there are two of them.
int fact _((struct resbuf *rb));
int squareroot _((struct resbuf *rb));
// Here we define the array of function names and handlers.
static struct func_entry func_table[] = {
{/*MSG0*/"fact", fact},
{/*MSG0*/"sqr", squareroot},
};
// To add more functions to this table, just put them in the list,
// after declaring the function names. Note that in standard C it’s
// all right to have a superfluous comma after the last item.
// The code from here to the end of dofun() is UNCHANGED when you
// add or delete functions.
// Declarations of other local functions:
void main _((int, char **));
int dofun _((void));
int funcload _((void));
ads_real rfact _((int x));
ads_real rsqr _((ads_real x));
// ACRXENTRYPOINT -- This function replaces main() for an ObjectARX
// program.
extern "C" AcRx::AppRetCode
acrxEntryPoint(AcRx::AppMsgCode msg, void* ptr)
{
switch(msg) {
case AcRx::kInitAppMsg:
acrxUnlockApplication(ptr);
break;
case AcRx::kInvkSubrMsg:
dofun();
break;
case AcRx::kLoadADSMsg:
funcload();
}
return AcRx::kRetOK;
}
// FUNCLOAD -- Define this application’s external functions.
// Return RTERROR on error, else RTNORM.
static int funcload()
{
int i;
for (i = 0; i < ELEMENTS(func_table); i++) {
if (!acedDefun(func_table[i].func_name, (short)i))
return RTERROR;
}
return RTNORM;
}
// DOFUN -- Execute external function (called upon an RQSUBR
// request). Return value from the function executed, RTNORM
// or RTERROR.
static int dofun()
{
struct resbuf *rb;
int val;
// Get the function code and check that it’s within range.
// (It can’t fail to be, but paranoia doesn’t hurt.)
if ((val = acedGetFunCode()) < 0 || val >= ELEMENTS(func_table))
{
acdbFail(/*MSG2*/"Received nonexistent function code.");
return RTERROR;
}
// Fetch the arguments, if any.
rb = acedGetArgs();
// Call the handler and return its success-failure status.
val = (*func_table[val].func)(rb);
acutRelRb(rb);
return val;
}
// The code from the beginning of main() to here is UNCHANGED when
// you add or delete functions.
// FACT -- First set up the argument, then call the factorial
// function.
static int
fact(struct resbuf *rb)
{
int x;
if (rb == NULL)
return RTERROR;
if (rb->restype == RTSHORT) {
x = rb->resval. rint; // Save in local variable
} else {
acdbFail(/*MSG3*/"Argument should be an integer.");
return RTERROR;
}
if (x < 0) { // Check argument range
acdbFail(/*MSG4*/"Argument should be positive.");
return RTERROR;
} else if (x > 170) { // Avoid floating-point overflow
acdbFail(/*MSG5*/"Argument should be 170 or less.");
return RTERROR;
}
acedRetReal(rfact(x)); // Call the function itself, and
// return the value to AutoLISP
return RTNORM;
}
// This is the implementation of the actual external factorial
// function.
static ads_real rfact(int n)
{
ads_real ans = 1.0;
while (n)
ans *= n--;
return ans;
}
// SQUAREROOT -- First set up the argument, then call the root
// function.
static int
squareroot(struct resbuf *rb)
{
ads_real x;
if (rb == NULL)
return RTERROR; // A proper error msg would
// be better.
if (rb->restype == RTSHORT) { // Save in local variable.
x = (ads_real) rb->resval. rint;
} else if (rb->restype == RTREAL) {
x = rb->resval. rreal; // Can accept either real
// or integer.
} else {
acdbFail(
/*MSG6*/
"Argument should be a real or integer value.");
return RTERROR;
}
if (x < 0) { // Check argument range.
acdbFail(/*MSG7*/"Argument should be positive.");
return RTERROR;
}
acedRetReal(rsqr(x)); // Call the function itself, and
// return the value to AutoLISP.
return RTNORM;
}
// This is the implementation of the actual external function
static ads_real rsqr(ads_real x) // Square root by Newton’s method.
{
int n = 50;
ads_real y, c, cl;
if (x == 0.0) {
return 0.0;
}
y = (x * 2 + .1) / (x + 1.0);
c = (y - x / y) / 2;
cl= 0.0;
while ((c!= cl) && (n-- > 0)) {
y -= c;
cl = c;
c = (y - x / y) / 2;
}
return y;
}
ObjectARX-эксклюзивный тип данных
ACAD_GRAPHICS - новый тип данных, определенный во время выполнения для расширенных данных примитива в среде программы ObjectARX. Данные находятся в форме двоичных кусков. DXF последовательность и содержание этих данных определяют графическое изображение примитива для DXF файла, загруженного в AutoCAD без его приложения определения.
Для подробной информации, см. Руководство Настройки AutoCAD, приложение D, при Рисунке Форматов файла Обмена. ”
Приложение B. Программируемые Диалоговые окна
ObjectARX содержит набор функций, который все вместе вызван Программируемое Диалоговое окно (PDB) пакет. PDB функции определяют средство управления диалогового окна, функциональные возможности, и соединение к приложению.
Эта глава описывает, как использовать PDB. См. ObjectARX Ссылку для резюме и каталога функций, упомянутых в этой главе. Для руководящих принципов проекта диалогового окна, см. Руководство Настройки AutoCAD.
Для информации относительно использования см главы 8, “ MFC Темы.”
§ Краткий обзор
§ Иерархическая структура
§ Определения и Объявления
§ Обработка Неперекрывающих расположений
Краткий обзор
Программирование Диалогового окна возводит в степень две стадии:
§ Проектирование диалогового окна dialog box определены текстовыми файлами, написанными на языке контроля диалогов (DCL). Описание DCL диалогового окна определяет, как поле появляется и что это содержит. Для подробной информации, см. Часть III, “ Программируемая Ссылка Диалогового окна, ” в Руководстве Настройки AutoCAD.
|
Из за большого объема этот материал размещен на нескольких страницах:
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 |


