ПРЕДУПРЕЖДЕНИЕ! Объект AcGi типа AcGiWorldDraw или AcGiViewportDraw не должен быть сохранен как глобальная или статическая переменная. Не сохраните копии объектов AcGi поперек запросов к worldDraw () и viewportDraw () функции. Однажды это возвращение функций, объекты AcGi больше не допустимы.

Для получения дополнительной информации относительно AcGi библиотеки, см. главу 26, “ Графическая Библиотека Интерфейсов. ”

Перегрузка saveAs ()

Вы должны перегрузить saveAs () если Вы хотите сохранить дополнительное графическое представление для сохранения полномочной графики объекта, Выпустите 12 DWG файлы, или оба.

Если ваш заказной объект не перегружает AcDbEntity:: saveAs () функция, AutoCAD усилит ваш worldDraw () функция, чтобы поддержать полномочную графику объекта или Выпускать 12 DWG файлы. AcDbEntity:: saveAs() просто вызывает worldDraw ().

virtual void

AcDbEntity:: saveAs (

AcGiWorldDraw *pWd,

AcDb:: SaveType saveType);

SaveType параметр используется, когда Вы хотите формировать уникальный, чередовать графические представления для обоих видов сохранения; это указывает, для которого цель saveAs () называлась. SaveType параметр имеет любое из следующих значений:

§  kR13Save указывает, что saveAs () назывался, чтобы сохранить{*экономить*} полномочные графические данные.

§  kR12Save указывает, что saveAs () назывался для сохранения, чтобы Выпустить 12 DWG файлы.

Изнутри saveAs (), Вы можете хотеть назвать worldDraw () функцией для одного значения saveType и делать прямой AcGiWorldGeometry, и AcGiSubEntityTraits запрашивает другого значения, или Вы не можете хотеть назвать worldDraw () функцией вообще.

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

В любом случае, перед запросом saveAs (), AutoCAD первые замены геометрия AcGiWorldDraw и черты возражает со специальными подклассами AcGiWorldGeometry и AcGiSubEntityTraits. Геометрический примитив Этих подклассов и функции черт свойства кэшируют данные в соответствующем формате скорее чем выполнение дисплея. После запроса saveAs (), AutoCAD записывает кэшируемые данные на диск.

Никакой вид сохранения не разрешает сохранять любую графику иждивенца представления. ViewportDraw () функция не называется как часть любой из сохраняющихся операций.

Ваш заказной объект может полагаться на его viewportDraw () функция для его графики, так ее worldDraw () функция один не произвела бы соответствующее изображение.

В том случае, вы будете должны перегрузить saveAs () чтобы произвести разумную графику для Выпуска 12 и полномочных объектов.

Для получения дополнительной информации на полномочных графических данных, см. главу 14, “ Полномочные Объекты. ”

В Выпуске 12 DWG файлы, информация относительно первоначального объекта не сохранена в файле. Однако, первый Выпуск, 12 объекта будет иметь тот же самый маркер{*дескриптор*} как первоначальный объект, и любой дополнительный Выпуск 12 объектами, будет иметь первоначальный маркер{*дескриптор*} объекта, помещенный в их data. (Просмотр под прикладным названием{*именем*} ACAD, после строкового компонента данных R13OBJECT.) Эта особенность обеспечивается так, чтобы Вы могли группировать Выпуск 12 объектов в блок.

Реализация функций OSNAP

Вы будете должны перегрузить getOsnapPoints () функция, если Вы хотите, чтобы ваш заказной объект поддержал объектные поспешные режимы. AutoCAD вызывает эту функцию, чтобы приобрести уместные поспешные пункты{*точки*} для текущего режима. Если Вы не хотите, чтобы ваш объект поддержал поспешные пункты{*точки*} для специфического режима, Вы можете отфильтровывать поспешные режимы, Вы поддерживаете и возвращаете eOk для другие; AutoCAD запросит пользователя выбирать снова. Если множественные объектные поспешные режимы активны, эта функция называется однажды для каждого объектного поспешного режима.

ОБРАТИТЕ ВНИМАНИЕ, что перекрестный объектный поспешный режим обработан по-другому от getOsnapPoints (). Это использует AcDbEntity:: intersectWith (), не getOsnapPoints ().

Следующие показы, как AsdkPoly класс осуществляет getOsnapPoints () функция:

Acad::ErrorStatus

AsdkPoly::getOsnapPoints(

AcDb::OsnapMode osnapMode,

int gsSelectionMark,

const AcGePoint3d& pickPoint,

const AcGePoint3d& lastPoint,

const AcGeMatrix3d& viewXform,

AcGePoint3dArray& snapPoints,

AcDbIntArray& /*geomIds*/) const

