明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 37188|回复: 97

[【高飞鸟】] 【DynamicLisp的高级应用】-- 对图神器(更新至2013.08.15)

    [复制链接]
发表于 2013-7-31 23:30:30 | 显示全部楼层 |阅读模式
本帖最后由 highflybir 于 2013-8-22 00:45 编辑

【DynamicLisp的高级应用】-- 对图神器

画图的时候,我们常常遇到要比较两个图纸的不同之处。
这时候,我们可以用
方法1: 把要比较的图插入进来或者外部参照近来,然后可能稍微改变一下颜色。这样就可以检查一下有哪些不同。
方法2: 两张图纸并排窗口,不时用放大缩小等命令,在两张图纸之间进行。
方法1的优点是视窗较大。但缺点是如果图形复杂了,会让人眼花缭乱。虽说高版本的CAD可以对参照图纸进行透明之类的调整,但不适合低版本。
方法2的的优点是可以不更改图纸内容。缺点是并排窗口会使得检测窗口较小,而且频繁在两个窗口之间进行放大缩小等命令,
效率不高。

针对方法2的缺点,我利用我以前的程序DynamicLisp中的钩子函数,编写了一个程序,使得在对图时候能做到两个图形的缩放比例同步变化。

用法: 并排两个要比较的图纸,两张图纸都加载此程序。在原图中输入命令: tt,然后激活要比较的图,再回到原图。那么,你就可以看到效果了。
在原图中的视窗的任何比例缩放或平移变换,都会在要比较的图中同步出来。

另外,我同时用ARX编写了一个命令是:CompareDwgs,嫌命令长的可以修改:
因为这个是一个C:开头lisp函数C: CompareDwgs,所以用户可以自己定义:譬如 (defun c:dtz () (C:CompareDwgs) (princ))
ARX的命令更快,错误更少。

如果想要停止比较,用remhook命令停止同步。
如果想要切换原图和对比图之间的关系,只需要在对比图上输入命令,然后在原图上激活,再回到对比图。
输入命令的为原图,激活的另一张图为对比图。

因为对图的基点是依据UCS的原点来进行的,所以想要进行基点对准的,只需要进行一下UCS的原点设置使得它们对准就可以。

另外附件的arx文件加载需要依据你的CAD版本和操作系统进行。
请看如下对应关系:

32位CAD:
DynamicLisp.R15.x32.arx    ---  AutoCAD 2000-2002
DynamicLisp.R16.x32.arx    ---  AutoCAD 2004-2006
DynamicLisp.R17.x32.arx    ---  AutoCAD 2007-2009          32位
DynamicLisp.R18.x32.arx    ---  AutoCAD 2010-2012        32位
DynamicLisp.R19.x32.arx    ---  AutoCAD 2013-2014        32位

64位CAD:
DynamicLisp.R17.x64.arx    ---  AutoCAD 2007-2009          64位
DynamicLisp.R18.x64.arx    ---  AutoCAD 2010-2012        64位
DynamicLisp.R19.x64.arx    ---  AutoCAD 2013-2014        64位
如有不能加载的版本,请告诉我。

建议用户使用arx命令 comparedwgs较好,无需使用lisp.
=============================================
2013.08.15更新, 新的特性如下:1、可以同步多个视图了。
2、不再闪屏。
3、可以直接用对话框设置好要同步的视图。
4、增加开关,随时关闭,随时打开,也可以随时设置同步的视图。
5、可以互动了。即4楼说的效果。

