找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 2812|回复: 19

“放缩”VIEWPORT的ARX代码...

[复制链接]

已领礼包: 145个

财富等级: 日进斗金

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

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

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

×

  1. SCALING VIEWPORTS
  2. Product AUTOCAD  Author SZILVASY,ALBERT
  3. Date 12-MAY-98  Document ID 7138
  4. Expiration date    Attachments  
  5. Keywords ARX

  6. Developer Consulting Group technical solution. Autodesk confidential, for ADN members only. Please read the disclaimer

  7. Question


  8. I want to scale my floating model space viewports. How can I do this with
  9. ObjectARX?


  10. Answer


  11. You can calculate this scale of a floating paper space viewport (VIEWPORT
  12. entity) based on the:
  13. - "View height" (DXF group code: 1040).
  14. - "Height" (DXF group code: 41).

  15. Scale = Height/View height
  16. (see the AutoCAD Customization Guide for details about dxf codes)

  17. Using this equation, here's how you can set up the scale of the floating
  18. viewport (current viewport).


  19. void test()
  20. {
  21.     double scale;
  22.     if (ads_getreal("Enter scale:", &scale) != RTNORM)
  23.      return;
  24.     AcDbObjectId idVp;
  25.     if ((idVp=acdbGetCurViewportObjectId())==AcDbObjectId::kNull){
  26.      ads_printf("No current viewport. (tilemode=1?)\n");
  27.      return;
  28.     }
  29.     AcDbViewport* pVp;
  30.     Acad::ErrorStatus es;
  31.     if ((es=acdbOpenObject(pVp,idVp,AcDb::kForWrite))==Acad::eOk){
  32.      double height = pVp->height();
  33.      AcDbViewTableRecord view;
  34.      AcGePoint2d max = acdbCurDwg()->limmax(),
  35.                     min = acdbCurDwg()->limmin();      
  36.      //set up the AcDbViewTableRecord with the appropriate parameters
  37.      view.setCenterPoint( min + (max - min) / 2.0 );
  38.      view.setHeight( height/scale );
  39.      view.setWidth(0); //make sure that width is smaller than height
  40.      //set the view to the current floating viewport   
  41.      if ((es=acdbSetCurrentView( &view, pVp))==Acad::eOk)
  42.         ads_printf("Scale set to %f.\n",scale);
  43.      else
  44.         ads_printf("Failed to set scale.\n");
  45.      pVp->close();
  46.     }
  47.     if (es!=Acad::eOk)
  48.      ads_printf("ERROR: es = %s\n",acadErrorStatusText(es));
  49. }

  50. Disclaimer

  51. This information is derived from a response to a specific question sent to the Developer Consulting Group at Autodesk, and thus given its nature, is subject to change without notice. The information is provided to you on an "as is" basis, and you may use it only at your own risk. Autodesk is not responsible for its quality, nor shall it be liable for any damage or loss caused by your use of this information.

  52. Top
