永发信息网

如何选择autocad二次开发的工具

答案:1  悬赏:0  手机版
解决时间 2021-03-24 11:39
如何选择autocad二次开发的工具
最佳答案
用于决定到底哪种开发工具对你的项目最合适:
ObjectARX:
你必须感到用C和C++最为顺手(译者注:顺手是对一种语言无缘故的喜欢);
你需要大量的对AutoCAD的控制和多种类型的窗体;
你需要自定义对象;
你需要访问一些用VBA和LISP无法访问的东西;
你的程序需要更高的效率(VBA和LISP无法达到);
你的工作环境需要使用C或者C++开发的程序;
你需要使用一些AutoCAD外部的库函数,这些库函数仅能在C和C++中调用。
VBA:
你感觉用VBA编程最顺手;
你需要使用对话框;
你需要和Windows或者一种Office应用程序(例如Excel)交换数据;
你初学AutoCAD二次开发,或者初学编程;
你需要尽快完成一个程序的开发,而程序的效率不是那么重要;
你知道在开发过程中你需要从Autodesk获得大量的帮助。
LISP:
世界末日,没有其他的工具可选(译者注:就是你觉得VBA和ARX都不适合你);
你感觉用LISP编程很顺手;
你要开发的程序在AutoCAD 2000以前的版本上运行;
你的工作涉及到一些特殊的东西,这些东西用LISP可以直接实现,但是如果用VBA来实现要花费很大的力气;
你的工作环境需要它;
你的工作环境需要使用已经存在的LISP函数库;
你喜欢享受痛苦(译者注:可能有作者的一些个人感情色彩);
在你的程序中除了命令行和图形对象之外不需要任何对话框或者图形用户界面;
Parens让你快乐(译者注:不理解这句话的意思,估计Parens是个熟悉LISP开发的人的名字),哦,看这边,那个穿白大衣的人来找你了。
现在我将提供一些你们来这里的所有人都想要的东西:免费的代码(译者注:作者仍然是在开玩笑)!当然,我们直到这也是你读这一篇文章的原因,不是吗?因此,既然你费尽千辛万苦读完了上面的文字,我想我应该给你一些免费的代码,这样说不定下次你还会来这里。在每种开发工具的示例代码中,我都给出了一种编辑一个块参照中第一个可编辑的属性的方法,在代码中不会看到使用命令行的语句,因为我不喜欢使用那些东西。如果你使用“Command”(译者注:LISP中的command函数,VBA中的SendCommand方法,ARX中的acedCommand函数),你不是在编程,顶多算是在写脚本(译者注:脚本在这里泛指那些解释执行的语言,从某种意义上讲,使用“Command”确实是要求命令行解释并且执行你所提供的语句),这是两码事。
ObjectARX的代码:
void chngAtt()
{
ads_name entres;
ads_point ptres;
AcDbObjectId _Id, _attId;
AcDbObjectIterator *pIttr = NULL;
if(acedEntSel("Select a Block Reference", entres, ptres) != RTNORM )
{
//Selection failed
return;
}
acdbGetObjectId(_Id, entres);
AcDbObjectPointer pRef(_Id,AcDb::kForRead);
if(pRef.openStatus()!=Acad::eOk)
{
//Open failed
return;
}
pIttr = pRef->attributeIterator();
while(!pIttr->done())
{
_attId = pIttr->objectId();
AcDbObjectPointer pAtt(_attId,AcDb::kForWrite);
if(pAtt.openStatus()==Acad::eOk)
{
pAtt->setTextString("We changed this");
break;
}
pIttr->step();
}
delete pIttr;
}
VBA代码:
Option Explicit
Sub chngAtt()
Dim objEnt As AcadObject
Dim objRef As AcadBlockReference
Dim varAtts As Variant
Dim objAtt As AcadAttributeReference
Dim emptyPt As Variant
 
ThisDrawing.Utility.GetEntity objEnt, emptyPt, "Select Block: "
If objEnt.ObjectName = "AcDbBlockReference" Then
Set objRef = objEnt
If objRef.HasAttributes Then
varAtts = objRef.GetAttributes
Set objAtt = varAtts(0)
objAtt.TextString = "We changed this"
End If
End If
End Sub
LISP代码:
(defun C:chngAtt ()
(setq Mainent (entsel))
(setq entList (entget (car Mainent)))
(setq entAtt (entget (entnext (cdr (assoc -1 entList)))))
(setq entNewAttVal
(subst (cons 1 "We changed this") (assoc 1 entAtt) entAtt))
(entmod entNewAttVal)
(entupd (car Mainent))
(princ)
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
比亚迪g6装个日间行车灯多少钱
有没有跟我一样用IPhone自带耳机玩游戏的
关于长江沿江地带的叙述,错误的是A.上游可以
qq飞车玩边境看着别人一闪一闪的 自己网络正
哪些隔夜菜可以吃,能够隔夜吃的菜有哪些
money was thrown into the flower girl’s b
请教这个丹桂的是状元红吗
越落后的国家教育一般越先进么?
运城空港南区发展趋势怎么样 想在美林山买套
车场饭店在什么地方啊,我要过去处理事情
芜湖市启智围棋学校地址有知道的么?有点事想
捐款做善事有什么功德
C++中提供虚基类是因为:
谁有哑舍四的小说啊,发给我
双色球多久兑奖有效期,双色球兑奖期限是多少
推荐资讯
镇沅彝族哈尼族拉祜族自治县食品药品检验检测
流铭专业染烫发型怎么去啊,有知道地址的么
可调电阻W103上的 816T 3296都代表什么意思
一般的二手全画幅需要多少钱啊,我是一个外行
笔记本电脑开机关机速度很慢怎么办?
单选题比S2-多一个质子、少一个电子的粒子是A
“花气袭人知骤暖,鹊声穿树喜新晴.”这是宋
今天是阳历多少号?
我现在想在温州苍南考C1驾驶证,大概要多久才
临沂市建设中专学校如何招聘老师?
我是14岁男生,我的嘴角左边有颗黑痣,不是立
谁会制作qq全钻透明图片,就小号图片这种
正方形一边上任一点到这个正方形两条对角线的
阴历怎么看 ?