LISP 语言在CAD 道路设计中的各种应用

合集下载

Lisp程序语言的具体实现和运用浅析

Lisp程序语言的具体实现和运用浅析

Lisp程序语言的具体实现和运用浅析一、引言:随着工业技术和生活水平的提高,室外管线的种类越来越多,对室外管线设计的要求就越来越高。

室外管网不仅仅需要在平面上按照相关的规范规程进行综合排布,还需要在竖向高度上进行精心安排,才能在有限的空间合理组织各种管线的布置。

而这种需求必然要求设计师拥有比较强大的软件来进行室外管线设计的工作。

然而目前国内许多设计机构在管线综合方面主要靠手工综合,而且竖向标高的碰撞上面基本不进行设计,都是靠施工单位在施工现场根据实际情况自行避让。

这样导致室外管网排布的混乱,既不规范,甚至带来安全隐患等因素。

往往发生拆了又建,建了又拆,很难统筹管理,后期维护困难等问题。

上面的情况一再发生,无论是地方政府还是设计单位、业主等都越来越意识到室外管网合理规划,统一综合设计的重要性和必要性。

而且手工进行综合设计已经难以胜任这样的工作,迫切需要强大的软件进行辅助设计。

目前能进行室外管网综合的软件主要有一些国产软件和AutoDesk公司的Revit系列软件,但是一些国产软件使用繁琐复杂,难以满足设计师的需求,而Revit这样的BIM软件虽然在管线碰撞等方面很有优势,但是对硬件要求高,需要专门培训,使用起来也比较复杂。

因此,开发出真正适合管网综合的程序就显得很有必要。

二、LISP和BIM的简介:LISP(LISt Processor,即列表处理语言),由约翰·麦卡锡在1960年左右创造的一种基于λ演算的函数式编程语言。

可以说Lisp语言抽象复杂却又大道至简,它的主要的特点:1代码量小,2功能全,3易扩展。

AutoLISP是由Autodesk公司开发的一种LISP程序语言,嵌入在AutoCAD 内部,具有智能的特点的编程语言。

通过AutoLISP编程,可以节省工程师很多时间。

AutoLISP程序语言在室外管网综合方面得天独厚的优势。

近几年BIM技术的方兴未艾,室外管网综合的性质决定了它比较适合采用BIM技术。

基于Visual LISP语言的AUTOCAD参数化设计

基于Visual LISP语言的AUTOCAD参数化设计

基于Visual LISP语言的AUTOCAD参数化设计摘要本系统是以模块化设计和参数化设计为指导思想,以Visual LISP为编程语言和开发工具,对AutoCAD软件进行的二次开发。

研制出了界面友好的标准件图库系统和标准图幅调用系统,实现了设置绘图环境的自动化和绘制标准滚动轴承,从而提高绘图的质量和效率。

本文介绍了构建此系统所用到的CAD二次开发的主要方法和关键技术,包括CAD的Visual LISP集成开发技术,Visual BASIC对话框设计,Visual LISP 与VBA的交互式编程技术。

用户通过人机交互界面设置滚动轴承的关键参数,系统自动计算出绘制图块所需要的各点的坐标,调用绘图程序进行绘图;通过标准图幅调用系统,用户可以在交互界面设置所需要的图纸类型,绘图比例,系统将参数传输给调用模型,调用事先绘制好的标准图幅块并设置全局性比例,然后按1:1打印即可完成打印出图。

系统优点:标准图幅库是可编辑的,可以在AutoCAD环境下设置,使其符合企业的特殊要求;滚动轴承参数化模型完全按照国标要求编制,尺寸系列摘自国标不需要用户再查手册,也可以自定义。

