CAD二次开发(5)-用户交互仿系统命令

在这里插入图片描述

在这里插入图片描述

1. 工具类:PromptTool.cs

using Autodesk.AutoCAD.EditorInput;
using Autodesk.AutoCAD.Geometry;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;namespace _04用户交互
{public static partial class PromptTool{/// <summary>/// 获取点/// </summary>/// <param name="ed">命令和对象</param>/// <param name="promptStr">提示信息</param>/// <returns>PromptPointResult</returns>public static PromptPointResult GetPoint2(this Editor ed, string promptStr){//声明一个获取点的提示类PromptPointOptions ppo = new PromptPointOptions(promptStr);//使回车和空格键有效ppo.AllowNone = true;return  ed.GetPoint(ppo);}/// <summary>/// 获取点或关键字/// </summary>/// <param name="ed">命令行</param>/// <param name="promptStr">提示显示</param>/// <param name="pointBase">基准点</param>/// <param name="keyWord">关键字</param>/// <returns>PromptPointResult</returns>public static PromptPointResult GetPoint(this Editor ed, string promptStr, Point3d pointBase, params string[] keyWord){//声明一个获取点的提示类PromptPointOptions ppo = new PromptPointOptions(promptStr);//使回车和空格键有效ppo.AllowNone = true;//添加字符,使得相应的字符按键有效for (int i = 0; i < keyWord.Length; i++){ppo.Keywords.Add(keyWord[i]);}//取消系统自动的关键字显示ppo.AppendKeywordsToMessage = false;//设置基准点ppo.BasePoint = pointBase;ppo.UseBasePoint = true;ppo.UseDashedLine = false;return ed.GetPoint(ppo);}}
}

2. Demo测试

 [CommandMethod("PromptDemo")]public void PromptDemo(){Database db = HostApplicationServices.WorkingDatabase;Editor ed = Application.DocumentManager.MdiActiveDocument.Editor;//PromptPointResult ppr =  ed.GetPoint("\n请选择一个点:");//if (ppr.Status == PromptStatus.OK)//{//    Point3d p1 = ppr.Value;//    ppr = ed.GetPoint("\n请选择第二个个点:");//    if (ppr.Status == PromptStatus.OK)//    {//        Point3d p2 = ppr.Value;//        db.AddLineToModelSpace(p1, p2);//    }//}Point3d p1 = new Point3d(0, 0, 0);Point3d p2 = new Point3d();PromptPointOptions ppo = new PromptPointOptions("请指定第一个点:");ppo.AllowNone = true;PromptPointResult ppr = GetPoint(ppo);if (ppr.Status == PromptStatus.Cancel) return;if (ppr.Status == PromptStatus.OK) p1 = ppr.Value;ppo.Message = "请指定第二个点";ppo.BasePoint = p1;ppo.UseBasePoint = true;ppr = GetPoint(ppo);if (ppr.Status == PromptStatus.Cancel) return;if (ppr.Status == PromptStatus.None) return;if (ppr.Status == PromptStatus.OK) p2 = ppr.Value;db.AddLineToModelSpace(p1, p2);}private PromptPointResult GetPoint(PromptPointOptions ppo){ppo.AllowNone = true;Editor ed = Application.DocumentManager.MdiActiveDocument.Editor;return ed.GetPoint(ppo);}

3. 仿系统直线命令

3.1 拖曳类的引入

using Autodesk.AutoCAD.DatabaseServices;
using Autodesk.AutoCAD.EditorInput;
using Autodesk.AutoCAD.Geometry;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;namespace _04用户交互
{public  class LineJig:EntityJig{private Point3d jStartPoint; //直线的起点private Point3d jEndPoint; //直线的终点private string jPromtStr; //提示信息private string[] jKeywords; //交互关键字/// <summary>/// 构造函数/// </summary>/// <param name="startPoint">起点</param>/// <param name="promtStr">提示信息</param>/// <param name="keywords">交互关键字</param>public LineJig(Point3d startPoint, string promtStr, string[] keywords): base(new Line()){jStartPoint = startPoint;((Line)Entity).StartPoint = jStartPoint;jPromtStr = promtStr;jKeywords = keywords;}protected override bool Update(){((Line)Entity).EndPoint = jEndPoint;return true;}protected override SamplerStatus Sampler(JigPrompts prompts){//声明提示信息类JigPromptPointOptions jppo = new JigPromptPointOptions(jPromtStr);//添加关键字for (int i = 0; i < jKeywords.Length; i++){jppo.Keywords.Add(jKeywords[i]);}char space = (char)32;jppo.Keywords.Add(space.ToString());//设置获取的信息类型jppo.UserInputControls = UserInputControls.Accept3dCoordinates;//取消系统自动添加的关键字提示信息jppo.AppendKeywordsToMessage = false;PromptPointResult pr = prompts.AcquirePoint(jppo);jEndPoint = pr.Value;return SamplerStatus.NoChange;}/// <summary>/// 返回图形对象/// </summary>/// <returns>Entity</returns>public Entity GetEntity(){return Entity;}}
}

3.2 测试实现

[CommandMethod("FangLine")]
public void FangLine()
{Database db = HostApplicationServices.WorkingDatabase;Editor ed = Application.DocumentManager.MdiActiveDocument.Editor;//声明一个直线的集合对象List<ObjectId> lineList = new List<ObjectId>();//声明一个预备的对象Point3d pointStart = new Point3d(100, 100, 0);Point3d pointPre = new Point3d(100, 100, 0);PromptPointResult ppr = ed.GetPoint2("\n 指定第一个点:");if (ppr.Status == PromptStatus.Cancel) return;if (ppr.Status == PromptStatus.None) pointPre = pointStart;if (ppr.Status == PromptStatus.OK) {pointStart = ppr.Value;pointPre = pointStart;}//判断循环是否继续bool isC = true;while (isC){if (lineList.Count > 1){ppr = ed.GetPoint("\n 指定下一点或 [闭合(C)/放弃(U)]:", pointPre, new string[] { "C","U" });}else{ppr = ed.GetPoint("\n 指定下一点或 [放弃(U)]", pointPre, new string[] { "U" });}Point3d pointNext;if (ppr.Status == PromptStatus.Cancel) return;if (ppr.Status == PromptStatus.None) return;if (ppr.Status == PromptStatus.OK){pointNext = ppr.Value;lineList.Add(db.AddLineToModelSpace(pointPre, pointNext));pointPre = pointNext;}if (ppr.Status == PromptStatus.Keyword){switch (ppr.StringResult){case "U":if (lineList.Count == 0){pointStart = new Point3d(100, 100, 0);pointPre = new Point3d(100, 100, 0);ppr = ed.GetPoint2("\n 指定第一个点:");if (ppr.Status == PromptStatus.Cancel) return;if (ppr.Status == PromptStatus.None) pointPre = pointStart;if (ppr.Status == PromptStatus.OK){pointStart = ppr.Value;pointPre = pointStart;}}else if (lineList.Count > 0){int count = lineList.Count;ObjectId lId = lineList.ElementAt(count-1);pointPre = this.GetLineStartPoint(lId);lineList.RemoveAt(count-1);lId.EraseEntity();}break;case "C":lineList.Add( db.AddLineToModelSpace(pointPre, pointStart));isC = false;break;}}}}[CommandMethod("FangLine2")]
public void FangLine2()
{Database db = HostApplicationServices.WorkingDatabase;Editor ed = Application.DocumentManager.MdiActiveDocument.Editor;//声明一个直线的集合对象List<ObjectId> lineList = new List<ObjectId>();//声明一个预备的对象Point3d pointStart = new Point3d(100, 100, 0);Point3d pointPre = new Point3d(100, 100, 0);PromptPointResult ppr = ed.GetPoint2("\n 指定第一个点:");if (ppr.Status == PromptStatus.Cancel) return;if (ppr.Status == PromptStatus.None) pointPre = pointStart;if (ppr.Status == PromptStatus.OK){pointStart = ppr.Value;pointPre = pointStart;}LineJig lineJig;PromptResult pr;//判断循环是否继续bool isC = true;while (isC){if (lineList.Count > 1){lineJig = new LineJig(pointPre, "\n 指定下一点或 [闭合(C)/放弃(U)]:", new string[] { "C", "U" });pr = ed.Drag(lineJig);}else{lineJig = new LineJig(pointPre, "\n 指定下一点或 [放弃(U)]", new string[] { "U" });pr = ed.Drag(lineJig);}if (pr.Status == PromptStatus.Cancel) return;if (pr.Status == PromptStatus.None) return;if (pr.Status == PromptStatus.OK){Line line = (Line)lineJig.GetEntity();pointPre = line.EndPoint;lineList.Add(db.AddEnityToModelSpace(line));}if (pr.Status == PromptStatus.Keyword){switch (pr.StringResult){case "U":if (lineList.Count == 0){pointStart = new Point3d(100, 100, 0);pointPre = new Point3d(100, 100, 0);ppr = ed.GetPoint2("\n 指定第一个点:");if (ppr.Status == PromptStatus.Cancel) return;if (ppr.Status == PromptStatus.None) pointPre = pointStart;if (ppr.Status == PromptStatus.OK){pointStart = ppr.Value;pointPre = pointStart;}}else if (lineList.Count > 0){int count = lineList.Count;ObjectId lId = lineList.ElementAt(count - 1);pointPre = this.GetLineStartPoint(lId);lineList.RemoveAt(count - 1);lId.EraseEntity();}break;case "C":lineList.Add(db.AddLineToModelSpace(pointPre, pointStart));isC = false;break;case  " ":isC = false;break;}}}}/// <summary>/// 获得直线的起点坐标/// </summary>/// <param name="lineId">直线对象的ObjectId</param>/// <returns></returns>private Point3d GetLineStartPoint(ObjectId lineId){Point3d startPoint;Database db = HostApplicationServices.WorkingDatabase;using (Transaction trans = db.TransactionManager.StartTransaction()){Line line = (Line)lineId.GetObject(OpenMode.ForRead);startPoint = line.StartPoint;}return startPoint;}

4. 仿系统圆命令

4.1 拖曳类的引入

using Autodesk.AutoCAD.DatabaseServices;
using Autodesk.AutoCAD.EditorInput;
using Autodesk.AutoCAD.Geometry;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using AcDotNetTool;
namespace _04用户交互
{public  class CircleJig:EntityJig{private double jRadius;public CircleJig(Point3d center): base(new Circle()){((Circle)Entity).Center = center;}//用于更新图形对象,这个更新属性是不需要使用事务处理protected override bool Update(){//动态更新园的半径if (jRadius > 0){((Circle)Entity).Radius = jRadius;}return true;}//这个函数的作用是当鼠标在屏幕上移动时,就会被调用,实现这个函数时,一般是用它改变的门图形的属性(我们在这个类里定义的属性)protected override SamplerStatus Sampler(JigPrompts prompts){//声明jig提示信息JigPromptPointOptions jppo = new JigPromptPointOptions("\n 请指定园上的一个点");char space = (char)32; jppo.Keywords.Add("U");jppo.Keywords.Add(space.ToString());jppo.UserInputControls = UserInputControls.Accept3dCoordinates;jppo.Cursor = CursorType.RubberBand;jppo.BasePoint = ((Circle)Entity).Center;jppo.UseBasePoint = true;//获取拖拽时鼠标的位置状态PromptPointResult ppr =  prompts.AcquirePoint(jppo);jRadius = ppr.Value.GetDistanceBetweenTwoPoint(((Circle)Entity).Center);return SamplerStatus.NoChange;}public Entity GetEntity(){return Entity;}}
}

4.2 测试实现

[CommandMethod("CircleDemo")]
public void CircleDemo()
{Database db = HostApplicationServices.WorkingDatabase;Editor ed = Application.DocumentManager.MdiActiveDocument.Editor;Point3d center = new Point3d();//double radius = 0;PromptPointResult ppr = ed.GetPoint("\n 请制定圆心:");if (ppr.Status == PromptStatus.OK){center = ppr.Value;}#region//PromptDistanceOptions pdo = new PromptDistanceOptions("\n 请指定圆上的一点:");//pdo.BasePoint = center;//pdo.UseBasePoint = true;//PromptDoubleResult pdr = ed.GetDistance(pdo);//if (pdr.Status == PromptStatus.OK)//{//    radius = pdr.Value;//}//db.AddCircleModelSpace(center, radius);#endregionCircleJig jCircle = new CircleJig(center);//PromptPointResult pr = (PromptPointResult)ed.Drag(jCircle);//if (pr.Status == PromptStatus.OK)//{//    Point3d pt = pr.Value;//    db.AddCircleModelSpace(center, pt.GetDistanceBetweenTwoPoint(center));//}PromptResult pr = ed.Drag(jCircle);if (pr.Status == PromptStatus.OK){db.AddEnityToModelSpace( jCircle.GetEntity());}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/16158.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

GEE26:批量导出逐日、逐月、逐季节和逐年的遥感影像(以NDVI为例)

影像导出 写在前面1.逐日数据导出2.逐月数据导出3.季节数据导出4.逐年数据导出 写在前面 最近很多小伙伴们私信我&#xff0c;问我如何高效导出遥感数据&#xff0c;从逐日到逐季度&#xff0c;我都有一套自己的方法&#xff0c;今天就来和大家分享一下&#xff01;   &#…

基于YOLOv8+PySide6的快递分类管理系统

1、背景 随着电子商务的飞速发展&#xff0c;快递行业所承受的数据处理需求愈发庞大。在这样的背景下&#xff0c;传统的手工分类方法已经显得力不从心&#xff0c;因其不仅耗时耗力&#xff0c;还存在着易出错的隐患。因此&#xff0c;迫切需要研发出一套高效而准确的自动化系…

多线程案例(线程池)

White graces&#xff1a;个人主页 &#x1f649;专栏推荐:Java入门知识&#x1f649; &#x1f649; 内容推荐:<计算坤是如何工作的>&#x1f649; &#x1f439;今日诗词:百年兴衰皆由人, 不由天&#x1f439; ⛳️点赞 ☀️收藏⭐️关注&#x1f4ac;卑微小博主&…

go 微服务框架kratos使用中间件的方法

一、中间件的概念 在go语言中&#xff0c;中间件是一种用于处理http请求的开发模式&#xff0c;允许开发人员在请求到达处理程序之前或之后执行特定的操作&#xff0c;如日志记录、身份验证、错误处理等。 中间件通常是一个函数&#xff0c;它接收一个 http.Handler 作为参数…

Ardupilot开源代码之Rover上路 - 后续4

Ardupilot开源代码之Rover上路 - 后续4 1. 源由2. 深度配置2.1 设置倒车按钮2.1.1 前进2.1.2 倒退 2.2 MP无法连接ESP82662.3 最小油门校准 3. 遗留&后续3.1 高精度编码器问题3.2 OV5647 720P30FPS 马赛克问题 4. 参考资料 1. 源由 开源项目最主要的问题就是所有配置是开放…

信息安全从运维到运营:CISAW安全运维方向

随着数据中心规模扩大&#xff0c;安全运维内生需要逐渐向安全运营进化&#xff0c;统一安全理念&#xff0c;提高服务意识&#xff0c;提升专业能力。安全运营是对安全运维的继承式发展&#xff0c;而不是颠覆&#xff0c;意味着以业务发展为基础&#xff0c;以事件核查为线索…

【gradle】MAC下用gradle构建部署springboot项目

MAC下用gradle构建部署springboot项目 前言下载安装配置gradle下载安装下载可能出现的问题 &#xff08;zsh: command not found: brew&#xff09; 配置环境变量配置国内下载源全局配置单个项目配置 通过idea构建项目构建后的项目结构 小结延伸 前言 好久以前就听说gradle了&…

RAG概述(一):RAG架构的演进

目录 概述 RAG核心步骤 Indexing索引 Retrieval检索 Generation生成​​​​​​​ Native RAG Advanced RAG Modular RAG 参考 概述 RAG&#xff1a;Retrieval-Augmented Generation 检索增强生成。 RAG通过结合LLMs的内在知识和外部数据库的非参数化数据&#xff…

与MySQL的初相遇

&#x1f30e;初识MySQL 注&#xff1a;本文SQL语句只为了验证猜想&#xff0c;不会也不要紧。 文章目录&#xff1a; MySql开端 认识数据库       什么是数据库       主流数据库       MySQL的本质 MySQL基础使用       连接mysql服务器     …

自动化您的任务——crewAI 初学者教程

今天&#xff0c;我写这篇文章是为了分享您开始使用一个非常流行的多智能体框架所需了解的所有信息&#xff1a;crewAI。 我将在这里或那里跳过一些内容&#xff0c;使本教程成为一个精炼的教程&#xff0c;概述帮助您入门的关键概念和要点 今天&#xff0c;我写这篇文章是为了…

easy-rule规则引擎使用

简介 轻量级的规则引擎&#xff0c;易于学习的api 简单来说&#xff0c;规则引擎就是一个函数&#xff1a;yf(x1,x2,…,xn) 将业务代码和业务规则分离&#xff0c;解耦业务决策和业务代码的绑定关系 入门示例 依赖引入 <dependency><groupId>org.jeasy</grou…

页面<html>上多了一个滚动条,定位发现是<body>里面多了一个id为trans-tooltip的div

现象分析&#xff1a; 页面根标签html多了一个滚动条&#xff0c;发现body里面多了一个id为trans-tooltip的div&#xff0c;虽然width为0&#xff0c;height为0&#xff0c;但是其子元素还是有高度&#xff0c;占据了空间&#xff0c;最终导致了滚动条&#xff1b; 根本原因&…

专业渗透测试 Phpsploit-Framework(PSF)框架软件小白入门教程(十三)

本系列课程&#xff0c;将重点讲解Phpsploit-Framework框架软件的基础使用&#xff01; 本文章仅提供学习&#xff0c;切勿将其用于不法手段&#xff01; 接上一篇文章内容&#xff0c;讲述如何进行Phpsploit-Framework软件的基础使用和二次开发。 我们&#xff0c;继续讲一…

Java面试题--JVM大厂篇(1-10)

引言&#xff1a; 在这个信息时代&#xff0c;对于准备进入大厂工作的朋友们来说&#xff0c;对于JVM&#xff08;Java虚拟机&#xff09;的掌握是面试中的一项重要内容。下面是一些精选的JVM面试题&#xff0c;希望对大家能有所帮助。 正文&#xff1a; 1. JVM有哪几种垃圾收…

[CISCN2024]-PWN:gostack解析(go语言程序,syscall)

查看保护 ida比较复杂&#xff0c;建议动调配合静态分析程序运行 这里函数返回不用leave和ret&#xff0c;而是利用add rsp和ret&#xff0c;所以要动调查看到底要覆盖哪里。 完整exp&#xff1a; from pwn import* pprocess(./gostack) syscall0x4616c9 pop_rax0x40f984 po…

GB报文中的Cseq值的注意点

一、 问题现象 【问题现象】NVR使用GB接三方平台发现倍速回放时&#xff0c; 【现场拓扑】现场拓扑如下 &#xff08;1&#xff09; NVR侧使用家用宽带的方式&#xff0c;通过国标跨公网接入三方平台。 图1.1&#xff1a;网络拓扑 二、 抓包分析 INVITE sip:420000004013200…

OpenAI安全系统负责人:从头构建视频生成扩散模型

作者 | Lilian Weng OneFlow编译 翻译&#xff5c;杨婷、宛子琳、张雪聃 题图由SiliconFlow MaaS平台生成 过去几年&#xff0c;扩散模型&#xff08;Diffusion models&#xff09;在图像合成领域取得了显著成效。目前&#xff0c;研究界已开始尝试更具挑战性的任务——将该技术…

深度学习Day-18:ResNet50V2算法实战与解析

&#x1f368; 本文为&#xff1a;[&#x1f517;365天深度学习训练营] 中的学习记录博客 &#x1f356; 原作者&#xff1a;[K同学啊 | 接辅导、项目定制] 要求&#xff1a; 根据本文Tensorflow代码&#xff0c;编写对应的Pytorch代码了解ResNetV2与ResNetV的区别 一、 基础…

【实战JVM】-基础篇-03-Java内存结构

【实战JVM】-基础篇-03-Java内存结构 1 运行时数据区1.1 总览1.2 程序计数器1.2.1 是否会内存溢出 1.3 java虚拟机栈1.3.1 栈帧的组成1.3.1.1 局部变量表1.3.1.2 操作数栈1.3.1.3 帧数据1.3.1.3.1 动态链接1.3.1.3.2 方法出口1.3.1.3.3 异常表 1.3.2 是否会内存溢出1.3.3 设置虚…

【神经网络结构可视化】使用 Visualkeras 可视化 Keras / TensorFlow 神经网络结构

文章目录 Visualkeras介绍下载安装代码示例1、导入必要的库2、创建VGG16神经网络模型3、可视化神经网络结构4、完整代码5、使用教程 可视化自己创建的神经网络结构1、导入要的库2、创建自己的神经网络模型3、可视化神经网络结构图4、完整代码 Visualkeras介绍 Visualkeras是一…