收藏 分享(赏)

Autodesk官方最新的.NET教程(C#).pdf

上传人:HR专家 文档编号:6299112 上传时间:2019-04-05 格式:PDF 页数:39 大小:420.85KB
下载 相关 举报
Autodesk官方最新的.NET教程(C#).pdf_第1页
第1页 / 共39页
Autodesk官方最新的.NET教程(C#).pdf_第2页
第2页 / 共39页
Autodesk官方最新的.NET教程(C#).pdf_第3页
第3页 / 共39页
Autodesk官方最新的.NET教程(C#).pdf_第4页
第4页 / 共39页
Autodesk官方最新的.NET教程(C#).pdf_第5页
第5页 / 共39页
点击查看更多>>
资源描述

1、Autodesk官 方最新的 .NET教 程 (C#)1Autodesk官 方 最 新 的 .NET教 程 (C#)Autodesk官方 最新 的 .NET教程 (C#)1第 1章 HelloWorld:访问 ObjectARX.NET封装 类 .1第 2章 .NETAutoCAD向导及 Editor类 2第 3章 数据 库基 础 :创建 我们 自己的 Em ploye对象 4第 4章 数据 库基础 2:添加 自定 义数 据 9第 5章 用户 互操 作: 提示 和选 择 .17第 章 更多 的用 户界 面: 添加 自定 义数 据 24第 章 事件 .33第 1章 HeloWorld:访 问 O

2、bjectARX.NET封 装 类在这 一章 中, 我 们 将使用 VisualStudio.NET来创 建一 个新 的类 库工 程。 通 过 这个 工程 ,你可 以创 建一 个能被 AutoCAD装载 的 .NETdll文件 。这个 dll文件 会向 AutoCAD加入 一 个名为 “HeloWorld”的新命 令。 当用 户运 行这 个命 令后 ,在 AutoCAD命令行 上将 显示 “HeloWorld”文本 。1)启动 VisualStudio.NET, 选 择 ”文件 新建 工程 ”(FileNewProject)。在 新 建工 程对 话框中选择工程类型为 ”VisualC#工程 ”

3、,然后选择 ”类库 ”模板,在工程名字框中输入 ”Lab1”,然后 选择 工程 存放 的位 置。 点击 确定 按钮 来创 建工 程。 2)在工程的 Clas1.cs文件中,一个公有类 “Clas1”已经被系统自动创建了。接下来向这个类加 入命 令。 要 加 入命 令, 你 必 须使用 AutoCAD.NET托管 封装 类。 这 些 托管 封装 类包 含 在两个托管模块中。要加入对这两个托管模块的引用,请用鼠标右键单击 ”引用 ”然后选择 ”添加引 用 ”。在 弹 出 的 ”添加 引用 ”对话 框中 选择 ”浏览 ”。 在 ”选择 组件 ”对话 框中 ,选择 AutoCAD2006的 安 装 目

4、 录 ( 这 里 假 定 为 C:Program FilesAutoCAD2006), 在 这 个 目 录 下 找 到“acdbmgd.dll”然后 选择 并打 开它 。 再一 次选 择 ”浏览 ”,在 utoCAD2006的安 装目 录下 找 到“acm gd.dll”并打 开它 。 当 这 两个 组件 被加 入后 , 请 单 击 ”添加 引用 ”对话 框中 的 ”确定 ”按钮 。正如 它们 的名 字所 表示 的, acdbmgd.dll包含 ObjectDBX托管 类,而 acm gd.dll包含 AutoCAD托管 类。 3)使用 对象 浏览 器( VisualStudio.NET的 ”

5、查看 其它 窗口 对象 浏览 器 ”菜单 项) 来浏 览加入的 两个 托管 模块 所提 供的 类。请 展开 “AutoCAD.NETManagedWrapper”对象( 在对 象浏 览器中 显 示 为 acm gd),在 整 个 教 程 中 我 们 将 使 用 这 个 对 象 中 的 类 。 在 本 章 中 , 我 们 将 使 用“Autodesk.AutoCAD.EditorInput.Editor”类的一个实例来在 AutoCAD命令行中显示文本。请再展 开 “ObjectBX.NETManagedWrapper”对象 ( 在对 象浏 览器 中显 示为 acdbmgd), 这 个对象 中的

6、 类将 被用 来访 问和 编辑 AutoCAD图形 中的 实体 ( 这 部分 内容 将在 以后 的章 节中 介绍 )。 4)引用了 ObjectARX.NET封装类后,我们就可以导入它们。在 Clas1类的声明语句(位于 Clas1.cs文件的顶部的)之前,导入 ApplicationServices,EditorInput和 Runtim e命名空间。 usingAutodesk.AutoCAD.ApplicationServices;Autodesk官 方最新的 .NET教 程 (C#)2usingAutodesk.AutoCAD.EditorInput;usingutodesk.Aut.

7、Runtim e;5)接 下 来 在 类 Clas1中 加 入 命 令 。 要 加 入 能 在 AutoCAD中 调 用 的 命 令 , 你 必 须 使 用“Comm andMethod”属性。这个属性由 Runtim e命名空间提供。在类 Clas1中加入下列属性和函 数。 Comm andMethod(“HeloWorld“)publicvoidelorld()6)当 “HeloWorld”命令在 AutoCAD中运 行的 时候 ,上 面 定义的 HeloWorld函数 就会 被调 用 。在这个函数中,一个 Editor类的实例将被创建。 Editor类拥有访问 AutoCAD命令行的相关

8、方法,它还包括选择对象和其它一些重要的功能。 AutoCAD当前活动文档的 Editor对象可以使用 Application类来 访问 。当 Editor对象 被创 建后 ,你 可以 使用 它的 WriteMesage方法在命 令行 中显 示 “HeloWorld”文本 。在 HeloWorld函数 中加 入以 下代 码:Editored=Application.DocumentManager.MdiActiveDocument.Editor;ed.WriteMesage(“HeloWorld“);7)要在 AutoCAD中调 试这 个程 序,你 可以让 VisualStudio.NET启动

9、一个 AutoCAD进 程 。在解 决方 案管 理器 中右 键单 击 “Lab1”, 然 后 选择 ”属性 ”。 在 Lab1的属 性页 对话 框中 , 选 择 ”配置 属性 调试 ”。 在 ”启动 ”项中 ,选 择 ”调试 模式 ”为 ”程序 ”,在 ”启动 程序 ”的右 边单 击省 略号 按 钮 然 后 选 择 AutoCAD2006安 装 目 录 下 的 acd.exe。 设 置 好 以 后 , 按 F5来 启 动 一 个AutoCAD进程 。 这 样 就会 编译 你的 程序 然后 自动 启动 AutoCAD, 而 当 编译 后有 错误 的时 候就会 停止 。请 修正 你可 能碰 到的

10、任何 错误 。8)“NETLOAD”命令 被用 来装 载托 管程 序。 在 AutoCAD命令 行中 输入 NETLOAD, 会 出现 ”选择 .N组件 ”的对 话框 。选 择上 面生 成的 “lab1.dll”然后 打开 它。9)在命 令行 中输 入 “HelowWorld”。如 果一 切顺 利的 话, 命令 行中 将显 示 “HeloWorld”文 本 。切 换 到 VisualStudio.NET, 在 ed.WriteMesage(“HeloWorld”);语 句 处 加 入 一 个 断 点 。 在AutoCAD中再 次运行 HeloWorld命 令 ,你 会 注 意 到 你 可 以

