034集——JIG效果实现(橡皮筋效果)(CAD—C#二次开发入门)

可实现效果如下(对象捕捉F3需打开,否则效果不好):

   public class CircleJig : EntityJig{public static void DraCJig(){PromptPointResult ppr = Z.ed.GetPoint("a");if (ppr.Value == null) return;Point3d pt = ppr.Value;CircleJig circle = new CircleJig(pt);Polyjig poly = new Polyjig(pt);for (; ; ){PromptResult resJig = Z.ed.Drag(circle);//拖动圆if (resJig.Status == PromptStatus.Cancel){return;}if (resJig.Status == PromptStatus.OK) //确定, 则将圆添加到数据库// if (resJigpl.Status == PromptStatus.OK){Z.db.AddEntityToModeSpace(circle.GetEntity());//画圆break;}return;}for (; ; )//画完圆继续jig线,不需要可注释{PromptResult resJigpl = Z.ed.Drag(poly);//拖动线if (resJigpl.Status == PromptStatus.Cancel)// 放弃, 则退出.{return;}if (resJigpl.Status == PromptStatus.OK)  //确定, 则将线添加到数据库{Z.db.AddEntityToModeSpace(poly.Updata());//画多段线break;}return;}}// private Point3d jCenter; // 圆心private double jRadius;  // 半径public CircleJig(Point3d center): base(new Circle())  // 继承父类Circle的属性{((Circle)Entity).Center = center;  // Entity 转化为Cirecle 对象 复制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;}}public class Polyjig : Autodesk.AutoCAD.EditorInput.DrawJig{public Point3d location;public Point3d basePoint;public Polyline polyine = new Polyline();public Plane plane = new Plane();public int index;public static void DrawPLJig(){PromptPointResult ppr = Z.ed.GetPoint("a");if (ppr.Value == null) return;Point3d pt = ppr.Value;Polyjig poly = new Polyjig(pt);for (; ; ){PromptResult resJigpl = Z.ed.Drag(poly);//拖动线       if (resJigpl.Status == PromptStatus.Cancel) // 放弃, 则退出.{return;}if (resJigpl.Status == PromptStatus.OK) //确定, 则将线添加到数据库{Z.db.AddEntityToModeSpace(poly.Updata());//画多段线break;}return;}}public Polyjig(Point3d basept){location = basept;basePoint = basept;polyine.AddVertexAt(0, basePoint.Convert2d(plane), 0, 0, 0);polyine.AddVertexAt(1, location.Convert2d(plane), 0, 0, 0);}protected override SamplerStatus Sampler(JigPrompts prompts){var opts = new JigPromptPointOptions("\n 输入下一个点");opts.UserInputControls = (UserInputControls.Accept3dCoordinates |UserInputControls.NoZeroResponseAccepted| UserInputControls.NoNegativeResponseAccepted);var res = prompts.AcquirePoint(opts);if (res.Value != location){location = res.Value;}else{return SamplerStatus.NoChange;}if (res.Status == PromptStatus.Cancel){return SamplerStatus.Cancel;}else{return SamplerStatus.OK;}}protected override bool WorldDraw(Autodesk.AutoCAD.GraphicsInterface.WorldDraw draw){Updata();draw.Geometry.Draw(polyine);return true;}public Polyline Updata(){index = polyine.NumberOfVertices - 1;polyine.SetPointAt(index, location.Convert2d(plane));basePoint = location;return polyine;}}

其他形式:

using Autodesk.AutoCAD.DatabaseServices;
using Autodesk.AutoCAD.EditorInput;
using Autodesk.AutoCAD.Geometry;namespace UseEntityJig
{class CircleJig : EntityJig{private Point3d m_CenterPt;public double m_Radius = 100.0;// 派生类的构造函数.public CircleJig(Vector3d normal): base(new Circle()){((Circle)Entity).Center = m_CenterPt;((Circle)Entity).Normal = normal;((Circle)Entity).Radius = m_Radius;}protected override bool Update(){((Circle)Entity).Center = m_CenterPt;((Circle)Entity).Radius = m_Radius;return true;}protected override SamplerStatus Sampler(JigPrompts prompts){// 定义一个点拖动交互类.JigPromptPointOptions optJig = new JigPromptPointOptions("\n请指定圆的圆心或用右键修改半径");optJig.Keywords.Add("100");optJig.Keywords.Add("200");optJig.Keywords.Add("300");optJig.UserInputControls = UserInputControls.Accept3dCoordinates;// 用AcquirePoint函数得到用户输入的点.PromptPointResult resJigDis = prompts.AcquirePoint(optJig);Point3d curPt = resJigDis.Value;if (resJigDis.Status == PromptStatus.Cancel){return SamplerStatus.Cancel;}if (resJigDis.Status == PromptStatus.Keyword){switch (resJigDis.StringResult){case "100":m_Radius = 100;return SamplerStatus.NoChange;case "200":m_Radius = 200;return SamplerStatus.NoChange;case "300":m_Radius = 300;return SamplerStatus.NoChange;}}if (m_CenterPt != curPt){// 保存当前点.m_CenterPt = curPt;return SamplerStatus.OK;}else{return SamplerStatus.NoChange;}}// GetEntity函数用于得到派生类的实体.public Entity GetEntity(){return Entity;}}
}
using System;
using Autodesk.AutoCAD.ApplicationServices;
using Autodesk.AutoCAD.DatabaseServices;
using Autodesk.AutoCAD.EditorInput;
using Autodesk.AutoCAD.Geometry;
using Autodesk.AutoCAD.GraphicsInterface;
using Autodesk.AutoCAD.Runtime;namespace UseEntityJig
{class EllipseJig : EntityJig{// 声明全局变量.private Point3d m_CenterPt, m_MajorPt;private Vector3d m_Normal, m_MajorAxis;private int m_PromptCounter;private double m_OtherAxisLength, m_RadiusRatio;private double m_StartAng, m_EndAng, m_ang1, m_ang2;// 派生类的构造函数.public EllipseJig(Point3d center, Vector3d vec): base(new Ellipse()){m_CenterPt = center;m_Normal = vec;}protected override bool Update(){if (m_PromptCounter == 0){// 第一次拖拽时,椭圆的半径比为1,屏幕上显示的是一个圆.m_RadiusRatio = 1;m_MajorAxis = m_MajorPt - m_CenterPt;m_StartAng = 0;m_EndAng = 2 * Math.PI;}else if (m_PromptCounter == 1){// 第二次拖拽时,修改了椭圆的半径比,屏幕上显示的是一个完整椭圆.m_RadiusRatio = m_OtherAxisLength / m_MajorAxis.Length;}else if (m_PromptCounter == 2){// 第三次拖拽时,修改了椭圆的起初角度,屏幕上显示的是一个终止角度为360度的椭圆弧.m_StartAng = m_ang1;}else if (m_PromptCounter == 3){// 第四次拖拽时,修改了椭圆的终止角度,屏幕上显示的是一个最终的椭圆弧.m_EndAng = m_ang2;}try{if (m_RadiusRatio < 1)// 更新椭圆的参数.((Ellipse)(Entity)).Set(m_CenterPt, m_Normal, m_MajorAxis, m_RadiusRatio, m_StartAng, m_EndAng);else{// 如另一条半轴长度超过椭圆弧长轴方向矢量的长度,则要重新定义椭圆弧长轴方向矢量的方向和长度.Vector3d mMajorAxis2 = m_MajorAxis.RotateBy(0.5 * Math.PI, Vector3d.ZAxis).DivideBy(1 / m_RadiusRatio);// 更新椭圆的参数.((Ellipse)(Entity)).Set(m_CenterPt, m_Normal, mMajorAxis2, 1 / m_RadiusRatio, m_StartAng, m_EndAng);}}catch{// 此处不需要处理.}return true;}protected override SamplerStatus Sampler(JigPrompts prompts){if (m_PromptCounter == 0){// 定义一个点拖动交互类.JigPromptPointOptions optJigPoint = new JigPromptPointOptions("\n请指定椭圆弧轴上一点");// 设置拖拽的光标类型.optJigPoint.Cursor = CursorType.RubberBand;// 设置拖动光标基点.optJigPoint.BasePoint = m_CenterPt;optJigPoint.UseBasePoint = true;// 用AcquirePoint函数得到用户输入的点.PromptPointResult resJigPoint = prompts.AcquirePoint(optJigPoint);Point3d curPt = resJigPoint.Value;if (curPt != m_MajorPt){// 保存当前点.m_MajorPt = curPt;}else{return SamplerStatus.NoChange;}if (resJigPoint.Status == PromptStatus.Cancel){return SamplerStatus.Cancel;}else{return SamplerStatus.OK;}}else if (m_PromptCounter == 1){// 定义一个距离拖动交互类.JigPromptDistanceOptions optJigDis = new JigPromptDistanceOptions("\n请指定另一条半轴的长度");// 设置对拖拽的约束:禁止输入零和负值.optJigDis.UserInputControls = UserInputControls.NoZeroResponseAccepted |UserInputControls.NoNegativeResponseAccepted;// 设置拖拽的光标类型.optJigDis.Cursor = CursorType.RubberBand;// 设置拖动光标基点.optJigDis.BasePoint = m_CenterPt;optJigDis.UseBasePoint = true;// 用AcquireDistance函数得到用户输入的距离值.PromptDoubleResult resJigDis = prompts.AcquireDistance(optJigDis);double radiusRatioTemp = resJigDis.Value;if (radiusRatioTemp != m_OtherAxisLength){// 保存当前距离值.m_OtherAxisLength = radiusRatioTemp;}else{return SamplerStatus.NoChange;}if (resJigDis.Status == PromptStatus.Cancel){return SamplerStatus.Cancel;}else{return SamplerStatus.OK;}}else if (m_PromptCounter == 2){// 设置椭圆弧0度基准角.double baseAng;Vector2d mMajorAxis2d = new Vector2d(m_MajorAxis.X, m_MajorAxis.Y);if (m_RadiusRatio < 1){baseAng = mMajorAxis2d.Angle;}else{baseAng = mMajorAxis2d.Angle + 0.5 * Math.PI;}// 设置系统变量“ANGBASE”.Application.SetSystemVariable("ANGBASE", baseAng);// 定义一个角度拖动交互类.JigPromptAngleOptions optJigAngle1 = new JigPromptAngleOptions("\n请指定椭圆弧的起始角度");// 设置拖拽的光标类型.optJigAngle1.Cursor = CursorType.RubberBand;// 设置拖动光标基点.optJigAngle1.BasePoint = m_CenterPt;optJigAngle1.UseBasePoint = true;// 用AcquireAngle函数得到用户输入的角度值.PromptDoubleResult resJigAngle1 = prompts.AcquireAngle(optJigAngle1);m_ang1 = resJigAngle1.Value;if (m_StartAng != m_ang1){// 保存当前角度值.m_StartAng = m_ang1;}else{return SamplerStatus.NoChange;}if (resJigAngle1.Status == PromptStatus.Cancel){return SamplerStatus.Cancel;}else{return SamplerStatus.OK;}}else if (m_PromptCounter == 3){// 定义一个角度拖动交互类.JigPromptAngleOptions optJigAngle2 = new JigPromptAngleOptions("\n请指定椭圆弧的终止角度");// 设置拖拽的光标类型.optJigAngle2.Cursor = CursorType.RubberBand;// 设置拖动光标基点.optJigAngle2.BasePoint = m_CenterPt;optJigAngle2.UseBasePoint = true;// 用AcquireAngle函数得到用户输入的角度值.PromptDoubleResult resJigAngle2 = prompts.AcquireAngle(optJigAngle2);m_ang2 = resJigAngle2.Value;if (m_EndAng != m_ang2){// 保存当前角度值.m_EndAng = m_ang2;}else{return SamplerStatus.NoChange;}if (resJigAngle2.Status == PromptStatus.Cancel){return SamplerStatus.Cancel;}else{return SamplerStatus.OK;}}else{return SamplerStatus.NoChange;}}// GetEntity函数用于得到派生类的实体.public Entity GetEntity(){return Entity;}// setPromptCounter过程用于控制不同的拖拽.public void setPromptCounter(int i){m_PromptCounter = i;}}
}

command

using Autodesk.AutoCAD.ApplicationServices;
using Autodesk.AutoCAD.DatabaseServices;
using Autodesk.AutoCAD.EditorInput;
using Autodesk.AutoCAD.Geometry;
using Autodesk.AutoCAD.Runtime;namespace UseEntityJig
{public class Command{[CommandMethod("jc")]public void JigCircleTest(){Editor ed = Application.DocumentManager.MdiActiveDocument.Editor;Matrix3d mt = ed.CurrentUserCoordinateSystem;Vector3d normal = mt.CoordinateSystem3d.Zaxis;CircleJig circleJig = new CircleJig(normal);for (; ; ){// 拖动PromptResult resJig = ed.Drag(circleJig);// 放弃, 则退出.if (resJig.Status == PromptStatus.Cancel){return;}// 确定, 则将圆添加到数据库if (resJig.Status == PromptStatus.OK){AppendEntity(circleJig.GetEntity());break;}}}[CommandMethod("JigEllipse")]public void JigEllipseTest(){Editor ed = Application.DocumentManager.MdiActiveDocument.Editor;Database db = Application.DocumentManager.MdiActiveDocument.Database;// 备份系统变量“ANGBASE”.object oldAngBase = Application.GetSystemVariable("ANGBASE");// 普通的点交互操作.PromptPointOptions optPoint = new PromptPointOptions("\n请指定椭圆弧的圆心:");PromptPointResult resPoint = ed.GetPoint(optPoint);if (resPoint.Status != PromptStatus.OK){return;}// 定义一个EntityJig派生类的实例.EllipseJig myJig = new EllipseJig(resPoint.Value, Vector3d.ZAxis);// 第一次拖拽.myJig.setPromptCounter(0);PromptResult resJig = ed.Drag(myJig);if (resJig.Status != PromptStatus.OK){return;}// 第二次拖拽.myJig.setPromptCounter(1);resJig = ed.Drag(myJig);if (resJig.Status != PromptStatus.OK){return;}// 第三次拖拽.myJig.setPromptCounter(2);resJig = ed.Drag(myJig);if (resJig.Status != PromptStatus.OK){return;}// 第四次拖拽.myJig.setPromptCounter(3);resJig = ed.Drag(myJig);if (resJig.Status != PromptStatus.OK){return;}AppendEntity(myJig.GetEntity());// 还原系统变量“ANGBASE”.Application.SetSystemVariable("ANGBASE", oldAngBase);}private ObjectId AppendEntity(Entity ent){ObjectId entId;Database db = HostApplicationServices.WorkingDatabase;using (Transaction trans = db.TransactionManager.StartTransaction()){BlockTable bt = (BlockTable)trans.GetObject(db.BlockTableId,OpenMode.ForRead);BlockTableRecord btr = (BlockTableRecord)trans.GetObject(bt[BlockTableRecord.ModelSpace], OpenMode.ForWrite);entId = btr.AppendEntity(ent);trans.AddNewlyCreatedDBObject(ent, true);trans.Commit();}return entId;}}
}

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

Softing工业将在纽伦堡SPS 2024上展示Ethernet-APL现场交换机

今年&#xff0c;Softing工业将在纽伦堡SPS贸易展览会上展示aplSwitch Field —— 一款先进的过程自动化解决方案。这款16端口以太网高级物理层&#xff08;APL&#xff09;现场交换机的防护等级高达IP30&#xff0c;可提供从应用到现场级别的无缝以太网连接&#xff0c;专为Ex…

鸿蒙UI开发——小图标的使用

1、前 言 鸿蒙SDK中为我们提供了大量的高质量内置图标&#xff0c;图标详见(https://developer.huawei.com/consumer/cn/design/harmonyos-symbol/) 图标资源一览&#xff1a; 除了基本的图标图形外&#xff0c;我们还可以支持图标的多种填充模式&#xff08;单色、多色、分层…

python3的基本数据类型:Dictionary(字典)的创建

一. 简介 本文开始简单学习一下 python3中的一种基本数据类型&#xff1a;Dictionary&#xff08;字典&#xff09;。 字典&#xff08;dictionary&#xff09;是Python中另一个非常有用的内置数据类型。 二. python3的基本数据类型&#xff1a;Dictionary&#xff08;字典&…

2024 年使用 Postman 调用 WebService 接口图文教程

使用 Postman 调用 WebService 接口图文教程

设计字符串类 运算符重载 C++实现 QT环境

问题&#xff1a;设计字符串类&#xff0c; 支持下面的操作 MyString s1; // 默认构造函数 MyString s2("hello"); // 含参构造函数 MyString s3(s1); // 传参构造函数 MyString s4(5, c); // 自定义构造函数 // 运算符重载 ! > < // 运算符重…

链表循环及差集相关算法题|判断循环双链表是否对称|两循环单链表合并成循环链表|使双向循环链表有序|单循环链表改双向循环链表|两链表的差集(C)

判断循环双链表是否对称 设计一个算法用于判断带头节点的循环双链表是否对称 算法思想 让left从左向右扫描&#xff0c;right从右向左扫描&#xff0c;直到它们指向同一个节点&#xff1a;left right 或相邻left->next right&#xff0c;或right->prev left&#x…

基于STM32的智能声控分类垃圾桶(论文+源码)

1系统的功能及方案设计 本次课题为基于STM32的智能声控分类垃圾桶&#xff0c;其系统整体架构如图2.1所示&#xff0c;整个系统包括了stm32f103单片机主控制器&#xff0c;LU-ASR01语音识别模块&#xff0c;WT588语音播报模块&#xff0c;舵机等器件&#xff0c;用户可以通过语…

华大单片机跑历程IO口被写保护怎么解决

一&#xff0c;说明 使用的单片机是HC32F460KETA华大单片机&#xff0c;使用的代码历程是小华单片机历程&#xff0c;具体历程在小华官网都可以找到。   在使用小华历程跑模拟IIC时&#xff0c;SCL时钟是有的&#xff0c;但是IO输入被LOCK了&#xff0c;所以在跑历程进行断点…

网络与通信实验一 网络协议分析

Wireshark的安装 https://www.wireshark.org/&#xff08;下载链接&#xff09; 具体安装步骤参考 安装步骤 点击即可自动跳转 安装后打开 输入ipconfig 选择ipv4网卡存在的设备&#xff08;我的电脑选择WiFi&#xff09; 过滤条件选择 icmp cmd下输入 ping www.baidu.com…

电脑网络丢包怎么排查优化

上网已经成为必不可少的一部分,无论是看视频、玩游戏还是办公,网络的稳定性直接影响到我们的体验。然而有时候会遇到一些问题,比如网页加载慢、视频卡顿、游戏掉线等。这些问题的背后,往往是因为网络丢包。 网络丢包检测工具分享 什么是网络丢包? 网络丢包,简单来说,就是…

从0开始学习Linux——进程管理

往期目录&#xff1a; 从0开始学习Linux——简介&安装 从0开始学习Linux——搭建属于自己的Linux虚拟机 从0开始学习Linux——文本编辑器 从0开始学习Linux——Yum工具 从0开始学习Linux——远程连接工具 从0开始学习Linux——文件目录 从0开始学习Linux——网络配置 从0开…

QT6.5+qt-quick+qml+cmake的Item布局学习

Item 是一个基础元素&#xff0c;它本身不会渲染任何东西&#xff0c;也不会提供一个窗口来显示其内容。Window 是一个可以显示内容的顶级元素&#xff0c;它通常会包含一个或多个子元素来构建用户界面。Item是全部QML可视化对象的根&#xff0c;所有可视化类型都由该类型派生出…

Cameralink转MIPI,Cameralink视频识别分析

CameraLink视频输入转MIPI极简方案&#xff0c;可直接输入到处理芯片中进行视频目标识别与跟踪

【算法】【优选算法】二分查找算法(下)

目录 一、852.⼭脉数组的峰顶索引1.1 二分查找1.2 暴力枚举 二、162.寻找峰值2.1 二分查找2.2 暴力枚举 三、153.寻找旋转排序数组中的最⼩值3.1 二分查找3.2 暴力枚举 四、LCR 173.点名4.1 二分查找4.2 哈希表4.3 暴力枚举4.4 位运算4.5 数学&#xff08;求和&#xff09; 一、…

递归函数学习 part1

一&#xff0c;初始递归&#xff1a;阶乘 1&#xff0c;原理 n的阶乘等于n乘以n-1的阶乘&#xff0c;而0的阶乘等于1. 2&#xff0c;代码展示 #include <iostream> using namespace std;int fact(int); int main() {cout<<fact(5);return 0; }int fact(int n) …

开源 - Ideal库 -获取特殊时间扩展方法(四)

书接上回&#xff0c;我们继续来分享一些关于特殊时间获取的常用扩展方法。 01、获取当前日期所在月的第一个指定星期几 该方法和前面介绍的获取当前日期所在周的第一天&#xff08;周一&#xff09;核心思想是一样的&#xff0c;只是把求周一改成求周几而已&#xff0c;当然其…

Python练习18

Python日常练习 题目&#xff1a; 请编fun函数&#xff0c;求44整型数组的主对角线元素的和。 说明&#xff1a; 如下图所示为一个44整型数组 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 测试用例&#xff1a; 1 2 3 4 5 6 7 8…

智防未戴帽,安全无死角

在追求高效与安全并重的现代工业环境中&#xff0c;员工佩戴安全帽作为最基本的防护措施&#xff0c;其重要性不言而喻。为了有效杜绝员工未佩戴安全帽的现象&#xff0c;我们提出了一套以AI视频分析与安全教育培训系统为核心的综合解决方案&#xff0c;旨在通过智能化手段与系…

C++ 优先算法 —— 四数之和(双指针)

目录 题目&#xff1a;四数之和 1. 题目解析 2. 算法原理 Ⅰ. 暴力枚举 Ⅱ. 双指针算法 不漏的处理&#xff1a; 去重处理&#xff1a; 3. 代码实现 Ⅰ. 暴力枚举 Ⅱ. 双指针算法 题目&#xff1a;四数之和 1. 题目解析 题目截图&#xff1a; 这道题与三数之和&am…

[vulnhub] Corrosion: 2

https://www.vulnhub.com/entry/corrosion-2,745/ 提示&#xff1a;枚举才是神 主机发现端口扫描 使用nmap扫描网段类存活主机 因为靶机是我最后添加的&#xff0c;所以靶机IP是6 &#xff0c;kali是10 nmap -sP 192.168.56.0/24 Starting Nmap 7.94SVN ( https://nmap.org ) …