elfert 发表于 2022-7-5 15:25:37

用于绘制多段线的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提前。

nod684 发表于 2022-7-5 15:31:36

看起来你需要一个新的线型。。。不是Lisp程序

Lee Mac 发表于 2022-7-5 15:32:23

下面是一些非常简单的代码:

(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)
)

Tharwat 发表于 2022-7-5 15:35:51

李,如果出现以下条件,最后一行可能变为零长度。
 

(rem 100. 10.)

Lee Mac 发表于 2022-7-5 15:40:53

很好的捕捉塔尔瓦特,更新如上。

BIGAL 发表于 2022-7-5 15:42:48

你可以做各种各样的普林线的东西,包括弧,我写了一些击球例程之字形波浪曲线等他们的工作方式,你想开始结束宽度,我不能后代码复制,但非常乐意帮助如何做。
 
在这里搜索打击有一些例子
 

Tharwat 发表于 2022-7-5 15:47:38

另一个具有多段线实体。
希望你喜欢。
 
(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)
)

elfert 发表于 2022-7-5 15:48:07

很好的回复了这个帖子中的所有回复!非常感谢。。。
 
Tha****:
 
-你能解释一下代码的作用吗。然后我可以更好地理解代码,也许可以修改它。
-如果你看到我的图片,你会注意到y是x线段之间的水平线段,也许我应该把它叫做X1-one,那么这里没有误解,我的错。。。但是无论如何,lisp代码都必须自己计算y线段。
-代码要求从起点开始的y坐标,但在图片中它说它始终必须为20mm。
-第一个x线段和最后一个x线段必须具有相同的y坐标,如图所示。
-多边形旋转方向的方式取决于用户提供起点和终点接缝的方式。。谢谢
 
Thanx论坛成员。。。。

Lee Mac 发表于 2022-7-5 15:51:58

这里有一个有趣的游戏供你玩:
 

;; 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)
)

 
例子:
 

elfert 发表于 2022-7-5 15:54:46

谢谢李麦克。。。但是这不是很恰当。
 
我会再次解释:
 

 
用户必须提供以下信息:
 
-其中一条水平x线段的长度。(标记为红色)
-起点。(标记为红色)
-终点。(标记为红色)
 
1.当用户给定起点和终点时,代码已计算水平y线段。y的长度并不重要。(标记为绿色)
2、起点必须是一条X线段,终点前必须有一条水平X线段。
3.X线段和Y线段之间的距离始终为20mm。
4.poly线必须根据我在这个线程中写的第一篇帖子改变方向。
 
Thx提前。。。李·麦克。
页: [1] 2
查看完整版本: 用于绘制多段线的Lisp