- 积分
- 5043
- 明经币
- 个
- 注册时间
- 2015-8-18
- 在线时间
- 小时
- 威望
-
- 金钱
- 个
- 贡献
-
- 激情
-
|
本帖最后由 你有种再说一遍 于 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是单线程数据库,它没有行锁或者叫图元锁,那我们能不能制作一个多线程数据库呢?
当然可以了,毕竟伪多线程好过没有.
上面的索引也是单线程,可以把它做成多线程,我们还有自己的四叉树,四叉树每个节点也搜索也是可以并行执行,这样处理百万图元才有效果,不过嘛,我们真有那么多图元嘛...
除了要修改数据库的时候出现串行,其他的搜索环节多线程简直加大分...
举个例子:
你要做全图的一百万根断线合并,先建设一个全图多段线和直线的索引,把两种图元加入四叉树,分别并行查找谁和谁靠近的...最后串行把共点图元组合起来.
|
评分
-
查看全部评分
|