Chuyển đến nội dung
Diễn đàn CADViet
  • Thông báo

    • Nguyen Hoanh

      CADViet đã hoàn tất nâng cấp   14/09/2017

      Chào các bạn, CADViet đã hoàn tất việc nâng cấp lên phiên bản mới. Tất cả các chức năng đã hoạt động theo kỳ vọng của ban quản trị. Nếu có vấn đề gì cần phản hồi, các bản post ở đây nhé: Trân trọng, Nguyễn Hoành.
Jin Yong

Hỏi về Lisp (thuật toán, ý tưởng, coding,...)

Các bài được khuyến nghị

Nếu nhập trực tiếp chứ k phải setvar sẽ khác đó

Hi, may thầy ketxu nhắc, nhập trực tiếp từ bàn phím là độ, còn setvar thì phải nhập radian. Và hàm (angle  ) tính góc từ 2 điểm không chịu ảnh hưởng của biến này thì phải, nó vẫn trả về theo angbase= 0 mặc định

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

 Ý tưởng của em là khi ta vừa dim xong kích thước ta edit luôn.

Em chưa biết dòng command sẽ code như thế nào hết. :wacko:

(defun c:doi(/ chon)
  (setq chon (entlast))
  (setq text (getstring "\nNhap kich thuoc moi"))
  (command ".ddedit" chon ??? text  ??))

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

Một ví dụ:

(defun c:test()
(setq p1 (getpoint "\nChon diem chan dim thu nhat: ")
	  p2 (getpoint "\nChon diem chan dim thu hai: ")
	  p3 (getpoint "\nChon diem dat: ")
	  )
(command ".DIMALIGNED" p1 p2 p3)
(setq info (entget(entlast)))
(entmod (subst (cons 1 "Vinh_hot_boy") (assoc 1 info) info))
)
  • Vote tăng 1

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

 

 Ý tưởng của em là khi ta vừa dim xong kích thước ta edit luôn.

Em chưa biết dòng command sẽ code như thế nào hết. :wacko:

(defun c:doi(/ chon)
  (setq chon (entlast))
  (setq text (getstring "\nNhap kich thuoc moi"))
  (command ".ddedit" chon ??? text  ??))

 

Chắc là như vầy (entlast) là cái dim nhé!

 

(defun c:doi(/ chon text)
  (setq chon (entlast))
  (setq text (getstring "\nNhap kich thuoc moi"))
  (command "._dimedit" "n" text chon "" ".ddedit" chon))
  • Vote tăng 1

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác
(defun c:roo(/ doigoc start end dt db dh dg goc tt ent lst px pg)
;====================================================
(defun start()
(setq osmodeold (getvar "osmode")
      cmdechoold (getvar "cmdecho")
	  angdirold (getvar "angdir")
	  angbaseold (getvar "angbase")
	  )
(setvar "osmode" 0)
(setvar "cmdecho" 0)
(setvar "angbase" (/ pi 2.0))
(setvar "angdir" 1)

)
;=======================================================
(defun end()
(setvar "osmode" osmodeold)
(setvar "cmdecho" cmdechoold)
(setvar "angdir" angdirold)
(setvar "angbase" angbaseold)
(setq osmodeold nil
      cmdechoold nil
	  angdirold nil
	  angbaseold nil
	  )
)
;=======================================================	  
 (vl-load-com)                                                    
	                         (princ "Chon Doi Tuong Can Quay: ")							 
                             (setq dt (ssget)
							       db (getpoint "\nChon BasePoint:")
							       tt (entsel "\nChon doi duong tam tau: ")
                                  ent (car tt)
                                  lst (mapcar 'cdr (vl-remove-if-not '(lambda(x) (or (= (car x) 10) (= (car x) 11))) (entget ent))))
							 (start )
                             (if (< (distance db (setq px (car lst))) (distance db (setq pg (cadr lst))))					 
							 (command ".rotate" dt "" db "r" px pg )  							 
                             (command ".rotate" dt "" db "r" pg px ) 							 
							 );end if			 
(end )
)	  

