AutoCAD二次开发多个实体Jig拖拽(步骤模拟)

2023-10-28 13:50

本文主要是介绍AutoCAD二次开发多个实体Jig拖拽(步骤模拟),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

值中秋之际,和小伙伴出去后,借点时间看一下关于多实体实时拖拽效果(jig),在AutoCAD中,通过鼠标的移动,动态的展示效果会给绘图者直观的感觉。在AutoCAD中关于拖拽有两个实现类,第一是EntityJig,另外一个是DrawJig类。其中前者只能针对一个实体,而另外一个是针对多个实体,可以实现拖拽效果。而对于前者者继承类中需要实现Sampler和Updata两个函数,Sampler用于数据的交互,比如提示用户输入一定的数据,Updata是用于接收数据后在图形界面实时更新。同EntityJig类,DrawJig也需要重写Samper函数,另外该类中含有WorldDraw函数需要重写,用于实时展示动态图形效果。

下面的这个测试demo是在图形界面拾取多个实体,然后再指定另外一个移动点,在Samper函数中提示用户拾取,将拾取的多个实体在WorldDraw中实时展示出来。整个工程的源代码如下所示。其中我们制作一个效果视屏。


这是jig实现类:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Autodesk.AutoCAD.EditorInput;
using Autodesk.AutoCAD.DatabaseServices;
using Autodesk.AutoCAD.Geometry;
using Autodesk.AutoCAD.GraphicsInterface;namespace MoveMultipleEntityJig
{public  class JigMoveMultipleEntity : DrawJig{private Point3d mBase;private Point3d mLocation;List<Entity> mEntities;public JigMoveMultipleEntity(Point3d basePt){mBase = basePt.TransformBy(UCS);mEntities = new List<Entity>();}public Point3d Base{get { return mLocation; }set { mLocation = value; }}public Point3d Location{get { return mLocation; }set { mLocation = value; }}public Matrix3d UCS{get{return Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument.Editor.CurrentUserCoordinateSystem;}}public void AddEntity(Entity ent){mEntities.Add(ent);}public void TransformEntities(){Matrix3d mat = Matrix3d.Displacement(mBase.GetVectorTo(mLocation));foreach (Entity ent in mEntities){ent.TransformBy(mat);}}protected override SamplerStatus Sampler(JigPrompts prompts){JigPromptPointOptions prOptions1 = new JigPromptPointOptions("\n新的位置:");prOptions1.UseBasePoint = false;PromptPointResult prResult1 = prompts.AcquirePoint(prOptions1);if (prResult1.Status == PromptStatus.Cancel || prResult1.Status == PromptStatus.Error)return SamplerStatus.Cancel;if (!mLocation.IsEqualTo(prResult1.Value, new Tolerance(10e-10, 10e-10))){mLocation = prResult1.Value;return SamplerStatus.OK;}elsereturn SamplerStatus.NoChange;}protected override bool WorldDraw(Autodesk.AutoCAD.GraphicsInterface.WorldDraw draw){Matrix3d mat = Matrix3d.Displacement(mBase.GetVectorTo(mLocation));WorldGeometry geo = draw.Geometry;if (geo != null){geo.PushModelTransform(mat);foreach (Entity ent in mEntities){geo.Draw(ent);}geo.PopModelTransform();}return true;}}
}

这是使用的代码;

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Autodesk.AutoCAD.DatabaseServices;
using Autodesk.AutoCAD.EditorInput;
using Autodesk.AutoCAD.Runtime;namespace MoveMultipleEntityJig
{public class Class1{public static JigMoveMultipleEntity jigger;[CommandMethod("tsjig")]public static void demo(){try{Database db = HostApplicationServices.WorkingDatabase;Editor ed = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument.Editor;PromptSelectionResult selRes = ed.GetSelection();if (selRes.Status != PromptStatus.OK) return;PromptPointOptions prOpt = new PromptPointOptions("\n选择基点:");PromptPointResult pr = ed.GetPoint(prOpt);if (pr.Status != PromptStatus.OK) return;jigger = new JigMoveMultipleEntity(pr.Value);using (Transaction tr = db.TransactionManager.StartTransaction()){foreach (ObjectId id in selRes.Value.GetObjectIds()){Entity ent = (Entity)tr.GetObject(id, OpenMode.ForWrite);jigger.AddEntity(ent);}PromptResult jigRes = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument.Editor.Drag(jigger);if (jigRes.Status == PromptStatus.OK){jigger.TransformEntities();tr.Commit();}elsetr.Abort();}}catch (System.Exception ex){Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument.Editor.WriteMessage(ex.ToString());}}}
}

                                                                              更多内容,请关注公众号

                                                                     