11、跟 踪 代 码 的 运 行 。 VisulStudio.NET的 ”调试 ”菜单 有好 几项 可以 用来 跟踪 程序 的运 行。如果有时间的话,请浏览一下 Comm andMethod属性。你会发现它有七种不同的形式。在上 面的 例子 中, 我们 使用 了最 简单 的形 式, 它只 有一 个输 入参 数( 命令 的名 字)。 你可 以 使用 其它 的形 式来 控制 命令 的工 作方 式, 例如 你可 以确 定命 令组 的名 字、 全局 和局 部名 字、命令 标识 (命 令如 何来 运行 )等 。第第第第2章章章章.NETAutoCAD向导及向导及向导及向导及Editor类类类类在第 一章 中,

12、 我们 使用 的是 类库 模板 ,这 样就 不得 不手 工加入 acdbmdg.dll和acmgd.dll这两 个引 用。 在 这 一章 中, 我 们 将使用 AutoCAD托管 C#应用 程序 向导 来创 建 .NET工程 ,它 会自 动加 入以 上两 个引 用。 在开 始本 章之 前, 你首 先得 安装 ObjectARX向导(ObjectARX2006开发 包的 utilsObjARXWizArxWizards.msi)。1)启动 VisualStudio.NET, 选 择 ” 文件 新建 工程 ” (FileNewProject)。 在 新 建工程 对话 框中 选择 工程 类型 为 ”

