Пример высвечивание
Пример кода позже в этом разделе показывает, как высветить подпримитив.
Следующая процедура перечисляет основные шаги.
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.
//
acedGetString(0, "\npress <RETURN> to continue...",
dummy);
pEnt->unhighlight(subentIds[i]);
}
delete []subentIds;
pEnt->close();
}
// This function accepts an object ID. The object is opened,
// and its highlight() and unhighlight() functions are
// used with no parameters, to highlight and
// unhighlight the edge used to select the object. The
// object is then closed.
//
void
highlightAll(const AcDbObjectId& objId)
{
char dummy[133];
AcDbEntity *pEnt;
acdbOpenAcDbEntity(pEnt, objId, AcDb::kForRead);
// Highlight the whole solid.
//
pEnt->highlight();
// Pause to let user see the effect.
//
acedGetString(0, "\npress <RETURN> to continue...",
dummy);
pEnt->unhighlight();
pEnt->close();
}
Acad::ErrorStatus
addToModelSpace(AcDbObjectId &objId, AcDbEntity* pEntity)
{
AcDbBlockTable *pBlockTable;
AcDbBlockTableRecord *pSpaceRecord;
acdbHostApplicationServices()->workingDatabase()
->getSymbolTable(pBlockTable, AcDb::kForRead);
pBlockTable->getAt(ACDB_MODEL_SPACE, pSpaceRecord,
AcDb::kForWrite);
pSpaceRecord->appendAcDbEntity(objId, pEntity);
pBlockTable->close();
pEntity->close();
pSpaceRecord->close();
return Acad::eOk;
}