《AutoCAD二次开发技术》实验指导书
- 格式:doc
- 大小:86.50 KB
- 文档页数:12
收稿日期:1997-08-29第一作者 男 1968年9月生 硕士学位 助教AutoCAD 的二次开发技术翟 震(郑州工业大学橡塑模具研究所) 张 涛(河南省电子工业学校,郑州,450002)摘 要 介绍了对AutoCAD R12.0绘图软件进行二次开发的一些方法。
包括如何实现参数化绘图、数据检索,以及对图形数据库的操作,对于工程CA D 系统的实现有一定的帮助。
关键词 A utoCA D ;AutoLI SP中图分类号 T P311.50 引言AutoCAD 是美国Auto desk 公司开发的通用型绘图软件,具有强大的图形编辑和处理功能、开放性结构以及良好的性能价格比,其版本从早期的1.0版到目前的R14版,在国内外都已得到广泛的应用。
AutoLISP 语言是一种嵌在AutoCAD 内部的LISP 编程语言,既具有一般高级语言的基本结构和功能,又具备AutoCAD 所特有的图形处理功能。
利用Au -toLISP 可以直接增加,修改和调用AutoCAD 命令,并能结合各类标准建立大量的参数图形库,还能够对当前图形数据库直接访问和修改等。
1 设计实例尽管AutoCAD 的功能十分强大,但是并不是完全符合我国各领域的实际情况,比如图幅设置、尺寸公差标注、图形编辑等,这就需要运用其内部编程语言AutoLISP 进行二次开发。
下面以通用绘图系统为例列举了一些典型的AutoLISP 程序,在AutoCAD R12.0环境下运行,用户可以此为参考开发出适合自己情况的CAD 软件。
1.1 AutoCAD 命令的扩充众所周知,AutoCAD 本身提供的各种命令都是最基本的,对一些复杂的具有特殊要求的操作,如果用手工操作将十分麻烦,类似于图幅设置、局部放大、无边界延伸等等,都需要编制新的函数,作为AutoCAD 命令调用。
下面列举了一个在工程制图时经常要进行的局部放大函数,其设计思想是:以圆心的外切正方形为目标区域, c 方式选择目标,拷贝后选择第19卷 第1期1998年 3月 郑州工业大学学报 Journal of Zhengzhou University of Technology Vol 19 No 1Mar 1998该圆为剪切边界,以1.2倍半径进行剪切目标360环形搜索,再按比例放大,该程序如下:(defun fd()(initget 7) ;禁止输入零值、负值及空输入(setp pl (getpoint 输入放大区域圆心坐标: ))(command circle pl);画圆心(setq prl (getpoint 输入半径位置: ))(setq k 2r (distance pl prl);计算半径 p2 (getpoint 输入放大图形位置 ))(setq p3 (list (- (car pl) r)(- (cadr pl) r));选中图形左下角p4 (list (+ (car pl) r)(+ (cadr pl) r));选中图形右下角p5 (list (- (car p2) r)(- (cadr p2) r));放大图形左下角p6 (list (+ (car p2) r)(+ (cadr p2) r));选中图形右下角r1 (* 1.35 r);剪切搜索半径 k 2);放大比例为2(command r)(command erase l ;删除该圆copy c p3 p4 p1 p2;将选中目标拷贝至p2点circle p2r);画圆(setq ss (ssget l ))(command trim ss )(setq n 360n11dt (/ 3.14159 0.5 n);设置搜索次数(repeat n(setq pp (polar p2 (*n1dt) r1))(command pp);剪切目标(setq n1(+1 n1)))(command scale c p5 p6 p2 k redraw );放大操作)1.2参数化绘图图1 键槽的轴剖面图根据调查,在我国使用AutoCAD 的用户中,绝大多数都仅仅采用交互式绘图方式,这样,AutoCAD 系统只是将设计师的工作环境从图板上移到计算机上,并没有真正减少设计工作中的重复劳动。
实验指导书《工程制图及CAD》专业班级姓名学号宿州学院机械与电子工程学院二零一六年概述本课程的实践性教学环节主要是要求学生掌握AutoCAD2004的基本操作、绘图命令、平面图形的修改与编辑命令、尺寸标注和工程图样的绘制方法,强化学生的图形设计能力和AutoCAD应用能力。
实践教学共包括六项内容,即AutoCAD2004的基本操作、绘图命令、平面图形的修改与编辑命令、尺寸标注、块和工程图样绘制,其中工程图样绘制为综合型实验。
针对不同学时可选择相应实验,对于少学时在实验六中可不作装配图。
实验指导书附实验考核内容及成绩评定,可供实践环节考核之用。
实验所需AutoCAD2004软件在实验时提供。
学生除完成所要求题目之外,还应对所实验之结果进行分析与总结。
本实验指导书内容包括:实验目的与要求、方法与步骤、实验过程及内容等。
学生做完相关实验后应及时填写实验报告。
大家可以参考《精通AutoCAD 2004中文版》(徐建平黄亮乔小军编著,清华大学出版社,2005)配套使用。
或者从图书馆借阅AutoCAD 2004之后的任意AutoCAD教程均可。
另外,由于实验时间有限,学生对课程的掌握不同,除安排上机实验之外应另外自行安排时间学习、解决相关知识及问题。
目录实验一AutoCAD的基本操作 (1)实验二绘图命令 (3)实验三平面图形的修改与编辑 (5)实验四尺寸标注 (8)实验五图块 (9)实验六工程图样绘制 (10)实验考核 (16)实验一AutoCAD的基本操作一、实验目的1、了解AutoCAD基本概念2、学习AutoCAD2004的基本操作二、实验内容(一)图框设置与绘制I、实验要求:按要求设图限,建图层,画图框和标题栏,如图1-1所示。
(1)建图层、设线型、线宽及颜色。
(2)画图框、标题栏(120×21mm)。
(3)完成后,给图形文件起一个名并存盘。
注:对A3图幅,采用不留装订边格式时,其边框与图框线的距离为10 mm。
Autocad的二次开发第一部分:实验分析与设计一、实验内容描述1、通过示例程序了解Autocad的二次开发的基本概念,以及基本实现方法。
2、通过vb程序示例初步了解Autocad对象模型,以及面向对象开发的基本概念。
3、通过lisp程序示例的调试运行,初步掌握lisp语言的格式以及Autocad的lisp 编程方法。
二、实验基本原理与设计基本原理:Autocad作为CAD支撑软件,提供了一个通用的设计和绘图平台,已经被广泛使用。
该软件提供了较好的二次开发支持。
其中主要方法,一种是Autocad自身内嵌的lisp开发工具;另外一种主要的开发方法是通过Autocad提供的对象模型,使用其它的软件进行二次开发,如支持VB、VC等高级编程语言。
在Autocad中内嵌的Lisp开发程序随着Autocad的不断升级换代已经发展到Visual Lisp,提供了可视化的编程环境,可及时调试,使用方便,并可直接调用Autocad命令,方便易用,是进行简单开发的最便利的工具。
面向对象的开发使得二次开发不仅局限于Autocad本身的功能,使用户能更好地实现专用化的开发。
本次实验进行基于lisp的开发演示和基于VB的开发演示。
注:1)vb开发autocad需要连接autocad(不同的autocad版本调用方式有所区别,本实例针对autocad2000版),vba开发则可直接调用thisdrawing对象。
2)步骤:连接autocad,定义autocad类型变量并实例化,通过对autocad对象的属性和方法的调用,实现绘图等操作。
3)可适当设计界面实现参数化特征化绘图。
4)本实验可以自行查找实例并运行体验。
Vb(vba)开发autocad:根据autocad对象模型,可建立如下vb程序,第一个函数Sub ConnectToAcad()可实现autocad的启动,第二个函数可实现启动并在autocad中画线。
以vb6.0为例:、启动vb,新建工程,1)在form1上添加按钮,如图红箭头处,按钮标题可以修改显示文字,如图2;2)分别双击“启动”和“画线”按钮,分别加入代码ConnectToAcad,如图3;和AddLineVB,如图3;3)加入对autocad的引用,如图4;(autocad版本不同引用方式可能有所不同)4)运行程序。
实验三 AutoCAD图形块的创建与应用1,创建块定义及插入块参照创建一个名为“三角点”的块记录,包括以下实体:一个点一个圆一个三角形public Document pDoc =Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument; [CommandMethod("CreateBlock")]public void CreateBlock(){// 获得当前数据库 Get the current databaseDatabase acCurDb = pDoc.Database;// 启动一个事务using(Transaction acTrans= acCurDb.TransactionManager.StartTransaction()) {// 以写方式打开块表BlockTable acBlkTbl = acTrans.GetObject(acCurDb.BlockTableId,OpenMode.ForWrite) as BlockTable;// 创建新的块表记录BlockTableRecord acBlkTblRec = new BlockTableRecord();string blkname = "三角点"; = blkname;acBlkTblRec.Origin = new Point3d(0, 0, 0);Point3d pCenter = new Point3d(0, 0, 0);//创建中心点DBPoint pDBPt = new DBPoint(pCenter);//创建圆Circle pCir = new Circle(pCenter, new Vector3d(0, 0, 1), 0.25);//创建三角形利用polyline多段线形成三角形,首尾点必须重合//AddVertexAt(点的序号,平面点,凸度,起始宽度,结束宽度)Polyline pTri = new Polyline(4);pTri.AddVertexAt(0, new Point2d(0, 1), 0, 0, 0);pTri.AddVertexAt(1, new Point2d(0.866, -0.5), 0, 0, 0);pTri.AddVertexAt(2, new Point2d(-0.866, -0.5), 0, 0, 0);pTri.AddVertexAt(3, new Point2d(0, 1), 0, 0, 0);//给定块的原点acBlkTblRec.Origin = new Point3d(0, 0, 0);//将图形实体添加到块表记录acBlkTblRec.AppendEntity(pDBPt);acBlkTblRec.AppendEntity(pCir);acBlkTblRec.AppendEntity(pTri);//将块记录添加到块表acBlkTbl.Add(acBlkTblRec);acTrans.AddNewlyCreatedDBObject(acBlkTblRec, true);// 提交修改并销毁事务mit();}}插入块参照代码如下//插入块参照[CommandMethod("InsertBlock")]public void InsertBlock(){//获取当前数据库Database acCurDb = pDoc.Database;//启动一个事务using (Transaction acTrans =acCurDb.TransactionManager.StartOpenCloseTransaction()){//以读写方式打开块表BlockTable acBlkTbl = acTrans.GetObject(acCurDb.BlockTableId, OpenMode.ForRead) as BlockTable;//以只写方式打开模型空间块表记录BlockTableRecord acBlockRec =acTrans.GetObject(acBlkTbl[BlockTableRecord.ModelSpace], OpenMode.ForWrite) as BlockTableRecord;//获取三角点块,并创建块应用BlockTableRecord pBlockTbRec = acTrans.GetObject(acBlkTbl["三角点"], OpenMode.ForRead) as BlockTableRecord;BlockReference bref = new BlockReference(new Point3d(10, 10, 0), pBlockTbRec.ObjectId);acBlockRec.AppendEntity(bref);acTrans.AddNewlyCreatedDBObject(bref, true);mit();}}2,创建带有属性的块定义及插入带有属性的块参照代码如下://创建带属性的参照块[CommandMethod("CreatPropertyBlock")]public void CreatPropertyBlock(){//获得当前数据库Database acCurDb = pDoc.Database;//启动一个事物using (Transaction acTrans =acCurDb.TransactionManager.StartOpenCloseTransaction()){//以只写方式打开块表BlockTable acBlkTbl =acTrans.GetObject(acCurDb.BlockTableId,OpenMode.ForWrite) as BlockTable;//创建新的块表记录BlockTableRecord acBlkTblRec = new BlockTableRecord();string blkname = "三角点"; = blkname;acBlkTblRec.Origin = new Point3d(0,0,0);Point3d pCenter = new Point3d(0,0,0);//创建中心点DBPoint pDbPoint = new DBPoint(pCenter);//创建圆指定圆心,单位向量¢,半径Circle pCir = new Circle(pCenter,new Vector3d(0,0,1),0.25);//创建三角形Polyline pTri = new Polyline(4);pTri.AddVertexAt(0, new Point2d(0, 1), 0, 0, 0);pTri.AddVertexAt(1, new Point2d(0.866, -0.5), 0, 0, 0);pTri.AddVertexAt(2, new Point2d(-0.866, -0.5), 0, 0, 0);pTri.AddVertexAt(3, new Point2d(0, 1), 0, 0, 0);//定义属性Point3d pPosition = new Point3d(1,1,0);AttributeDefinition pAtrDef = new AttributeDefinition(pPosition,"坡头","三角点名","输入三角点名",acCurDb.Textstyle);pAtrDef.Height = 1;//给定块的原点acBlkTblRec.Origin = new Point3d(0,0,0);//将图形实体添加到块表记录中acBlkTblRec.AppendEntity(pDbPoint);acBlkTblRec.AppendEntity(pCir);acBlkTblRec.AppendEntity(pTri);//将块表记录添加到块acBlkTbl.Add(acBlkTblRec);acTrans.AddNewlyCreatedDBObject(acBlkTblRec, true);//提交修改并销毁事物mit();。
学生实验报告书
实验课程名称CAD/CAM基础
开课学院
指导教师姓名
学生姓名
学生专业班级
-- 学年第学期
实验教学管理基本规范
实验是培养学生动手能力、分析解决问题能力的重要环节;实验报告是反映实验教学水平与质量的重要依据。
为加强实验过程管理,改革实验成绩考核方法,改善实验教学效果,提高学生质量,特制定实验教学管理基本规范。
1、本规范适用于理工科类专业实验课程,文、经、管、计算机类实验课程可根据具体情况参
照执行或暂不执行。
2、每门实验课程一般会包括许多实验项目,除非常简单的验证演示性实验项目可以不写实验
报告外,其他实验项目均应按本格式完成实验报告。
3、实验报告应由实验预习、实验过程、结果分析三大部分组成。
每部分均在实验成绩中占一
定比例。
各部分成绩的观测点、考核目标、所占比例可参考附表执行。
各专业也可以根据具体情况,调整考核内容和评分标准。
4、学生必须在完成实验预习内容的前提下进行实验。
教师要在实验过程中抽查学生预习情况,
在学生离开实验室前,检查学生实验操作和记录情况,并在实验报告第二部分教师签字栏签名,以确保实验记录的真实性。
5、教师应及时评阅学生的实验报告并给出各实验项目成绩,完整保存实验报告。
在完成所有
实验项目后,教师应按学生姓名将批改好的各实验项目实验报告装订成册,构成该实验课程总报告,按班级交课程承担单位(实验中心或实验室)保管存档。
6、实验课程成绩按其类型采取百分制或优、良、中、及格和不及格五级评定。
实验课程名称:___CAD/CAM基础____________。
实验一 ObjectARX .NET托管开发包的使用一、主要内容1、下载安装ObjectARX .NET托管开发包2、创建AutoCAD命令3、创建自定义用户菜单4、创建自定义用户工具条5、创建用户自定义窗体二、学时安排三、预习内容及要求回顾ObjectARX API和其托管API之间的对应关系;掌握不同API版本对应的开发版本;熟悉创建用户需求所要引用命名空间。
开发语言使用C#,AutoCAD版本2010,objectARX2010。
四、下载安装ObjectARX4.1下载ObjectARX不同的ACAD版本用不同的开发包及开发环境ACAD2000~ACAD2002 : VC++ 6.0ACAD2004~ACAD2006 : 2002ACAD2007~ACAD2009 : 2005ACAD2010~ACAD2011 : 2008ACAD2012~ : 2010下载ObjectARX在打开打开默认网页浏览器并浏览网站.的网页上,点击License & Download(许可&下载).填写必填字段并选择ObjectARX for AutoCAD 2010. 点击Submit(提交)按扭.在下载页, 点击Download Now(现在下载)使用下载管理器或点击Standard Download Method(标准下载方法)使用你的网页浏览器的默认下载方法下载.点击Save(保存)或用于保存文件到你的本地驱动器的选项。
指定下载ObjectARX SDK安装包文件存放的位置。
一旦安装包文件下载完成,就浏览你保存在本地的安装并双击它,安装向导将显示在ObjectARX <释放>对话框中, 指定一个新的安装位置或接受默认的安装位置。
点击Install(安装)按扭. 如果没有遇到问题,安装向导完成后关闭它安装ObjectARX向导和托管项目模板一旦ObjectARX SDK被安装,请使用默认目录c:\ObjectARX <Release>浏览它的安装文件夹。
实验四用户交互、选择集及扩展属性1,用户交互1.1读入字符串代码如下///<summary>/// getstring()方法提示用户在command提示光标处输入一个字符串/// PromptStringOptions对象用来控制用户的输入及提示信息的显示方式/// PromptStringOptions的AllowSpaces 属性来控制是否可以输入空格,如为false,则输入空格就停止///</summary>[CommandMethod("GetStringFromUser")]public void GetStringFromUser(){Document acDoc = Application.DocumentManager.MdiActiveDocument;PromptStringOptions pStrOpts = new PromptStringOptions("\n输入块名: ");pStrOpts.AllowSpaces = true;PromptResult pProRes = acDoc.Editor.GetString(pStrOpts);//string pBlackName = pProRes.StringResult.Trim();Application.ShowAlertDialog("输入的块名是: " + pProRes.StringResult);}, 1.2读入Double型数据//读入double型数据[CommandMethod("GetDouble")]private void GetDouble(){Document acDoc = Application.DocumentManager.MdiActiveDocument;PromptDoubleOptions pRadiusOpts = new PromptDoubleOptions("\n输入圆半径);PromptDoubleResult pRadiusRes = acDoc.Editor.GetDouble(pRadiusOpts);double pRadius = pRadiusRes.Value;}1.3 读入Point//读入点[CommandMethod("GetPoint")]private void GetPoint(){Document acDoc = Application.DocumentManager.MdiActiveDocument;PromptPointOptions pFirstPointOption = new PromptPointOptions("\n输º?入¨?起e点Ì?:êo");PromptPointResult pFirstPointResult =acDoc.Editor.GetPoint(pFirstPointOption);if (pFirstPointResult.Status == PromptStatus.OK){Point3d pFirstPt = pFirstPointResult.Value;}else{return;}}1.4 打开dwg文件//打开并插入dwg文件[CommandMethod("insertdwg")]static public void insertdwg(){OpenFileDialog pOpenFileDialog = new OpenFileDialog("打开地形图", null, "dwg", "openfile", OpenFileDialog.OpenFileDialogFlags.DefaultIsFolder);pOpenFileDialog.ShowDialog();string fname = pOpenFileDialog.Filename;Document doc = Application.DocumentManager.MdiActiveDocument;Editor ed = doc.Editor;if (!File.Exists(fname))fname = HostApplicationServices.Current.FindFile(fname, doc.Database, FindFileHint.Default);using (Database db = new Database(false, false)){db.ReadDwgFile(fname, FileShare.ReadWrite, true, null);using (Transaction t = doc.TransactionManager.StartTransaction()){int n = stIndexOf("\\");ObjectId idBTR = doc.Database.Insert(fname.Substring(n + 1, fname.Length -n - 5), db, false);BlockTable bt = (BlockTable)t.GetObject(doc.Database.BlockTableId, OpenMode.ForWrite);BlockTableRecord btr =(BlockTableRecord)t.GetObject(bt[BlockTableRecord.ModelSpace], OpenMode.ForWrite);using (BlockReference bref = new BlockReference(Point3d.Origin, idBTR)) {DBObjectCollection pbrefColl = new DBObjectCollection();bref.Explode(pbrefColl);int num = pbrefColl.Count;for (int i = 0; i < num; i++){btr.AppendEntity(pbrefColl[i] as Entity);t.AddNewlyCreatedDBObject(pbrefColl[i], true);}}mit();}}}2,选择集2.1获得PickFirst选择集代码如下://选择集[CommandMethod("PickFirst", ePickSet)]public void CheckForPickfirstSelection(){ // 获得当前文档Editor acDocEd = Application.DocumentManager.MdiActiveDocument.Editor;// 获得 PickFirst 选择集PromptSelectionResult acSSPrompt;acSSPrompt = acDocEd.SelectImplied();SelectionSet acSSet;// 如果提示状态是 OK,那么对象在命令启动前已经被选择了if (acSSPrompt.Status == PromptStatus.OK){acSSet = acSSPrompt.Value;Application.ShowAlertDialog("您选择到的对象个数为: " + acSSet.Count.ToString()); }else{ Application.ShowAlertDialog("您选择到的对象个数为: 0");}// 清除 PickFirst 选择集ObjectId[] idarrayEmpty = new ObjectId[0];acDocEd.SetImpliedSelection(idarrayEmpty);// 要求在图形区域中选择对象acSSPrompt = acDocEd.GetSelection();// 如果提示状态是 OK,对象就被选择了if (acSSPrompt.Status == PromptStatus.OK){acSSet = acSSPrompt.Value;Application.ShowAlertDialog("您移除的对象个数为:"+acSSet.Count.ToString()); }else{Application.ShowAlertDialog("您移除的对象个数为:0");}}2.2在图形区域中选择对象代码://在图形区域中选择对象[CommandMethod("SelectObjectsOnscreen")]public void SelectObjectsOnscreen(){// 获得当前文档和数据库Document acDoc = Application.DocumentManager.MdiActiveDocument;Database acCurDb = acDoc.Database;// 要求在图形区域中选择对象PromptSelectionResult acSSPrompt = acDoc.Editor.GetSelection();SelectionSet acSSet = null;// 如果提示状态是 OK,对象就被选择了if (acSSPrompt.Status == PromptStatus.OK){ acSSet = acSSPrompt.Value; }// 启动一个事务using (Transaction acTrans = acCurDb.TransactionManager.StartTransaction()) {// 遍历选择集中的对象foreach (SelectedObject acSSObj in acSSet){// 检查以确定返回的 SelectedObject 对象是有效的if (acSSObj != null){// 以写的方式打开选择的对象Entity acEnt = acTrans.GetObject(acSSObj.ObjectId,OpenMode.ForWrite) as Entity;if (acEnt != null){// 修改对象的颜色为绿色acEnt.ColorIndex = 3;}}}// 保存新对象到数据库中mit();}}2.3添加或合并多个选择集→#region合并选择集[CommandMethod("MergeSelectionSets")]public static void MergeSelectionSets(){// 获得当前文档的编辑器Editor acDocEd = Application.DocumentManager.MdiActiveDocument.Editor;PromptSelectionResult acSSPrompt;acSSPrompt = acDocEd.GetSelection();SelectionSet acSSet1;ObjectIdCollection acObjIdColl = new ObjectIdCollection();// 如果提示状态是 OK,对象就被选择了if (acSSPrompt.Status == PromptStatus.OK){acSSet1 = acSSPrompt.Value;// 添加选择的对象到 ObjectIDCollection 中acObjIdColl = new ObjectIdCollection(acSSet1.GetObjectIds());}// 要求在图形区域中选择对象acSSPrompt = acDocEd.GetSelection();SelectionSet acSSet2;// 如果提示状态是 OK,对象就被选择了if (acSSPrompt.Status == PromptStatus.OK){acSSet2 = acSSPrompt.Value;// 检查 ObjectIDCollection 的大小,如果为 0 就重新初始化它if (acObjIdColl.Count == 0){acObjIdColl = new ObjectIdCollection(acSSet2.GetObjectIds()); }else{// 遍历第二个选择集foreach (ObjectId acObjId in acSSet2.GetObjectIds()){// 添加每个对象 ID 到 ObjectIDCollection 中acObjIdColl.Add(acObjId);}}}Application.ShowAlertDialog("Number of objects selected: "+acObjIdColl.Count.ToString());}#endregion定义选择集过滤规则#region使用过滤器创建选择集[CommandMethod("FilterSelectionSet")]public void FilterSelectionSet(){ // 获得当前文档的编辑器Editor acDocEd = Application.DocumentManager.MdiActiveDocument.Editor;// 创建一个 TypedValue 数组,用于定义过滤条件TypedValue[] acTypValAr = new TypedValue[1];acTypValAr.SetValue(new TypedValue((int)DxfCode.Start, "CIRCLE"), 0);// 赋值过滤条件给 SelectionFilter 对象SelectionFilter acSelFtr = new SelectionFilter(acTypValAr);// 要求在图形区域中选择对象PromptSelectionResult acSSPrompt;acSSPrompt = acDocEd.GetSelection(acSelFtr);// 如果提示状态是 OK,对象就被选择了if (acSSPrompt.Status == PromptStatus.OK){SelectionSet acSSet = acSSPrompt.Value;Application.ShowAlertDialog("所选择对象个数: " + acSSet.Count.ToString()); }else{Application.ShowAlertDialog("所选择对象个数:0");}}#endregion从选择集中移除对象// 清除 PickFirst 选择集ObjectId[] idarrayEmpty = new ObjectId[0];acDocEd.SetImpliedSelection(idarrayEmpty);// 要求在图形区域中选择对象acSSPrompt = acDocEd.GetSelection();// 如果提示状态是 OK,对象就被选择了if (acSSPrompt.Status == PromptStatus.OK){acSSet = acSSPrompt.Value;Application.ShowAlertDialog("您移除的对象个数为: "+acSSet.Count.ToString()); }else{Application.ShowAlertDialog("您移除的对象个数为: 0");}扩展属性// 创建拓展的过滤选择条件[CommandMethod("FilterXdata")]public void FilterXdata(){// 获得当前文档的编辑器Editor acDocEd = Application.DocumentManager.MdiActiveDocument.Editor;// 创建一个 TypedValue 数组,用于定义过滤条件TypedValue[] acTypValAr = new TypedValue[2];acTypValAr.SetValue(new TypedValue((int)DxfCode.Start, "Circle"), 0);acTypValAr.SetValue(new TypedValue((int)DxfCode.ExtendedDataRegAppName, "MY_APP"), 1);SelectionFilter acSelFtr = new SelectionFilter(acTypValAr);// 要求在图形区域中选择对象PromptSelectionResult acSSPrompt;acSSPrompt = acDocEd.GetSelection(acSelFtr);// 如果提示状态是 OK,对象就被选择了if (acSSPrompt.Status == PromptStatus.OK){ SelectionSet acSSet = acSSPrompt.Value;Application.ShowAlertDialog("您选择到的对象个数为: " +acSSet.Count.ToString());}else{ Application.ShowAlertDialog("您选择到的对象个数为: 0");}}。
《AutoCAD二次开发》实验指导书环境与建筑工程学院测绘教研室实验1 Visual Lisp开发环境的认识和程序运行方法【实验目的】1.熟悉所用计算机系统的基本操作方法。
2.学习Visual Lisp的使用方法,掌握程序编辑、编译、打包、运行及查看运行结果的方法。
3.掌握Visual Lisp程序的基本结构。
【实验内容】1.熟悉使用的计算机系统的基本操作,创建自己的工作目录,参照附录中介绍的方法,掌握Visual Lisp的启动方法(一种或多种),了解AutoCAD系统的安装路径和结构。
2.进入Visual Lisp的工作环境,熟悉Visual LISP 用户界面。
3.熟悉Visual Lisp的系统菜单组成及功能。
学习使用功能键和快捷键调用菜单项的方法。
掌握文件建立、编辑、修改和保存的方法。
落实文件的存储位置是否是你的工作目录,如果不是,回第二步重新设置。
4.了解控制台窗口5.了解Visual LISP 文本编辑器6.加载和运行AutoLISP 程序7.退出Visual LISP实验2 Visual Lisp应用程序【实验目的】1.掌握Visual Lisp语言基本数据类型的概念,理解数据类型与运算的关系。
2.熟悉简单变量的定义和赋值方法,掌握不同类型数据之间赋值的规律。
3.学习Visual Lisp语言运算符优先级和结合性的概念,掌握算术表达式的计算方法及表达式计算中的类型转换方法。
4.掌握数学表达式的程序表示方法。
5.进一步熟悉Visual Lisp程序的编辑、编译、连接和运行的过程。
【实验内容】1.掌握用Visual LISP 开发程序步骤2.使用控制台窗口3.使用文本编辑器4.使用控制台和编辑器的编码辅助工具5.用Visual LISP 设置代码格式6.检查语法错误7.通过样例学习调试程序8.使用Visual LISP 调试功能9.使用Visual LISP 数据查看工具10.编译和链接程序11.创建应用程序模块样例程序:(defun yinyang (/ origin radius i-radius half-r origin-x origin-y os) (setq os (getvar "OSMODE")) ;; Save OSNAP mode(setvar "OSMODE" 0) ;; Turn off OSNAP(setq origin (getpoint "\nOrigin of inyn sign: "))(setq radius (getdist "\nRadius of inyn sign: " origin))(setq i-radius (getdist "\nRadius of internal circle: "origin))(if (> i-radius radius) (setq i-radius (/ radius 4)))(setq half-r (/ radius 2))(setq origin-x (car origin))(setq origin-y (cadr origin))(command "_.CIRCLE" origin radius)(command "_.ARC""_C"(list origin-x (+ origin-y half-r)) ;;center(list origin-x (+ origin-y radius)) ;;start pointorigin ;;end point)(command "_.ARC""_C"(list origin-x (- origin-y half-r)) ;;center(list origin-x (- origin-y radius)) ;;start pointorigin ;;end point)(command "_.CIRCLE"(list origin-x (+ origin-y half-r));;centrei-radius)(command "_.CIRCLE"(list origin-x (- origin-y half-r));;centrei-radius)(setvar "OSMODE" os) ;; Restore OSNAP mode(princ))实验3 Visual Lisp程序设计【实验目的】1.熟练掌握AutoLISP 表达式。
2.熟练掌握AutoLISP 数据类型。
3.熟练掌握AutoLISP 变量。
4.熟练掌握数字处理。
5.熟练掌握字符串处理6.熟练掌握基本输出函数7.熟练掌握等量和条件8.熟练掌握表处理9.熟练掌握符号和函数处理10.熟练掌握错误处理【实验内容】1.编写一个解算二元一次方程的Visual Lisp应用程序。
2.编程计算半径r=2.5的圆面积、圆周长、球面积、球体积及球表面积。
如果高h=4.5,计算圆柱体的表面积和体积。
显示结果保留两位小数。
3.输入下面程序并运行(defun fact2 (nber)(if(= nber 0)1(* nber (fact1 (1- nber)))))(defun fact1 (numbr)(if(= numbr 0)1(* numbr (fact2 (1- numbr)))))使用方法:(fact1 10 )或(fact2 10 )结果:36288004.以下Visual Lisp程序的功能是:移动盘子即汉诺塔问题。
(defun Draw (/ ss s x0 x1 x3 i ent boxlst)(initget 7)(setq CengShu (getint "输入层数="))(setq s (* CengShu 1.1));;删除原有图形;;(setq ss (ssget "x"))(if ss(vl-cmdf "erase" ss ""));;定义块;;(if (= *block* nil)(progn(setvar "clayer" "0")(setvar "CECOLOR" "byblock")(vl-cmdf "pline"(list -0.5 0.0 0.0)(list 0.5 0.0 0.0)(list 0.5 1 0.0)(list -0.5 1 0.0)"c")(vl-cmdf "bhatch" "s" (setq ent(entlast)) "" "p" "solid" "") (entdel ent)(vl-cmdf "block" "box" (list 0.0 0.0 0.0) (entlast) "")(setq *block* "box")(setvar "CECOLOR" "bylayer")));;画柱 0;;(setq X0 0.0)(vl-cmdf "line"(list (+ x0 (* -0.5 s)) 0.0 0.0)(list (+ x0 (* 0.5 s)) 0.0 0.0)"")(vl-cmdf "line" (list x0 0.0 0.0) (list x0 s 0.0) "");;画柱 1;;(setq x1 (+ x0 (* s 1.2)))(vl-cmdf "line"(list (+ x1 (* -0.5 s)) 0.0 0.0)(list (+ x1 (* 0.5 s)) 0.0 0.0)"")(vl-cmdf "line" (list x1 0.0 0.0) (list x1 s 0.0) "");;画柱 2;;(setq x2 (+ x1 (* s 1.2)))(vl-cmdf "line"(list (+ x2 (* -0.5 s)) 0.0 0.0)(list (+ x2 (* 0.5 s)) 0.0 0.0)"")(vl-cmdf "pline"(list (* -1.0 s) (* -1.0 s) 0.0)(list (+ x2 s) (* -1.0 s) 0.0)(list (+ x2 s) (* 1.2 s) 0.0)(list (* -1.0 s) (* 1.2 s) 0.0)"c")(vl-cmdf "line" (list x2 0.0 0.0) (list x2 s 0.0) "");;在柱0上画方块;;(setq i 0)(while (< i CengShu)(vl-cmdf "insert" *block* (list x0 i 0.0) (- CengShu i) 1 0)(setq ent (entlast))(vl-cmdf "change" ent "" "p" "c" (- CengShu i) "")(setq boxlst (append boxlst (list ent)))(setq i (1+ i)))(vl-cmdf "zoom" "e")(list (list x0 boxlst) (list x1 nil) (list x2 nil)))(defun MoveOne (From To / boxlstFrom boxlstTo XFromXTo itm Ent s p1 p2 p nang i ang0 mp lst)(setq itm (nth From *Boxs*))(setq XFrom (nth 0 itm)boxlstFrom (nth 1 itm))(setq itm (nth To *Boxs*))(setq XTo (nth 0 itm)boxlstTo (nth 1 itm))(setq boxlstFrom (reverse boxlstFrom))(setq Ent (car boxlstFrom)boxlstFrom (cdr boxlstFrom))(setq boxlstFrom (reverse boxlstFrom))(setq boxlstTo (append boxlstTo (list Ent)))(setq p1 (list XFrom (length boxlstFrom) 0.0))(setq p2 (list XTo (1- (length boxlstTo)) 0.0))(setq s (distance p1 p2))(setq p (list (/ (+ (car p1) (car p2)) 2.0)(/ (+ (cadr p1) (cadr p2)) 2.0)0.0))(setq n 10i 1)(setq ang (/ (- (angle p p2) (setq ang0 (angle p p1))) n))(while (<= i n)(setq mp (polar p (+ ang0 (* i ang)) (* 0.5 s)))(setq lst (entget ent))(setq old (assoc 10 lst))(setq lst (subst (list 10 (car mp) (cadr mp) 0.0) old lst)) (entmod lst)(setq i (1+ i))(vl-cmdf "delay" 30))(setq*Boxs* (subst (list XFrom boxlstFrom) (assoc XFrom *Boxs*) *Boxs*) )(setq *Boxs* (subst (list XTo boxlstTo) (assoc XTo *Boxs*) *Boxs*)))(defun MoveMore (n A B C /)(if (= n 1)(progn(MoveOne A C))(progn(MoveMore (1- n) A C B)(MoveOne A C)(MoveMore (1- n) B A C))))(defun c:MoveBox ()(setvar "cmdecho" 0)(setvar "osmode" 0)(if (or (= nil (ssget "x")) (= *Boxs* nil))(setq *Boxs* (Draw)))(MoveMore CengShu 0 1 2)(princ))(princ "\n输入命令:MoveBox\n")(princ)观察运行结果,想一想这个程序是如何实现?实验4 编写Visual Lisp程序来创建、编辑、修改数字地形图中要素【实验目的】1.理解查询和命令函数。