红色部分为答案空白或不确定
CAD复习题及答案
1、AutoLISP
2、VisualLISP
3、VBA
4、ADS
5、ObjectARX
红色部分为答案空白或不确定
6、.NET 托管API
7、ActiveX Automation
红色部分为答案空白或不确定
8、Visual Java
1、AutoCAD二次开发方式有哪些?各自优缺点?
2、AutoCAD 中实现ObjectARX .NET API 的有哪些优点?
3、AutoCAD .NET API 的三个主要的DLL文件是?
4、简述ObjectARX .NET API所对应的VS.NET版本。
5、简述AutoCAD数据库的组成。
AutoCAD数据库是用来管理当前图形中的图元实体和其他非几何信息的容器对象,一个AutoCAD数据库包含一套固定的符号表和命名的对象词典,每一个符号表包含一个特定符号
红色部分为答案空白或不确定
表记录类的实例,例如层表(AcDbLayerTable)中包含层表的记录,块表(AcDbBlockTable)中包含块表记录,所有的AutoCAD实体均包含于块表记录中。词典提供了一种通用容器来存储对象,它可以保存AcDbObject对象以及其它对象,也可以创建新的对象词典,将新的数据库元素加入其中。
AutoCAD数据库的组成如图所示,从图中我们可以看出数据库主要由一下内容组成: 1) 层表AcDbLayerTable和层表记录AcDbLayerTableRecord,。
2) 块表AcDbBlockTable和块表记录AcDbBlockTableRecord。AutoCAD中所有可见实体均存储在块表记录。块表中包含有两条特殊的记录*MODEL_SPACE(模型空间)和*PAPER_SPACE(图纸空间)。
3) 其他符号表和符号表记录。
4)命名对象词典。缺省情况下当AutoCAD数据库被建立以后,词典中就包括了组词典以及MILINE样式词典。
5)符号表和命名对象词典都是存储数据库对象的容器,用于组织和管理数据库对象。AutoCAD数据库通常有9个固定类型的符号表,开发者不能向数据库中新增或者删除任何一种类型符号表,能实现的是向符号表中添加对应的符号表记录。
6、Application 对象是 AutoCAD .NET API 对象模型的根对象,它包括哪些部分?
Application 对象是层次结构的根,而且它提供对 AutoCAD 的主窗口的访问。
红色部分为答案空白或不确定
7、列出所有图形与非图形对象,他们有什么区别?
图形对象,也称为图元,是组成图形的可见对象(例如直线、圆、光栅图像等):
1)添加图形对象到图形中是通过正确的块表记录引用,然后使用 AppendEntity 方法将一个新对象添加到图形中来完成的
2)要修改或查询这些对象,请从正确的块表记录获得对象引用,然后使用对象本身的方法或特性。每一个图形对象都拥有允许应用程序执行大部分 AutoCAD 编辑命令的方法,例如复制、删除、移动、镜像等
这些对象还提供了一些方法,用来设置和检索对象的扩展数据(xdata),亮显和更新对象,以及从另外的图元设置属性。大多数图形对象具有诸如 LayerId、LinetypeId、Color 和 Handle 之类的典型特性。每个对象也具有一些特有的特性,例如 Center、StartPoint、Radius 和 FitTolerance 非图形对象是指属于图形的一部分但不可见的(提示性的)对象,例如 Layers、Linetypes、DimStyles、TableStyle 等
1)若要创建新的符号表记录,请使用表所有者的 Add 方法或使用 SetAt 方法添加一个字典到命令对象字典中
2)要修改或查询这些对象,请使用对象本身的方法或特性。每一个非图形对象都有用于特定目的的方法和特性,都有设置和检索扩展数据以及删除自己的方法
8、如何实现对AutoCAD数据库图形对象的访问?给出实例代码。
大部分的集合和容器对象都是通过 Document 或 Database 对象访问的。Document 和 Database 对象都包含一些相应的特性用来访问大多数可用集合的对象或对象 ID。 例如,以下代码定义一个变量,并将其设置为当前图形的 LayersTable 对象:
红色部分为答案空白或不确定
9、AutoCAD中集合对象是指?列举出部分实例。
10、如何定义一个用户命令?CommandMethod 所接受的属性包括哪些?
命令和 AutoLISP 函数可以通过使用两个属性:CommandMethod 和 LispFunction 就可以在 AutoCAD .NET API 中被定义
使用 CommandMethod 属性定义一个命令,CommandMethod 属性期待一个字符串值,它将当作被定义命令的全局名称。和全局命令名称一起,CommandMethod 属性还能接受如下值:
【Command Flags】 -定义命令的行为 【Group Name 】- 命令组名称
【Local Name 】- 本地化命令名称,通常用于特定语言
【Help Topic Name】定义当命令被激活时相应的快捷菜单的状态 【Help File Name】 -包含当命令激活并按 F1 键时将要显示其中帮助主题的帮助文件
11、如何通过代码调用AutoCAD内部命令?
A、使用 SendStringToExecute 方法可以直接将命令发送到 AutoCAD 命令行。SendStringToExecute 方法将单个字符串发送到命令行。该字符串必须包含提供给所执行命令的参数,并依照该命令的提示顺序所要求的次序排列这些参数
B、使用 SendStringToExecute 执行命令是异步的,直到 .NET 命令结束,否则不会被调
红色部分为答案空白或不确定
用。如果需要立即执行一个命令(同步),应该: 1)使用 COM Automation 库中的 SendCommand 方法,它可以利用 .NET COM Interop 访问 2)使用 ObjectARX 或 .NET API 定义命令,P/Invoke 非托管的用于本地化的 AutoCAD 命令的 acedCommand 或 acedCmd 方法
3)通过定义 AutoLISP 命令, P/Invoke 非托管的 acedInvoke 方法
12、如何实现图形对象的旋转、平移、缩放?请给出具体实现。
使用transformBy函数进行几何变换
1)Entity.TransformBy(Matrix3d transform) 2)transformBy是Entity类的一个成员函数,该函数使用一个Matrix3d参数对实体进行相应的几何变换
3)Matrix3d是一个四维矩阵,常用函数: Translation:生成一个移动对象的矩阵 Rotation:生成旋转矩阵
Scaling:生成比例缩放矩阵。 Mirroring:生成镜像矩阵
public static void Move(Entity ent, Point3d ptStart, Point3d ptEnd) { ent.TransformBy(Matrix3d.Displacement(ptEndn - 5), sourceDb, false);
4)将新建块表记录加载到当前块表记录中 5)删除新建块表记录
23、AutoCAD有哪些选择集过滤规则类型?请列举部分实例代码。
选择集过滤规则类型:
A、使用选择集过滤器定义选择集规则
B、在选择集过滤器中指定多个条件
C、添加复杂的过滤器列表条件
D、在选择器过滤器条件中使用通配符
E、过滤扩展数据 实例:
DBObject dbObj = Trans.GetObject(idBTR, OpenMode.ForWrite);dbObj.Erase();
红色部分为答案空白或不确定
A) 实例:使用过滤器选择圆图形实体
B)实例
C) 实例1:选择半径大于或等于 5.0 的圆
// 创建一个 TypedValue 数组,用于定义过滤条件 TypedValue[] acTypValAr = new TypedValue[3]; acTypValAr.SetValue(new TypedValue((int)DxfCode.Start, \"CIRCLE\"), 0); acTypValAr.SetValue(new TypedValue((int)DxfCode.Operator, \">=\"), 1); acTypValAr.SetValue(new TypedValue(40, 5), 2); // 赋值过滤条件给 SelectionFilter 对象 SelectionFilter acSelFtr = new SelectionFilter(acTypValAr); // 要求在图形区域中选择对象 PromptSelectionResult acSSPrompt; acSSPrompt = acDocEd.GetSelection(acSelFtr);
实例2:选择 Text 或 Mtext 对象
14
红色部分为答案空白或不确定
// 创建一个 TypedValue 数组,用于定义过滤条件 TypedValue[] acTypValAr = new TypedValue[4]; acTypValAr.SetValue(new TypedValue((int)DxfCode.Operator, \"\"), 3); // 赋值过滤条件给 SelectionFilter 对象 SelectionFilter acSelFtr = new SelectionFilter(acTypValAr); // 要求在图形区域中选择对象 PromptSelectionResult acSSPrompt; acSSPrompt = acDocEd.GetSelection(acSelFtr);
D) 实例:选择所有文字字符串中出现“The”的多行文字
E) 实例:查找出包含通过“MY_APP”应用程序添加的外部数据的圆
24、在AutoCAD中如何给一条道路添加扩展属性数据XData?请给出具体实现。
1)扩展数据需要一个唯一的应用程序名,可以通过acdbRegApp()进行注册,名字最长可达31 个字符
2)由于每个数据库对象可以附加多个应用程序的数据,所以在结果缓冲区链表中,应用程序名是每段扩展数据的第一个数据,其后的结果缓冲数据都归此应用程序名所有 具体实现:
红色部分为答案空白或不确定
public string appName = \"Road\"; [CommandMethod(\"setXData\")] public void setXData() { //选择实体 PromptEntityOptions pEntityOptions = new PromptEntityOptions(\"\\n请选择道路\"); PromptEntityResult pEntityResult = pEd.GetEntity(pEntityOptions); if (pEntityResult.Status == PromptStatus.OK) { ObjectId pEntId = pEntityResult.ObjectId; using(Transaction pTrans = m_db.TransactionManager.StartTransaction()) { Entity pRoadEnt = (Entity)pTrans.GetObject(pEntId, OpenMode.ForWrite); TypedValue[] vals = new TypedValue[]{ //注册应用程序 new TypedValue(Convert.ToInt16(DxfCode.ExtendedDataRegAppName),appName), new TypedValue(Convert.ToInt16(DxfCode.ExtendedDataAsciiString),\"中央路\"), new TypedValue(Convert.ToInt16(DxfCode.ExtendedDataAsciiString),\"沥青路面\"), new TypedValue(Convert.ToInt16(DxfCode.ExtendedDataAsciiString),\"2000\"), new TypedValue(Convert.ToInt16(DxfCode.ExtendedDataAsciiString), \"双向\") }; //创建缓存 ResultBuffer pResBuff = new ResultBuffer(vals); //设置扩展数据 pRoadEnt.XData = pResBuff; pTrans.Commit(); } } }
[CommandMethod(\"ReadXData\")] public void ReadXData() { //选择实体 PromptEntityOptions pEntityOptions = new PromptEntityOptions(\"\\n请选择道路\"); PromptEntityResult pEntityResult = pEd.GetEntity(pEntityOptions); if (pEntityResult.Status == PromptStatus.OK) { ObjectId pEntId = pEntityResult.ObjectId; using (Transaction pTrans = m_db.TransactionManager.StartTransaction()) { Entity pRoadEnt = (Entity)pTrans.GetObject(pEntId, OpenMode.ForRead); if (pRoadEnt.XData == null) return; //得到实体扩展数据缓存 ResultBuffer pResBuff = pRoadEnt.XData; //转换成TypedValue数组 TypedValue[] getvals = pResBuff.AsArray(); string pRoadName = getvals[1].Value.ToString(); string pRoadMtia = getvals[2].Value.ToString(); string pRoadYear = getvals[3].Value.ToString(); string pSingle = getvals[4].Value.ToString(); pTrans.Commit(); } } }
25、如何使用DBDictionary对象给一设计图或一图形对象添加属性信息?实 例:使用扩充词典(XRecord)存储扩展数据
16
红色部分为答案空白或不确定
[CommandMethod(\"setXRecord\")] public void setXRecord() { using (Transaction pTrans = m_db.TransactionManager.StartTransaction()) { DBDictionary dbDictionary = pTrans.GetObject( m_db.NamedObjectsDictionaryId, OpenMode.ForWrite) as DBDictionary; //创建存储图纸设计者信息数据字典 if (!dbDictionary.Contains(\"设计者\")) { DBDictionary pDesDict = new DBDictionary(); dbDictionary.SetAt(\"设计者信息\", pDesDict); Xrecord pDesRecord = new Xrecord(); TypedValue[] vals = new TypedValue[]{ new TypedValue(Convert.ToInt16(DxfCode.ExtendedDataAsciiString),\"李明\"), new TypedValue(Convert.ToInt16(DxfCode.ExtendedDataAsciiString),\"深圳建筑设计院\"), new TypedValue(Convert.ToInt16(DxfCode.ExtendedDataAsciiString),\"2005\"), new TypedValue(Convert.ToInt16(DxfCode.ExtendedDataAsciiString), \"100年\") }; //创建缓存 ResultBuffer pResBuff = new ResultBuffer(vals); pDesRecord.XData = pResBuff; pDesDict.SetAt(\"设计者\", pDesRecord); } pTrans.Commit(); } }
26、“当一个对象要被修改时,使用Database对象的ObjectOpendForModify事件应该被通知”这句话是否正确? I don’t know ,nor do I care
(P103)表格第一竖排最后一个 ,个人认为应该正确
27、AutoCAD中的词典和符号表有什么区别和联系?
AutoCAD 中的词典是一般的容器对象,这类似于AutoCAD中的符号表,但符号表只能存储指定类型的对象,而词典则可以保存任意的DbObject对象或其派生类的对象,实际上词典是通用非图形数据库对象的容器
在AutoCAD中词典用DbDictionary类表示,和符号表一样包含一个唯一的字符串关键字,它的操作也非常类似于符号表操作方法
28、简述创建字体样式的基本过程。
29、ObjectARX .NET API提供了哪几种创建二维圆弧CircularArc2d的方法?
使用Autodesk.AutoCAD.DatabaseServices下的Arc类创建圆弧,该类提供了三种定义圆弧的方法:
Arc():不带参数
Arc(Point3d center, double radius, double startAngle, double endAngle) Arc(Point3d center, Vector3d normal, double radius, double startAngle, double endAngle)
红色部分为答案空白或不确定
30、采用交互方式,绘制一个已知圆心和半径的圆,并将圆的颜色设置成红色。
[DllImport(\"acad.exe\", CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Unicode)] //调用绘制圆命令 private static extern int acedCommand( int type1, string command, int type2, string center, int type3, string radius, int end); [CommandMethod(\"DrawCircle\")] public void DrawCircle() { acedCommand(5005, \"circle\", 5005, \"100,100,0\", 5005, \"30\", 5000); }
第一段代码是交互式创建圆,但没有颜色;第二段代码是静态创建圆,其中pCir.ColorIndex = 1,参数“1”代表红色,4代表绿色,2代表黄色