乐筑天下

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

[编程交流] 杂草lsp需要自动化

[复制链接]

1

主题

5

帖子

4

银币

初来乍到

Rank: 1

铜币
5
发表于 2022-7-6 08:57:51 | 显示全部楼层 |阅读模式
如何更改下面的代码,它不会每次都询问腿部长度和偏移量。如何将变量放入此代码中?偏移0.1mm,腿长1.2mm?此外,它还可以删除旧的多段线,而无需询问。
在这之后,我只需要写杂草和选择多段线,这就是它。
 
  1. (textscr)
  2. (princ(strcat
  3. "\n\n=========================WEED.LSP==========================="
  4. "\n\nWEED removes extranious verticies from LINEs or a POLYLINE."
  5. "\nShort segments less than the specified leg length ...AND..."
  6. "\nhaving an offset distance less than the minimum distance"
  7. "\nare removed. Try different combinations to get the result"
  8. "\ndesired. Changes can be undone by entering the U command"
  9. "\ntwice. The routine will convert LINEs to a POLYLINE providing"
  10. "\nthat all line segments endpoints match exactly. Additional"
  11. "\nverticies that have been added by a Spline or Fit curve can"
  12. "\nbe treated like "real" verticies, or can be ignored."
  13. "\n\nExample:    "
  14. "\nEnter offset distance: 10 <Enter number or pick 2 pts>"
  15. "\nEnter leg length: 100 <Enter number or pick 2 pts>"
  16. "\n\nAll included verticies having the longest leg less than 100"
  17. "\nAND being less than 10 from the original line will be removed."
  18. "\nIf you wish offset to control select a large leg length."
  19. "\nIf you wish leg length to control select a large offset."
  20. "\nJerry Workman CIS 70717,3564"
  21. "\nLoading..."))
  22. ;*----- Debugging stuff, load this file by entering LD<RETURN>
  23. ;(defun c:ld() (load "weed"))
  24. ;(defun c:ed() (command "q" "d:\\acad\\support\\weed.lsp"))
  25. ;*----- Error Routine
  26. (defun w-error (s) (redraw) (grtext)
  27. (princ "\nWeed Error: ") (princ s)
  28. (exit)
  29. )
  30. ;*----- Exit Routine
  31. (defun exit()
  32. (if (boundp 'f) (setq f (close f)))
  33. (setvar "cmdecho"  cmdecho)
  34. (setvar "blipmode" blipmode)
  35. (setq *error* olderr)
  36. (princ)
  37. )
  38. ;*----- Extract a field from a list
  39. (defun fld (num lst) (cdr (assoc num lst)))
  40. ;*----- Plot a temporary X
  41. (defun blip (blpoint / s x1 y1 x2 y2 p1 p2 p3 p4)
  42.   (setq s  (/ (getvar "viewsize") 100)      ; 1/100 of viewsize
  43.         x1 (+ (car blpoint) s)
  44.         y1 (- (cadr blpoint) s)
  45.         x2 (- (car blpoint) s)
  46.         y2 (+ (cadr blpoint) s)
  47.         p1 (list x1 y1) p2 (list x2 y2)
  48.         p3 (list x2 y1) p4 (list x1 y2))
  49.   (grdraw p1 p2 -1) (grdraw p3 p4 -1)
  50. )
  51. ;*----- Convert a line to a polyline entity
  52. (defun line2pline(ent / dat etype epnt ss1 ss2)
  53. (if ent (progn
  54.    (setq dat   (entget ent)
  55.          etype (fld 0 dat))
  56.    (if (= etype "LINE") (progn
  57.      (princ "\nConverting LINE to PLINE")
  58.      (setq epnt (fld 10 dat)
  59.            ss1 (ssadd ent)
  60.            ss2 (ssget "C" (getvar "EXTMIN") (getvar "EXTMAX")))
  61.      (ssdel ent ss2)
  62.      (command "pedit" ss1 "y" "j" ss2 "" "x")
  63.      (ssname (ssget epnt) 0) ; return the new entity name
  64.    )
  65.    ;else return nil
  66.      (progn (princ "\nNot a Line")
  67.        nil)
  68.    )
  69. );else
  70. (progn
  71.    (princ "\nNothing selected")
  72.    nil)
  73. )
  74. )
  75. ;*-----  Get a polyline or line entity
  76. (defun fetch(/ pl etyp flgs ans)
  77. (setq etyp nil)
  78. (while (not (or (= etyp "LINE") (= etyp "POLYLINE"))) (progn
  79.    (setq ename nil)
  80.    (setq e (car (entsel "\nSelect a PolyLine or Line: ")))
  81.    (if e (progn
  82.      (setq pl       (entget e)
  83.        etyp   (fld 0 pl)
  84.        ename  e)
  85.      (if (or (= etyp "LINE") (= etyp "POLYLINE")) (progn
  86.    (princ (strcat "\n" etyp " selected"))
  87.    (if (= etyp "LINE")
  88.      (setq e      (line2pline e)
  89.        ename  e
  90.        pl     (entget e))
  91.    ))
  92.      ;else
  93.    (progn    (princ "\nThat's not a LINE or POLYLINE, it's a ") (princ etyp))
  94.      ); end if
  95.    ); end progn
  96.    ; else
  97.      (princ "\nNothing Selected")
  98.    ); end if
  99. )); end while
  100. (setq flgs   (fld 70 pl))
  101. (setq closed (=(boole 1 flgs 1) 1))
  102. (if closed (princ "\nClosed Polyline"))
  103. (cond
  104.    ((=(boole 1 flgs 2) 2) (progn
  105.      (setq ptyp "F")
  106.      (princ "\nFit curve verticies have been added")))
  107.    ((=(boole 1 flgs 4) 4) (progn
  108.      (setq ptyp "S")
  109.      (princ "\nSpline curve verticies have been added...")))
  110.    (t    (setq ptyp "N"))      ;Normal polyline
  111. )
  112. (if(/= ptyp "N") (progn
  113.    (initget "Y N")
  114.    (if(= (getkword "\nDecurve polyline during weeding[y/N]:") "Y")
  115.      (setq ptyp "N"))
  116. ))
  117. )
  118. ;*----- Check vertex type
  119. (defun vt_ok ()
  120. (if (= etype "VERTEX")
  121.    (cond
  122.      ((= ptyp "F") (or(=(boole 1 flags 1) 1) (= flags 0)))
  123.      ((= ptyp "S") (>(boole 1 flags 9) 0))
  124.      (t        (=(boole 1 flags 25) 0)) ;"N" normal, 1 8 16 off
  125.    )
  126. ;else
  127.    t
  128. )
  129. )
  130. ;*----- extract the list containing vertex coordinates
  131. (defun get_vertex(/ vert etype sub_ent flags)
  132. (setq vert nil
  133.        etype nil)
  134. (while (and e (null vert) (/= etype "SEQEND")) (progn
  135.    (setq v     (entnext e)
  136.          e     v
  137.          etype nil)
  138.    (if e (progn
  139.      (setq sub_ent   (entget v)
  140.        flags     (fld 70 sub_ent)
  141.            etype     (fld 0  sub_ent))
  142.      ;(princ "flags =")(princ flags)
  143.      (if (vt_ok)
  144.    (if (= etype "VERTEX")
  145.      (setq vert_cnt (1+ vert_cnt)
  146.        vert     (fld 10 sub_ent))
  147.    ; else return
  148.      nil
  149.    )
  150.      )
  151.    ))
  152. ))
  153. )
  154. ;*----- Add a vertex to the temporary file for the new pline
  155. (defun add_vert(vt)
  156. (if (null f) (setq f (open "weedtmp.$$$" "w")))
  157. (prin1 vt f)
  158. (princ "\n" f)
  159. )
  160. ;*----- Read a vertex from the temporary file for the new pline
  161. (defun read_vert(/ pt)
  162.   (setq pt (read-line f))
  163.   (if pt (read pt) nil)
  164. )
  165. ;*----- Read new polyline from the tempory file
  166. (defun retrieve()
  167.    (setq f (open "weedtmp.$$$" "r"))
  168.    (command ".PLINE")
  169.    (setq v (read_vert))
  170.    (while v (progn
  171.      (command v)
  172.      (setq v (read_vert))
  173.    ))
  174.    (command "")
  175.   ;(command "del" "weedtmp.$$$")
  176. )
  177. ;*----- Check the internal angle and leg lengths then add or delete
  178. (defun check_it(/ ang dist1 dist2 dist offset off)
  179. (setq ang12  (abs(angle v1 v2))
  180.    ang13  (abs(angle v1 v3))
  181.    ang    (abs(- ang12 ang13))
  182.    dist1  (distance v1 v2)
  183.    dist2  (distance v2 v3)
  184.    dist   (max dist1 dist2)       ; largest distance
  185.    off    (* dist1 (sin ang))
  186.    offset (+ p_off off)
  187.    p_off  offset
  188. )
  189. (if
  190.    (and
  191.      (< offset max_offset)        ;offset distance criteria
  192.      (< dist    min_dist)        ;minimum leg length criteria
  193.    )
  194.    ;then skip middle vertex
  195.    (progn (blip v2)            ;mark the deleted vertex
  196.       (setq v2     v3
  197.         v3     (get_vertex)
  198.         skip_cnt    (1+ skip_cnt))
  199.      (princ "\nSkipping vertex # ") (princ (- vert_cnt 2))
  200. ;     (princ (strcat ", max_offset " (rtos max_offset 2 2) "
  201. ;            min_dist " (rtos min_dist 2 2)))
  202. ;     (princ (strcat ", offset " (rtos offset 2 2) " dist " (rtos dist 2 2)))
  203.    )
  204. ;else add first vertex to list
  205.    (progn
  206.      (add_vert v2)
  207.      (setq v1 v2
  208.            v2 v3
  209.        v3 (get_vertex)
  210.        p_off  0)
  211.    ); end progn
  212. ); end if
  213. )
  214. ;*----- The main routine...
  215. (defun C:WEED( / v1 v2 v3 ename v skip_cnt vert_cnt cmdecho blipmode f
  216.         olderr max_offset min_dist closed spline fit e_del
  217.         p_off vstart ptyp)
  218. (setq cmdecho  (getvar "cmdecho")
  219.        blipmode (getvar "blipmode")
  220.    olderr     *error*
  221.    *error*  w-error
  222. ;  *error* nil
  223.    skip_cnt 0
  224.    p_off     0
  225.    f     nil
  226.    vert_cnt 0
  227. )
  228. (setvar "cmdecho" 0)
  229. (setvar "blipmode" 0)
  230. (initget (+ 1 2 4))
  231. (setq max_offset (getdist "\nEnter offset distance: "))
  232. (initget (+ 1 2 4))
  233. (setq min_dist (getdist "\nEnter leg length: "))
  234. (initget "Y N")
  235. (setq e_del (getkword "\nDelete original Polyline [Y/n]: "))
  236. (if (null e_del) (setq e_del "Y"))
  237. (fetch)
  238. (princ "\nChecking polyline verticies...")
  239. (setq v1 (get_vertex)
  240.    vstart v1
  241.    v2 (get_vertex)
  242.        v3 (get_vertex))
  243. (add_vert v1)
  244. (while v3 (check_it))
  245. (if (< (distance v1 v2) min_dist)
  246.    (progn (setq skip_cnt (1+ skip_cnt))
  247.       (princ "\nSkipping vertex # ") (princ vert_cnt))
  248. ;else
  249.    (add_vert v1)
  250. ); end if
  251. (add_vert v2)
  252. (if closed (add_vert vstart))
  253. ; Delete old line and draw new Pline
  254. (if (> skip_cnt 0) (progn
  255.    (close f)
  256.    (if (= e_del "Y") (entdel ename))
  257.    (retrieve)
  258.    (princ (strcat "\n" (itoa skip_cnt) " verticies removed "
  259.           "out of " (itoa vert_cnt) " tested ("
  260.           (rtos(/ (* 100.0 skip_cnt) vert_cnt) 2 2)
  261.           ") percent"))
  262. )
  263. ;else
  264.    (princ "\nNothing to change!")
  265. )
  266. (exit)
  267. )
回复

使用道具 举报

8

主题

1133

帖子

1164

银币

初来乍到

Rank: 1

铜币
10
发表于 2022-7-6 09:05:00 | 显示全部楼层
你难道没有想过这个lisp是在1987年写的吗?直到现在,还没有人需要它实现自动化。
 
每个人的需求都是不同的,对你来说自动化只会对你有用。
 
这是学习lisp的绝佳机会,您可以完成例程,每次出现提示信息时,您都可以为该变量设置自己的值。然后你会有自己的个性化、自动化版本
回复

使用道具 举报

1

主题

5

帖子

4

银币

初来乍到

Rank: 1

铜币
5
发表于 2022-7-6 09:14:02 | 显示全部楼层
只为我。。。谢谢
回复

使用道具 举报

8

主题

1133

帖子

1164

银币

初来乍到

Rank: 1

铜币
10
发表于 2022-7-6 09:22:35 | 显示全部楼层
你可能会抓住一个心地善良的人。
 
但它为你提供了一个尝试自己的理想机会。lisp可以按原样工作,所以请尝试修补它,直到你让它做你想做的事情。
回复

使用道具 举报

1

主题

5

帖子

4

银币

初来乍到

Rank: 1

铜币
5
发表于 2022-7-6 09:30:31 | 显示全部楼层
我已经尝试在lsp中编码值。我只有错误,但我会让它发挥作用。
回复

使用道具 举报

3

主题

526

帖子

522

银币

初来乍到

Rank: 1

铜币
17
发表于 2022-7-6 09:37:16 | 显示全部楼层
 
好吧,这并不完全是没有人,因为我自己发现,做OP要求的事情很有用。我没有修改lisp,但是,我添加了一个带有命令宏的按钮。
 
在这种情况下,宏将为:Weed>Offset 0.1>leg length 1.2>Delete original Polyline N(或Y)
 
  1. Weed;.1;1.2;N;
回复

使用道具 举报

1

主题

5

帖子

4

银币

初来乍到

Rank: 1

铜币
5
发表于 2022-7-6 09:41:17 | 显示全部楼层
 
你的意思是:
  1. sub weeding()
  2. Weed;.1;1.2;N;
  3. end sub
??
 
这行不通。我试着用宏录制器录制http://www.cadstudio.cz/dl_file.asp?ID=548但似乎什么都没有记录。
回复

使用道具 举报

3

主题

526

帖子

522

银币

初来乍到

Rank: 1

铜币
17
发表于 2022-7-6 09:48:05 | 显示全部楼层
CUI>创建新命令
 
095756x3ygt83kkyqxwx9w.jpg
回复

使用道具 举报

1

主题

5

帖子

4

银币

初来乍到

Rank: 1

铜币
5
发表于 2022-7-6 09:54:03 | 显示全部楼层
非常感谢你!
回复

使用道具 举报

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-6 10:00:33 | 显示全部楼层
删除提示的修改实际上非常简单,更改:
第260-266行:
 
  1. (initget (+ 1 2 4))
  2. (setq max_offset (getdist "\nEnter offset distance: "))
  3. (initget (+ 1 2 4))
  4. (setq min_dist (getdist "\nEnter leg length: "))
  5. (initget "Y N")
  6. (setq e_del (getkword "\nDelete original Polyline [Y/n]: "))
  7. (if (null e_del) (setq e_del "Y"))

 
收件人:
 
  1.   (setq max_offset 0.1)
  2. (setq min_dist 1.2)
  3. (setq e_del "N")

 
(根据需要更改这些值,我刚刚使用了nestly发布的示例)
回复

使用道具 举报

发表回复

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

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

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

GMT+8, 2025-3-7 06:13 , Processed in 0.558845 second(s), 74 queries .

© 2020-2025 乐筑天下

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