- 积分
- 10908
- 明经币
- 个
- 注册时间
- 2015-8-18
- 在线时间
- 小时
- 威望
-
- 金钱
- 个
- 贡献
-
- 激情
-
|
本帖最后由 你有种再说一遍 于 2024-11-3 22:38 编辑
这个事件不是cad的,而是系统上面的,通过 System.IO.FileSystemWatcher事件进行监控文件的创建/修改/删除/重命名.
当我第一次看见新版c#的csproj文件,怎么保存一下就更新了包,就想知道它怎么实现的,结果巨简单.
可谓是人人都要会的技能,不然你跟写lisp的有什么差别呢?
通过监控文件,可以实现非常多的自动化场景,那些做国产cad的怎么没有实现这个呢?
想想,保存代码就自动编译然后载入.保存pgp就自动刷新命令栈.在飞诗编辑器保存lisp就自动载入cad.
监控注册表
https://segmentfault.com/a/1190000044982374
# 问题
## 跨线程
论坛的搜索有问题,分词器没有很好的切割.
搜不到"FileSystemWatcher",搜"监控"找到这个人之前发过帖子:
http://bbs.mjtd.com/forum.php?mo ... hlight=%BC%E0%BF%D8
他在监控事件执行期间进行直接打开dwg,此时出现FATAL ERROR(致命错误).
要解决这个问题,首先要理解这个问题的发生原因,
我们来模拟一次acad怎么开启的:
双击dwg,操作系统通过注册表的.dwg后缀名的exe位置,去获取启动器.exe路径,启动器去找寻acad.exe路径,然后acad.exe启动,启动器发送dwg路径给acad.exe,acad.exe打开dwg.
参考,注册表修改双击打开方式:https://www.cnblogs.com/JJBox/p/13929515.html
问题回来了,启动器发送dwg路径这一步和文件监控直接打开有什么不同呢?
答案就是启动器发送是消息,消息给到cad内部再自己处理,是异步任务,发送完之后没有它啥事了.
而在监控事件上面的cadOpen,就是你用了监控线程来打开文件,是跨线程操作,cad没做多线程,出现了内存不一致,然后给你炸了.
进程在打开文件的时候,要确保不是"打开状态中又打开文件",所以它必须是单线程的.
你们可以看到txt文本编辑器是通过打开多个进程实现不一样的操作.
也是早期acad R14为什么只支持单开,不支持多文档的原因.
只需要写一个异步任务就能打开了.
方案1,win32api.sendMessage("open dwgpath").
方案2,主线程子类化,通过监控管道通讯,实现不一样的消息队列,此时就可以阻塞并执行打开.
它们本质其实是一回事,因为win32api消息也进入的是进程的消息循环,不过拦截程度不一样,用win32api可能被其他插件拦截,例如我就喜欢拦截它,所以最好是方案2.
## 权限
如果监控文件事件失效,尤其是在win服务系统上面.
1,组策略:
win+r输入gpedit.msc,计算机配置 Windows设置-安全设置-本地策略-安全选项
a,以管理员模式批准运行所有管理员,禁用.
b,用于内置管理员账户的管理员批准模式,启用.
重启.
2,关闭Windowsdefender(防病毒软件)声誉保护,实时防护.
3,查看事件日志找到错误原因.
4,收集信息,更好获取差异:
遍历win服务信息
https://www.cnblogs.com/sunny3158/p/17250989.html
遍历硬件信息:
https://www.cnblogs.com/lenmom/p/8556611.html
# 功能
0x01 命令文件
我们就可以在修改事件上面监控pgp命令文件,
当pgp修改之后,发送命令"re-init 16",实现保存后就能使用.
0x02 颜色文件监控
https://www.cnblogs.com/JJBox/p/11610343.html
0x03 打印
其实不光是这样打印,而是全程自动化.
1,首先要制作标准目录,标准图框(可拉伸,但是块名要有共同前缀),然后标准图签(字段),制作它们是为了好搜索,达到O(1)时间复杂度.
2,用一个json储存打印人员和发送人员的邮箱.
3,然后发送给服务器:
服务器自动创建多个cad进程进行切割任务.
3.1,侦测程序可以先扫描说明,自动列举图集版本号(需要搜索《》书名号之间,要建设一个图集号数据库),然后看看是否最新,提示,实现自动审图某些部分.
注意,工作流途中进行分析项目,可能导致文件占用删不掉,并且多余的提示.你打开旧项目抄东西时候,岂不是多了很多提示.
3.2,进入最后一次校验目录和图签是否对应.
4,乱序单张打印,因为图名是PDF名,完成后通过目录序号合并PDF,发送到邮箱,给自己和他人检查.
5,邮箱等待回复:
邮件格式需要设计,如何提示收方呢?
指定编号的打印机,进行纸张打印...自适应打印不同纸张,获取当前打印机状态...纸张不足呢?
因为回复是带有项目名的,所以map可以找到,map缓存时间?
回复:"1",进行自适应打印一份.
回复:,"2,2"[份数,图号?序号?].
如果制图中,你又想检查平立剖的面号剖号.
可以制作一个json存储一个map用来校验.
选中图纸图签,右键新建索引,产生一个可超链接的图块.这样简化了超链接的使用,重点是出图时候校验索引是否存在断开冲突...
所以还需要什么个图纸集...万物皆可校验...越做越大...逃...
(完) |
评分
-
查看全部评分
|