bysj.njfu.edu.cnbysj.njfu.edu.cn/UpLoadFile/070305214198730.doc · Web view南京林业大学....

Click here to load reader

Transcript of bysj.njfu.edu.cnbysj.njfu.edu.cn/UpLoadFile/070305214198730.doc · Web view南京林业大学....

南京林业大学

本科毕业设计(论文)

题 目:基于AutoCAD的化工设备典型零

部件图库开发

学 院: 机械电子工程学院

专 业: 过程装备与控制工程

学 号: 070305214

学生姓名: 王光绪

指导教师: 单玉霞

职 称: 讲师

二O一一 年 五 月 三十 日

摘 要

化工设备零部件种类和规格较多,如封头、支座、法兰、筒体等,这些零部件都已经标准化、系列化,并在各种化工设备上通用。

本文介绍了常用化工设备典型零部件图库开发的原理和步骤,采用AutoLISP 语言对AutoCAD 进行二次开发,在AutoCAD 2007环境中编制了常用化工设备典型零部件的参数化绘图程序。以参数化设计思想为依据,利用AutoLISP 语言和DCL语言,设计了对话框和下拉菜单。通过下拉菜单选择各种零部件菜单,在对话框中选取或输入几个关键参数,就可获得所需的零部件图形,快速实现了以人机对话形式来进行计算机辅助绘图。本化工设备标准零部件图库中的图形均可重复调用,系统的功能强大,界面友好。图库的建立,解决了工程设计人员重复性绘图所造成的时间、资源的浪费问题,从而大大提高交互设计速度,提高设计效率和质量。

关键词:AutoCAD;Auto LISP;DCL;参数化设计;化工设备典型零部件

Abstract

There are a lot of different kinds of machine elements in chemical engineering equipments. Such as the heads,the bearing, the flanges, the cylinders, etc., which have been standardized.

This paper represents the principle and steps of development for the system of typical parts’ parameterized program for some parts which commonly used in chemical engineering equipments. The system is developed by the Visual LISP on the base of AutoCAD 2007. Based on the thought of the parameterized design, it adopts Auto LISP and DCL (dialog box programming language) to customize the specific dialog box and the pop menu, which help communicate between people and computer. Only choose or input several critical parameters, we can get the drawing easily which we need. All of the programs in this system can be loaded repeatedly. After further development, the AutoCAD 2004 system become stronger, more efficient and friendlier, it decreases the design circulation and greatly improved the design quality.

Key Words: AutoCAD;Auto LISP;DCL;Parameterized Design;

Typical components of chemical engineering equipment;

目 录

2摘 要

3Abstract

4目 录

6第一章 绪 论

61.1 课题研究的目的及意义

61.2 国内外同类研究状况

71.3 课题研究成果

8第二章 AutoCAD及其二次开发

82.1 AutoCAD简介

82.1.1 AutoCAD二次开发

82.1.2 AutoCAD二次开发的工具选择

92.2 Visaul Lisp简介

92.3 DCL简介

102.3.1 AutoCAD对话框概述

102.3.2 对话框组成

112.4 菜单自定义

112.4.1 自定义菜单文件

112.4.2 菜单文件加载

122.5尺寸数据参数化

14第三章 化工设备典型零部件

143.1 概述

143.2 化工设备的标准化通用零部件

143.2.1 筒体

153.2.2 封头

173.2.3 支座

183.2.4 法兰

203.2.5 垫片

203.2.6 接管

21第四章 化工容器典型零部件图库的二次开发

214.1 图库界面及其功能

224.2 结构尺寸分析

244.3 对话框界面定制

254.4 SLD幻灯片的制作

254.5 编制驱动程序

264.6 自定义并加载局部菜单

28结 论

29致 谢

30参考文献

31附 录 化工设备典型零部件图库开发程序

第一章 绪 论

1.1 课题研究的目的及意义

化工设备是广泛应用于化工行业的机械设备,常用的化工设备如贮槽、列管式热交换器、塔器、反应罐等,主要由筒体、封头、人孔、接管、管法兰、螺栓及螺栓连接件等零部件组成。这些常用零部件都有相应的标准, 并在各种化工设备上通用。

化工设备工程师都有这样的体会, 绘制化工设备和反应器的时候,这些化工设备零部件的绘制要占去很大一部分工作量。一张装配图往往是主体部件笔画简单,用CAD 基本命令很快既可绘出。然而,其上设置的零部件的笔画却相对繁琐,大大影响绘图效率,使装备图的绘制常常需花费相当多的时间。化工设备常用零部件,一个系列少则数个,多则数十个规格,若每需一种规格,就要按AutoCAD 标准命令绘制一个,那么就成了耗费时间的简单重复劳动,时间一长,图形越复杂,就更容易出错。

本文基于AutoCAD 2007应用AutoLISP 语言编写工程图的参数化程序,用于化工设备装配图的绘制,效率明显高于常规AutoCAD的手工绘制,不仅减轻了设计人员处理大量数据的繁重劳动,而且不宜出错,确保质量。该系统可以实现筒体、封头、法兰、接管、垫片、支座等标准零部件的参数化绘制,系列越多,规格越多,效果越明显,绘图效率将成倍增长。

通过本项研究,可以使化工设备图的制图过程大大简化,使用更加方便,极大地提高设计效率,保证设计质量。

1.2 国内外同类研究状况

机械中常有这样一些零部件,它们的结构形状一样,只是尺寸有些差别,并且都实现了标准化和系列化。借助AutoCAD的二次开发功能,实现它们的参数化绘图,可以大大提高设计质量和效率。伴随着AutoCAD在各行各业的普及,对于它二次开发的研究也就顺应着不断普及和深入,目前国内外对这方面已做了大量研究。例如,

武汉工程大学的曾真和王为国详细阐述了应用AutoLISP 语言编写工程图的参数化绘制程序的关键步骤和实现过程[1];

包头师范学院化学系的李军湘把化工设备上通常都有的一些标准件和常用件绘制成块, 在绘制化工设备图时, 就可以直接插入这些图块, 从而使绘图工作变得简单易行[2];

西北轻工业学院的刘鹏,在标准件参数化绘图系统的建立上做出贡献[3];熊勇刚完善了机械CAD参数化设计技术[4];张羽中等从事化工设备参数化设计系统CEE-PDS的开发研究[5];南京工业大学的贺小华研究了化工设备常用结构的参数化CAD设计[6]。

1.3 课题研究成果

AutoCAD内部附着了VisualLisp和DCL。VisualLisp是用来编辑绘图、编写图形程序的一种表结构的处理语言,不仅拥有强大的功能,而且易学易用;设计人机交互的对话框,DCL可以做到简洁、美观,而且交互性很强。本研究通过用内置的VisualLisp和DCL合作对AutoCAD进行二次开发,两者相互配合,可以实现强大的AutoCAD二次开发能力。

本研究实现了化工设备典型零部件的图库开发,完成了在AutoCAD中的标准封头、法兰、接管、圆筒、支座的参数化绘制,且绘图过程实现了以下四个特点:(1)建立了友好、快捷的DCL对话框,使操作异常轻松;(2)弹出的对话框可预览所需绘制图形;(3)提供标准件的数据参数,操作者无需翻阅相关资料就能完成标准件的绘制;(4)下拉菜单的建立使操作者更加一目了然的进行操作,绘图时只需轻松的点击鼠标就能弹出所要绘制图形的对话框。

第二章 AutoCAD及其二次开发

AutoCAD内部附着了AutoLisp和DCL。有时为了增强设计能力并提高绘图效率,我们用内置的AutoLisp和DCL合作对AutoCAD进行二次开发。AutoLisp是用来编辑绘图、编写图形程序的一种表结构的处理语言,不仅拥有强大的功能,而且易学易用。设计人机交互的对话框,DCL可以做到简洁,美观,而且交互性很强。两者相互配合的话,就能实现强大的AutoCAD二次开发能力。

2.1 AutoCAD简介

AutoCAD已经成为目前应用最广泛的通用交互式计算机辅助绘图与设计软件包。它拥有强大的图形支撑能力和开放的结构体系,因此顺理成章的成为计算机CAD市场的龙头。它允许用户用高级编程语言对其进行二次开发,从而最大限度的满足用户的需求。

2.1.1 AutoCAD二次开发

AutoCAD由美国Autodesk公司开发。对于机械工程师来说,最熟悉的工程软件莫过于AutoCAD了,而且对于工程绘图者来说,AutoCAD的基本上可以被认定为CAD的代名词。因为CAD这三个字母一被提及,大家首先想到的就是AutoCAD。

AutoCAD的不断发展,使其成为一款通用的适合各个行业进行设计工作的平台。尽管它已经能够提供足够强大的各种功能,但是如果能够对它进行二次开发,就能更好的提高效率,满足各个企业的对不同产品和设计的需要。例如化工设备标准零部件的模型数据库的建立,对模型实现可参数化设计等等。

AutoLisp、VBA、C、外围对象VB还有最新的.NET平台都能实现对AutoCAD的二次开发。

2.1.2 AutoCAD二次开发的工具选择

AutoCAD的二次开发拥有多种方法,这使AutoCAD的二次开发显得极为方便。它主要包括以下几种开发工具:(1) AutoLisp; (2) ObjectARX; (3) ADS;(4) Visual Lisp;(5) VBA

本研究采用的就是第四种Visual Lisp对AutoCAD进行二次开发,完成化工设备典型零部件的图库开发。

2.2 Visaul Lisp简介

LISP是List Processor(表处理程序)的缩写,主要用于人工智能(AI)领域。AutoLISP是人工智能语言CommonLISP的简化版本,作为通用LISP语言的一个小子集,AutoLISP严格遵循其语法和惯例,但又添加了许多针对AutoCAD的功能。Autodesk公司在AutoCAD 2.1版引入AutoCAD作为应用程序编程接口(API),用于扩展和自定义AutoCAD功能。借助AutoLISP,用户可以用适合编写图形应用程序的强大的高级语言来编写宏程序和函数,并开发各种软件包。

Visual Lisp是AutoCAD自带的一个集成的可视化AutoLisp开发环境,最早的AutoLisp程序需要用文本编辑工具如记事本等编辑,然后在AutoCAD中加载调试,很不方便。从AutoCAD 2000开始,有了集成的开发环境:Visual Lisp。作为开发工具,Visual LISP提供了一个完整的集成开发环境(IDE),包括编译器、调试器和其他工具,可以实时调试AutoLisp命令,定义AutoCAD的效率。Visual LISP具有自己的窗口和菜单,但它并不能独立于AutoCAD运行。经常需要与AutoCAD图形交互或在命令窗口响应程序提示。

Lisp语言的表结构特点如下:

