乐筑天下

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

[编程交流] Lisp绘制箭头

[复制链接]

54

主题

3755

帖子

3583

银币

后起之秀

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

铜币
438
发表于 2022-7-6 09:09:04 | 显示全部楼层
我前阵子做了两个(比任何事情都重要)只是使用了当前的标注样式,并为箭头创建了一个常规的引线:
 
  1. (defun c:Arrow (/ _group _dist lastentity p1 p2 ent obj gr coords pt)
  2. ;; Draw quick arrow
  3. ;; Alan J. Thompson, 03.13.11
  4. (defun _group (l)
  5.    (if (caddr l)
  6.      (cons (list (car l) (cadr l) (caddr l)) (_group (cdddr l)))
  7.    )
  8. )
  9. (defun _dist (a b) (distance (list (car a) (cadr a)) (list (car b) (cadr b))))
  10. (setq lastentity (entlast))
  11. (if (and (setq p1 (getpoint "\nSpecify first point: "))
  12.           (setq p2 (getpoint p1 "\nSpecity next point: "))
  13.           (vl-cmdf "_.leader" "_non" p2 "_non" p1 "" "" "_N")
  14.           (not (equal lastentity (setq ent (entlast))))
  15.           (setq obj (vlax-ename->vla-object ent))
  16.      )
  17.    (while (eq 5 (car (setq gr (grread T 15 0))))
  18.      (redraw)
  19.      (grdraw (cadr gr)
  20.              (trans (vlax-curve-getClosestPointTo ent (setq pt (trans (cadr gr) 1 0))) 0 1)
  21.              3
  22.              -1
  23.      )
  24.      (if
  25.        (equal
  26.          (last (setq coords (_group (vlax-get obj 'Coordinates))))
  27.          (car (vl-sort coords (function (lambda (a b) (< (_dist a pt) (_dist b pt))))))
  28.        )
  29.         (vlax-put obj 'Coordinates (apply (function append) (reverse coords)))
  30.      )
  31.      (grdraw (cadr gr) (trans (car coords) 0 1) 1 -1)
  32.    )
  33. )
  34. (redraw)
  35. (princ)
  36. )
  37. (defun c:ArrowM
  38.       (/ _group _getPoints _arrow _closestpt AT:Arrow lastentity AT:Midpoint lst ent obj gr coords)
  39. ;; Draw Arrow
  40. ;; Alan J. Thompson, 03.13.11
  41. (defun _group (l)
  42.    (if (caddr l)
  43.      (cons (list (car l) (cadr l) (caddr l)) (_group (cdddr l)))
  44.    )
  45. )
  46. (defun _getPoints (/ lst pt)
  47.    (if (car (setq lst (list (getpoint "\nSpecify first point: "))))
  48.      ((lambda (color)
  49.         (while (setq pt (getpoint (car lst) "\nSpecify next point: "))
  50.           (redraw)
  51.           (mapcar (function (lambda (a b) (and a b (grdraw a b color -1))))
  52.                   (setq lst (cons pt lst))
  53.                   (cdr lst)
  54.           )
  55.           (AT:Arrow (car lst) (angle (cadr lst) (car lst)))
  56.         )
  57.         (redraw)
  58.         lst
  59.       )
  60.        (cdr (assoc 62 (tblsearch "LAYER" (getvar 'CLAYER))))
  61.      )
  62.    )
  63. )
  64. (defun _arrow (lst)
  65.    (mapcar
  66.      (function
  67.        (lambda (a b)
  68.          (and a b (AT:Arrow (trans (AT:MidPoint a b) 0 1) (angle (trans b 0 1) (trans a 0 1))))
  69.        )
  70.      )
  71.      lst
  72.      (cdr lst)
  73.    )
  74. )
  75. (defun _closestpt (lst p)
  76.    (car (vl-sort lst (function (lambda (a b) (< (distance a p) (distance b p))))))
  77. )
  78. (defun AT:Arrow (#Location #Angle / #Size #Point1 #Point2 #Point3)
  79.    ;; Display directional arrow
  80.    ;; #Location - arrow placement point
  81.    ;; #Angle - arrow directional angle
  82.    ;; Alan J. Thompson, 04.28.09
  83.    (setq #Size   (* (getvar "viewsize") 0.02)
  84.          #Point1 (polar #Location #Angle #Size)
  85.          #Point2 (polar #Location (+ #Angle (* pi 0.85)) #Size)
  86.          #Point3 (polar #Location (+ #Angle (* pi 1.15)) #Size)
  87.    )
  88.    (grvecs (list 4 #Point1 #Point2 #Point2 #Point3 #Point3 #Point1))
  89.    #Location
  90. )
  91. (defun AT:Midpoint (p1 p2)
  92.    ;; Midpoint between two points
  93.    ;; Alan J. Thompson, 04.23.09
  94.    (mapcar (function (lambda (a b) (/ (+ a b) 2.))) p1 p2)
  95. )
  96. (setq lastentity (entlast))
  97. (if (and (setq lst (_getPoints))
  98.           (progn (vl-cmdf "_.leader") (foreach p lst (vl-cmdf "_non" p)) (vl-cmdf "" "" "_N"))
  99.           (not (equal lastentity (setq ent (entlast))))
  100.           (setq obj (vlax-ename->vla-object ent))
  101.      )
  102.    (while (eq 5 (car (setq gr (grread T 15 0))))
  103.      (redraw)
  104.      (grdraw (cadr gr) (trans (vlax-curve-getClosestPointTo ent (trans (cadr gr) 1 0)) 0 1) 3 -1)
  105.      (grdraw (cadr gr) (trans (car (setq coords (_group (vlax-get obj 'Coordinates)))) 0 1) 1 -1)
  106.      (_arrow coords)
  107.      (if (equal (last coords) (_closestpt coords (trans (cadr gr) 1 0)))
  108.        (vlax-put obj 'Coordinates (apply (function append) (reverse coords)))
  109.      )
  110.    )
  111. )
  112. (redraw)
  113. (princ)
  114. )
箭头
 
 
阿罗姆
回复

使用道具 举报

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-6 09:11:22 | 显示全部楼层
Alan对我的原始代码进行了修改,以匹配箭头末端选择,并演示了:
 
 
  1. (defun c:arrow ( / di en gr l1 l2 nm p1 p2 )
  2.    (if
  3.        (and
  4.            (setq p1 (getpoint "\n1st Point: "))
  5.            (setq p2 (getpoint "\n2nd Point: " p1))
  6.        )
  7.        (progn
  8.            (setq di (/ (distance p1 p2) 3.0)
  9.                  nm (trans '(0. 0. 1.) 1 0 t)
  10.            )
  11.            (setq en
  12.                (entget
  13.                    (entmakex
  14.                        (append
  15.                            (list
  16.                               '(0 . "LWPOLYLINE")
  17.                               '(100 . "AcDbEntity")
  18.                               '(100 . "AcDbPolyline")
  19.                               '(90 . 3)
  20.                               '(70 . 0)
  21.                            )
  22.                            (setq l1
  23.                                (list
  24.                                    (cons 10 (trans p1 1 nm))
  25.                                    (cons 10 (trans (polar p2 (angle p2 p1) di) 1 nm))
  26.                                    (cons 40 (/ di 2.0))
  27.                                   '(41 . 0.0)
  28.                                    (cons 10 (trans p2 1 nm))
  29.                                    (cons 210 nm)
  30.                                )
  31.                            )
  32.                        )
  33.                    )
  34.                )
  35.            )
  36.            (setq l2
  37.                (list
  38.                    (cons 10 (trans p1 1 nm))
  39.                   '(40 . 0.0)
  40.                    (cons 41 (/ di 2.0))
  41.                    (cons 10 (trans (polar p1 (angle p1 p2) di) 1 nm))
  42.                    (cons 10 (trans p2 1 nm))
  43.                    (cons 210 nm)
  44.                )
  45.            )
  46.            (setq en (reverse (member (assoc 39 en) (reverse en))))
  47.            (princ "\nChoose Arrow End...")
  48.            (while (= 5 (car (setq gr (grread t 13 0))))
  49.                (entmod
  50.                    (append en
  51.                        (if (< (distance (cadr gr) p2) (distance (cadr gr) p1)) l1 l2)
  52.                    )
  53.                )
  54.            )
  55.        )                    
  56.    )
  57.    (princ)
  58. )
回复

使用道具 举报

54

主题

3755

帖子

3583

银币

后起之秀

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

铜币
438
发表于 2022-7-6 09:16:15 | 显示全部楼层
美好的我必须补充的是,我从未在arrow代码上使用过动态选项,也从未使用过arrowm代码。Arrow是我非常简单的Arrow例程的重写,arrowm模仿了我们定期发布到grread示例线程@theswamp时编写的一个例程,因此所有的grdraw都是愚蠢的。
回复

使用道具 举报

8

主题

34

帖子

26

银币

初来乍到

Rank: 1

铜币
40
发表于 2022-7-6 09:17:09 | 显示全部楼层
啊,我一整天都不能用电脑来澄清一些事情!该死的付费客户总是让一切变得如此困难。
我们的绘图标准要求我们绘制大多数东西w/(LW)PLINE,并给它们一个2“宽度。因此,我认为维度解决方案不适用于这个复杂的箭头。在这方面我已经做好了准备,但李对我所做的事情的澄清提醒我,几年前,我的第一次尝试是将箭头作为一个单一实体,完全像他那样用头和尾固定,然后对其进行样条化。但每次我对其进行样条化,它都会扰乱厚度的变化。(从0开始,转到箭头宽度,然后向下到尾部宽度,依此类推)我只是再试了一次,我把李的箭头,附加了2个额外的部分(在零宽度),然后用花键。它整个过程都变成了零宽度的样条曲线,没有头。
所以我当时的解决方案是制作样条曲线,添加一个箭头块,然后将它们组合在一起。所以李的解决方案提醒了我,现在我问,我可以用一个实体来做吗?只是为了学习。
我今天感觉很好,好像我参与了对话。我想我会再试一次。(提出某人问题的解决方案。)
回复

使用道具 举报

pBe

32

主题

2722

帖子

2666

银币

后起之秀

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

铜币
211
发表于 2022-7-6 09:22:32 | 显示全部楼层
 
是的,我在想什么。我应该直接在entmakex上加入宽度
 
谢谢李。
回复

使用道具 举报

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-6 09:23:26 | 显示全部楼层
 
干杯,伙计,哈哈,我不使用我的任何程序——有趣的是写它们。
回复

使用道具 举报

54

主题

3755

帖子

3583

银币

后起之秀

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

铜币
438
发表于 2022-7-6 09:26:51 | 显示全部楼层
总是这样。
回复

使用道具 举报

2

主题

53

帖子

57

银币

初来乍到

Rank: 1

铜币
14
发表于 2022-7-6 09:29:58 | 显示全部楼层
艾伦
 
我经常使用你的单箭头程序。
 
但是我想知道,我想在一个图形中有两种不同的引线样式,都是相同的大小,但一个是闭合填充的,另一个是空白填充的。实现这一目标的最佳方式是什么?
 
谢谢
P
回复

使用道具 举报

54

主题

3755

帖子

3583

银币

后起之秀

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

铜币
438
发表于 2022-7-6 09:32:55 | 显示全部楼层
你可以改变那一个属性,但因为你有不同的风格,我想你宁愿把它们作为合适的风格。我决定将其作为一个子例程,您可以在其中指定样式(或者对于当前样式,将其保留为零)。。。
 
  1. 6
回复

使用道具 举报

2

主题

53

帖子

57

银币

初来乍到

Rank: 1

铜币
14
发表于 2022-7-6 09:38:11 | 显示全部楼层
干杯,艾伦
一旦我完成这该死的船厂调查,我会试试的。。
回复

使用道具 举报

发表回复

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

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

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

GMT+8, 2025-3-7 08:53 , Processed in 1.213397 second(s), 71 queries .

© 2020-2025 乐筑天下

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