(1)注册一个命令
static void AAAMyGroupCreateVPortInSpace(){
}
(2)指定当前布局
Acad::ErrorStatus es = acdbHostApplicationServices()->layoutManager()
->setCurrentLayout(TEXT("布局1"));
if (es != Acad::eOk)
{
return;
}
setCurrentLayout:这个函数设置名为"布局1"的布局,作为pDb指向的数据库中的当前布局。
(3)获得块表
AcDbBlockTable *pBlkTbl = NULL;
acdbHostApplicationServices()->workingDatabase()
->getBlockTable(pBlkTbl, AcDb::kForRead);
getBlockTable函数:以模式指定的"kForRead"模式打开数据库的块表。pBlkTbl指针被填入块表的地址。
(4)获得图纸空间的块表记录
AcDbBlockTableRecord *pBlkTblRcd = NULL;
pBlkTbl->getAt(ACDB_PAPER_SPACE, pBlkTblRcd, AcDb::kForWrite);
pBlkTbl->close();
getAt():这个函数搜索带有名称"ACDB_PAPER_SPACE"的记录的块表。
如果找到,它将在openMode指定的" AcDb::kForWrite"模式下打开记录
如果打开操作成功,则用pBlkTblRcd返回打开的记录。
(5) 创建新的布局对象
AcDbViewport *pViewport = new AcDbViewport();
pViewport->setCenterPoint(AcGePoint3d(100, 50, 0));
pViewport->setHeight(80);
pViewport->setWidth(120);
(6)将新的布局对象添加到图纸空间块表记录中
AcDbObjectId viewportId;
pBlkTblRcd->appendAcDbEntity(viewportId, pViewport);
appendAcDbEntity这个函数将pViewport添加到数据库和块表记录pBlkTblRcd中。
如果操作成功,则viewportId被设置为新添加实体pViewport的AcDbObjectId。
(7)关闭视口指针,关闭块表记录
pViewport->close();
pBlkTblRcd->close();
(8)将新建的视口作为当前视口
if (acdbOpenObject(pVP, viewportId, AcDb::kForWrite) == Acad::eOk)
{
pViewport->setOn();//创建浮动窗口之后哦,要想启用该视口,必须使用
acedSetCurrentVPort(pVP);
pVP->close();
}
acdbOpenObject:这个函数提供了一种方法来打开任何数据库对象,而不知道对象是否来自AcDbEntity;
这个函数在一个空指针pVP中传递;要打开的对象的对象ID是viewportId。
setOn函数:会打开viewport,这样就可以在屏幕上显示它的视图
(9)效果
(10)整个项目的源代码
static void AAAMyGroupCreateVPortInSpace() {
// Put your command code here
//指定当前布局
Acad::ErrorStatus es = acdbHostApplicationServices()->layoutManager()
->setCurrentLayout(TEXT("布局1"));//这个函数设置名为"布局1"的布局,作为pDb指向的数据库中的当前布局。
if (es != Acad::eOk)
{
return;
}
//获得块表
AcDbBlockTable *pBlkTbl = NULL;
acdbHostApplicationServices()->workingDatabase()
->getBlockTable(pBlkTbl, AcDb::kForRead);//以模式指定的"kForRead"模式打开数据库的块表。pBlkTbl指针被填入块表的地址。
//获得图纸空间的块表记录
AcDbBlockTableRecord *pBlkTblRcd = NULL;
pBlkTbl->getAt(ACDB_PAPER_SPACE, pBlkTblRcd, AcDb::kForWrite);
pBlkTbl->close();
//getAt():这个函数搜索带有名称"ACDB_PAPER_SPACE"的记录的块表。
//如果找到,它将在openMode指定的" AcDb::kForWrite"模式下打开记录
//如果打开操作成功,则用pBlkTblRcd返回打开的记录。
//创建新的布局对象
AcDbViewport *pViewport = new AcDbViewport();
pViewport->setCenterPoint(AcGePoint3d(100, 50, 0));
pViewport->setHeight(80);
pViewport->setWidth(120);
//将新的布局对象添加到图纸空间块表记录中
AcDbObjectId viewportId;
pBlkTblRcd->appendAcDbEntity(viewportId, pViewport);
//appendAcDbEntity这个函数将pViewport添加到数据库和块表记录pBlkTblRcd中。
//如果操作成功,则viewportId被设置为新添加实体pViewport的AcDbObjectId。
pViewport->close();
pBlkTblRcd->close();
//将新建的视口作为当前视口
AcDbViewport *pVP = NULL;
if (acdbOpenObject(pVP, viewportId, AcDb::kForWrite) == Acad::eOk)
{
pViewport->setOn();//创建浮动窗口之后哦,要想启用该视口,必须使用
acedSetCurrentVPort(pVP);
pVP->close();
}
//acdbOpenObject:这个函数提供了一种方法来打开任何数据库对象,而不知道对象是否来自AcDbEntity;
//这个函数在一个空指针pVP中传递;要打开的对象的对象ID是viewportId
//setOn函数:会打开viewport,这样就可以在屏幕上显示它的视图,只要这个viewport是活动的
}
参考资料:
《AutoCAD ObjectARX(VC)开发基础与实例教程》