找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 692|回复: 4

[讨论]:AutoCAD的二次开发

[复制链接]
发表于 2005-8-25 18:14:22 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
这个贴子没发在编程版,而是发在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]
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
发表于 2005-8-25 18:59:39 | 显示全部楼层
楼主的好意,实在不错,小的还用LSP来编程,
我现在一直用R14,挺不错的,因为天正5、6的
自定义对象不兼容其它CAD,所以一直不敢升级,
再说你看人家圆方,人家的虚拟现实都是在 R14
下完成的,天正应该向别的软件学习才对!
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2005-8-25 22:31:06 | 显示全部楼层
呵呵 我现在正在学习LISP呢 可是找不到好的教程
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2005-8-30 00:48:31 | 显示全部楼层
ahlzl  ,您好!我有一个问题,希望您能给予解决,问题如下:
我下载了一个CAD2006,安装、注册都很顺利,但有一个小问题,就是“多行文本MTEXT”和“多行文本DDEDIT”编辑命令无法使用,原因是“无法找到 SHELL 程序”,请问您能将解决的办法告诉我吗?!先谢谢您!
EMAIL:DWQ5107@163.COM
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2005-9-28 14:45:18 | 显示全部楼层
感觉还是AutoLISP来得快,实用。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|申请友链|Archiver|手机版|小黑屋|辽公网安备|晓东CAD家园 ( 辽ICP备15016793号 )

GMT+8, 2025-11-21 19:02 , Processed in 0.172989 second(s), 37 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表