乐筑天下

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

[编程交流] 帮我完成Lisp程序。。。恳求

[复制链接]

23

主题

89

帖子

66

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
115
发表于 2022-7-6 08:06:18 | 显示全部楼层 |阅读模式
大家好,
 
我的while声明有问题,希望你能帮助我。我想从块上画一条线,垂直于最近的线。我想通过窗口选择来实现这一点。
 
  1. (defun C:QQ ()(load "C:\\Lisp\\driveway.lsp"))
  2. (vl-load-com)
  3. (defun _line ( a b c) (entmakex (list (cons 0 "LINE") (cons 10 a) (cons 11 b) (cons 8 c))))
  4. (defun C:AA (/)
  5. (setq ss (ssget ":L" '((0 . "INSERT,LINE") (8 . "CHOUSE,CROAD"))))
  6. (setq ssb (ssadd));;blocks-selection set;;
  7. (setq ssl (ssadd));;line-selection set;;
  8. (setq ct 0)  
  9. (while (< ct (sslength ss))
  10. (setq en (ssname ss ct))
  11. (if (= "INSERT" (cdr (assoc 0 (entget en)))) (ssadd en ssb))
  12. (setq ct (+ ct 1))
  13. )
  14. (setq ct 0)  
  15. (while (< ct (sslength ss))
  16. (setq en (ssname ss ct))
  17. (if (= "LINE" (cdr (assoc 0 (entget en)))) (ssadd en ssl))
  18. (setq ct (+ ct 1))
  19. )
  20. (setq ctb 0)
  21. (setq ctl 0)
  22. (while (< ctb (sslength ssb))[color="red"]from this part, it's driving me insane[/color]
  23. (setq ed (ssname ssb ctb))
  24. (setq cd (cdr(assoc 10 (entget ed))))
  25. (setq d1 '(0 0))
  26.   
  27.    (while (< ctl (sslength ssl))
  28.        (setq el (ssname ssl ctl))
  29. (setq vla-el (vlax-ename->vla-object el))
  30. (setq d (vlax-curve-getClosestPointToProjection vla-el cd '(0 0 0)))
  31. (if (< (distance cd d) (distance d1 cd)) (setq d1 d))
  32. (setq ctl (+ ctl 1))
  33. )
  34. (_line cd d1 "CDRIVEWAY")
  35. (setq ctb (+ ctb 1))[color="red"]I'm really insane right here[/color]
  36. )
  37. (princ)
  38. )

 
谢谢
回复

使用道具 举报

106

主题

1万

帖子

101

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1299
发表于 2022-7-6 08:15:58 | 显示全部楼层
我认为你的括号不对,我把);如果结束);end while,这样我就可以看到这组行的结束位置,从而更容易找到缺少的括号。
 
添加);结束卸载并检查
回复

使用道具 举报

23

主题

89

帖子

66

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
115
发表于 2022-7-6 08:20:18 | 显示全部楼层
我对代码进行了一点修改,但仍然没有按照我的意图进行操作。现在它只创建从块到只有一条线的垂直线。我的声明“红色”有点不对劲,我想不出来。谢谢你的时间比格尔,真的很感谢。
 
  1. (defun C:test (/ dl ss  ct en ssl ssb ctl ctb cd ed d el vla-el p)
  2. (setq ss (ssget ":L" '((0 . "INSERT,LINE") (8 . "CHOUSE,CROAD"))))
  3. (setq ssb (ssadd)[color="green"];;blocks-selection set;;[/color]
  4.      ssl (ssadd))[color="green"];;line-selection set;; [/color]
  5. (setq ct 0)  [color="green"];;;begin ssadd ssb;;;[/color]
  6. (while (< ct (sslength ss))
  7. (setq en (ssname ss ct))
  8. (if (= (cdr (assoc 0 (entget en))) "INSERT") (ssadd en ssb))
  9. (setq ct (+ ct 1))
  10. )[color="green"] ;;;;end ssadd ssb;;;[/color]
  11. (setq ct 0)  [color="green"];;;begin ssadd ssl;;;;;;;;;[/color]
  12. (while (< ct (sslength ss))
  13. (setq en (ssname ss ct))
  14. (if (= (cdr (assoc 0 (entget en))) "LINE") (ssadd en ssl))
  15. (setq ct (+ ct 1)) [color="green"] ;;;end ssadd ssl;;;;;;;;;[/color]
  16. )
  17. (setq ctb 0)[color="green"];;;counter for blocks[/color]
  18. (setq ctl 0)[color="green"];;;counter for lines[/color]
  19. [color="red"](while (< ctb (sslength ssb))[/color] [color="green"];;;begin while blocks [/color]
  20. [color="red"](setq ed (ssname ssb ctb)
  21.      cd (cdr(assoc 10 (entget ed)))
  22.      d1 '(0 0))[/color]
  23. [color="red"] (while (< ctl (sslength ssl))[/color] [color="#2e8b57"][color="green"];;; iterate ssl for the nearest line for ssname (ed);;;[/color][/color]
  24. [color="red"](setq el (ssname ssl ctl)
  25.       vla-el (vlax-ename->vla-object el)
  26.       d (vlax-curve-getClosestPointToProjection vla-el cd '(0 0 0)))
  27. (if (< (distance cd d) (distance cd d1)) (setq p vla-el d1 d))[/color][color="green"];;;store the nearest line and loop[/color]
  28.                                                               [color="green"];;;store nearest distance for compare;;;[/color]
  29. (setq ctl (+ ctl 1))
  30. ) [color="green"];;;end while looking for nearest line for block ed;;;[/color]
  31. (setq ctb (+ ctb 1))
  32. (_line cd (vlax-curve-getClosestPointToProjection p cd '(0 0 0))) [color="green"];;; draw a line from the block;;;;[/color]
  33.                                                                [color="green"] ;;; to the nearest line;;;
  34. );;;end while blocks[/color]
  35. (princ)
  36. )[color="green"];;;end defun[/color]
  37. (vl-load-com)
  38. (defun _line ( a b ) (entmakex (list (cons 0 "LINE") (cons 10 a) (cons 11 b))))
回复

使用道具 举报

106

主题

1万

帖子

101

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1299
发表于 2022-7-6 08:21:35 | 显示全部楼层
这是一个新的VL函数吗?
回复

使用道具 举报

23

主题

89

帖子

66

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
115
发表于 2022-7-6 08:27:39 | 显示全部楼层
 
不,我只是使用vla preffix来知道它是变量中的vl对象。我的一个坏习惯。
 
谢谢你,比格尔,不用麻烦了,我已经完成了例行程序。
回复

使用道具 举报

63

主题

6297

帖子

6283

银币

后起之秀

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

铜币
358
发表于 2022-7-6 08:33:07 | 显示全部楼层
 
我猜这是一个变量名。。。
  1. (setq el (ssname ssl ctl)
  2.       [b][color="blue"]vla-el[/color][/b] (vlax-ename->vla-object el)
  3. )
回复

使用道具 举报

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-6 08:40:21 | 显示全部楼层
这就是我如何完成任务的方法,希望您可以从我的代码LISP2LEARN中学习
 
  1. ([color=BLUE]defun[/color] c:blkline ( [color=BLUE]/[/color] d1 d2 el en in l1 l2 p2 p3 ss )
  2.    ([color=BLUE]if[/color] ([color=BLUE]setq[/color] ss ([color=BLUE]ssget[/color] '((0 . [color=MAROON]"INSERT,LINE"[/color]))))
  3.        ([color=BLUE]progn[/color]
  4.            ([color=BLUE]repeat[/color] ([color=BLUE]setq[/color] in ([color=BLUE]sslength[/color] ss))
  5.                ([color=BLUE]setq[/color] en ([color=BLUE]ssname[/color] ss ([color=BLUE]setq[/color] in ([color=BLUE]1-[/color] in)))
  6.                      el ([color=BLUE]entget[/color] en)
  7.                )
  8.                ([color=BLUE]if[/color] ([color=BLUE]eq[/color] [color=MAROON]"LINE"[/color] ([color=BLUE]cdr[/color] ([color=BLUE]assoc[/color] 0 el)))
  9.                    ([color=BLUE]setq[/color] l1 ([color=BLUE]cons[/color] en l1))
  10.                    ([color=BLUE]setq[/color] l2 ([color=BLUE]cons[/color] ([color=BLUE]trans[/color] ([color=BLUE]cdr[/color] ([color=BLUE]assoc[/color] 10 el)) en 0) l2))
  11.                )
  12.            )
  13.            ([color=BLUE]foreach[/color] p1 l2
  14.                ([color=BLUE]setq[/color] p2 ([color=BLUE]vlax-curve-getclosestpointto[/color] ([color=BLUE]car[/color] l1) p1)
  15.                      d1 ([color=BLUE]distance[/color] p1 p2)
  16.                )
  17.                ([color=BLUE]foreach[/color] en ([color=BLUE]cdr[/color] l1)
  18.                    ([color=BLUE]setq[/color] p3 ([color=BLUE]vlax-curve-getclosestpointto[/color] en p1)
  19.                          d2 ([color=BLUE]distance[/color] p1 p3)
  20.                    )
  21.                    ([color=BLUE]if[/color] ([color=BLUE]<[/color] d2 d1) ([color=BLUE]setq[/color] d1 d2 p2 p3))
  22.                )
  23.                ([color=BLUE]entmake[/color] ([color=BLUE]list[/color] '(0 . [color=MAROON]"LINE"[/color]) ([color=BLUE]cons[/color] 10 p1) ([color=BLUE]cons[/color] 11 p2)))
  24.            )
  25.        )
  26.    )
  27.    ([color=BLUE]princ[/color])
  28. )
  29. ([color=BLUE]vl-load-com[/color]) ([color=BLUE]princ[/color])
回复

使用道具 举报

23

主题

89

帖子

66

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
115
发表于 2022-7-6 08:43:10 | 显示全部楼层
 
不客气。
 
 
ssget函数不允许其他用户输入函数允许的自定义提示消息;但是,您可以构造一个ssget包装器来进行一些欺骗:
 
  1. (entsel) -->> [color="red"]"Select object:"[/color]
  2. (entsel "\nSelect a block:") -->> [color="red"]"Select a block:"[/color]

 
例如。:
 
  1. ;; _ssget  -  Lee Mac
  2. ;; ssget wrapper function to allow a custom prompt message
  3. ;; msg  = prompt
  4. ;; args = list of standard ssget parameters
  5. ;; Returns: Selection Set or nil
  6. (defun _ssget ( msg args / sel )
  7.    (princ msg)
  8.    (setvar 'NOMUTT 1)
  9.    (setq sel (vl-catch-all-apply 'ssget args))
  10.    (setvar 'NOMUTT 0)
  11.    (if (and sel (null (vl-catch-all-error-p sel)))
  12.        sel
  13.    )
  14. )
回复

使用道具 举报

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-6 08:49:19 | 显示全部楼层
谢谢李,效果很好。
回复

使用道具 举报

23

主题

89

帖子

66

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
115
发表于 2022-7-6 08:55:05 | 显示全部楼层
不客气LISP2LEARN
回复

使用道具 举报

发表回复

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

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

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

GMT+8, 2025-3-9 21:44 , Processed in 0.348579 second(s), 72 queries .

© 2020-2025 乐筑天下

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