objectarx开发笔记2

更新时间:2024-01-20 10:13:01 阅读量: 教育文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

刷新显示屏幕问题 ........................................................................................................................... 2 自定义实体时添加variable时相关问题 ........................................................................................ 2 用acdbOpenAcDbEntity打开实体后一定要关闭 ......................................................................... 2 WCS到UCS的坐标转换 ............................................................................................................... 2 选择过程中判断用户右键操作 ....................................................................................................... 2 如何实现自定义实体Undo? ......................................................................................................... 3 关于动态拖动的讨论 ....................................................................................................................... 3

刷新显示屏幕问题

有时在程序中修改了实体,比如删除了实体,但在屏幕上没有及时地刷新,这时执行屏幕选取实体函数acedSSGet(),

仍然能够选中原来的实体,明明它们已经删除了,这时怎么办呢,考虑用acedCommand(RTSTR, \

虽然也可以,但它会重新生成整个图形数据库,如果数据量很大,那么重生成的速度会很慢, 这样就不可能在程序的一段循环语句中修改每一个实体后都对数据库重生成,那程序运行的时间大部分都花在刷新数据库上了, 显然这不合理. 解决方法:

// 刷新显示屏幕

actrTransactionManager->flushGraphics(); acedUpdateDisplay();

自定义实体时添加variable时相关问题

问:用ObjectARX2007的Add Member Variable Wizard时出现页面错误怎么办? 答:用vs2005自身的class view中的add variable就可以了。

用acdbOpenAcDbEntity打开实体后一定要关闭

用acdbOpenAcDbEntity打开实体,不管是只读还是编辑方式,操作后都要关闭实体,否则再次打开时只能以只读方式打开。

WCS到UCS的坐标转换

mbp为当前坐标(ads_point mbp),可以以下方法转换为wcs坐标。

struct resbuf wcs, ucs;

wcs.restype = RTSHORT; wcs.resval.rint = 0; ucs.restype = RTSHORT; ucs.resval.rint = 1;

acedTrans(mbp,&ucs,&wcs,0,mbp);

选择过程中判断用户右键操作

观察Acad2002的命令:mledit,这个命令运行后,用户需要选择操作对象,可是这个命令的选择功能有点特殊: 可以判断用户点了右键(等同直接按回车),,如果点了右键(或按回车),程序会退出.

现在有个程序,也要选择一个对象,并且也想实现用户按回车(点击右键)后直接退出,我用的是acedEntSel函数,可是这些函数(包含acedNEntSelP..等.)都只能返回RENORM(正确选中),RTEROR(没有选中),用户按回车(点击右键)也是返回RTERROR请教下这里有没有解决的办法.

int rc=acedEntSel(\a entity:\ switch(rc) {

case RTCAN:

acutPrintf(\canceled.\ break; case RTERROR:

acutPrintf(\selected.\ break; }

如何实现自定义实体Undo?

undo和redo实际上是调用了自定义实体的dwgInFields和dwgOutFields,你必须重载这个函数。而且当你调用修改这个实体属性的函数时,要先调用assertWriteEnabled。

关于动态拖动的讨论

acedgetpoint()针对直线 acedGrRead()针对矩形

如果想实现复杂的拖动变换用AcEdJig类或用AcedDragen函数

我开发一个ARX程序,需动态反馈,需要知道当前光标位置。用acedGrRead时,不能实现OSnap。用acedGetPoint可获得最点及实现OSnap,但不能动态反馈。

使用acedGetPoint函数,同时创建另一线程使用acedGrRead实现动态反馈,确总是AutoCAD崩溃(使用::GetMouseCursor()及鼠标勾子也同样)。

望哪位高手能解我所惑

不知道下面代码对你有没有帮助!!!!

//////////////////////////////////////////////////////////// //动态移动选择集

//////////////////////////////////////////////////////////// //跟踪矩阵(无限制)

int trancematrix(ads_point usrpt,ads_matrix matrix) {

int i,j;

for(i=0;i<=3;i++) for(j=0;j<=3;j++) matrix[i][j]=0,0; for(i=0;i<=3;i++) matrix[i][i]=1.0; matrix[0][T]=usrpt[X];

matrix[1][T]=usrpt[Y]; matrix[2][T]=usrpt[Z]; return RTNORM; }

//函数名:acdbDragSset //功能:动态移动一个选择集 //选择集:ssetname

//移动参照点:referpoint

Acad::ErrorStatus acdbDragSset( ads_name ssetname, AcGePoint3d referpoint ) {

ads_point rtpnt; int status;

status=acedDragGen(ssetname, \请选择一个插入点:\ 0,

trancematrix, rtpnt);

if(status!=RTNORM){

return Acad::eNotImplementedYet; } else{

AcGePoint3d newposition;

newposition.set(rtpnt[X],rtpnt[Y],rtpnt[Z]);

return acdbMoveSset(ssetname,referpoint,newposition); } }

请参考acedDragGen()函数定义

CAD里面用Arx实现拖动的效果:继承AcEdJig类,ARX samples下polysamp中有相关的例子

本文来源:https://www.bwwdw.com/article/ndbo.html

Top