乐筑天下

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

[编程交流] 块中的变量

[复制链接]

66

主题

1552

帖子

1514

银币

后起之秀

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

铜币
325
发表于 2022-7-5 18:21:51 | 显示全部楼层 |阅读模式
你好
我有一堆方块,代表风景物体(如树木、灌木丛等)。我正在尝试建立一个例程,重新插入选定的块,在指定最小/最大比例和最小/最大旋转后,重新插入的块应处于随机比例和旋转。到现在为止,我手动完成(复制块,然后逐个选择,更改比例和旋转)。
 
我不太擅长lisp,以下是我的尝试:
  1. (defun c:test ( / att blk sel blksc blkrot )
  2.    (if (setq sel (ssget "_+.:E:S" '((0 . "INSERT"))))
  3.        (progn
  4.            (setq blk (LM:al-effectivename (ssname sel 0))
  5.            (setq blksc (LM:randrange-Scale))
  6.            (setq blkrot (LM:randrange-Rotation))
  7.                  att (getvar 'attreq)
  8.            )
  9.            (setvar 'attreq 0)
  10.            (while (vl-cmdf "_.-insert" blk
  11.            "_S" blksc
  12.            "_R" blkrot
  13.            "\" ""))
  14.            (setvar 'attreq att)
  15.        )
  16.    )
  17.    (princ)
  18. )
  19. ;; Random in Range  -  Lee Mac
  20. ;; Returns a pseudo-random integral number in a given range (inclusive)
  21. ;I did some modifications here:
  22. (defun LM:randrange-Scale ( scmin scmax )
  23. (setq scmin (getreal "\nSpecify min scale:")
  24. (setq scmax (getreal "\nspecify max scale:")
  25.    (fix (+ scmin (* (LM:rand) (- scmax scmin -1))))
  26. )
  27. (defun LM:randrange-Rotation ( rotmin rotmax )
  28. (setq rotmin (getint "\nspecify min rotation:")
  29. (setq rotmax (getint "\nspecify max rotation:")
  30.    (fix (+ rotmin (* (LM:rand) (- rotmax rotmin -1))))
  31. )
  32. ;; Rand  -  Lee Mac
  33. ;; PRNG implementing a linear congruential generator with
  34. ;; parameters derived from the book 'Numerical Recipes'
  35. (defun LM:rand ( / a c m )
  36.    (setq m   4294967296.0
  37.          a   1664525.0
  38.          c   1013904223.0
  39.          $xn (rem (+ c (* a (cond ($xn) ((getvar 'date))))) m)
  40.    )
  41.    (/ $xn m)
  42. )
  43. ;; Effective Block Name  -  Lee Mac
  44. ;; ent - [ent] Block Reference entity
  45. (defun LM:al-effectivename ( ent / blk rep )
  46.    (if (wcmatch (setq blk (cdr (assoc 2 (entget ent)))) "`**")
  47.        (if
  48.            (and
  49.                (setq rep
  50.                    (cdadr
  51.                        (assoc -3
  52.                            (entget
  53.                                (cdr
  54.                                    (assoc 330
  55.                                        (entget
  56.                                            (tblobjname "block" blk)
  57.                                        )
  58.                                    )
  59.                                )
  60.                               '("AcDbBlockRepBTag")
  61.                            )
  62.                        )
  63.                    )
  64.                )
  65.                (setq rep (handent (cdr (assoc 1005 rep))))
  66.            )
  67.            (setq blk (cdr (assoc 2 (entget rep))))
  68.        )
  69.    )
  70.    blk
  71. )
回复

使用道具 举报

106

主题

1万

帖子

101

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1299
发表于 2022-7-5 19:13:27 | 显示全部楼层
可能会重新考虑该方法,根据需要插入一个块副本,然后当你执行ssget时,你选择该块,该块返回块名并使用(0。“insert”)(2.blkname),它将遍历所有块,如果不高兴,则一次随机执行。
 
我在一个圈内贴了一个重新随机的圈,并打算重做它,所以它是真正的随机,但没有两个圈接触,明显的增加是填补一个边界。现在帖子是???
回复

使用道具 举报

66

主题

1552

帖子

1514

银币

后起之秀

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

铜币
325
发表于 2022-7-5 19:35:41 | 显示全部楼层
你建议的方法听起来不错。我只是不知道我是否在这个问题上使用了李函数(因为我需要用户输入最小和最大比例变量)。
我不认为你的随机圈例程对我有效,因为我没有填充整个边界,而且我也有重叠块(见图)。
192155i62onn2ftyks1ysy.jpg
回复

使用道具 举报

发表回复

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

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

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

GMT+8, 2025-3-12 20:09 , Processed in 0.544717 second(s), 60 queries .

© 2020-2025 乐筑天下

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