找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 1969|回复: 4

zoom的ARX代码...

[复制链接]

已领礼包: 145个

财富等级: 日进斗金

发表于 2002-1-22 18:56:36 | 显示全部楼层 |阅读模式

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

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

×

  1. void arxzoom()
  2. {
  3.      AcDbViewTableRecord view;
  4.      struct resbuf rb;
  5.      struct resbuf wcs, dcs, ccs;     // ads_trans coord system flags
  6.      ads_point vpDir;
  7.      ads_point wmin, wmax;        // min and max corners of the zoom window
  8.      ads_point wdcsmax, wdcsmin;  // windows corners in device coords
  9.      AcGeVector3d viewDir;
  10.      AcGePoint2d cenPt;

  11.      ads_real    lenslength,
  12.             viewtwist,
  13.             frontz,
  14.             backz;

  15.      ads_point target;

  16.      int viewmode,
  17.         tilemode,
  18.         cvport;

  19.      // Get window to zoom to:

  20.      ads_point pt1, pt2;

  21.      if (RTNORM != ads_getpoint(NULL, "\nSelect first corner: ", pt1))
  22.         return;
  23.      if (RTNORM != ads_getcorner(pt1, "\nSelect second corner: ", pt2))
  24.         return;

  25.      // sort window corners to upper right and lower left
  26.      
  27.      if (pt1[X] >= pt2[X])
  28.      {
  29.         wmax[X] = pt1[X];
  30.         wmin[X] = pt2[X];
  31.      }
  32.      else
  33.      {
  34.         wmax[X] = pt2[X];
  35.         wmin[X] = pt1[X];
  36.      }

  37.      if (pt1[Y] >= pt2[Y])
  38.      {
  39.         wmax[Y] = pt1[Y];
  40.         wmin[Y] = pt2[Y];
  41.      }
  42.      else
  43.      {
  44.         wmax[Y] = pt2[Y];
  45.         wmin[Y] = pt1[Y];
  46.      }

  47.      wmax[Z] = 0.0;
  48.      wmin[Z] = 0.0;

  49.      wcs.restype     = RTSHORT;     // WORLD coord system flag
  50.      wcs.resval.rint = 0;
  51.      ccs.restype     = RTSHORT;     // CURRENT coord system flag
  52.      ccs.resval.rint = 1;
  53.      dcs.restype     = RTSHORT;     // DEVICE coord system flag
  54.      dcs.resval.rint = 2;

  55.      // Get the 'VPOINT' direction vector
  56.      ads_getvar("VIEWDIR", &rb);
  57.      ads_trans(rb.resval.rpoint, &ccs, &wcs, 0, vpDir);
  58.      viewDir.set(vpDir[X], vpDir[Y], vpDir[Z]);

  59.      // convert upper right window corner to DCS
  60.      ads_trans(wmax, &ccs, &dcs, 0, wdcsmax);

  61.      // convert lower left window corner to DCS
  62.      ads_trans(wmin, &ccs, &dcs, 0, wdcsmin);
  63.      
  64.      // calculate and set view center point
  65.      cenPt.set(wdcsmin[X] + ((wdcsmax[X] - wdcsmin[X]) / 2.0),
  66.           wdcsmin[Y] + ((wdcsmax[Y] - wdcsmin[Y]) / 2.0)
  67.           );
  68.      view.setCenterPoint(cenPt);

  69.      // set view height and width and direction
  70.      view.setHeight(fabs(wdcsmax[Y] - wdcsmin[Y]));
  71.      view.setWidth(fabs(wdcsmax[X] - wdcsmin[X]));
  72.      view.setViewDirection(viewDir);

  73.      // get and set other properties
  74.      ads_getvar("LENSLENGTH", &rb);
  75.      lenslength = rb.resval.rreal;
  76.      view.setLensLength(lenslength);

  77.      ads_getvar("VIEWTWIST", &rb);
  78.      viewtwist = rb.resval.rreal;
  79.      view.setViewTwist(viewtwist);

  80.      ads_getvar("FRONTZ", &rb);
  81.      frontz = rb.resval.rreal;

  82.      ads_getvar("BACKZ", &rb);
  83.      backz = rb.resval.rreal;

  84.      ads_getvar("VIEWMODE", &rb);
  85.      viewmode = rb.resval.rint;

  86.      view.setPerspectiveEnabled(viewmode & 1);
  87.      view.setFrontClipEnabled(viewmode & 2);
  88.      view.setBackClipEnabled(viewmode & 4);
  89.      view.setFrontClipAtEye(!(viewmode & 16));

  90.      ads_getvar("TILEMODE", &rb);
  91.      tilemode = rb.resval.rint;
  92.      ads_getvar("CVPORT", &rb);
  93.      cvport = rb.resval.rint;

  94.      // Paperspace flag
  95.      Adesk::Boolean paperspace =
  96.         ((tilemode == 0) && (cvport == 1)) ? Adesk::kTrue :
  97. Adesk::kFalse;
  98.      view.setIsPaperspaceView(paperspace);

  99.      if (Adesk::kFalse == paperspace)
  100.      {
  101.         view.setFrontClipDistance(frontz);
  102.         view.setBackClipDistance(backz);
  103.      }
  104.      else
  105.      {
  106.         view.setFrontClipDistance(0.0);
  107.         view.setBackClipDistance(0.0);
  108.      }
  109.      
  110.      ads_getvar("TARGET", &rb);
  111.      ads_trans(rb.resval.rpoint, &ccs, &wcs, 0, target);
  112.      view.setTarget(AcGePoint3d(target[X], target[Y], target[Z]));

  113.      // update view
  114.      acdbSetCurrentView( &view, NULL );
  115. }