13、 VisualC#工程 ” ,然 后选 择 “ AutoCADManagedCSProjectApplication” 模板 。在 工程 名字 框中 输入 ” Lab2” ,然 后选 择工 程存 放的 位置 。点击 确定 按钮 , “ AutoCADManagedCSharpApplicationWizard” 对话 框将 会出 现。 因为我们 不需 要使 用非 托管 代码 ,所 以不 要选 择 “ EnableUnmanagedDebugging” 项。Autodesk官 方最新的 .NET教 程 (C#)3“ RegisteredDeveloperSymbol” 将会 使用 你在 安装 O

14、bjectARX向导 时输 入的 值。 单击 ” finish” 按钮 来创 建工 程。2)下面 来看 一下 向导 生成 的工 程。 在解 决方 案浏 览器 中, 你会 看到 acdbmgd和 acmgd已经被 引用 了。在 Class.cs文件 中, “ Autodesk.AutoCAD.Runtime” 命名 空间 已被 导入 ,工程使 用 “ RegisteredDeveloperSymbol” 的名 字来 命名 缺省 的公 有类 。向 导还 为类 加入 了一个 CommandMethod属性 和一 个函 数, 它们 用于 AutoCAD命令 。3)在前 一章 中, 我们 使用 一个 “

15、 Autodesk.AutoCAD.EditorInput.Editor” 类的 实例 对象在 AutoCAD命令 行上 输出 文本 。 在 这 一章 中, 我 们 将使 用这 个类 来提 示用 户在 AutoCAD图 形中选 择一 个点 ,然 后将 用户 选择 的点的 x,y,z值显 示出 来。 和前 一章 一样 ,请 导入Autodesk.AutoCAD.ApplicationServices和 Autodesk.AutoCAD.EditorInput命名 空间 。4)把向 导生 成的 CommandMethod属性 的值 改为 有意 义一 些的 名字 如 “ selectPoint” (

16、函数的 名字 可以 不用 修改 )。 PromptPointOptions类用 来设 置提 示字 符串 和其 它的 一些 控制提示 的选 项。 这个 类的 一个 实例 作为 参数 被传 入到 Editor.GetPoint方 法 。 在 函 数 的 开 始 ,实例 化这 个类 ,设 置字 符串 参数 为 “ Selectapoint” 。因 为 Editor.GetPoint方法 会返回一个 PromptPointResult类的 实例 对象 ,所 以我 们也 要把 它实 例化 。PromptPointOptionsprPointOptions=newPromptPointOptions(“S

17、electapoint“);PromptPointResultprPointRes;5)接下 来实 例化 一个 Editor类的 对象 并使 用参 数为 PromptPointOptions对象的GetPoint方法 。用 GetPoint方法 的返 回值 来给 上面 声明的 PromptPointResult对 象 赋 值 。赋值 好以 后, 我们 可以 测试 PromptPointResult对象 的状 态, 如果 不是 OK就返 回。prPointRes=ed.GetPoint(prPointOptions);if(prPointRes.Status!=PromptStatus.OK)e

