addresstemp 发表于 2022-7-5 19:48:34

Lisp绘制现有标高Li

你好
 
我是lisp循环的新手。我想在地形测量平面图的高程上绘制现有地形线。附着在标高顶部的测量图,获取x坐标以单击测量平面中的点,并输入z坐标。平面上的这些(x,z)将在立面上绘制多段线为(x,y)。图纸单位为毫米,平面图上显示的数据为米。
 

 
我试着写lisp如下。我真的不知道如何使用“while”列表。
 
(defun c:Elevel (/ x1 l1 y1 pt1 x2 l2 y2 pt2)
(setq x1 (rtos (car (getpoint "\nPick Point1: ")) 2 2))
(setq l1 (getreal "\nEnter Level1: "))
(setq y1 (rtos (* l1 1000) 2 2))
(setq pt1 (strcat x1 "," y1))

(while (/= nil
   (setq x2 (rtos (car (getpoint "\nPick Point2: ")) 2 2))
   (setq l2 (getreal "\nEnter Level2: "))
   (setq y2 (rtos (* l2 1000) 2 2))
   (setq pt2 (strcat x2 "," y2))
)


   (command "_pline" pt1 pt2 "")
   (setq pt1 pt2)
)

(princ)

)

 
提前感谢,
杰克

addresstemp 发表于 2022-7-5 20:00:45

多段线不连续。和退出错误。谁能帮我修Lisp程序吗?

addresstemp 发表于 2022-7-5 20:06:00

请帮帮我。。。

Tharwat 发表于 2022-7-5 20:09:32

像这样的?
 

(defun c:Elevel (/ l1 p1 l2 p2)
(if (and (setq p1 (getpoint "\nPick Point 1: "))
          (setq l1 (getreal "\nEnter Level 1: "))
   )
   (progn
   (setq p1 (strcat (rtos (car p1) 2 2) "," (rtos (* l1 1000.) 2 2)))
   (while (and (setq p2 (getpoint "\nPick Point2: "))
               (setq l2 (getreal "\nEnter Level2: "))
            )
       (command "_pline"
                "_non"
                p1
                "_none"
                (setq p2
                     (strcat (rtos (car p2) 2 2) "," (rtos (* l2 1000.) 2 2))
                )
                ""
       )
       (setq p1 p2)
   )
   )
)
(princ)
)

addresstemp 发表于 2022-7-5 20:17:26

是的,差不多吧。
谢谢塔瓦。循环现在可以了。但普林仍不连续。

BIGAL 发表于 2022-7-5 20:28:25

你只需要选择文字或十字架,如果它有一个Z来获得高程值,这是一个额外的步骤,不需要,如果文字插入在交叉点,那么你可以使用它来计算X,Y。缺少的位是计算点之间的真实距离,我在你的代码中看不到,它可能更容易制作一个点列表,然后一次绘制pline。你是否从一个X,Y,Z的CSV文件中创建了点,那么只使用它,而不拾取任何点会更容易。

Spaj 发表于 2022-7-5 20:30:08

你好
 
此外,您必须深入研究AutoLISP以生成连续多段线。
 
(setq file (open name "r"))                        ; Open file for second read
(entmake '((0 . "polyline")
            (66 . 1)
            (62 . 5)))
(entmake '((0 . "vertex")(10 0 0 0)))            ; Set init polyline point
(setq info (read-line file))                     ; Read data line
(while (/= info nil)
    (setq data (read (strcat "(" info ")"))         ; Convert to list
               x1 (nth 2 data)                      ; Point Resist
               y1 (car data)                        ; Y coord (depth)
               y2 (* y1 -10)                        ; Plot Y's downward
               x2 (* (* x1 0.2) 10)
               )                                    ; end setq
               (entmake(list '(0 . "vertex") (list 10 x2 y2 0)))
               (setq info (read-line file))
    )                                             ; end while
(entmake '((0 . "seqend")))                     ; Close polyline

BIGAL 发表于 2022-7-5 20:36:52

另一个pline例程
 

(command "_pline")
(while (= (getvar "cmdactive") 1 ) (command pause)

)

Tharwat 发表于 2022-7-5 20:43:53

试试这个程序,当你完成拣选点时,只需点击回车而不是退出按钮。
 

(defun c:Test(/ l i l1 p1 l2 p2)
;;; Tharwat 15.03.2015    ;;;
(if (and (setq p1 (getpoint "\nPick Point 1: "))
          (setq l1 (getreal "\nEnter Level 1: "))
          )
   (progn
   (setq p1 (list (car p1) (* l1 1000.))
         l(cons p1 l)
         )
   (while (and (setq p2 (getpoint "\nPick Point2: "))
               (setq l2 (getreal "\nEnter Level2: "))
               )
       (setq l (cons (setq p2
                            (list (car p2) (* l2 1000.))
                           )
                     l)
             i 0
             )
       (repeat (1- (length l))
         (grdraw (nth i l) (nth (setq i (1+ i)) l) 2 1)
         )
       )
   (entmakex
       (append (list '(0 . "LWPOLYLINE")
                     '(100 . "AcDbEntity")
                     '(100 . "AcDbPolyline")
                     (cons 90 (length l))
                     '(70 . 0))
               (mapcar (function (lambda (p) (cons 10 p))) l)))
   )
   )
(redraw)
(princ)
)

addresstemp 发表于 2022-7-5 20:55:08

谢谢塔瓦。lisp可以生成连续多段线,并从世界UCS绘制。但对于高程,我更改了UCS原点并围绕平面绘制高程。这些地形标高是从用户ucs绘制的。但它与用户ucs无关。它离用户ucs很远。我附上了样品图纸。请帮我查一下。谢谢
对于Lisp。图纸
页: [1]
查看完整版本: Lisp绘制现有标高Li