- UID
- 7273
- 积分
- 0
- 精华
- 贡献
-
- 威望
-
- 活跃度
-
- D豆
-
- 在线时间
- 小时
- 注册时间
- 2002-7-4
- 最后登录
- 1970-1-1
|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
×
AcDbViewportTableRecord对象类似于命名视图。虽然AutoCAD调用AcDbViewPortTableRecord和AcDbViewport实体的视窗,但不应把它们混在一起。注:AcDbViewPortTableRecord用于模型空间,表示视窗的组合;AcDbViewport实体用以图形空间中。
AcDbViewPortTable是唯一一个具有非唯一关键字字符串的符号表。多个视窗表记录能共享同一个关键字字符串,并因此形成一个所谓的视窗组合(Viewport configuration).
如果AutoCAD用户再次调用一个视窗组合,程序将图形的模型空间视图分成相应数量的视窗。每个视窗就像一个小屏幕,显示
了模型的不同视图和不同的可视辅助功能(如栅格等)。
视窗组合中的视窗必须平铺放置,也就是说它们必须覆盖整个模型空间的视图区并且不能重叠。这就是AcDbViewPortTableRecord和AcDbViewport实体的主要区别,AcDbViewport实体位于布局中,可以分离和重叠。
视窗组合能包含多达16个的视窗表记录。每个图形数据库至少需要一个名为"*ACTIVE"的视窗组合,而"*ACTIVE"的视窗组合又至少包含一个视窗表记录。
以上内容摘至《AutoCAD2000对象从入门到精通》。
我从网上摘的一下代码用于取得当前视窗的AcDbViewportTableRecord:
Question
How can I get an AcDbViewTableRecord that is filled with the values of the current view?
Answer
To obtain an AcDbViewTableRecord with the current settings, you will have to
build one using the relevant system variables (unless your current view is a
named view). The sample below constructs an AcDbViewTableRecord from the
current settings, and modifies the view twist.
void Test()
{
AcDbViewTableRecord view;
struct resbuf var;
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", &var);
view.setPerspectiveEnabled(var.resval.rint & 1);
view.setFrontClipEnabled(var.resval.rint & 2);
view.setBackClipEnabled(var.resval.rint & 4);
view.setFrontClipAtEye(!(var.resval.rint & 16));
acedGetVar("BACKZ", &var);
view.setBackClipDistance(var.resval.rreal);
acedGetVar("VIEWCTR", &var);
acedTrans(var.resval.rpoint, &UCS, &DCS, NULL, var.resval.rpoint);
view.setCenterPoint(AcGePoint2d(var.resval.rpoint[X],var.resval.rpoint[Y]));
acedGetVar("FRONTZ", &var);
view.setFrontClipDistance(var.resval.rreal);
acedGetVar("LENSLENGTH", &var);
view.setLensLength(var.resval.rreal);
acedGetVar("TARGET", &var);
acedTrans(var.resval.rpoint, &UCS, &WCS, NULL, var.resval.rpoint);
view.setTarget(AcGePoint3d(var.resval.rpoint[X], var.resval.rpoint[Y],var.resval.rpoint[Z]));
acedGetVar("VIEWDIR", &var);
acedTrans(var.resval.rpoint, &UCS, &WCS, TRUE, var.resval.rpoint);
view.setViewDirection(AcGeVector3d(var.resval.rpoint[X],var.resval.rpoint[Y], var.resval.rpoint[Z]));
acedGetVar("VIEWSIZE", &var);
view.setHeight(var.resval.rreal);
view.setWidth(1);
acedGetVar("VIEWTWIST", &var);
view.setViewTwist(var.resval.rreal + 0.1);
// add some twist
acedSetCurrentView( &view, NULL );
return;
}
下面是我的几个问题:
1. 能否用ARX构造一个视窗组合并将其设置为当前视窗组合。
2. 在多个视窗的前提下,能否在未激活的视窗中调用acedGrDraw函数绘制(注意:我这里是要求在未被激活的视窗中调用)
3. 能否确切的取得当前视窗的AcDbViewTableRecord,从上述代码所述,必须去考察AutoCAD中的各个变量,这样很不爽。
以上浅见,权当抛砖引玉。
[B]Question[/B] |
|