18、d.WriteMessage(“Error“);6)如果 PromptPointResult对象 返回 了一 个有 效的 点,我 们 就可 以使用 WriteMessage方 法把结 果输 出到 命令 行。 PromptPointResult.Value的 ToString方法 使输 出非 常容 易:ed.WriteMessage(“Youselectedpoint“prPointRes.Value.ToString)7)按 F5来运 行一 个调试 AutoCAD的进 程。 (注 意: 向导 已经 设置 好用 acad.exe来 调 试 )在 AutoCAD命令 行中 输入 NETLOAD,选

19、择 Lab2.dll并打 开。 在命 令行 中输 入你 起的 命令 名字( selectPoint)。 在选 择点 的提 示下 ,单 击图 形中 的任 一点 。如 果一 切正 常的 话, 你可以在 命令 行中 看到 你所 选的 点的 坐标 值。在 Class.cs文件 的“ ed.WriteMessage(“Error“);” 行加 入断 点, 然后 再次 运行 selectPoint命 令 。 这 一 次 ,在选 择点 的提 示下按 ESC键而 不是 选择 一个 点。 PromptPointResult对象 的状 态就 不是 OK了, 所 以 上面 代码 中的 if语句 就会 被执 行, “

20、 ed.WriteMessage(“Error“)” ;语句 就会 被 调用。 8)接下 来我 们将 加入 另外 一个 命令 ,它 可以 获取 两个 点之 间的 距离 。向 导没 有添 加命 令的功 能, 所以 我们 必须 手工 添加 。在 Class.cs文件 的选 择点 的函 数( getPoint)下 面添 加一个 名为 getDistance的新 命令 。 加 入 命令 的方 法请 参考 上一 章的 内容 或本 章的 源代 码, 这里就 不列 出了 。使用 CommandMethod属性 并使 字符 串参 数为 “ getdistance” 或其 它类 似的名字 。在 命令 的函 数中

21、 使用 PromptDistanceOptions代替 PromptPointOptions。当然GetDistance方法 的返 回 值是 一个 PromptDoubleResult类的 实例 对象 ,所 以请用PromptDoubleResult来代替 PromptPointResult:Autodesk官 方最新的 .NET教 程 (C#)4PromptDistanceOptionsprDistOptions=newPromptDistanceOptions(“Finddistance,selectfirstpoint:“);PromptDoubleResultprDistRes;prD

22、istRes=ed.GetDistance(prDistOptions);9)和前 面的 命令 一样 ,也 可以 测试 PromptDoubleResult的状 态, 然后用 WriteMessage方法 在命 令行 中显 示值 。if(prDistRes.Status!=PromptStatus.OK)ed.WriteMessage(“Error“);elseed.WriteMessage(“Thedistanceis:“+prDistRes.Value.ToString();第第第第3章章章章数据库基础数据库基础数据库基础数据库基础:创建我们自己的创建我们自己的创建我们自己的创建我们自己的

23、Employe对象对象对象对象打开 Lab3文件 夹下的 Lab3工程 文件 ,或 或接着 Lab2的代 码。 在这 一章 中, 我们 将创建一 个 Employee对象 (包 括一 个圆 ,一 个椭 圆和 一个 多行 文本 对象 ), 这个 对象 属于一个 自定 义的 EmployeeBlock 块( 这个 块驻 留在 EmployeeLayer 层, 当在 模型 空间 插入这 个块 的时 候, EmployeeLayer 层就 会拥 有这 个块 的一 个块 索引 )。 本章 的每 一个 步骤中 的代 码都 可以 运行 , 这 样 做的 目的 可以 使你 更清 楚地 知道 每一 部分 代码

24、完成 的功 能。 第一步 将简 要说 明一 下如 何在 模型 空间 创建 一个 圆。这一 章的 重点 是在 AutoCAD中访 问数 据库 的基 础。 主要 内容 包括 事务 处理( Transaction) 、 对象 Id( ObjectId) 、 符 号 表 ( symboltables,如 块表 BlockTable和层表 LayerTable) 以 及 对象 引用 。 使 用 的其 它一 些对 象如 颜色 Color、 三 维点 Point3d和 三维向量 Vector3d,都 和各 自的 步骤 有关 ,但 重点 应该 放在 数据 库基 础上 。1)创建 一个 名为 CREATE 的命

