设为首页收藏本站

嘻皮客娱乐学习网

 找回密码
 中文注册
搜索
打印 上一主题 下一主题
开启左侧

[建筑工程] 在多个dwg文件中按照指定的坐标批量插入块的方法

[复制链接]
跳转到指定楼层
楼主
发表于 2011-11-14 13:05:29 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
由于早期做的一些图里面的图框都没有引用外部参照,并且没有插入电子签名及写项目编号这些小东西。现在这种图纸要大批量的加入电子签名及项目编号。实在是个头疼的问题。
下面是一个稍微省点劲的办法,但也还是需要把每张图打开一下,所以大家牢记啊,图框最好用外部参照,并设置好坐标原点啊。否则到时候有你哭的。
首先说一下,这些图纸都是从同一个模板文件得来的,所以图框的大小及图框的排版是固定的,不同的只是里面的具体内容。这点是关键。如果图框大小不同或排版方式不同,那就不能用下面的方法了。
首先在一个文件里面把需要加的东西都加好,然后,把新加的这些东西做成一个外部块(假如名记叫做“3.dwg”),并把插入基点设在最左侧图框的下角点,当然其他的地方也可以,因为你所有文件的图框排版方式是相同的,所以插入点设在哪儿都无所谓,只要记住这个点就行了。

因为所有的文件都是由一个模板文件得来的,所以,其坐标系也是相同的,所以最左侧图框的下角点的坐标理论上也是一样的,假设都是(0,0)


假设现在需要修改的四个dwg文件是,并且在同一个文件夹中:

阿古龙村.dwg,
安宁八街东湖.dwg
安宁草钢1.dwg
安宁草钢2.dwg

我们先建一个空白txt文件,文件名叫什么不重要,暂且叫做 修改信息.txt 吧,那么我们在这个  修改信息.txt  里面输入如下格式的内容:

阿古龙村.dwg,(0,0)
安宁八街东湖.dwg,(0,0)
安宁草钢1.dwg,(0,0)
安宁草钢2.dwg,(0,0)

每个站名后面加一个逗后,然后是括号,括号中是插入点的坐标,当然这些坐标对于每个站来说可以是不同的,但是鉴于我们的图都是从一个模板文件得来的,应该是相同的,所以都写一样的(0,0)。这样一个站一行,依次在txt文件里面写好。当然这一步可以借助excel来完成,完成后,再复制到txt文件中来。