(setq x 12.3 y 13.5)

(setq p (list x y))

(command “line” “0,0” p “”)

由以上三个表,可以看出一些基本特点:表由左右两个括号组成,括号中是实现各种功能的代码;表的第一个元素均是操作符,其余的是操作符的参数;表中的函数、参数之间至少要有一个空格或者回车来分开。

(函数名 [<参数1>] [<参数2>]…)

以上就是表的一般结构。表是组成Lisp程序最基本的元素,两个表之间多余的空格和回车都不会影响表的功能。

2.3 DCL简介

AutoCAD对话框新颖直观,简化了用户与程序的交互作用,从而极大的提高软件的使用效率。AutoCAD对话框功能由定义各对话框控件的对话框控制语言DCL与对话框驱动程序实现。

2.3.1 AutoCAD对话框概述

对话框控制语言向用户提供了图形与文本共存的可视化环境,使操作简单、自然、快捷。

图2.1 绘制垫片对话框

如图2.1所示为DCL对话框,它由本身的框架和框架中的控件组成。这些基本控件已经由CAD预定义,用户可以引用它们创建出各种控件的组合。AutoCAD预定义的控件包括:

· 按钮(Button)

· 文本编辑器(Text Edit Box)

· 列表框(List Box)

· 滑动条(Slider)

· 公用键

· 快捷键

2.3.2 对话框组成

对话框由一些基本控件组合而成,这些控件的功能要进行分类处理。它们由PDB预定义,按照功能分为6类如表2.1所示:

表2.1 控件的基本类型

类型

组成控件

预定义动作控件

控件组

修饰及说明

正文聚合

对话框处理按钮

出错控件

button,dialog,edit,image button,list box,popup list,radio button,slide,toggle

column,boxed column,row,radio column, boxed radio column, radio row, boxed radio row

image,text,spacer

text part,concatenation,paragraph

ok,ok and cancel,ok cancel help,ok cancel help information

error tile,ok cancel help error tile

CAD为用户提供了功能全面的预定义控件,基本可以满足用户的需求,设计出能够满足实际应用需要的对话框,而且这些预定义控件在用户开发自定义控件时是很值得借鉴的。

2.4 菜单自定义

下拉菜单的定制使用户可以直接在AutoCAD的工具栏进行操作,无需在CAD的命令行输入函数名。且建立的下拉菜单使用户更加一目了然,增加绘图效率,让设计者一心一意投入到设计中。

2.4.1 自定义菜单文件

AutoCAD 2006 以前的版本都是通过在文本编辑器中编辑mnc 或mns 菜单文件来实现菜单的定制, 程序编制不仅麻烦而且容易出错。从AutoCAD 2006 版本开始, 基于XML 的CUI 文件取代了先前所使用的菜单文件, 所有界面的定制都是通过“自定义用户界面”对话框与用户交互完成, 简便省时。

2.4.2 菜单文件加载

在AutoCAD界面中,于命令行输入cuiload 命令, 弹出图2.2所示的“加载/ 卸载自定义设置”对话框,

图2.2 “加载/ 卸载自定义设置”对话框

浏览选择已定义好的自定义菜单文件, 加载之后, 菜单栏中即出现自定义的菜单“标准部件”及其相关内容。

2.5尺寸数据参数化

1.参数化的本质

在参数化这样的设计系统中,设计人员可以根据几何关系和工程关系来设定参数要求。不仅需要考虑尺寸,还要考虑工程参数的初值,而且每次改变设计参数,参数之间的关系不要改变,即每一个设计参数都要对应着相关的其他参数。设计参数的改变是牵一发而动全身的。

参数可以分为两类:其一为可变参数,是反映了设计的尺寸值;其二为不变参数,反映着各种连续几何信息。参数化设计也就是在可变参数的作用下,系统自动选择相应的不变参数,完成要绘制图形的各个尺寸。

2.参数化设计的应用

化工设备常用零部件往往都拥有标准尺寸,我们希望建立一种结构,使只需要部分参数,就能完成标准件的绘制。这必须利用标准件的各个尺寸间存在的内在关系。

零件设计模型的建立速度是决定整个产品开发速度的关键。化工常用零部件的形状和尺寸一般都有一定的规格,通过查阅有关化工常用零部件的尺寸,然后建立文件,把这些尺寸记录下来,在绘制相关零部件时候,只需要调用这些文件,读出其中的数据,根据这些数据尺寸画出图形,就免去了查阅资料的麻烦,使画图更有效率,修改更加方便。因此,在设计中要查阅资料建立各种零部件尺寸的文本文档保存在恰当的路径下,供程序随时调用。

3. 参数化设计的意义

参数化设计大大提高了模型绘制和修改的速度,在产品的系列设计,近似、相似设计时候能够大大提高效率,拥有较大的运用价值。

经过参数化设计后,就可以方便的实现这样一种功能:用户只需要输入少量相关参数,就可以完成化工设备常用零部件的标准件的绘制。

第三章 化工设备典型零部件

3.1 概述

化工设备的零部件的种类和规格较多,如果工艺要求不同,结构形状也各有差异。

化工设备典型零部件大体可以分为两类:一类是通用零部件,另一种是各种典型化工设备的常用零部件。

为了便于设计、制造和检修,把这些零部件的结构、形状统一成若干规格,相互通用,称为通用零部件。符合标准规格的零部件称为标准件。

3.2 化工设备的标准化通用零部件

化工设备的标准化通用零部件包括筒体、封头、支座、法兰、接管、人孔和手孔等。

3.2.1 筒体

筒体的作用是提供工艺所需的承压空间,是压力容器最主要的受压元件之一,其内直径和容积往往需要由工艺计算确定。圆柱形筒体(即圆筒)和球形筒体是工程中最常用的筒体结构。

以薄壁圆筒为开发对象,其主要尺寸包括直径、壁厚和高度,如图3.1为按照GB/T 8698-1988的圆筒:

图3.1 圆筒

3.2.2 封头

封头与筒体可以直接焊接,形成不可拆卸的连接,也可以分别焊上法兰,用螺栓、螺母锁紧,构成可拆卸的连接。

常见的封头有椭圆封头、蝶形封头、球形封头、折边锥形封头等,如图3.2、图3.3、图3.4、图3.5、图3.6所示为按照JB 4732所设计的标准封头零部件。

图3.2 椭圆封头

图3.3 蝶形封头

图3.4 球形封头

图3.5 锥形封头(90°)

图3.6 锥形封头(60°)

3.2.3 支座

· 支座是用来支撑设备重量和固定设备的位置的部件。

· 支座一般分为立式设备支座和卧式设备支座两大类。

· 三种典型的标准化支座是:耳式支座、支撑式支座、鞍式支座。

耳式支座用于支撑在钢架、墙体或梁上的以及穿越楼板的立式容器。支脚板上有螺栓孔,用螺丝固定设备。一般有A型和B型两种。

支撑式支座多用于安装在距地坪或基准面较近的,具有椭圆形封头的立式容器。

鞍式支座主要用于卧式容器的支座。同一容器的鞍式支座分为A型和B型两种,A型是轻型,B型是重型。

图3.7为按照JB-T 4712.3-2007设计的耳式支座,图3.8为按照JB-T 4712.1-2007设计的鞍式支座。

图3.7 耳式支座

图3.8 鞍式支座

3.2.4 法兰

· 法兰连接是可拆卸连接的一种,

· 法兰连接是由一对法兰、密封垫片和螺栓、螺母、垫圈等组成的一种可拆封连接。法兰是法兰连接的主要组成部件。

· 化工设备用的标准法兰有两类:管法兰和压力容器法兰。

本研究主要开发了管法兰,包括凸面对焊管法兰、突面板式平焊管法兰、平面带颈平焊管法兰、突面带颈承插焊管法兰、榫槽面管法兰盖,它们的标准分别为GB/T 9115.2-2000、GB/T 9119-2000、GB/T 9116.1-2000、GB/T 9117.1-2000、GB/T 9123.3-2000,图形如图3.9、图3.10、图3.11、图3.12、图3.13所示:

图3.9 凸面对焊管法兰

图3.10 突面板式平焊管法兰

图3.11 平面带颈平焊管法兰

图3.12 突面带颈承插焊管法兰

图3.13 榫槽面管法兰盖

3.2.5 垫片

垫片是用纸、橡皮片或铜片制成,放在两平面之间以加强密封的材料,为防止流体泄漏设置在静密封面之间的密封元件。

垫片是两个物体之间的机械密封,通常以防止的两个物体之间受到压力泄漏。由于机械加工表面不可能完美,使用垫片即可填补不规则性。如图3.14所示是GB/T 9128—2003设计的金属垫片:

图3.14 垫片

3.2.6 接管

几乎所有的化工设备上都有接管。接管按用途可以分为物料的进口管、出口管、排污管及不凝性气体排放管。有些接管需要伸进设备内部,目的是避免物料沿着设备内壁流动,减少摩擦及腐蚀;而有些接管则直接焊在设备壁面上,与设备内壁齐平。如图3.15所示为接管的图形结构。

图3.15 接管

第四章 化工容器典型零部件图库的二次开发

4.1 图库界面及其功能

AutoCAD可以应用多种方法进行二次开发,这样使得开发者获得了巨大的方便。本文应用Visual Lisp作为工具进行二次开发。通过对各零部件的结构尺寸分析、DCL对话框的界面设计、AutoLISP驱动程序的编制、菜单的定制等完成了化工容器典型零部件图库的开发,实现了筒体、封头、法兰、接管、垫片、支座等标准零部件的参数化绘图功能,如图4.1所示为本次开发所完成的图库界面。

图4.1 自定义下拉菜单

进入AutoCAD的操作环境,只需要点击工具栏中的“标准部件”菜单,选择要绘制的零部件的命令,系统就会弹出相应对话框,此时,用户就可以在对话框上操作,点击确定,对话框就会响应用户的动作,自动绘制出图形。

以圆筒的绘制为例。在CAD界面下,找到工具栏中的“标准部件”菜单命令,然后点击圆筒,就会弹出如图4.2所示的DCL对话框:

图4.2 绘制圆筒对话框

此时用户可根据需要对相关绘图参数进行填写,输入相应的数据,然后点击“确定”实现绘图。如果参数输入错误的话,则会弹出图4.3所示对话框。

图4.3 参数错误对话框

如果输入参数无误,就可以完成图形的绘制,绘出图4.4所示图形。

图4.4 圆筒

4.2 结构尺寸分析

要编制零部件的参数化设计程序,首先必须分析零部件的结构尺寸,确定基本参数,建立几何尺寸之间的相互联系。根据插入点坐标确定其他关键点的坐标,从而完成图形的参数化绘制。