关键词:Visual LISP;参数化绘图;二次开发;VBA;交互式编程;标准图幅;标准件库;滚动轴承参数化模型基于VisualLISP语言的AutoCAD参数化设计PARAMETRIC DESIGN AUTOCAD BASEDon Visual LISP LANGUAGEABSTRACTThe system is based on modular design and parametric design as the guiding ideology, as in Visual LISP programming language and development tools for the secondary development of AutoCAD software. Developed a user-friendly standard parts library system and the standard drawing system, which can automatically set the graphics environment and draw the standard rolling bearing, thereby enhancing the quality and efficiency of drawing.This article will describe the main methods and the major key technologies of CAD's secondary development including Visual LISP Integrated Development Technology, Visual BASIC dialog design and Visual LISP and VBA programming interactive. Users only need to enter the key parameters in the human-computer interaction interface, the system will calculate the necessary points coordinates which is needed in drawing and then draw the drawing. Through the drawing system, the user can select the required drawing frame, set the ratio of the drawing in the dialog box, the system automatically draw out the drawing frame and set overall ratio. Then, in accordance with the 1:1 print a drawing to complete the print. System Benefits: Standard Drawing Library is open source, can be set up in the AutoCAD environment, to meet the specific requirements of enterprises; rolling bearing models in full accordance with the requirements of the preparation of GB, GB size range from requiring users to re-check the manual, but also required to custom; procedures for open-source, standard parts library can be filled follow-up.KEYWORDS:Visual LISP;Parametric Drawing;The secondary development;VBA;Standard drawing frame目录1.绪论 (1)1.1课题背景及研究的目的和意义 (1)1.2目前国内外研究进展概述 (2)1.2.1AutoCAD发展趋势 (2)1.2.2CAD二次开发研究热点 (3)1.2.3 本文主要研究内容 (4)2.AUTOCAD二次开发工具 (6)2.1VISUALLISP编程方法 (6)2.1.1VisualLISP语言概要 (6)2.1.2AutoLISP基本函数 (6)2.1.3参数化绘图程序设计技术 (9)2.2VBA编程方法 (10)2.2.1VisualBasic语言概要 (10)2.2.2VBA IDE集成编程环境 (13)2.3VISUALLISP与VBA的交叉编程方法 (14)3.绘图环境的设置 (17)3.1设置图层、文字样式、标注样式 (17)3.1.1创建新图层 (17)3.1.2定义字样 (17)3.1.3 设置尺寸标注 (18)3.2绘制标准图框模板 (20)3.2.1绘制标准图幅 (20)3.2.2设置块属性 (21)3.3VBA制作绘图模板调用窗口及V ISUAL LISP编制调用程序.. 22基于VisualLISP语言的AutoCAD参数化设计3.3.1VBA制作调用窗口 (23)3.3.2Visual LISP编制调用程序 (28)4.VISUALLISP参数化编程 (30)4.1参数化图形的特点及应用 (30)4.2VISUALLISP编制标准滚动轴承参数化模型程序库 (30)4.3VBA编制标准件调用窗口 (34)4.4VBA与VISUALLISP交叉编程应用 (37)5.程序设计综合应用 (39)5.1程序检查和调试中的问题 (39)5.2VBA编程与VISUALLISP编程的数据传递 (40)5.3有关系统变量的应用举例 (42)5.4自定义工具栏应用举例 (43)结论 (46)参考文献 (46)致谢 (47)1.绪论1.1课题背景及研究的目的和意义众所周知,AutoCAD 是目前在Windows95/ 98/ 2000/ NT /XP环境下应用最广泛、使用人数最多的CAD 软件, 以其完善的绘图功能、良好的用户界面、易学易用的特点,受到了广大工程技术人员的普遍欢迎。

基于autoCAD的拓扑算法及其应用——由交通网图自动生成双线道路的LISP程序

基于autoCAD的拓扑算法及其应用——由交通网图自动生成双线道路的LISP程序