25、 令, 它调 用函数 CreateEmployee()。这 个函 数用 来在 模型空 间 (MODELSPACE)的( 10, 10, 0)点 处创 建一 个半 径为 2.0的圆 :CommandMethod(“test“)publicvoidcreateCircle()/首先 声明 我们 要使 用的 对象Circlecircle;/这个 是我 们要 加入 到模 型空 间的 圆BlockTableRecordbtr;/要加 入圆 ,我 们必 须打 开模 型空 间BlockTablebt;/要打 开模 型空 间, 我们 必须 通过 块表 (BlockTable)来访 问它/我们 使用 一个 名为

26、 Transaction 的对 象, 把函 数中 有关 数据 库的 操作 封装 起来Transactiontrans;/使用 TransactionManager的 StartTransaction()成员 来开 始事 务处 理trans=HostApplicationServices.WorkingDatabase.TransactionManager.StartTransaction();Autodesk官 方最新的 .NET教 程 (C#)5/现在 创建 圆 请仔 细看 这些 参数 注意 创建 Point3d对象 的 New 和 Vector3d的静态 成员 ZAxiscircle=ne

27、wCircle(newPoint3d(10,10,0),Vector3d.ZAxis,2);bt=(BlockTable)trans.GetObject(HostApplicationServices.WorkingDatabase.BlockTableId,OpenMode.ForRead);/使用 当前 的空间 Id来获 取块 表记 录 注意 我们 是打 开它 用来 写入btr=(BlockTableRecord)trans.GetObject(HostApplicationServices.WorkingDatabase.CurrentSpaceId,OpenMode.ForWrite)

28、;/现在 使用 btr对象 来加 入圆btr.AppendEntity(circle);trans.AddNewlyCreatedDBObject(circle,true);/并确 定事 务处 理知 道要 加入 圆!/一旦 完成 以上 操作 ,我 们就 提交 事务 处理 ,这 样以 上所 做的 改变 就被 保存 了 trans.Commit();/ 然后 销毁 事务 处理 , 因 为 我们 已经 完成 了相 关的 操作 ( 事 务处 理不 是数 据库 驻留 对象 ,可以 销毁 ) trans.Dispose();请仔 细阅 读一 下上 面的 代码 块的 结构 ,可 以通 过注 释来 了解 相关

29、 的细 节。注意 :要 编译 代码 ,你 必须 导入 Autodesk.AutoCAD.DatabaseServices和Autodesk.AutoCAD.Geometry命名 空间运行 这个 函数 来看 看它 是否 可行 。应 该会 在图 形中 创建 一个 在 (10,10,0)处的 半径为 2.0的白色 的圆 。2)我们 可以 减少 代码 的输 入量 ,这 可以 通过 声明 一个 Database变量 代替HostApplicationServices.WorkingDatabase来实 现:Databasedb=HostApplicationServices.WorkingDatabas

