语言的选择

因为某些功能的原因,一部份VBA的用户最终选择了NET,又因为某些功能的原因,一部份NET的用户最终选择了C++。最终这部份业余用户走上了专业的二次开发之路,而脱离了原来的专业。

                     来自 一个CAD群叫  “arx-阿华”的

作为新手,作为业余,基础一般,精力有限,其实语言的选择是个不容忽视的问题。

 

转个04年的老帖:如何选择AutoCAD的开发工具?

AutoCAD提供了三种主要的开发工具,分别是:使用C/C++的ObjectARX,VB/VBA的ActiveX开发,以及AutoLISP/VisualLISP开发工具。每一个开发者都有自己的爱好,但是抛开所有的偏爱,人们经常想知道哪一种最好,我到底应该选择哪种工具?给这些人的答案是:“它取决于你要完成什么工作。”每一种开发工具都有不同的东西,在某谢情况下都有不可比拟的优点。当决定究竟使用什么开发工具时,你可以问自己四个问题:哪种语言让我感觉最顺手(舒服)?我有多少时间?谁是我的目标用户,他们有多少使用AutoCAD的经验?我到底需要对AutoCAD控制到什么程度,需要多少可能的窗口类型来尽快完成工作?当我介绍不同开发工具所具有的不同功能时,你可能会明白为什么这四个问题是重要的。在谈及这几种开发工具时,我仅仅将它们看作在AutoCAD中使用的功能,而不将它们看作独立的应用程序。

ObjectARX:

在三种开发工具中,这种工具拥有对AutoCAD最深入的控制能力,能够提供最多类型的窗体。使用ARX可以向AutoCAD注册自己的命令,用户运行你的程序时无需了解关于AutoCAD更多的知识。这种便利的代价就是编制ARX程序比VBA和LISP程序需要花费更多的时间,因此用来编制简单的绘图工具有点浪费了。要掌握ARX的前提是你对C和C++非常熟悉,从个人观点来说,我最喜欢这种工具,但那是因为我做的99%的程序都是用C和C++语言,选择ARX意味着我不用学习一门新语言。对我来说,回答“哪种语言让我感觉最顺手?”就足够了。ARX能够访问很多的AutoCAD底层工具(这些东西可能VBA和LISP并不能访问),这是大多数开发者选择ARX的主要原因,他们需要作一些用其他两种开发工具不能完成的工作。此外,这也是唯一一种能够确保你的代码安全(不被别人阅读或非法复制)的开发工具。如果你需要开发自定义实体,使用空间过滤,扩展一个使用其他开发工具的应用程序的功能,正在开发用于销售的第三方工具,或者用到一大堆用VBA和LISP不能访问的东西(或者费很大力气去实现的东西),那么ObjectARX是你的最佳选择。

VBA:

如果你是第一次开发AutoCAD应用程序,那么这就是最适合你的工具!这种工具对初学者来说非常友好,Visual Basic的代码阅读起来非常容易,很多初学者仅读了函数的名称就能理解一个问题。无论如何创建或者执行LISP命令来扩充你的访问手段,这种开发工具没有ARX和LISP那么多对AutoCAD访问的方式(译者注:这也有情可原,毕竟VBA和另外两种开发工具比起来年轻得多!)如果你对VBA非常精通,可以通过再对AutoCAD命令行进行仔细研究和分类(这句话可能不太通顺,原文是:you can subclass the AutoCAD command line),这样你就能实现LISP所能完成的所有功能!对VBA来说,最大的遗憾就是不能向AutoCAD注册命令,必须先用各种加在应用程序的方法将其对应的dvb文件加载,然后通过“工具/宏/宏”菜单项执行,或者在菜单项和自定义的工具栏按钮中执行,如果你的用户的基础知识实在有限,这对你来说是个不小的问题(译者注:已有合适的解决方案)。我曾经研究过很多合同,许多制图者喜欢直接在命令行执行命令,这对VBA(开发工具)的销售不是个好消息(译者注:已经有合适的方法实现这种功能),如果用户组不会在这个问题上纠缠,那么VBA通常是很好的商品,特别是当他们看到你能使用它多么迅速地创建应用程序。和LISP结合起来,VBA首先是一个开发公司内部使用的程序的利器,或者在你已经包工并且需要在现场编写自定义的工具时使用它。在所有的开发工具中,这是一种开发速度最快的工具,特别是在开发需要图形界面(对话框)的程序时。使用这种工具,你同样能从AutoDesk获得最好的技术支持!

LISP:

当我谈到LISP的时候,一般是专指AutoLISP和VisualLISP,而不是在讨论ANSI的通用LISP语言。首先简单描述一下AutoLISP,AutoLISP兼备快速开发工具的特点和COBOL语言的灵活性,很多开发者选择LISP的主要原因是它符合他们对“什么语言让我感到很顺手?”问题的答案,对很多人来说,这是他们第一次开发AutoCAD所使用的语言,并且很快使用该语言进行开发。另一个使用这种开发工具的原因是,你所工作的环境可能已经具有很多LISP程序(的确,AutoLISP的使用历史最为悠久)。学习LISP比VBA难,却又比C和C++简单。直到AutoCAD 2000,VBA还不能很好的在AutoCAD内部执行,并且留下很多开发者希望解决的问题。LISP是快速编写应用程序的最初的开发工具,大量的LISP程序库存在于世界各地在短时间内用VBA重写这些东西不值得,也不容易。如果是这种情况,那么LISP就是为你而打造的开发工具,也许是上帝可怜你,呵呵,开个玩笑。这些年来使用LISP的人大大减少了,如果你是AutoCAD二次开发的初学者,并且你的程序可能要和其他的Windows程序交换数据,你最好去看看VBA。总体来说,如果你正在创建和一个用ARX编写的程序交换数据的程序,对ARX程序员来说,为LISP程序员预留接口比为VBA预留接口要简单一些,但是一个好的程序员应该两者都能做,因此究竟为哪种语言预留接口实际上取决于写C++方面的东西的人。

