用于绘制多段线的Lisp
用户好!我需要一个lisp,可以绘制如下所示的特定多段线:
用户必须给出:
1、用户点1和2。
2、长度X
关于Lisp代码:
该程序必须找出如何绘制多段线,所以我认为它必须自己计算y长度。
水平:
-如果用户首先给出用户点1和点2,则lisp命令
必须绘制如图1所示的多段线。
-如果用户首先给出用户点2和点1,则lisp命令
必须绘制如图2所示的折线。
垂直:
-如果用户先给用户点1,然后给用户点2。lisp命令
必须如图3所示绘制。
-如果用户先给用户点2,然后给用户点1。lisp命令
必须如图4所示绘制。
我为什么需要这个:
我在平面图上使用多段线作为焊接签名,以便焊工/铁匠知道在焊接a时是否必须焊接x长度
“扁平模式”板上的扁平条。
Thanx提前。 看起来你需要一个新的线型。。。不是Lisp程序 下面是一些非常简单的代码:
(defun c:zigzag ( / a d i l p q x y )
(defun l ( a b )
(entmake (list '(0 . "LINE") (cons 10 a) (cons 11 b)))
)
(setq x 10.0
y 10.0
)
(if (and
(setq p (getpoint "\n1st Point: "))
(setq q (getpoint "\n2nd Point: " p))
)
(progn
(setq p (trans p 1 0)
q (trans q 1 0)
a (angle p q)
d (distance p q)
i (/ pi 2.0)
)
(repeat (fix (/ d x))
(l p (setq p (polar p a x)))
(l p (setq p (polar p (+ a (setq i (- i))) y)))
)
(if (not (equal 0.0 (rem d x) 1e-)
(l p (polar p a (rem d x)))
)
)
)
(princ)
)
李,如果出现以下条件,最后一行可能变为零长度。
(rem 100. 10.)
很好的捕捉塔尔瓦特,更新如上。 你可以做各种各样的普林线的东西,包括弧,我写了一些击球例程之字形波浪曲线等他们的工作方式,你想开始结束宽度,我不能后代码复制,但非常乐意帮助如何做。
在这里搜索打击有一些例子
另一个具有多段线实体。
希望你喜欢。
(defun c:PolyZag (/ a ang d l p1 p2 p3 p4)
;;; Author: Tharwat Al Shoufi ;;;
;;; Codes to make zig zag polyline ;;;
(vl-load-com)
(setq x (if x
*x*
1.0
)
)
(setq y (if y
*y*
1.0
)
)
(if
(and (setq *x* (cond ((getdist (strcat "\n Specify X segment < "
(rtos x 2 2)
" > :"
)
)
)
(t x)
)
)
(setq *y* (cond ((getdist (strcat "\n Specify Y segment < "
(rtos y 2 2)
" > :"
)
)
)
(t y)
)
)
(setq p1 (getpoint "\n Specify start point :"))
(setq p2 (getpoint "\n Specify next point :" p1))
(if (< (setq d (distance p1 p2)) *x*)
(progn
(alert
" Distance between points must be bigger than X segment "
)
nil
)
t
)
)
(progn (setq ang (angle p1 p2)
a '-
x *x*
y *y*
)
(setq l (cons p1 l))
(repeat (fix (/ d *x*))
(setq l (cons (setq p3 (polar p1 ang *x*)) l))
(setq l (cons (setq p4 (polar p3
((if (eq a '-)
(eval (setq a '+))
(eval (setq a '-))
)
ang
(* pi 0.5)
)
*y*
)
)
l
)
)
(setq p1 p4)
)
(cond ((eq (rem d *x*) 0.0) (setq l (vl-remove (car l) l)))
((not (equal (/ d *x*) 0.0))
(setq l (cons (polar p1 ang (rem d *x*)) l))
)
)
(entmakex
(append
(list '(0 . "LWPOLYLINE")
'(100 . "AcDbEntity")
'(100 . "AcDbPolyline")
'(70 . 0)
(cons 90 (length l))
)
(mapcar '(lambda (x) (cons 10 (list (car x) (cadr x)))) l)
)
)
)
(princ)
)
(princ "\n Written by Tharwat Al Shoufi")
(princ)
)
很好的回复了这个帖子中的所有回复!非常感谢。。。
Tha****:
-你能解释一下代码的作用吗。然后我可以更好地理解代码,也许可以修改它。
-如果你看到我的图片,你会注意到y是x线段之间的水平线段,也许我应该把它叫做X1-one,那么这里没有误解,我的错。。。但是无论如何,lisp代码都必须自己计算y线段。
-代码要求从起点开始的y坐标,但在图片中它说它始终必须为20mm。
-第一个x线段和最后一个x线段必须具有相同的y坐标,如图所示。
-多边形旋转方向的方式取决于用户提供起点和终点接缝的方式。。谢谢
Thanx论坛成员。。。。 这里有一个有趣的游戏供你玩:
;; Dynamic Zig-Zag-Lee Mac
(defun c:zz ( / a d g i l p q r x y )
(setq x 10.0
y 10.0
i (/ pi 2.0)
)
(if (setq p (getpoint "\nSpecify 1st Point: "))
(progn
(princ "\nSpecify 2nd Point [+/-] <Exit>: ")
(while
(progn
(setq g (grread t 15 0)
q (cadr g)
g (carg)
)
(cond
( (member g '(3 5))
(redraw)
(setq a (angle p q)
d (distance p q)
i (abs i)
r p
)
(repeat (fix (/ d x))
(grdraw r (setq r (polar r a x)) 1 1)
(grdraw r (setq r (polar r (+ a (setq i (- i))) y)) 1 1)
)
(if (not (equal 0.0 (rem d x) 1e-)
(grdraw r (polar r a (rem d x)) 1 1)
)
(= 5 g)
)
( (= 2 g)
(cond
( (member q '(43 61))
(setq x (1+ x))
)
( (member q '(45 95))
(setq x (max (1- x) 1))
)
)
)
)
)
)
(if (= 3 g)
(progn
(setq i (abs i)
p (trans p 1 0)
q (trans q 1 0)
a (angle p q)
)
(repeat (fix (/ d x))
(setq l (cons (cons 10 p) l)
l (cons (cons 10 (setq p (polar p a x))) l)
l (cons (cons 10 (setq p (polar p (+ a (setq i (- i))) y))) l)
)
)
(if (not (equal 0.0 (rem d x) 1e-)
(setq l (cons (cons 10 (polar p a (rem d x))) l))
)
(entmake
(append
(list
'(000 . "LWPOLYLINE")
'(100 . "AcDbEntity")
'(100 . "AcDbPolyline")
(cons 90 (length l))
'(70 . 0)
)
(reverse l)
)
)
)
)
(redraw)
)
)
(princ)
)
例子:
谢谢李麦克。。。但是这不是很恰当。
我会再次解释:
用户必须提供以下信息:
-其中一条水平x线段的长度。(标记为红色)
-起点。(标记为红色)
-终点。(标记为红色)
1.当用户给定起点和终点时,代码已计算水平y线段。y的长度并不重要。(标记为绿色)
2、起点必须是一条X线段,终点前必须有一条水平X线段。
3.X线段和Y线段之间的距离始终为20mm。
4.poly线必须根据我在这个线程中写的第一篇帖子改变方向。
Thx提前。。。李·麦克。
页:
[1]
2