- UID
- 1
- 积分
- 16111
- 精华
- 贡献
-
- 威望
-
- 活跃度
-
- D豆
-
- 在线时间
- 小时
- 注册时间
- 2002-1-3
- 最后登录
- 1970-1-1
|
楼主 |
发表于 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+下,编译了。
- void XdDbUtils::arxZoom(AcGePoint3d cenPt,double width,double height,BOOL zflag)
- {
- AcDbViewTableRecord view;
- struct resbuf rb;
- struct resbuf wcs, dcs, ccs; // ads_trans coord system flags
- ads_point vpDir;
- ads_point wmin, wmax; // min and max corners of the zoom window
- ads_point wdcsmax, wdcsmin; // windows corners in device coords
- AcGeVector3d viewDir;
-
- ads_real lenslength,
- viewtwist,
- frontz,
- backz;
-
- ads_point target;
-
- int viewmode,
- tilemode,
- cvport;
-
- // Get window to zoom to:
- wmax[X]=cenPt.x+width/2.0;
- wmin[X]=cenPt.x-width/2.0;
- wmax[Y]=cenPt.y+height/2.0;
- wmin[Y]=cenPt.y-height/2.0;
-
-
- wmax[Z] = 0.0;
- wmin[Z] = 0.0;
-
- wcs.restype = RTSHORT; // WORLD coord system flag
- wcs.resval.rint = 0;
- ccs.restype = RTSHORT; // CURRENT coord system flag
- ccs.resval.rint = 1;
- dcs.restype = RTSHORT; // DEVICE coord system flag
- dcs.resval.rint = 2;
-
- // Get the 'VPOINT' direction vector
- ads_getvar("VIEWDIR", &rb);
- ads_trans(rb.resval.rpoint, &ccs, &wcs, 0, vpDir);
- viewDir.set(vpDir[X], vpDir[Y], vpDir[Z]);
-
-
- if (!zflag)
- {
- double len=(width>height)?height:width;
- wmax[X]+=0.025*len;
- wmax[Y]+=0.025*len;
- wmin[X]-=0.025*len;
- wmin[Y]-=0.025*len;
- }
- // convert upper right window corner to DCS
- ads_trans(wmax, &ccs, &dcs, 0, wdcsmax);
-
- // convert lower left window corner to DCS
- ads_trans(wmin, &ccs, &dcs, 0, wdcsmin);
- // calculate and set view center point
- AcGePoint2d cenPt1(cenPt.x,cenPt.y);
- view.setCenterPoint(cenPt1);
-
- // set view height and width and direction
- view.setHeight(fabs(wdcsmax[Y] - wdcsmin[Y]));
- view.setWidth(fabs(wdcsmax[X] - wdcsmin[X]));
- view.setViewDirection(viewDir);
-
- // get and set other properties
- ads_getvar("LENSLENGTH", &rb);
- lenslength = rb.resval.rreal;
- view.setLensLength(lenslength);
-
- ads_getvar("VIEWTWIST", &rb);
- viewtwist = rb.resval.rreal;
- view.setViewTwist(viewtwist);
-
- ads_getvar("FRONTZ", &rb);
- frontz = rb.resval.rreal;
-
- ads_getvar("BACKZ", &rb);
- backz = rb.resval.rreal;
-
- ads_getvar("VIEWMODE", &rb);
- viewmode = rb.resval.rint;
-
- view.setPerspectiveEnabled(viewmode & 1);
- view.setFrontClipEnabled(viewmode & 2);
- view.setBackClipEnabled(viewmode & 4);
- view.setFrontClipAtEye(!(viewmode & 16));
-
- ads_getvar("TILEMODE", &rb);
- tilemode = rb.resval.rint;
- ads_getvar("CVPORT", &rb);
- cvport = rb.resval.rint;
-
- // Paperspace flag
- Adesk::Boolean paperspace =
- ((tilemode == 0) && (cvport == 1)) ? Adesk::kTrue:Adesk::kFalse;
- view.setIsPaperspaceView(paperspace);
-
- if (Adesk::kFalse == paperspace)
- {
- view.setFrontClipDistance(frontz);
- view.setBackClipDistance(backz);
- }
- else
- {
- view.setFrontClipDistance(0.0);
- view.setBackClipDistance(0.0);
- }
-
- ads_getvar("TARGET", &rb);
- ads_trans(rb.resval.rpoint, &ccs, &wcs, 0, target);
- view.setTarget(AcGePoint3d(target[X], target[Y], target[Z]));
-
- // update view
- #if (ADS>14)
- acedSetCurrentView( &view, NULL );
- #else
- acdbSetCurrentView( &view, NULL );
- #endif
- }
复制代码 |
|