- UID
- 25232
- 积分
- 2113
- 精华
- 贡献
-
- 威望
-
- 活跃度
-
- D豆
-
- 在线时间
- 小时
- 注册时间
- 2003-1-12
- 最后登录
- 1970-1-1
|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
×
这个贴子没发在编程版,而是发在AutoCAD软件使用技术版,一来我是这个版的前任斑竹,二来我不知道该放在哪一个编程版。还有,就是给那法想学编程又拿不准学什么的网友作些介绍。
作为初学者,无疑首选是学LISP或VBA,不好说哪一个更简单,哪一个功能更强,对我来说,因为原来多少有点EXCEL VBA的基础,所以,我自然觉得VBA简单,而LISP的括号实在是令人头痛!当然,如果你是一个没有一点编程基础的工程师,也许学LISP是你的首选,因为工程界上LISP的应用要比VBA应用广泛的多,网上各种资源也是十分丰富的。
众所周知,ARX无疑是功能最强的,不过也是最难学的!
从AutoCAD 2005开始,Autodesk推出了新的二次开发工具:.NET。我觉得.NET实质上就是ARX,只不过是用VB.NET或C#来开发,而不是传统的C++语言,从而降低了开发难度。不过,目前,.NET还有不少BUG,功能不能完全达到ARX的水平。
下面是几段代码都是过点(90,50,0)和点(200,300,0)画一直线。
AutoLISP
[php](defun C:myl (/ pt1 pt2)
(setvar "cmdecho" 0)
(setq pt1 (list 90 50 0))
(setq pt2 (list 200 300 0))
(setq oldos (getvar "osmode"))
(setvar "osmode" 0)
(command "line" pt1 pt2 "")
(setvar "osmode" oldos)
(princ)
)[/php]
VLISP
[php](defun C:myl2 (/ pt1 pt2)
(setvar "cmdecho" 0)
(vl-load-com)
(setq app(vlax-get-acad-object))
(setq doc(vla-get-activedocument app))
(setq ms(vla-get-modelspace doc))
(setq pt1 (list 90 50 0))
(setq pt1(vlax-3d-point pt1))
(setq pt2 (list 200 300 0))
(setq pt2(vlax-3d-point pt2))
(vla-addline ms pt1 pt2)
(princ)
)[/php]
VBA
[php]Sub MyLine()
Dim pt1(2) As Double
pt1(0) = 90
pt1(1) = 50
pt1(2) = 0
Dim pt2(2) As Double
pt2(0) = 200
pt2(1) = 300
pt1(2) = 0
Dim MyLine As AcadLine
Set MyLine = ThisDrawing.ModelSpace.AddLine(pt1, pt2)
End Sub[/php]
ARX
[php]#include "StdAfx.h"
#include "StdArx.h"
#include "dbents.h"
//------------------------------------------------------
// This is command 'MYL, by [2005-8-24], ,
void ahlzlmyl()
{
//得到AutoCAD的数据库对象
AcDbDatabase *db;
db = acdbHostApplicationServices()->workingDatabase();
//打开块表
AcDbBlockTable *bt;
db->getBlockTable (bt,AcDb::kForRead);
//打开模型空间块表,获得当前块表记录,并关闭块表。
AcDbBlockTableRecord *btr;
bt->getAt(ACDB_MODEL_SPACE,btr,AcDb::kForWrite);
bt->close();
//初始化直线对象
AcGePoint3d pt1(90, 50.0, 0);
AcGePoint3d pt2(200, 300, 0);
AcDbLine *myline=new AcDbLine(pt1,pt2);
//向当前块表纪录中添加直线对象
AcDbObjectId lineId;
btr->appendAcDbEntity (lineId,myline);
//关闭块表和直线对象
btr->close();
myline->close();
}[/php]
VB.NET
[php]Imports Autodesk.AutoCAD.ApplicationServices
Imports Autodesk.AutoCAD.DatabaseServices
Imports Autodesk.AutoCAD.Geometry
Imports Autodesk.AutoCAD.Runtime
Imports DBTransMan = Autodesk.AutoCAD.DatabaseServices.TransactionManager
Public Class 基本图元
<CommandMethod("MyL")> Public Sub MyTestLine()
Dim db As Database = HostApplicationServices.WorkingDatabase
Dim tm As DBTransMan = db.TransactionManager
Dim ta As Transaction = tm.StartTransaction()
Try
Dim bt As BlockTable = tm.GetObject(db.BlockTableId, OpenMode.ForWrite, False)
Dim btr As BlockTableRecord = tm.GetObject(bt(BlockTableRecord.ModelSpace), OpenMode.ForWrite, False)
Dim pt1 As Point3d = New Point3d(90, 50, 0)
Dim pt2 As Point3d = New Point3d(200, 300, 0)
Dim LineObj As Line = New Line(pt1, pt2)
btr.AppendEntity(LineObj)
tm.AddNewlyCreatedDBObject(LineObj, True)
ta.Commit()
Finally
ta.Dispose()
End Try
End Sub
End Class[/php]
C#
[php]using System;
using Autodesk.AutoCAD.DatabaseServices;
using Autodesk.AutoCAD.Runtime;
using Autodesk.AutoCAD.Geometry;
using Autodesk.AutoCAD.ApplicationServices;
using DBTransMan=Autodesk.AutoCAD.DatabaseServices.TransactionManager;
namespace 基本图元CS
{
public class 基本图元
{
public 基本图元()
{
//
// TODO: 在此处添加构造函数逻辑
//
}
[CommandMethod("MyL")]
public void TestLine()
{
Database db=Application.DocumentManager.MdiActiveDocument.Database;
DBTransMan tm=db.TransactionManager;
Transaction ta=tm.StartTransaction();
BlockTable bt=(BlockTable)tm.GetObject(db.BlockTableId,OpenMode.ForRead,false);
BlockTableRecord btr=(BlockTableRecord)tm.GetObject(bt[BlockTableRecord.ModelSpace],OpenMode.ForWrite,false);
Point3d pt1=new Point3d(90,50,0);
Point3d pt2=new Point3d(200,300,0);
Line LineObj=new Line(pt1,pt2);
btr.AppendEntity(LineObj);
tm.AddNewlyCreatedDBObject(LineObj,true);
ta.Commit();
ta.Dispose();
}
}
}[/php] |
|