明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 2588|回复: 7

指定块插入到图形的指定位置

[复制链接]
发表于 2011-9-19 13:02:07 | 显示全部楼层 |阅读模式
1明经币
求助编程:我想把d盘内的tk.dwg插入到文件夹内的每一个文件内,根据文件文件夹信息文本(txt)自动完成。文本信息格式为:文件名,块要插入的基点。
67.25-80.50.dwg,(67250,80500)
67.25-80.75.dwg,(67250,80750)
67.25-81.00.dwg,(67250,81000)
67.50-80.50.dwg,(67500,80500)
67.50-80.75.dwg,(67500,80750)
67.50-81.00.dwg,(67500,81000)
67.75-80.50.dwg,(67750,80500)
67.75-80.75.dwg,(67750,80750)
67.75-81.00.dwg,(67750,81000)
程序要求:首先打开第一个文件,把块插入指定的位置,存盘退出,然后在打开第二幅图,依次操作。

最佳答案

发表于 2011-9-19 13:02:08 | 显示全部楼层
  1. (defun c:tt (/ 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. ;_Thanks caoyin
  33. ;_http://bbs.mjtd.com/forum.php?mod=viewthread&tid=69986&replyID=&skin=0
  34. (defun GetFileList (dirName / files lst)
  35. (defun path-addBackSlash (path)
  36. (if (not (member (substr path (strlen path)) '("\" "/")))
  37. (strcat path "\")
  38. path
  39. )
  40. )
  41. (setq dirName (path-addBackSlash dirName)
  42. files    (mapcar '(lambda (x) (strcat dirName x))
  43. (vl-directory-files dirName "*.dwg" 1)
  44. )
  45. )
  46. (mapcar '(lambda (x)
  47. (setq lst (append lst (GetFileList (strcat dirName x))))
  48. )
  49. (vl-remove-if
  50. '(lambda (x) (member x '("." "..")))
  51. (vl-directory-files dirName nil -1)
  52. )
  53. )
  54. (append files lst)
  55. )
  56. ;; 本代码仅提供作为应用上的参考, 而未声明或隐含任何保证; 对于任何特殊
  57. ;; 用途之适应性, 以及商业销售所隐含作出的保证, 在此一概予以否认.
  58. ;; ========================================================
  59. ;; 作者:秋枫,参考了灯火的VBA程序
  60. ;; 用法:(qf_getFolder msg)
  61. ;; 例子:(qf_getFolder "选择文件夹:")
  62. ;; 返回值:字符串,文件夹路径,如果点了cancel, 返回nil
  63. ;; http://www.mjtd.com/Functions/ArticleShow.asp?ArticleID=302
  64. (defun qf_getFolder (msg / WinShell shFolder path catchit)
  65. (vl-load-com)
  66. (setq winshell (vlax-create-object "Shell.Application"))
  67. (setq shFolder (vlax-invoke-method WinShell 'BrowseForFolder 0 msg 1))
  68. (setq
  69. catchit (vl-catch-all-apply
  70. '(lambda ()
  71. (setq shFolder (vlax-get-property shFolder 'self))
  72. (setq path (vlax-get-property shFolder 'path))
  73. )
  74. )
  75. )
  76. (if  (vl-catch-all-error-p catchit)
  77. nil
  78. path
  79. )
  80. )
  81. (setq fold (qf_getFolder "选择文件所在目录:"))
  82. (if fold
  83. (progn
  84. (setq file_list (GetFileList fold))
  85. (if file_list
  86. (progn
  87. (setq infofile (getfiled "选择文件" (strcat fold "\\信息文件") "txt" 0))
  88. (if (not infofile)
  89.   (exit)
  90.   )
  91. (setq redlist (ReadFile2Str infofile))
  92. (setq sf (strcat (getvar "TEMPPREFIX") "批处理文件20110922.scr"))
  93. (setq sff (open sf "w"))
  94. (setq i 0)
  95. (mapcar '(lambda (x)
  96. (if (setq memredlist (member (strcat (vl-filename-base x) ".dwg") redlist))
  97. (progn
  98. (setq memredlist (nth 1 memredlist))
  99. (setq memredlist (substr (setq memredlist (substr memredlist 2)) 1 (1- (strlen memredlist))))
  100. (princ (strcat "open "" x ""\n" "-insert tk.dwg " memredlist " 1 1 0 qsave close\n") sff)
  101. (setq i (1+ i))
  102. )
  103. )
  104. )
  105. file_list
  106. )
  107. (close sff)
  108. (if (> i 0)
  109. (progn
  110. (princ (strcat "\n目录下" fold "\n\t共有DWG文件数: " (itoa (length file_list)) ",符合条件的" (itoa i)))
  111. (initget "Y N")
  112. (setq RunNow (getkword "\n是否立刻执行[是(Y)/否(N)]:<否>"))
  113. (if (= RunNow "Y")
  114. (progn
  115. (command "._script" sf)
  116. (princ "\n处理完成")
  117. )
  118. (princ "\n放弃立刻执行")
  119. )
  120. )
  121. (princ "\n没有符合条件需要处理的...")
  122. )
  123. )
  124. (princ "\n目录下没有DWG文件")
  125. )
  126. )
  127. (princ "\n请选择目录")
  128. )
  129. (princ)
  130. )

评分

参与人数 1金钱 +20 收起 理由
874185423 + 20 楼主辛苦,多谢

查看全部评分

回复

使用道具 举报

发表于 2011-9-19 13:52:28 | 显示全部楼层
同行的应是看懂了,
不过我还在猜且无从验证....
回复

使用道具 举报

 楼主| 发表于 2011-9-23 13:13:45 | 显示全部楼层
多谢楼主,我得功能全部实现了,只是需要把信息文本插入基点的X,Y互换即可,可能是CAD得X方向是测绘的Y方向的原因吧。
回复

使用道具 举报

发表于 2011-9-23 21:23:32 | 显示全部楼层
需要X Y互换的请替换99行中的
  1. (setq memredlist (substr (setq memredlist (substr memredlist 2)) 1 (1- (strlen memredlist))))
为以下代码
  1. (setq memredlist (StrParse (substr (setq memredlist (substr memredlist 2)) 1 (1- (strlen memredlist))) ","))
  2. (setq memredlist (strcat (last memredlist) "," (car memredlist)))
回复

使用道具 举报

 楼主| 发表于 2011-9-24 12:47:36 | 显示全部楼层
多谢gufeng,程序很完美,XY不用互换了
回复

使用道具 举报

发表于 2011-11-13 10:56:22 | 显示全部楼层
好东西,我收藏了
回复

使用道具 举报

发表于 2013-6-5 23:06:43 | 显示全部楼层
太好的资料,必须收藏
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-11-24 17:33 , Processed in 0.201419 second(s), 26 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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