Đến nội dung


Hình ảnh
* * * - - 17 Bình chọn

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


  • Please log in to reply
2851 replies to this topic

#2221 trinhhoanghieu090

trinhhoanghieu090

    Edu level: li8

  • Members
  • PipPipPipPipPip
  • 309 Bài viết
Điểm đánh giá: 29 (tàm tạm)

Đã gửi 30 November 2014 - 02:01 PM

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ị.


  • 0

#2222 trinhhoanghieu090

trinhhoanghieu090

    Edu level: li8

  • Members
  • PipPipPipPipPip
  • 309 Bài viết
Điểm đánh giá: 29 (tàm tạm)

Đã gửi 30 November 2014 - 02:39 PM

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 ạ.


  • 0

#2223 nhoclangbat

nhoclangbat

    Edu level: li10

  • Members
  • PipPipPipPipPipPipPip
  • 1409 Bài viết
Điểm đánh giá: 379 (khá)

Đã gửi 01 December 2014 - 08:21 AM

- 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ì ^^


  • 1
"...................][)e\/i][_ /\/\@Y CrY....................."

(defun THỔ_DÂN_HỌC_CAD (xxxx) ...) ^_^








#2224 naturooo

naturooo

    biết zoom

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

Đã gửi 01 December 2014 - 10:03 AM

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!


  • 0

#2225 Doan Van Ha

Doan Van Ha

    biết lệnh adcenter

  • CADViet Team
  • PipPipPipPipPipPipPip
  • 5447 Bài viết
Điểm đánh giá: 2624 (tuyệt vời)

Đã gửi 01 December 2014 - 10:06 AM

@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).


  • 2

* Chỉ nên yêu cầu Lisp khi bạn làm việc đó mất cả ngày nhưng họ chỉ viết 1 giờ. Đừng nêu yêu cầu Lisp khi bạn chỉ làm 1 giờ nhưng bắt họ phải mất cả ngày.

* Nhờ viết lisp cũng như đi khám bệnh. Chỉ gởi căn cước và than sắp chết thì không bác sỹ nào cứu sống được.


#2226 trinhhoanghieu090

trinhhoanghieu090

    Edu level: li8

  • Members
  • PipPipPipPipPip
  • 309 Bài viết
Điểm đánh giá: 29 (tàm tạm)

Đã gửi 01 December 2014 - 10:33 AM

- 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ì ^^

Thanks nhoc, hôm nay nhiều việc quá chưa xem được lisp nhóc sửa lại, để mình từ từ ngâm cứu.


  • 0

#2227 trinhhoanghieu090

trinhhoanghieu090

    Edu level: li8

  • Members
  • PipPipPipPipPip
  • 309 Bài viết
Điểm đánh giá: 29 (tàm tạm)

Đã gửi 01 December 2014 - 10:34 AM

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!

Bạn nói rõ hơn được không, "phương bất kỳ" của bạn là lấy phương theo cách pick 2 điểm hay như thế nào?


  • 0

#2228 trinhhoanghieu090

trinhhoanghieu090

    Edu level: li8

  • Members
  • PipPipPipPipPip
  • 309 Bài viết
Điểm đánh giá: 29 (tàm tạm)

Đã gửi 01 December 2014 - 10:39 AM

@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.

Bác Ha ơi mục đích em dùng pause là vừa  có thể quay linh động được (trực quan vì có sợi dây thun) vừa nhập góc chính xác vào được. Nếu chuyển sang hàm getxxx thì nó mất phần quay linh động đi, thế là “cải lùi” so với lệnh gốc của cad. E tạm thời sống chung với lũ vậy vì hiện tại nội lực chưa đủ để sử dụng hàm grread. :D


  • 0

#2229 naturooo

naturooo

    biết zoom

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

Đã gửi 01 December 2014 - 10:43 AM

Bạn nói rõ hơn được không, "phương bất kỳ" của bạn là lấy phương theo cách pick 2 điểm hay như thế nào?

Ví dụ như thế này: có 2 đoạn thẳng chung 1 gốc hợp một góc bất kỳ, giờ muốn quay cho 1 đoạn trùng với đoạn thằng còn lại. Thứ tự lệnh: Chọn đoạn thẳng cần quay, pick điểm chọn gốc quay (điểm chung của hai đoạn thẳng), pick điểm chọn phương quay (1 điểm bất kỳ trên đoạn thẳng cần quay), rồi pick 1 điểm bất kỳ trên đoạn thẳng đích, như thông số R trong lệnh rotate ấy nhưng là rút gọn bước đi thôi.  :)


  • 0

