aswad 发表于 2022-7-5 18:51:32

Autolisp例程问题

嗨,伙计们
 
如您所见,这是通过输入rec的长度来执行矩形例程的编码。。问题是,
 
我想把圆放在矩形中的一行中,我需要指定我想要多少圆。。
 
圆圈之间的长度必须为109.00英寸
 
 
 
(定义c:SREC(/pt h)
 
(“矩形”原理)
 
(if(and(setq pt(getpoint“\n指定矩形起点:”))
 
(setq h(getreal“\n输入矩形长度:”))
 
(命令“_rectang”pt“_dimensions”(+0 h)h pt)
 
(提示“\n**无效输入**”))
 
(普林斯)
 
 
 
:示例随附:
 
 
 
我非常感谢那些愿意帮助我的人:):D
2750 , 109.图纸

BIGAL 发表于 2022-7-5 19:05:38

正如你已经开始在这里是一些建议,而不是代码,希望它是有意义的,如果你的帖子再次卡住,一个学习lisp的好例子。我想你们可以从这里学习,而不是别人只是张贴代码的答案。
 
你可以用几种方法来做,但是看看数学
长度=L
偏移=109.0
Num=除以L/109(设置Num(/L偏移))
余数(*L(-num(fix num)))
Pt x(car Pt)Pt y(cadr Pt)
余数>2*圆周直径(如果(>(*2.0直径…如果是,则继续,如果否num=num-1,则圆接近边缘(setq num(-num 1))
现在计算出第一个圆的位置(设置q newpt(polar pt…(polar pt…)X穿过y向上一个双极
然后跨复制并重复num次(重复(修复num)。。。。
对于最上面的行,您可以使用array,而不是copy或circle命令

tombu 发表于 2022-7-5 19:25:11

假设高度恒定,长度变化,可以创建一个动态块,根据长度添加或删除圆。这也可以很容易地用lisp完成,只是一个建议,以防你用这种方式做起来更舒服。

BIGAL 发表于 2022-7-5 19:37:50

好主意,因为间距是在动态块中定义的,如果更改此值,它会立即更新。

Tharwat 发表于 2022-7-5 19:43:05

你好
 
根据tombu的建议,动态块是这个技巧的最佳选择,但如果你不想使用动态块选项,这里是我的lisp程序。
 

(defun c:Test (/ _C rad spc len pt r p d)
;;    Tharwat 04.07.2015    ;;
(setq rad 3.5 spc 109.0 )
(if
   (and (setq len (getdist "\nSpecify Length of Rectangle :"))
      (if (< 109 len)
          t
          (progn (princ "\nLength of rectangle is smaller than 109.0 !") nil )
      )
      (setq pt (getpoint "\nSpecify Rectangle Base point :"))
   )
    (progn
      (defun _C (n _p)
      (repeat n
          (entmakex (list '(0 . "CIRCLE") (cons 10 _p) (cons 40 rad)))
          (setq _p (polar _p 0. spc))
      )
      )
      (setq r (1+ (fix (/ len 109.0)))
            p (polar (polar pt 0. (setq d (/ (- len (* (fix r) 109.)) 2.))) (* pi 1.5) 12. )
      )
      (command "_.rectang" "_none" pt "_none" (polar (polar pt 0. len) (* pi 1.5) len))
      (_C r p)
      (_C r (setq p (polar (polar pt (* pi 1.5) (- len 12.)) 0. d))
      )
    )
)
(princ)
)

iconeo 发表于 2022-7-5 19:55:15

2750 , 109.图纸
 
我喜欢动态积木。。。
页: [1]
查看完整版本: Autolisp例程问题