明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 512|回复: 3

[图形系统] 魔改系列-1关于dwg数据库索引和伪自定义图元

  [复制链接]
发表于 2023-11-28 18:38 来自手机 | 显示全部楼层 |阅读模式
本帖最后由 你有种再说一遍 于 2024-1-23 00:45 编辑

关于cad.net没有自定义图元怎么处理...那就造一个伪功能.
相信看过四叉树的朋友们已经知道了,四叉树可以制作碰撞检测,而其中最厉害的方式是快速过滤某些图元.那么其实我们经常需要的自定义图元,其目的也是为了过滤,进行快速选择.




怎么做呢?先等等...mysql的b+树目的是什么?
答案是可以更有效的制作更多索引呀.


所以把"自定义图元"名字加入一个字典,把它拥有的子图元id们加入value,是不是就是一种快速索引的方式了.
在什么地方加索引呢?
那就需要构造一系列图元反应器了:
在加入图元事件上面加,
在移除图元事件上面删,
在撤销事件上面也做处理.


标注链式选择功能就可以改为,从这个字典上面获取图元集合了,而不是每次再从四叉树上面获取,效率更快...而每次从四叉树进去的方式相当于就是mysql的回表方式.
那么标注链被修改了怎么办?通过图元修改反应器联
动修改就好了...
所以数据结构会被写成dict<自定义名,objectIds>(){{"dimLink",ids}{"圆形",ids}{"墙体",ids}...}
以及,加多二级四叉树索引...进行联合索引...


存在的问题如下:
问题1,
如果词典名key+图元集合value,那么这个value的类型用链表,10w个图元加入,就有20w个指针...这里需要用到一种特别的优化方式.
问题2,
存不存在一种方式跳过图元修改反应
器,例如组块命令时候,对于图元没有修改,但是被归类到块内.获取时候然后通过字典实现了一种"越权"访问图元.(或者c++有别样方式越权?尤其是cpp自定义图元无法被net归类时候存在出错可能)
问题3,
这样在画图的时候会归类到索引中,会拖慢速度,但是经过我们对于十万图元的理解,这样的方式影响不大.

为什么比较快?
那是因为在画图时候就归类了,不需要功能实现时遍历全图.

那么再深入一点,如果选中了子图元如何获取母图元呢?答案也是联动反应器,通过选择集反应器+xdata预留信息进行反向选择,反向选择有一个好处也是不需要重新进入四叉树回表.xdata里面储存前后两个图元的id,这样表现出来就是双向指针了.
这是一种什么手法呢?实际上我是想用倒序索引来处理这个问题的,不过因为dwg中附带索引头指针的方式过于"软",存在被lisp破坏的可能性,而前后图元被删除也能够被数据库自检清理掉.而且前后图元的方式也十分符合一些三维图元的标准.
不过这里并不需要跟我一样的方式做,或者你有更好的呢?


其中的一些小技巧可以通过ifox里面的《拉伸填充边界事件.cs》获知,尤其是联动反应器时候需要有全局事件和局部事件,需要设置标记去停止和卸载整个功能,需要有防止lisp破坏现场的事件...
实际上高版本还可以配合重定义夹点,而mo特性的功能之类的也可以自己写一个面板展示.
除了二维三维显示不一样的arx自定义图元功能之外,其他貌似还真的模拟七七八八了.




你们以为这样就完了吗?当然没有.
要是从数据库的构成来看,这个也只是单线程数据库的玩法.cad是单线程数据库,它没有行锁或者叫图元锁,那我们能不能制作一个多线程数据库呢?
当然可以了,毕竟伪多线程好过没有.
上面的索引也是单线程,可以把它做成多线程,我们还有自己的四叉树,四叉树每个节点也搜索也是可以并行执行,这样处理百万图元才有效果,不过嘛,我们真有那么多图元嘛...
除了要修改数据库的时候出现串行,其他的搜索环节多线程简直加大分...
举个例子:
你要做全图的一百万根断线合并,先建设一个全图多段线和直线的索引,把两种图元加入四叉树,分别并行查找谁和谁靠近的...最后串行把共点图元组合起来.




评分

参与人数 4明经币 +4 收起 理由
荣sir + 1
Bao_lai + 1 很给力!
utopio + 1 很给力!
和尚777 + 1 神马都是浮云

查看全部评分

发表于 2023-11-29 09:10 | 显示全部楼层
这种思路看来实现了
惊惊回归 cad.net 开发了吗
发表于 2023-12-1 16:33 | 显示全部楼层
不愧是惊佬
发表于 2023-12-11 15:45 | 显示全部楼层
惊惊大佬,前排围观!!!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2024-4-28 20:44 , Processed in 1.580102 second(s), 23 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表