// jig started acquiring the necessary info to properly fill

// it in.

//

void

AsdkEllipseJig::doIt()

{

mpEllipse = new AcDbEllipse;

// Get the major axis vector from the user.

// At this time, mPromptCounter == 0.

//

setDispPrompt("\nEllipse major axis: ");

AcEdJig::DragStatus stat = drag();

// Get the ellipse’s radius ratio.

//

mPromptCounter++; // now == 1

setDispPrompt("\nEllipse minor axis: ");

stat = drag();

// Now add the ellipse to the database’s current space.

//

append();

}

// This function is called by the drag function to

// acquire a sample input.

//

AcEdJig::DragStatus

AsdkEllipseJig::sampler()

{

DragStatus stat;

setUserInputControls((UserInputControls)

(AcEdJig::kAccept3dCoordinates

| AcEdJig::kNoNegativeResponseAccepted

| AcEdJig::kNoZeroResponseAccepted));

if (mPromptCounter == 0) {

// Aquire the major axis endpoint.

//

// If the newly acquired point is the same as it was

// in the last sample, then we return kNoChange so the

// AsdkEllipseJig::update() function will not be called

// and the last update call will be able to finish, thus

// allowing the ellipse to fully elaborate.

//

static AcGePoint3d axisPointTemp;

stat = acquirePoint(mAxisPt, mCenterPt);

if (axisPointTemp!= mAxisPt)

axisPointTemp = mAxisPt;

else if (stat == AcEdJig::kNormal)

return AcEdJig::kNoChange;

}

else if (mPromptCounter == 1) {

// Aquire the distance from ellipse center to minor

// axis endpoint. This will be used to calculate the

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

// radius ratio.

//

// If the newly acquired distance is the same as it was

// in the last sample, then we return kNoChange so the

// AsdkEllipseJig::update() function will not be called

// and the last update call will be able to finish, thus

// allowing the ellipse to fully elaborate.

//

static double radiusRatioTemp = -1;

stat = acquireDist(mRadiusRatio, mCenterPt);

if (radiusRatioTemp!= mRadiusRatio)

radiusRatioTemp = mRadiusRatio;

else if (stat == AcEdJig::kNormal)

return AcEdJig::kNoChange;

}

return stat;

}

// This function is called to update the entity based on the

// input values.

//

Adesk::Boolean

AsdkEllipseJig::update()

{

switch (mPromptCounter) {

case 0:

// At this time, mAxis contains the value of one

// endpoint of the desired major axis. The

// AcDbEllipse class stores the major axis as the

// vector from the center point to where the axis

// intersects the ellipse path (such as half of the true

// major axis), so we already have what we need.

//

mMajorAxis = mAxisPt - mCenterPt;

break;

case 1:

// Calculate the radius ratio. mRadiusRatio

// currently contains the distance from the ellipse

// center to the current pointer position. This is

// half of the actual minor axis length. Since

// AcDbEllipse stores the major axis vector as the

// vector from the center point to the ellipse curve

// (half the major axis), to get the radius ratio we

// simply divide the value currently in mRadiusRatio

// by the length of the stored major axis vector.

//

mRadiusRatio = mRadiusRatio / mMajorAxis. length();

break;

}

// Now update the ellipse with the latest setting.

//

mpEllipse->set(mCenterPt, mNormal, mMajorAxis,

mRadiusRatio);

return Adesk::kTrue;

}

// This function must be implemented to return a pointer to

// the entity being manipulated by the jig.

//

AcDbEntity*

AsdkEllipseJig::entity() const

{

return mpEllipse;

}

// This function uses the AcEdJig mechanism to create and

// drag an ellipse entity. The creation criteria are

// slightly different from the AutoCAD command. In this

// case, the user selects an ellipse center point and

// drags to visually select the major and minor axes

// lengths. This sample is somewhat limited; if the

// minor axis ends up longer than the major axis, then the

// ellipse will just be round because the radius ratio

// cannot be greater than 1.0.

//

void

createEllipse()

{

// First, have the user select the ellipse center point.

// We don’t use the jig for this because there is

// nothing to see yet.

//

AcGePoint3d tempPt;

struct resbuf rbFrom, rbTo;

acedGetPoint(NULL, "\nEllipse center point: ",

asDblArray(tempPt));

// The point we just got is in UCS coordinates, but

// AcDbEllipse works in WCS, so convert the point.

//

rbFrom. restype = RTSHORT;

rbFrom. resval. rint = 1; // from UCS

rbTo. restype = RTSHORT;

rbTo. resval. rint = 0; // to WCS

acedTrans(asDblArray(tempPt), &rbFrom, &rbTo,

Adesk::kFalse, asDblArray(tempPt));

// Now you need to get the current UCS z-Axis to be used

// as the normal vector for the ellipse.

//

AcGeVector3d x =

acdbHostApplicationServices()->workingDatabase()->ucsxdir();

AcGeVector3d y =

acdbHostApplicationServices()->workingDatabase()->ucsydir();

AcGeVector3d normalVec = x. crossProduct(y);

normalVec. normalize();

// Create an AsdkEllipseJig object passing in the

// center point just selected by the user and the normal

// vector just calculated.

//

AsdkEllipseJig *pJig

= new AsdkEllipseJig(tempPt, normalVec);

// Now start up the jig to interactively get the major

// and minor axes lengths.

//

pJig->doIt();

// Now delete the jig object, since it is no longer needed.

//

delete pJig;

}

