|
Create ** Space Viewports
Question
How can I create a new viewport in ** space and activate it? I want to let
the user specify a rectangle (like the MVIEW command) and an existing view name.
With this data I want to create a new viewport.
Answer
To create a new viewport in ** space, perform the following steps:
1. Create a new object of type AcDbViewport.
2. Set the view coordinates (with setWidth(), setHeight() and setCenterPoint()).
3. Append the new viewport to the ** space.
4. Get the view the user specified (AcDbViewTableRecord).
5. Set this view on the new viewport with acdbSetCurrentView().
6. Activate the viewport with AcDbViewport::setOn().
NOTE: The AcDbViewport::setOn() function only works if your command has been
registered without the ACRX_CMD_TRANSPARENT flag. If this flag is set,
AcDbViewport::setOn() returns with eCommandWasInProgress and you cannot activate
the viewport until you set tilemode to 1 and back to 0.
The following code demonstrates how to do this:
void fCreateViewPort()
{
// Only works in **space
AcDbObjectId mCurViewportId = acedGetCurViewportObjectId();
if (mCurViewportId == AcDbObjectId::kNull)
{
acutPrintf("\nCommand only works in **space.");
return;
}
AcDbViewport *pCurViewport;
if (Acad::eOk != acdbOpenObject(pCurViewport,mCurViewportId,AcDb::kForRead))
{
acutPrintf("\nCannot get active viewport.");
return;
}
if (pCurViewport->number() != 1)
{
acutPrintf("\nCommand only works in **space.");
pCurViewport->close();
return;
}
pCurViewport->close();
// Ask for the position
ads_point pt1,pt2;
if (RTNORM != acedGetPoint(NULL, "\nSelect first corner: ", pt1))
return;
if (RTNORM != acedGetCorner(pt1, "\nSelect second corner: ", pt2))
return;
// Ask for the view to use
char mViewName[133];
if (RTNORM != acedGetString(0, "\nEnter name of view to use: ", mViewName))
return;
// Create new viewport
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]));
// Append new viewport to ** space
AcDbBlockTable *pTable;
AcDbBlockTableRecord *pPsBTR;
if (Acad::eOk != acdbHostApplicationServices()->workingDatabase()->getBlockTable(pTable, AcDb::kForRead))
{
acutPrintf("\nCannot get block table.");
delete pViewport;
return;
}
if (Acad::eOk != pTable->getAt(ACDB_**_SPACE, pPsBTR, AcDb::kForWrite))
{
acutPrintf("\nCannot access ** space.");
pTable->close();
delete pViewport;
return;
}
pTable->close();
AcDbObjectId mViewPortId;
if (Acad::eOk != pPsBTR->appendAcDbEntity(mViewPortId, pViewport))
{
acutPrintf("\nCannot append viewport to ** space.");
pPsBTR->close();
delete pViewport;
return;
}
pPsBTR->close();
pViewport->setOn();
// Set the view
AcDbViewTable *pViewTable;
AcDbViewTableRecord *pViewTR;
if (Acad::eOk != acdbHostApplicationServices()->workingDatabase()->getViewTable(pViewTable, AcDb::kForRead))
{
acutPrintf("\nCannot get view table.");
pViewport->close();
return;
}
if (Acad::eOk != pViewTable->getAt(mViewName, pViewTR, AcDb::kForRead))
{
acutPrintf("\nCannot access view '%s'.", mViewName);
pViewport->close();
pViewTable->close();
return;
}
pViewTable->close();
if (acedSetCurrentView(pViewTR, pViewport)!=Acad::eOk)
acutPrintf("\nFailed to set view");
// Close the objects
pViewTR->close();
pViewport->close();
} |
|