30/08/2013
Выбор примитивов пространства Модели из пространства Листа без предварительного выбора видового экрана средствами ObjectARX
Вопрос:
Как можно выбрать примитивы Модели находясь в Листе без предварительного выбора видового экрана?
Ответ:
В ObjectARX есть недокументированная функция acedNEntSelPEx(), которая позволяет сделать именно это. Она даже позволяет передать точку указания при помощи параметра ‘pickflag’, так что вы сами можете обеспечить точку в пространстве листа.
Вот пример кода:
Код - C++: [Выделить]
- extern int acedNEntSelPEx ( const TCHAR *str, ads_name entres,
- ads_point ptres, int pickflag,
- ads_matrix xformres,
- struct resbuf **refstkres,
- unsigned int uTransSpaceFlag,
- int* gsmarker);
- static void asdkSelectEnt_sel(void)
- {
- int gsmarker = -1;
- ads_name ename;
- struct resbuf *rbChain;
- ads_point selPt;
- ads_matrix tranMat;
- // Выбираем единственный объект. Если это вставка блока или подпримитив внутри блока,
- // тогда rbChain не будет равным null.
- unsigned int uTransSpaceFlag = 1;
- // установим uTransSpaceFlag в 0, если текущее пространство – пространство модели
- struct resbuf rb;
- acedGetVar(_T("CVPORT"), &rb);
- if (rb.resval.rint != 1)
- uTransSpaceFlag = 0; // Model space
- // А теперь выберем примитив
- int stat = acedNEntSelPEx(_T("\nВыберите объект: "), ename,
- selPt, 0, tranMat, &rbChain, uTransSpaceFlag, &gsmarker);
- // Если все нормально
- if (RTNORM == stat)
- {
- // открываем выбранный примитив
- AcDbObjectId objId;
- acdbGetObjectId(objId,ename);
- AcDbObjectPointer<AcDbEntity> pEnt(objId,AcDb::kForRead);
- if (pEnt.openStatus() == Acad::eOk)
- pEnt->list();
- }
- }
Источник: http://adndevblog.typepad.com/autocad/2012/12/selecting-objects-from-paperspace-into-modelspace-without-pre-selecting-a-viewport-using-objectarx.html
Обсуждение: http://adn-cis.org/forum/index.php?topic=194
Опубликовано 30.08.2013