Đến nội dung


Hình ảnh
- - - - -

Nhờ Thêm Vòng Lặp Vào Lisp


  • Please log in to reply
4 replies to this topic

#1 taipham

taipham

    biết vẽ ellipse

  • Members
  • PipPip
  • 57 Bài viết
Điểm đánh giá: -5 (bình thường)

Đã gửi 27 August 2016 - 12:27 PM

Em đang tập tành autolisp, không biết thêm vòng lặp while vào chỗ nào để lisp sau khi nhập chiều dài đoạn mút thì chọn liên liếp các line, hoặc chọn liên tiếp các pline, hoặc chọn liên tiếp 2 điểm để vẽ.

Nhờ anh chị trong diễn đàn giúp đỡ. Xin cảm ơn!

(defun C:VTT()
(command "undo" "be")
  (setq cmd (getvar "cmdecho")
	osm (getvar "osmode"))
  (setvar "cmdecho" 0)
  (or (and mut (or (= (type mut) 'int) (= (type mut) 'real))) (setq mut 30)) 
  (setq mut (cond ((getdist (strcat "\nChieu dai doan mu <" (rtos mut 2 2) ">: "))) (mut)))
  (setq dt (entsel "\nChon duong thang: "))
  (if
    (= dt nil)
	(progn
	(setq p1 (getpoint "\nChon diem dau")
	      p2 (getpoint p1 "\nChon diem cuoi")))
    (if
      (= "LWPOLYLINE" (cdr (assoc 0 (entget (car dt)))))
      (progn
	(setq pt (acet-geom-vertex-list (car dt))
	   p1 (car pt)
	   p2 (last pt)))
      (if
	(= "LINE" (cdr (assoc 0 (entget (car dt)))))
	(progn
        (setq dt (car dt)
	   dt (entget dt)
	   p1 (cdr (assoc 10 dt))
	   p2 (cdr (assoc 11 dt))))
	(princ "\nChon sai"))))
  (setvar "osmode" 0)
  (setq	p3 (polar p1 (+ pi (angle p1 p2)) mut)
	p4 (polar p2 (angle p1 p2) mut))
  (command ".mline" p3 p4 "")
  (setvar "osmode" osm)
  (setvar "cmdecho" cmd)
  (command "undo" "e")
  (princ))

  • 0

#2 tien2005

tien2005

    biết lệnh properties

  • Members
  • PipPipPipPip
  • 257 Bài viết
Điểm đánh giá: 94 (tàm tạm)

Đã gửi 27 August 2016 - 12:58 PM

Bạn cần phải khử biến sau khi kết thúc lệnh, thêm các kiểm tra để tránh lỗi, rút ngắn câu lệnh, lisp sau chỉ thêm vòng lặp thêm yêu cầu

(defun C:VTT()
(command "undo" "be")
  (setq cmd (getvar "cmdecho")
	osm (getvar "osmode"))
  (setvar "cmdecho" 0)
  (or (and mut (or (= (type mut) 'int) (= (type mut) 'real))) (setq mut 30)) 
  (setq mut (cond ((getdist (strcat "\nChieu dai doan mu <" (rtos mut 2 2) ">: "))) (mut)))
  (while
    (or	(setq dt (entsel "\nChon duong thang: "))
	(and (setq p1 (getpoint "\nChon diem dau"))
	     (setq p2 (getpoint p1 "\nChon diem cuoi"))
	)
    )
  (if dt
;;;    (= dt nil)
;;;	(progn
;;;	(setq p1 (getpoint "\nChon diem dau")
;;;	      p2 (getpoint p1 "\nChon diem cuoi")))
    (if
      (= "LWPOLYLINE" (cdr (assoc 0 (entget (car dt)))))
      (progn
	(setq pt (acet-geom-vertex-list (car dt))
	   p1 (car pt)
	   p2 (last pt)))
      (if
	(= "LINE" (cdr (assoc 0 (entget (car dt)))))
	(progn
        (setq dt (car dt)
	   dt (entget dt)
	   p1 (cdr (assoc 10 dt))
	   p2 (cdr (assoc 11 dt))))
	(princ "\nChon sai")))
    )
  (setvar "osmode" 0)
  (setq	p3 (polar p1 (+ pi (angle p1 p2)) mut)
	p4 (polar p2 (angle p1 p2) mut))
  (command ".mline" p3 p4 "")
  (setvar "osmode" osm)
  );while
  (setvar "cmdecho" cmd)
  (command "undo" "e")
  (princ))


  • 0

#3 taipham

taipham

    biết vẽ ellipse

  • Members
  • PipPip
  • 57 Bài viết
Điểm đánh giá: -5 (bình thường)

Đã gửi 27 August 2016 - 01:39 PM

 

Bạn cần phải khử biến sau khi kết thúc lệnh, thêm các kiểm tra để tránh lỗi, rút ngắn câu lệnh, lisp sau chỉ thêm vòng lặp thêm yêu cầu

