乐筑天下

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

[编程交流] 绘制线条的Lisp

[复制链接]

2

主题

12

帖子

10

银币

初来乍到

Rank: 1

铜币
10
发表于 2022-7-6 08:19:10 | 显示全部楼层 |阅读模式
大家好!我想要一些帮助与lisp绘制线从多个起点到多个终点。
 
如果直线不相交,并且以45个角度绘制直线,这将是有益的。
 
我会附上一个我想要的绘图示例。
 
我以前从未Lisp程序,所以我不知道这有多难。我知道一些脚本(自动热键)。
 
很高兴找到这个论坛。希望你能帮助我/指导我。
 
我愿意学习。
 
致以最诚挚的问候/T
实例图纸
实例图纸
回复

使用道具 举报

106

主题

1万

帖子

101

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1299
发表于 2022-7-6 08:23:38 | 显示全部楼层
你想要一个折线lisp其他人可能会想出一个更好的主意,我会选择开始点,选择一个大约水平的中点,然后结束点,这是一个足够,然后画一条线。您需要计算水平线与45线的交点,然后计算基本线pt1 pt2 pt3。你需要在4个象限内工作,因此你的45度方向正确,你需要计算出2条假想线,一条在45度,另一条在0度,然后你可以使用命令“inters”来计算中间连接点。
 
 
这并不难,但如果你从未做过Lisp程序。继续看这个帖子,现在有点忙,但其他人可能会帮上忙。
 
  1. (setq pt1 (getpoint))
  2. (setq pt2 (getpoint))
  3. (setq pt3 (getpoint))
  4. (setq ang (angle pt1p2))
  5. (cond
  6. (angle 0-1.5706 qaud 1) 45
  7. (angle 1.5707-3.1416 quad2)315
  8. (angle 3.1417-4.7123 quad 3)225
  9. (angle 4.712371-6.283185 quad4)135
  10. after cond can now work out inters
  11. )
回复

使用道具 举报

2

主题

12

帖子

10

银币

初来乍到

Rank: 1

铜币
10
发表于 2022-7-6 08:26:24 | 显示全部楼层
你发布的脚本将如何触发?我是说我用什么钥匙?
回复

使用道具 举报

106

主题

1万

帖子

101

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1299
发表于 2022-7-6 08:31:05 | 显示全部楼层
试试这个
 
  1. ; lisp to draw hor lines plus 45's between 2 points
  2. ; By BIGAL Jan 2012
  3. (defun c:horbend ()
  4. (setq pt1 (getpoint "\npick 1st point on terminal bar"))
  5. (setq pt2 (getpoint "\npick 2nd point "))
  6. ; ang2 is horiz lines ang3 is 45 lines
  7. (setq ang1 (angle pt1 pt2))
  8. (cond
  9. ((> ang1 4.412388)(setq ang2 0.0)(setq ang3 (* 0.75 pi)))
  10. ((> ang1 pi)(setq ang2 pi)(setq ang3 (* 0.25 pi)))
  11. ((> ang1 (/ pi 2.0))(setq ang2 PI)(setq ang3 (* 0.75 pi)))
  12. ((> ang1 0.0)(setq ang2 0.0)(setq ang3 (* 0.25 pi)))
  13. )
  14. (setq pt3 (polar pt1 ang2 20.0))
  15. (setq pt4 (polar pt2 ang3 20.0))
  16. (setq pt5 (inters pt1 pt3 pt2 pt4 nil))
  17. (command "line" pt1 pt5 pt2 "")
  18. )
  19. (princ)
回复

使用道具 举报

2

主题

12

帖子

10

银币

初来乍到

Rank: 1

铜币
10
发表于 2022-7-6 08:33:43 | 显示全部楼层
非常感谢。当我从侧面做的时候,它就起作用了。似乎不起作用的是,如果我想向上/向下画一些东西。
 
 

                               
登录/注册后可看大图

 
 
是否可以选择多个起点和多个终点?
 
谢谢你抽出时间。
回复

使用道具 举报

1

主题

1069

帖子

