ObjectARX_符號表---->視圖

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);
}
相關文章
相關標籤/搜索