以蝶形封头的绘制为例,首先,分析蝶形封头的组成部分及关键尺寸。如图4.5所示,蝶形封头主要由三部分组成:半径为R的部分球面;半径为r的过度圆弧;高度为h1的直边。常用的蝶形封头的主要数据参数有以下关系:

图4.5 蝶形封头的结构

R=D (D为所连接筒体的内径), r=0.15D, h=0.226D (h为直边以上的封头高度),直边高度则随着封头厚度S产生如表4.1所示的变化:

表4.1 直边高度与厚度关系表

h1=

25

S<=8

40

10<=S<=18

50

20<=S

要想画出图4.5所示的蝶形封头,就要确定两个过度圆弧的圆心及球壳大圆弧的圆心。如果能确定这三个圆弧的圆心,再由以上提供的数据参数关系,就能方便的绘出蝶形封头的标准件。

首先选择插入点p0,根据插入点p0和直边高度h1来确定点cen,点cen左右各取0.35D的距离,所确定的点就是两个过渡圆的圆心p5和p6,可以通过画圆命令画出过渡圆,然后再用画圆命令画出半径是D并与两个过渡圆相切的大圆,通过修剪,蝶形封头的内部结构如图4.6所示就绘制成型,然后调用CAD的偏移命令画出外部轮廓,最终填充上剖面线,参数化绘制蝶形封头就完成了。

图4.6 参数绘图各基本点的确定

4.3 对话框界面定制

根据已确定的基本参数,设计对话框内容和布局。

如鞍式支座的DCL对话框,所需要获得的鞍式支座的基本参数包括插入点p0、筒体的直径、筒体的厚度和鞍式支座的旋转角度。所以用预定义动作按钮button来定义插入点p0,并通过用两个edit_box控件来定义纵横坐标来进一步完善插入点p0的选择。其他包括筒体的直径,筒体的厚度和鞍式支座的旋转角度都用edit_box控件来定义。

在DCL对话框的左侧,设置一个可以插入SLD图片的image修饰控件,它可以调用SLD文件来预览将要绘制的图形结构和各参数在图形中所指的具体对象。如图4.7所示为定义好的鞍式支座的DCL对话框。

图4.7 鞍式支座的DCL对话框

4.4 SLD幻灯片的制作

对话框图像控件里的图形预览是由驱动程序向图像按钮控件里填充幻灯片来实现的, 所以绘制好的图形还需要制作成幻灯片。

制作幻灯片保存在指定目录,可以在DCL对话框中显示出要绘制图形的形状,供用户提前预览,从而确定插入点和旋转角度等相关信息

以圆筒为例的幻灯片制作为例。首先打开AutoCAD,在其中运用已经编写好的程序绘制出一个圆筒,绘制出一个圆筒。幻灯片用mslide 命令制作,只需在绘制好圆筒命令后输入“mslide”命令,就可弹出如图4.8所示对话框,然后将已经绘制好的图形保存为* . sld 幻灯片文件,存入指定的文件夹。

图4.8创建幻灯片对话框

4.5 编制驱动程序

对话框界面由DCL 语言定义, 而界面的功能是由驱动程序控制的。对话框驱动程序由Visual LISP 语言编制, 用来控制装入DCL 文件、显示、激活和卸载对话框, 并捕捉用户的控件选择动作以实现相应的功能。

要实现标准零部件的参数化绘图,很重要的一项工作是,建立标准零部件的数据文件,通过编制数据检索程序,完成标准零部件的正确绘制。图4.9为GB/T 9123.3-2000榫槽面管法兰盖的标准参数文本文件,是查阅相关资料、按照标准尺寸数据建立的文本文件。输入的各个尺寸数据间用空格连接,方便驱动程序读取。

驱动程序还包括获取对话框中编辑框值的子函数,没有了它,就捕捉不到用户的控件选择动作,就很难实现DCL对话框中定义的参数与驱动程序的交流,这样就得不到用户的相关操作,也就无法实现绘图。

图4.9 榫槽面管法兰盖标准数据文本文件

4.6 自定义并加载局部菜单

AutoCAD 2006 以前的版本都是通过在文本编辑器中编辑mnc 或mns 菜单文件来实现菜单的定制, 程序编制不仅麻烦而且容易出错。从AutoCAD 2006 版本开始, 基于XML 的CUI 文件取代了先前所使用的菜单文件, 所有界面的定制都是通过“ 自定义用户界面”对话框与用户交互完成, 简便省时。

单击“工具”菜单中“自定义”的“界面”, 即弹出“自定义用户界面”对话框, 选择“传输” 标签, 在右边窗口新建CUI 文件; 右键单击“菜单”, 选择“新建” 中“菜单”, 输入自定义菜单名称“标准部件”, 保存自定义CUI 文件。单击“自定义”标签, 在左边窗口打开新建的自定义文件。在命令列表窗口, 新建命令“封头”、“法兰”、“接管”、“圆筒”、“垫片”、“支座” 等, 并在右边如图4.10所示“特性”窗口“宏”内输入相应的宏命令, 将定义好的命令拖放到“标准部件”菜单上, 自定义菜单, 保存退出

图4.10CUI文件菜单命令宏的定义

在AutoCAD界面中,于命令行输入cuiload 命令, 弹出图4.11所示的“加载/ 卸载自定义设置”对话框,浏览选择已定义好的自定义菜单文件, 加载之后, 菜单栏中即出现自定义的菜单“标准部件”及其相关内容。

图4.11 “加载/ 卸载自定义设置”对话框

加载后的菜单栏中已经存在“标准部件”的下拉菜单,他的效果和其他工具栏是一样的:只需用鼠标点击,就可以轻松实现相关命令,自动弹出DCL对话框,完成各种常用化工零部件的绘制。

结 论

在AutoCAD环境下对化工设备典型零部件进行图库开发,使CAD在绘制化工设备典型零部件时功能更加强大。应用Vlisp编写DCL对话框控制语言和图形绘制函数,在执行AutoLisp的同时调用对话框,提供多样化的接口,并提供程序执行所需要的数据。通过分析,得出以下结果:

· 友好、快捷的DCL对话框,使操作异常轻松。

· 对话框可预览所需绘制图形。

· 提供标准件的数据参数,无需翻阅相关资料。

· 下拉菜单的建立使操作者绘图时更加一目了然。

由以上结果,基于AutoCAD的化工设备常用零部件的的图库开发,可以帮助设计者完成无趣、琐碎的许多工作,以友好、快捷、智能的人机交互系统辅助设计者轻轻松松完成设计任务。

通过应用AutoLISP对化工设备常用零部件的图库开发,能使设计者的绘图节省大量时间,但研究工作仍有不足,表现在:

1.在AutoCAD中,工具栏可以执行大部分命令,定制工具栏的研究还可以更加深入。

2.目前在应用AutoLISP 语言编写工程图的参数化绘制程序实际应用效果很好,但还有待进一步完善,比如主程序继续优化,所需结构图也只与标准号这唯一的一个参数相对应,若能减少其它特性参数的输入,使用起来将更加简捷。

致 谢

历经半年时间,经过一连串努力仔细的研究,付出大量的精力,最后终于将要完成结束大学四年生涯的毕业设计。在设计和研究的过程中,不可避免的遇到了很多困难和疑问,对毕业设计的完成产生巨大的障碍,但是在困境之中,我的毕业设计导师给了我莫大的帮助,时刻鼓励我,提醒我要坚持努力,不要懈怠。所以我首先要感谢的就是我的毕业设计导师单玉霞老师。她的细致,她的耐心,她偶尔的严厉,她的关心和爱护,时时刻刻感染和帮助着我。从头到尾,单老师都在背后支持着我,给予我无私的帮助和关心。单老师是一位拥有令人敬佩的专业水平的老师,她严谨的治学态度以及严谨的科学精神让我无法忘怀,在以后的学习生活过程中,它仍能在激励我奋进的道路上发挥不可磨灭的作用。在此谨向单老师致以诚挚的谢意和崇高的敬意。

另外,在毕业设计的过程中,我周围的很多朋友和同学,都伸出了援助之手,让我能够更快更好的完成毕业设计的任务。在此要向给予我帮助的朋友和同学致以诚挚的谢意。

在南京林业大学的思念是忙碌的,也是充实的。我掌握了知识、道理和宝贵的实践经验。南京林业大学机械电子工程学院给了我一个良好的学习环境,对于学院曾经给予我指导的老师,我也要表达诚挚的感谢。

作为南京林业大学的一名学员,在将来的学习、生活、工作当中,我将不忘老师的关怀和同学的帮助,努力刻苦,奋发上进,做出一番事业。

参考文献

[1] 刘鹏.标准件参数化绘图系统的建立[J].西北轻工业学院学报,2002,(5):34-37.

[2] 熊勇刚.机械CAD参数化设计技术[J].机械科学与技术,1999,18(6):1025-1029.

[3] 张羽中等.化工设备参数化设计系统CEE-PDS开发研究[J].计算机与应用化学,2001,(18):226-

233.

[4] 全国化工设备设计技术中心站组织研发.ComCAD 2.0—化工设备标准零部件绘图软件包.1998.

[5] 贺匡国著.化工容器及设备简明设计手册[M].化学工业出版社,2002.8.

[6] 董春桥.AutoCAD二次开发技术[J].武汉城市建设学院学报,1999,16(3):45.

[7] 刘湘秋编著.常用压力容器手册[M].北京:机械工业出版社,2004.6.

[8] 赵景亮等著.AutoCAD2004与Visual LISP二次开发技术[M].北京:清华大学出版社,2004.

[9] 汪琪美、霍新民等著.对话框与驱动程序设计[M].青岛:海洋出版社,1998.

[10] 董大勤编.化工设备机械基础[M].北京:化学工业出版社,2002.12.

[11] 郭朝勇等著. AutoCAD的定制与开发[M].北京:人民邮电出版社,1998.

[12] 贺小华等.化工设备常用结构的参数化CAD设计[J].南京化工大学学报,1997,19(4).

[13] 汤峻著.AutoCAD2000高级应用与Visual LISP开发宝典[M].北京:人民邮电出版社,2001.

[14] 方利国著.计算机辅助化工制图与设计[M].北京:化学工业出版社,2010.4.

[15] 国家质量技术监督局发布.钢制管法兰[M].中华人民共和国国家标准.2000.9.

[16] GB150—1998.钢制压力容器[M].国家技术监督局.

[17] ASME Boiler and Pressure Vessel.Code.VIII-1.Rules for Construction of Pressure

Vessels.1998.

[18] John F.Harvey,P.E.Theory and Design of Pressure Vessels.New York:Van Nostrand Reinhold

Company,1985.

