lonely 发表于 2002-9-3 09:32:00

ARX如何对一个已有pline进行操作,比如Fit一下,这样做错在哪里??

acedCommand(RTSTR,"pline",RTPOINT,p1,RTPOINT,p3,RTPOINT,p2,RTSTR,"",0);
acdbEntNext(NULL,A);
acedCommand(RTSTR,"pedit",RTENAME,A,RTSTR,"",RTLB,RTENAME,A,RTPOINT,p3,RTLE,RTSTR,"F",RTSTR,"",0);

leeyeafu 发表于 2002-9-3 10:17:00

你这样不是ARX调用方式

acedCommand()函数只是向ACAD命令行发送命令,执行时会解释为LISP并向ACAD命令行发送,这是ADSRX方法。从你的代码来看,pedit命令的语句与ACAD命令行要求的格式不符。若你仅仅是想Fit一下,可以这样:
acedCommand(RTSTR,"pedit",RTENAME,A,RTSTR,"F",RTSTR,"",0);
ARX建立多义线的方法:
AcDbPolyLine *objPLine;
objPLine=new AcDbPolyLine(...);
这样建立的对象,可以用ARX方法直接修改其属性,就象C++修改类的成员变量一样, 当然,对象属性可能是其私有段(private关键字说明)成员,须调用其公有(public)成员函数才能达到目的。具体情况参考arxdev.hlp有关AcDbPolyLine类。

lonely 发表于 2002-9-3 10:22:00

非常感谢!

lonely 发表于 2002-9-3 10:32:00

可是,还是不能实现,选择实体有问题吗?再次感谢!!

leeyeafu 发表于 2002-9-3 12:55:00

我弄错了,pedit命令须要选择集,而不是ads_name

acdbEntNext()函数返回一个ads_name类型绘变量A,而pedit命令的第一个参数应该是点或选择集,因此,acedCommand(RTSTR,"pedit",...)返回“参数错误”。试试这样行不行:
if(acdbEntNext(NULL,A)!=RTNORM)
{
acutPrinf("获取实体A错误!/n");
return BAD;
}
acedSSAdd(NULL,NULL,ss); //建立一个空选择集
if(acedSSAdd(A,ss,ss)!=RTNORM)   //将A添加到一个选择集中
{
acutPrintf("添加A到选择集错误!/n");
return BAD;
}
ARX程序很脆弱,容易出错,建议你在程序设计时加上出错处理。程序调试也更方便。

lonely 发表于 2002-9-3 14:29:00

我试试!谢谢!

lonely 发表于 2002-9-3 14:40:00

ADSRX与ARX那个更先进、更有学习价值呢?小弟初学,还没有明确。

lonely 发表于 2002-9-3 14:42:00

说实话,我的书不少只是学起来,没有重点!

lonely 发表于 2002-9-3 14:45:00

还想问一下,您的ARX是自学吗?有没有培训过?在哪里?我底子薄,自学很吃力。谢谢

leeyeafu 发表于 2002-9-3 15:23:00

以下摘自明经杂志第3期,陈伯雄老师的文章

ADS 曾经是在 AutoLISP 之后的一种用户程序,在 R14 之前的AutoLISP 程序虽然是解释运行,仍比 ADS 程序快一些,因为实际上ADS是用AutoLISP与AutoCAD交互。自AutoCAD R14已经不再支持和发展 ADS程序设计模式,同时却增加了Visual LISP,以进一步提高AutoLISP 的整体性能。
ObjectARX一般是在Autodesk内部或增值软件开发商中使用。由于ARX是使用Visual C++作为基本程序设计语言,无论其效率、数据处理和软硬件的控制能力都是最好的,是唯一圆满地针对多图档环境的程序设计方法。是从根本上扩展 VLISP / VBA 的程序设计方法。
但是,与AutoCAD命令交互的功能,ARX很难借用AutoCAD强大的CAGD功能。另外,要想真正发挥这种开发模式的作用,对于程序设计者的要求(计算机专业知识、软件专业知识等等)也较高,而且程序运行风险较大。要求程序自己做好各种数据的测试,自己设计好各种条件下的出错处理和恢复,否则ARX 程序的崩溃常常会连带 AutoCAD、甚至Windows9x一起崩溃。因此,这种开发模式不适于在专业设计工程师中间普及。
以上摘自明经杂志第3期,陈伯雄老师的文章。以下是我个人看法:
ADS是AutoDESK在LISP语言之后,为C语言所做的SDK,也就是C语言开发ACAD应用程序的接口。虽然ADS不是象LISP一样解释型开发语言,但它与ACAD之间的通信机制仍是基于LISP的。ADSRX在ADS的基础上添加了部分面向对象的概念,可以认为是ADS的C++扩展,其本质仍是ADS,其功能也不比LISP语言更强大。对于熟悉C/C++语言的程序员来说,也许ADS/ADSRX比LISP更灵活,代码具有更好的可读性。(我有时真觉得LISP表达式有些怪怪的)
ObjectARX其本质是windows动态链接库,ARX与ACAD之间的通信机制是通过windows消息响应,与ACAD共享内存空间。其开发语言为Visual C++,具有全部面向对象的特点,可以使用全部windows API功能,这种开发模式几乎没有功能上不足。尤其是自定义类的派生,多文档管理等windows程序设计技术是ADS、ADSRX、LISP等开发模式所无可比拟的。ObjectARX结合MFC(微软基础类库)甚至可以象VC,Dephi一样开发出与windows风格一致的应用程序。
ObjectARX功能强大,但也有致命弱点,正如陈老师所说,程序设计难度大,出错后易导致ACAD甚至windows的崩溃。所以ObjectARX好,但难掌握。
我做ACAD的二次开发,小程序一般用VLISP,要很漂亮的用户界面,用VBA,只有须与windows或数据库发生密切联系时用ObjectARX.
页: [1] 2
查看完整版本: ARX如何对一个已有pline进行操作,比如Fit一下,这样做错在哪里??