乐筑天下

搜索
欢迎各位开发者和用户入驻本平台 尊重版权,从我做起,拒绝盗版,拒绝倒卖 签到、发布资源、邀请好友注册,可以获得银币 请注意保管好自己的密码,避免账户资金被盗
楼主: SlopeSilviu

[编程交流] 从中提取长度和角度

[复制链接]

14

主题

719

帖子

706

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
70
发表于 2022-7-6 10:11:03 | 显示全部楼层
 
输入MKLNS在加载Lisp后运行它。
回复

使用道具 举报

4

主题

327

帖子

324

银币

初来乍到

Rank: 1

铜币
19
发表于 2022-7-6 10:14:54 | 显示全部楼层
复制此帖子中的代码
将其粘贴到记事本中
将记事本另存为“test.lsp”(使用“另存为”对话框中的引号将类型另存为.lsp)
在AutoCAD中应用测试。lsp
在命令行上键入mklns
回复

使用道具 举报

18

主题

434

帖子

422

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
94
发表于 2022-7-6 10:16:08 | 显示全部楼层
快速测试:从论坛复制源文件并将其粘贴到AutoCAD的命令行中。接下来键入名称(klns)以启动它。
如果保存了lisp文件,则可以使用Appload命令加载该文件,或仅在AutoCAD的绘图区域中拖动该文件。
回复

使用道具 举报

pBe

32

主题

2722

帖子

