Để tạo mới một viewport trong không gian PaperSpace, giống như lệnh MVIEW, thực hiện theo các bước sau:
- Tạo một đối tượng mới có kiểu AcDbViewport.
- Thiết lập tọa độ view (với các hàm setWidth(), setHeight() và setCenterPoint()).
- Thêm viewport vào không gian paper.
- Lấy các thiết lập view từ người dùng (AcDbViewTableRecord).
- Thiết lập view có được trong viewport mới tạo ra bằng hàm acdbSetCurrentView().
- Kích hoạt viewport với hàm AcDbViewport::setOn().
CHÚ Ý: Hàm AcDbViewport::setOn() chỉ làm việc nếu lệnh của bạn được đăng ký mà không có flag ACRX_CMD_TRANSPARENT. Nếu không, AcDbViewport::setOn() sẽ trả về eCommandWasInProgress và bạn không thể kích hoạt viewport cho đến khi đặt biến TILEMODE bằng 1 rồi trở về 0. avnd you cannot activate the viewport until you set tilemode to 1 and back to 0.
Dưới đây là mã nguồn thực hiện:
Dưới đây là mã nguồn thực hiện:
// Only works in paperspace
AcDbObjectId mCurViewportId = acedGetCurViewportObjectId();
if (mCurViewportId == AcDbObjectId::kNull)
{
acutPrintf(_T("\nCommand only works in paperspace."));
return;
}
AcDbViewport *pCurViewport;
if (Acad::eOk != acdbOpenObject(pCurViewport,mCurViewportId,
AcDb::kForRead))
{
acutPrintf(_T("\nCannot get active viewport."));
return;
}
if (pCurViewport->number() != 1)
{
acutPrintf(_T("\nCommand only works in paperspace."));
pCurViewport->close();
return;
}
pCurViewport->close();
// Ask for the position
ads_point pt1,pt2;
if (RTNORM != acedGetPoint(NULL,
_T("\nSelect first corner: "), pt1))
return;
if (RTNORM != acedGetCorner(pt1,
_T("\nSelect second corner: "), pt2))
return;
// Ask for the view to use
ACHAR mViewName[133];
if (RTNORM != acedGetString(0,
_T("\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 paper space
AcDbBlockTable *pTable;
AcDbBlockTableRecord *pPsBTR;
if (Acad::eOk != acdbHostApplicationServices()->
workingDatabase()->getBlockTable(pTable, AcDb::kForRead))
{
acutPrintf(_T("\nCannot get block table."));
delete pViewport;
return;
}
if (Acad::eOk != pTable->getAt(ACDB_PAPER_SPACE, pPsBTR,
AcDb::kForWrite))
{
acutPrintf(_T("\nCannot access paper space."));
pTable->close();
delete pViewport;
return;
}
pTable->close();
AcDbObjectId mViewPortId;
if (Acad::eOk != pPsBTR->appendAcDbEntity(mViewPortId, pViewport))
{
acutPrintf(_T("\nCannot append viewport to paper 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(_T("\nCannot get view table."));
pViewport->close();
return;
}
if (Acad::eOk != pViewTable->getAt(mViewName,
pViewTR, AcDb::kForRead))
{
acutPrintf(_T("\nCannot access view '%s'."), mViewName);
pViewport->close();
pViewTable->close();
return;
}
pViewTable->close();
if (acedSetCurrentView(pViewTR, pViewport)!=Acad::eOk)
acutPrintf(_T("\nFailed to set view"));
// Close the objects
pViewTR->close();
pViewport->close();
No comments:
Post a Comment