30、e;使用 这个 变量 来代 替在 代码 中出 现的 HostApplicationServices.WorkingDatabase。3)在上 面的 代码 中, 我 们没 有使 用任 何异 常处 理, 而 异常 处理 对一 个正 确的 .NET应用 程 序来说 是非 常重 要的 。我 们 要养 成使 用异 常处 理的 好习 惯,所 以 让我 们在 这个 函数 中加入 try-catch-finally。4)为了 使代 码紧 凑, 我们 可以 把许 多变 量的 声明 和初 始化 放在 同一 个语 句中 。现 在, 你的代码 看起 来应 该是 这样 的: CommandMethod(“CREATE“

31、)publicvoidCREATEEMPLOYEE()Databasedb=HostApplicationServices.WorkingDatabase;Transactiontrans=db.TransactionManager.StartTransaction();tryCirclecircle=newCircle(newPoint3d(10,10,0),Vector3d.ZAxis,2);BlockTablebt=(BlockTable)trans.GetObject(db.BlockTableId,OpenMode.ForRead);Autodesk官 方最新的 .NET教 程 (C

32、#)6BlockTableRecordbtr=(BlockTableRecord)trans.GetObject(HostApplicationServices.WorkingDatabase.CurrentSpaceId,OpenMode.ForWrite);btr.AppendEntity(circle);trans.AddNewlyCreatedDBObject(circle,true);trans.Commit();catched.WriteMessage(“Error“);finallytrans.Dispose();EndFunction运行 你的 代码 来进 行测 试 上面的 c

33、atch块只 显示 一个 错误 信息 。实 际的 清理 工作 是在 finally块中 进行 的。 这样做的 理由 是如 果在 事务 处理 被提 交( Commit())之 前, Dispose()被调 用的 话, 事务 处理 会被 销毁 。我 们 认为 如果在 trans.Commit()之前 出现 任何 错误 的话 ,你 应 该销 毁事 务处 理 (因为 Commit将永 远不 会被 调用 )。 如果在 Dispose()之前 调用了 Commit(),也 就是 说没 有任何错 误发 生, 那么 事务 处理 将会 被提 交给 数据 库。所以 基于 上面 的分 析, Catch块其 实并 不

34、是 必须 的, 因 为它 只用 来通 知用 户程 序出 现了 一 个错误 。它 将在 下面 的代 码中 被去 掉。 5)现在 让我 们在 Employee加入 剩下 的部 分: 椭圆 和多 行文 本的 实例 。多行 文本 实体 : 中心 点应 该与 圆心 的创 建一 样: (建 议: 创建 一个 名为 center 而值为 10,10,0的 Point3d变量来表 示中 心点 ) 多行 文本 的内 容可 以是 你的 名字 。椭圆 (提 示: 你可 以先 看一下 Ellipse的构 造函 数)法向 量应 该沿着 Z轴( 请查看 Vector3d类型 )主轴 设为 Vector3d(3,0,0)(

35、提 示: 不要 忘了用 new)半径 比例 设为 0.5椭圆 还必 须闭 合( 也就 是说 ,开 始和 结束 点必 须相 同)运行 你的 代码 来进 行测 试 应该 可以 生成 一个 圆、 一 个 椭圆 和一 个中 心点在 10,10,0的多 行文 本。 注意 :和 事务 处理 对象 有关 的 .NETAPI中的 Try-Catch-Finally块结 构, 应该 是异 常观察 者。 实 际 上我 们是在 try块中 实例 化对 象的 , 但 没 有显 式地 销毁 它们 。 当 产 生异 常的 时候可 能会 产生 问题 , 特 别 是当 观察 者注 意到 我们 实际 上用 的是 封装 的非 托

