Да, речь идет по прежнему об аксонометрии и вставке ее в тот же документ, что и модель.
Примитивы при построении используются только AcDbLine и AcDbSpline.
Дело в том, что если оставлять неподвижные элементы видимыми перед их драгом, они существенно загрязняют чертеж во время определения места вставки.
Конечно, это не смертельно, но просто по-человечески хочется их отодвинуть, чтобы они не светили без надобности.
Эти вещи совершенно элементарно делаются в MicroStation, и поэтому я, как лбом о стенку, пытаюсь сделать тоже самое и здесь :)
Ваш код работает, но результат тот же...
//...........
ads_name ss2;
acedSSAdd(NULL, NULL, ss2);
// AcDbObjectIdArray basket_ids -
имеющийся набор элементов для отрисовки, который требуется таскать
// добавляем в selection set
for (int i = 0; i<basket_ids.length(); i++)
{
ads_name name;
Acad::ErrorStatus es = acdbGetAdsName(name, basket_ids[i]);
if (es == Acad::eOk)
acedSSAdd(name, ss2, ss2);
}
// поехали таскать
if (!(RTNORM != acedSSLength( ss2, &length ) || 0 == length))
{
int rc;
ads_point return_pt;
AcGePoint3d Base(0.,0.,0.); // использую центр
//============ Ваш код =================
ads_point wcsBase;
acdbUcs2Wcs(asDblArray(Base),wcsBase,false);
ads_point dcsPt,wcsPt;
CPoint pt;
GetCursorPos(&pt);
acedGetAcadDwgView()->ScreenToClient(&pt);
acedCoordFromPixelToWorld(pt, dcsPt);
struct resbuf dcs, ucs;
dcs.restype = RTSHORT; dcs.resval.rint = 2; // DCS
ucs.restype = RTSHORT; ucs.resval.rint = 0; // WCS
// Преобразуем координаты курсора в WCS
acedTrans(dcsPt, &dcs, &ucs, FALSE, wcsPt);
AcGeMatrix3d mat; mat.setToTranslation(asPnt3d(wcsPt)-asPnt3d(wcsBase));
// Перенесли примитивы в новую базовую точку
acedXformSS(ss2, mat.entry);
actrTransactionManager->flushGraphics();
acedUpdateDisplay ();
acedPrompt("");
acdbWcs2Ucs(wcsPt,asDblArray(Base),false);
memcpy(CMT, AcGeMatrix3d::kIdentity.entry, sizeof(ads_matrix));
// Здесь делаем примитивы видимыми
for (int i = 0; i<basket_ids.length(); i++)
{
AcDbEntity* pEnt;
Acad::ErrorStatus es =
acdbOpenAcDbEntity(pEnt, basket_ids[i], AcDb::kForWrite);
if (es == Acad::eOk)
{
pEnt->setVisibility(AcDb::kVisible);
pEnt->close();
}
}
if (acedDragGen(
ss2,
"\nУкажите точку для центра аксонометрии:\n",
0,
drag , // функцию см. ниже
return_pt
) == RTNORM)
{
// Здесь нужно сформирвать CMT на основе p
ads_matrix mat;
drag(return_pt, mat);
acedXformSS(ss2,CMT);
}
else
{
// удаляем все объекты, так как отказались рисовать
for (int i = 0; i<basket_ids.length(); i++)
{
ads_name name;
Acad::ErrorStatus es = acdbGetAdsName(name, basket_ids[i]);
if (es == Acad::eOk)
acdbEntDel(name);
}
}
}
acedSSFree( ss2 );
//..............
//////////////////////////////////////
// функция динамики курсора
int drag(ads_point pt, ads_matrix mat)
{
ads_point tp;
int axis;
AcGePoint3d pPt = asPnt3d(pt);
AcGePoint3d pBase(0.,0.,0.);
acdbUcs2Wcs(asDblArray(pBase), asDblArray(pBase),false);
acdbUcs2Wcs(asDblArray(pPt), asDblArray(pPt),false);
AcGeVector3d v = pPt - pBase;
AcGeMatrix3d gMat;
gMat.setToTranslation(v);
memcpy(mat, gMat.entry, sizeof(ads_matrix));
memcpy(CMT, mat, sizeof(ads_matrix));
return RTNORM;
}
При acedSSAdd(...) элементы не клонируются?
Мне кажется, собака здесь порылась...
Может просто закинуть все это хозяйство за пределы вьюпорта перед драгом, и все дела...