基于C#的AutoCAD二次开发之获取用户输入信息、选择集、访问CAD内部命令

在CAD创建图形对象时,经常需要和用户进行交互,例如:直线创建时需要用户输入起点和终点(或长度)信息,复制对象时需要指定源对象等。
我的开发环境为Visual Studio 2017 & AutoCAD 2014 & AutoCAD 2020。

  1. 点拾取
  • 实现方法

方式一

PromptPointResult retStPoint = ed.GetPoint(("请输入点"));

方式二

PromptPointOptions ppo = new PromptPointOptions("请输入点");
PromptPointResult retStPoint = ed.GetPoint(ppo);
  • 效果展示
  • 实例代码(获取手动交互的某点坐标,并标注)

类库

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;using Autodesk.AutoCAD.Runtime;
using Autodesk.AutoCAD.EditorInput;
using Autodesk.AutoCAD.ApplicationServices;
using Autodesk.AutoCAD.Geometry;
using Autodesk.AutoCAD.DatabaseServices;

代码

[CommandMethod("PointCreated")]
public void ComputePointCreate()
{Editor ed = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument.Editor;PromptPointResult retStPoint = ed.GetPoint(("获得起点坐标"));if (retStPoint.Status != PromptStatus.OK)return;DBPoint pt = new DBPoint(retStPoint.Value);Database db = HostApplicationServices.WorkingDatabase;using (Transaction trans = db.TransactionManager.StartTransaction()){BlockTable bt = trans.GetObject(db.BlockTableId, OpenMode.ForRead) as BlockTable;BlockTableRecord btr = trans.GetObject(bt[BlockTableRecord.ModelSpace],OpenMode.ForWrite) as BlockTableRecord;btr.AppendEntity(pt);trans.AddNewlyCreatedDBObject(pt, true);trans.Commit();}
}
  • 其他要素
    其它信息获取方法
  1. 选择集(读取鼠标框选选择集实体)
  • 实现方法
//获取用户框选的选择集对象
PromptSelectionResult pers = ed.GetSelection();
  • 实例代码(获取框选区的,线和多段线的数量)
    类库
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows.Forms;using Autodesk.AutoCAD.Runtime;
using Autodesk.AutoCAD.EditorInput;
using Autodesk.AutoCAD.ApplicationServices;
using Autodesk.AutoCAD.Geometry;
using Autodesk.AutoCAD.DatabaseServices;

代码

public Entity getEntityByObjId(Database db, ObjectId id)
{using (Transaction trans = db.TransactionManager.StartTransaction()){Entity dbo = trans.GetObject(id, OpenMode.ForRead) as Entity;trans.Commit();return dbo;}return null;
}[CommandMethod("ModelCreated")]
public void ComputeModelCreated()
{Database db = HostApplicationServices.WorkingDatabase;Editor ed = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument.Editor;//获取用户框选的选择集对象PromptSelectionResult pers = ed.GetSelection();if (pers.Status != PromptStatus.OK)//判断选择状态return;if (pers.Value == null)//判断选择集是否为空return;/*PromptEntityResult downEntity = ed.GetEntity("请选择起始线");if (downEntity.Status != PromptStatus.OK)return;*/List<DBText> textArray = new List<DBText>();//注记List<Line> lineArray = new List<Line>();//线段List<Polyline> polylineArray = new List<Polyline>();//轻量)多段线List<Polyline2d> poly2dArray = new List<Polyline2d>();//拟合曲线List<Spline> splineArray = new List<Spline>();//曲线List<Point3d> pointArray = new List<Point3d>();//存储线段的点位置//获取输入对象的id或实体ObjectId[] oids = pers.Value.GetObjectIds();for (int ii = 0; ii < oids.Length; ii++){ObjectId oid = oids[ii];Entity ent = getEntityByObjId(db, oid);if (ent == null)continue;if (ent is DBText){textArray.Add(ent as DBText);}else if (ent is Line){lineArray.Add(ent as Line);}else if (ent is Polyline){polylineArray.Add(ent as Polyline);}else if (ent is Polyline2d){poly2dArray.Add(ent as Polyline2d);}else if (ent is Spline){splineArray.Add(ent as Spline);}}MessageBox.Show("线段共有" + lineArray.Count + "多段线有" + polylineArray.Count);
}
  • 效果展示
  1. 访问CAD内部命令
  • 实现方式
    1)SendStringToExecute(.Net)
    2)SendCommand(COM方式)
    3)acedCommand( P/Invoke非托管C++函数)

  • 实现代码

[CommandMethod("CadCmdExecute")]
public void CadCmdExecute()
{//命令行动态执行语句Document doc = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument;//创建一个圆形圆形,并强制缩放视图至图形doc.SendStringToExecute("circle\n2,2,0\n4\n", true, false, true);doc.SendStringToExecute("zoom e\n", true, false, true);
}
  1. 总结
    喜欢的朋友们可以点个关注,后续将持续更新,精彩无限^ - ^