(defun C:VTT()
(command "undo" "be")
  (setq cmd (getvar "cmdecho")
	osm (getvar "osmode"))
  (setvar "cmdecho" 0)
  (or (and mut (or (= (type mut) 'int) (= (type mut) 'real))) (setq mut 30)) 
  (setq mut (cond ((getdist (strcat "\nChieu dai doan mu <" (rtos mut 2 2) ">: "))) (mut)))
  (while
    (or	(setq dt (entsel "\nChon duong thang: "))
	(and (setq p1 (getpoint "\nChon diem dau"))
	     (setq p2 (getpoint p1 "\nChon diem cuoi"))
	)
    )
  (if dt
;;;    (= dt nil)
;;;	(progn
;;;	(setq p1 (getpoint "\nChon diem dau")
;;;	      p2 (getpoint p1 "\nChon diem cuoi")))
    (if
      (= "LWPOLYLINE" (cdr (assoc 0 (entget (car dt)))))
      (progn
	(setq pt (acet-geom-vertex-list (car dt))
	   p1 (car pt)
	   p2 (last pt)))
      (if
	(= "LINE" (cdr (assoc 0 (entget (car dt)))))
	(progn
        (setq dt (car dt)
	   dt (entget dt)
	   p1 (cdr (assoc 10 dt))
	   p2 (cdr (assoc 11 dt))))
	(princ "\nChon sai")))
    )
  (setvar "osmode" 0)
  (setq	p3 (polar p1 (+ pi (angle p1 p2)) mut)
	p4 (polar p2 (angle p1 p2) mut))
  (command ".mline" p3 p4 "")
  (setvar "osmode" osm)
  );while
  (setvar "cmdecho" cmd)
  (command "undo" "e")
  (princ))

Cảm ơn anh nhé! 

Ý em muốn là khi đã chọn vẽ từ 2 điểm thì chỉ lặp lại pick chọn 2 điểm liên tục hoặc khi đã chọn "line,pline" thì select line liên tục.

như vậy có được không anh!


  • 0

#4 tien2005

tien2005

    biết lệnh properties

  • Members
  • PipPipPipPip
  • 257 Bài viết
Điểm đánh giá: 94 (tàm tạm)

Đã gửi 27 August 2016 - 03:58 PM

(defun C:VTT()
(command "undo" "be")
  (setq cmd (getvar "cmdecho")
	osm (getvar "osmode"))
  (setvar "cmdecho" 0)
  (or (and mut (or (= (type mut) 'int) (= (type mut) 'real))) (setq mut 30)) 
  (setq mut (cond ((getdist (strcat "\nChieu dai doan mu <" (rtos mut 2 2) ">: "))) (mut)))
  (setq chk t)
  (while
    (or	(and chk
	  (setq dt (entsel "\nChon duong thang: "))
	    )
	(and (setq p1 (getpoint "\nChon diem dau"))
	     (setq p2 (getpoint p1 "\nChon diem cuoi"))
	     (not (setq chk nil))
	)
    )
  (if dt
;;;    (= dt nil)
;;;	(progn
;;;	(setq p1 (getpoint "\nChon diem dau")
;;;	      p2 (getpoint p1 "\nChon diem cuoi")))
    (if
      (= "LWPOLYLINE" (cdr (assoc 0 (entget (car dt)))))
      (progn
	(setq pt (acet-geom-vertex-list (car dt))
	   p1 (car pt)
	   p2 (last pt)))
      (if
	(= "LINE" (cdr (assoc 0 (entget (car dt)))))
	(progn
        (setq dt (car dt)
	   dt (entget dt)
	   p1 (cdr (assoc 10 dt))
	   p2 (cdr (assoc 11 dt))))
	(princ "\nChon sai")))
    )
  (setvar "osmode" 0)
  (setq	p3 (polar p1 (+ pi (angle p1 p2)) mut)
	p4 (polar p2 (angle p1 p2) mut))
  (command ".mline" p3 p4 "")
  (setvar "osmode" osm)
  );while
  (setvar "cmdecho" cmd)
  (command "undo" "e")
  (princ))

dùng tạm cái này


  • 1

#5 taipham

taipham

    biết vẽ ellipse

  • Members
  • PipPip
  • 57 Bài viết
Điểm đánh giá: -5 (bình thường)

Đã gửi 27 August 2016 - 05:48 PM

(defun C:VTT()
(command "undo" "be")
  (setq cmd (getvar "cmdecho")
	osm (getvar "osmode"))
  (setvar "cmdecho" 0)
  (or (and mut (or (= (type mut) 'int) (= (type mut) 'real))) (setq mut 30)) 
  (setq mut (cond ((getdist (strcat "\nChieu dai doan mu <" (rtos mut 2 2) ">: "))) (mut)))
  (setq chk t)
  (while
    (or	(and chk
	  (setq dt (entsel "\nChon duong thang: "))
	    )
	(and (setq p1 (getpoint "\nChon diem dau"))
	     (setq p2 (getpoint p1 "\nChon diem cuoi"))
	     (not (setq chk nil))
	)
    )
  (if dt
;;;    (= dt nil)
;;;	(progn
;;;	(setq p1 (getpoint "\nChon diem dau")
;;;	      p2 (getpoint p1 "\nChon diem cuoi")))
    (if
      (= "LWPOLYLINE" (cdr (assoc 0 (entget (car dt)))))
      (progn
	(setq pt (acet-geom-vertex-list (car dt))
	   p1 (car pt)
	   p2 (last pt)))
      (if
	(= "LINE" (cdr (assoc 0 (entget (car dt)))))
	(progn
        (setq dt (car dt)
	   dt (entget dt)
	   p1 (cdr (assoc 10 dt))
	   p2 (cdr (assoc 11 dt))))
	(princ "\nChon sai")))
    )
  (setvar "osmode" 0)
  (setq	p3 (polar p1 (+ pi (angle p1 p2)) mut)
	p4 (polar p2 (angle p1 p2) mut))
  (command ".mline" p3 p4 "")
  (setvar "osmode" osm)
  );while
  (setvar "cmdecho" cmd)
  (command "undo" "e")
  (princ))

dùng tạm cái này

 

Oke, hay quá, cảm ơn anh nhiều nhé!


  • 0