以下是LISP程序代码:
  1. (vl-load-com)
  2. ;;;对比图纸
  3. (defun c:tt (/ DOC1 DOC2 HWND1 HWND2 OLDVIEWCTRL OLDVIEWSIZE DOCS BaseP1)
  4.   (setq docs (vla-get-documents (vlax-get-acad-object)))
  5.   (if (> (vla-get-count docs) 1)
  6.     (progn
  7.       (setq doc1 (vla-get-ActiveDocument (vlax-get-acad-object)))
  8.       (setq hwnd1 (vla-get-hwnd doc1))
  9.       (vl-bb-set 'doc1 doc1)
  10.       (vl-bb-set 'hwnd1 hwnd1)
  11.       (setq oldViewCtrl (getvar 'ViewCtr))
  12.       (setq oldViewSize (getvar 'ViewSize))
  13.       (vl-bb-set 'oldViewCtrl oldViewCtrl)
  14.       (vl-bb-set 'oldViewSize oldViewSize)
  15.       (prompt "\n请激活另外一文档以完成对图.")
  16.       (C:DocReactor)
  17.       (C:hook)
  18.     )
  19.   )
  20. )

  21. ;;;回调函数
  22. (defun HookCallback (hwnd message wParam lParam time Pos / *APP HWND1 OLDVIEWCTRL OLDVIEWSIZE newViewCtrl newViewSize)
  23.   (setq newViewCtrl (getvar 'ViewCtr))
  24.   (setq newViewSize (getvar 'ViewSize))
  25.   (setq oldViewCtrl (vl-bb-ref 'oldViewCtrl))
  26.   (setq oldViewSize (vl-bb-ref 'oldViewSize))
  27.   (setq *APP (vlax-get-acad-object))
  28.   (setq hwnd1 (vl-bb-ref 'hwnd1))
  29.   (if (and
  30.         (vl-bb-ref 'hwnd2)
  31.         (= (vla-get-hwnd (vla-get-ActiveDocument *APP)) hwnd1)
  32.         (or (not (equal newViewCtrl oldViewCtrl 1e-8))
  33.             (not (equal NewViewSize oldViewSize 1e-8))
  34.         )
  35.       )
  36.     (progn
  37.       (vl-bb-set 'newViewCtrl newViewCtrl)
  38.       (vl-bb-set 'newViewSize newViewSize)
  39.       (vla-SendCommand (vl-bb-ref 'doc2) "zoom C (vl-bb-ref 'newViewCtrl) (vl-bb-ref 'newViewSize) ")
  40.       (vla-Activate (vl-bb-ref 'doc1))
  41.       (setq oldViewCtrl NewViewCtrl)
  42.       (setq oldViewSize NewViewSize)
  43.       (vl-bb-set 'oldViewCtrl oldViewCtrl)
  44.       (vl-bb-set 'oldViewSize oldViewSize)
  45.     )
  46.   )
  47. )

  48. ;;;钩子
  49. (defun c:hook()
  50.   (HFB_removeHook)
  51.   (HFB_RegisterHook "HookCallback")
  52.   (princ)
  53. )

  54. ;;;移除钩子
  55. (defun C:RemHook()
  56.   (HFB_removeHook)
  57. )

  58. ;;;文档已激活
  59. (defun DocBecameCurrent (ReacObj Reacdata / doc2 hwnd2)
  60.   (setq doc2 (car reacdata))
  61.   (setq hwnd2 (vla-get-hwnd doc2))
  62.   (if (/= (vl-bb-ref 'hwnd1) hwnd2)
  63.     (progn
  64.       (vl-bb-set 'hwnd2 hwnd2)
  65.       (vl-bb-set 'Doc2 doc2)
  66.     )
  67.   )
  68. )

  69. ;;;文档将激活
  70. (defun DocToBeActivated (ReacObj Reacdata)
  71.   (vla-get-name (car reacdata))
  72. )

  73. ;;;文档将关闭
  74. (defun DocToBeDestroyed (ReacObj Reacdata / hwnd1 hwnd2 hwnd)
  75.   (setq hwnd1 (vl-bb-ref 'hwnd1))
  76.   (setq hwnd2 (vl-bb-ref 'hwnd2))
  77.   (setq hwnd (vla-get-hwnd (car reacdata)))
  78.   (if (or (= hwnd hwnd1) (= hwnd hwnd2))
  79.     (progn
  80.       (HFB_removehook)
  81.       (if *DocReactor*
  82.         (progn
  83.           (vlr-remove *DocReactor*)
  84.           (setq *DocReactor* nil)
  85.         )
  86.       )
  87.     )
  88.   )
  89. )

  90. ;;;文档反应器
  91. (defun c:DocReactor (/)
  92.   (if (null *DocReactor*)
  93.     (progn
  94.       (setq *DocReactor*
  95.              (VLR-DocManager-Reactor
  96.                nil
  97.                '(
  98.                  (:vlr-documentBecameCurrent . DocBecameCurrent)
  99.                  (:vlr-documentToBeActivated . DocToBeActivated)
  100.                  (:VLR-documentToBeDestroyed . DocToBeDestroyed)
  101.                 )
  102.              )
  103.       )
  104.       (vlr-set-notification *DocReactor* 'all-documents)
  105.     )
  106.   )
  107. )

  108. (vl-acad-defun 'vl-acad-defun)
  109. (vl-acad-defun 'HookCallback)
  110. (princ "\n命令是: TT")
  111. (princ)

附件见如下:


相关DynamicLisp的介绍请见:
http://bbs.mjtd.com/forum.php?mod=viewthread&tid=90447&page=1&extra=#pid604291

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

x

评分

参与人数 7明经币 +11 金钱 +78 收起 理由
bzhjl + 1 赞一个!
自贡黄明儒 + 1 神马都是浮云
ylzhaosjz + 1 很给力!
linshiyin2 + 1
qjchen + 2 + 30
286168051 + 3 + 30 很给力!
ZZXXQQ + 2 + 18 赞一个!

查看全部评分

"觉得好,就打赏"
    共1人打赏

本帖被以下淘专辑推荐:

发表于 2013-8-11 11:46:43 | 显示全部楼层
本帖最后由 dwg001 于 2013-8-11 12:18 编辑

楼主强大,顶一个!
网上有几款类似的软件 overcad dwg compare、 compareDWG 2007、 VHCompare,基本操作都是将原图和对比图自动排列在同一屏幕中(可自行定义为上下或左右方式);二副图有变化处直接变色(删除为红色、修改为黄色、增加为绿色)、没有变化处灰度化,使肉眼对比量最小化,感觉比较直观;另外自动建立一个比较结果文件夹,把变色后的原图和对比图放入进去,可直接用cad打开查看或再编辑,很是人性化。
这些可否借鉴?大伙都在期待着H版。
回复 支持 1 反对 0

使用道具 举报

发表于 2018-4-14 17:33:33 | 显示全部楼层
lm344437673 发表于 2013-10-4 02:13
这个很棒,对不一下CompareView,速度比CompareView快。
遇到三个问题:1.对比图纸时十字光标会出现另一个 ...

请问下你上传这个怎么用?命令是啥?
发表于 2022-9-28 23:22:48 | 显示全部楼层
p-3-ianlcc 发表于 2022-9-28 12:29
大大,请教一下
arx有没有更新的版本呢?
可以支持到2014~2020的版本吗?

之前楼主分享过源代码,可惜后来又撤销了。
发表于 2013-7-31 23:35:20 | 显示全部楼层
本帖最后由 啵浪鼓 于 2013-8-1 00:01 编辑

H版对新程序了,对图是件很麻烦头痛的事! 以前是单个图内通过变颜色重叠来查看,这种2个图档相互查看未曾听闻,先留个爪印!
感谢H版的辛苦付出!

AutoCAD2005加载的是: DynamicLisp.R16.x32.arx
初试了一下程序,个人感觉这样对图有点烦琐:
1,首先2个图要切换切来切去,有点麻烦
2,要对的2个图档ucs定在一个点,只是某一个图元的,其它图元不在同一个点时,还得另外重新定ucs,不然缩放后切换到另一图就飞天了
3,缩放时,屏幕一闪一闪的,眼花!
4,不知几何时,出了这些信息,就一直不消停了
输入比例或高度 <589.1404>: (vl-bb-ref 'newViewSize) 589.14
命令: ; 错误: Automation 错误。 文档切换已禁用
; 错误: Automation 错误。 文档切换已禁用
; 错误: Automation 错误。 文档切换已禁用
; 错误: Automation 错误。 文档切换已禁用
; 错误: Automation 错误。 文档切换已禁用
; 错误: Automation 错误。 文档切换已禁用

点评

试试命令: CompareDwgs命令,不会出现Automation错误。  发表于 2013-7-31 23:57

评分

参与人数 1明经币 +2 金钱 +30 收起 理由
qjchen + 2 + 30

查看全部评分

 楼主| 发表于 2013-8-1 00:01:31 | 显示全部楼层
啵浪鼓 发表于 2013-7-31 23:35
对较是件很麻烦头痛的事!
H版对新程序了,先留个爪印!
感谢H版的辛苦付出!

可能这些问题,对高版本好些。
另外,用ARX的命令要好过LISP的命令。
对于基点问题暂时没别的办法,只有ucs对准原点。因为我这个程序考虑的是两个相差不大的图纸进行比较。

点评

谢谢分享 但是有个问题 如果那些墙啊什么的轻微错位 或者尺寸变大 很难看出来  发表于 2014-2-18 09:38
发表于 2013-8-1 00:11:23 | 显示全部楼层
现在是A图档支配B图档,如果也同时能支持B图档支配A图档,那就更给力了!
发表于 2013-8-1 08:35:48 | 显示全部楼层
可以变色么,不同的地方用颜色亮显,相同的地方用灰色,退出恢复原色
发表于 2013-8-1 08:38:11 | 显示全部楼层
汗,理解错了,这个应该就是个窗口同步功能吧,不同的地方还是需要人工核对的
发表于 2013-8-1 09:05:27 | 显示全部楼层
太强大了这个!在纯lisp下应该实现不了
发表于 2013-8-1 22:23:34 | 显示全部楼层
留个足印,以备用
发表于 2013-8-2 09:55:37 | 显示全部楼层
高飞鸟还是在高云端漫步啊,我辈仰望之。。。。。。。。。。。。。。
发表于 2013-8-2 11:02:00 | 显示全部楼层
我们通常的做法是两张图放一起,变颜色,看变化一目了然。

浩辰cad里有个图纸文档比较功能挺好的。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-11-16 12:47 , Processed in 0.224924 second(s), 35 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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