基于C#的AutoCAD二次开发之获取用户输入信息、选择集、访问CAD内部命令相关推荐

  1. 陈伯雄lisp_基于AutoLisp的AutoCAD二次开发自动生成系统图

    龙源期刊网 http://www.qikan.com.cn 基于 AutoLisp 的 AutoCAD 二次开发自动 生成系统图 作者:郎建山 金江 来源:<科技视界> 2013 年第 2 ...

  2. CAD自控lisp_基于AutoLisp的AutoCAD二次开发自动生成系统图

    基于 AutoLisp 的 AutoCAD 二次开发自动生成系统图 [摘 要]本文主要阐述了应用 autolisp 语言二次开发 autocad 自动生成系统图的实现方案. [关键词] autocad ...

  3. cass二次开发vba和lisp_基于VBA的AutoCAD二次开发及应用实例

    1引言本文引用地址:http://www.eepw.com.cn/article/190993.htm AutOCAD2005是AutOdesk公司的系列产品,该软件从其使用和设计思路上都秉承了工程制 ...

  4. 基于C#进行AutoCAD二次开发初探(二)——C#编写代码直接打开AutoCAD并显示图形

    AutoCAD 2006 Type Library   //我用的是CAD2006版 AutoCAD/ObiectDBX Common 16.0 Type Library 把这两个引用的命名空间引进来 ...

  5. 基于C#的AutoCAD二次开发之块操作

    基于C#的AutoCAD二次开发之块操作 什么是块? 块由多个在逻辑上相关的图形对象所定义的整体. 块的优点有哪些 统一作业标准.提高作业效率 压缩图形文件 便于修改和维护 块的分类 块的分类 简单块 ...

  6. lisp二次开发 微盘_基于AutoLISP的AutoCAD二次开发研究_郭秀娟.pdf

    2008 年 12 月 Journal of Jilin Architectural and Civil Engineering Institute Dec.2008 基于 AutoLISP 的 Au ...

  7. 基于C#进行AutoCAD二次开发初探(一)——调用dll库

    自己是测绘行业,不可避免要跟CAD打交道.因为之前用C#写了一个小软件,希望能够自动调用CAD画等高线,所以想基于C#进行Autocad的二次开发.但自己在此方面真的是零基础菜鸟一只.搜了大量的资料, ...

  8. AutoCAD二次开发(C#)完成后,如何实现CAD启动时自动加载dll(不必输入netload)?

    AutoCAD二次开发(C#)完成后,如何实现CAD启动时自动加载dll(不必输入netload)? 1.复制编译后的dll路径,比如我的是[C:\SectionManager_CAD_1.1_031 ...

  9. NX二次开发-UFUN获取工程图详细信息UF_DRAW_ask_drawing_info

    NX二次开发-UFUN获取工程图详细信息UF_DRAW_ask_drawing_info NX9+VS2012#include <uf.h> #include <uf_draw.h& ...

最新文章

  1. 多线程下HashMap的死循环
  2. linux 内存清理 释放命令,Linux系统中的内存清理和释放命令总结
  3. Java黑皮书课后题第3章:*3.33(金融:比较成本)假设你要通过两种不同的包裹运输大米。你可能会编写一个程序来比较成本,该程序提示用户输入每个包裹的重量和价格,然后显示具有更优惠的包裹
  4. sklearn学习_01
  5. linux上安装activeMQ
  6. ASP.NET Core 3.0中使用动态控制器路由
  7. windows下, nginx 提示错误 No input file specified
  8. 如何使用HTML5嵌入视频
  9. iOS11 获取手机已安装应用列表
  10. python中定义类的关键字_在Python中,定义一个类使用什么关键字?
  11. visual studio输入法打不了中文_(四)让人纠结的双拼输入法,以及承载它的那些输入法们(下)...
  12. 基于差分分级和关联规则挖掘的气象数据关联性分析实战
  13. matlab2016a最新安装教程
  14. MIMO的信道容量以及实现
  15. LinuxProbe 0x21 使用Ansible服务实现自动化运维
  16. Spring Boot学习案例开源项目
  17. python搞笑梗_豆瓣9.1、刷爆朋友圈,知道这3个梗就够了
  18. Matlab滤波器设计示例
  19. 皮肤黑的人穿什么颜色的衣服比较好
  20. 人类动作识别数据集AVA

热门文章

  1. A - Mio visits ACGN Exhibition(dp)
  2. 不应该在MacBook上贴贴纸的原因和移除贴纸的办法
  3. 【力扣每日一题】691. 贴纸拼词
  4. Maya常用命令及建模工具包
  5. 【Elasticsearch教程21】分页查询以及Array数组排序 nested排序 详细案例
  6. 微信头像可以加挂件了,快试试
  7. Twisted学习(三)---------------Deferred介绍
  8. 相机中的HDR、WDR和EDR分别指的是什么?
  9. 地图绘制初探——基于maptalks的2.5D地图绘制
  10. php中法兰克福的时区,法兰克福三大购物中心 | Global Blue