1050

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
69
发表于 2022-7-6 08:38:27 | 显示全部楼层
也试试这个,主要是从上面的代码中借用的
  1. (defun C:HORBEND(/ acsp adoc allset ang cr cs_lst da en end_lst i ip p1 p2 p3 pt sset ta tmp tp)
  2. ; credits to BIGAL
  3. ;local defuns
  4. ; Convert value in radians to degrees
  5. (defun rtd (a)
  6. (* 180.0 (/ a pi))
  7. )
  8. (prompt "\n\t Select number of circles within the terminal port: ")
  9. (if (setq sset (ssget '((0 . "circle") (40 . 100.0))))
  10. (progn
  11. (setq cs_lst nil
  12. end_lst nil
  13. )
  14. (or adoc (setq adoc (vla-get-activedocument (vlax-get-acad-object))))
  15. (or acsp (setq acsp (vla-get-block (vla-get-activelayout adoc))))
  16. (while
  17. (setq en (ssname sset 0))
  18. (setq pt (reverse (cdr (reverse (cdr (assoc 10 (entget en))))))
  19. tmp (list pt en)
  20. cs_lst (cons tmp cs_lst)
  21. )
  22. (ssdel en sset)
  23. )
  24. (setq cs_lst (vl-sort cs_lst '(lambda (a b) (> (cadar a) (cadar b)))))
  25. (prompt "\n\t Select circles to connect to selected just at one side: ")
  26. (setq allset (ssget '((0 . "circle") (40 . 100.0))))
  27. (foreach item cs_lst
  28. (ssdel (cadr item)
  29. allset
  30. )
  31. )
  32. (while
  33. (setq cr (ssname allset 0))
  34. (setq pt (reverse (cdr (reverse (cdr (assoc 10 (entget cr))))))
  35. tmp (list pt cr)
  36. end_lst (cons tmp end_lst)
  37. )
  38. (ssdel cr allset)
  39. )
  40. (if (/= (length cs_lst) (length end_lst))
  41. (progn
  42. (alert "Different numbers of start and and points")
  43. (exit)
  44. (princ)
  45. )
  46. )
  47. (setq end_lst (vl-sort end_lst '(lambda (a b) (> (cadar a) (cadar b)))))
  48. (setq i 0)
  49. (repeat (length cs_lst)
  50. (setq p1 (car (nth i cs_lst))
  51. p3 (car (nth i end_lst))
  52. p2 (list (car p3) (cadr p1))
  53. ang (angle p3 p1)
  54. da (rtd ang)
  55. ta
  56. (cond ((< 0. da 90.)
  57. (/ pi 4))
  58. ((< 90. da 180.)
  59. (* 0.75 pi))
  60. ((< 180. da 270.)
  61. (* pi 1.25))
  62. ((< 270. da 360.)
  63. (* pi 1.75))
  64. )
  65. tp (polar p3 ta (* 2 (getvar 'viewsize)))
  66. ip (inters p1 p2 p3 tp nil)
  67. )
  68. (vlax-invoke acsp 'addlightweightpolyline (apply 'append (list p1 ip p3)))
  69. (setq i (1+ i))
  70. )
  71. )
  72. )
  73. (princ)
  74. )
  75. (prompt "\n   ---   Start command with HORBEND   ---")
  76. (prin1)
  77. (or (vl-load-com) )
  78. (princ)

 
~'J'~
回复

使用道具 举报

2

主题

12

帖子

10

银币

初来乍到

Rank: 1

铜币
10
发表于 2022-7-6 08:42:58 | 显示全部楼层
谢谢你抽出时间。我不知道怎么用那个?它说当我标记圆时找到0。
回复

使用道具 举报

1

主题

1069

帖子

1050

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
69
发表于 2022-7-6 08:44:47 | 显示全部楼层
我用了你的附图做测试
回复

使用道具 举报

2

主题

12

帖子

10

银币

初来乍到

Rank: 1

铜币
10
发表于 2022-7-6 08:48:50 | 显示全部楼层
哦,当我使用这个例子时,它是有效的。也许圆直径很重要?我在哪里换?
 
还有,我如何使它也垂直工作?还是不可能?
回复

使用道具 举报

1

主题

1069

帖子

1050

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
69
发表于 2022-7-6 08:51:19 | 显示全部楼层
(setq sset(ssget’((0。“圆”)(40.100.0)))
100.0是半径,根据需要更改
 
对于垂直,您必须创建单独的lisp,
否则代码会太复杂,
我有点忙,对不起
回复

使用道具 举报

发表回复

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

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

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

GMT+8, 2025-3-9 08:08 , Processed in 0.541682 second(s), 86 queries .

© 2020-2025 乐筑天下

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