ZOOM 命令:缩放视图;函数
PAN 命令:移动视图;布局
VIEW 命令:视图管理器。spa
ObjectARX 中只有acedSetCurrentView函数设置视口,可是并未直接提供对应的得到当前视图相关的函数来获取当前视口, 只能经过查询系统变量的值得到当前视图的特性,建立一个新的视图对象,对其设置这些特性,将其做为当前视图。下面给出了与视图有关的系统变量:
VIEWMODE:当前视口的“查看”模式。
VIEWCTR:当前视口中视图的中心点(UCS 坐标) 。
LENSLENGTH:当前视口透视图中的镜头焦距长度(单位为毫米) 。
TARGET:当前视口中目标点的位置(以 UCS 坐标表示) 。
VIEWDIR:当前视口的观察方向(UCS) 。
VIEWSIZE:当前视口的视图高度(图形单位) 。
SCREENSIZE:以像素为单位的当前视口的大小(X 和 Y 值) 。
VIEWTWIST:当前视口相对于WCS测量的的视图旋转角度。
TILEMODE:将模型选项卡或最后一个布局选项卡置为当前。
CVPORT:当前视口的标识码。
FRONTZ:当前视口中前向剪裁平面到目标平面的偏移量。
BACKZ:得到当前视口后向剪裁平面到目标平面的偏移值。3d
AcDbViewTableRecord GetCurrentView() { AcDbViewTableRecord view; struct resbuf rb; struct resbuf wcs, ucs, dcs; // 转换坐标时使用的坐标系统标记 wcs.restype = RTSHORT; wcs.resval.rint = 0; ucs.restype = RTSHORT; ucs.resval.rint = 1; dcs.restype = RTSHORT; dcs.resval.rint = 2; // 得到当前视口的“查看”模式 acedGetVar("VIEWMODE", &rb); view.setPerspectiveEnabled(rb.resval.rint & 1);//透视 view.setFrontClipEnabled(rb.resval.rint & 2);//剪切 view.setBackClipEnabled(rb.resval.rint & 4);//回剪切 view.setFrontClipAtEye(!(rb.resval.rint & 16));//前剪切 // 当前视口中视图的中心点(UCS坐标) acedGetVar("VIEWCTR", &rb); acedTrans(rb.resval.rpoint, &ucs, &dcs, 0, rb.resval.rpoint); view.setCenterPoint(AcGePoint2d(rb.resval.rpoint[X],rb.resval.rpoint[Y])); // 当前视口透视图中的镜头焦距长度(单位为毫米) acedGetVar("LENSLENGTH", &rb); view.setLensLength(rb.resval.rreal); // 当前视口中目标点的位置(以 UCS 坐标表示) acedGetVar("TARGET", &rb); acedTrans(rb.resval.rpoint, &ucs, &wcs, 0, rb.resval.rpoint); view.setTarget(AcGePoint3d(rb.resval.rpoint[X],rb.resval.rpoint[Y], rb.resval.rpoint[Z])); // 当前视口的观察方向(UCS) acedGetVar("VIEWDIR", &rb); acedTrans(rb.resval.rpoint, &ucs, &wcs, 1, rb.resval.rpoint); view.setViewDirection(AcGeVector3d(rb.resval.rpoint[X],rb.resval.rpoint[Y],rb.resval.rpoint[Z])); // 当前视口的视图高度(图形单位) acedGetVar("VIEWSIZE", &rb); view.setHeight(rb.resval.rreal); double height = rb.resval.rreal; // 以像素为单位的当前视口的大小(X 和 Y 值) acedGetVar("SCREENSIZE", &rb); view.setWidth(rb.resval.rpoint[X] / rb.resval.rpoint[Y] * height); // 当前视口的视图扭转角 acedGetVar("VIEWTWIST", &rb); view.setViewTwist(rb.resval.rreal); // 将模型选项卡或最后一个布局选项卡置为当前 acedGetVar("TILEMODE", &rb); int tileMode = rb.resval.rint; // 设置当前视口的标识码(modelSpace视图仍是paperSpace视图) acedGetVar("CVPORT", &rb); int cvport = rb.resval.rint; // 是不是模型空间的视图 bool paperspace = ((tileMode == 0) && (cvport == 1)) ? true : false; view.setIsPaperspaceView(paperspace); if (!paperspace) { // 当前视口中前向剪裁平面到目标平面的偏移量 acedGetVar("FRONTZ", &rb); view.setFrontClipDistance(rb.resval.rreal); // 得到当前视口后向剪裁平面到目标平面的偏移值 acedGetVar("BACKZ", &rb); view.setBackClipDistance(rb.resval.rreal); } else { view.setFrontClipDistance(0.0); view.setBackClipDistance(0.0); } return view; }
视图的比例缩放:rest
void ZffCHAP4ZoomScale() { // 提示用户输入缩放的比例因子 ads_real scale; if (acedGetReal("\n输入缩放比例因子:", &scale) != RTNORM) return; // 得到当前视图 AcDbViewTableRecord view = GetCurrentView(); // 修改视图 view.setWidth(view.width() / scale); view.setHeight(view.height() / scale); // 更新视图 acedSetCurrentView(&view, NULL); }
视图的窗口缩放:code
void ZffCHAP4ZoomWindow() { // 提示用户选择定义缩放窗口的两个角点 ads_point pt1, pt2; if (acedGetPoint(NULL, "\n输入第一个角点:", pt1) != RTNORM) return; if (acedGetCorner(pt1, "\n输入第二个角点:", pt2) != RTNORM) return; // 转换坐标时使用的坐标系统标记 struct resbuf wcs, ucs, dcs; wcs.restype = RTSHORT; wcs.resval.rint = 0; ucs.restype = RTSHORT; ucs.resval.rint = 1; dcs.restype = RTSHORT; dcs.resval.rint = 2; acedTrans(pt1, &ucs, &dcs, 0, pt1); acedTrans(pt2, &ucs, &dcs, 0, pt2); AcDbViewTableRecord view = GetCurrentView(); // 设置视图的中心点 view.setCenterPoint(AcGePoint2d((pt1[X] + pt2[X]) / 2,(pt1[Y] + pt2[Y]) / 2)); // 设置视图的高度和宽度 view.setHeight(fabs(pt1[Y] - pt2[Y])); view.setWidth(fabs(pt1[X] - pt2[X])); // 将视图对象设置为当前视图 acedSetCurrentView(&view, NULL); }
视图(包括透视模式)的范围缩放:对象
void ZffCHAP4ZoomExtents() { AcDbBlockTable *pBlkTbl = NULL; AcDbBlockTableRecord *pBlkTblRcd = NULL; acdbHostApplicationServices()->workingDatabase()->getBlockTable(pBlkTbl, AcDb::kForRead); pBlkTbl->getAt(ACDB_MODEL_SPACE, pBlkTblRcd,AcDb::kForRead); pBlkTbl->close(); // 得到当前图形中全部实体的最小包围盒 AcDbExtents extent; extent.addBlockExt(pBlkTblRcd); pBlkTblRcd->close(); // 计算长方形的顶点 ads_point pt[7]; pt[0][X] = pt[3][X] = pt[4][X] = pt[7][X] = extent.minPoint().x; pt[1][X] = pt[2][X] = pt[5][X] = pt[6][X] = extent.maxPoint().x; pt[0][Y] = pt[1][Y] = pt[4][Y] = pt[5][Y] = extent.minPoint().y; pt[2][Y] = pt[3][Y] = pt[6][Y] = pt[7][Y] = extent.maxPoint().y; pt[0][Z] = pt[1][Z] = pt[2][Z] = pt[3][Z] = extent.maxPoint().z; pt[4][Z] = pt[5][Z] = pt[6][Z] = pt[7][Z] = extent.minPoint().z; // 将长方体的全部角点转移到DCS中 struct resbuf wcs, dcs; // 转换坐标时使用的坐标系统标记 wcs.restype = RTSHORT; wcs.resval.rint = 0; dcs.restype = RTSHORT; dcs.resval.rint = 2; acedTrans(pt[0], &wcs, &dcs, 0, pt[0]); acedTrans(pt[1], &wcs, &dcs, 0, pt[1]); acedTrans(pt[2], &wcs, &dcs, 0, pt[2]); acedTrans(pt[3], &wcs, &dcs, 0, pt[3]); acedTrans(pt[4], &wcs, &dcs, 0, pt[4]); acedTrans(pt[5], &wcs, &dcs, 0, pt[5]); acedTrans(pt[6], &wcs, &dcs, 0, pt[6]); acedTrans(pt[7], &wcs, &dcs, 0, pt[7]); // 得到全部角点在DCS中最小的包围矩形 double xMax = pt[0][X], xMin = pt[0][X]; double yMax = pt[0][Y], yMin = pt[0][Y]; for (int i = 1; i <= 7; i++) { if (pt[i][X] > xMax) xMax = pt[i][X]; if (pt[i][X] < xMin) xMin = pt[i][X]; if (pt[i][Y] > yMax) yMax = pt[i][Y]; if (pt[i][Y] < yMin) yMin = pt[i][Y]; } AcDbViewTableRecord view = GetCurrentView(); // 设置视图的中心点 view.setCenterPoint(AcGePoint2d((xMin + xMax) / 2,(yMin + yMax) / 2)); // 设置视图的高度和宽度 view.setHeight(fabs(yMax - yMin)); view.setWidth(fabs(xMax - xMin)); // 将视图对象设置为当前视图 Acad::ErrorStatus es = acedSetCurrentView(&view, NULL); }