基于C#的AutoCAD二次开发之获取用户输入信息、选择集、访问CAD内部命令
基于C#的AutoCAD二次开发之获取用户输入信息、选择集、访问CAD内部命令
在CAD创建图形对象时,经常需要和用户进行交互,例如:直线创建时需要用户输入起点和终点(或长度)信息,复制对象时需要指定源对象等。
我的开发环境为Visual Studio 2017 & AutoCAD 2014 & AutoCAD 2020。
- 点拾取
- 实现方法
方式一
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();}
}
- 其他要素
其它信息获取方法
- 选择集(读取鼠标框选选择集实体)
- 实现方法
//获取用户框选的选择集对象
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);
}
- 效果展示
- 访问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);
}
- 总结
喜欢的朋友们可以点个关注,后续将持续更新,精彩无限^ - ^
基于C#的AutoCAD二次开发之获取用户输入信息、选择集、访问CAD内部命令相关推荐
- 陈伯雄lisp_基于AutoLisp的AutoCAD二次开发自动生成系统图
龙源期刊网 http://www.qikan.com.cn 基于 AutoLisp 的 AutoCAD 二次开发自动 生成系统图 作者:郎建山 金江 来源:<科技视界> 2013 年第 2 ...
- CAD自控lisp_基于AutoLisp的AutoCAD二次开发自动生成系统图
基于 AutoLisp 的 AutoCAD 二次开发自动生成系统图 [摘 要]本文主要阐述了应用 autolisp 语言二次开发 autocad 自动生成系统图的实现方案. [关键词] autocad ...
- cass二次开发vba和lisp_基于VBA的AutoCAD二次开发及应用实例
1引言本文引用地址:http://www.eepw.com.cn/article/190993.htm AutOCAD2005是AutOdesk公司的系列产品,该软件从其使用和设计思路上都秉承了工程制 ...
- 基于C#进行AutoCAD二次开发初探(二)——C#编写代码直接打开AutoCAD并显示图形
AutoCAD 2006 Type Library //我用的是CAD2006版 AutoCAD/ObiectDBX Common 16.0 Type Library 把这两个引用的命名空间引进来 ...
- 基于C#的AutoCAD二次开发之块操作
基于C#的AutoCAD二次开发之块操作 什么是块? 块由多个在逻辑上相关的图形对象所定义的整体. 块的优点有哪些 统一作业标准.提高作业效率 压缩图形文件 便于修改和维护 块的分类 块的分类 简单块 ...
- lisp二次开发 微盘_基于AutoLISP的AutoCAD二次开发研究_郭秀娟.pdf
2008 年 12 月 Journal of Jilin Architectural and Civil Engineering Institute Dec.2008 基于 AutoLISP 的 Au ...
- 基于C#进行AutoCAD二次开发初探(一)——调用dll库
自己是测绘行业,不可避免要跟CAD打交道.因为之前用C#写了一个小软件,希望能够自动调用CAD画等高线,所以想基于C#进行Autocad的二次开发.但自己在此方面真的是零基础菜鸟一只.搜了大量的资料, ...
- AutoCAD二次开发(C#)完成后,如何实现CAD启动时自动加载dll(不必输入netload)?
AutoCAD二次开发(C#)完成后,如何实现CAD启动时自动加载dll(不必输入netload)? 1.复制编译后的dll路径,比如我的是[C:\SectionManager_CAD_1.1_031 ...
- NX二次开发-UFUN获取工程图详细信息UF_DRAW_ask_drawing_info
NX二次开发-UFUN获取工程图详细信息UF_DRAW_ask_drawing_info NX9+VS2012#include <uf.h> #include <uf_draw.h& ...
最新文章
- 多线程下HashMap的死循环
- linux 内存清理 释放命令,Linux系统中的内存清理和释放命令总结
- Java黑皮书课后题第3章:*3.33(金融:比较成本)假设你要通过两种不同的包裹运输大米。你可能会编写一个程序来比较成本,该程序提示用户输入每个包裹的重量和价格,然后显示具有更优惠的包裹
- sklearn学习_01
- linux上安装activeMQ
- ASP.NET Core 3.0中使用动态控制器路由
- windows下, nginx 提示错误 No input file specified
- 如何使用HTML5嵌入视频
- iOS11 获取手机已安装应用列表
- python中定义类的关键字_在Python中,定义一个类使用什么关键字?
- visual studio输入法打不了中文_(四)让人纠结的双拼输入法,以及承载它的那些输入法们(下)...
- 基于差分分级和关联规则挖掘的气象数据关联性分析实战
- matlab2016a最新安装教程
- MIMO的信道容量以及实现
- LinuxProbe 0x21 使用Ansible服务实现自动化运维
- Spring Boot学习案例开源项目
- python搞笑梗_豆瓣9.1、刷爆朋友圈,知道这3个梗就够了
- Matlab滤波器设计示例
- 皮肤黑的人穿什么颜色的衣服比较好
- 人类动作识别数据集AVA
热门文章
- A - Mio visits ACGN Exhibition(dp)
- 不应该在MacBook上贴贴纸的原因和移除贴纸的办法
- 【力扣每日一题】691. 贴纸拼词
- Maya常用命令及建模工具包
- 【Elasticsearch教程21】分页查询以及Array数组排序 nested排序 详细案例
- 微信头像可以加挂件了,快试试
- Twisted学习(三)---------------Deferred介绍
- 相机中的HDR、WDR和EDR分别指的是什么?
- 地图绘制初探——基于maptalks的2.5D地图绘制
- php中法兰克福的时区,法兰克福三大购物中心 | Global Blue