Các bác ơi em viết lại đoạn code để quay như trên, mục đích của em là đặt biến hệ thống lại để quay theo ý mình (angbase và angdir). Có chút rắc rối ở đây là khi viết hàm con (end ) ngay sau lệnh "rotate"  thì nó thực hiện hàm end này trước khi mình nhập góc vào, làm cho hàm (start ) viết ở trên trở nên công cốc. Em mày mò mãi mà chưa giải quyết được vấn đề này, các bác cho em chút ý kiến được không.

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

- chà chà Hieu mò mẫn ghê thật chơi cả vl,lambda ^^, hàm end Hieu thử bỏ mấy thằng nil đi xem , nhoc đoán vậy ^^

Hi hi, mấy cái đó là tớ "mượn code" của các bro trên diễn đàn thôi nhóc ạ. chỉ xào xáo lại tí ấy mà

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

:D :D :D

Tất cả là của bạn !

;; free lisp from cadviet.com
;;; this lisp was downloaded from http://www.cadviet.com/forum/topic/14210-hoi-ve-lisp-thuat-toan-y-tuong-coding/page-111
(defun c:roo(/ doigoc start end dt db dh dg goc tt ent lst px pg)
;====================================================
(defun start()
(setq osmodeold (getvar "osmode")
      cmdechoold (getvar "cmdecho")
	  angdirold (getvar "angdir")
	  angbaseold (getvar "angbase")
	  )
(setvar "osmode" 0)
(setvar "cmdecho" 0)
(setvar "angbase" (/ pi 2.0))
(setvar "angdir" 1)

)
;=======================================================
(defun end()
(setvar "osmode" osmodeold)
(setvar "cmdecho" cmdechoold)
(setvar "angdir" angdirold)
(setvar "angbase" angbaseold)
(setq osmodeold nil
      cmdechoold nil
	  angdirold nil
	  angbaseold nil
	  )
)
;=======================================================	  
 (vl-load-com)                                                    
	                         (princ "Chon Doi Tuong Can Quay: ")							 
                             (setq dt (ssget)
							       db (getpoint "\nChon BasePoint:")
							       tt (entsel "\nChon doi duong tam tau: ")
                                  ent (car tt)
                                  lst (mapcar 'cdr (vl-remove-if-not '(lambda(x) (or (= (car x) 10) (= (car x) 11))) (entget ent))))
							 (start )
                             (if (< (distance db (setq px (car lst))) (distance db (setq pg (cadr lst))))					 
							 (command ".rotate" dt "" db "r" px pg pause)  							 
                             (command ".rotate" dt "" db "r" pg px pause) 							 
							 );end if			 
(end)
) 
  • Vote tăng 1

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

- Trong lsp xoay của Hieu có dòng lấy nó ra kìa ^^

(setq lst  (mapcar 'cdr (vl-remove-if-not '(lambda(x) (or (= (car x) 10) (= (car x) 11))) (entget ent))))

  • Vote tăng 1

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

- Trong lsp xoay của Hieu có dòng lấy nó ra kìa ^^

hi hi, để tớ xoá câu hỏi đi cho bớt spam topic, vì "đi mượn" nên không hiểu đó mà nhóc. thanks nhóc nhiều nha. Lâu lâu cầm đèn chạy trước ô tô bị ô tô đâm. :D

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

Chào các bác. Với hàm bẫy lỗi *error* em đã giải quyết được vấn đề trả biến hệ thống về như ban đầu khi chưa chạy xong chương trình đã bấm Esc. Nhưng còn một vấn đề nữa là khi em bấm ctrol z để trả lại kết quả như ban đầu trước khi chạy lisp thì biến hệ thống cũng bị thay đổi luôn. Các bác tư vấn cho em cái này với.

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

Bạn đưa lisp đó lên đây mọi người xem thử. Trong hàm bẫy lỗi ngoài việc set lại biến hệ thống đôi khi cần phải thêm các hàm về undo nữa.

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