复制代码
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
发表于 2002-3-14 06:35:53 | 显示全部楼层

我心中有一个疑问

我心中有一个疑问,一直困扰着我.
我在编一个缩放的程序,
目标:     
        以鼠标位置为中心,放大model视图

实施过程:
        先得到当前视图的高度,宽度,中心点
        通过消息得到鼠标的位置,        CPoint cPnt(pMsg->lParam) ;                acedCoordFromPixelToWorld (cPnt, cpt) ;
        这样得到cpt,即cad的显示坐标,再把此座标设置为,视图的中心点
        再把视图的高度乘一定的系数
        再把视图设为当前视图.

1问题:
        这样应当程序运行的第一次,视口放大移动,时的鼠标所在位
        置位应于视口中央,以后不断以正中间放大,实际上不是这样,鼠
        标所在位并不会移到正中央,会有偏移,越来越大,直至鼠标位
        置移出视口.
       
2问题:
        在你zoom的arx代码中,把很多视口参数,读出来,并没做改变的又写进去
        是干什么?如果这些参数不重写,系统不是会默认以前的当前窗口的参
        数吗?
        实际你改写的参数不是只有,centerpoint,height,width
        吗?
关键部分代码:
                        ads_getvar("viewsize", &b1);
                        height=b1.resval.rreal/scal ;
                        view.setHeight( height);
                        ads_getvar("screensize", &b2);
                                                width=b2.resval.rpoint[1]*height/b2.resval.rpoint[0];
                        view.setWidth(width);
                        CPoint cPnt(pMsg->lParam) ;
                        acedCoordFromPixelToWorld (cPnt, cpt) ;
                        AcGePoint2d cenPt(cpt[0],cpt[1]);
                        view.setCenterPoint( cenPt );
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 1个

财富等级: 恭喜发财

发表于 2003-7-17 14:52:11 | 显示全部楼层
晓东,我按照你的代码,但编译时提示acdbSetCurrentView未声明,需要哪个头文件?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 145个

财富等级: 日进斗金

 楼主| 发表于 2003-7-17 15:46:30 | 显示全部楼层
最初由 stoneball 发布
[B]晓东,我按照你的代码,但编译时提示acdbSetCurrentView未声明,需要哪个头文件? [/B]


如果在2000+上, 函数是: acedSetCurrentView(...)

你可以搜索帮助文件,了解更多情况.
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2004-3-23 14:11:46 | 显示全部楼层

如果在UCS下呢?

在UCS下斑竹的程序执行有错,那么程序该如何处理呢?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2024-9-21 13:45 , Processed in 0.240884 second(s), 38 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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