首页 > 其他分享 >cad.net 图元做块后保留绘图次序

cad.net 图元做块后保留绘图次序

时间:2024-07-26 13:08:31浏览次数:12  
标签:tr 次序 绘图 var net 图元 id objectIdList cad

今天水友在强有力提出一个问题,选中一部分对象,做成块后,绘图次序发生了变化,如何保留原来的绘图次序。

这是一个十分有用的问题,我以前从未考虑过此问题,于是我研究了一下,将结果分享给大家

 

1.验证

我先后在cad中创建了3条多段线(多段线设置宽度后可以很方便的看到绘图次序),这里命名为1、2、3,

然后我写了一个较为简单的做块代码,不考虑基点位置,代码如下

using var tr = new DBTrans();
var objectIdList = tr.CurrentSpace.OfType<ObjectId>().ToList();
if (objectIdList.Count == 0)
    return;
var drt = (DrawOrderTable)tr.CurrentSpace.DrawOrderTableId.GetObject(OpenMode.ForRead);
var btrId = tr.BlockTable.Add("*U", btr => { btr.DeepCloneEx(objectIdList.ToCollection()); });
tr.CurrentSpace.InsertBlock(Point3d.Origin, btrId);
foreach (var ent in objectIdList.GetObject<Entity>(OpenMode.ForWrite))
{
    ent.Erase();
}

此段代码使用了ifox,但我相信大家都能看懂它的主要逻辑,即拿到当前空间所有对象,克隆到一个新的块表记录中,然后做成块参照插入图纸中,然后将原来的图元删除

由于是测试使用所以此处未考虑锁定图层等问题。

经过测试我发现,无论我如何调整原图的顺序,块内对象绘图次序从最后到最前都是1->2->3

2.猜想

于是我猜想,新块表记录中的绘图次序应该与克隆的ObjectIdCollection中id的排列顺序一致,实际上从平时我们画图的时候,后画的对象总是在先画的对象上面,就可以判断出来

3.解决方案

那么既然克隆后的绘图次序,与ObjectIdCollection中id的排列顺序一致,那么我们只需要在克隆前对ObjectIdCollection中id按照绘图次序从后到前的顺序对id进行排序,就可以实现保留原来绘图次序的目的。

那么如何获得原来的绘图次序呢?

经查阅官方文档DrawOrderTable.GetSortHandle()(id)方法,可以获得一个handle,此handle并不对应数据库中的图元,仅使用其value值,value值越小,绘图次序越靠后

那么我们只需要获取id对应的此value值,然后按从小到大的顺序排序,再克隆即可

修改后的代码如下

using var tr = new DBTrans();
var objectIdList = tr.CurrentSpace.OfType<ObjectId>().ToList();
if (objectIdList.Count == 0)
    return;
var drt = (DrawOrderTable)tr.CurrentSpace.DrawOrderTableId.GetObject(OpenMode.ForRead);
var objectIdCollection = objectIdList.OrderBy(id => drt.GetSortHandle(id).Value).ToCollection();
var btrId = tr.BlockTable.Add("*U", btr => { btr.DeepCloneEx(objectIdCollection); });
tr.CurrentSpace.InsertBlock(Point3d.Origin, btrId);
foreach (var ent in objectIdList.GetObject<Entity>(OpenMode.ForWrite))
{
    ent.Erase();
}

增加了一行linq排序,并将排序后的ObjectIdCollection传入了克隆函数即可

 

标签:tr,次序,绘图,var,net,图元,id,objectIdList,cad
From: https://www.cnblogs.com/d1742647821/p/18325096