void

initApp()

{

acedRegCmds->addCommand("ASDK_VISUAL_ELLIPSE",

"ASDK_VELLIPSE", "VELLIPSE", ACRX_CMD_MODAL,

createEllipse);

}

void

unloadApp()

{

acedRegCmds->removeGroup("ASDK_VISUAL_ELLIPSE");

}

extern "C" AcRx::AppRetCode

acrxEntryPoint(AcRx::AppMsgCode msg, void* appId)

{

switch (msg) {

case AcRx::kInitAppMsg:

acrxDynamicLinker->unlockApplication(appId);

acrxDynamicLinker->registerAppMDIAware(appId);

initApp();

break;

case AcRx::kUnloadAppMsg:

unloadApp();

}

return AcRx::kRetOK;

}

Часть 4. Специализированные темы

Глава14. Полномочные Объекты (Proxy)

Эта глава описывает полномочные объекты и условия их создания. Это также обсуждает пользователя, сталкивается с proxies, отображая полномочные примитивы, и редактируя полномочные примитивы. Эффект разгрузки приложения на заказных объектах и примитивах обсужден также.

    Определение прокси-объекта Цикл Жизни прокси-объекта Прокси-объект для пользователя Отображение прокси-примитивов Редактирование прокси-примитивов Разгрузка приложения

Определение прокси-объекта

Прокси-объект - объект AutoCAD, создает в памяти как держатель данных идентификатора объекта для заказного объекта ObjectARX. AutoCAD автоматически создает прокси-объекты, когда приложение, которое определяет объект, не загружено.

Прокси-объекты созданы для объектов и примитивов. AutoCAD использует прокси-объекты, чтобы обеспечить доступ для чтения данных в заказном объекте, полученном из AcDbObject или AcDbEntity. Прокси-объекты также обеспечивают управляемые возможности редактирования этого данными. Родительское приложение определяет степень тех возможностей редактирования с параметром PROXY_FLAGS макрокоманды ACRX_DXF_DEFINE_MEMBERS.

Класс прокси-объекта AcDbProxyObject получен из AcDbObject, и класс прокси-примитива AcDbProxyEntity получен из AcDbEntity. И - абстрактные классы, которые не могут быть действительны и включены в ObjectARX API.

Прокси-объекты преобразовывают назад к первоначальному заказному объекту всякий раз, когда родительское приложение загружено. Например, если прокси-объекты созданы в начале сессии рисунка, и родительское приложение впоследствии загружено, прокси-объекты восстановлены к заказным объектам.

При специальных обстоятельствах, прокси-объекты написаны к файлам, но прокси-объекты обычно существуют только в памяти.

ObjectARX разработчики может затрагивать создание и управлять модификацию прокси-объектов, используя макрокоманду ACRX_DXF_DEFINE_MEMBERS и требование, загружающее особенности в AutoCAD (см. “ Загрузка по требованию ” на странице 45). Кроме того, они могут использовать функции классов прокси-объекта в их собственных приложениях, чтобы управлять прокси-объектами, которые AutoCAD создает для заказных объектов других приложений.

Цикл жизни прокси-объекта

Прокси-объекты созданы в AutoCAD, когда читается файл, содержащий заказные объекты, которые не могут быть действительны. Объекты пользователя не могут быть действительны, когда родительское приложение не загружено и не может пройти загрузка по требованию. Если родительское приложение впоследствии загружено в течение сессии рисунка, AutoCAD автоматически преобразовывает прокси-объекты к заказным объектам.

О прокси(полномочным) можно думать как о обертке, содержащей заказной объект. Полномочный обеспечивает AutoCAD доступом к элементам базового класса (типа цвета и уровня) заказного объекта, и

Это формирует членов данных заказного класса, к которым нельзя обращаться в отсутствии родительского приложения. При большинстве обстоятельств, полномочная обертка - навеска, когда база данных рисунка

записана в файл. Тот же самый двоичный объект, который читался в, выписан. Если сохраняющая операция вовлекает преобразование файла типа между DWG и DXF (для которого конверсионная функция родительского приложения – не загружена), полномочная обертка сохранен с заказными двоичными данными также.

Когда родительское приложение не загружено перед записью в файл, данные обработаны следующим образом:

§  если файлы ввода и вывода - тот же самый файл типа (и DWG или DXF), никакая операция трансляции необходим, и те же самые данные, который читался в, записан. Данные, сохраненные в прокси-объекте написаны к выходному файлу.

§  если файлы ввода и вывода отличаются по файлу типа (то есть DWG в DXF или наоборот), формат не может быть оттранслирован, потому что функция трансляции, определенная родительским приложением - не настоящи. Полный прокси-объект поэтому написан к выходному файлу. Когда файл впоследствии читается в соответствии с 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