接着,我们把下面这些代码复制到另一个新建txt文件中,然后把该文件后缀名.txt改为.lsp:
  1. (defun c:pb (/ FILE_LIST FOLD SF SFF RunNow MEMREDLIST REDLIST infofile)
  2. (vl-load-com)
  3. ;_读取 文件
  4. (defun ReadFile2Str (datfile / tmplst x fn)
  5. (setq fn (open datfile "r"))
  6. (setq tmplst '())
  7. (while (setq x (read-line fn))
  8. (setq x (StrParse x ","))
  9. (setq tmplst (cons (last x) (cons (car x) tmplst)))
  10. )
  11. (close fn)
  12. (reverse tmplst)
  13. )
  14. ;_解析字符串
  15. (defun StrParse (Str Delimiter / CHAR N RETURN SEARCHSTR STRINGLEN)
  16. (setq SearchStr Str)
  17. (setq StringLen (strlen SearchStr))
  18. (setq return '())
  19. (while (> StringLen 0)
  20. (setq n 1)
  21. (setq char (substr SearchStr 1 1))
  22. (while (and (/= char Delimiter) (/= char ""))
  23. (setq n (1+ n))
  24. (setq char (substr SearchStr n 1))
  25. )
  26. (setq return (cons (substr SearchStr 1 (1- n)) return))
  27. (setq return (cons (substr SearchStr (1+ n)) return))
  28. (setq StringLen 0)
  29. )
  30. (reverse return)
  31. )
  32. (defun GetFileList (dirName / files lst)
  33. (defun path-addBackSlash (path)
  34. (if (not (member (substr path (strlen path)) '("\" "/")))
  35. (strcat path "\")
  36. path
  37. )
  38. )
  39. (setq dirName (path-addBackSlash dirName)
  40. files    (mapcar '(lambda (x) (strcat dirName x))
  41. (vl-directory-files dirName "*.dwg" 1)
  42. )
  43. )
  44. (mapcar '(lambda (x)
  45. (setq lst (append lst (GetFileList (strcat dirName x))))
  46. )
  47. (vl-remove-if
  48. '(lambda (x) (member x '("." "..")))
  49. (vl-directory-files dirName nil -1)
  50. )
  51. )
  52. (append files lst)
  53. )
  54. (defun qf_getFolder (msg / WinShell shFolder path catchit)
  55. (vl-load-com)
  56. (setq winshell (vlax-create-object "Shell.Application"))
  57. (setq shFolder (vlax-invoke-method WinShell 'BrowseForFolder 0 msg 1))
  58. (setq
  59. catchit (vl-catch-all-apply
  60. '(lambda ()
  61. (setq shFolder (vlax-get-property shFolder 'self))
  62. (setq path (vlax-get-property shFolder 'path))
  63. )
  64. )
  65. )
  66. (if  (vl-catch-all-error-p catchit)
  67. nil
  68. path
  69. )
  70. )
  71. (setq fold (qf_getFolder "选择文件所在目录:"))
  72. (if fold
  73. (progn
  74. (setq file_list (GetFileList fold))
  75. (if file_list
  76. (progn
  77. (setq infofile (getfiled "选择文件" (strcat fold "\\信息文件") "txt" 0))
  78. (if (not infofile)
  79.   (exit)
  80.   )
  81. (setq redlist (ReadFile2Str infofile))
  82. (setq sf (strcat (getvar "TEMPPREFIX") "批处理文件20110922.scr"))
  83. (setq sff (open sf "w"))
  84. (setq i 0)
  85. (mapcar '(lambda (x)
  86. (if (setq memredlist (member (strcat (vl-filename-base x) ".dwg") redlist))
  87. (progn
  88. (setq memredlist (nth 1 memredlist))
  89. (setq memredlist (substr (setq memredlist (substr memredlist 2)) 1 (1- (strlen memredlist))))
  90. (princ (strcat "open "" x ""\n" "-insert 3.dwg " memredlist " 1 1 0 qsave close\n") sff)
  91. (setq i (1+ i))
  92. )
  93. )
  94. )
  95. file_list
  96. )
  97. (close sff)
  98. (if (> i 0)
  99. (progn
  100. (princ (strcat "\n目录下" fold "\n\t共有DWG文件数: " (itoa (length file_list)) ",符合条件的" (itoa i)))
  101. (initget "Y N")
  102. (setq RunNow (getkword "\n是否立刻执行[是(Y)/否(N)]:<否>"))
  103. (if (= RunNow "Y")
  104. (progn
  105. (command "._script" sf)
  106. (princ "\n处理完成")
  107. )
  108. (princ "\n放弃立刻执行")
  109. )
  110. )
  111. (princ "\n没有符合条件需要处理的...")
  112. )
  113. )
  114. (princ "\n目录下没有DWG文件")
  115. )
  116. )
  117. (princ "\n请选择目录")
  118. )
  119. (princ)
  120. )
复制代码



文件名叫什么不重要(不要用汉字),只要不和你cad程序中的support文件夹中的lsp文件
重名就行了。假如该文件叫做 pb.lsp,那么请把这个文件复制到你cad安装文件夹中support中,然后在cad中加载该文件。加载的方法是依次在菜单栏找到:工具——加载运用程序,然后在弹出的对话框中选中刚才复制到support文件中的pb.lsp文件,并点击 加载 。另外在弹出的这个对话框里面,定一下,右下部分的启动组 内容 ,然后在弹出的启动组对话框中,同样找到pb.lsp文件添加后,关闭。

另外说明一点:如果需要插入的外部块名字不叫做3.dwg的话,那么请在pb.lsp文件中搜索3.dwg,并将其改为你需要插入的外部块的名字。

如果不想复制上面的东西,那么也可以下载我做好的这个lsp文件,跟上面的内容是一样的。
pb.lsp (3.4 KB, 下载次数: 3072)



所有这些准备工作做好之后,就可以用cad批量插入图框了。

在一个新建的dwg文件中,输入pb,然后回车,在弹出的对话框中选择需插入块的文件所在的文件夹。选择好文件夹后,点确定,再在弹出的对话框中找到并选择之前做好的 修改信息.txt 文件,然后,在cad文本输入框那儿你会看到,一些信息。并让你确定是否批量插入图块。输入y,回车后,电脑就会自动打开那些cad插入图块了。(注意,在确定要批加图块的时候,这些需要批加图块的文件一定不要是打开状态。)
回复

使用道具 举报

小黑屋|手机版|嘻皮客网 ( 京ICP备10218169号|京公网安备11010802013797  

GMT+8, 2024-5-12 00:33 , Processed in 0.190634 second(s), 24 queries , Gzip On.

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

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