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);
}
相关文章
相关标签/搜索