- 积分
- 10502
- 明经币
- 个
- 注册时间
- 2015-8-18
- 在线时间
- 小时
- 威望
-
- 金钱
- 个
- 贡献
-
- 激情
-
|
本帖最后由 你有种再说一遍 于 2024-11-5 17:28 编辑
魔改系列-12自动化:文本化统计
我写了这篇的目的就是为了批量处理DWG...
[cad.net 获取cad和dwg的版本号](https://www.cnblogs.com/JJBox/p/18511807)
# 需求
我想实现监控磁盘获取全部图纸,统计每张图纸信息.(DWG/DXF/Revit工程文件)
我有很多DWG是上古时代传下来的,存在非常多的问题,需要跑一次磁盘,才能做下一步处理.
这样的目的是通过文本化查看统计信息,并且高效检索和查错.
我发现08版本保存07格式速度很快,但是遇到高版本DWG格式的话,还要部署最高版本CAD再保存07版.
天正数据,如果遇到什么都不处理.
其实这个功能改改就能全部转新.
突然感叹,懂了C#之后就是好,天马行空都能组织思路,技术栈只需要组织别人做过的,毕竟StackOverFlow都是C#做的,所以有什么不懂都可以搜搜世界最大的程序员问答网.
这分为统计和处理两个步骤,不要合在一起!!
例如你老大备份了东西,你反而把它弄坏了...
## 统计:
1,图层名乱码/文本乱码/字体名乱码.
2,稀有字体/缺失字体.
3,数量:块名/图层名/字体名.
4,统计缺失,外部参照引用是否找不到,打印线型是否不在工程文件夹内.
5,工程文件夹结构检查.
## 功能:
1,区域搜索,工程内的查找,这样查找替换就不需要人工开图纸,靠自动化完成.
## 处理:
1,批量保存DWG到07版.
2,全部制造预览图,使图库能够识别.
3,单行文字全部改为多行?
4,排版是否正确,批量把图框制作成块替换.
5,自动化构造布局.
## 制图:
1,链式标注检查.
2,目录/索引/图号/材质检查.
# 怎么不影响用户的前提下实现这个任务呢?
## 客户端:
那么怎么获取磁盘上面全部.DWG呢?
遍历是不可能遍历的,我选择Everything的原理,通过拦截磁盘,构造索引,再获取拦截日志,处理日志时候构造索引,你甚至可以基于Everything二次开发.
## 服务端:
打开图纸分析总是耗时的,为了尽量不影响用户,我采取零拷贝模式SocketAsyncEventArgs,发送给服务器,然后在服务器多开CAD进程(Acad有进程数限制,通过多Docker多Win多CAD来解决).
如果没有服务器呢?做个模式2,用本机服务部署.
## 数据库:
1,Lucene.NET来作为搜索引擎,但是锁机制问题,转入ElasticSearch更好.
2,按机器编号(主机名/网卡ID)来实现独立数据.
例如A机和B机拷贝了同一份图库,通过MD5给排除掉.
### Everything原理:
磁盘只能是NTFS.
1,遍历NTFS的MFT表,监控并构造索引(评论说这个并不快,但是我怀疑他技术不行,SIMD并行可以处理十亿数据的,肯定是秒级)
2,监控NTFS日志journal,对文件系统有修改的操作都被记录在了日志文件中.
3,字符串查找算法:BM算法
4,自己设计和制造索引文件,例如前缀树+倒序索引,能够使用SIMD的SOA结构,并行搜索等等.(不追求技巧直接用开源的Lucene.NET得了)
源自:
https://www.zhihu.com/question/22862246
有人用C++实现了:
https://www.cnblogs.com/xuanxu233/p/16083526.html
基于C#
https://www.zhihu.com/question/545642845 |
评分
-
查看全部评分
|