{

assertReadEnabled();

Acad::ErrorStatus es = Acad::eOk;

if (gsSelectionMark == 0)

return Acad::eOk;

if ( osnapMode!= AcDb::kOsModeEnd

&& osnapMode!= AcDb::kOsModeMid

&& osnapMode!= AcDb::kOsModeNear

&& osnapMode!= AcDb::kOsModePerp

&& osnapMode!= AcDb::kOsModeCen

&& osnapMode!= AcDb::kOsModeIns)

{

return Acad::eOk;

}

// First, check to see if the gsSelection marker is the

// text geometry. If so, handle center and insertion

// modes, then return. No need to go into perp, mid, etc.

//

AcGePoint3d center;

getCenter(center);

if (gsSelectionMark == (mNumSides + 1)) {

if (osnapMode == AcDb::kOsModeIns)

snapPoints. append(center);

else if (osnapMode == AcDb::kOsModeCen)

snapPoints. append(center);

return es;

}

int startIndex = gsSelectionMark - 1;

AcGePoint3dArray vertexArray;

if ((es = getVertices3d(vertexArray)) != Acad::eOk) {

return es;

}

AcGeLineSeg3d lnsg(vertexArray[startIndex],

vertexArray[startIndex + 1]);

AcGePoint3d pt;

AcGeLine3d line, perpLine;

AcGeVector3d vec;

AcGeVector3d viewDir(viewXform(Z, 0), viewXform(Z, 1),

viewXform(Z, 2));

switch (osnapMode) {

case AcDb::kOsModeEnd:

snapPoints. append(vertexArray[startIndex]);

snapPoints. append(vertexArray[startIndex + 1]);

break;

case AcDb::kOsModeMid:

pt. set(

((vertexArray[startIndex])[X]

+ (vertexArray[startIndex + 1])[X]) * 0.5,

((vertexArray[startIndex])[Y]

+ (vertexArray[startIndex + 1])[Y]) * 0.5,

((vertexArray[startIndex])[Z]

+ (vertexArray[startIndex + 1])[Z]) * 0.5);

snapPoints. append(pt);

break;

case AcDb::kOsModeNear:

pt = lnsg. projClosestPointTo(pickPoint, viewDir);

snapPoints. append(pt);

break;

case AcDb::kOsModePerp:

// Create a semi-infinite line and find a point on it.

//

vec = vertexArray[startIndex + 1]

- vertexArray[startIndex];

vec. normalize();

line. set(vertexArray[startIndex], vec);

pt = line. closestPointTo(lastPoint);

snapPoints. append(pt);

break;

case AcDb::kOsModeCen:

snapPoints. append(center);

break;

default:

return Acad::eOk;

}

return es;

}

Реализация Функции точки захвата (grip)

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

Сигнатуры для getGripPoints () и moveGripPointsAt () функции для AcDbEntity

virtual Acad::ErrorStatus

AcDbEntity::getGripPoints(

AcGePoint3dArray& gripPoints,

AcDbIntArray& osnapModes,

AcDbIntArray& geomIds) const;

virtual Acad::ErrorStatus

AcDbEntity::moveGripPointsAt(

const AcDbIntArray& indices,

const AcGeVector3d& offset);

OsnapModes и geomIds параметры getGripPoints () функция в настоящее время не используются.

Режим Протяжения в редактировании власти{*захвата*} позволяет Вам протягивать объект, перемещая выбранные власти{*захваты*} к новым местоположениям. AutoCAD называет moveGripPointsAt () функцией, когда пользователь находится в режиме протяжения. Для некоторых объектов, однако, некоторые власти{*захваты*} двигаются объектный скорее чем протяжение этого. Эти власти{*захваты*} включают власти{*захваты*} в текстовые объекты, блоки, midpoints строк, центры кругов, центры эллипсов, и объектов пункта{*точки*}. В этих случаях{*делах*}, moveGripPointsAt () функция вызывает{*называет*} transformBy ().

ОБРАТИТЕ ВНИМАНИЕ На заданное по умолчанию выполнение AcDbEntity:: moveGripPointsAt () функция должна вызвать transformBy () функция.

Когда пользователь находится в перемещении власти{*захвата*}, вращать, масштабировать, или отражать режимы, AutoCAD называет transformBy () функцией, описанной в главе 6, “ примитивами. ”

Если Вы хотите, чтобы пользователь был способным редактировать ваш объект, используя власти{*захваты*}, вы будете должны перегрузить getGripPoints () и moveGripPointsAt () функции. Объект определяет его пункты{*точки*} власти{*захвата*} и как интерпретировать обеспеченное пользователем смещение.

Следующая выборка показывает, как заказной AsdkPoly класс осуществляет эти функции. Объект, определенный этим классом имеет пункт{*точку*} власти{*захвата*} в каждой вершине и пункте{*точке*} власти{*захвата*} в его центре. Эти пункты{*точки*} власти{*захвата*} возвращены getGripPoints () функция. Если пользователь выбирает пункт{*точку*} власти{*захвата*}, когда в режиме протяжения власти{*захвата*}, AutoCAD вызывает moveGripPointsAt () функция, проходящая в массиве индексов для выбранных пунктов{*точек*} власти{*захвата*} и трехмерного вектора, определяющего, сколько пользователя переместил устройство управления позицией. Если пользователь выбрал пункт{*точку*} власти{*захвата*} вершины, многоугольник протянут однородно указанным смещением.

Если пользователь выбрал средний пункт{*точку*} власти{*захвата*}, многоугольник просто оттранслирован количеством, равняются смещению (это значение пропускают к transformBy () функция, как показано здесь).

Acad::ErrorStatus

AsdkPoly::getGripPoints(

AcGePoint3dArray& gripPoints,

AcDbIntArray& osnapModes,

AcDbIntArray& geomIds) const

{

assertReadEnabled();

Acad::ErrorStatus es;

if ((es = getVertices3d(gripPoints)) != Acad::eOk) {

return es;

}

// Remove the duplicate point at the start/end and add

// center as the last point.

//

gripPoints. removeAt(gripPoints. length() - 1);

AcGePoint3d center;

getCenter(center);

gripPoints. append(center);

return es;

}

Acad::ErrorStatus

AsdkPoly::moveGripPointsAt(

const AcDbIntArray& indices,

const AcGeVector3d& offset)

{

if (indices. length()== 0 || offset. isZeroLength())

return Acad::eOk; //that’s easy :-)

Из за большого объема этот материал размещен на нескольких страницах:
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