明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 2506|回复: 11

[源码] 复制坐标数据进剪贴板展线,表格文本均可

  [复制链接]
发表于 2015-12-22 16:44:27 | 显示全部楼层 |阅读模式
本帖最后由 wzg356 于 2022-3-17 21:56 编辑

看起来这种方法有点老土,但却很强大,主要是操作相对方便、自由.

姊妹程序http://bbs.mjtd.com/forum.php?mo ... mp;extra=#pid908231

坐标数据放在excel/word/notebook文件里面都没关系

表格、文本格式均可
逗号、空格分隔数据均可
有无坐标点名、点号没关系,每行坐标数据格式统一就行

把坐标数据复制进剪贴板(选定数据范围,然后ctrl+c或右键复制)后启动程序即可
  1. ;一直对无法逾越lsp操控excel、word,只有用此办法处理了
  2. ;看起来这种方法有点老土,但却很强大,主要是操作相对方便、自由。

  3. ;wzg356完成于2014年11月22日

  4. ;;从剪贴板提取坐标数据画线程序

  5. ;通用函数
  6. ;;;=====================================
  7. ;;;功能:读取系统剪贴板中字符串(GET-CLIP-STRING)
  8. ;;来自 明经通道
  9. (defun GET-CLIP-STRING ( / HTML RESULT)
  10.     (and (setq HTML (vlax-create-object "htmlfile"))
  11.       (setq RESULT (vlax-invoke
  12.         (vlax-get (vlax-get HTML 'PARENTWINDOW)  'CLIPBOARDDATA)
  13.         'GETDATA
  14.         "Text"
  15.           )
  16.       )
  17.       (vlax-release-object HTML)
  18.     )
  19.     RESULT
  20. )


  21. ;;;=====================================
  22. ;;这是一个很牛的字符串分割法
  23. ;;delim是一个字符串集合,其中的每一个字符都会被当作是分割符号 by qjchen@gmail.com
  24. (defun parse4 (str delim / L1 L2)
  25.   (setq  str   (vl-string->list str)  delim (vl-string->list delim) )
  26.   (while str
  27.     (if  (not (member (car str) delim))
  28.       (setq l1 (cons (car str) l1))
  29.       (if l1  (setq l2 (cons (vl-list->string (reverse l1)) l2)  l1 nil))
  30.     )
  31.     (setq str (cdr str))
  32.   )
  33.   (if l1(setq l2 (cons (vl-list->string (reverse l1)) l2)))
  34.   (reverse l2)
  35. )



  36. ;;;=====================================
  37. ;[功能]entmake生成多段线,带线宽设置
  38. ;[用法](EntmakeLWPL vertices Lw)三维点表
  39. (defun EntmakeLWPL (vertices Lw / elist seg)
  40.   (setq elist
  41.      (list '(0 . "LWPOLYLINE") '(100 . "AcDbEntity") '(100 . "AcDbPolyline")
  42.             (cons 90 (length vertices)) (cons 70 0) (cons 38 (caddr (car vertices)))
  43.             (cons 40 Lw) (cons 41 Lw) (cons 43 Lw)
  44.      )
  45.   )
  46.   (foreach seg vertices (setq elist (append elist (list (cons 10 seg) (cons 42 0)))))
  47.   (entmake elist)
  48. )


  49. ;=============================


  50. ;;; 主程序

  51. ;;;第一步
  52. ;;;=====================================
  53. ;剪贴板数据处理呈数据表,该表为全字符串表
  54. ;(setq str (GET-CLIP-STRING))(get-clip-strlst str)
  55. (defun get-clip-strlst (str / strdelitem lst)
  56.   ;字符串替换子串,一个不留
  57.   (defun strdelitem (newstr oldstr str)
  58.     (while (vl-string-search  oldstr str)
  59.       (setq str (vl-string-subst newstr  oldstr str))
  60.     )
  61.     str
  62.   )
  63.   (cond
  64.     ((> (length (parse4 str "\t")) 1);优先制表符分隔,word excel复制的表格
  65.       (setq str (strdelitem "\r\n" "\r\n\t\t\r\n" (strdelitem "" " " str)));消除空格,空行
  66.       (while (or(vl-string-search "\r\n\t" str)(vl-string-search "\t\r\n" str))
  67.         (setq str (vl-string-subst "\t" "\r\n\t" str))
  68.         (setq str (vl-string-subst "\t" "\t\r\n" str))
  69.       );消除单元格多余的回车
  70.       (setq lst(mapcar '(lambda (x)(parse4 x "\t"))(parse4 str  "\r\n")))
  71.     )
  72.     ((or (> (length(parse4 str ",")) 1) (> (length(parse4 str ",")) 1));次之逗号分隔,txt,word复制的文本
  73.       (setq str (strdelitem " |" "," (strdelitem "," "," str)));统一为半角逗号且确保每个逗号前有值
  74.         (setq lst(mapcar '(lambda (x)(parse4 x "|"))(parse4 str  "\r\n")))
  75.         (setq lst
  76.           (mapcar '(lambda (x)(mapcar '(lambda(y)(strdelitem "" " " y)) x))lst)
  77.       );去除每个字符串的空格(上面strdelitem一句替换时加的)
  78.     )
  79.     (cond(> (length(parse4 str " ")) 1);空格分隔,txt,word复制的文本
  80.         (setq lst(mapcar '(lambda (x)(parse4 x " "))(parse4 str  "\r\n")))
  81.       )
  82.     (t (setq lst (parse4 str  "\r\n")));其它分隔符不识别,按行转为表
  83.   )
  84.   lst
  85. )

  86. ;;;第二步
  87. ;;;=====================================
  88. ;字符串表中读取坐标数据,转化为数值并画线
  89. (defun clip-coord-pl (form xypos ddx ddy / chechlst ZoomWindow info
  90.                    str lst  lstlen1 lstlen2 i ii tmplst  plst y x z minmax)
  91.   (defun chechlst (lst / len1 len2);检查表子表长是否大于1,每个子表长度相同
  92.     (if (> (setq len1(length lst))1)
  93.       (if(= (setq len2(apply 'max (mapcar 'length lst)))
  94.         (apply 'min (mapcar 'length lst))
  95.         )
  96.          (list len1 len2)
  97.       )
  98.     )
  99.   )
  100.   ;;[功能] 两点窗口缩放
  101.   (defun ZoomWindow (p1 p2)
  102.     (vla-ZoomWindow *ACAD*
  103.       (vlax-3d-point p1) (vlax-3d-point p2)
  104.     )
  105.   )
  106.   (if
  107.     (and
  108.       (setq str (GET-CLIP-STRING))
  109.         (mapcar 'set (list 'lstlen1 'lstlen2)(chechlst(setq lst(get-clip-strlst str))))
  110.     )
  111.     (progn
  112.   (setq ii 0  tmplst nil )
  113.   (if (= form "1")
  114.     (progn;格式为:序号/X/Y的情况,避免与默认之一的X/Y/Z 混淆
  115.       (while (and
  116.               (<= ii (- lstlen1 1))
  117.               (setq y (distof(cadr (nth ii lst))))
  118.               (setq x (distof(caddr (nth ii lst))))
  119.             )            
  120.             (setq tmplst  (cons (list y x 0)tmplst))
  121.           (setq ii(+ ii 1))
  122.       )      
  123.       (if (/= ii lstlen1)        
  124.         (setq info (strcat "数据第" (rtos (+ ii 1) 2 0) "行有误,请检查!"))
  125.       )      
  126.     )   
  127.       (cond;以下为默认的四种坐标格式
  128.     ((= lstlen2 2);X/Y格式
  129.       (while (and
  130.               (<= ii (- lstlen1 1))
  131.               (setq y (distof(car (nth ii lst))))
  132.               (setq x (distof(cadr (nth ii lst))))
  133.             )
  134.             (setq tmplst  (cons (list y x 0)tmplst))
  135.           (setq ii(+ ii 1))
  136.       )      
  137.       (if (/= ii lstlen1)        
  138.         (setq info (strcat "数据第" (rtos (+ ii 1) 2 0) "行有误,请检查!"))
  139.       )      
  140.     )
  141.     ((= lstlen2 3);X/Y/Z格式
  142.       (while (and
  143.               (<= ii (- lstlen1 1))
  144.               (setq y (distof(car (nth ii lst))))
  145.               (setq x (distof(cadr (nth ii lst))))
  146.               (setq z (distof(caddr (nth ii lst))))
  147.             )
  148.             (setq tmplst  (cons (list y x z)tmplst))
  149.           (setq ii(+ ii 1))
  150.       )      
  151.       (if (/= ii lstlen1)        
  152.         (setq info (strcat "数据第" (rtos (+ ii 1) 2 0) "行有误,请检查!"))
  153.       )      
  154.     )
  155.     ((= lstlen2 4);点号/X/Y/Z格式
  156.       (while (and
  157.               (<= ii (- lstlen1 1))
  158.               (setq y (distof(cadr (nth ii lst))))
  159.               (setq x (distof(caddr (nth ii lst))))
  160.               (setq z (distof(cadddr (nth ii lst))))
  161.             )
  162.             (setq tmplst  (cons (list y x z)tmplst))
  163.           (setq ii(+ ii 1))
  164.       )      
  165.       (if (/= ii lstlen1)      
  166.         (setq info (strcat "数据第" (rtos (+ ii 1) 2 0) "行有误,请检查!"))
  167.       )      
  168.     )
  169.     ((>= lstlen2 5);点号/点名/X/Y/Z格式
  170.       (while (and
  171.               (<= ii (- lstlen1 1))
  172.               (setq y (distof(caddr (nth ii lst))))
  173.               (setq x (distof(cadddr (nth ii lst))))
  174.               (setq z (distof(nth 4 (nth ii lst))))
  175.             )
  176.             (setq tmplst  (cons (list y x z)tmplst))
  177.           (setq ii(+ ii 1))
  178.       )      
  179.       (if (/= ii lstlen1)
  180.         (setq info (strcat "坐标数据第" (rtos (+ ii 1) 2 0) "行有误,请检查!"))
  181.       )      
  182.     )
  183.     (t (setq info (strcat "坐标信息有误,请检查!")))
  184.     )
  185.   )  
  186.   (if info
  187.       (alert info)
  188.     (progn
  189.       (setq plst nil)
  190.       (if (= xypos "1")
  191.         (foreach pt tmplst
  192.           (setq plst (cons (mapcar '+ pt (list ddy ddx 0))plst))
  193.         )         
  194.         (foreach pt tmplst
  195.           (setq plst
  196.             (cons (mapcar '+ (list(cadr pt)(car pt)(caddr pt)) (list ddy ddx 0))plst)
  197.           )
  198.         )
  199.       )
  200.       (setq plst(mapcar  '(lambda (x) (trans x 1 0))plst))            
  201.       (EntmakeLWPL  plst 0.1)
  202.       (ZoomWindow (apply 'mapcar (cons 'min  plst))(apply 'mapcar (cons 'max  plst)));缩放窗口
  203.       )
  204.     )
  205.         )
  206.       (alert "坐标数据无法识别,请检查!")
  207.   )  
  208. )

  209. ;对话框程序
  210. ;=====================================
  211. ;参数设置,通过对话框设置参数
  212. (defun set_xydate ( / getdate  setdate oldcxydate dcl_id dd x y)
  213. (defun getdate ()   
  214.     (mapcar '(lambda (x) (get_tile x))
  215.     (list "xyform1" "xyform2" "XY-YX" "ddx" "ddy" ))
  216. )
  217. (defun setdate(lst / )
  218.     (mapcar '(lambda (x y) (set_tile x y))
  219.       (list "xyform1" "xyform2" "XY-YX" "ddx" "ddy" )
  220.     lst
  221.   )
  222. )
  223.   (setq oldcxydate (list "0" "1" "0"  "0.00" "0.00"))
  224.   (setq dcl_id (load_dialog (make-xydwdcl)))
  225.   (new_dialog "clipxydw" dcl_id)
  226.   (if (= cxyrecordlst nil)(setq cxyrecordlst oldcxydate))
  227.   (setdate  cxyrecordlst)
  228.   (action_tile "accept" "(if (or(not(member (type (read (get_tile "ddx"))) (list 'INT 'REAL)))(not(member (type (read (get_tile "ddy"))) (list 'INT 'REAL))))(alert "输入框有非数字!") (progn(setq cxyrecordlst (getdate))(done_dialog 1)))")  
  229.   (setq dd (start_dialog))
  230.   (unload_dialog dcl_id)
  231.   (if (= dd 1)
  232.     (list
  233.       (nth 0 cxyrecordlst)
  234.       (nth 2 cxyrecordlst)
  235.       (atof (nth 3 cxyrecordlst))
  236.       (atof (nth 4 cxyrecordlst))
  237.     )
  238.   )
  239. )
  240. ;===================================
  241. ;写对话框
  242. (defun make-xydwdcl  (/ lst_str str file f)
  243.     (setq lst_str '(
  244. ""
  245. "clipxydw:dialog {"
  246. "    label = "复制坐标信息展点-参数设置" ;"
  247. "    :boxed_radio_row {"
  248. "        label = "“坐标行”格式" ;"
  249. "        :radio_button {"
  250. "            key = "xyform1" ;"
  251. "            label = "|序号|X|Y|" ;"
  252. "        }"
  253. "        :radio_button {"
  254. "            key = "xyform2" ;"
  255. "            label = "默认的4种之一" ;"
  256. "        }"
  257. "    }"
  258. "    :boxed_radio_column {"
  259. "        label = "默认的4种坐标行" ;"
  260. "        :text {"
  261. "            label = "① |X|Y|  ② |X|Y|H|  ③ |序号|X|Y|H|  ④ |序号|点名|X|Y|H|  " ;"
  262. "        }"
  263. "        :spacer {}"
  264. "        :text {"
  265. "            label = "从Excel,Word,记事本等复制坐标,表格、文本均可,空格或逗号分隔数据" ;"
  266. "        }"
  267. "    }"
  268. "    :boxed_column {"
  269. "        :toggle {"
  270. "            key = "XY-YX" ;"
  271. "            label = "X Y位置互换,即..|X|Y|..=>..|Y|X|.." ;"
  272. "        }"
  273. "    }"
  274. "    :boxed_row {"
  275. "        alignment = centered ;"
  276. "        label = "X Y平移量,例:y=29523356.3 =>y=523356.3,则-29000000" ;"
  277. "        :edit_box {"
  278. "            edit_width = 10.5 ;"
  279. "            fixed_width = true ;"
  280. "            key = "ddx" ;"
  281. "            label = "X平移 m" ;"
  282. "            width = 15 ;"
  283. "        }"
  284. "        :edit_box {"
  285. "            alignment = right ;"
  286. "            edit_width = 10.5 ;"
  287. "            fixed_width = true ;"
  288. "            key = "ddy" ;"
  289. "            label = "Y平移 m" ;"
  290. "            width = 15 ;"
  291. "        }"
  292. "        :spacer {}"
  293. "        :spacer {}"
  294. "    }"
  295. "    :spacer {}"
  296. "    :text {"
  297. "        label = " 切记! 切记!坐标信息复制至剪贴板再按\\"确定\\"。 by wzg356 2014/11/11" ;"
  298. "    }"
  299. "    :spacer {}"
  300. "    ok_cancel;"
  301. "}"
  302.         )
  303.     )
  304.     (setq file (vl-filename-mktemp "DclTemp.dcl"))
  305.     (setq f (open file "w"))
  306.     (foreach str lst_str
  307.   (princ "\n" f)
  308.   (princ str f)
  309.     )
  310.     (close f)
  311.     ;;返回
  312.     file
  313. )
  314. ;;;=================================================================*
  315. ;;;发动程序
  316. ;;;=====================================
  317. (defun c:cxy( / form xypos ddx ddy)
  318.   (vl-Load-COM)
  319.   (setq *ACAD*  (vlax-get-acad-object))
  320.   (mapcar 'set (list 'form 'xypos  'ddx 'ddy)(set_xydate))
  321.   (if(and form xypos ddx ddy)
  322.     (clip-coord-pl form xypos ddx ddy)
  323.   )
  324.   (princ)  
  325. )
  326. (princ "从剪贴板提取坐标数据画线程序已加载,命令:cxy")
  327. (princ)


本帖子中包含更多资源

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

x

评分

参与人数 3明经币 +3 金钱 +10 收起 理由
言戲無軍 + 1 很给力!
lucas_3333 + 1 + 10 神马都是浮云
USER2128 + 1 赞一个!

查看全部评分

"觉得好,就打赏"
还没有人打赏,支持一下
发表于 2024-11-16 16:59:16 | 显示全部楼层
(defun c:cxy( / form xypos ddx ddy)
        (vl-Load-COM)
        (setq *ACAD*  (vlax-get-acad-object))
        (mapcar 'set (list 'form 'xypos  'ddx 'ddy)(set_xydate))
        (if(and form xypos ddx ddy)
        此段         (clip-coord-pl form xypos ddx ddy)  出现异常。参数类型错误: stringp nil


35389914.024        3303257.464
35389874.852        3303137.260
35389867.604        3303118.306
35389840.114        3303061.687
使用的这种格式,选择的默认4种之一

回复 支持 反对

使用道具 举报

发表于 2024-11-16 16:53:30 | 显示全部楼层
decemc 发表于 2024-11-16 16:46
选默认的4种之一,发生错误,有人碰到过这种么

用VCCODE调试,没问题
加载后执行命令,又不行,
命令: cxy ; 错误: 参数类型错误: stringp nil
回复 支持 反对

使用道具 举报

发表于 2022-6-27 15:04:53 | 显示全部楼层
7年过去了,我才明白这是利器,谢谢楼主,我成长的太慢了
发表于 2015-12-22 16:55:03 | 显示全部楼层
谢谢分享………………
发表于 2015-12-22 17:25:54 | 显示全部楼层
谢谢分享………………
发表于 2019-7-26 14:54:57 | 显示全部楼层
感谢楼主分享
发表于 2020-9-22 10:22:26 | 显示全部楼层
很强大的功能 现在才发现
发表于 2021-4-1 15:08:41 | 显示全部楼层
楼主厉害,这个操作简单准确!
发表于 2022-6-6 15:41:05 | 显示全部楼层
7年过去了,我才明白这是利器,谢谢楼主,我成长的太慢了
发表于 2022-6-27 15:09:06 | 显示全部楼层
通用性很强,学习了
发表于 2024-11-16 16:46:41 | 显示全部楼层
选默认的4种之一,发生错误,有人碰到过这种么
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-12-24 01:03 , Processed in 0.207318 second(s), 33 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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