Của em đây ạ. Em không ngồi máy tính nên không đưa vào code được:(defun c:roo(/ doigoc start end *error* vars ovars nvars dt db dh dg goc tt ent lst px pg )

;====================================================

(defun doigoc( goc )

( setq goc (- 450.0 goc)

goc (rem goc 360.0 )

)

)

;========================================================================

(defun start()

(setq vars '("osmode" "cmdecho" "angdir" "angbase") )

(setq ovars (mapcar 'getvar vars)

nvars (mapcar 'setvar vars (list 0 0 1 (/ pi 2))))

)

(defun end()

(and ovars (mapcar 'setvar vars ovars))

)

(defun *error* (ABC)

(end)

)

;=======================================================

(vl-load-com)

(princ "Chon Doi Tuong Can Quay: ")

(setq dt (ssget)

db (getpoint "\nChon BasePoint:")

tt (entsel "\nChon doi duong tam tau: ")

ent (car tt)

lst (mapcar 'cdr (vl-remove-if-not '(lambda(x) (or (= (car x) 10) (= (car x) 11))) (entget ent))))

(start )

 

(if (< (distance db (setq px (car lst))) (distance db (setq pg (cadr lst))))

(progn

(princ (strcat "\nNhap Phuong Vi <" (rtos (doigoc (* 180.0 (/ 1 pi) (angle px pg))) 2 2) ">:" ) )

(command ".rotate" dt "" db "r" px pg pause)

) ; End progn

(progn

(princ (strcat "\nNhap Phuong Vi <" (rtos (doigoc (* 180.0 (/ 1 pi) (angle pg px))) 2 2) ">:" ) )

(command ".rotate" dt "" db "r" pg px pause )

) ; End progn

);end if

(end)

)

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

Chẳng hạn bạn sửa lại như thế này:

 

(defun c:roo(/ doigoc start end *error* vars ovars nvars dt db dh dg tt ent lst px pg)
 (defun doigoc(goc)
  (rem (- 450.0 goc) 360.0))
 (defun start()
  (setq vars '("osmode" "cmdecho" "angdir" "angbase"))
  (setq ovars (mapcar 'getvar vars)
        nvars (mapcar 'setvar vars (list 0 0 1 (/ pi 2)))))
 (defun end()
  (and ovars (mapcar 'setvar vars ovars)))
 (defun *error* (ABC)
  (end))
 (vl-load-com) 
 (princ "Chon Doi Tuong Can Quay: ") 
 (setq dt (ssget)
       db (getpoint "\nChon BasePoint:")
       tt (entsel "\nChon doi duong tam tau: ")
       ent (car tt)
       lst (mapcar 'cdr (vl-remove-if-not '(lambda(x) (or (= (car x) 10) (= (car x) 11))) (entget ent))))
 (command "undo" "be")    
 (start)
 (if (< (distance db (setq px (car lst))) (distance db (setq pg (cadr lst))))
  (progn 
   (princ (strcat "\nNhap Phuong Vi <" (rtos (doigoc (* 180.0 (/ 1 pi) (angle px pg))) 2 2) ">:")) 
   (command ".rotate" dt "" db "r" px pg pause))
  (progn 
   (princ (strcat "\nNhap Phuong Vi <" (rtos (doigoc (* 180.0 (/ 1 pi) (angle pg px))) 2 2) ">:")) 
   (command ".rotate" dt "" db "r" pg px pause)))
 (end)
 (command "undo" "e")) 
 
  • Vote tăng 1

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

Thanks bác Ha, chúc bác cuối tuần vui vẻ nhiều ý nghĩa. Giờ em càng ngày càng thấm thía câu nói  "càng vào sâu càng có nhiều lớp sương mù" của bác. Nhưng nếu không đi sao biết đường ngắn hay dài đúng không bác, mỗi bước ta qua là một trải nghiệm thú vị.

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

Bác Ha ơi cho em hỏi thêm trong lisp trên mình không cho người dùng nhấn enter khi chưa pick điểm hoặc nhập số góc vào dòng (command ".rotate" ....) không? Em đã thử với initget mà không được do nó phải đi chung với hàm họ getxxx. Và trong trường hợp mình muốn khống chế người dùng nhập vào giá trị trong một khoảng nào đó, ví dụ chỉ chấp nhận nhập số trong khoảng [0 180] thì phải làm thế nào ạ.

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

- hi Chạy trước nhọc chưa hì ^^, khống chế giá trị nhập để đưa vào command nhoc thì chưa nghĩ ra cách nào khác ngoài cách đưa thêm biến phụ nhập góc vào ^^, còn pick điểm thì initget khống chế đc, initget theo nhoc biết thì chưa không chế đc khoảng nhập vào nên dùng vòng lặp tới khi nào thỏa thì ok, Hieu thử xem ^^

(defun c:roo(/ doigoc start end *error* vars ovars nvars dt db dh dg tt ent lst px pg p_vii)
 (defun doigoc(goc)
  (rem (- 450.0 goc) 360.0))
 (defun start()
  (setq vars '("osmode" "cmdecho" "angdir" "angbase"))
  (setq ovars (mapcar 'getvar vars)
        nvars (mapcar 'setvar vars (list 0 0 1 (/ pi 2)))))
 (defun end()
  (and ovars (mapcar 'setvar vars ovars)))
 (defun *error* (ABC)
  (end))
 (vl-load-com) 
 (princ "Chon Doi Tuong Can Quay: ") 
 (setq dt (ssget)
       db (getpoint "\nChon BasePoint:")
       tt (entsel "\nChon doi duong tam tau: ")
       ent (car tt)
       lst (mapcar 'cdr (vl-remove-if-not '(lambda(x) (or (= (car x) 10) (= (car x) 11))) (entget ent))))
 (command "undo" "be")    
 (start)
 (if (< (distance db (setq px (car lst))) (distance db (setq pg (cadr lst))))
  (progn 
   (princ (strcat "\nGoc Phuong Vi hien tai <" (rtos (doigoc (* 180.0 (/ 1 pi) (angle px pg))) 2 2) ">"))
   (setq p_vii (getreal "\nNhap goc phuong vi:"))
   (while (> p_vii 180.0)
   (setq p_vii (getreal "\nNhap goc phuong vi:")))
   (command ".rotate" dt "" db "r" px pg p_vii)
   )
  (progn 
   (princ (strcat "\nGoc Phuong Vi hien tai <" (rtos (doigoc (* 180.0 (/ 1 pi) (angle pg px))) 2 2) ">"))
    (setq p_vii (getreal "\nNhap goc phuong vi:"))
   (while (> p_vii 180.0)
   (setq p_vii (getreal "\nNhap goc phuong vi:")))   
   (command ".rotate" dt "" db "r" pg px p_vii)
   )
   )
 (end)
 (command "undo" "e"))

- nhoc quên chưa chỉnh khống chế cho thằng db Hieu tự xử hen ^^

-p/s:nhoc chưa hiểu cái biến tt là gì ^^

  • Vote tăng 1

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

Lisp roo này rất hay nhưng em không bắt điểm theo phương bất kỳ được ạ, dù đã bật osnap, các anh chỉnh lại để nó bắt điểm theo phương có sẵn được không ạ. Thank all!

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

@090: bạn dung pause >> user co the nhap tu ban phim hoac pick diem, trong do enter cung la 1 cach nhap, danh chap nhan.

De co the cam user nhan enter thi hoac ban chuyen sang getxxx hoac dung ham grread (kha phuc tap).

@nhoc: khoang do la [0 180] ma.

srr: vi loi nen khong viet chu co dau duoc.

@naturooo: ban delete 2 doan nay o duoi cung: (start) va (end). Hoac de nguyen lisp nhung dung che do bat diem sau (dung set truoc).

  • Vote tăng 2

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

Tạo một tài khoản hoặc đăng nhập để nhận xét

Bạn cần phải là một thành viên để lại một bình luận

Tạo tài khoản

Đăng ký một tài khoản mới trong cộng đồng của chúng tôi. Điều đó dễ mà.

Đăng ký tài khoản mới

Đăng nhập

Bạn có sẵn sàng để tạo một tài khoản ? Đăng nhập tại đây.

Đăng nhập ngay


×