乐筑天下

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

[编程交流] 生成多边形LISP

[复制链接]

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-6 14:30:59 | 显示全部楼层 |阅读模式
只是胡闹,以为你们会喜欢这个-
 
将动态生成任意正多边形,使用TAB、+和-。
 
  1. ;; Make Polygon by Lee McDonnell (Lee Mac)
  2. ;; 29.05.2009
  3. (defun c:mkPly (/ flag doc spc clr pt gr cPt
  4.                  Ang cAng cDis ptLst var)
  5. (vl-load-com)
  6. (setq doc (vla-get-ActiveDocument
  7.              (vlax-get-Acad-Object))
  8.        spc (if (zerop
  9.                  (vla-get-activespace doc))
  10.              (if (= (vla-get-mspace doc) :vlax-true) ; Vport
  11.                (vla-get-modelspace doc)
  12.                (vla-get-paperspace doc))
  13.              (vla-get-modelspace doc))
  14.        clr 0)
  15. (or *mkPly:Side* (setq *mkPly:Side* 4))
  16. (if (setq pt (getpoint "\nSelect Centre Point: "))
  17.    (progn
  18.      (while
  19.        (or
  20.          (and
  21.            (setq gr (grread t 7 0)) (eq 5 (car gr)))
  22.          (and
  23.            (eq 2 (car gr))
  24.              (member
  25.                (cadr gr)
  26.                  '(9 43 61 45))))
  27.        (redraw)
  28.        (if
  29.          (and
  30.            (eq 2 (car gr))
  31.            (or
  32.              (eq 43 (cadr gr)) ; +
  33.              (eq 61 (cadr gr)))) ; = (as +)
  34.            (setq *mkPly:Side* (+ *mkPly:Side* (if flag 2 1))
  35.                  clr (1+ clr)))
  36.        (if
  37.          (and
  38.            (eq 2 (car gr))
  39.            (eq 45 (cadr gr))) ; -
  40.          (progn
  41.            (and (< (if flag 6 3) *mkPly:Side*)
  42.                 (setq *mkPly:Side*
  43.                   (- *mkPly:Side* (if flag 2 1))))
  44.            (if (zerop clr)
  45.              (setq clr 5)
  46.              (setq clr (1- clr)))))
  47.        (if
  48.          (and
  49.            (eq 2 (car gr))
  50.            (eq 9 (cadr gr))) ; Tab
  51.          (progn
  52.            (setq flag (not flag))
  53.            (if flag
  54.              (setq *mkPly:Side* 6))))
  55.        (if (eq 5 (car gr))
  56.          (progn
  57.            (setq cPt (cadr gr)
  58.                  Ang (/ (* 2. pi) *mkPly:Side*)
  59.                  cAng (angle pt cPt)
  60.                  cDis (distance pt cPt)
  61.                  ptLst (list cPt (polar pt (+ cAng Ang)
  62.                                         (if (and flag (< 5 *mkPly:Side*)
  63.                                                  (zerop (rem *mkPly:Side* 2)))
  64.                                           (/ cDis 3.) cDis))) i 2.)
  65.            (repeat (- *mkPly:Side* 2)
  66.              (setq ptlst
  67.                (append ptlst
  68.                  (list (last ptlst)
  69.                    (polar pt (+ cAng (* i Ang))
  70.                           (if (and flag (< 5 *mkPly:Side*)
  71.                                    (zerop (rem *mkPly:Side* 2))
  72.                                    (not (zerop (rem i 2))))
  73.                             (/ cDis 3.) cDis)))) i (1+ i)))))
  74.        (grvecs
  75.          (setq ptlst
  76.            (append
  77.              (list (* -1 (1+ (rem clr 6))))
  78.                ptlst (list (last ptlst) cPt)))))
  79.      (if
  80.        (and
  81.          (eq 3 (car gr))
  82.            (listp (cadr gr)))
  83.        (progn
  84.          (setq ptlst (apply
  85.                        'append
  86.                           (mapcar
  87.                             (function
  88.                               (lambda (x)
  89.                                 (list (car x) (cadr x))))
  90.                             (append
  91.                               (unique (cdr ptlst))
  92.                                 (list (cadr ptlst))))))
  93.          (setq var
  94.            (vlax-make-variant
  95.              (vlax-safearray-fill
  96.                (vlax-make-safearray
  97.                  vlax-vbdouble
  98.                    (cons 0 (1- (length ptlst))))
  99.                ptlst)))         
  100.          (vla-addLightWeightPolyline spc var)))
  101.      (redraw)))
  102. (princ))
  103. ;; CAB
  104. (defun unique (lst / result)
  105. (reverse
  106.    (while (setq itm (car lst))
  107.      (setq lst (vl-remove itm lst)
  108.            result (cons itm result)))))
回复

使用道具 举报

20

主题

344

帖子

325

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
100
发表于 2022-7-6 14:40:15 | 显示全部楼层
不错,我喜欢你如何选择大小和旋转。但是,这不是与AutoCAD命令“Polygon”惊人地相似吗?
回复

使用道具 举报

12

主题

395

帖子

384

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
60
发表于 2022-7-6 14:44:36 | 显示全部楼层
它绝对是整洁的。我很惊讶你对grread的奇怪痴迷更不喜欢它。英雄联盟
回复

使用道具 举报

20

主题

344

帖子

325

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
100
发表于 2022-7-6 14:50:55 | 显示全部楼层
我确实喜欢它。很难完全理解李的Lisp程序,因为大多数时候我都听不懂。o、 o'
 
然而,我确实注意到了什么可能是bug。当使用“星形”选项时,您可以切换回“多边形”选项并保持相同的边数,但当您使用“多边形”选项并切换到“星形”选项时,它似乎会恢复为一个三边星形。如果你向后拉,它会变成一个6边多边形。如果你减去一条边,它就会变成一个正方形。
 
尽管如此,它还是很好。我喜欢颜色和向量的使用。
回复

使用道具 举报

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-6 14:59:49 | 显示全部楼层
 
是的,但可能更快
 
 
是的,星星需要偶数条边(最少6条),所以当你点击标签时,我把它设置为6条。但是我没有花太长时间写这篇文章,所以我想可以使用低于当前边数的偶数或类似的数字。
 
 
但是谢谢大家的评论
回复

使用道具 举报

41

主题

301

帖子

265

银币

后起之秀

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

铜币
209
发表于 2022-7-6 15:02:51 | 显示全部楼层
李,
 
你能告诉我你是如何创建幻影对象的吗?
 
 
非常感谢
 
回复

使用道具 举报

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-6 15:08:32 | 显示全部楼层
 
GRVECS或GRDRAW函数将在屏幕上绘制“幻影”对象-GRVECS函数的负颜色值将指示高亮显示(虚线)。
 
回复

使用道具 举报

54

主题

208

帖子

46

银币

后起之秀

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

铜币
386
发表于 2022-7-6 15:17:07 | 显示全部楼层
Lisp程序,先生
回复

使用道具 举报

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-6 15:24:32 | 显示全部楼层
 
--谢谢--
回复

使用道具 举报

59

主题

327

帖子

268

银币

后起之秀

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

铜币
295
发表于 2022-7-6 15:28:38 | 显示全部楼层
嗨,李,我没有用,但这是一个很好的惯例!
标签+的东西给了漂亮的星星。。。获得圣诞节的感觉。。。
回复

使用道具 举报

发表回复

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

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

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

GMT+8, 2025-3-5 00:05 , Processed in 0.384641 second(s), 72 queries .

© 2020-2025 乐筑天下

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