rekoj 发表于 2022-7-6 09:11:03

lisp正在计算吗?

大家好,
 
我才刚刚开始学习Lisp编程,真的不太懂。。。然而所以这里有一个问题。。
 
我想创建一个程序,它可以横向绘制几条线。在我的想象中,它应该是这样工作的:
在AutoCad中,我显示了一个正方形,程序询问我要绘制多少条线。当我给她一个数字时,她将总平方长度除以我给定的数字,然后画出直线(直线程序的长度也来自平方)。
 
问题是:
AutoCad可以计算吗?(在我的例子中)也许有人已经有了类似的东西?

Joro-- 发表于 2022-7-6 09:16:15

你好
 
这肯定可以使用Lisp完成。我使用VBA进行AutoCad自定义,但这里可能有人会帮助您使用此lisp。写它应该不会花太长时间。

irneb 发表于 2022-7-6 09:19:00

你是说这样的事?
(defun c:HFillRect (/ pt1 pt2 div h v vdiv p1 p2)
(if (and (setq pt1 (getpoint "\nGet start point of rectancgle: "))
          (setq pt2 (getcorner pt1 "\nGet 2nd point of rectangle: "))
          (setq div (getint "\nHow many lines: "))
   )
   (progn
   (setq p1 (list (min (car pt1) (car pt2)) (min (cadr pt1) (cadr pt2)) (min (caddr pt1) (caddr pt2))) ;Left-bottom
         p2 (list (max (car pt1) (car pt2)) (max (cadr pt1) (cadr pt2)) (max (caddr pt1) (caddr pt2))) ;Right-top
         h(- (car p2) (car p1)) ;Horizontal length
         v(- (cadr p2) (cadr p1));Vertical length
         vdiv (/ v div) ;Vertical division length
         pt1 p1 ;Start point of line
         pt2 (list (car p2) (cadr p1) (caddr p2)) ;Endpoint of line
   )
   (while (< (cadr pt1) (cadr p2))
       (command "._LINE" "_None" pt1 "_None" pt2 "")
       (setq pt1 (list (car pt1) (+ (cadr pt1) vdiv) (caddr pt1))
             pt2 (list (car pt2) (+ (cadr pt2) vdiv) (caddr pt2))
       )
   )
   )
)
(princ)
)

Lee Mac 发表于 2022-7-6 09:22:45

或者像这样?
 
(defun c:hlines ( / p1 p2 h n v )
(if
   (and
   (setq p1 (getpoint "\nSpecify First Corner: "))
   (setq p2 (getcorner "\nSpecify Opposite Corner: " p1))
   (progn (initget 6) (setq n (getint "\nSpecify Number of Lines: ")))
   )
   (progn
   (setq h (- (car p2) (car p1))
         v (if (= 1 n) 0. (/ (- (cadr p2) (cadr p1)) (1- n)))
   )
   (repeat n
       (entmakex
         (list
         (cons 0 "LINE")
         (cons 10 (trans p1 1 0))
         (cons 11 (trans (list (+ (car p1) h) (cadr p1) (caddr p1)) 1 0))
         )
       )
       (setq p1 (list (car p1) (+ v (cadr p1)) (caddr p1)))
   )
   )
)
(princ)
)
 
或者,根据您想要的行为:
 
(defun c:hlines ( / p1 p2 h n v )
(if
   (and
   (setq p1 (getpoint "\nSpecify First Corner: "))
   (setq p2 (getcorner "\nSpecify Opposite Corner: " p1))
   (progn (initget 6) (setq n (getint "\nSpecify Number of Lines: ")))
   )
   (progn
   (setq h (- (car p2) (car p1))
         v (/ (- (cadr p2) (cadr p1)) (1+ n))
   )
   (repeat n (setq p1 (list (car p1) (+ v (cadr p1)) (caddr p1)))
       (entmakex
         (list
         (cons 0 "LINE")
         (cons 10 (trans p1 1 0))
         (cons 11 (trans (list (+ (car p1) h) (cadr p1) (caddr p1)) 1 0))
         )
       )
   )
   )
)
(princ)
)

Lee Mac 发表于 2022-7-6 09:23:56

这个帖子让我想起了一个类似的帖子。

rekoj 发表于 2022-7-6 09:28:19

