基于LSP实现C语言与AutoCAD接口
应用AutoLISP和DCL对AutoCAD的二次开发
应用AutoLISP和DCL对AutoCAD的二次开发苗现华,吴传山(健雄职业技术学院,江苏太仓215411)摘要:通过实例说明,应用AutoLISP和DCL,能够编写出人机交互强,功能强大的程序,对AutoCAD进行十分有效的二次开发,从而提高绘图效率,并使AutoCAD真正地起到辅助设计作用。
关键词:AutoLISP;DCL;AutoCAD;二次开发中图分类号:TP391.72 文献标识码:A1.概述AutoCAD是当今风靡世界的CAD应用软件,为了提高其绘图效率,增强其设计能力,常会用到AutoLISP及DCL对其进行二次开发[1]。
由于AutoLISP及DCL均附着于AutoCAD软件内,AutoLISP是编写绘图、编辑图形等程序的表处理语言,易学易用且功能强大;DCL是用户对话框设计语言,可设计出简洁、美观且人机交互强的用户对话框。
二者配合使用,对AutoCAD有着强大的二次开发能力。
以双头螺柱为例,说明如何应用AutoLISP和DCL对AutoCAD进行二次开发及开发效果。
2.开发流程2.1 用DCL编写用户对话框界面根据设计意图,编写用户对话框,如图1所示。
图1用户对话框界面用户点击图中单选按钮,选取绘图所需的国标及等级代号,右侧则展现对应螺柱样式的图片。
在图中下拉列表框中选取所需公称直径d和公称长度l,选取或输入所需旋转角度angle,点击“确定”按钮在AutoCAD 界面中绘出所希望的双头螺柱。
对话框文件取名为stlz.dcl,源程序如下:stlz:dialog{label=“双头螺柱”;:row{:boxed_radio_column{label="国标及等级代号";:radio_button{ label="GB/T 897-1988 A";key="k897A";}:radio_button{ label="GB/T 897-1988 B";key="k897B";}:radio_button{ label="GB/T 898-1988 A";key="k898A";}:radio_button{ label="GB/T 898-1988 B";key="k898B";}:radio_button{ label="GB/T 899-1988 A";key="k899A";}:radio_button{ label="GB/T 899-1988 B";key="k899B";}:radio_button{ label="GB/T 900-1988 A";key="k900A";}:radio_button{ label="GB/T 900-1988 B";key="k900B";}}:image{key="kimage";color=-2;width=30;aspect_ratio=1;}}:row{:popup_list{label="公称直径d";edit_width=4;key="kpopd";}:popup_list{label="公称长度l";edit_width=4;key="kpopl";}:popup_list{label="旋转角度angle";edit_width=4;key="kpopa";}:edit_box{edit_width=4;key="ke box";}}spacer_1;ok_cancel;}2.2 制作SLD文件为了实现用户对话框中的八种类型的双头螺柱的图像显示,首先在AutoCAD软件的绘图区域中分别绘制这八种类型的双头螺柱,然后在命令行中输入“mslide”命令,分别创建相应的幻灯片文件,文件分别命名为stlz1. sld~stlz8.sld。
Visual Basic与AutoCAD绘图软件的接口技术
Set objacad = New AutoCAD.AcadApplication ''建立Autocad程序列程
Set objdwg = objacad.Documents.Add ''建立名称为acab的DWG文件
Set objcircle = objdwg.ModelSpace.AddCircle(cen, rad) ''在acab的DWG文件中画一个圆
Acadapp.Left=200
Acadapp.Height=1000 ''调整AutoCAD窗口的大小
acadapp.Width=800
Acadapp.Caption="my first application" ''设置AutoCAD窗口的标题
b.操作Document对象的VB语句
Dim objacad As AutoCAD.AcadApplication ''定义Autocad程序对象
Dim objdwg As AutoCAD.AcadDocument ''定义DWG文件对象
Dim objcircle As AutoCAD.AcadCircle ''定义circle对象
6 VBA
VBA (即Mcrosoft office中的Visual Basic for Applications),被集成到AutoCAD 2000中。VBA为开发者提供了一种新的选择,也为用户访问AutoCAD 2000中丰富的技术框架打开一条新的通道。VBA和AutoCAD 2000中强大的ActiveX自动化对象模型的结合,代表了一种新型的定制AutoCAD的模式构架。通过VBA,我们可以操作AutoCAD,控制ActiveX和其它一些应用程序,使之相互之间发生互易活动。
基于VisualLISP的AUTOCAD绘图命令的二次开发
3 命令在命令行的应用过程
首先在命令行中键入 bm 后空格, 系统提示 请输入 基准代号的插入点: , 输入插入坐标或者拾取点后会弹出 如图 1所示的对话框。
图 1 基准代码对话框
在对话框中输入指定的选项 , 确认后即可得到自定制 的基准代号。
4 结论
V isual L ISP 是简单易懂的 AUTOCAD 二次开发软件, 使用该语言可以方便地开发出适用的常用工作图形符号, 本文旨在为 V isual L ISP 的命令开发过程作详细解释。
第 9卷
第 5期
漯河职业技术学院学报
Jou rnal of Lu ohe V ocational T echnology Co llege
Vo. l 9 No. 5
Sep . 2010
2010年 9 月
do : i 10 . 3969 / .j issn. 1671 7864 . 2010 . 05 . 011
0 引言
A utoCAD 是由美国 A utodesk 公司于 20 世纪 80 年代 初为微机上应用 CAD 技术而开发的绘图程序软件包 , 经 过不断完善 , 现 已经成为国际 上广为 流行的绘 图工具。 AutoCAD 允许用户定制菜单和工具栏, 并能利用内嵌语言 Autolisp 、 V isual L isp、 VBA、 ADS、 ARX 等 进行 二次 开发。 AutoCAD 是在 R2. 1版本开始嵌入 L ISP 语言的一个增强 了针对性的子集 Au toLISP , 自 R14 版本开始 , Au todesk 公 司推出了 V isualL ISP, 更进一步方便了用户对 L ISP 的使 [ 1] 用 。 在日常的绘图工作中, 常常需要定制一些软件没有的 特定图形符号, 虽然可以使用复制或定制块的形式实现 , 但将常用命令开发成类似于 Au toCAD 的内部命令对使用 者来说是非常有吸引力的。 V isual L ISP 语言可以很方便地调用 AutoCAD 的内部 命令 , 在可视化的界面进行编辑 , 完全可以胜任一般绘图 命令的二次开发。 对话框控制语言 D ialog C on trol Language( 简称 DCL) 也是内置于 AUTOCAD 中, 它弥补了 Au toLISP语言在对话 框功能上的不足 , 但可以很方便地通过 LISP 架设与 DCL 语言对话的桥梁。
用VLISP开发AutoCAD
六、调试程序 七、构造应用程序 八、用VLISP开发AutoCAD实例
A u t o C A D 定 制 与 开 发
一、概述
首页
上页
返回
下页
结束
2
A u t o C A D 定 制 与 开 发
用VLISP开发AutoLISP程序步骤
i.
ii. iii. iv. v. vi.
考虑程序所要完成的任务以及如何实现 这个任务。 设计程序。 编写代码。 规范代码格式。 检查程序中的错误。 测试和调试程序。
首页 上页 返回 下页 结束 3
VLISP是为加速AutoLISP程序开发而设计的软 件开发工具,它提供了一个完整的集成开发环境, 包括文本编辑器、格式编排器、语法检查器、源代 码调试器、检验和监视工具、文件编译器、工程管 理系统、上下文相关帮助与自动匹配功能和智能化 控制台等。在VLISP集成环境下可以便捷、高效地 开发AutoLISP程序,可得到运行效率更高、代码更 加紧凑、源代码受到保护的应用程序。
首页 上页 返回 下页 结束 5
A u t o特点(示例)
1)由于AutoLISP的一切成分都是函数,而函数又以表 结构形式存在,所以AutoLISP的所有括号都需要左右匹配。 2)AutoLISP程序阅读函数时,按从左到右的规则进行。 3)AutoLISP采用前缀表示法,将函数名放在所有操作 数之前。表中的函数与参数,各参数之间均至少要一个空 格来分开。 4)两个表之间和表内的多余空格和回车是不需要的, 故一个表可占多行,一行也可写多个表。如:(setq x 25.0) (setq y 12.2) (+(*x y) x) 5)AutoLISP程序中可以使用分号(;)作注释。
利用对话框语言DCL在CAD二次开发中对LSP语言编写的程序进行可视化管理的探讨
利用对话框语言DCL在CAD二次开发中对LSP语言编写的程序进行可视化管理的探讨摘要:随着AutoCAD 新版本的不断推出,其用户也越来越多,其用户涉及各行各业,但对AutoCAD 本身而言,它的通用性很强,而专业性并不强,因此对其进行二次开发就非常有必要,而且AutoCAD 也给用户留出了二次开发接口,由于支持AutoLISP、ADS、ARX与脚本编程,用户完全可以按照自己的要求对AutoCAD 进行定制,这也就是所说的利用AutoCAD提供的编程接口对其进行二次开发。
这也是AutoCAD应用广泛的魅力所在。
但是随着程序开发的越来越多,对程序的管理必须提到议事日程。
本文利用对话框语言DCL为例对CAD二次开发中的LSP程序管理的一点探讨。
关键词:AutoCAD AutoLISP DCL语言一、AutoLSP和DCL语言简介1.1 AUTOLSP简介LSP(List Processing Language)它产生于50年代后期,是一种资格最老的程序设计语言之一。
LSP语言是一种计算机的表处理语言,是在人工智能学科广泛应用的一种程序设计语言。
AutoLISP语言是嵌套于AutoCAD内部,将LISP语言和AutoCAD有机结合的产物。
使用AutoLISP可直接调用几乎全部AutoCAD命令。
AutoLISP语言既具备一般高级的基本结构和功能,又具有一般高级语言所没有的强大的图形处理功能,是当今世界上CAD软件中被广泛采用的语言之一。
AutoLISP语言能力虽强,但可视化性能差,在AutoLISP程序中配合对话控制语言(Dialog Contro Language,简称DCL语言),实现了程序的人机互动,使AutoLIS程序的应用更加人性化。
1.2DCL语言简介对话框是现今最流行的人机互动面接口。
AutoCAD从R12起,引入了可编程对话框(Programmable Dialog Box,简称PDB)。
用LISP语言自定义AutoCAD命令
用LISP语言自定义AutoCAD命令AutoLISP语言作为AutoCAD的二次开发工具,虽然在功能、运行速度和保密性等方面比起ARX等工具要逊色一些,但由于它易学易用,交互性好,灵活性强,对于那些经常使用AutoCAD进行绘图的普通用户来说,不失为一种理想的开发工具。
下面就介绍用AutoLISP 语言自定义的几个AutoCAD绘图命令,可以起到简化操作、提高作图效率的作用。
一、键槽尺寸视图的绘制命令“jct”在绘制轴、齿轮或带轮等零件图时,经常需要画轴上键槽处的剖视图或轮毂键槽的端面视图,比较麻烦;由于键槽的尺寸随轴径的变化而变化,所以我们可以用LISP程序来实现自动绘图。
加载下面的程序,在命令行中键入”jct”并回车,通过人机交互的形式输入有关参数,可自动完成轴上键槽的剖视图和轮毂键槽的端面视图的绘制。
代码示例如下所示。
(defun C:jct ()(setq pt0 (getpoint "\n 请输入视图的中心位置点:"))(initget 7)(setq loop T)(while loop(setq d (getreal "\n请输入键槽处的轴径(12<d<130)(mm):"))(if(or (< d 12) (> d 130))(alert "轴径数据输入错误!\n\n请重新输入!")(setq loop nil));if);while(cond;根据轴径检索键槽尺寸((and (> d 12) (<= d 17)) (setq b 5 t1 3.0 t2 2.3));b表示键槽的宽度((and (> d 17) (<= d 22)) (setq b 6 t1 3.5 t2 2.8));t1表示轴上键槽的深度((and (> d 22) (<= d 30)) (setq b 8 t1 4.0 t2 3.3));t2表示轮毂上键槽的高度((and (> d 30) (<= d 38)) (setq b 10 t1 5.0 t2 3.3))((and (> d 38) (<= d 44)) (setq b 12 t1 5.0 t2 3.3))((and (> d 44) (<= d 50)) (setq b 14 t1 5.5 t2 3.8))((and (> d 50) (<= d 58)) (setq b 16 t1 6.0 t2 4.3))((and (> d 58) (<= d 65)) (setq b 18 t1 7.0 t2 4.4))((and (> d 65) (<= d 75)) (setq b 20 t1 7.5 t2 4.9))((and (> d 75) (<= d 85)) (setq b 22 t1 9.0 t2 5.4))((and (> d 85) (<= d 95)) (setq b 25 t1 9.0 t2 5.4))((and (> d 95) (<= d 110)) (setq b 28 t1 10.0 t2 6.4))((and (> d 110) (<= d 130)) (setq b 32 t1 11.0 t2 7.4)))(command "circle" pt0 "d" d)(command "zoom" "a")(setq s1 (ssget "l" ))(setq di (-(* (/ d 2.0) (/ d 2.0)) (* (/ b 2.0) (/ b 2.0)))dx (sqrt di)dy (/ b 2.0)pt1 (list (+ (car pt0) dx) (+ (cadr pt0) dy)))(initget "Zc Lc");Zc表示画轴键槽的剖视图,Lc表示画轮毂键槽的端面视图(setq zrl (getkword "\n 画轴键槽的剖视图还是轮毂键槽的端面视图(Z/L)?"))(if (= zrl "Zc")(progn;计算轴键槽上点的坐标(setq pt2 (list (+ (car pt0) (-(/ d 2.0) t1)) (+ (cadr pt0) dy))pt3 (polar pt2 (- (/ pi 2.0)) b)pt4 (polar pt3 0 (- dx (- (/ d 2.0) t1)))));progn);if(if (= zrl "Lc")(progn;计算轮毂键槽上点的坐标(setq pt2 (list (+ (car pt0) (+(/ d 2.0) t2)) (+ (cadr pt0) dy))pt3 (polar pt2 (- (/ pi 2.0)) b)pt4 (polar pt3 (- pi) (- (+ (/ d 2.0) t2) dx))));progn);if(command "pline" pt1 pt2 pt3 pt4 "");画键槽(setq s2 (ssget "l"))(command "layer" "m" 5 "l" "center" 5 "c" 1 5 "")(command "ltscale" 8)(command "line" (polar pt0 (- pi) (+ (/ d 2.0) 10));画中心线(polar pt0 0 (+ (/ d 2.0) 10)) "")(command "line" (polar pt0(-(/ pi 2.0)) (+ (/ d 2.0) 10))(polar pt0 (/ pi 2.0) (+ (/ d 2.0) 10)) "")(command "layer" "s" 0 "")(if (= zrl "Zc")(progn(setq s3 (entsel "\n 请选择修剪的目标:"))(command "trim" s2 "" s3 "");修剪形成键槽(command "hatch" "U" "45" "2" "n" s1 s2 ""));画轴上键槽处剖视图的剖面线);if(if (= zrl "Lc")(progn(setq s4 (entsel "\n 请选择修剪的目标:"))(command "trim" s2 "" s4 "");修剪形成键槽(command "rotate" s1 s2 "" pt0 90));将轮毂键槽的端面视图旋转90度);if);end defun二、螺纹孔剖视图的绘制命令“lwk”在绘制机械零件图时,经常要画螺纹孔的剖视图,同样由于螺纹孔的有关尺寸都随螺纹的公称直径而变化,我们可以用下面的程序自动完成其剖视图的绘制。
Autolisp在CAD二次开发中的应用
Autolisp在CAD二次开发中的应用摘要:Auto LISP语言是Auto CAD中最大的一种编程工具,基于Auto LISP的编程工具,数量大的让人惊讶。
将一些小程序嵌套于AUTO LISP 内部, 使LISP 语言和AUTO CAD 有机结合,能有效地提高AutoCAD的绘图功能。
通过对Auto LISP语言的分析与研究,探讨了基于Auto LISP的AutoCAD 参数化处理数据的程序设计的基本步骤。
本文设计了如何用Auto LISP语言如何绘制典型机械零件图形,并且详细阐述了其实现过程。
实践表明,Auto LISP语言功能强大,易学易用,AutoCAD二次开发的重要工具。
关键词:Auto lisp语言; 程序设计; 二次开发随着科学技术的不断发展和社会的不断进步,计算机也越来越普遍的在各个行业中得到推广和应用。
实践证明在利用CAD绘制零件图技术在质量和速度上都产生了一个质的飞跃,使机械设计工作上了一个大台阶。
但是目前许多设计人员大多只能利用AUTO CAD软件,一笔一画地绘出所需的设计图纸,是设计人员大大部分时间都花费在繁琐的计算和绘图中,设计工作的重复性较大,工作效率较低。
如果设计人员能够对AUTO CAD进行二次开发,通过对AUTO LISP 进行编程,在CASS中加入一些用户需要的功能,从而使CASS在绘图中更具有实用化。
Auto LISP 语言是嵌入在Auto CAD内部的LISP编程语言,它是LISP语言与Auto CAD有机结合的产物。
Auto LISP的嵌入使Auto CAD真正成为能进行计算机辅助设计、绘图的软件。
VLISP是Auto LISP的换代产品。
VLISP对语言进行了扩展,可以通过Microsoft ActiveX Automation接口与对象交互。
同时,通过实现反应器函数,还扩展Auto LISP响应事件的能力。
Visual Lisp具有一个交互式和智能控制台,包括有一个项目窗口、代码分色的文本编辑器、调试器、源程序窗口及许多其他特性。
用Autolisp对AutoCAD进行二次开发
用AutoLISP对AutoCAD进行二次开发一、什么是CAD的二次开发?(为什么需要对CAD进行二次开发)我们在设计、绘图时采用AutoCAD、ProE、Solidwork、UG等设计软件,在复杂问题或特殊用途的设计中,各种软件的原有功能往往难以解决问题,例如CAD里没有直接绘制正弦曲线和抛物线等曲线的命令。
因此,只是会使用各软件的基本功能是不够的,根据我们的特殊用途进行软件的用户化定制和二次开发,往往能够大大提高工作效率和技术水平。
二、什么是AutoLisp?如何用其进行二次开发?AutoLISP是由Autodesk公司开发的一种LISP程序语言,LISP是List Processor的缩写。
通过autolisp 编程,可以节省工程师很多时间。
AutoLISP语言作为嵌入在AutoCAD内部的具有智能特点的编程语言,是开发应用AutoCAD不可缺少的工具。
当前AutoCAD的二次开发工具主要有:VisualLisp(它是AutoLisp的集成开发环境)、VBA、ObjectARX和.NET API等,这里只介绍AutoLisp。
下面由浅入深地介绍一下如何应用AutolLisp进行二次开发。
最简单的应用是在命令行中编写和执行lisp语句,进行简单的计算、绘图、查询等操作。
稍复杂些的就要把语句(代码)放到扩展名为lsp的文件中,用的时候先加载到CAD中,然后输入自定义的函数名执行。
当开发的程序越来越多,就需要进行有效的管理,使我们能方便的找到和应用这些程序。
到那个程度的时候就需要用到用户自定义的工具按钮、菜单和对话框了。
图1 根据程序数量选择二次开发形式(1)在命令行中编写和执行程序例1:(+ 2 3)例2:(setq a 2)(setq b 3)(+ a b)例3:(setq a 2)(setq b 3)(+ a b)例4:(setq p1 (list 0 0))(setq p2 (list 200 200))(command “line” p1 p2 “”) ;;语句之间不空格例5:(setq p1 (list 0 0)) (setq p2 (list 200 200)) (command “line” p1 p2 “”) ;;语句之间空格;; 表示语句(程序代码)的注释第一步:在文本中编写和保存AutoLISP程序,文件扩展名为.lsp(defun c:sin(/ lp lpx lpy N x step) ;; c:和自定义函数名sin之间不能有空格(initget 1)(setq lp (getpoint "\n Left point:")lpx (car lp) lpy (cadr lp))(initget 7)(setq N (getint "\Nnumber of cyles:"))(setq x 0 step 0.02)(command "pline" )(While (< x (* 2 N pi))(command (list (+ (car lp) x)(+ (cadr lp)(sin x))))(setq x (+ x step)))(command "line" lp (list (+ lpx (* 2 N pi)) lpy) "")(command "line" lp (list lpx (+ lpy 2))(list lpx (- lpy 2)) "") ;;注意这里用的是空的双引号“”,中间不空格(command))第二步:AutoLISP程序的加载和运行在命令行中输入appload(或ap),在弹出的“加载/卸载应用程序”对话框中选择第一步保存的*.lsp 文件。
AutoCAD系统与C语言的接口及通信研究
31 3 0 23 2 2 2 1 0
llJjlJl l {詈 击古
图 1 IE E E一74四字 节 浮 点 数 编 码示 意 5
…
ll! , 1
IE E E一74八 字节 浮 点数格 式如 图 2 最 高位 为符 号位 m, 5 , 然后 依 次是 l位 (2 2 阶码 1 1 6 —5 ) 3 . . 5 (1 ) 值 dd为 所对 应各 数值 位 的权 与该位 数字 乘积 之和 。 所表 示的 1 进 制数 s为 2位 5 ~O数 , O
徐
( 南京理工大学机械学院
诚
南京 209) 104
摘 要
本 文首先 讨论 并 对 比 了 A t A 系统 的五 种接 口方 式 , uo D C 深入 分析 A t A u C D的 D F o X
和D WG 图形 文件 的数 据 和文件 结 构 , 并介 绍 了利 用 c语 言直接 生成 D F和 D X WG 图形 文件 的改 进 方 法 该方 法在 枪 弹蛄构 设计 中已得 到很好 的应 用, 实现 了零件 图的 自动 生 成 , 大大推 动 了枪
块 节定 义起 始地 址 块 节 定 义长度 文件 末地 址
2 ~2 H 8 B
2 c一3H 5 3 ~3 6 nI 柏 ~ 9 4H 4 A一5 H 3 5 4—5 H D
常数 ( 版本 有关 ) 与
块 描述 段 层 描述 段 字 体 描述 段 线型 描述 段 视 图描 述段
图幅 的左下 角
中重点部分作出说明。
维普资讯
4
常
州
技
术
师
范
学
AutoLISP与AutoCAD的通信
• • • • •
A—65 B—66 C—67 D—68 按空格键结束。
例2:编程打印read-line输入的字符串
• (defun prlin (/ ch) • (while (/= (setq ch (read-line)) "") • (print ch) • (princ) • );while • (princ) • );end
getcorner (getcorner [基点] [提示]) getangle getorient
(getangle [基点] [提示]) (getorient [基点] [提示])
3.2.2 字符串输入函数
函数名 格式 功能
并返回字符串。[选项] 为T时允许输入空格;为 NIL时不能输入空格。 等待输入一个关键字, 并返回相应的关键字串
AutoLISP与AutoCAD的通信
3.1 command函数 调用格式: (command: [命令][参数]…) 3.1.1 参数及规则 1). 调用AutoCAD的命令及其子命令和选择项都用字符串表示, 其中字符大小写均可。 2). 数值变量可以写成数本身,也可以写成字符串的形式。 3). 对于点常数有两种表示方法,即:‘(0.4 5)和 “0.4, 5”;如果点的坐标x、y为变量,则必须表为: (list x y)。 4). Command调用参数中的空串“”,等效于在键盘上按了一次回 车 键或空格键。 5). 如果调用(command)时不带任何参数,则等效于Ctrl-C. 6). Get族函数不能用作command函数的参数。
• 例2.输入控制函数的应用
3.2.4 其它输入函数 • 1). Read-char函数 • 调用格式: (read-char) • 功能: 等待用户从键盘输入一个字符,并返回 一个整型数(即该字符的ASCII码)。 • 2). Read-line函数 • 调用格式: (read-line) • 功能: 等待用户从键盘输入一行字符串,并返 回该字符串。
LISP语言在CAD工程制图中的应用
、
2、 函数说 明 ()tr 1s v 函数用于给 A tC D系统变量赋值。系统变量名必须置 ea uo A
于双 引号 中 。
st r函数 格 式 为 :sta r be n m a e ev a (e r ai l- a e l ) v v a vu
二 、 程 制 图 LS 工 IP实 用 程 序
其 中 vr ln m …………Auo A ai e a e b a t D系统变量 C v u … …………………赋予系统变量 的值 ae l ( )m eh 系统变量 : 制 Auo IP的 cmmad函数运行时 A — 2 c dc o 控 t S L o n u tC o AD是否 回显提示 和输入。 ()t 3 s q函数用 于给变量赋值 , e 其格式如下 : (e a evle N me a e … ) st m au[ a l ] qn vu 其中N e m a …………………变量名 v u … … … … … … …赋 予 变 量 的值 l ae ( )eds 函数 暂停程 序的运行 , 4 gti t 等候用户输 人距 离 , 随后 以实数 形式返 回该距 离。gti 函数格 式为 : e s dt (e i[ o t r pj g d t i 儿Po t) tsP n m 其中 Pit on…………………距离 的第一点坐标 Po p………………须在屏幕上显示的提示信息 r t m ( )r 函数用于与 i 5po n g f 函数搭配 , 以求解 多个表达式 。其格式为 : (rg 表 达 式 ) po n 当 测 试 条 件 返 回“ ” , 函数 只 能求 解 一个 表 达式 。 po 函数 真 时 证 rg n 可用于与 i函数搭配以求解 多个表达式 。 f 3 程 序使用方法 、 假设 有一片果 园 , 充符号过密 , 填 通过使用本程 序实现 以 3 O米间 距 填充 。 () 1 打开基于 C D基础开发 的 C S A A S软 件 , 绘制一片果 园, 1所 图
基于AutoLISP的AutoCAD二次开发研究
收稿日期:2007-06-291 作者简介:郭秀娟(1961~),女,吉林省德惠市人,教授,博士.基于AutoL ISP 的AutoCAD 二次开发研究郭秀娟 范晓鸥(吉林建筑工程学院计算机科学与工程学院,长春 130021)摘要:介绍了AutoL ISP 语言的功能、特点及绘图程序,并结合实例,介绍了用AutoL ISP 对AutoCAD 二次开发的方法和过程,展示了开发的实际效果.关键词:AutoL ISP ;AutoCAD ;二次开发中图分类号:TP 39 文献标识码:A 文章编号:100921288(2008)0420082203Secondary Development R esearch of AutoCAD B ased on AutoL ISPGUO Xiu 2juan ,FAN Xiao 2ou(School of Com puter Science and Engineering ,Jilin A rchitectural and Civil Engineering Institute ,Changchun 130021)Abstract :The paper aims at introduce the functions ,characteristics ,and drawing programs of AutoL ISP lan 2guage ,and through the examples illustrates the methods and process of using AutoL ISP language to hold the sec 2ondary development ,it introduce the active effects of the secondary development.K eyw ords :AutoL ISP ;AutoCAD ;secondary development AutoCAD 具有较强的二维和三维绘图功能,且还是一个开放的、便于用户二次开发的绘图软件.目前,支持AutoCAD 二次开发环境的主要有:AutoL ISP/VisualL ISP ,VBA ,ObjectARX ,ActiveX Automation 及块和形定义等.用户可编写AutoL ISP ,ADS 或ARX 应用程序,作为新的AutoCAD 命令,满足特定用户特殊需要[1-2].1 AutoCAD 二次开发 AutoCAD 软件二次开发是在现有软件基础上,为提高和完善软件功能,使之更符合用户需求而对软件所做的开发工作,目的是提高设计质量和效率及充分发挥通用AutoCAD 软件价值.二次开发将应用对象的设计规范、构造描述、设计方法等以约束关系形式集成到通用AutoCAD 平台中去,使应用对象设计智能化、集成化,也是将AutoCAD 环境客户化的基本手段.2 AutoL ISP 语言 AutoL ISP (List Procesing Language )是一种内嵌于AutoCAD 中表处理高级程序设计语言,能够直接在AutoCAD 内部运行,是迄今人工智能领域中应用最广泛的程序设计语言之一.AutoL ISP 既具备一般高级语言的基本结构和功能,又具有一般高级语言所没有的强大图形处理功能;AutoL ISP 可直接调用几乎全部的AutoCAD 命令,它语法简洁,表达能力强,函数种类多,程序控制结构灵活;像BASIC 那样易学易用,如C 语言一般功能超群,是进行AutoCAD 二次开发的理想工具.特别是随着AutoCAD 版本的不断升级,AutoL ISP 功能更强、开放性更好、更便于二次开发,为我们开发适合于本专业的CAD 系统提供极大的便利. 第25卷 第4期2008年12月吉 林 建 筑 工 程 学 院 学 报Journal of Jilin Architectural and Civil Engineering Institute Vol.25 No.4Dec 12008 211 AutoL ISP 特点 AutoL ISP 语言继承了L ISP 语言的基本特征,又具有调用AutoCAD 命令的功能,使图形编辑软件Auto 2CAD 变成真正进行计算机辅助设计绘图出图的应用软件.AutoL ISP 语言又称为符号语言、函数语言,其最基本的数据类型是符号表达式,具有以下特点:①AutoL ISP 语言是在普通L ISP 语言基础上,扩充了许多适用于AutoCAD 应用的特殊功能而形成的计算机语言,是一种仅能以解释方式运行于AutoCAD 内部的解释性程序设计语言;②AutoL ISP 语言的一切成分是以函数形式给出的,执行AutoL ISP 程序就是执行一些函数,再调用其他函数;③AutoL ISP 语言把数据和程序统一表达为表结构,故可把程序当作数据来处理,也可把数据当作程序来执行;④AutoL ISP 语言程序运行过程就是对函数求值的过程,是在函数求值过程中实现函数功能;⑤AutoL ISP 语言典型的程序结构是递归方式.递归方式的使用,使得程序设计简单易懂.212 AutoL ISP 应用 AutoL ISP 是一种解释执行语言,用户可在AutoCAD 命令提示符下执行简单的AutoL ISP 函数;Au 2toL ISP 源程序是以3.L SP 形式存储的,源程序编辑过程是:①运行AutoCAD ;②选取工具菜单栏的Au 2toL ISP 或VisualL ISP ,进入编辑窗口;③编辑程序、进行语法检查、加载;④由(load )函数调用并运行[3].(1)扩充和修改的命令,可用Auto L ISP 定义一个AutoCAD 扩充命令,此命令和AutoCAD 内部命令同样使用.(2)AutoL ISP 提供完整的数学函数,能够进行复杂的数学运算,亦可用于设计计算.(3)可使用Command 函数生成和编辑图形,并可执行几乎所有AutoCAD 命令,固可自动生成图形.(4)可操作Auto L ISP 的系统变量.(5)可生成各种图形(函数曲线).(6)AutoL ISP 可实现参数化绘图程序设计,包括尺寸驱动程序和鼠标拖动程序等.由于Auto L ISP 可开发用户应用程序,利用这些程序,使得AutoCAD 不仅是一个绘图工具,而是一个强有力的辅助设计工具.3 AutoL ISP 程序实例实例1 批量修改多义线宽 如在需大量修改多义线宽的图形中,用pedit 命令,一根一根地改线宽非常慢,笔者用AutoL ISP 语言编一个函数程序,完成一次性选定修改.程序如下:(defun C :wpline ();统一修改线宽(setq s (ssget )w (getreal “width :”))(setq n (sslength s )n (-n 1))(while (>=n 0);循环(setq n1(ssname s ));取当前目标名称(if (k (cdr (assoc 0(entget n1)))“polyline ”)(command “pedit ”(cdr (assoc -1(entget n1)))“w ”“w ”“x ”))(setq n (-n 1));目标个数减“1”))实例2 自动插窗程序 在墙体上插入门窗且自动设置洞口是建筑设计制图中经常遇到的工作,这项工作常会耗费设计人员很多的时间和精力.下面的程序通过几个关键点选择,就可以自动地在双线墙上插入门窗并自动开设洞口[4].自动插入窗的源程序代码如下:(defun rtd (a )(3180.0(/a pi )))(defun c :kaidong2(/pt0pt01pt1pt2pt3pt4s w ang ang1kro )38 第4期郭秀娟,范晓鸥:基于AutoL ISP 的AutoCAD 二次开发研究(setq pt0(getpoint“\n拾取墙线中点:”))(setq pt01(getpoint pt0“\n测量墙厚:”))(setq s(distance pt0pt01))(princ“\n墙厚:”)(princ s)(setq ang(getangle pt0“\n拾取墙线上一点(与基点同一直线):”)) (setq w(getdist“\n输入洞口宽度:”))(setq ang1(angle pt0pt01))(setq pt1(polar pt0(+ang pi)(/w2))) (setq pt2(polar pt0ang(/w2)))(setq pt3(polar pt1ang1s)pt4(polar pt3ang w))(command“break”pt1pt2)(command“break”pt3pt4)(command“line”pt1pt3“”)(command“line”pt2pt4“”)(if(>=ang1pi)(setq kro(rtd ang)kro(+(rtd ang)180))(command“insert”“window”pt0(/w1000)(/s100)kro))此程序在建筑设计运用过程中,还应考虑到图层的设置问题,可运用Command函数调用AutoCAD的Layer命令来操作,或运用While或Repeat循环函数来设置连续操作.由本文实例可看出,对于许多重复性的工作,用AutoL ISP编程,可以使绘图工作自动化,大大减少设计人员的工作量.AutoL ISP程序非常简洁、表达能力强,若将程序加入到ACAD.L SP文件中,就可以如同A2 CAD的基本命令一样使用.4 结语 AutoL ISP语言作为AutoCAD的二次开发工具,可较好地实现参数化绘图的方法.AutoL ISP作为一种解释型高级语言,其主要缺点是执行速度慢,源程序保密性差,大量数据的运算效率较低.AutoL ISP程序一旦编辑完成后,只要给定尺寸参数,就可以用此程序自动完成图形的绘制,从而达到高效、准确的绘图目的.把大量、复杂的操作进行有效的封装,减少设计人员的机械性、重复操作,使其能把主要精力投入到如何设计上,缩短设计周期,提高了工作效率和经济效益.参 考 文 献 [1] 梁春雪,崔洪斌,吴义忠1AutoL ISP实用教程〔M〕1北京:人民邮电出版社,19981 [2] 康保成1AutoL ISP程序在AutoCAD中的应用实例〔J〕1山西建筑,2002(3):157-1581 [3] 黄秀琴1基于Visual L ISP的AutoCAD2000的二次开发研究〔J〕1常州工学院学报,2002(4):5-71 [4] 蓝屹生1AutoL ISP学习导引(适用于R14-2002)〔M〕1北京:中国铁道出版社,2003148吉 林 建 筑 工 程 学 院 学 报第25卷。
AUTOCADLISP操作数据库
AUTOCADLISP操作数据库AutoCAD Lisp操作数据库是指在AutoCAD环境下,使用Lisp语言与数据库进行交互,实现数据的读取、写入、更新等操作。
Lisp是一种程序设计语言,可以与AutoCAD软件进行集成,为用户提供更强大的功能。
在AutoCAD Lisp中,可以使用Open Database Connectivity(ODBC)接口实现与数据库的交互。
ODBC是一种标准的数据库访问接口,可以使Lisp程序与各种类型的数据库进行通信,包括MySQL、SQL Server、Oracle等。
首先,需要在Lisp程序中设置ODBC连接,连接到指定的数据库。
可以使用`setq`命令定义一个连接字符串,其中包括数据库的用户名、密码、主机地址等信息。
然后使用`odbc-connect`函数建立与数据库的连接。
连接数据库后,可以使用一系列的Lisp函数进行数据库操作。
例如,可以使用`odbc-query`函数执行SQL查询语句,并将查询结果保存为Lisp列表。
查询结果可以用于绘制AutoCAD图形,或者用于其他需要的操作。
另外,还可以使用`odbc-exec`函数执行SQL更新语句,实现对数据库进行增删改操作。
更新操作可以用于修改AutoCAD图纸中的对象属性,或者更新数据库中的记录。
除了使用ODBC接口,还可以使用其他库函数实现数据库操作。
例如,可以使用`sql-find`函数查询数据库中的记录,并将结果存储在Lisp变量中。
查询结果可以用于自动创建AutoCAD图形,或者进行其他处理。
此外,还可以使用Lisp的特性,如循环、条件判断等,将数据库操作与AutoCAD绘图功能结合起来。
例如,可以根据数据库中的记录生成不同的图形,或者根据图纸中的对象属性更新数据库中的数据。
总之,AutoCAD Lisp操作数据库是一种强大的功能,可以实现与数据库的无缝集成。
通过Lisp语言的灵活性和AutoCAD的绘图功能,可以实现自动化的数据库操作,提高工作效率。
基于AutoCAD线型选择的AutoLISP二次语言开发与实现
电子信息 !"#$%&$'(') *+&,-./&$01$21(3$&)%$4%)%)'
科/3线型选择的 /012(456 二次语言开发与实现
徐5萌
金山职业技术学院!江苏扬中!%"%%$$
摘5要传统的 6DQZ96!工程图纸中主要以线型为主 若需要完成一个工程项目工程师需要在系统中对图层与线型进行 不断的切换最终找到一个适宜的图层整个过程比较繁琐工作效率也相对较低 由此本文提出了 6DQZI#NB二次语言编程并 基于 6DQZ96!线型选择研究 6DQZI#NB二次语言开发与实现以期能够为工程师图纸的编辑与提高工程施工效率提供理论依据
关键词6DQZ96!6DQZI#NB二次语言开发实现
"概述 6DQZ96!是相关工程 建 设 中 普 遍 适 用 且 功 能 较 强 的 绘 图 软件可用于指导工程的施工过程在工程施工中具有重要的 作用 现阶段工程师在利用 6DQZ96!软件进行绘图时经常 需要根据实际情况开发一些符合工程的 6DQZ96!工具用以 支撑整个工程的顺利实施 而 6DQZI#NB作为一种二次语言开 发编程工程师可利用其对 6DQZ96!进行二次编辑于开发 然 而现阶段工程师在利用 6DQZI#NB二次语言开发编程进行相 应数据的二次开发经常出现程序混款操作复杂等问题不利 于相应工程的顺利开展 由此本文基于 6DQZ96!线型选择 研究 6DQZI#NB二次语言开发与实现具有重要的意义 %-./01234与 -./05-6的相关理论概述 随着科学技术的发展I#NB作为智能领域中广为应用的 一种语言设计程序主要在专家系统定理证明机器人人工 智能等领域被引用 I#NB经过了二十多年的发展历程经过多 个发展版本最终形成了 6DQZI#NB 6DQZI#NB是将 I#NB与 6D2 QZ96!进行有机结合使用该种语言能够调动 6DQZ96!内部 的所用应用 现阶段在系统中进行相应的图纸绘制工作需 要运用到不同的线条线型会根据图层的性质来区分线条的作 用 一般在绘制过程中粗实线主要用于图像轮廓的绘制而 细实线则用于画一些基本的面部轮廓虚线主要用于画一些不 可见的轮廓等 该工作整体存在效率低工作量大等问题不 利于系统软件的整体运行 而 6DQZI#NB作为一种语言程序嵌 入 6DQZ96!内部能够对相关语言进行二次开发可提供一些 多种颜色的线型选择模块极大的提高了工作人员的工作效 率 6DQZI#NB语言是一种具备高级语言的功能与结构还具有 特殊的图形处理功能现在已经在相关领域中得到广泛应用 而对 6DQZI#NB语言进行二次开发能够将 6DQZ96!内部的应 用进行编辑与修改将一些功能进行随意扩大建立相应的数 据库与图形库继续对编辑的图片进行直接修改或者访问进 而开发一个全新的软件包等 且将 6DQZI#NB与 6DQZ96!进行 深入融合可以将软件内部的图片等信息进行交互设计通过 一系列的编辑过程最后成为一个用于计算机辅助设计软件 设计等工具性软件 且该软件易于被操作者使用与学习 为了使系统中工程师与程序之间进行便捷的数据交换让 一些工程师对系统更加了解在软件系统内部设置对应的对话 框是一个必不可少的工作 而 6DQZ96!拥有一套自己的对话 框工程师能够在该对话框中进行语言设计该过程被称为工 程师与系统之间的对话框控制语言 6DQZ96!线性选择模块 在 6DQZI#NB中的应用被定义为一个简单的对话框其中还包 括列表框按钮和编辑框等部分在实际应用中这些部分被称 为控件 在软件系统中一些语言或者行为动作均是由这些控 件进行全面布局与控制的 当工程师进入软件系统只需要简
PSCAD与C语言借口方法
PSCAD_EMTDC 与C语言借口方法在PSCAD中要实现新的算法,首先要建立一个自定义元件。
自定义元件分为两种,一种是电气元件,一种是信号处理元件。
本帖实现的内容是一个非线性电感,其电感值随着电流大小而变化,属于电气元件。
写控制算法的同学可能主要用到后者,将输入信号经过一系列的处理计算得到一个输出信号。
问题1:将程序写在哪里?首先要将算法程序分成两个部分:一部分是PSCAD可以实现的,如处理仿真参数、读入仿真数据、输出仿真结果以及积分、微分等简单函数。
这部分内容写在自定义元件definition的Script中。
可以写在Fortran 中也可以写在DSDYN中,两者略有不同但不会影响简单应用,具体内容请参阅帮助文件。
另一部分是我们自己的C语言算法,要将C算法总结成y=f(x,p)的输入输出形式的形式写在一个*.c文件中。
并添加到PSCAD的File Reference中。
C函数的命名形式一定是void XX_XXX__()的形式,注意名字中的下划线,本人的试验结果是必须有这三个下划线,哪位同学有其他发现可以一起探讨一下。
问题2:如何传数据?由于PSCAD和C函数是互相传递指针,因此就需要将C函数写成f(y,x,p)的形式,例如:void ja_model__(real *h,real *ht,real *mt,real *ms,real *a,real *alpha,real *c,real *k,real *b,real *m)。
其中h是输出,ht,mt是输入,后面的都是参数。
在PSCAD中用call语句调用,例如:CALL JA_MODEL(H,HT,MT,$MS,$A,$ALPHA,$C,$K,B,M) 。
注意函数名中的下划线,这里只有一个!其中H,HT,MT都是Fortran程序中的变量,后面参数前面加“$”是引用参数的意思,具体内容请参阅帮助文件。
问题3:如何保存前一时刻的变量并在本时刻调用?在时域仿真的时候我们不可避免的要用到上一时刻的某些计算结果。
基于LSP实现C++与AutoCAD接口
基于LSP实现C++与AutoCAD接口
刘天立;费鹏
【期刊名称】《黑龙江交通科技》
【年(卷),期】2004(027)007
【摘要】给出了C++与AutoCAD接口程序的设计方法,根据LSP程序文件格式,借助于C++的文件管理功能,设计出了接口程序,在自行开发软件与AutoCAD之间建立起了数据通道,从而实现了数据传递和共享.实践证明该方法适用、方便.
【总页数】2页(P79-80)
【作者】刘天立;费鹏
【作者单位】哈尔滨理工大学计算中心;黑龙江省交通科学研究所
【正文语种】中文
【中图分类】TP3
【相关文献】
1.运用VisualLSP语言实现AutoCAD绘图初始化环境的设置 [J], 郭建生;胡吉全
2.基于LSP实现C语言与AutoCAD接口 [J], 李昕;刘天立;王丽
3.用VC实现基于DXF文件的AutoCAD数据共享接口 [J], 李晨
4.基于AutoCAD平台采用C++实现模具的参数化自动设计 [J], 李长波
5.基于DXF实现C语言与AutoCAD接口 [J], 刘天立
因版权原因,仅展示原文概要,查看原文内容请购买。
AutoCAD与C语言的接口.
(上接第6页
参 考 文 献
1王忠魁.麻花钻后角的计算与研究.工具技术. 1993, 27(11 :13~17
2王忠魁.麻花钻内锥面刃磨法.工具技术. 1997, 31(10 :13~16
T he Study of the Phenomenon of U p -tail
4问题的解决
用PLT图形输出文件作为图形交换文件的指导思想,就是用计算机高级语言的图形屏幕来模拟绘图机的绘图动作,以达到A uto CAD的图形到高级语言的图形交换。由于PLT文件绘图信息指令的特殊结构,只用到了高级语言的绝对坐标画直线;相对坐标画直线;绝对坐标画笔移动和改变画笔颜色(换笔四个绘图语句,就可完全实现Auto CAD到高级语言图形转换。在编写转换程序时,要解决下面二个关键问题:
y2=0; gr =(・
22・陕 西 工 学 院 学 报第14卷
gr oup=(fg etc(stream ;y 2=10*y 2+w [i];
if (isdig it (g roup
}w [i]=group-48; line(x1/21, 479-y1/17, x 2/21, 479-y 2/17 ; }
¼绘图机终止结束指令,一般是文件的最后3个字符。
下面是一个配置为HP-7475绘图机的PLT图形输出文件,不难划分其绘图指令信息组成。
← . (; ← . I 8; ; 17:← . N ; 19:IN ; SC ; PU ; PU ; SP 1; LT ; VS 10; PA 1405, 2221; PD ; PA 6259, 2221; PU ; SP 2; PA 3031, 3215; PD ; PA 6604, 3215; PU ; SP 3; PA 3622, 4177; PD ; PA 3660, 4136; PA 3700, 4098; PA 3743, 4062; PA3789, 4030;PA3836, 4001; PA3885, 3975; PA3936, 3952; PA 3989, 3933; PA 4043, 3918; PA4097, 3907; PA4152, 3899; PA4208, 3895; PA4263, 3895; PA 4319, 3898; PA 4374, 3906; PA 4429, 3917; PA 4483, 3932; PA 4535, 3950; PA 4586, 3972; PA 4636, 3998; PA 4684, 4027; PA4729, 4059; PA4772, 4094; PA4813, 4132; PA4851, 4173; PA 4886, 4216; PA4918, 4261; PA4947, 4309; PA4973, 4358; PU; PA0, 0; SP;
用编程方式调用AutoCAD命令的技术
⽤编程⽅式调⽤AutoCAD命令的技术It's quite common to want to call commands from one or other of AutoCAD's programming environments. While it's cleanest (from a purist's perspective) to use an API to perform the task you want, the quickest way - and the one which will appeal to the pragmatists (and the lazy) among us is often to call a sequence of commands. And there are, of course, a few places in AutoCAD where APIs have not been exposed, so scripting commands is the only way to achieve what you want.想在AutoCAD的各种编程环境中调⽤命令是⾮常平常的事,但是使⽤API来完成你想要做的事是⾮常简洁的(纯论者的观点),最快捷的⽅式——对于像我们这样的实⽤主义者(和懒惰的⼈)来说是经常调⽤⼀系列命令。
并且,当然,在AutoCAD中有⼀些地⽅的API还没有开放,所以达到⽬的的唯⼀途径就是使⽤脚本命令了。
Let's take the simple example of adding a line. Here's what you'd do from the different environments from a low-level API perspective:让我们举⼀个简单的添加直线的例⼦,下⾯是在不同的环境中,按照低层API的观点来说你应该做的:LISP - create an association list representing the entity and then (entmake) itLISP——创建⼀个关联列表来表⽰实体然后执⾏它VBA (or COM) - get the ModelSpace object from the active drawing and call AddLine (the COM API is probably the simplest in that respect)VBA(or COM)——从当前激活的图形中获得ModelSpace对象,然后执⾏AddLine(COM API⼤概都是这么简单).NET and ObjectARX - open the block table and then the model-space block table record, create a new line object and append it to the model-space (and to the transaction, if you're using them), closing the various objects along the way.NET and ObjectARX ——打开块表(block table)然后再打开模型空间(model-space)块表(block table)记录,创建⼀个新的直线对象并且将这个对象添加到模型空间⾥(model-space)(如果你⽤事务的话就通过事务来完成),关闭这⼀过程中⼀系列的对象Having first started coding for AutoCAD with LISP (for R10), I know that the simplest way to do what you want from that environment is to call the LINE command, passing in the start and end points:(command "_LINE" "0,0,0" "100,100,0" "")LISP is great in that respect: as you're not able to define native commands (only LISP) functions, it's perfectly acceptable to use it to script commands to do what you want, rather than rely on low-level APIs.ObjectARX in particular has potential issues with respect to defining native commands calling commands, as AutoCAD is only "re-entrant" up to 4 levels. Without going into specifics, it's basically best to avoid calling commands using acedCommand() from ObjectARX, unless the command is registered as a LISP function using acedDefun().While you do have to be careful when calling commands from VBA or ObjectARX, there are a few options available to you.ObjectARXads_queueexpr()This old favourite is intended to be used from acrxEntryPoint() to execute a sequence of commands after (s::startup) has beencalled from LISP (as you are not able to use acedCommand() from this context)You need to declare it yourself (extern"C"void ads_queueexpr( ACHAR *);) before useIt has been unsupported as long as I can remember, but is widely-used and mentioned in the Tips & Techniques section of the ObjectARX Developer's GuideAcApDocManager::sendStringToExecute()This function has the advantage of a few more options being available as arguments, mainly around where to execute the string (which document, and whether it be activated), and whether to echo the string to the command-line::SendMessage()This is a standard Win32 platform API and so can, in effect, be used to drive AutoCAD from an external client. It uses a structure to pass the string that is often a bit tricky to set up (it became a migration issue when we switched to Unicode, for example) IAcadDocument::SendCommand()This COM method is the only way (other than acedCommand() or acedCmd()) to execute a command synchronously fromAutoCAD (and even then it may not be completely synchronous if requiring user input)acedCommand()This is the ObjectARX equivalent to (command), and is genuinely synchronous. Unfortunately (as mentioned earlier) there are issues with using it directly from a natively-registered command, so I'd recommend only using it from acedDefun()-registeredcommands (see the ObjectARX documentation and the below sample for more details)VBA (some of which also applies to VB)ThisDrawing.SendCommandThis is the same as IAcadDocument::SendCommand() from C++SendKeysThis is just a simple technique to send key-strokes to the command-lineSendMessageThis is just the Win32 API mentioned above, but declared and called from VB(A)So, now for some sample code...ObjectARX sample codeThe first can be dropped into an ObjectARX Wizard-defined project (I used Visual Studio 2005 and ObjectARX 2007). You'll need to make sure "COM-client" is selected and you name your project "SendingCommands" (or you search and replace to change the name in the below code to something you prefer).The code creates points along a line (from 0,0 to 5,5), using different techniques to send the command to AutoCAD. I would, of course, use the proper ObjectARX APIs to do this (creating an AcDbPoint etc.) - I just used this as an example of a command that could be sent.It creates the first point on load, using ads_queueexpr(), and defines commands (TEST1, TEST2, TEST3 and TEST4) for the subsequent tests (the last being an acedDefun()-registered command).#include"StdAfx.h"#include"resource.h"#define szRDS _RXST("Adsk")extern"C"void ads_queueexpr( ACHAR *);//----- ObjectARX EntryPointclass CSendingCommandsApp : public AcRxArxApp {public:CSendingCommandsApp () : AcRxArxApp () {}virtual AcRx::AppRetCode On_kInitAppMsg (void *pkt) {// You *must* call On_kInitAppMsg hereAcRx::AppRetCode retCode =AcRxArxApp::On_kInitAppMsg (pkt) ;return (retCode) ;}virtual AcRx::AppRetCode On_kUnloadAppMsg (void *pkt) {// You *must* call On_kUnloadAppMsg hereAcRx::AppRetCode retCode =AcRxArxApp::On_kUnloadAppMsg (pkt) ;return (retCode) ;}virtual AcRx::AppRetCode On_kLoadDwgMsg(void * pkt) {AcRx::AppRetCode retCode =AcRxArxApp::On_kLoadDwgMsg (pkt) ;ads_queueexpr( _T("(command\"_POINT\" \"1,1,0\")") );return (retCode) ;}virtual void RegisterServerComponents () {}public:// - AdskSendingCommands._SendStringToExecTest command (do not rename)static void AdskSendingCommands_SendStringToExecTest(void){acDocManager->sendStringToExecute(curDoc(), _T("_POINT 2,2,0 "));}static void SendCmdToAcad(ACHAR *cmd){COPYDATASTRUCT cmdMsg;cmdMsg.dwData = (DWORD)1;cmdMsg.cbData = (DWORD)(_tcslen(cmd) + 1) * sizeof(ACHAR);cmdMsg.lpData = cmd;SendMessage(adsw_acadMainWnd(), WM_COPYDATA, NULL, (LPARAM)&cmdMsg);}// - AdskSendingCommands._SendMessageTest command (do not rename)static void AdskSendingCommands_SendMessageTest(void){SendCmdToAcad(_T("_POINT 3,3,0 "));}// - AdskSendingCommands._SendCommandTest command (do not rename)static void AdskSendingCommands_SendCommandTest(void){try {IAcadApplicationPtr pApp = acedGetIDispatch(TRUE);IAcadDocumentPtr pDoc;pApp->get_ActiveDocument(&pDoc);pDoc->SendCommand( _T("_POINT 4,4,0 ") );}catch(_com_error& e) {acutPrintf(_T("\nCOM error: %s"), (ACHAR*)e.Description());}}// ----- ads_test4 symbol (do not rename)static int ads_test4(void){acedCommand(RTSTR, _T("_POINT"), RTSTR,_T("5,5,0"), RTNONE);acedRetVoid();return (RSRSLT);}} ;// ----------------------------------------------------------ACED_ARXCOMMAND_ENTRY_AUTO(CSendingCommandsApp, AdskSendingCommands, _SendStringToExecTest, TEST1, ACRX_CMD_TRANSPARENT, NULL)ACED_ARXCOMMAND_ENTRY_AUTO(CSendingCommandsApp, AdskSendingCommands, _SendMessageTest, TEST2, ACRX_CMD_TRANSPARENT, NULL)ACED_ARXCOMMAND_ENTRY_AUTO(CSendingCommandsApp, AdskSendingCommands, _SendCommandTest, TEST3, ACRX_CMD_TRANSPARENT, NULL)ACED_ADSCOMMAND_ENTRY_AUTO(CSendingCommandsApp, test4, true)// ----------------------------------------------------------IMPLEMENT_ARX_ENTRYPOINT(CSendingCommandsApp)VBA sample codeThis sample defines VBA macros that create points from 6,6 to 8,8, using techniques that mirror the ones shown in the ObjectARX sample. Option Explicit OnPrivate Const WM_COPYDATA = &H4APrivate Type COPYDATASTRUCTdwData As LongcbData As LonglpData As StringEnd TypePrivate Declare Function SendMessage Lib"user32"Alias _"SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal _wParam As Long, ByVal lParam As Any) As LongPublic Sub SendMessageToAutoCAD(ByVal message As String)Dim data As COPYDATASTRUCTDim str As Stringstr = StrConv(message, vbUnicode) 'converts to Unicodedata.dwData = 1data.lpData = strdata.cbData = (Len(str) + 2)SendMessage(ThisDrawing.Application.hwnd, WM_COPYDATA, 0, data)End SubPublic Sub Test4()ThisDrawing.SendCommand("_point 6,6,0 ")End SubPublic Sub Test5()SendKeys("_point 7,7,0 ")End SubPublic Sub Test6()SendMessageToAutoCAD("_point 8,8,0 ")End Sub。
CAD创建Lisp程序步骤
使用Visual LISP创建简单的LISP应用程序作者:佚名点击数:1523 更新:2007-2-2 7:08:10 热★★★【字体:小大】a>本节通过一个简单的实例来讲述LISP程序的创建过程,介绍编制LISP程序的一些基本步骤,以及LISP程序在AutoCA D中的加载和运行的方法。
首先来创建一个最简单的LISP程序—-“Hello.lsp”,在AutoCAD 2002中加载并运行该程序,将会在命令行出现-“Hello, Visual LISP!”。
36.2.1 Visual LISP与AutoCAD的通信用户可以直接在AutoCAD命令行中键入AutoLISP表达式。
AutoCAD通过括号来确认AutoLISP表达式。
AutoCAD每当发现一个左括号,就确认为AutoLISP表达式,并由AutoLISP求表达式的值后返回AutoCAD,AutoCAD使用返回结果并继续进行其他工作。
注意在AutoLISP表达式中,左、右括号必须配对,否则AutoCAD将给出提示符n>,n表示右括号丢失数目。
此外,在AutoCAD中调用并执行AutoLISP程序。
在AutoLISP程序中采用COMMAND函数来与AutoCAD命令程序处理器通信,COMMAND从AutoLISP获得命令并将其传给AutoCAD。
36.2.2 实例1 最简单的LISP程序——“Hello.lsp”Step 1 创建新文件(1) 运行AutoCAD 2002系统,以“acadiso.dwt”为样板创建图形文件,并调用“vlisp”命令进入Visual LISP环境。
(2) 单击“Standard(标准)”工具栏中的按钮,新建一个LISP文件。
Step 2 输入代码并保存文件(1) 在编辑窗口中输入源文件“Hello.lsp”的代码,如图36-3所示。
程序清单如下:;;;* Hello.lsp –Visual LISP文件实例(prompt "Pick point:") ;指定运行时的提示信息(setq ipt (getpoint)) ;在屏幕上指定一点并将其坐标值赋予变量“ipt”(setq hgt 15) ;给变量“hgt”赋值(Command "_.TEXT" "_S" "STANDARD" ipt hgt 0 "Hello, Visual LISP!");调用“Commnad”函数与AutoCAD进行通信(2) 单击“Standard(标准)”工具栏中的按钮,以“Hello.lsp”为名保存该文件。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
t n f rn e a d s a e C e raie .I h e n p o e y p a t e t a t i m t o s p r s e c h r a b e l d t a b e rv d b rc c h t s e d i 】 a e n n z s i h h
“
图 1 生 成 D F文 件 流 程 X
c ce写 到 L P程 序 文 件 中 , 把 直 线 段 的实 体 il r ” S 再
标识 “i ” 到 L P程 序 文 件 中 , 把 起 点 坐 标 le 写 n S 再 x ,1写到 L P程序 文件 中 , 后 把终 点 坐标 ) , 1y S 最 【 2 y 到 L P程序 文件 中 。 2写 S ( )圆 的接 口程序 2 生成 圆 的函数 原型定 义 为 :
程序 的设 计方 法 , 设计 出 了接 口程序 , 自行 开 发 在
软件 与 A tC D之 间建立 起 了数据 通道 。 uo A
1 接 口程 序 的设 计
A tC D能够 运行 L P程 序 。在 A tC D命 uo A S u A o
具 有特别 格 式 的 A CI码 程序 文件 。 L P程 序文 S I S
参 考 文 献
望 . u C D O0计 算机 绘 图 软件 包 [ . 京 : At A I. o M] 北
海 洋 出版 社 ,9 1 ()43— 5 . 19 ,2 :2 40 [] 孙 志 挥 . 言 程 序 设 计 简 明 教 程 []南 京 : 京 工 2 C语 J. 南
基 于 L P实 现 C语 言 与 A t A S uo D接 口 C
李 昕 刘 天 立 王 丽 , ,
( . 尔滨 锅 炉厂 有 限责 任 公 司 , 龙 江 哈 尔滨 104 ; . 尔滨 理 工 大 学 , 龙 江 哈 尔滨 108 ; 1哈 黑 506 2 哈 黑 500
3 .黑 龙 江 省 自动 化研 究 所 , 龙 江 哈 尔滨 10 01 黑 50 )
第一步, 写” 以“ 的方 式打 开一个 文本 文件 [ 引, 并 获得 文 件指针 p s。 L p FL ; 定 义 文件指 针 p x IE p / D ̄ " /
ps Lp=f e ( p i N m ,“ ” ; o n 1 Fl a e W ) p s e
[] 希 1
vi CetCr e n8 x ,at o f a r o r e i l( ot O f o y ,ot ) d a c l l
3 应 用 实例
高强度 螺栓 连接 的钢结 构构架 是 大型 电站锅 炉 的重 要部 件 。采 用 本 文介 绍 的接 口程 序 , 由计
算 结果 生成 L P程序 文件 , 少 了很 多 手工 劳动 , S 减 使设 计周 期 缩 短 为原 来 的 1 3 设 计 效 率 明 显 提 /,
fc rga h s b e e i e a e n t efr o h S l y u igt e f e ma g me ta a ・ a e p r m a e n d sg d b s d o h o m ft e L P f eb sn l na e n fC ln o n i h i g a e.T e d t h n e a e n b i ewe n te s l e eo e o wae a d Auo C u g h aa c a n lh b e uh b t e ef d v lp d s f r s h t n t AD.T e d t h aa
收 稿 日期 :O2—0 2O 8—0 6
作者简介 : 李 昕(9 3 , 。 龙江 哈 尔滨 人 。 业 于 哈 尔 滨 工程 大 学计 算 机 专 业 。 事 技 术 管理 工 作 。 17 一) 男 黑 毕 从
维普资讯
・
5 ・ 6
锅 炉 制
数 分别 是 : (o m n “ie “ 起 点 x坐 标 ) ( 点 y坐 cm ad l ” ( n ,起 标) ( ‘终点 x坐标 ) ( 点 y坐标 ) “ ) ,终 ” ” (o m n “i l “ 圆心 x坐标 ) ( cm a d c c ” ( re , 圆心 y坐 标 ) “ 半径 ) ) ”< ” 有 关 L P程 序文 件格 式 的更多 资料请 参考 其 S
3 H i nj n rvni uoR sa hIst e a i 100 , h a . e_ gi gpoet A t eer tu ,H r n 50 1 C i ) l  ̄ a l a c n it b n
Ab ta t h e inn t o fC ln u g n t AD n efc rga r n md a .T eitr s r c :T e d sg igmeh d o a g a e a d Auo C itra ep rm ae it u o 1 h ne -
造
总 第 16期 8
件 具有 扩 展 A t A 的 最 强 的 能 力 。使 用 函 数 uo D C
(o m n ( 元 ) ) 实 现 在 L P程 序 内执 行 cm ad 变 … 能 S
第 二 步 , 义 实 体 属 性 。 通 过 文 件 指 针 定 p s , 实体 属性 信息写 到 L P程序 文件 中 。 Lp 把 S 第三 步 , L P文 件 中写 实 体 。调 用 生成 实 向 S 体 的 函数 , Cet ie Cet i l, 过 文 件 指 如 ra Ln 、 r e r e 通 e a Cc 针 p s , 实体数 据写 到 L P文件 中 。 Lp 把 S 第 四步 , 并关 闭 文件 。
维普资讯
第 1 期 2O 0 3年 2月
锅 炉 制 造
BOI R M ANUF TU NG LE AC RI
N 1 o.
E b. 0 3 e 20
文 章 编 号 :N 3—14 (03 0 —05 0 C2 2 920 ) 1 05— 2
4 结 束 语
根 据 L P程 序文件 格 式 , 助 于 C语 言 的文 S 借
件 管理 功能 , 计 出 了接 口程 序 。在 自行 开 发 软 设 件 与 A tC D之 间建立 了数 据通 道 , 数据 传 递 uo A 把 给 At A uo D。在 工 程设 计 中应 用 , C 可提 高设 计 效
他 书籍 … 。
1 2 设计 接 口程序 .
向L P文件中写实体 S
( )直线 段 的接 口程序 1 生 成直线 段 的 函数 原型 定义 为 :
vi Get ie f a x , ot l f a x , ot o r e n ( ot l f a,y , ot 2 fa d al l l l l y) 2
摘
要 : 出 c语 言 与 A t A 接 口程 序 的设 计 方 法 , 据 L P程 序 文 件 格 式 , 助 于 c语 言 的文 件 管 理 功 给 uCD o 根 S 借
能 。 计 出 接 口程 序 , 自行 开 发 软 件 与 A t A 设 在 u C D之 间 建 立 起 了 数 据 通 道 , 而 实 现 了数 据 传 递 和共 享 。实 践 o 从 证 明该 方 法 适 用 、 便 。 方
关 键 词 : 口程 序 ;S 接 L P程 序 文件 格式 ; 件 管 理 ; 据 通 道 文 数
中 圈分 类 号 :P 9 T 3 文 献 标 识 码 : B
Re lzn n e f c fC n u g n t a ii g I t ra e o La g a e a d Au o CAD y LS Fi b P l e
0 引 言
随着计 算机 技 术 的发 展 , 出现 了很 多高 级 语
言开 发环 境 及 C D软件 。 / A C C+ +是 现 阶段 应 用
令 行输入 (od ( S 1 “ L P程 序 ) ) 以装 入 一 个 LP a ”可 S 程 序 文 件 。运 行 L P程 序 , u C 可 以 自动 生 S At A oD 成工程 图 。高级 语 言 多 数都 有 文 件 管理 功 能 , 特 别是 C C++有丰 富的输 入输 出函数 库[ / 。利 用 高级语 言 的文件 管理 功能 , 设计 出接 口程序 , 调用 接 口程 序 , 就可 以生成 L P程 序 文 件 。再 用 (od S 1 a “ LP程序 ) ) L P程 序装 入 A t A (S ”把 S uo D并 运 行 , C
L n。 删 IXi , Ta — l in i WA , NG 厶
( . abn B i rC . Ld. H bn 10 4 ,C ia . abn U i .S i eh. rbn 1 0 8 1 H r i ol o , t 。 a i 5 0 6 hn ;2 H ri nv c .T c ,Ha i 5 0 0,C ia e r hn ;
2 D F文件 的 生成 过 程 X
调用 D F接 口程 序 就 可 以生 成 L P程 序 文 X S
率, 缩短 设计 周期 , 使设 计人 员从繁琐 的手工 劳动 中解放 出来 。实践 证 明 : 该方 法适用 、 方便 。
件 。调用 接 口程 序 要 有 一 定 的顺 序 , S L P程 序 文 件生成 过 程 ( 图 1 , 体步骤 如下 : 如 )具
I关 s文 闭L 件 P
其 中 :l y 直 线 段 的 起 点 坐 标 ,2 y x ,l为 ) ,2为 【
直线 段 的终点 坐标 。在 函数 体 中调用 文件输 入输 出函数 , 照 直 线 段 的格 式 , 把 函 数 标 识 tm 按 先 o. mn a d写 到 L P程 序 文 件 中 , 把 圆 的实 体 标 识 S 再
就 实现 了数据 接 口。 1 1 在L P程序 文件 主是带 有“ L P 扩 展名 并 S .S ”