附录 化工设备典型零部件图库开发程序

1 鞍式支座

1.1 鞍式支座的DCL对话框程序

//鞍式支座对话框的主程序

aszz:dialog{

label= "绘制鞍式支座";

:row{

:image{

width=45;

height=14;

key="img_cr";

color=-2;

}

:column{

:boxed_column{

label="插入点p0坐标";

:button{

label="光标选取(&P)<";

key="pick";

mnemonic="P";

}

:row{

width=10;

:edit_box{

label="x0(&X)=:";

key="px";

mnemonic="x";

value="0";

edit_width=6;

}

:edit_box{

label=" y0(&Y)=:";

key="py";

mnemonic="y";

value="0";

edit_width=6;

}

}

}

:boxed_column{

label="数据项:";

:edit_box{

label="旋转角度&A(℃):";

key="ang";

mnemonic="A";

value="0";

edit_width=10;

}

:edit_box{

label="公称直径&DN(mm):";

key="DN";

mnemonic="d";

value="1000";

edit_width=10;

}

:edit_box{

label="筒体壁厚&S(mm):";

key="S";

mnemonic="s";

value="10";

edit_width=10;

}

}

}

}

ok_cancel;

}

1.2 鞍式支座的驱动程序

;;;读取文件数据函数

(defun read-list(f / L len k s_str p one)

(setq str (read-line f))

(if str

(progn

(setq str (strcat str "\n"))

(setq len (strlen str))

(setq L '() k 1 s_str "" p nil)

(while (<= k len)

(setq one (substr str k 1))

(if (or (= one ":") (= one ",") (= one " ")

(= one (chr 9)) (= one "\n"))

(if p

(progn

(if (= (type (read s_str)) 'SYM)

(setq L (cons s_str L))

(setq L (cons (read s_str) L))

) ;if end

(setq s_str "" p nil)

) ;progn end

) ;if end

(setq s_str (strcat s_str one) p T)

) ;if end

(setq k (1+ k))

) ;while end

(reverse L)

) ;progn end

) ;if end

) ;function end

;;;鞍式支座公称直径1000-2000范围的子函数

(defun aszz1(/ f n do h l1 b1 s1 s2 l3 b2 b3 s3 c b4 e l2 r

x y x1 x2 x3 x4 y1 y3 y4 ang1 ang2 ang3 ang4 )

(setq f (open "C:/Documents and Settings/Administrator/桌面/新建文件夹/My lisp/鞍式支座/aszz.txt" "r"))

(setq n 1)

(while (= n 1)

(setq Lst (read-list f))

(if (equal (car Lst) dn 0.1)

(setq n 0))

(if (= Lst nil)

(progn

(alert "程序运行出错!\n输入参数错误!")

(quit))

)

) ;while end ;使获得所需表

(close f)

(setq p (/ (* p pi) 180))

(setq do (+ (/ dn 2.0) s))

(setq h (nth 1 Lst))

(setq l1 (/ (nth 2 Lst) 2.0))

(setq b1 (nth 3 Lst))

(setq s1 (nth 4 Lst))

(setq s2 (nth 5 Lst))

(setq l3 (nth 6 Lst))

(setq b2 (nth 7 Lst))

(setq b3 (nth 8 Lst))

(setq s3 (nth 9 Lst))

(setq c (nth 10 Lst))

(setq b4 (nth 11 Lst))

(setq s4 (nth 12 Lst))

(setq e (nth 13 Lst))

(setq l2 (/ (nth 14 Lst) 2.0))

(setq r (+ do s4))

(setq x (+ l3 l3 s3))

(setq x1 (- (* r (sin (/ pi 3))) x))

(setq y (+ r h))

(setq y1 (- y (* r (cos (/ pi 3)))))

(setq ang2 (atan x1 y1))

(setq x2 (/ 50 (cos ang2)))

(setq x (/ c 2.0 r))

(setq ang1 (- (/ pi 2) x))

(setq x3 l3)

(setq x4 (+ l3 s3))

(setq y3 (sqrt (- (* r r) (* x3 x3))))

(setq y4 (sqrt (- (* r r) (* x4 x4))))

(setq ang3 (atan x3 y3))

(setq ang4 (atan x4 y4))

(setq x5 (/ 15 (cos (- (/ pi 4) ang2))))

(setq pt1 (polar p0 (+ p (/ pi -2)) do))

(setq pt2 (polar p0 (+ p (/ pi -2)) r))

(setq pt4 (polar p0 (+ p (/ pi -2)) (+ r h)))

(setq pt3 (polar pt4 (+ p (/ pi 2)) s1))

(setq p1 (polar p0 (- p ang1) do))

(setq p2 (polar p0 (- p ang1) r))

(setq p3 (polar p0 (+ p (/ pi -6)) r))

(setq p4 (polar p3 (- p ang2) s3))

(setq p5 (polar p4 (- p (+ (/ pi 2) ang2)) x2))

(setq p6 (polar p5 (+ p (/ pi -4)) x5))

(setq p7 (polar p0 (- p (- (/ pi 2) ang3)) r))

(setq p8 (polar p0 (- p (- (/ pi 2) ang4)) r))

(setq p9 (polar pt3 p l3))

(setq p10 (polar p9 p s3))

(setq p11 (polar p10 p l3))

(setq p12 (polar p11 p (/ s3 (cos ang2))))

(setq p13 (polar p12 p (/ 15 (cos ang2))))

(setq p14 (polar pt3 p l1))

(setq p15 (polar p14 (- p (/ pi 2)) s1))

(setq pa1 (polar p0 (+ p (/ pi 2)) 10))

(setq pa2 (polar pt4 (- p (/ pi 2)) 10))

(setq pa3 (polar p0 (+ p pi) (+ do 10)))

(setq pa4 (polar p0 p (+ do 10)))

(setq pb0 (polar pt3 p l2))

(setq pb1 (polar pb0 (+ p (/ pi 2)) 10))

(setq pb2 (polar pb0 (- p (/ pi 2)) (+ s1 10)))

(command "pline" pt1 "a" "ce" p0 p1 "l" p2 "")

(setq e1 (entlast))

(command "arc" pt2 "c" p0 p2)

(setq e2 (entlast))

(command "pline" p11 p3 p4 p12 "")

(setq e3 (entlast))

(command "pline" p5 p6 "")

(setq e4 (entlast))

(command "line" p6 p13 "")

(setq e5 (entlast))

(command "line" p7 p9 "")

(setq e6 (entlast))

(command "line" p8 p10 "")

(setq e7 (entlast))

(command "pline" pt3 p14 p15 pt4 "")

(setq e8 (entlast))

(command "mirror" e1 e2 e5 e6 e7 e8 "" pa1 pa2 "")

(setq m2 (entlast))

(command "mirror" e3 "" pa1 pa2 "")

(setq m3 (entlast))

(command "mirror" e4 "" pa1 pa2 "")

(setq m4 (entlast))

(command "line" pa1 pa2 "")

(setq e1 (entlast))

(command "line" pa3 pa4 "")

(setq e2 (entlast))

(command "line" pb1 pb2 "")

(setq e3 (entlast))

(command "mirror" e3 "" pa1 pa2 "")

(setq m3 (entlast))

(command "change" e1 e2 "" "p" "lt" "center" "s" 100 "")

(command "change" e3 m3 "" "p" "lt" "center" "s" 5 "" )

)

;;;鞍式支座公称直径1000-2000范围的子函数

(defun aszz2(/ f n do h l1 b1 s1 s2 l3 b2 b3 s3 c b4 e l2 r

x y x1 x2 x3 x4 x5 x6 x8 y1 y3 y4 y5 y6

ang1 ang2 ang3 ang4 ang5 ang6 )

(setq f (open "C:/Documents and Settings/Administrator/桌面/新建文件夹/My lisp/鞍式支座/aszz.txt" "r"))

(setq n 1)

(while (= n 1)

(setq Lst (read-list f))

(if (equal (car Lst) dn 0.1)

(setq n 0))

(if (= Lst nil)

(progn

(alert "程序运行出错!\n输入参数错误!")

(quit))

)

) ;while end ;获得所需表

(close f)

(setq p (/ (* p pi) 180))

(setq do (+ (/ dn 2.0) s))

(setq h (nth 1 Lst))

(setq l1 (/ (nth 2 Lst) 2.0))

(setq b1 (nth 3 Lst))

(setq s1 (nth 4 Lst))

(setq s2 (nth 5 Lst))

(setq l3 (nth 6 Lst))

(setq b2 (nth 7 Lst))

(setq b3 (nth 8 Lst))

(setq s3 (nth 9 Lst))

(setq C (nth 10 Lst))

(setq b4 (nth 11 Lst))

(setq s4 (nth 12 Lst))

(setq e (nth 13 Lst))

(setq l2 (/ (nth 14 Lst) 2.0))

(setq r (+ do s4))

(setq x (+ l3 l3 l3 s3 s3))

(setq x1 (- (* r (sin (/ pi 3))) x))

(setq y (+ r h))

(setq y1 (- y (* r (cos (/ pi 3)))))

(setq ang2 (atan x1 y1))

(setq x2 (/ 50 (cos ang2)))

(setq x (/ c 2.0 r))

(setq ang1 (- (/ pi 2) x))

(setq x3 l3)

(setq x4 (+ l3 s3))

(setq x5 (+ x4 l3))

(setq x6 (+ x5 s3))

(setq y3 (sqrt (- (* r r) (* x3 x3))))

(setq y4 (sqrt (- (* r r) (* x4 x4))))

(setq y5 (sqrt (- (* r r) (* x5 x5))))

(setq y6 (sqrt (- (* r r) (* x6 x6))))

(setq ang3 (atan x3 y3))

(setq ang4 (atan x4 y4))

(setq ang5 (atan x5 y5))

(setq ang6 (atan x6 y6))

(setq x8 (/ 15 (cos (- (/ pi 4) ang2))))

(setq pt1 (polar p0 (+ p (/ pi -2)) do))

(setq pt2 (polar p0 (+ p (/ pi -2)) r))

(setq pt4 (polar p0 (+ p (/ pi -2)) (+ r h)))

(setq pt3 (polar pt4 (+ p (/ pi 2)) s1))

(setq p1 (polar p0 (- p ang1) do))

(setq p2 (polar p0 (- p ang1) r))

(setq p3 (polar p0 (+ p (/ pi -6)) r))

(setq p4 (polar p3 (- p ang2) s3))

(setq p5 (polar p4 (- p (+ (/ pi 2) ang2)) x2))

(setq p6 (polar p5 (+ p (/ pi -4)) x8))

(setq p7 (polar p0 (- p (- (/ pi 2) ang3)) r))

(setq p8 (polar p0 (- p (- (/ pi 2) ang4)) r))

(setq p9 (polar p0 (- p (- (/ pi 2) ang5)) r))

(setq p10 (polar p0 (- p (- (/ pi 2) ang6)) r))

(setq p11 (polar pt3 p l3))

(setq p12 (polar p11 p s3))

(setq p13 (polar p12 p l3))

(setq p14 (polar p13 p s3))

(setq p15 (polar p14 p l3))

(setq p16 (polar p15 p (/ s3 (cos ang2))))

(setq p17 (polar p16 p (/ 15 (cos ang2))))

(setq p18 (polar pt3 p l1))

(setq p19 (polar p18 (- p (/ pi 2)) s1))

(setq pa1 (polar p0 (+ p (/ pi 2)) 10))

(setq pa2 (polar pt4 (- p (/ pi 2)) 10))

(setq pa3 (polar p0 (+ p pi) (+ do 10)))

(setq pa4 (polar p0 p (+ do 10)))

(setq pb0 (polar pt3 p l2))

(setq pb1 (polar pb0 (+ p (/ pi 2)) 10))

(setq pb2 (polar pb0 (- p (/ pi 2)) (+ s1 10)))

(command "pline" pt1 "a" "ce" p0 p1 "l" p2 "")

(setq e1 (entlast))

(command "arc" pt2 "c" p0 p2)

(setq e2 (entlast))

(command "pline" p15 p3 p4 p16 "")

(setq e3 (entlast))

(command "pline" p5 p6 "")

(setq e4 (entlast))

(command "line" p6 p17 "")

(setq e5 (entlast))

(command "line" p7 p11 "")

(setq e6 (entlast))

(command "line" p8 p12 "")

(setq e7 (entlast))

(command "line" p9 p13 "")

(setq e8 (entlast))

(command "line" p10 p14 "")

(setq e9 (entlast))

(command "pline" pt3 p18 p19 pt4 "")

(setq e10 (entlast))

(command "mirror" e1 e2 e5 e6 e7 e8 e9 e10 "" pa1 pa2 "")

(setq m2 (entlast))

(command "mirror" e3 "" pa1 pa2 "")

(setq m3 (entlast))

(command "mirror" e4 "" pa1 pa2 "")

(setq m4 (entlast))

(command "line" pa1 pa2 "")

(setq e1 (entlast))

(command "line" pa3 pa4 "")

(setq e2 (entlast))

(command "line" pb1 pb2 "")

(setq e3 (entlast))

(command "mirror" e3 "" pa1 pa2 "")

(setq m3 (entlast))

(command "change" e1 e2 "" "p" "lt" "center" "s" 100 "")

(command "change" e3 m3 "" "p" "lt" "center" "s" 5 "" )

)

;;;;获取对话框中编辑框值的子函数

(defun getmain()

(setq x0 (atof (get_tile "px")))

(setq y0 (atof (get_tile "py")))

(setq p0 (list x0 y0))

(setq p (atof (get_tile "ang"))) ;获得旋转角度

(setq dn (atof (get_tile "DN"))) ;获得内径值

(setq s (atof (get_tile "S")))

)

;对话框的驱动程序

(defun dial()

(if (not (new_dialog "aszz" dcl_id)) (exit))

(start_image "img_cr")

(slide_image 0 0 (dimx_tile "img_cr") (dimy_tile "img_cr") "C:/Documents and Settings/Administrator/桌面/新建文件夹/My lisp/鞍式支座/aszz.sld")

(end_image)

(set_tile "px" (rtos x0 2 2))

(set_tile "py" (rtos y0 2 2))

(set_tile "ang" (rtos p 2 2))

(set_tile "DN" (rtos dn 2 2))

(set_tile "S" (rtos s 2 2))

(action_tile "pick" "(getmain) (done_dialog 2)")

(action_tile "accept" "(getmain) (done_dialog 1)")

(action_tile "cancel" "(done_dialog -1)")

(setq dia (start_dialog))

)

;;鞍式支座(JB/T 4712-92)主函数

(defun c:aszz()

(setq oldcmd (getvar "cmdecho"))

(setvar "cmdecho" 0)

(setq oldosmode (getvar "osmode")) ;保存当前对象捕捉系统变量

(setvar "osmode" 0) ;将对象捕捉关闭

(setq dia 3)

(setq dcl_id (load_dialog "C:/Documents and Settings/Administrator/桌面/新建文件夹/My lisp/鞍式支座/aszz.dcl"))

(if (< dcl_id 0) (exit))

(setq p 0 dn 1000 s 10 x0 0 y0 0)

(setq p0 (list x0 y0))

(while (> dia 1)

(dial)

(if (= dia 2)

(progn

(initget 1)

(setq p0 (getpoint "\n请选取插入点:"))

(setq x0 (car p0) y0 (cadr p0))

(set_tile "px" (rtos x0 2 2))

(set_tile "py" (rtos y0 2 2))

)

)

)

(unload_dialog dcl_id)

(if (= sdt -1) (exit))

(if (= dia 1)

(if (< dn 2100)

(aszz1 ) ;;调用第一子函数

(aszz2 )) ;;调用第二子函数

)

(setvar "osmode" oldosmode) ;将对象捕捉恢复为原始的值

(setvar "cmdecho" oldcmd)

(princ)

)

2 垫片

2.1 垫片的DCL对话框程序

dp:dialog{

label= "绘制垫片";

:row{

:image{

width=45;

height=14;

key="img_cr";

color=-2;

}

:column{

:boxed_column{

label="插入点p0坐标";

:button{

label="光标选取(&P)<";

key="pick";

mnemonic="P";

}

:row{

width=10;

:edit_box{

label="x0(&X)=:";

key="px";

mnemonic="x";

value="0";

edit_width=6;

}

:edit_box{

label=" y0(&Y)=:";

key="py";

mnemonic="y";

value="0";

edit_width=6;

}

}

}

:boxed_column{

label="数据项:";

:edit_box{

label="旋转角度&A(℃):";

key="ang";

mnemonic="A";

value="0";

edit_width=10;

}

:edit_box{

label="垫片内直径&D1(mm):";

key="D1";

mnemonic="d";

value="100";

edit_width=10;

}

:edit_box{

label="垫片外直径&D2(mm):";

key="D2";

mnemonic="d";

value="240";

edit_width=10;

}

:edit_box{

label="封头壁厚&S(mm):";

key="S";

mnemonic="s";

value="30";

edit_width=10;

}

}

}

}

ok_cancel;

}

2.2 垫片的主程序

;;;;获取对话框中编辑框值的子函数

(defun getmain()

(setq x0 (atof (get_tile "px")))

(setq y0 (atof (get_tile "py")))

(setq p0 (list x0 y0))

(setq p (atof (get_tile "ang"))) ;获得旋转角度

(setq d1 (atof (get_tile "D1"))) ;获得内径值

(setq d2 (atof (get_tile "D2")))

(setq s (atof (get_tile "S")))

)

;对话框的驱动程序

(defun dial()

(if (not (new_dialog "dp" dcl_id)) (exit))

(start_image "img_cr")

(slide_image 0 0 (dimx_tile "img_cr") (dimy_tile "img_cr") "C:/Documents and Settings/Administrator/桌面/新建文件夹/My lisp/垫片/dp.sld")

(end_image)

(set_tile "px" (rtos x0 2 2))

(set_tile "py" (rtos y0 2 2))

(set_tile "ang" (rtos p 2 2))

(set_tile "D1" (rtos d1 2 2))

(set_tile "D2" (rtos d2 2 2))

(set_tile "S" (rtos s 2 2))

(action_tile "pick" "(getmain) (done_dialog 2)")

(action_tile "accept" "(getmain) (done_dialog 1)")

(action_tile "cancel" "(done_dialog -1)")

(setq dia (start_dialog))

)

;;;16MnR钢制内压圆筒系列

(defun draw()

(setq p (* (/ pi 180) p))

(setq ri (/ d1 2.0))

(setq ro (/ d2 2.0))

(setq p1 (polar p0 p ri))

(setq p2 (polar p0 (+ pi p) ri))

(setq p3 (polar p0 p ro))

(setq p4 (polar p0 (+ p pi) ro))

(setq p5 (polar p1 (+ p (/ pi 2)) s))

(setq p6 (polar p2 (+ p (/ pi 2)) s))

(setq p7 (polar p3 (+ p (/ pi 2)) s))

(setq p8 (polar p4 (+ p (/ pi 2)) s))

(command "line" p1 p2 "")

(command "line" p5 p6 "")

(command "line" p6 p8 "")

(setq e1 (entlast))

(command "line" p1 p3 "")

(setq e2 (entlast))

(command "line" p2 p4 "")

(setq e3 (entlast))

(command "line" p1 p5 "")

(setq e4 (entlast))

(command "line" p2 p6 "")

(setq e5 (entlast))

(command "line" p3 p7 "")

(setq e6 (entlast))

(command "line" p4 p8 "")

(setq e7 (entlast))

(command "line" p5 p7 "")

(setq e8 (entlast))

(command "hatch" "p" "ansi37" 1 0 "s" e1 e2 e3 e4 e5 e6 e7 e8 "" "")

(setq pa1 (polar p0 (+ (* pi 1.5) p) 20))

(setq pa2 (polar p0 (+ (/ pi 2) p) (+ s 20)))

(command "line" pa1 pa2 "")

(setq m1 (entlast))

(command "change" m1 "" "p" "lt" "center" "s" 100 "" )

(prin1)

)

(defun c:dp()

(setvar "cmdecho" 0)

(setq oldcmd (getvar "cmdecho"))

(setvar "cmdecho" 0)

(setq oldosmode (getvar "osmode")) ;保存当前对象捕捉系统变量

(setvar "osmode" 0) ;将对象捕捉关闭

(setq dia 3)

(setq dcl_id (load_dialog "C:/Documents and Settings/Administrator/桌面/新建文件夹/My lisp/垫片/dp.dcl"))

(if (< dcl_id 0) (exit))

(setq p 0 d1 100 d2 240 s 30 x0 0 y0 0)

(setq p0 (list x0 y0))

(while (> dia 1)

(dial)

(if (= dia 2)

(progn

(initget 1)

(setq p0 (getpoint "\n请选取插入点:"))

(setq x0 (car p0) y0 (cadr p0))

(set_tile "px" (rtos x0 2 2))

(set_tile "py" (rtos y0 2 2))

)

)

)

(unload_dialog dcl_id)

(if (= sdt -1) (exit))

(if (= dia 1) (draw))

(setvar "osmode" oldosmode) ;将对象捕捉恢复为原始的值

(setvar "cmdecho" oldcmd)

(princ)

)

3 蝶形封头

3.1 蝶形封头DCL对话框程序

dxft:dialog{

label= "绘制蝶形封头";

:row{

:image{

width=45;

height=14;

key="img_cr";

color=-2;

}

:column{

:boxed_column{

label="插入点p0坐标";

:button{

label="光标选取(&P)<";

key="pick";

mnemonic="P";

}

:row{

width=10;

:edit_box{

label="x0(&X)=:";

key="px";

mnemonic="x";

value="0";

edit_width=6;

}

:edit_box{

label=" y0(&Y)=:";

key="py";

mnemonic="y";

value="0";

edit_width=6;

}

}

}

spacer_1;

spacer_1;

:boxed_column{

label="数据项:";

:edit_box{

label="旋转角度&A(℃):";

key="ang";

mnemonic="A";

value="0";

edit_width=10;

}

:edit_box{

label="封头内直径&DN(mm):";

key="DN";

mnemonic="d";

value="1000";

edit_width=10;

}

:edit_box{

label="封头壁厚&S(mm):";

key="S";

mnemonic="s";

value="10";

edit_width=10;

}

}

}

}

ok_cancel;

}

3.2 蝶形封头的驱动程序

;;;读取文件数据函数

(defun read-list(f / L len k s_str p one)

(setq str (read-line f))

(if str

(progn

(setq str (strcat str "\n"))

(setq len (strlen str))

(setq L '() k 1 s_str "" p nil)

(while (<= k len)

(setq one (substr str k 1))

(if (or (= one ":") (= one ",") (= one " ")

(= one (chr 9)) (= one "\n"))

(if p

(progn

(if (= (type (read s_str)) 'SYM)

(setq L (cons s_str L))

(setq L (cons (read s_str) L))

) ;if end

(setq s_str "" p nil)

) ;progn end

) ;if end

(setq s_str (strcat s_str one) p T)

) ;if end

(setq k (1+ k))

) ;while end

(reverse L)

) ;progn end

) ;if end

) ;function end

;;;蝶形封头绘制的子函数

(defun draw(/ f n ro ri r h)

(setq f (open "C:/Documents and Settings/Administrator/桌面/新建文件夹/My lisp/蝶形封头/dxft.txt" "r"))

(setq n 1)

(while (= n 1)

(setq Lst (read-list f))

(if (equal (car Lst) dn 0.1)

(setq n 0))

(if (= Lst nil)

(progn

(alert "程序运行出错!\n输入参数错误!")

(quit))

)

) ;while end ;使获得所需表

(close f)

(setq p (/ (* p pi) 180))

(setq r (nth 1 Lst))

(setq h (nth 2 Lst))

(setq ro (+ (/ dn 2.0) s))

(setq ri (/ dn 2.0))

(setq cen (polar p0 (+ p (/ pi 2)) h))

(setq p1 (polar cen p ri))

(setq p2 (polar cen p ro))

(setq p3 (polar cen (+ p pi) ri))

(setq p4 (polar cen (+ p pi) ro))

(setq p5 (polar cen p (/ (* ri 7) 10)))

(setq p6 (polar cen (+ p pi) (/ (* ri 7) 10)))

(command "circle" p5 (* ri 0.3))

(setq e1 (entlast))

(setq p7 (polar p5 (+ p (/ pi 3)) (* ri 0.3)))

(command "circle" p6 (* ri 0.3))

(setq e2 (entlast))

(setq p8 (polar p6 (+ p (* (/ pi 3) 2)) (* ri 0.3)))

(command "circle" "t" p8 p7 dn "")

(setq e3 (entlast))

(setq p9 (polar cen (+ p (* pi 1.5)) (* dn 20)))

(setq p13 (polar p0 p ri))

(setq p14 (polar p0 p ro))

(setq p15 (polar p0 (+ p pi) ri))

(setq p16 (polar p0 (+ p pi) ro))

(command "line" p1 p13 "")

(setq e4 (entlast))

(command "line" p3 p15 "")

(setq e5 (entlast))

(setq p10 (polar p5 (+ p pi) (* ri 0.3)))

(setq p11 (polar p6 p (* ri 0.3)))

(command "trim" e4 e5 e3 "" p10 p11 "")

(command "trim" e1 e2 "" "f" p0 p9 "" "" "")

(setq p12 (polar cen (+ p (/ pi 2)) ri))

(command "offset" s e1 p2 "")

(setq e6 (entlast))

(command "offset" s e2 p4 "")

(setq e7 (entlast))

(command "offset" s e4 p2 "")

(setq e8 (entlast))

(command "offset" s e5 p4 "")

(setq e9 (entlast))

(command "offset" s e3 p12 "")

(setq e10 (entlast))

(command "line" p13 p14 "")

(setq e11 (entlast))

(command "line" p15 p16 "")

(setq e12 (entlast))

(command "line" p13 p15 "")

(command "hatch" "p" "ansi31" 1 0 "s" e1 e2 e3 e4 e5 e6 e7 e8 e9 e10 e11 e12 "" "")

(setq pa1 (polar cen (+ (/ pi 2) p) (+ (* 0.452 ri) s 20)))

(setq pa2 (polar p0 (+ (* pi 1.5) p) 20))

(command "line" pa1 pa2 "")

(setq m1 (entlast))

(command "change" m1 "" "p" "lt" "center" "s" 100 "" )

(prin1)

)

;;;;获取对话框中编辑框值的子函数

(defun getmain()

(setq x0 (atof (get_tile "px")))

(setq y0 (atof (get_tile "py")))

(setq p0 (list x0 y0))

(setq p (atof (get_tile "ang"))) ;获得旋转角度

(setq dn (atof (get_tile "DN"))) ;获得内径值

(setq s (atof (get_tile "S"))))

;对话框的驱动程序

(defun dial()

(if (not (new_dialog "dxft" dcl_id)) (exit))

(start_image "img_cr")

(slide_image 0 0 (dimx_tile "img_cr") (dimy_tile "img_cr") "C:/Documents and Settings/Administrator/桌面/新建文件夹/My lisp/蝶形封头/dxft.sld")

(end_image)

(set_tile "px" (rtos x0 2 2))

(set_tile "py" (rtos y0 2 2))

(set_tile "ang" (rtos p 2 2))

(set_tile "DN" (rtos dn 2 2))

(set_tile "S" (rtos s 2 2))

(action_tile "pick" "(getmain) (done_dialog 2)")

(action_tile "accept" "(getmain) (done_dialog 1)")

(action_tile "cancel" "(done_dialog -1)")

(setq dia (start_dialog))

)

;;蝶形封头主函数

(defun c:dxft()

(setq oldcmd (getvar "cmdecho"))

(setvar "cmdecho" 0)

(setq oldosmode (getvar "osmode")) ;保存当前对象捕捉系统变量

(setvar "osmode" 0) ;将对象捕捉关闭

(setq dia 3)

(setq dcl_id (load_dialog "C:/Documents and Settings/Administrator/桌面/新建文件夹/My lisp/蝶形封头/dxft.dcl"))

(if (< dcl_id 0) (exit))

(setq p 0 dn 1000 s 10 x0 0 y0 0)

(setq p0 (list x0 y0))

(while (> dia 1)

(dial)

(if (= dia 2)

(progn

(initget 1)l

(setq p0 (getpoint "\n请选取插入点:"))

(setq x0 (car p0) y0 (cadr p0))

(set_tile "px" (rtos x0 2 2))

(set_tile "py" (rtos y0 2 2))

)

)

)

(unload_dialog dcl_id)

(if (= sdt -1) (exit))

(if (= dia 1)

(draw)

)

(setvar "osmode" oldosmode) ;将对象捕捉恢复为原始的值

(setvar "cmdecho" oldcmd)

(princ)

)

4 耳式支座

4.1 耳式支座的DCL对话框程序

//耳式支座对话框的主程序

eszz:dialog{

label= "绘制耳式支座";

:row{

:image{

width=45;

height=14;

key="img_cr";

color=-2;

}

:column{

:boxed_column{

label="插入点p0坐标";

:button{

label="光标选取(&P)<";

key="pick";

mnemonic="P";

}

:row{

width=10;

:edit_box{

label="x0(&X)=:";

key="px";

mnemonic="x";

value="0";

edit_width=6;

}

:edit_box{

label=" y0(&Y)=:";

key="py";

mnemonic="y";

value="0";

edit_width=6;

}

}

}

:boxed_column{

label="数据项:";

:edit_box{

label="旋转角度&A(℃):";

key="ang";

mnemonic="A";

value="0";

edit_width=10;

}

:edit_box{

label="公称直径&DN(mm):";

key="DN";

mnemonic="d";

value="500";

edit_width=10;

}

:edit_box{

label="筒体壁厚&S(mm):";

key="S";

mnemonic="s";

value="10";

edit_width=10;

}

}

}

}

ok_cancel;

}

4.2 耳式支座的驱动程序

;;;读取文件数据函数

(defun read-list(f / L len k s_str p one)

(setq str (read-line f))

(if str

(progn

(setq str (strcat str "\n"))

(setq len (strlen str))

(setq L '() k 1 s_str "" p nil)

(while (<= k len)

(setq one (substr str k 1))

(if (or (= one ":") (= one ",") (= one " ")

(= one (chr 9)) (= one "\n"))

(if p

(progn

(if (= (type (read s_str)) 'SYM)

(setq L (cons s_str L))

(setq L (cons (read s_str) L))

) ;if end

(setq s_str "" p nil)

) ;progn end

) ;if end

(setq s_str (strcat s_str one) p T)

) ;if end

(setq k (1+ k))

) ;while end

(reverse L)

) ;progn end

) ;if end

) ;function end

;;;耳式支座绘制的子函数

(defun draw(/ f n ro l1 b1 s1 l2 b2 s2 d)

(setq f (open "C:/Documents and Settings/Administrator/桌面/新建文件夹/My lisp/耳式支座/eszz.txt" "r"))

(setq n 1)

(while (= n 1)

(setq Lst (read-list f))

(if (equal (car Lst) dn 0.1)

(setq n 0))

(if (= Lst nil)

(progn

(alert "程序运行出错!\n输入参数错误!")

(quit))

)

) ;while end ;使获得所需表

(close f)

(setq l1 (nth 1 Lst))

(setq b1 (nth 2 Lst))

(setq s1 (nth 3 Lst))

(setq l2 (nth 4 Lst))

(setq b2 (nth 5 Lst))

(setq s2 (nth 6 Lst))

(setq d (nth 7 Lst))

(setq p (/ (* p pi) 180))

(setq ro (+ (/ dn 2.0) s))

(setq cen (polar p0 (+ (* pi 1.5) p) (- (+ ro l2) s1)))

(setq p1 (polar cen (+ (/ pi 2) p) (/ b1 2)))

(setq p2 (polar cen (+ (* pi 1.5) p) (/ b1 2)))

(setq p3 (polar p1 p (- (/ b2 2) s2)))

(setq p4 (polar p1 p (/ b2 2)))

(command "circle" cen (/ d 2))

(command "line" p1 p3 "")

(setq e1 (entlast))

(setq p5 (polar p1 p (/ l1 2)))

(command "line" p5 p4 "")

(setq e2 (entlast))

(setq p6 (polar p2 p (/ l1 2)))

(command "line" p5 p6 "")

(setq e3 (entlast))

(command "line" p2 p6 "")

(setq e4 (entlast))

(setq p11 (polar p2 p (- (/ b2 2) s2)))

(setq p12 (polar p2 p (/ b2 2)))

(setq p9 (polar p11 (+ (/ pi 2) p) l2))

(setq p10 (polar p12 (+ (/ pi 2) p) l2))

(setq p7 (polar p9 (+ (* pi 1.5) p) 30))

(setq p8 (polar p10 (+ (* pi 1.5) p) 30))

(command "line" p9 p10 "")

(setq e5 (entlast))

(command "line" p7 p8 "")

(setq e6 (entlast))

(command "line" p9 p11 "")

(setq e7 (entlast))

(command "line" p12 p10 "")

(setq e8 (entlast))

(command "mirror" e1 e2 e3 e4 e5 e6 e7 e8 "" p1 p2 "")

(setq pa1 (polar p1 (+ (/ pi 2) p) 20))

(setq pa2 (polar p2 (+ (* pi 1.5) p) 20))

(command "line" pa1 pa2 "")

(setq m1 (entlast))

(command "change" m1 "" "p" "lt" "center" "s" 5 "" )

(setq pb1 (polar p0 (- (+ (* pi 1.5) p) (/ pi 12)) ro))

(setq pb2 (polar p0 (+ (+ (* pi 1.5) p) (/ pi 12)) ro))

(command "arc" "c" p0 pb1 pb2)

)

;;;;获取对话框中编辑框值的子函数

(defun getmain()

(setq x0 (atof (get_tile "px")))

(setq y0 (atof (get_tile "py")))

(setq p0 (list x0 y0))

(setq p (atof (get_tile "ang"))) ;获得旋转角度

(setq dn (atof (get_tile "DN"))) ;获得内径值

(setq s (atof (get_tile "S")))

)

;对话框的驱动程序

(defun dial()

(if (not (new_dialog "eszz" dcl_id)) (exit))

(start_image "img_cr")

(slide_image 0 0 (dimx_tile "img_cr") (dimy_tile "img_cr") "C:/Documents and Settings/Administrator/桌面/新建文件夹/My lisp/耳式支座/eszz.sld")

(end_image)

(set_tile "px" (rtos x0 2 2))

(set_tile "py" (rtos y0 2 2))

(set_tile "ang" (rtos p 2 2))

(set_tile "DN" (rtos dn 2 2))

(set_tile "S" (rtos s 2 2))

(action_tile "pick" "(getmain) (done_dialog 2)")

(action_tile "accept" "(getmain) (done_dialog 1)")

(action_tile "cancel" "(done_dialog -1)")

(setq dia (start_dialog))

)

;;椭圆封头主函数

(defun c:eszz()

(setq oldcmd (getvar "cmdecho"))

(setvar "cmdecho" 0)

(setq oldosmode (getvar "osmode")) ;保存当前对象捕捉系统变量

(setvar "osmode" 0) ;将对象捕捉关闭

(setq dia 3)

(setq dcl_id (load_dialog "C:/Documents and Settings/Administrator/桌面/新建文件夹/My lisp/耳式支座/eszz.dcl"))

(if (< dcl_id 0) (exit))

(setq p 0 dn 500 s 10 x0 0 y0 0)

(setq p0 (list x0 y0))

(while (> dia 1)

(dial)

(if (= dia 2)

(progn

(initget 1)

(setq p0 (getpoint "\n请选取插入点:"))

(setq x0 (car p0) y0 (cadr p0))

(set_tile "px" (rtos x0 2 2))

(set_tile "py" (rtos y0 2 2))

)

)

)

(unload_dialog dcl_id)

(if (= sdt -1) (exit))

(if (= dia 1)

(draw)

)

(setvar "osmode" oldosmode) ;将对象捕捉恢复为原始的值

(setvar "cmdecho" oldcmd)

(princ)

)

5 突面板式管法兰

5.1 突面板式管法兰的DCL对话框程序

//突面板式管法兰对话框的主程序

tmbsgfl:dialog{

label= "绘制突面板式管法兰";

:row{

:image{

width=45;

height=14;

key="img_cr";

color=-2;

}

:column{

:boxed_column{

label="插入点p0坐标";

:button{

label="光标选取(&P)<";

key="pick";

mnemonic="P";

}

:row{

width=10;

:edit_box{

label="x0(&X)=:";

key="px";

mnemonic="x";

value="0";

edit_width=6;

}

:edit_box{

label=" y0(&Y)=:";

key="py";

mnemonic="y";

value="0";

edit_width=6;

}

}

}

:boxed_column{

label="数据项:";

:edit_box{

label="旋转角度&A(℃):";

key="ang";

mnemonic="A";

value="0";

edit_width=10;

}

:edit_box{

label="公称通经&DN(mm):";

key="DN";

mnemonic="d";

value="300";

edit_width=10;

}

}

}

}

ok_cancel;

}

5.2 突面板式管法兰的驱动程序

;;;读取文件数据函数

(defun read-list(f / L len k s_str p one)

(setq str (read-line f))

(if str

(progn

(setq str (strcat str "\n"))

(setq len (strlen str))

(setq L '() k 1 s_str "" p nil)

(while (<= k len)

(setq one (substr str k 1))

(if (or (= one ":") (= one ",") (= one " ")

(= one (chr 9)) (= one "\n"))

(if p

(progn

(if (= (type (read s_str)) 'SYM)

(setq L (cons s_str L))

(setq L (cons (read s_str) L))

) ;if end

(setq s_str "" p nil)

) ;progn end

) ;if end

(setq s_str (strcat s_str one) p T)

) ;if end

(setq k (1+ k))

) ;while end

(reverse L)

) ;progn end

) ;if end

) ;function end

;;;突面板式管法兰绘制的子函数

(defun draw(/ f n D K L D1 f C B)

(setq f (open "C:/Documents and Settings/Administrator/桌面/新建文件夹/My lisp/突面板式管法兰/tmbsgfl.txt" "r"))

(setq n 1)

(while (= n 1)

(setq Lst (read-list f))

(if (equal (car Lst) dn 0.1)

(setq n 0))

(if (= Lst nil)

(progn

(alert "程序运行出错!\n输入参数错误!")

(quit))

)

) ;while end ;使获得所需表

(close f)

(setq D (nth 1 Lst))

(setq K (nth 2 Lst))

(setq L (nth 3 Lst))

(setq D1 (nth 4 Lst))

(setq f (nth 5 Lst))

(setq C (nth 6 Lst))

(setq B (nth 7 Lst))

(setq p (/ (* p pi) 180))

(setq p1 (polar p0 p (/ B 2)))

(setq p2 (polar p0 p (/ K 2)))

(setq p3 (polar p0 p (/ D 2)))

(setq p4 (polar p2 p (/ L 2)))

(setq p5 (polar p2 (+ p pi) (/ L 2)))

(setq p6 (polar p3 (+ p (* PI 1.5)) (- C f)))

(setq p7 (polar p1 (+ p (* PI 1.5)) C))

(setq p8 (polar p5 (+ p (* PI 1.5)) (- C f)))

(setq p9 (polar p4 (+ p (* PI 1.5)) (- C f)))

(setq p10 (polar p6 (+ p pi) (/ (- D D1) 2)))

(setq p11 (polar p10 (+ p (* PI 1.5)) f))

(setq p12 (polar p0 (+ p (* PI 1.5)) C))

(command "line" p0 p1 "")

(setq e1 (entlast))

(command "line" p5 p1 "")

(setq e2 (entlast))

(command "line" p5 p4 "")

(setq e23 (entlast))

(command "line" p4 p3 "")

(setq e3 (entlast))

(command "line" p3 p6 "")

(setq e4 (entlast))

(command "line" p6 p9 "")

(setq e5 (entlast))

(command "line" p9 p8 "")

(setq e24 (entlast))

(command "line" p8 p10 "")

(setq e6 (entlast))

(command "line" p10 p11 "")

(setq e7 (entlast))

(command "line" p11 p7 "")

(setq e8 (entlast))

(command "line" p1 p7 "")

(setq e9 (entlast))

(command "line" p5 p8 "")

(setq e10 (entlast))

(command "line" p4 p9 "")

(setq e11 (entlast))

(command "line" p12 p7 "")

(setq e12 (entlast))

(command "mirror" e5 "" p0 p12 "")

(setq e13 (entlast))

(command "mirror" e2 "" p0 p12 "")

(setq e14 (entlast))

(command "mirror" e3 "" p0 p12 "")

(setq e15 (entlast))

(command "mirror" e4 "" p0 p12 "")

(setq e16 (entlast))

(command "mirror" e6 "" p0 p12 "")

(setq e17 (entlast))

(command "mirror" e7 "" p0 p12 "")

(setq e18 (entlast))

(command "mirror" e8 "" p0 p12 "")

(setq e19 (entlast))

(command "mirror" e9 "" p0 p12 "")

(setq e20 (entlast))

(command "mirror" e10 "" p0 p12 "")

(setq e21 (entlast))

(command "mirror" e11 "" p0 p12 "")

(setq e22 (entlast))

(command "hatch" "p" "ansi31" 1 0 "s" e5 e2 e3 e4 e6 e7 e8 e9 e10 e11 e13 e14 e15 e16 e17 e18 e19 e20 e21 e22 "" "")

(command "mirror" e1 e12 e23 e24 "" p0 p12 "")

(setq pa1 (polar p0 (+ (/ pi 2) p) 20))

(setq pa2 (polar p12 (+ (* pi 1.5) p) 20))

(command "line" pa1 pa2 "")

(setq m1 (entlast))

(command "change" m1 "" "p" "lt" "center" "s" 5 "" )

(prin1)

)

;;;;获取对话框中编辑框值的子函数

(defun getmain()

(setq x0 (atof (get_tile "px")))

(setq y0 (atof (get_tile "py")))

(setq p0 (list x0 y0))

(setq p (atof (get_tile "ang"))) ;获得旋转角度

(setq dn (atof (get_tile "DN"))) ;获得内径值

)

;对话框的驱动程序

(defun dial()

(if (not (new_dialog "tmbsgfl" dcl_id)) (exit))

(start_image "img_cr")

(slide_image 0 0 (dimx_tile "img_cr") (dimy_tile "img_cr") "C:/Documents and Settings/Administrator/桌面/新建文件夹/My lisp/突面板式管法兰/tmbsgfl.sld")

(end_image)

(set_tile "px" (rtos x0 2 2))

(set_tile "py" (rtos y0 2 2))

(set_tile "ang" (rtos p 2 2))

(set_tile "DN" (rtos dn 2 2))

(action_tile "pick" "(getmain) (done_dialog 2)")

(action_tile "accept" "(getmain) (done_dialog 1)")

(action_tile "cancel" "(done_dialog -1)")

(setq dia (start_dialog))

)

;;突面板式管法兰主函数

(defun c:tmbsgfl()

(setq oldcmd (getvar "cmdecho"))

(setvar "cmdecho" 0)

(setq oldosmode (getvar "osmode")) ;保存当前对象捕捉系统变量

(setvar "osmode" 0) ;将对象捕捉关闭

(setq dia 3)

(setq dcl_id (load_dialog "C:/Documents and Settings/Administrator/桌面/新建文件夹/My lisp/突面板式管法兰/tmbsgfl.dcl"))

(if (< dcl_id 0) (exit))

(setq p 0 dn 300 x0 0 y0 0)

(setq p0 (list x0 y0))

(while (> dia 1)

(dial)

(if (= dia 2)

(progn

(initget 1)

(setq p0 (getpoint "\n请选取插入点:"))

(setq x0 (car p0) y0 (cadr p0))

(set_tile "px" (rtos x0 2 2))

(set_tile "py" (rtos y0 2 2))

)

)

)

(unload_dialog dcl_id)

(if (= sdt -1) (exit))

(if (= dia 1)

(draw)

)

(setvar "osmode" oldosmode) ;将对象捕捉恢复为原始的值

(setvar "cmdecho" oldcmd)

(princ)

)

6 接管

6.1 接管的DCL对话框程序

//接管对话框的主程序

jg:dialog{

label= "绘制接管";

:row{

:image{

width=45;

height=14;

key="img_cr";

color=-2;

}

:column{

:boxed_column{

label="插入点p0坐标";

:button{

label="光标选取(&P)<";

key="pick";

mnemonic="P";

}

:row{

width=10;

:edit_box{

label="x0(&X)=:";

key="px";

mnemonic="x";

value="0";

edit_width=6;

}

:edit_box{

label=" y0(&Y)=:";

key="py";

mnemonic="y";

value="0";

edit_width=6;

}

}

}

:boxed_column{

label="数据项:";

:edit_box{

label="旋转角度&A(℃):";

key="ang";

mnemonic="A";

value="0";

edit_width=10;

}

:edit_box{

label="公称通经&DN(mm):";

key="DN";

mnemonic="d";

value="300";

edit_width=10;

}

}

}

}

ok_cancel;

}

6.2 接管的驱动程序

;;;读取文件数据函数

(defun read-list(f / L len k s_str p one)

(setq str (read-line f))

(if str

(progn

(setq str (strcat str "\n"))

(setq len (strlen str))

(setq L '() k 1 s_str "" p nil)

(while (<= k len)

(setq one (substr str k 1))

(if (or (= one ":") (= one ",") (= one " ")

(= one (chr 9)) (= one "\n"))

(if p

(progn

(if (= (type (read s_str)) 'SYM)

(setq L (cons s_str L))

(setq L (cons (read s_str) L))

) ;if end

(setq s_str "" p nil)

) ;progn end

) ;if end

(setq s_str (strcat s_str one) p T)

) ;if end

(setq k (1+ k))

) ;while end

(reverse L)

) ;progn end

) ;if end

) ;function end

;;;接管绘制的子函数

(defun draw(/ f n D K L f C B A)

(setq f (open "C:/Documents and Settings/Administrator/桌面/新建文件夹/My lisp/接管/jg.txt" "r"))

(setq n 1)

(while (= n 1)

(setq Lst (read-list f))

(if (equal (car Lst) dn 0.1)

(setq n 0))

(if (= Lst nil)

(progn

(alert "程序运行出错!\n输入参数错误!")

(quit))

)

) ;while end ;使获得所需表

(close f)

(setq D (nth 1 Lst))

(setq K (nth 2 Lst))

(setq L (nth 3 Lst))

(setq f (nth 4 Lst))

(setq C (nth 5 Lst))

(setq B (nth 6 Lst))

(setq A (nth 7 Lst))

(setq p (/ (* p pi) 180))

(setq p1 (polar p0 p (/ B 2)))

(setq p2 (polar p1 p f))

(setq p3 (polar p1 (+ (/ pi 2) p) A))

(setq p4 (polar p2 (+ (/ pi 2) p) A))

(setq p5 (polar p2 (+ (/ pi 2) p) (- A C)))

(setq p6 (polar p5 p (- (/ K 2) (/ B 2) f (/ L 2))))

(setq p7 (polar p6 p L))

(setq p8 (polar p5 p (- (/ D 2) (/ B 2) f)))

(setq p9 (polar p8 (+ p (/ PI 2)) C))

(setq p10 (polar p7 (+ p (/ pi 2)) C))

(setq p11 (polar p6 (+ p (/ PI 2)) C))

(setq p12 (polar p0 (+ p (/ PI 2)) A))

(command "line" p0 p1 "")

(setq e1 (entlast))

(command "line" p2 p1 "")

(setq e2 (entlast))

(command "line" p1 p3 "")

(setq e3 (entlast))

(command "line" p2 p5 "")

(setq e4 (entlast))

(command "line" p4 p5 "")

(setq e5 (entlast))

(command "line" p3 p4 "")

(setq e6 (entlast))

(command "line" p12 p3 "")

(setq e7 (entlast))

(command "line" p4 p11 "")

(setq e8 (entlast))

(command "line" p5 p6 "")

(setq e9 (entlast))

(command "line" p6 p11 "")

(setq e10 (entlast))

(command "line" p10 p9 "")

(setq e11 (entlast))

(command "line" p10 p7 "")

(setq e12 (entlast))

(command "line" p7 p8 "")

(setq e13 (entlast))

(command "line" p8 p9 "")

(setq e14 (entlast))

(command "line" p11 p10 "")

(setq e15 (entlast))

(command "line" p6 p7 "")

(setq e16 (entlast))

(command "mirror" e1 "" p0 p12 "")

(command "mirror" e2 "" p0 p12 "")

(setq e17 (entlast))

(command "mirror" e3 "" p0 p12 "")

(setq e18 (entlast))

(command "mirror" e4 "" p0 p12 "")

(setq e19 (entlast))

(command "mirror" e5 "" p0 p12 "")

(setq e20 (entlast))

(command "mirror" e6 "" p0 p12 "")

(setq e21 (entlast))

(command "mirror" e7 "" p0 p12 "")

(command "mirror" e8 "" p0 p12 "")

(setq e22 (entlast))

(command "mirror" e9 "" p0 p12 "")

(setq e23 (entlast))

(command "mirror" e10 "" p0 p12 "")

(setq e24 (entlast))

(command "mirror" e11 "" p0 p12 "")

(setq e25 (entlast))

(command "mirror" e12 "" p0 p12 "")

(setq e26 (entlast))

(command "mirror" e13 "" p0 p12 "")

(setq e27 (entlast))

(command "mirror" e14 "" p0 p12 "")

(setq e28 (entlast))

(command "mirror" e15 "" p0 p12 "")

(command "mirror" e16 "" p0 p12 "")

(command "hatch" "p" "ansi31" 1 0 "s" e5 e8 e9 e10 e11 e12 e13 e14 e20 e22 e23 e24 e25 e26 e27 e28 "" "")

(command "hatch" "p" "ansi31" 1 90 "s" e2 e3 e4 e5 e6 e20 e21 e17 e18 e19 "" "")

(setq pa1 (polar p12 (+ (/ pi 2) p) 20))

(setq pa2 (polar p0 (+ (* pi 1.5) p) 20))

(command "line" pa1 pa2 "")

(setq m1 (entlast))

(command "change" m1 "" "p" "lt" "center" "s" 100 "" )

(prin1)

)

;;;;获取对话框中编辑框值的子函数

(defun getmain()

(setq x0 (atof (get_tile "px")))

(setq y0 (atof (get_tile "py")))

(setq p0 (list x0 y0))

(setq p (atof (get_tile "ang"))) ;获得旋转角度

(setq dn (atof (get_tile "DN"))) ;获得内径值

)

;对话框的驱动程序

(defun dial()

(if (not (new_dialog "jg" dcl_id)) (exit))

(start_image "img_cr")

(slide_image 0 0 (dimx_tile "img_cr") (dimy_tile "img_cr") "C:/Documents and Settings/Administrator/桌面/新建文件夹/My lisp/接管/jg.sld")

(end_image)

(set_tile "px" (rtos x0 2 2))

(set_tile "py" (rtos y0 2 2))

(set_tile "ang" (rtos p 2 2))

(set_tile "DN" (rtos dn 2 2))

(action_tile "pick" "(getmain) (done_dialog 2)")

(action_tile "accept" "(getmain) (done_dialog 1)")

(action_tile "cancel" "(done_dialog -1)")

(setq dia (start_dialog))

)

;;接管主函数

(defun c:jg()

(setq oldcmd (getvar "cmdecho"))

(setvar "cmdecho" 0)

(setq oldosmode (getvar "osmode")) ;保存当前对象捕捉系统变量

(setvar "osmode" 0) ;将对象捕捉关闭

(setq dia 3)

(setq dcl_id (load_dialog "C:/Documents and Settings/Administrator/桌面/新建文件夹/My lisp/接管/jg.dcl"))

(if (< dcl_id 0) (exit))

(setq p 0 dn 300 x0 0 y0 0)

(setq p0 (list x0 y0))

(while (> dia 1)

(dial)

(if (= dia 2)

(progn

(initget 1)

(setq p0 (getpoint "\n请选取插入点:"))

(setq x0 (car p0) y0 (cadr p0))

(set_tile "px" (rtos x0 2 2))

(set_tile "py" (rtos y0 2 2))

)

)

)

(unload_dialog dcl_id)

(if (= sdt -1) (exit))

(if (= dia 1)

(draw)

)

(setvar "osmode" oldosmode) ;将对象捕捉恢复为原始的值

(setvar "cmdecho" oldcmd)

(princ)

)

7 椭圆封头

7.1 椭圆封头的DCL对话框程序

tyft:dialog{

la