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

相关文章

vite搭建vue3项目的搭建步骤

《vite搭建vue3项目的搭建步骤》本文主要介绍了vite搭建vue3项目的搭建步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学... 目录1.确保Nodejs环境2.使用vite-cli工具3.进入项目安装依赖1.确保Nodejs环境

Nginx搭建前端本地预览环境的完整步骤教学

《Nginx搭建前端本地预览环境的完整步骤教学》这篇文章主要为大家详细介绍了Nginx搭建前端本地预览环境的完整步骤教学,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录项目目录结构核心配置文件:nginx.conf脚本化操作:nginx.shnpm 脚本集成总结:对前端的意义很多

Linux云服务器手动配置DNS的方法步骤

《Linux云服务器手动配置DNS的方法步骤》在Linux云服务器上手动配置DNS(域名系统)是确保服务器能够正常解析域名的重要步骤,以下是详细的配置方法,包括系统文件的修改和常见问题的解决方案,需要... 目录1. 为什么需要手动配置 DNS?2. 手动配置 DNS 的方法方法 1:修改 /etc/res

使用EasyPoi快速导出Word文档功能的实现步骤

《使用EasyPoi快速导出Word文档功能的实现步骤》EasyPoi是一个基于ApachePOI的开源Java工具库,旨在简化Excel和Word文档的操作,本文将详细介绍如何使用EasyPoi快速... 目录一、准备工作1、引入依赖二、准备好一个word模版文件三、编写导出方法的工具类四、在Export

Ubuntu向多台主机批量传输文件的流程步骤

《Ubuntu向多台主机批量传输文件的流程步骤》:本文主要介绍在Ubuntu中批量传输文件到多台主机的方法,需确保主机互通、用户名密码统一及端口开放,通过安装sshpass工具,准备包含目标主机信... 目录Ubuntu 向多台主机批量传输文件1.安装 sshpass2.准备主机列表文件3.创建一个批处理脚

docker编写java的jar完整步骤记录

《docker编写java的jar完整步骤记录》在平常的开发工作中,我们经常需要部署项目,开发测试完成后,最关键的一步就是部署,:本文主要介绍docker编写java的jar的相关资料,文中通过代... 目录all-docker/生成Docker打包部署文件配置服务A的Dockerfile (a/Docke

Oracle数据库在windows系统上重启步骤

《Oracle数据库在windows系统上重启步骤》有时候在服务中重启了oracle之后,数据库并不能正常访问,下面:本文主要介绍Oracle数据库在windows系统上重启的相关资料,文中通过代... oracle数据库在Windows上重启的方法我这里是使用oracle自带的sqlplus工具实现的方

Java 单元测试之Mockito 模拟静态方法与私有方法最佳实践

《Java单元测试之Mockito模拟静态方法与私有方法最佳实践》本文将深入探讨如何使用Mockito来模拟静态方法和私有方法,结合大量实战代码示例,带你突破传统单元测试的边界,写出更彻底、更独立... 目录Mockito 简介:为什么选择它?环境准备模拟静态方法:打破“不可变”的枷锁传统困境解法一:使用M

Nginx部署HTTP/3的实现步骤

《Nginx部署HTTP/3的实现步骤》本文介绍了在Nginx中部署HTTP/3的详细步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学... 目录前提条件第一步:安装必要的依赖库第二步:获取并构建 BoringSSL第三步:获取 Nginx

SpringBoot路径映射配置的实现步骤

《SpringBoot路径映射配置的实现步骤》本文介绍了如何在SpringBoot项目中配置路径映射,使得除static目录外的资源可被访问,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一... 目录SpringBoot路径映射补:springboot 配置虚拟路径映射 @RequestMapp