ObjectARX(VC)-符号表之视口-在图纸空间创建一个新的视口

(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)开发基础与实例教程》

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

取消
昵称表情代码图片