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

相关文章

Java编译生成多个.class文件的原理和作用

《Java编译生成多个.class文件的原理和作用》作为一名经验丰富的开发者,在Java项目中执行编译后,可能会发现一个.java源文件有时会产生多个.class文件,从技术实现层面详细剖析这一现象... 目录一、内部类机制与.class文件生成成员内部类(常规内部类)局部内部类(方法内部类)匿名内部类二、

Linux系统配置NAT网络模式的详细步骤(附图文)

《Linux系统配置NAT网络模式的详细步骤(附图文)》本文详细指导如何在VMware环境下配置NAT网络模式,包括设置主机和虚拟机的IP地址、网关,以及针对Linux和Windows系统的具体步骤,... 目录一、配置NAT网络模式二、设置虚拟机交换机网关2.1 打开虚拟机2.2 管理员授权2.3 设置子

Spring Boot3虚拟线程的使用步骤详解

《SpringBoot3虚拟线程的使用步骤详解》虚拟线程是Java19中引入的一个新特性,旨在通过简化线程管理来提升应用程序的并发性能,:本文主要介绍SpringBoot3虚拟线程的使用步骤,... 目录问题根源分析解决方案验证验证实验实验1:未启用keep-alive实验2:启用keep-alive扩展建

Python下载Pandas包的步骤

《Python下载Pandas包的步骤》:本文主要介绍Python下载Pandas包的步骤,在python中安装pandas库,我采取的方法是用PIP的方法在Python目标位置进行安装,本文给大... 目录安装步骤1、首先找到我们安装python的目录2、使用命令行到Python安装目录下3、我们回到Py

基于Flask框架添加多个AI模型的API并进行交互

《基于Flask框架添加多个AI模型的API并进行交互》:本文主要介绍如何基于Flask框架开发AI模型API管理系统,允许用户添加、删除不同AI模型的API密钥,感兴趣的可以了解下... 目录1. 概述2. 后端代码说明2.1 依赖库导入2.2 应用初始化2.3 API 存储字典2.4 路由函数2.5 应

MySQL新增字段后Java实体未更新的潜在问题与解决方案

《MySQL新增字段后Java实体未更新的潜在问题与解决方案》在Java+MySQL的开发中,我们通常使用ORM框架来映射数据库表与Java对象,但有时候,数据库表结构变更(如新增字段)后,开发人员可... 目录引言1. 问题背景:数据库与 Java 实体不同步1.1 常见场景1.2 示例代码2. 不同操作

SpringBoot项目使用MDC给日志增加唯一标识的实现步骤

《SpringBoot项目使用MDC给日志增加唯一标识的实现步骤》本文介绍了如何在SpringBoot项目中使用MDC(MappedDiagnosticContext)为日志增加唯一标识,以便于日... 目录【Java】SpringBoot项目使用MDC给日志增加唯一标识,方便日志追踪1.日志效果2.实现步

Linux系统中配置静态IP地址的详细步骤

《Linux系统中配置静态IP地址的详细步骤》本文详细介绍了在Linux系统中配置静态IP地址的五个步骤,包括打开终端、编辑网络配置文件、配置IP地址、保存并重启网络服务,这对于系统管理员和新手都极具... 目录步骤一:打开终端步骤二:编辑网络配置文件步骤三:配置静态IP地址步骤四:保存并关闭文件步骤五:重

Pytorch微调BERT实现命名实体识别

《Pytorch微调BERT实现命名实体识别》命名实体识别(NER)是自然语言处理(NLP)中的一项关键任务,它涉及识别和分类文本中的关键实体,BERT是一种强大的语言表示模型,在各种NLP任务中显著... 目录环境准备加载预训练BERT模型准备数据集标记与对齐微调 BERT最后总结环境准备在继续之前,确

Python实现合并与拆分多个PDF文档中的指定页

《Python实现合并与拆分多个PDF文档中的指定页》这篇文章主要为大家详细介绍了如何使用Python实现将多个PDF文档中的指定页合并生成新的PDF以及拆分PDF,感兴趣的小伙伴可以参考一下... 安装所需要的库pip install PyPDF2 -i https://pypi.tuna.tsingh