相关文章

  • 基于.NET开源、强大易用的短链生成及监控系统
    前言今天大姚给大家分享一个基于.NET开源(MITLicense)、免费、强大易用的短链生成及监控系统:SuperShortLink。项目介绍SuperShortLink是一个基于.NET开源(MITLicense)、免费、强大易用的短链生成及监控系统,包含了短URL的生成、短URL跳转长URL、短URL访问统计以及Web后台监控页面,......
  • Java NIO框架Netty教程(四)- ChannelBuffer
    在字符串消息收发中提到。ChannelBuffer是Netty中非常重要的概念。所有消息的收发都依赖于这个Buffer。我们通过Netty的官方的文档来了解一下,基于流的消息传递机制。Inastream-basedtransportsuchasTCP/IP,receiveddataisstoredintoasocketreceivebuffer.Unf......
  • Java NIO框架Netty教程(六)-Java NIO Selector模式
    全文详见个人独立博客:JavaNIO框架Netty教程(六)-JavaNIOSelector模式JavaNIO框架Netty教程(六)-JavaNIOSelector模式看到标题,您可能觉得,这跟Netty有什么关系呢?确实,如果你完全是使用Netty的,那么可能你可以完全不需要了解Selector。但是,不得不提的是,Netty底层关于NIO的实......
  • 如何将Python嵌入.Net?
    我尝试基于文档此处和此处使用pythonnet将Python嵌入到.Net中。这是我的代码Runtime.PythonDLL=@"D:\Dev\Console\.conda\python311.dll";PythonEngine.Initialize();dynamicsys=Py.Import("sys");Console.WriteLine("Pythonversion:&quo......
  • IIS同一站点下发布两个或多个net8、net core应用程序池
    IIS同一站点下布两个net8、netcore报“ASP.NETCoredoesnotsupportmultipleappsinthesameapppool”,意思是多个.netcore程序不支持同一个程序池。那我们手动在创建一个程序池,分给另一个应用程序就可以了。步骤如下:1、点击IIS“应用程序池”-》添加应用程序池 2、......
  • 如何获取Asp.NetCore当前启动地址
    在ASP.NETCore中获取当前启动地址,可以通过几种不同的方式来实现,具体取决于你的应用场景和可用的上下文。以下是一些常见的方法:1.使用HttpContext在控制器或中间件中,你可以通过HttpContext对象来获取当前请求的完整URL或主机地址。这是最直接的方法,因为HttpContext提供了对......
  • .NET 中使用依赖注入时,如果将 DbContext 注册为单例,会导致一些严重的问题
    在.NET中使用依赖注入时,如果将DbContext注册为单例,会导致一些严重的问题。DbContext设计为一个短生命周期的对象,通常与一个请求(在Web应用中)或一个单元操作(在桌面应用中)相对应。以下是将DbContext注册为单例会导致的问题:1.线程安全问题DbContext不是线程安全的,将其注......
  • netty入门-3 EventLoop和EventLoopGroup,简单的服务器实现
    文章目录EventLoop和EventLoopGroup服务器与客户端基本使用增加非NIO工人NioEventLoop处理普通任务与定时任务结语EventLoop和EventLoopGroup二者大概是什么这里不再赘述,前一篇已简述过。不理解也没关系。下面会简单使用,看了就能明白是什么这篇文章只说NioEvent......
  • netty入门-6 Handler和Pipeline
    前言书上讲服务器客户端创建三个要点,线程模型(Group),IO模型(NioSocketChannel),处理逻辑。这篇的Handler和Pipeline,就是我们IO操作的处理逻辑。然后下篇说ByteBuf这个Netty自己实现的数据封装组件。Handler和Pipeline我们主要谈论ChannelHandler和ChannelPipeline。前......
  • Profinet转ModbusTCP网关模块的配置与应用详解
    Profinet转ModbusTCP网关模块的配置与应用详解Profinet转ModbusTCP网关模块(XD-ETHPN20)是一种常见的工业通信设备,广泛应用于现代工业自动化系统中。通过使用Profinet转ModbusTCP网关模块(XD-ETHPN20)将Profinet协议转换成ModbusTCP协议,实现了不同网络之间的互联互通。这种网关设备......