-------------------------------------
下面就是一个简单的清单,用于决定到底哪种开发工具对你的项目最合适:

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)
)
<全文完>

时间: 2024-10-12 03:41:33

语言的选择的相关文章

初学C#和MVC的一些心得,弯路,总结,还有教训(1)--语言的选择

---恢复内容开始--- 因为惰性,自制力,求知欲等各方面原因....一直没有学新技术,总感觉VB6凑合能用就凑合用.... 于是大概从05年开始,几乎每次新版的vs一发布,我就下载回来,然后安装,然后,,,,就扔那了..... 直到装了Win8系统,VB6的IDE(SP6)怎么也装不上了,,,,,终于咬牙决定进军.net.. 因为有深厚的VB基础嘛,至少语法上会有相当的相似,所以想都没想就奔着VB.net去了... 可是学了一段时间后发现几个问题 1.感觉关键字冗余,代码不够优美 2.示例代码

Atitit 项目语言的选择 java c#.net &#160;php??

Atitit 项目语言的选择 java c#.net  php?? 1.1. 编程语言与技术,应该使用开放式的目前流行的语言趋势1 1.2. 从个人职业生涯考虑,java优先1 1.3. 从项目实际来说,java优先2 1.1. 编程语言与技术,应该使用开放式的目前流行的语言趋势 目前来看,工业型的语言只有java 和c#.net系列可以入选.不过综合考虑历史与未来长期趋势,java是唯一的选择. 如果确实要使用一些其他语言,建议限制在小范围模块内使用,防止扩散 1.2. 从个人职业生涯考虑,j

各种语言的选择

如果编写对性能要求苛刻,或和操作系统结合紧密的程序,必然选择C. 如果编写到处可用的程序,选Java. 如果编写大程序,可能的话尽量用脚本语言如Python.Ruby,不行了再用Java和C.因为脚本语言带来了生产力. 编写文本的处理程序用Perl或Ruby. 编写知识的处理程序用prolog. 编写最灵活,最模糊的程序用Lisp. 编写office程序用vba. 编写服务器端程序,PHP.(采用自己熟悉的语言来写,例如Perl.Python.Ruby)CGI.ASP.(熟悉Java就用)JSP

开发语言的选择

开发语言的选择,我们要首先掌握清楚它的特性,然后根据实际的需求考量多种因素来分析选择适当的语言 比如: 面向结构,面向对象,面向并行的函数式,最适配需求的是什么编程模型?对应擅长这种模型的最适合的语言是什么? 需求最需要什么?运行效率,开发效率?灵活性,安全性,复杂性? 或其他,最重要是那一点? 我们需要什么样的效率可以?极致的效率?满足基准的效率? 我们到底需要多少灵活性(设计时和运行时)? 我们的容错需要到什么地步?(可以崩溃测试迭代(强检查强测试)?一般不崩溃(脚本)?) 其他考量等等..

C语言-选择排序

int main(){ //定义一个数组 int a[]={3,5,1,4,9}; //选择排序 for (int i=0; i<5; i++) { for (int j=i+1; j<5; j++) { if (a[i]>a[j]) { int t=a[j]; a[j]=a[i]; a[i]=t; } } } for (int i=0; i<5; i++) { printf("%d\t",a[i]); } printf("\n"); ret

【学习笔记】【C语言】选择结构-if

1.if的第1种结构 if(条件) {     语句1;     语句2;     ...... } 如果if右边小括号()中的条件成立,也就是为“真”时,就会执行大括号{}中的语句: 如果条件为假,就不执行大括号{}中的语句.这里的if是关键字. C语言规定所有非0值都为“真” 2.if的第2种结构 if(条件1) {      语句1;      语句2;      ...... } else {     } 如果if右边小括号()中的条件成立,也就是为“真”时,就会执行大括号{}中的语句,

后端语言的选择

本来后端想学 Node.js,现在改变主意了,打算学 golang! golang 的标准库看起来很不错,一般要用到的东西都有了,只用标准库就能做网站,这点很好. 而且初步了解,语法不会很庞大复杂,比如 JAVA, C#, Python, Ruby 的语法我就觉得很庞大,而 JavaScript 的语法就比较"小".我有点强迫症,学一个语言总是执着于先要把语法全部学一遍,因此庞大的语法会让我很有压力. 据说 golang 部署特别方便,而且我也想在技术栈里增加一门静态类型编译语言 (s

一起talk C栗子吧(第二十九回:C语言实例--选择排序)

各位看官们,大家好,上一回中咱们说的是希尔排序的例子,这一回咱们说的例子是:选择排序.闲话休 提,言归正转.让我们一起talk C栗子吧! 选择排序的原理是:从容器中选择一个最大或者最小的元素,把该元素放到新的容器中,等到容器中的所 有元素都被选择完后,新容器中存放的元素就是有序的. 在实现选择排序时,我通过交换元素的位置,充分利用了容器的空间,而没有创建新的容器,这样可以节 省程序的存储空间.选择排序的实现步骤如下: 1.先实现一个可以从容器中找到最大元素或最小元素的函数,找到后返回该元素在容

C语言-简单选择排序与直接插入排序的实现

/* Name: selectSort and insertSort Copyright: nyist Author: 润青 Date: 01/10/18 19:30 Description: 实现了简单选择排序与直接插入排序 */ #include<stdio.h> int a[100]; int n; void selectSort(); void insertSort(); int main(){ scanf("%d",&n); for(int i=0;i&l