Civil 3D 二次开发 创建AutoCAD对象—— 01 —— 创建直线
在方法CreateLine内完成以下代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | 01 public void CreateLine() 02 { 03 PromptPointOptions ppo = new PromptPointOptions( "\n拾取直线起点:" ); 04 PromptPointResult ppr = ed.GetPoint(ppo); 05 if (ppr.Status != PromptStatus.OK) return ; 06 Point3d startPt = ppr.Value; 07 ppo.Message = "\n拾取直线终点: " ; 08 ppo.UseBasePoint = true ; 09 ppo.BasePoint = startPt; 10 ppr = ed.GetPoint (ppo); 11 if (ppr.Status != PromptStatus.OK) return ; 12 Point3d endPt = ppr.Value; 13 Entity line = new Line(startPt, endPt); 14 AddEntToModelSpace(line); 15 } |
01 声明方法CreateLine()
02 {
03 定义ppo变量,“拾取直线起点:”将出现在命令行向用户发出提示
04 从editor获取点
05 判断输入结果,如果结果不ok,退出
06 直线起点
07 修改ppo提示文本,为获取终点做准备
08 设置使用基点属性为真,拾取终点时可从起点拉一根橡皮筋
09 设置基点
10 从editor获取点
11 判断输入结果,如果结果不ok,退出
12 直线终点
13 创建line实体
14 将line实体添加到模型空间
15 }
在这里提出一个问题: Entity line = new Line(startPt, endPt);为什么可以这样写呢?可不可以写成Line line = new Line(startPt, endPt);呢?还有没有其他的方式可以呢?这个问题留给您去思考。
暂时搞不明白也不影响什么,让我接着实现方法AddEntToModelSpace。这个方法在您以后的代码中可能会多次出现。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | 01 private void AddEntToModelSpace(Entity ent) 02 { 03 using (Transaction tr = db.TransactionManager.StartTransaction()) 04 { 05 BlockTable bt = db.BlockTableId.GetObject(OpenMode.ForRead) as BlockTable; 06 BlockTableRecord btr = bt[BlockTableRecord.ModelSpace] 07 .GetObject(OpenMode.ForWrite) as BlockTableRecord; 08 btr.AppendEntity(ent); 09 tr.AddNewlyCreatedDBObject(ent, true ); 10 tr.Commit(); 11 } 12 } |
01 声明方法,输入参数为entity类型
02 {
03 定义tr变量,开启事务
04 {
05 获取块表,打开方式为只读
06 获取模型空间块表记录,打开方式为写入
07 接上一行
08 将ent添加到块表记录(模型空间)中
09 将新创建的实体添加到事务中
10 事务提交
11 }
12 }
上述代码实现了将实体对象添加至模型空间的操作,这是一个简化版本,有时我们可能需要返回新建对象的ObjectId,或者需要将对象添加到布局(图纸空间)或其他块表记录(图块定义)中,您可以查找相关资料自行完成。
至此,创建一条直线的代码就完成了,接下来让我们完善命令相关的代码。打开另一个类文件myCommands.cs,如果您是用向导创建的项目,一定会有这个文件的。添加或复制修改原有方法,使其与下面的类似:
01 public class MyCommands 02 { 03 [CommandMethod( "MyGroup" , "CreateLine" , "CreateLineLocal" ,CommandFlags.Modal)] 04 public void CreateLine() 05 { 06 CreateEntityDemo ced = new CreateEntityDemo(); 07 ced.CreateLine(); 08 } 09 } |
注意这里的CreateLine方法名称与CreateEntityDemo类中的方法名称是一样的,会不会混淆呢?如果不明白,请翻阅命名空间相关章节,重复加深一下印象。
编译、加载,在命令行中输入命令CreateLine,拾取起点、终点,不出意外的话,成功创建一条直线。接下来可以试着在拾取点的过程中按下Esc键,或者直接用键盘输入点的坐标,看一下是什么效果。
5‑2 创建直线
对比一下内部命令Line,看有什么区别,怎样才能跟内部命令类似呢?您可以在AutoCAD Managed .NET Developer's Guide 中搜索关键字:keyword,并在其他资源搜索关键字:递归。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?