这篇关于AutoCAD二次开发多个实体Jig拖拽(步骤模拟)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/293631

相关文章

IDEA中新建/切换Git分支的实现步骤

《IDEA中新建/切换Git分支的实现步骤》本文主要介绍了IDEA中新建/切换Git分支的实现步骤,通过菜单创建新分支并选择是否切换,创建后在Git详情或右键Checkout中切换分支,感兴趣的可以了... 前提:项目已被Git托管1、点击上方栏Git->NewBrancjsh...2、输入新的分支的

Visual Studio 2022 编译C++20代码的图文步骤

《VisualStudio2022编译C++20代码的图文步骤》在VisualStudio中启用C++20import功能,需设置语言标准为ISOC++20,开启扫描源查找模块依赖及实验性标... 默认创建Visual Studio桌面控制台项目代码包含C++20的import方法。右键项目的属性:

python删除xml中的w:ascii属性的步骤

《python删除xml中的w:ascii属性的步骤》使用xml.etree.ElementTree删除WordXML中w:ascii属性,需注册命名空间并定位rFonts元素,通过del操作删除属... 可以使用python的XML.etree.ElementTree模块通过以下步骤删除XML中的w:as

java向微信服务号发送消息的完整步骤实例

《java向微信服务号发送消息的完整步骤实例》:本文主要介绍java向微信服务号发送消息的相关资料,包括申请测试号获取appID/appsecret、关注公众号获取openID、配置消息模板及代码... 目录步骤1. 申请测试系统2. 公众号账号信息3. 关注测试号二维码4. 消息模板接口5. Java测试

Mac系统下卸载JAVA和JDK的步骤

《Mac系统下卸载JAVA和JDK的步骤》JDK是Java语言的软件开发工具包,它提供了开发和运行Java应用程序所需的工具、库和资源,:本文主要介绍Mac系统下卸载JAVA和JDK的相关资料,需... 目录1. 卸载系统自带的 Java 版本检查当前 Java 版本通过命令卸载系统 Java2. 卸载自定

Python UV安装、升级、卸载详细步骤记录

《PythonUV安装、升级、卸载详细步骤记录》:本文主要介绍PythonUV安装、升级、卸载的详细步骤,uv是Astral推出的下一代Python包与项目管理器,主打单一可执行文件、极致性能... 目录安装检查升级设置自动补全卸载UV 命令总结 官方文档详见:https://docs.astral.sh/

Python pip下载包及所有依赖到指定文件夹的步骤说明

《Pythonpip下载包及所有依赖到指定文件夹的步骤说明》为了方便开发和部署,我们常常需要将Python项目所依赖的第三方包导出到本地文件夹中,:本文主要介绍Pythonpip下载包及所有依... 目录步骤说明命令格式示例参数说明离线安装方法注意事项总结要使用pip下载包及其所有依赖到指定文件夹,请按照以

使用jenv工具管理多个JDK版本的方法步骤

《使用jenv工具管理多个JDK版本的方法步骤》jenv是一个开源的Java环境管理工具,旨在帮助开发者在同一台机器上轻松管理和切换多个Java版本,:本文主要介绍使用jenv工具管理多个JD... 目录一、jenv到底是干啥的?二、jenv的核心功能(一)管理多个Java版本(二)支持插件扩展(三)环境隔

java对接海康摄像头的完整步骤记录

《java对接海康摄像头的完整步骤记录》在Java中调用海康威视摄像头通常需要使用海康威视提供的SDK,下面这篇文章主要给大家介绍了关于java对接海康摄像头的完整步骤,文中通过代码介绍的非常详细,需... 目录一、开发环境准备二、实现Java调用设备接口(一)加载动态链接库(二)结构体、接口重定义1.类型

SpringBoot3中使用虚拟线程的完整步骤

《SpringBoot3中使用虚拟线程的完整步骤》在SpringBoot3中使用Java21+的虚拟线程(VirtualThreads)可以显著提升I/O密集型应用的并发能力,这篇文章为大家介绍了详细... 目录1. 环境准备2. 配置虚拟线程方式一:全局启用虚拟线程(Tomcat/Jetty)方式二:异步