明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 1409|回复: 11

[讨论] 图纸合并源码--待改善

[复制链接]
发表于 2023-3-1 17:21 | 显示全部楼层 |阅读模式
图纸合并,多个dwg合并在一个dwg里。



现在三维软件众多,很多批量输出的dwg,都含有同名块,或同名标注样式

大部分的合并插件,合并后,会引起块冲突或者标注样式冲突,导致效果并不理想



以下为源码,不知道哪位大神写的,已查无实据。感谢前人的奉献!

此程序需要解决的问题:

1.标注样式冲突,导致即便执行sub2,标注的文字大小全部变为统一打大小了
应该保持原样才对(大图框原始标注文字大,小图框原始标注文字也小)
【希望加入合并前,随机rename块名,随机rename标注样式名称】

2.合并后,图形之间全部重叠了
应该设置为一定间距,或者用户指定间距


  1. (defun c:XXX ()
  2. ;;插图到一起
  3. (setvar "CMDECHO" 0)
  4. (setq pf (getfiled "指定原文件路径中的一个图形文件:>" "*" "dwg" 8))
  5. (setq path (vl-filename-directory pf))
  6. (setq path (strcat path "\"))
  7. (setq aa (vl-directory-files path "*.dwg" 1))
  8. (setq n (length aa))
  9. (setq i 0
  10. nn 0
  11. )
  12. (setq pp (nth i aa))
  13. (initget "1 2")
  14. (setq opt (getkword
  15. "\n 1:按块插入 /2:解块插入 "
  16. )
  17. )
  18. (if opt
  19. (cond
  20. ((= opt "1") (sub1))
  21. ((= opt "2") (sub2))
  22. )
  23. )

  24. (princ)
  25. )
  26. (defun sub1 ()
  27. (prompt "\n")
  28. (prompt "程序正在按块插入图幅,请等待...\n")
  29. (while (/= pp nil)
  30. (setq i (+ i 1))
  31. (setq pp (strcat path pp))
  32. (command "insert" pp "0,0" "1" "1" "")
  33. (setq nn (+ nn 1))
  34. (princ (strcat "第" (itoa nn) "幅" "图号为" pp " \r"))
  35. (setq pp (nth i aa))
  36. )
  37. (command "zoom" "e" "zoom" "0.8x")
  38. )
  39. (defun sub2 ()
  40. (prompt "\n")
  41. (prompt "程序正在解块插入图幅,请等待...\n")
  42. (while (/= pp nil)
  43. (setq i (+ i 1))
  44. (setq pp (strcat path pp))
  45. (setq pp (strcat "*" pp))
  46. (command "insert" pp "0,0" "1" "")
  47. (setq nn (+ nn 1))
  48. (princ (strcat "第" (itoa nn) "幅" "图号为" pp " \r"))
  49. (setq pp (nth i aa))
  50. (setq pp (nth i aa))

  51. )
  52. (command "zoom" "e" "zoom" "0.8x")
  53. )


 楼主| 发表于 2023-3-10 11:07 | 显示全部楼层
  1. (defun c:hbtz (/ tzml filelst i x y pmax pmin zx ys dx dy cdy dwg fn fd)
  2.   (vl-load-com)
  3.   (defun browseforfolder (msg / shfolder path catchit)
  4.     (setq shfolder (vlax-invoke-method (vlax-create-object "Shell.Application")
  5.                                        'browseforfolder
  6.                                        (vlax-get-property
  7.                                                           (vlax-get-acad-object)
  8.                                                           'hwnd
  9.                                        ) msg 1
  10.                    )
  11.           catchit (vl-catch-all-apply '(lambda ()
  12.                                          (setq shfolder
  13.                                                (vlax-get-property shfolder
  14.                                                                   'self
  15.                                                )
  16.                                                path
  17.                                                (vlax-get-property shfolder
  18.                                                                   'path
  19.                                                )
  20.                                          )
  21.                                        )
  22.                   )
  23.     )
  24.     (if (vl-catch-all-error-p catchit)
  25.       nil
  26.       path
  27.     )
  28.   )
  29.   (setq tzml (browseforfolder "选择文件路径"))
  30.   (if (/= (substr tzml (strlen tzml)) "\")
  31.     (setq tzml (strcat tzml "\"))
  32.   )
  33.   (setq filelst (vl-directory-files tzml "*.dwg" 1))
  34.   (setq filelst (acad_strlsort filelst)
  35.         i -1
  36.         x 0
  37.         y 0
  38.         cdy 0
  39.   )
  40.   (setq fn (getint "\n[每行文件数量]<1>:"))
  41.   (if (not fn)
  42.     (setq fn 1)
  43.   )
  44.   (setq fd (getreal "\n[文件间距]<100>:"))
  45.   (if (not fd)
  46.     (setq fd 100)
  47.   )
  48.   (setvar "osmode" 0)
  49.   (setvar "attreq" 0)
  50.   (setvar "cmdecho" 0)
  51.   (command "ucs" "")
  52.   (while (setq dwg (nth (setq i (1+ i))
  53.                         filelst
  54.                    )
  55.          )
  56.     (prompt (strcat "\n" dwg))
  57.     (command "insert" (strcat tzml dwg) (list 0 0) "" "" "")
  58.     (vla-getboundingbox (vlax-ename->vla-object (entlast)) 'mi 'ma)
  59.     (setq pmax (vlax-safearray->list ma)
  60.           pmin (vlax-safearray->list mi)
  61.     )
  62.     (setq zx (list (car pmin) (cadr pmin))
  63.           ys (list (car pmax) (cadr pmax))
  64.     )
  65.     (setq dwg (entlast))
  66.     (command "rectangle" pmin pmax)
  67.     (command "change" (entlast) "" "P" "C" "1" "")
  68.     (command "move" dwg (entlast) "" (list (car zx) (cadr ys))
  69.              (list x y)
  70.     )
  71.     (setq dy (- (cadr ys) (cadr zx))
  72.           dx (- (car ys) (car zx))
  73.     )
  74.     (if (> dy cdy)
  75.       (setq cdy dy)
  76.     )
  77.     (if (= (rem (1+ i) fn) 0)
  78.       (setq x 0
  79.             y (- y cdy fd)
  80.             cdy 0
  81.       )
  82.       (setq x (+ x dx fd))
  83.     )
  84.   )
  85.   (princ)
  86. )



这段代码,如何加入(command "_explode" "all" ""),使得插入前,分解每一个图块和标注样式;最好是重命名块和标注样式(随机名字也可以)
发表于 2023-3-2 14:29 | 显示全部楼层
本帖最后由 zhangcan0515 于 2023-3-3 19:40 编辑
lengxiaxi 发表于 2023-3-2 14:00
不是转换的问题,转换无非设置好映射,字体,线型,图层。那都容易。

是合并的问题

你单张图纸都没有处理好,你合并肯定问题多了,你用映射肯定也不行,我们这是重新新建的标注样式 字体样式,替换过了原来SW到dwg这样合并后才不会出现你说的那种情况的。你不处理到合并就是图块冲突 标注样式冲突,导致你每张标注字高发生变化。
 楼主| 发表于 2023-3-3 19:05 | 显示全部楼层
zhangcan0515 发表于 2023-3-2 14:29
你单张图纸都没有处理好,你合并肯定问题多了,你用映射肯定也不行,我们这是重新新建的标注样式 字体样 ...

感谢指教,看样子,像是时间戳添加到块名称,这样所有块就是唯一的名称。sw中如何设置,可否赐教?
发表于 2023-3-1 18:42 | 显示全部楼层
这是个值得研究的话题
发表于 2023-3-2 11:10 | 显示全部楼层
全部分解了再导入呢
发表于 2023-3-2 13:31 | 显示全部楼层
这个问题已经解决了,,请看视频。

本帖子中包含更多资源

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

x
 楼主| 发表于 2023-3-2 14:00 | 显示全部楼层
zhangcan0515 发表于 2023-3-2 13:31
这个问题已经解决了,,请看视频。

不是转换的问题,转换无非设置好映射,字体,线型,图层。那都容易。

是合并的问题
发表于 2023-3-2 16:20 | 显示全部楼层
谢谢分享,点赞占个楼
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-5-11 13:51 , Processed in 0.155711 second(s), 27 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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