复制代码
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
发表于 2002-3-10 09:13:27 | 显示全部楼层
((idVp=acdbGetCurViewportObjectId())==AcDbObjectId::kNull){
     ads_printf("No current viewport. (tilemode=1?)\n");
tilemode 这个系统变量到底应取多少呢?一旦运行,总会找不到curvieport,而显示tilemode=1?,如果改为零,试图纸空间也不行。文提出在那呢?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 145个

财富等级: 日进斗金

 楼主| 发表于 2002-3-10 09:22:32 | 显示全部楼层
最初由 风中的沙粒 发布
[B]((idVp=acdbGetCurViewportObjectId())==AcDbObjectId::kNull){
     ads_printf("No current viewport. (tilemode=1?)\n");
tilemode 这个系统变量到底应取多少呢?一旦运行,总会找不到curvieport,而显示tilem... [/B]


给你一个函数,判断是否在“图纸空间”下


  1. BOOL purePaperSpace()

  2. {

  3. struct resbuf res;

  4. int tilemode, cvport;

  5. acedGetVar("tilemode", &res);

  6. tilemode = res.resval.rint;

  7. acedGetVar("cvport", &res);

  8. cvport = res.resval.rint;

  9. if(tilemode == 0 && cvport == 1)

  10. return TRUE;

  11. else

  12. return FALSE;

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

使用道具 举报

发表于 2002-3-10 09:44:09 | 显示全部楼层
实际上,我的目的是,在是R14中实现 自己控制的real zoom and pan 方法,而且你刚才领会错了我的意思,我并不想判断是不是在图纸空间,tilemode这个系统变量为0时,不就是图纸空间吗,一可以在r14下试一下你提供test
经明白是怎么一回事了,另外我想知道,autocad 的新闻组,我只能订阅,不能提问题,怎么注册
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 145个

财富等级: 日进斗金

 楼主| 发表于 2002-3-10 09:48:11 | 显示全部楼层
最初由 风中的沙粒 发布
[B]实际上,我的目的是,在是R14中实现 自己控制的real zoom and pan 方法,而且你刚才领会错了我的意思,我并不想判断是不是在图纸空间,tilemode这个系统变量为0时,不就是图纸空间吗,一可以在r14下试一下你提供test... [/B]


其中一个问题你是问得TILMODE如何取值啊:)
关于判断是否在图纸空间的,TILEMODE=0不一定是唯一条件,还得判断cvport是否等于1,两个同时满足,才一定是在图纸空间下。

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

使用道具 举报

发表于 2002-3-13 00:47:25 | 显示全部楼层
看了你发的一片贴子,讲在模型空间,要通过读取系统变量,得到视图的信息,焦点坐标是什么系统变量
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 145个

财富等级: 日进斗金

 楼主| 发表于 2002-3-13 00:58:55 | 显示全部楼层
最初由 风中的沙粒 发布
[B]看了你发的一片贴子,讲在模型空间,要通过读取系统变量,得到视图的信息,焦点坐标是什么系统变量 [/B]


你去看下面这篇帖子,关于ARX的ZOOM方法,关于视图的信息的系统变量都在这个里面

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

使用道具 举报

发表于 2002-3-13 01:14:58 | 显示全部楼层
缩放,是一个相对的放大,你的这片贴子是直接选窗口,设置当前视口的属性,并没提到当前是口的高,宽从那得到,你的那片贴自又是讲,纸空间的,实际上纸空间,和模型空间,获得这种信息的方式是不同的.这你也提到过.望再进行答复
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 145个

财富等级: 日进斗金

 楼主| 发表于 2002-3-13 01:24:20 | 显示全部楼层
最初由 风中的沙粒 发布
[B]缩放,是一个相对的放大,你的这片贴子是直接选窗口,设置当前视口的属性,并没提到当前是口的高,宽从那得到,你的那片贴自又是讲,纸空间的,实际上纸空间,和模型空间,获得这种信息的方式是不同的.这你也提到过.望再进行答... [/B]


系统变量:

viewsize----当前视口的高度
screensize---当前视口的X,Y最大值(象素),表,根据它可以得到X,Y比值
viewctr-----当前视口的中心的WCS座标

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

使用道具 举报

发表于 2002-3-16 12:06:44 | 显示全部楼层
我心中有一个疑问,一直困扰着我.
我在编一个缩放的程序,
目标:
以鼠标位置为中心,放大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豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 145个

财富等级: 日进斗金

 楼主| 发表于 2002-3-16 12:22:57 | 显示全部楼层
最初由 风中的沙粒 发布
[B]我心中有一个疑问,一直困扰着我.
我在编一个缩放的程序,
目标:
以鼠标位置为中心,放大model视图

实施过程:
先得到当前视图的高度,宽度,中心点
通过消息得到鼠标的位置, CPoint cPnt(pMsg->lParam) ; a... [/B]



你的意思是先用鼠标点一个点,然后以这点作为屏幕的中心,然后围绕这个中心“缩放”?

如果是这样,那你需要先把鼠标的点移动到屏幕中心,然后在缩放,这个过程需要构造“转换矩阵”,先构造“平移”矩阵,transForm后,得到的点,然后在构造“缩放矩阵”,在transFrom,当然也可以直接就利用ARX的AcGeMatrx3d或者AcGeMatrix2d构造出最终的(把用矩阵运算,把平移和缩放合并,这里要注意矩阵相乘的顺序)转换矩阵,然后transFrom你的鼠标点。因为鼠标点(屏幕中心)不是坐标系的原点,所以你的缩放会偏移。

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

使用道具 举报

已领礼包: 145个

财富等级: 日进斗金

 楼主| 发表于 2002-3-16 12:33:08 | 显示全部楼层
最初由 风中的沙粒 发布
[B]我心中有一个疑问,一直困扰着我.
我在编一个缩放的程序,
目标:
以鼠标位置为中心,放大model视图

实施过程:
先得到当前视图的高度,宽度,中心点
通过消息得到鼠标的位置, CPoint cPnt(pMsg->lParam) ; a... [/B]


下面的是XDRX_API中的我写过的函数,以指定点为中心,给定高度和宽度进行ZOOM,你可以借鉴下,你的工作就是要得到不同时候的宽度和高度,带入这个函
数就可以。

该函数考虑了模型空间和图纸空间,考虑了R14和A2K+上acedSetCurrentView名字的变化,在你的工程设置中,加入ADS=14或者15,就可以分别在R14和A2K+下,编译了。


  1. void XdDbUtils::arxZoom(AcGePoint3d cenPt,double width,double height,BOOL zflag)
  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.        
  11.         ads_real    lenslength,
  12.                 viewtwist,
  13.                 frontz,
  14.                 backz;
  15.        
  16.         ads_point target;
  17.        
  18.         int viewmode,
  19.                 tilemode,
  20.                 cvport;
  21.        
  22.         // Get window to zoom to:
  23.         wmax[X]=cenPt.x+width/2.0;
  24.         wmin[X]=cenPt.x-width/2.0;
  25.         wmax[Y]=cenPt.y+height/2.0;
  26.         wmin[Y]=cenPt.y-height/2.0;
  27.        
  28.        
  29.         wmax[Z] = 0.0;
  30.         wmin[Z] = 0.0;
  31.        
  32.         wcs.restype         = RTSHORT;         // WORLD coord system flag
  33.         wcs.resval.rint = 0;
  34.         ccs.restype         = RTSHORT;         // CURRENT coord system flag
  35.         ccs.resval.rint = 1;
  36.         dcs.restype         = RTSHORT;         // DEVICE coord system flag
  37.         dcs.resval.rint = 2;
  38.        
  39.         // Get the 'VPOINT' direction vector
  40.         ads_getvar("VIEWDIR", &rb);
  41.         ads_trans(rb.resval.rpoint, &ccs, &wcs, 0, vpDir);
  42.         viewDir.set(vpDir[X], vpDir[Y], vpDir[Z]);
  43.        
  44.        
  45.         if (!zflag)
  46.         {
  47.                 double len=(width>height)?height:width;
  48.                 wmax[X]+=0.025*len;
  49.                 wmax[Y]+=0.025*len;
  50.                 wmin[X]-=0.025*len;
  51.                 wmin[Y]-=0.025*len;
  52.         }
  53.         // convert upper right window corner to DCS
  54.         ads_trans(wmax, &ccs, &dcs, 0, wdcsmax);
  55.        
  56.         // convert lower left window corner to DCS
  57.         ads_trans(wmin, &ccs, &dcs, 0, wdcsmin);
  58.         // calculate and set view center point
  59.         AcGePoint2d cenPt1(cenPt.x,cenPt.y);
  60.         view.setCenterPoint(cenPt1);
  61.        
  62.         // set view height and width and direction
  63.         view.setHeight(fabs(wdcsmax[Y] - wdcsmin[Y]));
  64.         view.setWidth(fabs(wdcsmax[X] - wdcsmin[X]));
  65.         view.setViewDirection(viewDir);
  66.        
  67.         // get and set other properties
  68.         ads_getvar("LENSLENGTH", &rb);
  69.         lenslength = rb.resval.rreal;
  70.         view.setLensLength(lenslength);
  71.        
  72.         ads_getvar("VIEWTWIST", &rb);
  73.         viewtwist = rb.resval.rreal;
  74.         view.setViewTwist(viewtwist);
  75.        
  76.         ads_getvar("FRONTZ", &rb);
  77.         frontz = rb.resval.rreal;
  78.        
  79.         ads_getvar("BACKZ", &rb);
  80.         backz = rb.resval.rreal;
  81.        
  82.         ads_getvar("VIEWMODE", &rb);
  83.         viewmode = rb.resval.rint;
  84.        
  85.         view.setPerspectiveEnabled(viewmode & 1);
  86.         view.setFrontClipEnabled(viewmode & 2);
  87.         view.setBackClipEnabled(viewmode & 4);
  88.         view.setFrontClipAtEye(!(viewmode & 16));
  89.        
  90.         ads_getvar("TILEMODE", &rb);
  91.         tilemode = rb.resval.rint;
  92.         ads_getvar("CVPORT", &rb);
  93.         cvport = rb.resval.rint;
  94.        
  95.         // Paperspace flag
  96.         Adesk::Boolean paperspace =
  97.                 ((tilemode == 0) && (cvport == 1)) ? Adesk::kTrue:Adesk::kFalse;
  98.         view.setIsPaperspaceView(paperspace);
  99.        
  100.         if (Adesk::kFalse == paperspace)
  101.         {
  102.                 view.setFrontClipDistance(frontz);
  103.                 view.setBackClipDistance(backz);
  104.         }
  105.         else
  106.         {
  107.                 view.setFrontClipDistance(0.0);
  108.                 view.setBackClipDistance(0.0);
  109.         }
  110.        
  111.         ads_getvar("TARGET", &rb);
  112.         ads_trans(rb.resval.rpoint, &ccs, &wcs, 0, target);
  113.         view.setTarget(AcGePoint3d(target[X], target[Y], target[Z]));
  114.        
  115.         // update view
  116. #if (ADS>14)
  117.         acedSetCurrentView( &view, NULL );
  118. #else
  119.         acdbSetCurrentView( &view, NULL );
  120. #endif

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

使用道具 举报

发表于 2002-3-16 12:51:32 | 显示全部楼层
我有一点不明白,view.setCenterPoint( cenPt );中的参数,到底是用户坐标系的点还是世界坐标系的点,acedCoordFromPixelToWorld (cPnt, cpt) ; 函数中的两个参数,有是那个坐标系的点,CPoint cPnt(pMsg->lParam),这里得到的点有算是什么,而且你的这个函数,我看过很多变,我上一贴的第二个问题也请你回答。
你数的矩阵转换不就是用ads_trans(wmin, &ccs, &dcs, 0, wdcsmin);
这个函数么,可你转的不就是从用户坐标系到显示坐标系吗,我用的acedCoordFromPixelToWorld (cPnt, cpt)
本是不就是已经把鼠标的位置点转道显示坐标系了吗?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 145个

财富等级: 日进斗金

 楼主| 发表于 2002-3-16 13:10:08 | 显示全部楼层
最初由 风中的沙粒 发布
[B]我有一点不明白,view.setCenterPoint( cenPt );中的参数,到底是用户坐标系的点还是世界坐标系的点,acedCoordFromPixelToWorld (cPnt, cpt) ; 函数中的两个参数,有是那个坐标系的点,CPoint cPnt(pMsg->lParam)?.. [/B]


setCenterPoint的点是显示坐标系的点,见下面帮助

void
setCenterPoint(

    const AcGePoint2d& center);

center        Input desired center point for the view (in DCS coordinates)

This function sets the TableRecord to use center (in DCS coordinates ) as the center point of the view.
The center point value is used for DXF group code 10 in the AcDbViewTableRecord class and group code 12 in the AcDbViewportTableRecord class.

ads_trans函数是把你的点,在不同的坐标系转换。不要把这个和 缩放混淆了。
pMsg->lParam(..)这个得到的是WINDOWS的应用程序的象素坐标系的点,原点在“窗口”的左上。

我说的转换过程,是图形学的平移缩放的算法,也就是高数中的矩阵转换过程。

如果你的鼠标位置点的是“坐标系”的原点,把“原点”设置到屏幕中心,那么你直接缩放,不会出现任何问题。

如果你鼠标的点不是原点,大多数情况是这样,那么你就需要先用“平移”矩阵把点给移动到“原点”上。然后在缩放,因为“缩放”的计算,在图形学和ACAD中都是对原点缩放的,也就是转换矩阵的4x4矩阵的(0,0),)(1,1)(2,2)的位置的值是缩放的比例系数,这个是围绕“原点”的矩阵,你的点不在原点,那么就需要先构造“平移”矩阵,平移到原点处,然后和这个缩放矩阵相乘,进行缩放,缩放后,再给移回去。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 145个

财富等级: 日进斗金

 楼主| 发表于 2002-3-16 13:12:12 | 显示全部楼层
最初由 风中的沙粒 发布
[B]我有一点不明白,view.setCenterPoint( cenPt );中的参数,到底是用户坐标系的点还是世界坐标系的点,acedCoordFromPixelToWorld (cPnt, cpt) ; 函数中的两个参数,有是那个坐标系的点,CPoint cPnt(pMsg->lParam)?.. [/B]


你可以做个实验,在原点处画个矩形框,框的中心是原点,

再任意画个框。

然后你一原点为基点缩放他们,看看效果,任意那个肯定是位置原来越远(或近),在原点那个框不变。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-6 00:42 , Processed in 0.235718 second(s), 57 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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