36、管 对象 ! 记 住 , 当资源 不再 使用 的时 候, 垃圾 收集 机制 就会 回收 内存 。垃 圾收 集机 制会 不时 的调 用封 装类的 Dispose()方法 ,删 除非 托管 对象 。Autodesk官 方最新的 .NET教 程 (C#)7这里 还要 注意 的是 Dispose()作用 于封 装的 非托 管类 对象 的方 式取 决于 对象 是否 是数据库 驻留 对象 。 由 非 数据 库驻 留对 象调 用的 Dispose()会删 除非 托管 对象 , 而 由 数据 库驻 留对象 调用的 Dispose()只是 关闭 它们 。6)接下 来让 我们 来创 建一 个新 的函 数, 它用

37、来新 建一 个颜 色为 黄色 ,名 字为“ EmployeeLayer” 的 AutoCAD层。这个 函数 应该 检查 是否 这个 层已 经存 在, 但不 管这 个层 是否 存在 ,函 数都 应该 返回“ EmployeeLayer” 的 ObjectId。下 面是 这个 函数 的代 码:publicObjectIdCreateLayer()ObjectIdlayerId;/它返 回函 数的 值Databasedb=HostApplicationServices.WorkingDatabase;Transactiontrans=db.TransactionManager.StartTransa

38、ction();/首先 取得 层表 LayerTablelt=(LayerTable)trans.GetObject(db.LayerTableId,OpenMode.ForWrite);/检查 EmployeeLayer层是 否存 在 if(lt.Has(“EmployeeLayer“) layerId=lt“EmployeeLayer“;else/如果 EmployeeLayer层不 存在 ,就 创建 它LayerTableRecordltr=newLayerTableRecord();ltr.Name=“EmployeeLayer“;/设置 层的 名字ltr.Color=Color.Fr

39、omColorIndex(ColorMethod.ByAci,2);layerId=lt.Add(ltr);trans.AddNewlyCreatedDBObject(ltr,true);trans.Commit();trans.Dispose();returnlayerId;是不 是觉 得这 个函 数的 基本 结构 与在 模型 空间 加入 实体 的代 码比 较类 似? 访问 数据 库的方法 都是 这样 的: 使 用 事务 处理 来获 取数 据库 对象 , 在 符 号表 ( 模 型空 间所 在的 块表 也是 符号表 之一 )中 加入 实体 ,然 后让 事务 处理 知道 。 7)在这 个函 数中

40、 加入 异常 处理 ,就 像在 CreateEmployee函数 中的 一样 。8)接下 来, 改变 新建 层的 颜色 。下 面是 实现 的代 码片 断, 请把 它加 入到 你的 代码 中:ltr.Color=Color.FromColorIndex(ColorMethod.ByAci,2)注 意 : ColorMethod.ByAci可以 让我 们使用 AutoCADACI颜色 索引 这里为 2 (表 示黄 色 ) 。9)回到CreateEmployee()函数 , 加 入 把上 面创 建的 几个 实体 设置到 EmployeeLayer层的 代码 。 声 明Autodesk官 方最新的 .

41、NET教 程 (C#)8一个 类型为 ObjectId的变 量,用 CreateLayer函数 的返 回值 给它 赋值 。使 用每 个实 体( 文本、 圆和 椭圆 )的 LayerId属性 设置 它们 所在 的层 。例如 : text.LayerId=empId运行 代码 来查 看 “ EmployeeLayer” 层是 否已 被创 建,所 有 已创 建的 实体 是否 都在 这一 层 上(应 该显 示为 黄色 ) 10)现在 为各 个实 体设 置不 同的 颜色 ,可 以使用 ColorIndex属性 ( ColorIndex属性 表示AutoCAD的颜 色) 圆为 红色 1椭圆 为绿 色 3文

42、本 为黄 色 2运行 代码 , 看 看 实体 的颜 色是 否为 设置 的值 , 即 使 这些 实体 是在 “ EmployeeLayer” 层上 。11)接下 来, 我 们 要在 AutoCAD数据 库中 创建 一个 独立 的块 , 然 后 把它 插入 到块 表而 不 是模型 空间 中。 首先把 CreateEmployee函数 的名 字改为 CreateEmployeeDefinition()。加入 以下 代码 来创 建一 个独 立的 块: BlockTableRecordnewBtr=newBlockTableRecord();newBtr.Name=“EmployeeBlock“;new

43、BtrId=bt.Add(newBtr);trans.AddNewlyCreatedDBObject(newBtr,true);12)现在 , 请 稍 微改 动一 下加 入实 体到 模型 空间 的代 码 ( 改 为加 入块 到块 表中 , 记 得 加 入前要 打开 块表 )。 现在 运行 代码 ,然 后使用 INSERT命令 来检 查是 否可 以正 确插 入这 个块 。13)最后 , 我 们 要创 建一 个位 于模 型空 间的 块索 引, 它 表 示上 面创 建的 块的 一个 实例 。 这一步 留给 大家 练习 。下面 是你 要遵 循的 最基 本的 步骤 :A)创建 一个 名为 CreateE

44、mployee新的 函数B)把命 令属 性 “ CREATE” 移动到CreateEmployee()C)修改 CreateEmployeeDefintion()来返回新 创建 的块 “ EmployeeBlock” 的 ObjectId,操 作的 步骤 请参考 CreateLayer()的作 法。D)你需 要修改 CreateEmployeeDefintion()来查 看块 表中 是否 已包 含 “ EmployeeBlock” 块,如 果 包含 这个 块,则 返 回它的 ObjectId(做法与 CreateLayer()一样 )。提示 :把 bt 的声 明语 句移 动到 try块的 顶部

