//-> отключаем вывод в окне левых акадовских строк
struct resbuf cmdechoVar;
cmdechoVar.restype = RTSHORT;
cmdechoVar.resval.rint = 0;
acedSetVar(_T("cmdecho"), &cmdechoVar);
//<-
ads_name mas; //если работаем по варианту 2, то пора бы заполнить mas данными и не забыть почиститься в конце функции
AcGePoint3d p;
AcGePoint3dArray points;
ads_name plBoundary, plBoundaryPreviousStep;
if ( acdbEntLast(plBoundaryPreviousStep) != RTNORM )
{
acutPrintf(_T("\nЧертеж пустой"));
return;
}
AcDbObjectId id;
AcDbEntity * pEnt;
while(acedGetPoint(0,_T("\nВнутренняя точка: "),asDblArray(p)) == RTNORM)
{
points.append(p);
}
if(points.length() > 0)
{
for(int i= 0;i<points.length();i++)
{
/*
предпочтительней второй вариант, т.к. первый постоянно выбирает видимые объекты экрана,
и если точек больше одной, то:
- создаваемые контура будут включаться в последующие наборы, что может привести к неправильной работе команды
- постоянный выбор всех видимых объектов тормозит комп.
так что если надо включить все видимые объекты, то лучше их сразу собрать в mas и потом просто подствалять в команду.
*/
acedCommandS(
RTSTR, _T("_.-boundary"),
RTSTR, _T("_a"), // дополнительные данные
RTSTR, _T("_o"), // тип объекта для контура
RTSTR, _T("_p"), // создаваемый контур будет полилинией
RTSTR, _T("_i"), // нужно ли искать островки
RTSTR, _T("_y"), // нужно, либо _T("_n") - не нужно
RTSTR, _T("_b"), // объекты которые будут участвовать в формировании контуров
/*или 1*/RTSTR, _T("_e"), // это будут все видимые на экране объекты, либо вместо этого варианта выбрать /*2*/
/*или 2
RTSTR, _T("_n"), // новый набор
RTPICKS, mas, // указываем ads_name объектов, которые будут участвовать в команде
RTSTR, _T(""),// подтверждение
*/
RTSTR,_T(""), // возвращаемся к указанию точки
RTPOINT, asDblArray(points.at(i)), // наша точка, указанная пользователем
RTSTR,_T(""), // подтверждаем ввод точки
RTNONE // конец команды
);
acdbEntLast(plBoundary);
if (plBoundaryPreviousStep[0] == plBoundary[0] && plBoundaryPreviousStep[1] == plBoundary[1])
{
acutPrintf(_T(" %d-я точка поганая\n"),i+1);
continue;
}
// перекинули последний добавленный в акад объект
plBoundaryPreviousStep[0] = plBoundary[0];
plBoundaryPreviousStep[1] = plBoundary[1];
::acdbGetObjectId(id,plBoundary);
if(acdbOpenObject(pEnt,id,AcDb::kForWrite) == Acad::eOk)
{
pEnt->setColorIndex(i+1);
pEnt->downgradeOpen();
pEnt->draw();
pEnt->close();
}
}
}
//-> возвращаем все в зад :)
cmdechoVar.resval.rint = 1;
acedSetVar(_T("cmdecho"), &cmdechoVar);
//<-