admin 发表于 2024-3-14 21:00:08

[每日一码] Create Paper Space Viewports

void fCreateViewPort()
{
// Only works in paperspace
AcDbObjectId mCurViewportId = acedGetCurViewportObjectId();


if (mCurViewportId == AcDbObjectId::kNull)
{
    acutPrintf("\nCommand only works in paperspace.");
    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 paperspace.");
    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;


if (RTNORM != acedGetString(0, "\nEnter name of view to use: ", mViewName))
    return;



// Create new viewport


AcDbViewport *pViewport = new AcDbViewport;


pViewport->setWidth(fabs(pt2 - pt1));
pViewport->setHeight(fabs(pt2 - pt1));
pViewport->setCenterPoint(AcGePoint3d(pt1 + (pt2 - pt1) / 2,
      pt1 + (pt2 - pt1) / 2,
      pt1));


// Append new viewport to paper 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采用PAPER采用SPACE, pPsBTR, AcDb::kForWrite))
{
    acutPrintf("\nCannot access paper space.");
    pTable->close();
    delete pViewport;
    return;
}
pTable->close();


AcDbObjectId mViewPortId;
if (Acad::eOk != pPsBTR->appendAcDbEntity(mViewPortId, pViewport))
{
    acutPrintf("\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("\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();
}

页: [1]
查看完整版本: [每日一码] Create Paper Space Viewports