嗯,是的,
当我想出如何启动它的时候,所有的程序都是你做的
只有一件事,我解释错了,那就是线必须是垂直的,但距离是水平分开的。。。
我把我的照片附在这篇帖子上,为了解释更容易理解。。。以下是我想做的关于这个项目的一些事情:
1、第一行和最后一行始终为蓝色。
2.所有线条都属于图层轮廓
3.线路上的静噪块属于层kons1
4、线路上的圆块属于kons2层
5.所有圆和squere块之间的距离永远不会大于70(ar之间的所有间隙相等),如果需要,可以在线路上添加传统圆块。
6、线路起点/终点到区间的距离始终为10。
 
所以,如果有人想要这个挑战,并且想帮助我,请随时。。。因为正如我所看到的,对我来说,制作这样的程序需要很长时间,而这里的第一篇帖子是在几分钟后发布的
2860928610。。。在另一种情况下,我会分享我的Lisp程序与你无论如何稍后,只是为了知道你的想法

Lee Mac 发表于 2022-7-6 09:32:57

grread更有趣。。。
 
编写一个有趣的程序,但肯定不实用:
 
动态水平:
 
 

(defun c:hlines ( / *error* g1 g2 gr h l ms p p1 p2 v )
;; Lee Mac 2011
(defun *error* ( m ) (redraw) (princ))
(or *n (setq *n 3))

(if (setq p1 (getpoint "\nSpecify First Corner: "))
   (progn
   (setq ms (princ "\nSpecify Opposite Corner [+/-]: "))
   (while
       (progn (setq gr (grread t 15 0) g1 (car gr) g2 (cadr gr))
         (cond
         ( (= 5 g1)(redraw)
             (setq h (- (car g2) (car p1))
                   v (/ (- (cadr g2) (cadr p1)) (1+ *n))
                   p p1
             )
             (repeat *n
               (setq p (list (car p) (+ v (cadr p)) (caddr p)))
               (grdraw p (list (+ (car p) h) (cadr p) (caddr p)) -1)
             )
             (setq l
               (list
               p1 (list (+ (car p1) h) (cadr p1) (caddr p1))
               g2 (list (car p) (+ v (cadr p)) (caddr p))
               )
             )
             (mapcar '(lambda ( a b ) (grdraw a b 1 -1)) l (append (cdr l) (list (car l))))
         )
         ( (= 2 g1)
             (cond
               ( (member g2 '(45 95))
               (if (= 1 *n)
                   (princ (strcat "\n--> Minimum Number of Lines Reached." ms))
                   (setq *n (1- *n))
               )
               )
               ( (member g2 '(43 61))
               (setq *n (1+ *n))
               )
             )
         )
         ( (= 3 g1)
             (setq h (- (car g2) (car p1))
                   v (/ (- (cadr g2) (cadr p1)) (1+ *n))
             )
             (repeat *n (setq p1 (list (car p1) (+ v (cadr p1)) (caddr p1)))
               (entmakex
               (list
                   (cons 0 "LINE")
                   (cons 10 (trans p1 1 0))
                   (cons 11 (trans (list (+ (car p1) h) (cadr p1) (caddr p1)) 1 0))
               )
               )
             )
             nil
         )
         )
       )
   )
   )
)
(redraw) (princ)
)

 
动态垂直:
 
 
(defun c:vlines ( / *error* g1 g2 gr h l ms p p1 p2 v )
;; Lee Mac 2011
(defun *error* ( m ) (redraw) (princ))
(or *n (setq *n 3))

(if (setq p1 (getpoint "\nSpecify First Corner: "))
   (progn
   (setq ms (princ "\nSpecify Opposite Corner [+/-]: "))
   (while
       (progn (setq gr (grread t 15 0) g1 (car gr) g2 (cadr gr))
         (cond
         ( (= 5 g1)(redraw)
             (setq h (/ (- (car g2) (car p1)) (1+ *n))
                   v (- (cadr g2) (cadr p1))
                   p p1
             )
             (repeat *n
               (setq p (list (+ h (car p)) (cadr p) (caddr p)))
               (grdraw p (list (car p) (+ v (cadr p)) (caddr p)) -1)
             )
             (setq l
               (list
               p1 (list (car p1) (+ v (cadr p1)) (caddr p1))
               g2 (list (+ h (car p)) (cadr p) (caddr p))
               )
             )
             (mapcar '(lambda ( a b ) (grdraw a b 1 -1)) l (append (cdr l) (list (car l))))
         )
         ( (= 2 g1)
             (cond
               ( (member g2 '(45 95))
               (if (= 1 *n)
                   (princ (strcat "\n--> Minimum Number of Lines Reached." ms))
                   (setq *n (1- *n))
               )
               )
               ( (member g2 '(43 61))
               (setq *n (1+ *n))
               )
             )
         )
         ( (= 3 g1)
             (setq h (/ (- (car g2) (car p1)) (1+ *n))
                   v (- (cadr g2) (cadr p1))
             )
             (repeat *n (setq p1 (list (+ h (car p1)) (cadr p1) (caddr p1)))
               (entmakex
               (list
                   (cons 0 "LINE")
                   (cons 10 (trans p1 1 0))
                   (cons 11 (trans (list (car p1) (+ v (cadr p1)) (caddr p1)) 1 0))
               )
               )
             )
             nil
         )
         )
       )
   )
   )
)
(redraw) (princ)
)
 
将两者结合起来。。。
 
 

(defun c:hvlines ( / *error* g1 g2 gr h l ms p p1 p2 v )
;; Lee Mac 2011
(defun *error* ( m ) (redraw) (princ))
(or *n (setq *n 3))

(if (setq p1 (getpoint "\nSpecify First Corner: "))
   (progn
   (setq ms (princ "\nSpecify Opposite Corner : "))
   (while
       (progn (setq gr (grread t 15 0) g1 (car gr) g2 (cadr gr))
         (cond
         ( (= 5 g1)(redraw)
             (if *v
               (progn
               (setq h (/ (- (car g2) (car p1)) (1+ *n))
                     v (- (cadr g2) (cadr p1))
                     p p1
               )
               (repeat *n
                   (setq p (list (+ h (car p)) (cadr p) (caddr p)))
                   (grdraw p (list (car p) (+ v (cadr p)) (caddr p)) -1)
               )
               (setq l
                   (list
                     p1 (list (car p1) (+ v (cadr p1)) (caddr p1))
                     g2 (list (+ h (car p)) (cadr p) (caddr p))
                   )
               )
               )
               (progn
               (setq h (- (car g2) (car p1))
                     v (/ (- (cadr g2) (cadr p1)) (1+ *n))
                     p p1
               )
               (repeat *n
                   (setq p (list (car p) (+ v (cadr p)) (caddr p)))
                   (grdraw p (list (+ (car p) h) (cadr p) (caddr p)) -1)
               )
               (setq l
                   (list
                     p1 (list (+ (car p1) h) (cadr p1) (caddr p1))
                     g2 (list (car p) (+ v (cadr p)) (caddr p))
                   )
               )
               )
             )                  
             (mapcar '(lambda ( a b ) (grdraw a b 1 -1)) l (append (cdr l) (list (car l))))
         )
         ( (= 2 g1)
             (cond
               ( (member g2 '(45 95))
               (if (= 1 *n)
                   (princ (strcat "\n--> Minimum Number of Lines Reached." ms))
                   (setq *n (1- *n))
               )
               )
               ( (member g2 '(43 61))
               (setq *n (1+ *n))
               )
               ( (= 9 g2)
               (setq *v (not *v)) t
               )
             )
         )
         ( (= 3 g1)
             (if *v
               (progn
               (setq h (/ (- (car g2) (car p1)) (1+ *n))
                     v (- (cadr g2) (cadr p1))
               )
               (repeat *n (setq p1 (list (+ h (car p1)) (cadr p1) (caddr p1)))
                   (entmakex
                     (list
                     (cons 0 "LINE")
                     (cons 10 (trans p1 1 0))
                     (cons 11 (trans (list (car p1) (+ v (cadr p1)) (caddr p1)) 1 0))
                     )
                   )
               )
               )
               (progn
               (setq h (- (car g2) (car p1))
                     v (/ (- (cadr g2) (cadr p1)) (1+ *n))
               )
               (repeat *n (setq p1 (list (car p1) (+ v (cadr p1)) (caddr p1)))
                   (entmakex
                     (list
                     (cons 0 "LINE")
                     (cons 10 (trans p1 1 0))
                     (cons 11 (trans (list (+ (car p1) h) (cadr p1) (caddr p1)) 1 0))
                     )
                   )
               )
               )
             )
             nil
         )
         )
       )
   )
   )
)
(redraw) (princ)
)

Lee Mac 发表于 2022-7-6 09:34:42

对我之前的代码进行了快速修改,以创建垂直线:
 
(defun c:vlines ( / p1 p2 h n v )
(if
   (and
   (setq p1 (getpoint "\nSpecify First Corner: "))
   (setq p2 (getcorner "\nSpecify Opposite Corner: " p1))
   (progn (initget 6) (setq n (getint "\nSpecify Number of Lines: ")))
   )
   (progn
   (setq h (if (= 1 n) 0. (/ (- (car p2) (car p1)) (1- n)))
         v (- (cadr p2) (cadr p1))
   )
   (repeat n
       (entmakex
         (list
         (cons 0 "LINE")
         (cons 10 (trans p1 1 0))
         (cons 11 (trans (list (car p1) (+ (cadr p1) v) (caddr p1)) 1 0))
         )
       )
       (setq p1 (list (+ h (car p1)) (cadr p1) (caddr p1)))
   )
   )
)
(princ)
)

Qonfire 发表于 2022-7-6 09:37:27

rekoj我想看看带线条和方块的lisp,这就是我想学习lisp的基本原因,但这些老虎会让任何人泄气:)
 
李你的乐趣与3行是切实可行的,我会直接问你会做一些修改,你的程序,所以它的权利,我需要什么?
它将涉及一些矩形内的行距计算
比在线上块间距的计算
嵌入我的区块
可能显示矩形的尺寸
将其放置在层上,如果不存在,则创建
删除一个矩形
 
我一直到这里
(defun c:xxx (/ pt1 pt2 pt3 pt4 bay)
(setq pt1 (getpoint "/nTop:"))
(setq pt2 (getcorner "/nBottom" pt1))
      (setq pt3 (list (nth 0 pt2)(nth 1 pt1)))
               (setq pt4 (list (nth 0 pt1)(nth 1 pt2)))
      (command ".rectang" pt1 pt2)

(setq bay (command ".dist" (pt1 pt3))-cant get a value
(print "bay")
Princ
)

BIGAL 发表于 2022-7-6 09:41:11

从Lees代码开始!
 
好的,蓝线v是红色的,重复n是条数,所以红色是n-2
这不是测试,只是剪切和粘贴。预期存在红色和蓝色层。
 

(defun c:vlines ( / p1 p2 h n v )
(if
   (and
   (setq p1 (getpoint "\nSpecify First Corner: "))
   (setq p2 (getcorner "\nSpecify Opposite Corner: " p1))
   (progn (initget 6) (setq numline (getint "\nSpecify Number of Lines: ")))

   )
   (progn
(setq n (- numline 2))
   (setq h (if (= 1 n) 0. (/ (- (car p2) (car p1)) (1- n)))
         v (- (cadr p2) (cadr p1))
   )

       (entmakex
         (list
         (cons 0 "LINE")
            (cons 8 "blue")
         (cons 10 (trans p1 1 0))
         (cons 11 (trans (list (car p1) (+ (cadr p1) v) (caddr p1)) 1 0))
         )
       )
       (setq p1 (list (+ h (car p1)) (cadr p1) (caddr p1)))
   )
      (repeat n
       (entmakex
         (list
         (cons 0 "LINE")
(cons 8 "Red")
         (cons 10 (trans p1 1 0))
         (cons 11 (trans (list (car p1) (+ (cadr p1) v) (caddr p1)) 1 0))
         )
       )
       (setq p1 (list (+ h (car p1)) (cadr p1) (caddr p1)))
       (entmakex
         (list
         (cons 0 "LINE")
(cons 8 "BLUE")            
(cons 10 (trans p1 1 0))
         (cons 11 (trans (list (car p1) (+ (cadr p1) v) (caddr p1)) 1 0))
         )
       )
       (setq p1 (list (+ h (car p1)) (cadr p1) (caddr p1)))
   )

   )
   )
)
(princ)
)

页: [1] 2
查看完整版本: lisp正在计算吗?