ну где-то так:
static void smProject_mytest(void)
{
// проверяем где мы находимся. должны в пространстве листа
resbuf rbtl = {NULL,RTSHORT,0};
acedGetVar(_T("TILEMODE"),&rbtl);
if (rbtl.resval.rint == 1) return;// в пространстве модели
ads_point pt1,pt2;
AcDbBlockTable *pTable;
AcDbBlockTableRecord *pPsBTR;
AcDbViewTable *pViewTable;
AcDbViewTableRecord *pViewTR;
if (RTNORM != acedGetPoint(NULL, L"\nПервая точка рамки вьюпорта: ", pt1))return;
if (RTNORM != acedGetCorner(pt1, L"\nВторая точка рамки вьюпорта: ", pt2))return;
// создаем вьюпорт
AcDbViewport *pViewport = new AcDbViewport;
pViewport->setWidth(fabs(pt2[X] - pt1[X]));
pViewport->setHeight(fabs(pt2[Y] - pt1[Y]));
pViewport->setCenterPoint(AcGePoint3d(pt1[X] + (pt2[X] - pt1[X]) / 2, pt1[Y] + (pt2[Y] - pt1[Y]) / 2, pt1[Z]));
// а это наши координаты в модели, которые будут видны
AcGePoint2d max = AcGePoint2d(2000.0,1000.0);
AcGePoint2d min = AcGePoint2d(200.0,300.0);
pViewport->setViewCenter(AcGePoint2d((max[X]+min[X])/2,(max[Y]+min[Y])/2));
pViewport->setViewHeight((max[Y]-min[Y])+0.5);
// добавляем его в пространство листа
if (Acad::eOk != acdbHostApplicationServices()->workingDat abase()->getBlockTable(pTable, AcDb::kForRead))
{
acutPrintf(L"\nНе вышло достучаться к BlockTable.");
delete pViewport;
return;
}
if (Acad::eOk != pTable->getAt(ACDB_PAPER_SPACE, pPsBTR, AcDb::kForWrite))
{
pTable->close();
delete pViewport;
return;
}
pTable->close();
AcDbObjectId mViewPortId;
if (Acad::eOk != pPsBTR->appendAcDbEntity(mViewPortId, pViewport))
{
pPsBTR->close();
delete pViewport;
return;
}
pPsBTR->close();
pViewport->setOn();
pViewport->close();
}