一、总述
- 模型空间:主要用于分隔窗口为几个独立的视口便于观察
- 布局空间:主要用于打印相关
二、类封装
- 在创建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(); }