乐筑天下

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

[编程交流] 箭头在线

[复制链接]

55

主题

243

帖子

188

银币

后起之秀

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

铜币
275
发表于 2022-7-6 14:23:59 | 显示全部楼层 |阅读模式
我发现这段代码是由未知作者编写的。我想把它编辑成这样
箭头的大小不同。我想我必须编辑这行:
(λ(g)(vl位置(汽车g)'(-1 0 5 100 10 11 210)))
但我无法理解这些数字的含义。
我还想在同一行上添加另一个箭头
所以有两个箭头。有人知道这段代码是怎么工作的吗?
谢谢
 
 
  1. (defun c:pidarrow (/ Ent EntName Point 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.      (vl-remove-if
  20.        (function
  21.          (lambda (g) (vl-position (car g) '(-1 0 5 100 10 11 210)))
  22.        )
  23.        Ent
  24.      )
  25.      (list (cons 100 "AcDbPolyline") (cons 90 3) (cons 70 0))
  26.      (mapcar (function (lambda (p) (cons 10 p))) Points)
  27.      (list    (cons 40 4.)
  28.        (cons 41 0.)
  29.        (cons 10 (polar (cadr Points) (apply 'angle Points) 8.0))
  30.      )
  31.    )
  32.      )
  33.    )
  34.    (entdel EntName)
  35. )
  36. )
回复

使用道具 举报

12

主题

395

帖子

384

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
60
发表于 2022-7-6 14:28:25 | 显示全部楼层
我修改了代码(尽管我不同意它的工作原理),这样就可以在行的两侧都有一个箭头。我还注释了箭头的长度和宽度的更改位置。8.0是长度。
 
 
  1. (defun c:pidarrow (/ Ent EntName Point 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.      (vl-remove-if
  20.        (function
  21.          (lambda (g) (vl-position (car g) '(-1 0 5 100 10 11 210)))
  22.        )
  23.        Ent
  24.      )
  25.      (list (cons 100 "AcDbPolyline") (cons 90 4) (cons 70 0))
  26.                
  27.      (if (or (= (setq op (strcase (getstring "\nDo you want an arrow on both sides? (Yes or No): "))) "Y")
  28.          (= op "YES"))
  29.    (progn
  30.          (list   (cons 10 (polar (car Points) (apply 'angle Points) -8.0));length of arrow
  31.          (cons 40 0.)
  32.          (cons 41 2.)))); width of arrow
  33.      (mapcar (function (lambda (p) (cons 10 p))) Points)
  34.      (list    (cons 40 2.); width of arrow
  35.           (cons 41 0.)
  36.           (cons 10 (polar (cadr Points) (apply 'angle Points) 8.0)));length of arrow
  37.      )))
  38.    (entdel EntName)
  39.    (princ)
  40. )
  41. )
回复

使用道具 举报

55

主题

243

帖子

188

银币

后起之秀

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

铜币
275
发表于 2022-7-6 14:33:09 | 显示全部楼层
谢谢比尔。这并不是我真正想要的,尽管它也很有用。谢谢你教我如何调整箭头大小。我要做的是选择在一端指向同一方向的双箭头。下面是我试图调整的代码,以便它可以做到这一点,不幸的是,我的第二个箭头是线的长度!问题的一部分是我也不理解原始代码的一半。
  1. (defun c:pidarrow1 (/ Ent EntName Point Points FirstPt)
  2. (and
  3.    (setq Ent     (entsel "\nSelect Line near Arrow End: ");list of entity properties
  4.          Point   (cadr   Ent)
  5.          EntName (car    Ent);entity name
  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.     (setq FirstPt  (car(reverse Points)))
  17.   (setq SecondPt (polar (cadr Points)(apply 'angle Points)-2.5))
  18.       
  19.      (entmakex
  20.    (append
  21.      (list (cons 0 "LWPOLYLINE") (cons 100 "AcDbEntity"))
  22.      (vl-remove-if
  23.        (function
  24.          (lambda (g) (vl-position (car g) '(-1 0 5 100 10 11 210)))
  25.        )
  26.        Ent
  27.      )
  28.      (list (cons 100 "AcDbPolyline") (cons 90 4) (cons 70 0))
  29.                
  30.      (if (or (= (setq op (strcase (getstring "\nDo you want a double arrow head? (Yes or No): "))) "Y")
  31.          (= op "YES"))
  32.    (progn
  33.             (list   (cons 10 (polar FirstPt (apply 'angle Points) 2.5));length of arrow  
  34.                  (cons 40 0.)
  35.                  (cons 41 0.83333)))); width of arrow
  36.          (mapcar (function (lambda (p) (cons 10 p))) Points)
  37.      (list    (cons 40 0.83333); width of arrow
  38.           (cons 41 0.)
  39.           (cons 10 (polar (cadr Points) (apply 'angle Points) 2.5)));length of arrow
  40.      ))
  41.      )
  42.    (entdel EntName)
  43.    (princ)
  44. )
  45. )
回复

使用道具 举报

26

主题

1495

帖子

20

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
118
发表于 2022-7-6 14:37:10 | 显示全部楼层
如果你想要一条两端都有箭头的简单引线,我会用这样的方法:
大卫
回复

使用道具 举报

12

主题

395

帖子

384

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
60
发表于 2022-7-6 14:38:32 | 显示全部楼层
 
你能举一个双箭头应该是什么样子的例子吗?
回复

使用道具 举报

55

主题

243

帖子

188

银币

后起之秀

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

铜币
275
发表于 2022-7-6 14:45:18 | 显示全部楼层
它应该看起来像这样。。。。。。
我的最后一条代码信息就在那里了——第二个箭头延伸到了整行。
152402lli4csimpk1fm4xh.jpg
回复

使用道具 举报

12

主题

395

帖子

384

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
60
发表于 2022-7-6 14:47:18 | 显示全部楼层
你差点就成功了。
 
  1. (defun c:pidarrow (/ Ent EntName Point )
  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.      
  21.      
  22.      
  23.      (mapcar (function (lambda (p) (cons 10 p))) Points)
  24.      (list    (cons 40 2.); width of arrow
  25.           (cons 41 0.)
  26.           (cons 10 (setq npoint (polar (cadr Points) (apply 'angle Points) 8.0))));length of arrow
  27.      (if (or (= (setq op (strcase (getstring "\nDo you want a double arrow head? (Yes or No): "))) "Y")
  28.          (= op "YES"))
  29.        (list  (cons 40 2.); width of arrow
  30.           (cons 41 0.)
  31.           (cons 10 (polar npoint (apply 'angle Points) 8.0)))
  32.       
  33.        ))))
  34.      (entdel EntName)
  35.      (princ)
  36.      )
  37.    )
回复

使用道具 举报

0

主题

2

帖子

2

银币

初来乍到

Rank: 1

铜币
0
发表于 2022-7-6 14:52:02 | 显示全部楼层
这(原始)代码的作者真的很好,至少他对DXF代码非常熟悉。
 
如果我写了代码,我会使用图案填充而不是可变的PLine宽度。但给出的解决方案要好得多。
 
来自奥地利的问候-斯克里姆斯基
回复

使用道具 举报

12

主题

395

帖子

384

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
60
发表于 2022-7-6 14:55:03 | 显示全部楼层
 
如果我最初编写代码,我会使用leaders。只有我的2美分
回复

使用道具 举报

55

主题

243

帖子

188

银币

后起之秀

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

铜币
275
发表于 2022-7-6 14:57:06 | 显示全部楼层
谢谢Commandobill,太好了。还有一个问题,我明白了
 
(cons 40 2)或(cons 41 0)
 
什么样的数字是2。或0。而不是2.0或0.0?
 
编辑:我刚刚注意到箭头的尖端与直线的终点不在同一点上。因此,它使线路更长。
我会试着去修复它。。。
 
谢谢小鱼
回复

使用道具 举报

发表回复

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

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

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

GMT+8, 2025-3-5 01:11 , Processed in 0.536706 second(s), 74 queries .

© 2020-2025 乐筑天下

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