objectArx---视口表

一、总述

  • 模型空间:主要用于分隔窗口为几个独立的视口便于观察
  • 布局空间:主要用于打印相关

二、类封装

  • 在创建SymbolTable筛选器中添加(以第(三)篇文件结构为基础)
  • Vport.h
    #pragma once
    class Vport
    {
    public:
    	Vport();
    	~Vport();
    
    	// (有缺陷,以后改进)创建均分视口:传入关键字1v(默认)或2v
    	static void CreateVports(const CString &mode = _T("1v"));
    	// 布局中添加视口:布局名称、视口中心、视口宽、视口高
    	static void InSpace(const CString &space, 
    						const AcGePoint3d &pc, 
    						double width, 
    						double height);
    };
    
  • Vport.cpp
    #include "stdafx.h"
    #include "Vport.h"
    #include "acedCmdNF.h"
    
    Vport::Vport() {};
    Vport::~Vport() {};
    
    // (有缺陷,以后改进)创建均分视口:传入关键字1v(默认)或2v
    void Vport::CreateVports(const CString &mode)
    {	// 获得视图表
    	AcDbViewportTable *pVPortTbl = NULL;
    	acdbHostApplicationServices()->workingDatabase()->
    					getViewportTable(pVPortTbl, AcDb::kForWrite);
    
    	// 创建四个视图记录
    	AcDbViewportTableRecord *pVPortTblRcd1 = new AcDbViewportTableRecord();
    	AcDbViewportTableRecord *pVPortTblRcd2 = new AcDbViewportTableRecord();
    	AcDbViewportTableRecord *pVPortTblRcd3 = new AcDbViewportTableRecord();
    	AcDbViewportTableRecord *pVPortTblRcd4 = new AcDbViewportTableRecord();
    
    	// 设置各个视口的对角点,相同视口表记录的名称会被当做一组来同时使用
    	// 点为实际点位置
    	AcGePoint2d plb(0, 0), pcb(0.5, 0), prt(1, 1), pct(0.5, 1);
    
    	CString vportsname;
    
    	if (mode == _T("1v"))
    	{
    		vportsname = _T("1VPorts");
    		pVPortTbl->erase(_T("2VPorts"));
    
    		pVPortTblRcd1->setLowerLeftCorner(plb);
    		pVPortTblRcd1->setUpperRightCorner(prt);
    		pVPortTblRcd1->setName(vportsname);
    		pVPortTbl->add(pVPortTblRcd1);
    		
    	}
    	else if (mode == _T("2v"))
    	{
    		vportsname = _T("2VPorts");
    		pVPortTbl->erase(_T("1VPorts"));
    
    		pVPortTblRcd1->setLowerLeftCorner(pcb);
    		pVPortTblRcd1->setUpperRightCorner(prt);
    		pVPortTblRcd1->setName(vportsname);
    		pVPortTbl->add(pVPortTblRcd1);
    
    		pVPortTblRcd2->setLowerLeftCorner(plb);
    		pVPortTblRcd2->setUpperRightCorner(pct);
    		pVPortTblRcd2->setName(vportsname);
    		pVPortTbl->add(pVPortTblRcd2);
    	}
    
    	pVPortTbl->close();
    	pVPortTblRcd1->close();
    	pVPortTblRcd2->close();
    	pVPortTblRcd3->close();
    	pVPortTblRcd4->close();
    
    	acedCommandS(RTSTR, _T(".-VPORTS"),
    		RTSTR, _T("R"),
    		RTSTR, vportsname,
    		RTNONE);
    
    }
    
    // 布局中添加视口:布局名称、视口中心、视口宽、视口高
    void Vport::InSpace(const CString &space, 
    					const AcGePoint3d &pc,
    					double width, 
    					double height)
    {	// 布局管理器中切换当前视口为布局1
    	Acad::ErrorStatus es = acdbHostApplicationServices()->
    		layoutManager()->setCurrentLayout(space);
    	// 如果失败,直接返回主程序
    	if (es != Acad::eOk)
    		return;
    	// 块表->布局空间块表记录->关闭块表
    	AcDbBlockTable *pBlkTbl = NULL;
    	acdbHostApplicationServices()->workingDatabase()->
    		getBlockTable(pBlkTbl, AcDb::kForRead);
    	AcDbBlockTableRecord *pBlkTblRcd = NULL;
    	pBlkTbl->getAt(ACDB_PAPER_SPACE, pBlkTblRcd, AcDb::kForWrite);
    	pBlkTbl->close();
    
    	// 新建视口:设置中心点,宽,高
    	AcDbViewport *pViewport = new AcDbViewport();
    	pViewport->setCenterPoint(pc);
    	pViewport->setHeight(height);
    	pViewport->setWidth(width);
    
    	// 添加进视口记录中:返回记录id  viewportId
    	AcDbObjectId viewportId;
    	pBlkTblRcd->appendAcDbEntity(viewportId, pViewport);
    	pViewport->close();
    	pBlkTblRcd->close();
    
    	// 创建布局视口表对象,区别于AcDbViewportTable(模型视口表对象)
    	AcDbViewport *pVP = NULL;
    	if (acdbOpenObject(pVP, viewportId, AcDb::kForWrite) == Acad::eOk)
    	{	// 添加后要显示视口必须打开
    		pVP->setOn();
    		// 把新建的视口设成当前活动视口
    		acedSetCurrentVPort(pVP);
    		pVP->close();
    	}
    }
    

三、测试代码

  • Commands.h
    #include "stdafx.h"
    
    void AddCommands();
    // 创建均分视口
    void Create2Vports();
    // 在布局中添加固定大小视口
    void CreateVportsInSpace();
    // 在模型创建唯一一个视口
    void CreateVportsInModel();
    
  • Commands.cpp
    #include "stdafx.h"
    #include "Commands.h"
    #include "Editor.h"
    #include "Vport.h"
    
    void AddCommands()
    {	// 创建2个视口:根据当前模型或布局动态创建
    	Editor::AddCommand(L"create2v", ACRX_CMD_MODAL, Create2Vports);
    	// 在布局空间中创建视口
    	Editor::AddCommand(L"createvinspace", ACRX_CMD_MODAL, CreateVportsInSpace);
    	// 在布局空间中创建视口
    	Editor::AddCommand(L"create1v", ACRX_CMD_MODAL, CreateVportsInModel);
    }
    // 创建均分视口
    void Create2Vports()
    {
    	CString mode = _T("2v");
    	Vport::CreateVports(mode);
    }
    // 在布局中添加固定大小视口
    void CreateVportsInSpace()
    {
    	AcGePoint3d pt(50, 100, 0);
    	CString space = _T("布局1");
    	Vport::InSpace(space, pt, 100, 50);
    }
    // 在模型创建唯一一个视口
    void CreateVportsInModel()
    {
    	Vport::CreateVports();
    }
    

传送门 返回 列表

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值