45、 ,使用 BlockTable.Has()方法 ,把 其它 的代码 移动到 else语句 :try/获取 BlockTable对象BlockTablebt=(BlockTable)trans.GetObject(db.BlockTableId,OpenMode.ForWrite);if(bt.Has(“EmployeeBlock“)newBtrId=bt“EmployeeBlock“;elseAutodesk官 方最新的 .NET教 程 (C#)9E)在新 创建的CreateEmployee()函数 中创 建一 个新的 BlockReference对象 , 并 把 它加 入到 模型 空间 。

46、提示: 我 们可 以使用 CreateEmployeeDefinition()中引 用模 型空 间的 代码 , 这 些 代码 在这 里不需 要了F)在 CreateEmployee中调用 CreateEmployeeDefinition()函数 ,使 上面 生成的 BlockReference对象的BlockTableRecord()指向 CreateEmployeeDefinition()函 数 。提 示 :请 参 考 BlockReference的构 造函 数。 附加 的问 题: 让我 们来 看一 下代 码的 运行 情况 , 执 行 命令 会生 成一个 EmployeeBlock的块 索引

47、 , 你 会看到 它被 插入到 20,20,0而不是 10,10,0。为 什么 ?如果 你知 道原 因, 那么 怎样 才能 使块 索引 插入 到正 确的 点? 当你用 List命令 查看 块索 引时 ,它 会告 诉你 它位于 0层( 或者 当命 令运 行时 位于 当前层) 。为 什么 ? 怎样 才能 让块 索引 总是 位于 EmployeeLayer层?第第第第4章章章章数据库基础数据库基础数据库基础数据库基础2:添加自定义数据添加自定义数据添加自定义数据添加自定义数据在这 一章 中,我 们 将创 建一 个新 的字 典对 象,它 用 来表 示我 们雇 员就 职的 Acme公司 (呵呵, 当 然

48、 是虚 构的 一家 公司 ) 的 部 门。 这 个 “ 部门 ” 字典 对象 将包 含一 个表 示部 门经 理的 记录。 我们 还会 加入 代码 到雇 员创 建过 程, 这个 过程 会加 入一 个索 引到 雇员 工作 的部 门。 我们 要说 明的 是如 何在 DWG文件 中创 建自 定义 数据 ,包 括 “ 每个 图形 ” 的自 定义 数据 和 “ 每个实 体 ” 的自 定义 数据 。 “ 每个 图形 ” 的自 定义 数据 是指 只在 整个 图形 中加 入一 次的 数据 ,它表 示对 象可 以引 用的 单一 类型 或特 性。 “ 每个 实体 ” 的自 定义 数据 是指 是为 特定 的对 象 或

49、数据 库中 的实 体加 入的 数据 。 在下 面的 示例 中, 我们 将加 入 “ 每个 图形 ” 的自 定义 数据 到命 名对 象字 典 (简称 NOD)。 NOD存在 于每 一个 DWG文 件 中 。 “ 每个 实体 ” 的自 定义 数据 加入 到一 个名 为 “ 扩展 字典 ” 的字 典(可 选) 中, 它表 示每 一个 雇员 。每 一个由 DBObject派生 的对 象都 拥有 存储 自定 义数 据的扩展 字典 。而 在我 们的 示例 中将 包含 这种 自定 义数 据如 名字 、薪 水和 部门 。 因此 这一 章的 重点 是字 典对 象和 扩展 记录 ( XRecord), 它们 是我 们用 来表 示自 定义 数据 的容器 。 首先 让我 们来 创建 表示 公司 的条 目。 在 本 章的 前几 个步 骤中 , 我 们 将创 建如 下所 示的 部门 层次结 构: NOD命 名对 象字 典 ACME_DIVISION自 定义 公司 字典销售 (Sales)部 门字 典部门 经理 部 门条 目请打开 Lab4文件 夹下的

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 实用文档 > 简明教程

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报