2666

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
211
发表于 2022-7-6 10:20:40 | 显示全部楼层
  1. (defun c:test (/ CreateList _grAngle adoc Plines obj cnt ent ObjectPointList
  2.                 PtAngleList Xpoint gr NewLine
  3.                 )
  4. ;;; pBe April 2011  ;;;
  5. (vl-load-com)
  6. (defun CreateList (p)
  7.    (setq ObjectPointList (cons (cdr p) ObjectPointList))
  8.    )
  9. ;;;  Alanjt  ;;;
  10. (defun _grAngle (a b)
  11.    (grdraw (trans a 0 1) (cadr gr) 1 -1)
  12.    (angle a b)
  13.    )
  14. ;;;      ;;;
  15. (setq adoc (vla-get-activedocument (vlax-get-acad-object)))
  16. (if (setq Plines (ssget ":L" '((0 . "LWPOLYLINE"))))
  17.     (progn
  18.       (repeat (setq cnt (sslength Plines))
  19.         (setq obj (ssname Plines (setq cnt (1- cnt)))
  20.           ent (entget obj)
  21.           )
  22.         (mapcar 'CreateList
  23.           (vl-remove-if-not '(lambda (x) (= (car x) 10)) ent)
  24.           )
  25.         (ssdel obj Plines)
  26.         )
  27. (if ObjectPointList
  28.        (progn
  29.        (setq PtAngleList (open (strcat (getvar 'Dwgprefix)(vl-filename-base (getvar 'Dwgname)) ".csv") "A"))
  30. ;;;  Alanjt  ;;;
  31.           (while (eq 5 (car (setq gr (grread T 15 0))))
  32.             (setq Xpoint (trans (cadr gr) 1 0))
  33.             (redraw)
  34.             (foreach pts ObjectPointList (_grAngle pts Xpoint))
  35.                )
  36. ;;;                    ;;;
  37.           (redraw)
  38.           (foreach
  39.              itm ObjectPointList
  40.             (setq NewLine
  41.                (vla-addline
  42.                  (vlax-get (vla-get-activelayout adoc) 'Block)
  43.                  (vlax-3d-point Xpoint)
  44.                  (vlax-3d-point itm)
  45.                  )
  46.               )
  47.                    (write-line (strcat (rtos (vla-get-length NewLine) 2 2) ","
  48.                        (rtos (vla-get-Angle NewLine) 2 2)) PtAngleList)
  49.             )
  50.         (close PtAngleList)
  51.           )
  52.         )
  53.       )
  54.    )
  55. (princ)
  56. )
回复

使用道具 举报

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-6 10:22:04 | 显示全部楼层
pBe,
 
一些建设性的批评,我希望能有所帮助:注意,在grRead循环中不需要角度计算,因为您没有使用“u grAngle”的返回,而且,在测量直线的长度和角度时,使用距离和角度函数可能更快。
 
我可以这样做:
 
  1. (defun c:test ( / e fl gr i pt pu pw ss )  
  2. (if
  3.    (and
  4.      (setq ss (ssget '((0 . "LWPOLYLINE"))))
  5.      (setq fl (getfiled "Output File" "" "csv" 1))
  6.    )
  7.    (progn      
  8.      (repeat (setq i (sslength ss))
  9.        (foreach x (entget (setq e (ssname ss (setq i (1- i)))))
  10.          (if (= 10 (car x))
  11.            (setq pw (cons (trans (cdr x) e 0) pw)
  12.                  pu (cons (trans (cdr x) e 1) pu)
  13.            )
  14.          )
  15.        )
  16.      )      
  17.      (while (= 5 (car (setq gr (grread t 13 0)))) (redraw)
  18.        (setq pt (cadr gr))        
  19.        (foreach x pu (grdraw x pt 1 -1))
  20.      )      
  21.      (setq pt (trans pt 1 0))
  22.      (if (setq fl (open fl "w"))
  23.        (progn
  24.          (foreach x pw
  25.            (entmakex (list (cons 0 "LINE") (cons 10 x) (cons 11 pt)))
  26.            (write-line (strcat (rtos (distance pt x)) "," (angtos (angle pt x))) fl)
  27.          )
  28.          (close fl)
  29.        )
  30.      )
  31.    )
  32. )
  33. (redraw) (princ)
  34. )
回复

使用道具 举报

pBe

32

主题

2722

帖子

2666

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
211
发表于 2022-7-6 10:26:44 | 显示全部楼层
你的批评确实很有帮助,而且总是受欢迎的。我当时想知道为什么我在(当…读…)之后一直出错线路使用(cond…)。谢谢你的提醒。
 
我想完全消除线的创建,并使用点列表中的距离和角度,因为代码的目的是将数据写入文件。
 
 
我认识到你批评李的价值。
特纳克一百万
 
回复

使用道具 举报

pBe

32

主题

2722

帖子

2666

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
211
发表于 2022-7-6 10:30:17 | 显示全部楼层
消除无法使用运行osnap的问题
 
  1. (defun c:test ( / e fl gr i pt pu pw ss Op accept )  
  2. (if
  3.    (and
  4.      (setq ss (ssget '((0 . "LWPOLYLINE"))))
  5.      (setq fl (getfiled "Output File" "" "csv" 1))
  6.    )
  7.    (progn      
  8.      (repeat (setq i (sslength ss))
  9.        (foreach x (entget (setq e (ssname ss (setq i (1- i)))))
  10.          (if (= 10 (car x))
  11.            (setq pw (cons (trans (cdr x) e 0) pw)
  12.                  pu (cons (trans (cdr x) e 1) pu)
  13.            )
  14.          )
  15.        )
  16.      )
  17.     [color=blue](while (not accept) [/color]
  18. [color=darkolivegreen] (setq pt (getpoint "\nSelect Point: ") op nil) [/color]
  19. [color=blue]  (foreach x pu (grdraw x pt 1 -1))[/color]
  20. [color=blue]  (while (not (member Op '(97 32))) [/color]
  21. [color=blue]    (princ "\n<A>ccept Spacebar for other point")(princ)[/color]
  22. [color=blue]  (setq Op (cadr (grread))))[/color]
  23. [color=blue]     (if ( = Op 97)(setq accept T))[/color]
  24. [color=blue]    (redraw))[/color]
  25. [color=darkolivegreen](setq pt (trans pt 1 0))[/color]
  26.     (if (setq fl (open fl "w"))
  27.        (progn
  28.          (foreach x pw
  29.            (entmakex (list (cons 0 "LINE") (cons 10 x) (cons 11 pt)))
  30.            (write-line (strcat (rtos (distance pt x)) "," (angtos (angle pt x))) fl)
  31.          )
  32.          (close fl)
  33.        )
  34.      )
  35.    )
  36. )
  37. (redraw) (princ)
  38. )
回复

使用道具 举报

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-6 10:30:54 | 显示全部楼层
好主意!
 
注意(trans nil)以及grdraw使用UCS点
 
另一种方法可能是使用getkword:
 
  1. (defun c:test ( / e fl gr go i pt pu pw ss )  
  2. (if
  3.    (and
  4.      (setq ss (ssget '((0 . "LWPOLYLINE"))))
  5.      (setq fl (getfiled "Output File" "" "csv" 1))
  6.    )
  7.    (progn      
  8.      (repeat (setq i (sslength ss))
  9.        (foreach x (entget (setq e (ssname ss (setq i (1- i)))))
  10.          (if (= 10 (car x))
  11.            (setq pw (cons (trans (cdr x) e 0) pw)
  12.                  pu (cons (trans (cdr x) e 1) pu)
  13.            )
  14.          )
  15.        )
  16.      )
  17.      (while (and (not go) (setq pt (getpoint "\nSpecify Point: ")))
  18.        (redraw)
  19.        (foreach x pu (grdraw x pt 1 -1))
  20.        (initget "Yes No")
  21.        (setq go (/= "No" (getkword "\nAccept Point? [Yes/No] <Yes>: ")))
  22.      )
  23.          
  24.      (if (and pt (setq fl (open fl "w")))
  25.        (progn
  26.          (setq pt (trans pt 1 0))
  27.          (foreach x pw
  28.            (entmakex (list (cons 0 "LINE") (cons 10 x) (cons 11 pt)))
  29.            (write-line (strcat (rtos (distance pt x)) "," (angtos (angle pt x))) fl)
  30.          )
  31.          (close fl)
  32.        )
  33.      )
  34.    )
  35. )
  36. (redraw) (princ)
  37. )
回复

使用道具 举报

pBe

32

主题

2722

帖子

2666

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
211
发表于 2022-7-6 10:35:29 | 显示全部楼层
 
关于trans Lee(修改代码)tnx你死定了
你能给我解释一下Grdraw在UCS分数方面的可怕之处吗
回复

使用道具 举报

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-6 10:38:28 | 显示全部楼层
 
这样更好
 
对不起,你说的“关于UCS分数的Grdraw的恐怖”是什么意思?
回复

使用道具 举报

发表回复

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

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

QQ|关于我们|小黑屋|乐筑天下 繁体中文

GMT+8, 2025-3-7 02:26 , Processed in 0.353169 second(s), 71 queries .

© 2020-2025 乐筑天下

联系客服 关注微信 帮助中心 下载APP 返回顶部 返回列表