找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 1913|回复: 0

[讨论]:关于AcDbViewPortTableRecord

[复制链接]
发表于 2003-7-21 16:09:44 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
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]
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|申请友链|Archiver|手机版|小黑屋|辽公网安备|晓东CAD家园 ( 辽ICP备15016793号 )

GMT+8, 2024-9-21 00:50 , Processed in 0.652752 second(s), 32 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表