lisp正在计算吗?
大家好,我才刚刚开始学习Lisp编程,真的不太懂。。。然而所以这里有一个问题。。
我想创建一个程序,它可以横向绘制几条线。在我的想象中,它应该是这样工作的:
在AutoCad中,我显示了一个正方形,程序询问我要绘制多少条线。当我给她一个数字时,她将总平方长度除以我给定的数字,然后画出直线(直线程序的长度也来自平方)。
问题是:
AutoCad可以计算吗?(在我的例子中)也许有人已经有了类似的东西? 你好
这肯定可以使用Lisp完成。我使用VBA进行AutoCad自定义,但这里可能有人会帮助您使用此lisp。写它应该不会花太长时间。 你是说这样的事?
(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)
) 或者像这样?
(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)
) 这个帖子让我想起了一个类似的帖子。 嗯,是的,
当我想出如何启动它的时候,所有的程序都是你做的
只有一件事,我解释错了,那就是线必须是垂直的,但距离是水平分开的。。。
我把我的照片附在这篇帖子上,为了解释更容易理解。。。以下是我想做的关于这个项目的一些事情:
1、第一行和最后一行始终为蓝色。
2.所有线条都属于图层轮廓
3.线路上的静噪块属于层kons1
4、线路上的圆块属于kons2层
5.所有圆和squere块之间的距离永远不会大于70(ar之间的所有间隙相等),如果需要,可以在线路上添加传统圆块。
6、线路起点/终点到区间的距离始终为10。
所以,如果有人想要这个挑战,并且想帮助我,请随时。。。因为正如我所看到的,对我来说,制作这样的程序需要很长时间,而这里的第一篇帖子是在几分钟后发布的
2860928610。。。在另一种情况下,我会分享我的Lisp程序与你无论如何稍后,只是为了知道你的想法
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)
) 对我之前的代码进行了快速修改,以创建垂直线:
(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)
) 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
) 从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