Больше чем один подпримитив могут быть связаны с одиночным маркером. В случае поля, например, маркер 4 идентифицирует более низкий передний край поля.
Если Вы просите о вершине, связанной с этим маркером, две вершина, которая формируется, оконечные точки этой строки возвращены. Если Вы просите о гранях, связанных с этим маркером, один примитив — строка — возвращен. Если Вы просите о лицах, связанных с этим маркером, данные для лицевой поверхности и нижней поверхности поля возвращены.
Путь Подпримитива
Путь подпримитива уникально идентифицирует подпримитив в пределах специфического примитива в рисунке. Этот путь, класса AcDbFullSubentPath, состоит из массива объекта IDs и объекта ID подпримитива:
{ AcDbObjectIdArray mObjectIds;
AcDbSubentId mSubentId;
}
Массив содержит объект IDs, которые определяют путь к “основному” примитиву.
Например, блочная ссылка{*справочники*} (примитив, что ссылки{*справочники*} блочный отчет{*запись*} таблицы) могли бы содержать два поля, каждый из типа AcDb3dSolid. Массив объектов ID содержит два входа: ИДЕНТИФИКАТОР блочной ссылки{*справочников*}, сопровождаемой ИДЕНТИФИКАТОРОМ основного примитива [InsertID, SolidID].
Второй элемент AcDbFullSubentPath - объект AcDbSubentId, который имеет тип подпримитива (вершина, край, или лицо) и индекс подпримитива в списке. Используйте тип функций AcDbSubentId () и index() чтобы обратиться к данным члена.
Используя предыдущий пример, второй край твердых будет иметь его AcDbFullSubentPath как
{(InsertID, solid1ID)
(kEdgeSubentType, 2)};
Если бы Вы имеете твердый только, AcDbFullSubentPath был бы следующим образом для первого
лица твердых.
{(solidID)
(kFaceSubentType, 1)};
Пример высвечивание
Пример кода позже в этом разделе показывает, как высветить подпримитив.
Следующая процедура перечисляет основные шаги.
1 Получают GS маркер для выбранного примитива от набора выборов.
2 Передают GS маркер к классу примитива, который будет преобразован{*конвертирован*} к пути подпримитива, используя getSubentPathsAtGsMarker () функция. Определите тип подпримитива, вы заинтересованы (вершина, край, лицо).
3, как только Вы имеете путь к выбранному подпримитиву, вы готовы назвать подсветку () функцией, проходящей в правильном пути подпримитива.
Выбор Примитива
Для выбора, вы будете использовать комбинацию глобальных функций. Сначала, используйте acedSSGet () функция, чтобы получить набор выборов. Тогда, используйте acedSSNameX () функция, чтобы получить подпримитив GS маркер для выбранного примитива.
int acedSSGet(
const char *str,
const void *pt1,
const ads_point pt2,
const struct resbuf *entmask,
ads_name ss);
int acedSSNameX(
struct resbuf** rbpp,
const ads_name ss,
const longvi);
Преобразование GS Маркеры к Путям Подпримитива
Используйте getSubentPathsAtGsMarker () функция, чтобы получить подпримитив для GS маркера, возвращенного acedSSNameX () функция. Законченный синтаксис для этой функции
virtual Acad::ErrorStatus
AcDbEntity::getSubentPathsAtGsMarker(
AcDb::SubentType type,
int gsMark,
const AcGePoint3d& pickPoint,
const AcGeMatrix3d& viewXform,
int& numPaths,
AcDbFullSubentPath*& subentPaths
int numInserts = 0,
AcDbObjectId* entAndInsertStack = NULL) const;
Первый параметр к этой функции - тип подпримитива, вы заинтересованы (вершина, край, или лицо). В примере закодируют в “ Высвечивание{*увеличение яркости*} - tity, ” первый запрос к этой функции определяет kEdgeSubentType, потому что вы собираетесь высвечивать соответствующий край. Второй запрос к getSubentPathsAtGsMarker () функция определяет kFaceSubentType, потому что вы собираетесь высвечивать каждое лицо, связанное с выбранным подпримитивом.
PickPoint и viewXform параметры используются как дополнительный ввод для некоторых примитивов (типа mlines) когда GS маркер один не обеспечивает достаточно информации, чтобы возвратить пути подпримитива. В примере закодируют в “ Высвечивание{*увеличение яркости*} Подпримитива, ” они не используются.
NumInserts и entAndInsertStack параметры используются для вложенных вставок. И acedNEntSel () и acedNEntSelP () функции возвращают название{*имя*} примитива уровня листа, плюс стек вставок.
Высвечивание{*увеличение яркости*} Подпримитива
Как только вы получили путь подпримитива к выбранному примитиву, самая твердая{*самая трудная*} часть этого процесса закончена. Теперь, Вы нуждаетесь только в запросе подсветка () функция и проход в пути подпримитива. Если Вы вызываете{*называете*} подсветку () функция без любых параметров, значение по умолчанию должна высветить целый примитив.
Следующий типовой код иллюстрирует шаги, описанные для выбора примитива, получение пути подпримитива, и высвечивания{*увеличения яркости*} различных типов подпримитивов, связанных с GS маркером. Этот код также иллюстрирует другую полезную функцию подпримитива:
virtual AcDbEntity*
AcDbEntity::subentPtr(const AcDbFullSubentPath& id) const;
Эта функция возвращает указатель на копию подпримитива, описанного указанным путем, который может тогда быть добавлен к базе данных (как показано в примере).
ПРИМЕЧАНИЕ ожидается, что Вы будете должны перегрузить функции getSubentPathsAtGsMarker (), getGsMarkersAtSubentPath () и subentPtr () когда, Вы создает новые подклассы AcDbEntity. Подсветка () функция, однако, осуществлена в AcDbEntity, выравнивают, и как ожидается, будет перегружен. Однако, если это перегружено, любое новое выполнение этой функции должно назвать AcDbEntity:: подсветкой () чтобы исполнить высвечивание{*увеличение яркости*}.
// Эта функция вызывает{*называет*} getObjectAndGsMarker ()
// чтобы получить объект ID твердых и его gsmarker. Это тогда вызывает
// highlightEdge (), highlightFaces (), и highlightAll () чтобы высветить выбранный
// край, все лица, окружающие тот край, и затем твердое целое.
//
void
highlightTest()
{
AcDbObjectId objId;
int marker;
if (getObjectAndGsMarker(objId, marker) != Acad::eOk)
return;
highlightEdge(objId, marker);
highlightFaces(objId, marker);
highlightAll(objId);
}
// This function uses acedSSGet() to let the user select a
// single entity. It then passes this selection set to
// acedSSNameX() to get the gsmarker. Finally, the entity name
// in the selection set is used to obtain the object ID of
// the selected entity.
//
Acad::ErrorStatus
getObjectAndGsMarker(AcDbObjectId& objId, int& marker)
{
ads_name sset;
if (acedSSGet("_:S", NULL, NULL, NULL, sset) != RTNORM) {
acutPrintf("\nacedSSGet has failed");
return Acad::eInvalidAdsName;
}
// Get the entity from the selection set and its
// subentity ID. This code assumes that the user
// selected only one item, a solid.
//
struct resbuf *pRb;
if (acedSSNameX(&pRb, sset, 0) != RTNORM) {
acedSSFree(sset);
return Acad::eAmbiguousOutput;
}
acedSSFree(sset);
// Walk the list to the third item, which is the selected
// entity’s entity name.
//
struct resbuf *pTemp;
int i;
for (i=1, pTemp = pRb;i<3;i++, pTemp = pTemp->rbnext)
{ ; }
ads_name ename;
ads_name_set(pTemp->resval. rlname, ename);
// Move on to the fourth list element, which is the gsmarker.
//
pTemp = pTemp->rbnext;
marker = pTemp->resval. rint;
acutRelRb(pRb);
acdbGetObjectId(objId, ename);
return Acad::eOk;
}
// This function accepts an object ID and a gsmarker.
// The object is opened, the gsmarker is used to get the
// AcDbFullSubentIdPath, which is then used to highlight
// and unhighlight the edge used to select the object.
// Next, the object’s subentPtr() function is used to get
// a copy of the edge. This copy is then added to the
// database. Finally, the object is closed.
//
void
highlightEdge(const AcDbObjectId& objId, const int marker)
{
char dummy[133]; // space for acedGetString pauses below
AcDbEntity *pEnt;
acdbOpenAcDbEntity(pEnt, objId, AcDb::kForRead);
// Get the subentity ID for the edge that is picked
//
AcGePoint3d pickpnt;
AcGeMatrix3d xform;
int numIds;
AcDbFullSubentPath *subentIds;
pEnt->getSubentPathsAtGsMarker(AcDb::kEdgeSubentType,
marker, pickpnt, xform, numIds, subentIds);
// At this point the subentId’s variable contains the
// address of an array of AcDbFullSubentPath objects.
// The array should be one element long, so the picked
// edge’s AcDbFullSubentPath is in subentIds[0].
//
// For objects with no edges (such as a sphere), the
// code to highlight an edge is meaningless and must
// be skipped.
//
if (numIds > 0) {
// Highlight the edge.
//
pEnt->highlight(subentIds[0]);
// Pause to let user see the effect.
//
acedGetString(0, "\npress <RETURN> to continue...",
dummy);
// Unhighlight the picked edge.
//
pEnt->unhighlight(subentIds[0]);
// Get a copy of the edge, and add it to the database.
//
AcDbEntity *pEntCpy = pEnt->subentPtr(subentIds[0]);
AcDbObjectId objId;
addToModelSpace(objId, pEntCpy);
}
delete []subentIds;
pEnt->close();
}
// This function accepts an object ID and a gsmarker.
// The object is opened, the gsmarker is used to get the
// AcDbFullSubentIdPath, which is then used to highlight
// and unhighlight faces that share the edge used to
// select the object. The object is then closed.
//
void
highlightFaces(const AcDbObjectId& objId, const int marker)
{
char dummy[133];
AcDbEntity *pEnt;
acdbOpenAcDbEntity(pEnt, objId, AcDb::kForRead);
// Get the subentIds for the faces.
//
AcGePoint3d pickpnt;
AcGeMatrix3d xform;
int numIds;
AcDbFullSubentPath *subentIds;
pEnt->getSubentPathsAtGsMarker(AcDb::kFaceSubentType,
marker, pickpnt, xform, numIds, subentIds);
// Walk the subentIds list, highlighting each face subentity.
//
for (int i = 0;i < numIds; i++) {
pEnt->highlight(subentIds[i]); // Highlight face.
// Pause to let the user see the effect.
|
Из за большого объема этот материал размещен на нескольких страницах:
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 |


