§ Subentity Level (Уровень Подпримитивов). Вы можете определить определенные черты, которые нужно использовать для определенных частей drawable в течение worldDraw () или viewportDraw () выполнение. Вы можете использовать интерфейс AcGiSubEntityTraits, чтобы перегрузить черты, которые были определены в setAttributes () запрос. Как только значение для черты установлено, это используется для всех последующих примитивов до конца метода или пока новое значение определено.
ОБРАТИТЕ ВНИМАНИЕ В этой главе, подпримитив термина используется по-другому чем в главе 6, “примитивах”, где термин относится к определенным геометрическим частям примитива. В этой главе, подпримитив - не часть примитива; это - только уровень, на котором значения черты могут быть установлены и изменен.
§ Subprimitive Level Функции примитива оболочки имеют необязательные параметры, которые позволяют Вам определять богатый набор черт на "в край" и основание "в лицо". (См. примеры кода в “Примитивах” на странице 696.) Для любой черты, этот механизм требует, чтобы Вы установили значения для всех граней или лиц, или для ни одного из них. Вы устанавливаете только черты, которые Вы хотите. Например, Вы можете устанавливать цвета граней оболочки или поймать в сети без того, чтобы иметь необходимость устанавливать уровни или linetypes, но Вы должны определить цвет для каждого края. В добавлении, чтобы поймать в сети и черты подпримитива оболочки, имеется версия текстовой примитивной функции, которая имеет текстовый параметр стиля. Текстовый стиль может быть установлен только при подпримитиве (примитив " в текст ") уровень. Подпримитивные значения черты заменяют значения соответствующего набора черт в уровнях drawable и подпримитиве.
Черты Подпримитива
Следующие черты (свойства) могут быть назначены на уровне подпримитивов, вызывая функции члена объекта AcGiSubEntityTraits:
§ Color
§ Layer
§ Linetype
§ Fill type
§ GS marker
§ Line weight
§ Thickness
§ Line type scale
Цвет, уровень, и linetype - свойства примитива AutoCAD, так что они могут также быть установлены на уровне drawable как описано в предыдущей секции. Заполните тип, и GS маркер - не свойства примитива AutoCAD.
Перед каждым запросом к worldDraw () и viewportDraw (), AutoCAD вызывает setAttributes () чтобы позволить drawable инициализировать цвет, уровень, linetype, вес линии, толщину, и черты подпримитива масштаба типа линии. Это инициализирует, заполняют тип, чтобы соответствовать перегенеральному типу, и это инициализирует GS маркер, чтобы обнулить (нулевой маркер имеет значение “ никакой маркер ”).
Тип заполнения
Заполняющийся тип перечисленное значение, AcGiFillType, может иметь одно из двух значений:
- kAcGiFillAlways kAcGiFillNever
Примитивы, которые могут быть заполнены - круги, многоугольники, оболочки, сети, текст, образовывают дугу сектора, и образовывают дугу аккорды. Ломаные линии и простые дуги не могут быть заполнены.
Прежде, чем AutoCAD вызывает worldDraw (), это устанавливает заполняющийся тип в зависимости от перегенерального типа. Если перегенеральный тип - kAcGiStandardDisplay, AutoCAD устанавливает заполняющийся тип в kAcGiFillNever. Иначе, AutoCAD устанавливает заполняющийся тип в kAcGiFillAlways. Это значение повторно инициализировано согласно перегенеральному типу прежде, чем viewportDraw () вызван.
Если пользователь выпускает определение команды FILL, чтобы выключить режим Fill, никакие объекты не заполнены независимо от перегенерального типа. Точно так же, если пользователь явно включает режим Fill, объекты будут заполнены. Если пользователь не выпускает команду FILL, и AcGiSubEntityTraits:: setFillType () был установлен, это, режим Fill используется независимо от перегенерального типа.
GS Маркеры
GS маркеры главным образом полезен в объектном поспешном выполнении примитива.
Когда примитив отобран для объектной привязки, GS маркер для отобранной части примитива пропускают затем, чтобы указать, которые точки должны быть возвращены.
GS маркеры также используются в сочетании с функциями acedSSGet () и acedSSNameX () чтобы разрешить вашему приложению редактировать или работать на произвольных секциях ваших заказных объектов примитива. Для детального описания того, как использовать GS маркеры (не как устанавливать их), включая использование acedSSGet (), acedSSNameX (), и AcDbEntity:: getSubentPathsAtGsMarker () функции, видят “ GS Маркеры и Подпримитивы ” на странице 111.
Примеры в главе 6, “примитивах”, устанавливают GS маркер для каждого края примитива. Ваш заказной примитив может использовать маркеры, чтобы идентифицировать набор произвольных секций примитива — то есть любой последовательно выполнился, группа примитивов может быть идентифицирована единственным маркером. Секция примитива, сгенерированного группой примитивной функции вызывает, идентифицирован, предшествуя примитивам с запросом к функции AcGiSubEntityTraits setSelectionMarker (), определяя номер маркера, уникальный к объекту примитива. Ваше выполнение getSubentPathsAtGsMarker () свяжет соответствующие примитивы с данным маркером, основанным на том, как Вы устанавливаете ваши маркеры.
Полезные AcGi Константы
Следующие константы полезны, когда Вы устанавливаете или запрашиваете свойства примитива:
// Color
//
static const Adesk::UInt16 kColorByBlock = 0;
static const Adesk::UInt16 kRed = 1;
static const Adesk::UInt16 kYellow = 2;
static const Adesk::UInt16 kGreen = 3;
static const Adesk::UInt16 kCyan = 4;
static const Adesk::UInt16 kBlue = 5;
static const Adesk::UInt16 kMagenta = 6;
static const Adesk::UInt16 kWhite = 7;
static const Adesk::UInt16 kColorByLayer = 256;
// Linetype
//
static const char* const kNoLinetyping = "CONTINUOUS";
static const char* const kLinetypeByLayer = "BYLAYER";
static const char* const kLinetypeByBlock = "BYBLOCK";
// Layer
//
static const char* const kLayerZero = "0";
ОБРАТИТЕ ВНИМАНИЕ, что константа kWhite белая, если это не находится в противоречии с цветом фона, когда становится черно так, чтобы это осталось видимым. Если Вы назначаете цвет блока (setColor (0)) или цвет уровня (setColor (256)), вы будете должны сделать запрос блока или уровня для фактического номера цвета.
Пример Использования AcGi
Следующий пример иллюстрирует, как использовать AcGi. Сначала, это сохраняет текущие значения свойства примитива на цвет, linetype, и уровень. Тогда это изменяет номер цвета черты под-примитива к синему и рисует ломаную линию с тремя точками. Затем, это изменяет номер цвета черты подпримитива к текущему цвету уровня, изменяет значение linetype к DASHDOT, и рисует xline.
Типовой код включает две функции, getLinetypeFromString () и getLayerIdFromString (), которые позволяют Вам получать ID для linetype или уровня от строки.
ОБРАТИТЕ ВНИМАНИЕ Практически, эти функции могли бы также не спешить, использование в пределах worldDraw (), и объектных ID должно быть сохранено и использоваться непосредственно.
static Acad::ErrorStatus
getLinetypeIdFromString(const char* str, AcDbObjectId& id);
static Acad::ErrorStatus
getLayerIdFromString(const char* str, AcDbObjectId& id);
Adesk::Boolean
AsdkTraitsSamp::worldDraw(AcGiWorldDraw* pW)
{
// At this point, the current property traits are
// the entity’s property traits. If the current
// property traits are changed and you want to
// reapply the entity’s property traits, this is
// the place to save them.
//
Adesk::UInt16 entity_color
= pW->subEntityTraits().color();
AcDbObjectId entity_linetype
= pW->subEntityTraits().lineTypeId();
AcDbObjectId entity_layer
= pW->subEntityTraits().layerId();
// Override the current color and make it blue.
//
pW->subEntityTraits().setColor(kBlue);
// Draw a blue 3-point polyline.
//
int num_pts = 3;
AcGePoint3d *pVerts = new AcGePoint3d[num_pts];
pVerts[0] = AcGePoint3d(0.0, 0.0, 0);
pVerts[1] = AcGePoint3d(1.0, 0.0, 0);
pVerts[2] = AcGePoint3d(1.0, 1.0, 0);
pW->geometry().polyline(num_pts, pVerts);
// Force the current color to use current layer’s color.
//
pW->subEntityTraits().setColor(kColorByLayer);
// Force current line type to DASHDOT. If
// DASHDOT is not loaded, the current linetype
// will still be in effect.
//
AcDbObjectId dashdotId;
if (getLinetypeIdFromString("DASHDOT", dashdotId) == Acad::eOk)
{
pW->subEntityTraits().setLineType(dashdotId);
}
// Force current layer to "MY_LAYER". If
// "MY_LAYER" is not loaded, the current layer
// will still be in effect.
//
AcDbObjectId layerId;
if (getLayerIdFromString("MY_LAYER", layerId) == Acad::eOk)
{
pW->subEntityTraits().setLayer(layerId);
}
// Draw a DASHDOT xline in "MY_LAYER"’s color.
//
pW->geometry().xline(pVerts[0], pVerts[2]);
delete [] pVerts;
return Adesk::kTrue;
}
// A useful function that gets the linetype ID from the
// linetype’s name; the name must be in upper case.
//
static Acad::ErrorStatus
getLinetypeIdFromString(const char* str, AcDbObjectId& id)
{
Acad::ErrorStatus err;
// Get the table of currently loaded linetypes.
//
AcDbLinetypeTable *pLinetypeTable;
err = acdbHostApplicationServices()->workingDatabase()
->getSymbolTable(pLinetypeTable, AcDb::kForRead);
if (err!= Acad::eOk)
return err;
// Get the ID of the linetype with the name that
// str contains.
//
err = pLinetypeTable->getAt(str, id, Adesk::kTrue);
pLinetypeTable->close();
return err;
}
// A useful function that gets the layer ID from the
// layer’s name; the layer name must be in upper case.
//
static Acad::ErrorStatus
getLayerIdFromString(const char* str, AcDbObjectId& id)
{
Acad::ErrorStatus err;
// Get the table of currently loaded layers.
//
AcDbLayerTable *pLayerTable;
|
Из за большого объема этот материал размещен на нескольких страницах:
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 |


