Trang chủ

July 12, 2013

Tạo Viewports mới trong không gian PaperSpace

By Augusto Goncalves

Để 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:
  1. Tạo một đối tượng mới có kiểu AcDbViewport.
  2. Thiết lập tọa độ view (với các hàm setWidth(), setHeight()setCenterPoint()).
  3. Thêm viewport vào không gian paper.
  4. Lấy các thiết lập view từ người dùng (AcDbViewTableRecord).
  5. Thiết lập view có được trong viewport mới tạo ra bằng hàm acdbSetCurrentView().
  6. 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:

// 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