乐筑天下

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

[编程交流] 箭头在线

[复制链接]

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-6 15:01:14 | 显示全部楼层
这仍然是一个真实的数字,但懒惰不把零
回复

使用道具 举报

55

主题

243

帖子

188

银币

后起之秀

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

铜币
275
发表于 2022-7-6 15:05:32 | 显示全部楼层
我试图调整代码,但我发现当添加箭头时,线条会移动-不知道为什么?此外,我还没有想出如何使第二个箭头的位置正确-它放在第一个箭头之上,而不是后面。
 
  1. (defun c:pidarrow (/ ent      entname      point
  2.             npoint      points       pt1
  3.             pt2      anglepts     arrowstart1
  4.             arrowstart2  arrowstart3 arrowstart4
  5.             pointssecond)
  6. (and
  7. (setq Ent     (entsel "\nSelect Line near Arrow End: "))
  8. (setq Point   (cadr Ent)
  9.      EntName (car Ent)
  10.      Ent     (entget EntName)
  11. );setq
  12. (= (cdr (assoc 0 Ent)) "LINE")
  13. (progn
  14. (setq Points (list (cdr (assoc 10 Ent)) (cdr (assoc 11 Ent)));10=start pt of line, 11=end pt of line
  15. Pt1 (cdr (assoc 10 Ent))
  16. Pt2 (cdr (assoc 11 Ent))
  17. AnglePts (angle Pt1 Pt2)
  18. ArrowStart1 (polar  Pt1   (+ AnglePts  pi ) -2.5)
  19. ArrowStart2 (polar  Pt2   (- AnglePts  pi ) 2.5)
  20. Points (list  ArrowStart1 ArrowStart2)
  21. ArrowStart3 (polar  ArrowStart1   (+ AnglePts  pi ) -2.5)
  22. ArrowStart4  (polar  ArrowStart2   (- AnglePts  pi ) 2.5)
  23. PointsSecond (list   ArrowStart3 ArrowStart4))
  24. (if (< (distance Point (car Points))
  25.       (distance Point (cadr Points))
  26. )
  27. (setq Points (reverse Points))
  28. );if
  29. (entmakex
  30. (append
  31. (list   (cons 0 "LWPOLYLINE")
  32.        (cons 100 "AcDbEntity")
  33. );list
  34. (list   (cons 100 "AcDbPolyline")
  35.        (cons 90 4);number of vertices?
  36.        (cons 70 0)
  37. );list
  38. (mapcar (function (lambda (p)
  39.        (cons 10 p))) Points)
  40. (list   (cons 40 0.833333); width of arrow
  41.        (cons 41 0.0)
  42.        (cons 10 (setq npoint (polar (cadr Points) (apply 'angle Points) 2.5)));length of arrow
  43.    );list
  44. (if (or (= (setq op (strcase (getstring "\nDo you want a double arrow head? (Yes or No): "))) "Y")
  45.        (= op "YES"))
  46. (list   (cons 40 0.833333); width of arrow
  47.        (cons 41 0.0)
  48.        (cons 10 (polar npoint (apply 'angle Points) 2.5)))
  49. );if
  50. );append
  51. );entmakex
  52. );progn
  53. (entdel EntName)
  54. (princ)
  55. );and
  56. )
  57. ;defun
回复

使用道具 举报

12

主题

395

帖子

384

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
60
发表于 2022-7-6 15:09:18 | 显示全部楼层
我马上看一下你的代码,但现在是这样
  1. (defun c:pidarrow (/ Ent EntName Point pang npoint p1 points )
  2. (and
  3.    (setq Ent (entsel "\nSelect Line near Arrow End: "))
  4.    (setq Point      (cadr Ent)
  5.      EntName (car Ent)
  6.      Ent      (entget EntName)
  7.      )
  8.    (= (cdr (assoc 0 Ent)) "LINE")
  9.    (progn
  10.      (setq Points (list (cdr (assoc 10 Ent)) (cdr (assoc 11 Ent))))
  11.      (if (< (distance Point (car Points))
  12.         (distance Point (cadr Points))
  13.         )
  14.    (setq Points (reverse Points))
  15.    )
  16.      (entmakex
  17.    (append
  18.      (list (cons 0 "LWPOLYLINE") (cons 100 "AcDbEntity"))
  19.      (list (cons 100 "AcDbPolyline") (cons 90 4) (cons 70 0))
  20.      (if (or (= (setq op (strcase (getstring "\nDo you want a double arrow head? (Yes or No): "))) "Y")
  21.          (= op "YES"))
  22.        (list (cons 10 (setq p1 (car points)))
  23.          (cons 10 (setq npoint (polar  p1 (setq pang (apply 'angle Points)) (- (distance p1 (cadr points)) 16.0)))))
  24.        (list (cons 10 (setq p1 (car points)))
  25.          (cons 10 (setq npoint (polar  p1 (setq pang (apply 'angle Points)) (- (distance p1 (cadr points)) 8.0))))))
  26.      
  27.      (list (cons 40 2.0); width of arrow
  28.        (cons 41 0.0)
  29.        (cons 10 (setq npoint (polar npoint pang 8.0))));length of arrow
  30.      (if (or (= op "Y")
  31.          (= op "YES"))
  32.        (list (cons 40 2.0); width of arrow
  33.          (cons 41 0.0)
  34.          (cons 10 (polar npoint pang 8.0)))
  35.        ))))
  36.    (entdel EntName)
  37.    (princ)
  38.    )
  39. )
回复

使用道具 举报

55

主题

243

帖子

188

银币

后起之秀

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

铜币
275
发表于 2022-7-6 15:12:44 | 显示全部楼层
嘿,谢谢你,Commandobill,太棒了。我的尝试不是正确的方法。我从这段代码中学到了一些东西。
干杯小鱼
回复

使用道具 举报

55

主题

243

帖子

188

银币

后起之秀

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

铜币
275
发表于 2022-7-6 15:15:25 | 显示全部楼层
我现在已经改进了代码,因此它还将接受2条垂直多段线,并对非直线或2条垂直多段线的实体进行错误补漏白。
我只是想和任何想用它的人分享。。。。。。
 
  1. 7
回复

使用道具 举报

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-6 15:17:02 | 显示全部楼层
这段代码可以变得更加简洁
 
试试这个:
 
[code]defunc:pidarrow[Entx elst ent ptlst ang opvl load com[color=RED[color]prognif[color][color=BLUE entsel][color]“\n选择线条或2个垂直线:“。[/color b][颜色=红色](condeq“LINE”cdadrsetq[elst红色](setqentcar[color=BLUE setq][color][ptlst[color=BLUE b][color=BLUE list][color=BLUE红色](cdrassoc10elst[color=BLUE cdr[color=BLUE assoc color][color=BLUE 11elst)。)[color]nileq“LWPOLYLINE”[color=BLUE cdadr][cdadr][color=BLUEentgetent 如果[color][color=BLUE b]ptlstmapcarcdr[color=BLUE vl remove if not[color=BLUE lambda[红色](x[颜色=红色]([color]10[color]car[color]x[elst][/color b]2princ“\n**多段线有两个以上的顶点**”[color=BLUE nil[/color b][color=BLUE t]([/color b][color=RED=BLUE]princ“**选择的对象无效**”princsetqptlstvl sortptlst[color=BLUE lambda][color][x1 x2 b][color=BLUE
回复

使用道具 举报

55

主题

243

帖子

188

银币

后起之秀

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

铜币
275
发表于 2022-7-6 15:22:12 | 显示全部楼层
李-麦克感谢你上的压实课。我明白了,你用的是没有零的实数,即2。或0还是剪贴画上的?
小鱼
回复

使用道具 举报

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-6 15:26:18 | 显示全部楼层
 
随便我喜欢什么真的
 
请注意我构建对象选择的方式。我倾向于避免过多地使用(exit)函数。
 
此外,我使用了getkword(和COND)来选择箭头,这比getstring可靠得多。
回复

使用道具 举报

发表回复

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

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

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

GMT+8, 2025-3-5 04:59 , Processed in 1.462939 second(s), 66 queries .

© 2020-2025 乐筑天下

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