#2230 Doan Van Ha

Doan Van Ha

    biết lệnh adcenter

  • CADViet Team
  • PipPipPipPipPipPipPip
  • 5447 Bài viết
Điểm đánh giá: 2624 (tuyệt vời)

Đã gửi 01 December 2014 - 10:50 AM

Toi da tra loi o tren.


  • 1

* Chỉ nên yêu cầu Lisp khi bạn làm việc đó mất cả ngày nhưng họ chỉ viết 1 giờ. Đừng nêu yêu cầu Lisp khi bạn chỉ làm 1 giờ nhưng bắt họ phải mất cả ngày.

* Nhờ viết lisp cũng như đi khám bệnh. Chỉ gởi căn cước và than sắp chết thì không bác sỹ nào cứu sống được.


#2231 naturooo

naturooo

    biết zoom

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

Đã gửi 01 December 2014 - 10:53 AM

Toi da tra loi o tren.

thank bác ạ!


  • 0

#2232 naturooo

naturooo

    biết zoom

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

Đã gửi 01 December 2014 - 11:08 AM

E đã thử delete theo ý bác Hà mà không thành công, chắc tại không hiểu ý. Mà em muốn chọn phương cần quay chỉ pick vào 2 điểm chứ không phải pick vào đường thẳng ạ, vì nhiêu khi phương cần quay không phải là đường thẳng mà chỉ là 2 điểm thôi ạ. Bác Hà chỉ rõ hơn cho em với, em không biết nhiều về lisp ạ! Thank bác. 


  • 0

#2233 trinhhoanghieu090

trinhhoanghieu090

    Edu level: li8

  • Members
  • PipPipPipPipPip
  • 309 Bài viết
Điểm đánh giá: 29 (tàm tạm)

Đã gửi 01 December 2014 - 11:25 AM

E đã thử delete theo ý bác Hà mà không thành công, chắc tại không hiểu ý. Mà em muốn chọn phương cần quay chỉ pick vào 2 điểm chứ không phải pick vào đường thẳng ạ, vì nhiêu khi phương cần quay không phải là đường thẳng mà chỉ là 2 điểm thôi ạ. Bác Hà chỉ rõ hơn cho em với, em không biết nhiều về lisp ạ! Thank bác. 

(defun c:roo(/ dt db tt )
 (princ "Chon Doi Tuong Can Quay: ") 
 (setq dt (ssget)
       db (getpoint "\nChon BasePoint:")
       tt (getpoint "\nChon Diem Dinh Huong: ") )
   (command ".rotate" dt "" "non" db "r" "non" db "non" tt pause)
) 

Của bạn đây. 


  • 1

#2234 naturooo

naturooo

    biết zoom

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

Đã gửi 01 December 2014 - 12:04 PM

(defun c:ND()      (setvar "cmdecho" 0)
		   (setq a (getint "Nhap ti le dim: "))
		   (setvar "dimscale" a)	
		   (itoa a)
		   (setq ab (strcat "D" (itoa a)))
		   (command "DIMSTYLE" "s" ab)
)
(defun C:HD()
 (setvar "cmdecho" 0)
		   (setq a (getint "Nhap ti le dim muon lam hien hanh: "))	
		   (itoa a)
		   (setq ab (strcat "D" (itoa a)))
(wcmatch (cdr (assoc 0 lst)) "DIMENSION") (command "DIMSTYLE" "r" ab))))
;(princ))

E có 2 lisp, nd tạo dim mới từ D1, hd chọn dim hiện hành, đều là thao tác nhập từ bàn phím, em muốn gộp thành 1 lệnh thôi, tức là nếu dim chưa có sẵn thì tạo dim mới, nếu dim đã có sẵn thì chọn nó làm hiện hành. Các bác chỉnh sửa giúp em với ạ. Thank nhiều ạ!


  • 0

#2235 thanhduan2407

thanhduan2407

    biết lệnh adcenter

  • Advance Member
  • PipPipPipPipPipPipPip
  • 992 Bài viết
Điểm đánh giá: 223 (khá)

Đã gửi 01 December 2014 - 12:16 PM

Có thể hơi lạc đề với bài toán trên, cho em hỏi 1 chút.

Có thể hơi lạc đề với bài toán trên, cho em hỏi 1 chút.

