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); }