基于autoCAD的拓扑算法及其应用——由交通网图自动生成双线道路的LISP程序基于autoCAD的拓扑算法及其应用——由交通网图自动生成双线道路的LISP程序数较多的情况下.最终改正值收敛缓慢.而且GPS网的协方差对旧网的改正影响较大. 四,整体平差模型将GPS网的重合点视为随机参数与旧网一并平差.在周忠谟教授编着的"GPS卫星测量原理与应用"一书的182页,已介绍在高斯平面坐标系标中联合平差模型,该书中又指出:在两网联合平差中,正确地确定网的方差与协方差的其重要,而实践经验表明,通过GPS观测的平差所获得卫星网方差与协方差,其所代表的精度往往偏高,这将使卫星网和地面网在联合平差中都可能无法正确地发挥作用,从而影响平差结果的可靠性,因此,如何合理地确定卫星网和地面网方差与协方差,是当前两网联合平差中有待进一步研究的问题.五,结语原控制网归算为GPS网的坐标系统,有多种计算方法可供选择,主要需把握好实际计算条件,例如GPS重合点较多的网选用第一,二种的计算方法是正确的,温州市GPS 控制网和温州市原三角网仅重合四点,在统计学角度来看,子样很不充份,所以只能选择第四种方法来计算归化GPS网坐标系统.对GPS网观测值所代表精度偏高问题, 对策措施有三点;1.适当增大GPS网基线测量先验方差来调正权比的合理性,避免精度偏高的趋向.2.采用矩阵法分块求逆与分组平差.3.对于小三角锁和导线网的整体平差是利用目前比较成熟的平差技术. 根据角度和边长观测中误差m?,m的先验值确定角度,边长观测权的初值,记为: P(1)B=1/m;P=1/(A+B?S;×10)进行第一次平差计算后,再计算角度,边长这两类观测值单位权方差的第一次估值蠢.和.再依下式确定第二次平差时权. 2?1aoB'=?p;.'=P;?:反复进行计算直到I塞{为止,式中e为任意小的正数.采用上述措施之后,再计算点位精度,如有超限现象,应该考虑对策是否却当或者再采用新的平差模型试算.基于autoCAD的拓扑算法及其应用——由交通网图自动生成双线道路的LISP程序浙江省测绘局科研所陈少勤摘要:本文介绍一种基于autoCAD图形数据的拓扑算法和LISP程序思路,可以快速地用单线数字化道路中心线.程序通过搜寻交通网络中每个独立的最小多边形.自动生成双线符号的道路图.一15—一,引言autoCAD以其强大的图形编辑功能和快速的版本升级等优越性,赢得了世界上最广泛的CAD用户.它不但为各行各业的 CAD用户提供必要的通用性绘图,编辑功能,还具有充分开放的数据结构和便利的二次开发工具和环境,用户可按自身的实际需要将通用的CAD系统个性化.因此它在电子地图的建立和维护方面的应用开发也非常普遍.在地图数据库中,用空间数据,属性数据以及关系来描述地理物体.空间数据记录物体的位置,形状,大小等几何特征,可完全独立于规定具体表示法的符号系统.如以坐标点表示随机分布的点状地物,以一串坐标表示呈线状分布的地物,以轮廓线坐标表示面状地物.这样更有利于在地理信息系统中建立图形与属性数据的唯一对应关系,,或在机助制图中根据任意选定的符号系统生成图形.空间数据包括物体定位的几何信息和物体之间的结构关系——拓扑关系,在空间数据处理中,后者的意义往往更重于前者.而 autoCAD虽长于几何图形的处理,但不能反映几何实体之间的结构关系.本文将要讨论的问题就是如何以autoCAD 的图形数据为基础,从实体定位关系中间接导出拓扑关系. 二,多边形拓扑关系的建立根据拓扑学的图论原理,一个图的诸元素(结点,链段,面域)之间存在着两类二元关系,即同类元素(如结点与结点,链段与链段)之间的邻接关系,和不同类元素(如结点与链段,链段与面域)之间的关联关系.它确立了在图形连续变化下元素间整体关系保持不变性的本质——拓扑关系. 地图中的网络(交通网,水系,行政区划,面域专题等)相当于图论中的平面图,即一】6一画在一个平面上的任何两条边之间除了端点以外没有其他交点,它的拓扑关系是以多边形为核心建立起来的.多边形由链段组成,链段由结点连接.每个结点可有多个关联的链段,但一个特定结点上的所有链段中,同属于一个多边形的链段只有两条.因此,某特定多边形的任意一条链段必定关联于一个结点,与该结点关联的链段集合中必定存在着该多边形的另条链段,如此连环搜索便可获得构成该多边形的链段集合,每个链段都可按正向或反向连入左右多边形,所有链段均被搜索而连入多边形后,整个网络的多边形也就合部生成.autoCAD中虽然没有显式拓扑数据,但autoCAD中的PLINE(多义线) 的实体数据正如链段一样为一个有序的坐标串.利用autoLISP提供的内部函数可以获取通过同一个点的所有PLINE实体集,访问每个实体名并获取其顶点坐标.因此当用 PLINE画出符合拓扑结构的网络图形后,也就能通过计算的方法生成拓扑关系.具体过程如下: a获取网络图的全部PLINE实体集; b任取一条PLINE作为起始链段; c按正向取得该PLINE的终点(如正向已被用过则按反向取得该PLINE韵起点)作为当前工作结点;d获取通过该结点的PLINE实体集,按左转算法取得转角最大的PLINE为该结点的后继链段,作为当前工作链段;e转向c继续执行,直到当前工作链段与起始链段闭合,结束循环;f转向b继续执行,直到所有PLINE均被正反向两次连入多边形,结束循环. 三,自动生成道路双线的程序算法在autoCAD中画双线的方法有多种,但都需要人工操作.虽然可用程序模拟操作过程来实现一定程度的自动化,但只能处理较简单的规则图形,遇到较复杂的图形或特殊情况往往产生不可预料的错误结果. 本程序的基本思路为利用拓扑算法找出交通网络中的每个独立的最小多边形,按给定的道路宽度半值,将多边形边界等距平移向内缩进,所有多边形都等距平移之后,也即形成了每条道路的左右边线.本程序对数 abc图一1.结点匹配由于数字化采点误差的存在,汇合于同一结点的各链段端点坐标值不一致,必须归算为统一的坐标.分析任意输入的图形,不符合拓扑结构的情况主要有以下几种: a汇合于同一结点的各个端点与端点之间,端点与顶点之间,顶点与顶点之间的坐标不一致(如图一a,b,C); b端点或顶点偏离了位于一直线上的结点(如图一d);c端点或顶点偏离了位于两直线交叉点上的结点(如图一e,f).节点匹配的定点原则为:a取各端点或顶点的重心坐标作为结点;b取直线上距端点或顶点的最近点作为结点;C取两直线交叉点作为结点.将端点或顶点坐标值统一改到结点上来.遇到上述三种的综合情况时,结点坐标取值的优先级序为c,b,a.结点匹配的阀值字化输入图形不要求结点捕捉.只要保证一定的对点精度;对链段也不要求逐段分开输入,可随道路走向连续数字化以保持原图形的固有特征.程序自动进行结点匹配,链段构造,杂质过虑,搜索多边形并绘出等距平移线.de即数字化动态采点误差限,一般设为图上0.5ram……1.0mm.2.链段重构欲使一个任意数字化的网络符合拓扑图的数据结构除了与同一结点关联的链段端点坐标要精确重合外,还必须使每条链段起止于邻接的两个结点.因此所有穿越结点的 PLINE都要在结点处中断.方法是沿每条 PLINE逐段搜索与其他线段的交点,有交点处必为结点之所在,则将PLINE分断重画. 3.杂质过虑由于原图数字化时出现的一些情况,如 PLINE中有小于匹配阀值的线段,有极小角的短线交汇或重复数字化的线段等,经结点匹配和链段重构后,会产生完全重合的链段在PLINE中出现重合的相邻点.这将影响下一步的多边形搜索,因此必须预先过虑. 4.多边形搜索一般情况下,判断多边形搜索是否闭合的条件为:当前结点即是起始链段的起点又是当前链段的终点.但在交通网中搜索多边一17—形的目的是为了绘道路边线,当遇到悬挂链段或自环闭链段时(如图二a,b),则不能简' 单地将其闭合,否则绘出的道路边线将出现J T交叉现象(如图--).如果将一条链段分为不同方向的左右两个侧面,即等距平移前的道 [I]a当前链段为在当前结点上按左转算法取得的后继链段;b该链段相对于当前结点的出发方向已经用过.当遇到悬挂结点(悬挂链段或非连通链段(如图二c)的尽头)时,后继续段即为原链段的相反方向.有如沿链段的一个侧面到达该结点后再沿另一侧面从该结点出发. 5.边界线等距平移a图四四,结束语.早期的地图数据库以机助制图为主要目的,而现在则更多地以建立GIS的空间数据基础为主要目的,由此引发了图形数据结构组织的根本变化.从原来的直接用点线实体一笔一划地仿真模拟地图的符号表示法,发展为图形数据只记录地理要素的定位几何特一l8一路边线,那么多边形搜索就成了沿道路_侧' 连续搜索前进的过程.丽链段相对于其关联 ,f'的结点而言,可分为该结点的到达方向和该_ 结点的出发方向.此时,判断闭合结点的条件为:图三获得多边形数据后,即可逐点计算两相邻线平移后的交点,线段平移的距离取不同等级道路宽度值的二分之一.当两线段转角等于180度或两链段道路等级不同而转角接近180度时(如图四),不能用求交点的方法, 而直接用平移后的端点作为新点.甩PLINE 命令绘出等距平移后的新交点集,即得到了一条街区线,所有街区线均绘出后即完成了每条道路的双线边界.b征("骨架线"),结合属性数据描述"骨架线"的性质.符号系统则完全从图形中独立出来,当需要终端输出模拟地图时再根据 "骨架线"的属性配戴相应的符号.这样的好处在于:1.数据冗余少,占用空间小{2.每个地理物体对应一个图形实体,便于属性挂钩;3.便于图形数据的修改更新;4.便于建立拓扑关系;5.可按不同的比例尺或不同的符号风格输出地图等.根据本文思路笔者在autoCAD12.0平台上开发了LISP程序"jiedao.Lsp",实践证明它特别适用于城镇的地图数字化.只要将街道中心线分级数字化在"儿","J2", "J3",…图层上,设定各级街道的宽度,执行程序,即自动在"JD"图层上生成双线街道图.数字化时街道分级尽可能详细些,而生成双线时根据需要选取或合并输出,则相当于具有可变焦距的数据结构特征,从而实现一定程度的制图综合取舍自动化.一般手工操作需要3,5天才能完成的工作利用本程序只需几分钟便可完成.为AutoLisp增加几个实用函数浙江省测绘局科研所陆晓鸣一,引言AutoLisp作为AutoCAD内嵌的解释性编程语言,具有方便灵活的特点,为用户以AutoCAD为通用平台进行定制提供了很大方便.但是AutoLisp语言本身的功能在某些方面还有些欠缺,在我们编程实践中,我们发现有些子程序在实际应用中要经常用到,因而可作为AutoLisp的函数一样来处理.下面我们就实际工作中常用到的几个函数作一介绍.二,几个常用的函数1.用于提取多义线顶点的vertex.1sp我们知道,简单的数字化地形图,通常还是要用图式符号表示的.但是,在数字化板上进行数字化时,许多线状符号通常只是用Pfine命令数字化骨架线,其符号的生成需要根据符号的特点编程实现,这时就需要首先提取多义线的顶点坐标.这里我们就给出提取顶点的函数如下:(defungetver(ent/tempkjverlstsubentelement)(setqverlst'())(setqsubent(entnextent)) (setqkj1)(whilesubent;遍历整个多义线子实体(setqtemp(entgetsubent)) (if(:(edr(assoe0temp))"SEQEND);多义线子实体结束标志 (setqsubentnil)(progn(if(=(cdr(assoe70temp))16);忽略内插点(setqkj(+kj1)))(if(<=kj2)一19—。

用LISP语言自定义AutoCAD命令

用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”在绘制机械零件图时,经常要画螺纹孔的剖视图,同样由于螺纹孔的有关尺寸都随螺纹的公称直径而变化,我们可以用下面的程序自动完成其剖视图的绘制。

LISP语言在CAD方面的运用

LISP语言在CAD方面的运用
4 结束语 通过以上一些肤浅的介绍, 只希望给新加入测绘行业的同行一 些 提 示 。 你 喜 欢 朝 阳 、晚 霞 吗 ? 美 的 东 西 总 是 存 在 的 , 就 看 你 怎 样 去 发 现 。 就 如 你 的 前 景 , 去 努 力 、去 实 践 , 就 会 美 好 。 参考文献 [1] 黎 新 懿 , 赵 景 亮 : 用 Visual LISP 开 发 AutoCAD2004 应 用 程 序 . 科 学 出 版 社 , 2003.
(0 . " LWPOLYLINE" )表 说 明 所 选 则 的 实 体 为 LWPOLYLINE 线 。 (下 转 63 页 )
- 57 -
科技论坛
中国高新技术企业
立数学模型, 有时即使建立了数学模型, 也难于获得数值解。这时, 模拟法则成为一种有效的工具。模拟法十分灵活, 且不受系统规模 限 制 , 它 可 以 详 细 模 拟 事 故 前 的 备 件 、发 电 和 输 电 停 运 及 运 行 中 的 实 际 问 题 , 但 耗 时 多 而 且 精 度 不 高 , 这 种 方 法 主 要 用 于 发 、输 电 组 合 系统及变电站的可靠性评估中。
3.2 文字的特性 下面再来看看说 明 所 选 则 的 实 体 在 DLSS 层 。 (6 . " X2 " )则 表 示 此 线 条 的 线 型 为 X2 , X2 为 用 户 定 义 的 线 型 。 (90 . 4 )说 明 此 线 有 4 个 端 点 。 (70 . 128 )表 明 此 线 没 有 封 闭 。 如 为 129 则 表 示 多 义 线 首 尾 相 连, 是严格闭合。 (43 . 0 .1 )显 示 此 线 的 宽 度 为 0 .1 米 。 (10 41 .3308 23 .3799 )则 给 出 了 端 点 的 坐 标 值 。依 次 下 去 分 别 为 各端点的坐标。 (- 3 (" SOUTH" (1000 . " 164100 " ))))表 示 此 实 体 的 扩 展 特 性 , 一 般为编程者的意图。 针对所提的第一个问题, 对比下面的等外公路特性。

cadlsp

cadlsp

CADLSP简介CADLSP是一种计算机辅助设计语言(Computer-Aided Design Language Specification),它是为了简化CAD软件的使用和开发而设计的。

CAD是计算机辅助设计的缩写,是指利用计算机技术辅助进行设计的过程。

CAD软件在工程设计、制造生产和科学研究等领域起到了重要的作用。

然而,由于不同CAD软件之间的语法和数据格式差异较大,导致了使用和开发的困难。

CADLSP的目标就是通过定义一种通用的语言规范,来解决这个问题。

特性CADLSP具有以下几个特性:1.语法简单清晰:CADLSP采用简洁的语法,易于学习和使用。

它的语法规则清晰明了,使用者可以很容易地编写和读取CADLSP代码。

2.可扩展性强:CADLSP支持自定义函数、变量和数据类型,使用者可以根据需要扩展CADLSP的功能和特性。

这种灵活性使得CADLSP适用于各种不同的CAD软件需求。

3.与CAD软件无关:CADLSP是一种独立于具体CAD软件的语言规范,它与任何CAD软件都可以兼容。

使用CADLSP编写的代码可以在不同的CAD软件中运行,无需额外的修改。

4.跨平台支持:CADLSP可以在不同的操作系统和平台上运行,如Windows、Linux和macOS等。

这使得CADLSP成为一个强大的工具,在不同的环境中都能得到良好的支持。

用途CADLSP主要用于简化CAD软件的使用和开发过程。

它可以被广泛应用于以下几个方面:1.CAD软件的快速开发:CADLSP为CAD软件的开发提供了一个统一的语言规范,使得开发人员可以更快速地开发高质量的CAD软件。

2.CAD软件的定制化:CADLSP允许用户自定义函数和数据类型,使得CAD软件可以根据用户的需求进行定制化。

用户可以根据自己的工作流程和习惯,编写CADLSP 代码来实现个性化的CAD设计功能。

3.CAD软件的扩展功能:CADLSP的灵活性和可扩展性使得CAD软件的功能可以得到进一步扩展和增强。

五个实用的AutoCAD的lisp程序

五个实用的AutoCAD的lisp程序

五个实用的AutoCAD的lisp程序1、计算CAD图形中所有线段总长度(加载后只需框选所有线段便可得出这些线段的总长度)(defun c:LL ()(setvar "cmdecho" 1)(setq en (ssget (list '(0 . "spline,arc,line,ellipse,LWPOLYLINE"))))(setq i 0)(setq ll 0)(repeat (sslength en)(setq ss (ssname en i))(setq endata (entget ss))(command "lengthen" ss "")(setq dd (getvar "perimeter"))(setq ll (+ dd ll))(setq i (1+ i)))(princ "所选线条总长为:")(princ ll)(princ))2、标注CAD图形中所有线段(加载后只需框选所有线段便可得标注这些线段)(defun c:LLL ()(COMMAND "UCS" "")(setvar "cmdecho" 1)(SETVAR "OSMODE" 0)(setq AcadObject (vlax-get-acad-object)AcadDocument (vla-get-ActiveDocument Acadobject)mSpace (vla-get-ModelSpace Acaddocument));;选取需要测量的样条曲线、圆弧、直线、椭圆(setq en (ssget (list '(0 . "spline,arc,line,ellipse,LWPOLYLINE"))))(setq i 0);;获取系统参数textsize(setq shh (getvar "textsize"))(setq str_hh (strcat "\n文字高度 <" (rtos shh 2) ">: "))(setq hh (getdist str_hh))(while hh(setvar "textsize" hh)(setq hh nil));;输入标注文字高度;;循环开始(repeat (sslength en)(setq ss (ssname en i))(setq endata (entget ss))(command "lengthen" ss "")(setq dd (getvar "perimeter"))(princ (strcat "\n长度=" (rtos dd 2)));;寻找代表图层的字符串(setq aa (assoc 0 endata));;获取图层名称(setq aa1 (cdr aa));;判断线条种类(cond((= aa1 "SPLINE");;如果是spline(progn(setq arcObj (VLAX-ENAME->VLA-OBJECT ss))(setq startPnt1 (vla-get-ControlPoints arcObj))(setq p1(vlax-safearray->list (vlax-variant-value startPnt1)) )(setq x1 (car p1))(setq y1 (cadr p1))(setq z1 (caddr p1))(setq pp1 (list x1 y1 z1))(repeat (- (/ (length p1) 3) 1);;循环,寻找最后一个控制点(setq p1 (cdddr p1))(setq x2 (car p1))(setq y2 (cadr p1))(setq z2 (caddr p1)))(setq pp2 (list x2 y2 z2))))((= aa1 "LWPOLYLINE");;如果是LWPOLYLINE(progn(setq arcObj (VLAX-ENAME->VLA-OBJECT ss)) (setq startPnt1 (vla-get-Coordinates arcObj)) (setq p1(vlax-safearray->list (vlax-variant-value startPnt1)) )(setq x1 (car p1))(setq y1 (cadr p1))(setq z1 (caddr p1))(setq pp1 (list x1 y1 z1))(repeat (- (/ (length p1) 3) 1);;循环,寻找最后一个控制点(setq p1 (cdddr p1))(setq x2 (car p1))(setq y2 (cadr p1))(setq z2 (caddr p1)))(setq pp2 (list x2 y2 z2))))(t;;如果是其他种类线条(progn(setq arcObj (VLAX-ENAME->VLA-OBJECT ss)) (setq startPnt1 (vla-get-StartPoint arcObj));;获取起点(setq endPnt1 (vla-get-EndPoint arcObj));;获取终点(setq pp1(vlax-safearray->list (vlax-variant-value startPnt1)))(setqpp2 (vlax-safearray->list (vlax-variant-value endPnt1)) ))))(setq x1 (car pp1))(setq y1 (cadr pp1))(setq z1 (caddr pp1))(setq x2 (car pp2))(setq y2 (cadr pp2))(setq z2 (caddr pp2))(setq x (/ (+ x1 x2) 2))(setq y (/ (+ y1 y2) 2))(setq z (/ (+ z1 z2) 2))(setq pt (list x y z));;取得线段两端的中点(setq ang (angle pp1 pp2));;获取角度(if (> (* (/ ang pi) 180) 180)(setq ang (+ ang pi)))(command "text""j""bc"pt""(* (/ ang pi) 180)(strcat "" (rtos dd 2))"")(setq i (1+ i)))(prin1))(prompt "\n <>在图中直接写出长度") (prin1)3、连续打断程序(defun c:br1 ()(command "break" pause "f" pause "@"))4、将CAD文字导入Excel表格(defun c:Q2()(setq ffn (getfiled "写出文件" "" "xls" 1))(princ "\n选取文字...")(setq ss (ssget))(setq ff (open ffn "w"))(setq i 0)(repeat (sslength ss)(setq ssn (ssname ss i))(setq ssdata (entget ssn))(setq sstyp (cdr (assoc 0 ssdata)))(if (or (= sstyp "TEXT") (= sstyp "MTEXT"))(progn(setq txt (cdr (assoc 1 ssdata)))(princ txt ff)(princ "\n" ff)))(setq i (1+ i)))(close ff)(princ (strcat "\n写出文件: " ffn))(prin1))5、删除带颜色图元以下程序在别人的贴子里贴过.为了说明问题,今天再贴一次。

LISP语言在CAD方面的运用

LISP语言在CAD方面的运用
3.2 文字的特性 下面再来看看文本的一些特性:
(8 . " DLSS" )表 说 明 所 选 则 的 实 体 在 DLSS 层 。 (6 . " X2 " )则 表 示 此 线 条 的 线 型 为 X2 , X2 为 用 户 定 义 的 线 型 。 (90 . 4 )说 明 此 线 有 4 个 端 点 。 (70 . 128 )表 明 此 线 没 有 封 闭 。 如 为 129 则 表 示 多 义 线 首 尾 相 连, 是严格闭合。 (43 . 0 .1 )显 示 此 线 的 宽 度 为 0 .1 米 。 (10 41 .3308 23 .3799 )则 给 出 了 端 点 的 坐 标 值 。依 次 下 去 分 别 为 各端点的坐标。 (- 3 (" SOUTH" (1000 . " 164100 " ))))表 示 此 实 体 的 扩 展 特 性 , 一 般为编程者的意图。 针对所提的第一个问题, 对比下面的等外公路特性。
(SETQ XR1 (RTOS(FIX(* (getvar " tdusrtimer" ) 10000000000)))) 用 getvar 函 数 读 取 内 部 数 字 变 量 tdusrtimer 的 值 , 扩 大 后 用 数 字 计 算 函 数 FIX 取 整 , 用 数 据 类 型 转 换 函 数 RTOS 把 数 字 常 量 转 换 为 字 符 常 量 , 再 赋 予 给 变 量 XR1 。
(0 . " LWPOLYLINE" )表 说 明 所 选 则 的 实 体 为 LWPOLYLINE 线 。 (下 转 63 页 )
- 57 -
科技论坛
中国高新技术企业
立数学模型, 有时即使建立了数学模型, 也难于获得数值解。这时, 模拟法则成为一种有效的工具。模拟法十分灵活, 且不受系统规模 限 制 , 它 可 以 详 细 模 拟 事 故 前 的 备 件 、发 电 和 输 电 停 运 及 运 行 中 的 实 际 问 题 , 但 耗 时 多 而 且 精 度 不 高 , 这 种 方 法 主 要 用 于 发 、输 电 组 合 系统及变电站的可靠性评估中。
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

第三章LISP语言在CAD道路设计中的各种应用3.1绘制平面任意函数曲线的AutoLISP程序设计在各个工程设计领域中,经常要绘制一些曲线,特别是平面曲线,如水工结构的溢流曲线、机械设计的齿轮渐开曲线等。

在AutoCAD绘图软件中,可以将曲线上的点先计算好,再用线、多义线、样条曲线等方法绘制,这种方法需要进行大量计算,工作量较大,如果用EXCEL软件来辅助计算,可以减轻工作量;另外,可以针对具体的曲线类型,用AutoCAD 内嵌的AutoLISP语言,实现边计算边绘制的功能。

用这种方法绘制虽然快捷,但对于不同的曲线,则需编写同的AutoLISP程序,检查无误后才能运行,仍显繁琐。

能否用统一的程序,来实现各种平面函数曲线的绘制,我们尝试利用AutoCAD中强大的表达式计算功能来实现这一目的。

3.1.1平面函数曲线的类型和绘制方法平面函数曲线即是有简单函数表达式的曲线类型,可考虑经常遇到的4类:(1)直角坐标下形如y=f(x)的曲线;(2)直角坐标下的参数方程曲线;(3)极坐标下形如r=f(θ)的曲线;(4)极坐标下的参数方程曲线。

其中,只需增加一个平凡方程x=x,参数方程(2)就可以包括相应的直接表达形式(1),同样(4)可以包括(3)。

同时,极坐标形式可以通过:x=rcosθy=rsinθ转换为直角坐标表达。

因此从本质上说,4种类型都可以互相转换,把它们分类的目的是尽量采用函数的通常表达形式,以便于使用。

绘制时,参照曲线的手工绘制方法,需要给出曲线上的多个点,然后将它们连接起来。

若给出的点间隔很小,直接用折线段相连就可很好模拟该曲线,如果间隔较大,可以用样条曲线连接,使之比较光滑。

假设我们计算出足够多的点,简单用折线连接即可,为使该曲线成为一个整体,可用多义线的方式连接。

关键的问题是,如何计算出曲线上点的坐标。

由于曲线的函数表达式各种各样,不可能用统一的式子来表示。

可以考虑从外部输入表达式,然后针对该表达式进行计算,给出相应结果,就能够解决点坐标的计算问题。

但这个功能的实现比较困难,幸好AutoCAD为我们提供了CAL命令,可以对任意的表达式进行计算。

该命令由函数库文件geomcal.arx提供,支持科学/工程计算器上的大多数标准函数,如三角函数、指数、对数等。

若表达式中有变量,而该变量在程序中已设定了值,则按该值进行计算。

由于该函数不是LISP内部函数,为使之可用,需要用ARXLOAD命令载入文件geomcal.arx,或者在命令行先输入CAL命令,由系统自动载入,这样,程序中就可以使用该函数了。

总的程序定义为c:curve(),以便在AutoCAD命令行中与通常的命令一样使用。

程序的总调用部分为:(arxload "geomcal.arx");载入提供表达式计算功能的ARX文件(vl- arx- import 'c:cal);让命令c:cal能够使用(princ "(1)直角坐标下曲线y=f(x).\n")(princ "(2)直角坐标下参数曲线x=f(i),y=g(i).\n")(princ "(3)极坐标下曲线r=f(theta).\n")(princ "(4)极坐标下参数曲线theta=f(i),r=g(i).\n")(setq ichoice (getint " 选择绘制曲线类型:"));选择曲线类型(if (= ichoice 1) (curve1));调用曲线绘制类型1(if (= ichoice 2) (curve2));调用曲线绘制类型2(if (= ichoice 3) (curve3));调用曲线绘制类型3(if (= ichoice 4) (curve4));调用曲线绘制类型4根据用户选择的曲线类型,转到相应的曲线类型绘制函数中,依次为直角坐标下的普通函数、参数方程,极坐标下的普通函数和参数方程。

3.1.2直角坐标下函数y=f(x)的曲线绘制直角坐标下绘制函数曲线y=f(x)定义为AutoLISP子程序curve1,该子程序没有传入传出参数。

程序的第一个步骤是读入有关的参数和控制变量。

首先读入y=f(x)的表达式,然后输入自变量x的变化范围[low,up],接着根据模拟精度,输入曲线剖分数目steps,x的变化步长即为step=(up- low)/steps,该步骤相应的AutoLISP程序如下:(setq funy (getstring "y=f(x)的表达式:")) (setq low(getreal "x 的下限值:"))(setq up (getreal "x 的上限值:"))(setq steps (getint " 剖分数目:"))(setq step (/ (- up low) steps))接下来就开始曲线的绘制,首先启动绘制多义线的命令,接着自变量x从下限值开始,由f(x)的表达式计算y坐标值,将该点的坐标输入到命令行,得到曲线的起点,然后自变量x 递增一个步长,计算下一个坐标点,曲线连接到该点,如此直到剖分数目结束,就完成了整个曲线的绘制,最后用一个空格退出多义线命令。

相应的AutoLISP程序如下:(command "pline");启动多义线命令(setq ii 0);循环变量ii设初值(setq x low);自变量x设初值(while (<= ii steps);控制循环数目(setq y (c:cal funy));对表达式进行计算,得到y坐标值(command (list x y));输入计算出的点坐标(setq ii (+ 1 ii));循环变量ii增加1(setq x (+ x step));自变量x递增一个步长(command "");退出多义线命令3.1.3直角坐标下参数方程曲线绘制直角坐标下参数方程与直接函数表达不同的是,引入参变量,坐标x和y都表达为该参变量的函数,这样,能够表示的函数更灵活多样,形式如下:在曲线绘制时,只需要将变量改为参变量,坐标计算时对x、y坐标都用表达式计算即可,相应的AutoLISP程序如下:(setq ii 0);循环变量ii设初值(setq i low) ;参变量i 设初值(while (<= ii steps) ;循环控制(setq x (c:cal funx)) ;由x=f(i)计算坐标x(setq y (c:cal funy)) ;由y=g(i)计算坐标y(command (list x1 y1)) ;向命令行输入点坐标(setq ii (+ 1 ii)) ;循环变量ii 增加1(setq i (+ i step)) ;参变量i 递增一个步长3.1.4 极坐标下函数r = f(θ)曲线绘制极坐标下函数r = f(θ)的不同之处在于输入点的坐标时,需要用极坐标输入方式,如20<30,表示极径为20,角度为30°,可以将得到的坐标值转换为字符串,再用角度符号“<”连接起来,输入到命令行。

也可以用另外一个简便方法,即利用极坐标和直角坐标之间的转换关系,变换到直角坐标后输入到命令行,该方法对应的AutoLISP程序如下:(setq ii 0) (setq e low) ;设置极角θ的初始值(while (<= ii steps) (setq r (c:cal funy)) ;计算极径r(setq x (c:cal "r*cos(e)")) ;由极径r 和极角θ转换为直角坐标下的x 值(setq y (c:cal "r*sin(e)")) ;由极径r 和极角θ转换为直角坐标下的y 值(command (list x y)) (setq ii (+ 1 ii)) (setq e (+ e step)) ;对极角递增一个步长3.1.5极坐标下参数方程曲线绘制极坐标下参数方程曲线的绘制,同直角坐标下的参数方程曲线绘制是类似的,即增加一个用参变量表达的极角θ的计算,相应的AutoLISP程序如下:(setq ii 0) (setq i low) ;设置参变量i 初值为下限值(while (<= ii steps) (setq e (c:cal funx)) ;由表达式计算极角θ(setq r (c:cal funy)) ;由表达式计算极径r(setq x (c:cal "r*cos(e)")) (setq y (c:cal "r*sin(e)")) (command (list x y)) (setq ii (+ 1 ii)) (setqi (+ i step)) ;参变量递增一个步长3.1.6总结利用AutoCAD的表达式计算功能,编写出绘制平面函数曲线的AutoLISP程序,根据外部输入的函数表达式,迅速绘制出函数曲线,且可以灵活控制曲线的模拟精度,避免了以往每绘制一种曲线都要重新编写程序的麻烦,使用起来十分方便。

可以参照本文的做法,绘制三维空间曲线或其他更复杂的曲线,或将表达式计算功能应用到其他设计环境中。

3.2基于AutoCAD的线路缓和曲线的自动绘制3.2.1背景铁路与公路的线路在定线中,由于受地形、地物或其他因素限制,需要改变方向。

在改变方向处,相邻两直线间要求用曲线连接起来,以保证行车顺畅安全这种曲线称平面曲线。

铁路与公路线上采用的平面曲线主要有圆曲线和缓和曲线,如图1所示。

圆曲线是具有一定曲率半径的圆弧;缓和曲线是连接直线与圆曲线的过渡曲线,其曲率半径ρ由无穷大(直线的半径)逐渐变化为圆曲线半径R。

在铁路干线线路中都要加设缓和曲线。

由于缓和曲线上各点的曲率半径及圆心均为变数,所以在绘制线路平面图时,利用绘图工具无法准确、有效地绘制出缓和曲线。

目前大多数采用曲线板近似描绘缓和曲线;或者是在AutoCAD中,用多段线近似代替缓和曲线。

这些方法作图不准确,而且作图效率低。

笔者在实践中,利用AutoLISP编程,实现了基于AutoCAD的缓和曲线加圆曲线的自动绘制。

3.2.2缓和曲线的主点及要素1.缓和曲线的形成图2(b)是没有加设缓和曲线的圆曲线。

缓和曲线是在不改变直线段方向和保持圆曲线半径不变的条件下,插入到圆曲线与直线段之间的平面曲线。

为了在圆曲线与直线之间加入一段缓和曲线l0,原来的圆曲线需要在垂直于其切线的方向上移动一段距离p(见图2(a)),因而圆心就由O移动到O1,而原来的半径R保持不变。

相关文档
最新文档