Em có 1 đoạn như thế này thì viết kiểu dạng Function, Lambda, Mapcar....thì viết kiểu như thế nào các bác nhỉ?

Em có n = 5 và em muốn tạo ra 1 chuỗi: "1,2,3,4,5"

(progn
	        (setq k 2)
	    	(setq L1 "1")
	    	(repeat 5
			(setq L1 (strcat L1 "," (rtos k 2 0)))
                  	(setq k (+ k 1))
	        )
          	(princ L1)
          	(princ)
 )

 

Em có 1 đoạn như thế này thì viết kiểu dạng Function, Lambda, Mapcar....thì viết kiểu như thế nào các bác nhỉ?

  • 0



Tôi là con kiến bò trên sa mạc kiến thức bao la. Biển học thật rộng lớn







#2236 Tot77

Tot77

    biết lệnh adcenter

  • Members
  • PipPipPipPipPipPipPip
  • 990 Bài viết
Điểm đánh giá: 498 (tốt)

Đã gửi 01 December 2014 - 12:39 PM

Cái này không dùng mapcar mà dùng đệ quy.

(defun strcat1 (a n)
  (if (< a n)
    (strcat (itoa a) "," (strcat1 (1+ a) n))
    (itoa a)
  )
)
 
(strcat1 1 5)

  • 1

#2237 trinhhoanghieu090

trinhhoanghieu090

    Edu level: li8

  • Members
  • PipPipPipPipPip
  • 309 Bài viết
Điểm đánh giá: 29 (tàm tạm)

Đã gửi 01 December 2014 - 01:05 PM

(defun c:ND()      (setvar "cmdecho" 0)
		   (setq a (getint "Nhap ti le dim: "))
		   (setvar "dimscale" a)	
		   (itoa a)
		   (setq ab (strcat "D" (itoa a)))
		   (command "DIMSTYLE" "s" ab)
)
(defun C:HD()
 (setvar "cmdecho" 0)
		   (setq a (getint "Nhap ti le dim muon lam hien hanh: "))	
		   (itoa a)
		   (setq ab (strcat "D" (itoa a)))
(wcmatch (cdr (assoc 0 lst)) "DIMENSION") (command "DIMSTYLE" "r" ab))))
;(princ))

E có 2 lisp, nd tạo dim mới từ D1, hd chọn dim hiện hành, đều là thao tác nhập từ bàn phím, em muốn gộp thành 1 lệnh thôi, tức là nếu dim chưa có sẵn thì tạo dim mới, nếu dim đã có sẵn thì chọn nó làm hiện hành. Các bác chỉnh sửa giúp em với ạ. Thank nhiều ạ!

Của bạn đây! Mà lisp dùng được hay không thì cũng phải phản hồi lại chứ, trình duyệt tự nhiên lỗi nên mình không tag vào code được đành để ngoài này

(defun c:ND(/ a b ab)
(setvar "cmdecho" 0)
(setq a (getint "Nhap ti le dim: "))
(setvar "dimscale" a)    
(itoa a)
(setq ab (strcat "D" (itoa a)))
(if (not (tblsearch "DIMSTYLE" ab))
(command "-DIMSTYLE" "s" ab)
(command "-DIMSTYLE" "r" ab) )
)


  • 1

#2238 naturooo

naturooo

    biết zoom

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

Đã gửi 01 December 2014 - 01:24 PM

Em có đánh giá bài hay rồi mà bác. Thank bác nhiều nhé!


  • 0

#2239 naturooo

naturooo

    biết zoom

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

Đã gửi 01 December 2014 - 01:31 PM

Lisp hay lắm bác trinhhoanghieu090 ạ, rất đúng ý em. Thank bác nhiều nhé! Bác giữ gìn sức khỏe, có gì em hỏi tiếp.  :D


  • 0

#2240 thanhduan2407

thanhduan2407

    biết lệnh adcenter

  • Advance Member
  • PipPipPipPipPipPipPip
  • 992 Bài viết
Điểm đánh giá: 223 (khá)

Đã gửi 01 December 2014 - 01:47 PM

Cái này không dùng mapcar mà dùng đệ quy.

 

(defun strcat1 (a n)
  (if (< a n)
    (strcat (itoa a) "," (strcat1 (1+ a) n))
    (itoa a)
  )
)
 
(strcat1 1 5)

Dạ, em cảm ơn anh Tot77. Vậy em vẫn dùng cách của em ạ


  • 0



Tôi là con kiến bò trên sa mạc kiến thức bao la. Biển học thật rộng lớn