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ị

thanhduan2407    227

Các bác cho em hỏi 1 chút.

Em viết một hàm tọa độ của Text khi biết tên của Text đó trong 1 tập hợp Text. Vậy mà kết quả vẫn trả về nil mặc dù em tìm đúng.

Sau khi quét chọn Text em có 1 danh sách (LtsNPoint)   dạng: ("B44" (442758.0 1.39677e+006 0.0)) ("B43" (442622.0 1.39673e+006 0.0)) ("B42" (442522.0 1.39671e+006 0.0)) …….

Gõ một tên và tìm trong danh sách đó, nếu tìm được tên thì lấy ra tọa độ của phần tử đó.

Các bác xem em lỗi chỗ nào?

Cảm ơn các bác!

(defun GetName (Tenss LtsNPoint / i e Loop)
(setq i 0)
(setq Loop nil)
(setq Pnt (list))
(while (< i (length LtsNPoint))
	(setq e (nth i LtsNPoint))
	(if (= (car e)  Tenss)
	    (progn
		(setq Pnt (cadr e))
		(setq Loop T)
	    )
	    (setq Pnt nil)
	)
  	(setq i (1+ i))
)
Pnt
)

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
Doan Van Ha    2.680

Em nên viết cái list đó thành dạng mỗi item là 1 cặp assoc, VD ("B44" . (x y z)).

Khi đó em tìm rất dễ: (cdr (assoc "B44")) >> (x y z)

 

P/S: srr, vội quá nhầm, sửa lại:

lst = ( ... ("B44" . (x y z)) ... )

Thì:

(cdr (assoc "B44" lst) >> (x y z)

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
thanhduan2407    227

Em nên viết cái list đó thành dạng mỗi item là 1 cặp assoc, VD ("B44" . (x y z)).

Khi đó em tìm rất dễ: (cdr (assoc "B44")) >> (x y z)

Dạ vâng! Để em thử xem. Cảm ơn bác Hạ nhiều ạ! Lúc nào bác cũng là người đầu tiên giúp.

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
nhoclangbat    382

- hi nếu lst anh để như cũ có thể sữa lại thế này, nhoc thấy cũng đc ^^

(defun GetName (Tenss LtsNPoint / i e Loop Pnt)
(setq i 0)
(setq Loop nil)
(while (< i (length LtsNPoint))
	(setq e (nth i LtsNPoint))
	(if (= (car e)  Tenss)
	    (progn
		(setq Pnt(nth 1 e))
		(setq Loop T)
	    )
	   ; (setq Pnt nil)
	)
  	(setq i (1+ i))
)
Pnt
)

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
Tue_NV    3.841

Em nên viết cái list đó thành dạng mỗi item là 1 cặp assoc, VD ("B44" . (x y z)).

Khi đó em tìm rất dễ: (cdr (assoc "B44")) >> (x y z)

 

P/S: srr, vội quá nhầm, sửa lại:

lst = ( ... ("B44" . (x y z)) ... )

Thì:

(cdr (assoc "B44" lst) >> (x y z)

 

Làm gì có dạng list ("B44" . (x y z)) bác nhỉ?

 

Với list (LtsNPoint)   dạng: ("B44" (442758.0 1.39677e+006 0.0)) ("B43" (442622.0 1.39673e+006 0.0)) ("B42" (442522.0 1.39671e+006 0.0))

thì cũng hoàn toàn có thể dùng : (cdr (assoc "B44" LtsNPoint)) -> (442758.0 1.39677e+006 0.0)

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
thanhduan2407    227

Hic hic. Bác Tue_NV nói đúng kiểu em hỏi ạ. Em làm mãi không được. Cơ mà bác ấy sửa lại rùi, phù.

Cảm ơn nhoklangbat nhé! ANh ktra xem đã

Cảm ơn anh Tue_NV

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 Tue_NV ơi cho em nhiều chuyện chút, em làm giống như bác kết quả vẫn trả về list trong list ạ:

Làm gì có dạng list ("B44" . (x y z)) bác nhỉ?

 

Với list (LtsNPoint)   dạng: ("B44" (442758.0 1.39677e+006 0.0)) ("B43" (442622.0 1.39673e+006 0.0)) ("B42" (442522.0 1.39671e+006 0.0))

thì cũng hoàn toàn có thể dùng : (cdr (assoc "B44" LtsNPoint)) -> (442758.0 1.39677e+006 0.0)

Command: (setq lst '(("A" (1 2 3)) ("B" (4 5 6))))
(("A" (1 2 3)) ("B" (4 5 6)))

Command: (cdr (assoc "A" lst))
((1 2 3))

 

Em thấy trong cad mã dxf của đối tượng hoặc để là dạng (1  . "0") hoặc dạng ( 10 1.0 0.0 0.0). Theo em nghĩ thì list của bác thanhduan247 để dạng

("B44" 442758.0 1.39677e+006 0.0 ) ... khi dùng (cdr (assoc "B44" lst)) sẽ vẫn trả ra kết quả list toạ độ ngon lành. :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
nhoclangbat    382

-mấy anh cho nhoc hỏi cách tạo ra file .scr để có thể tự chạy các file cad trong thư mục với lsp chỉ định với, nhoc đang viết 1 lệnh từ 1 file có nhiều layout sau đó xuất các layout qua model mỗi layout thành 1 file mới, sau đó  tự mở các file vừa chuyển chạy lệnh lsp tiếp theo save rùi close = cách dùng file scrip

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
Tue_NV    3.841

-mấy anh cho nhoc hỏi cách tạo ra file .scr để có thể tự chạy các file cad trong thư mục với lsp chỉ định với, nhoc đang viết 1 lệnh từ 1 file có nhiều layout sau đó xuất các layout qua model mỗi layout thành 1 file mới, sau đó  tự mở các file vừa chuyển chạy lệnh lsp tiếp theo save rùi close = cách dùng file scrip

 

Cách tạo, ghi file scr bằng lisp tương tự như cách tạo, ghi file txt

  • 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
nhoclangbat    382

Anh Tue có thể viết code mẫu cho nhoc xem với ^^ đó giờ nhoc chưa nghiên cứu đến phần ghi ra file nên còn hơi lờ mờ, nhoc xem trên mạng thấy ghi tên file làm cách nào để lấy đc tên file khi file đc tạo ra, mình có thể gọi lun file .scr trong lsp ko anh

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
Tue_NV    3.841

Anh Tue có thể viết code mẫu cho nhoc xem với ^^ đó giờ nhoc chưa nghiên cứu đến phần ghi ra file nên còn hơi lờ mờ, nhoc xem trên mạng thấy ghi tên file làm cách nào để lấy đc tên file khi file đc tạo ra, mình có thể gọi lun file .scr trong lsp ko anh

 

1./ "Cách tạo, ghi file scr bằng lisp tương tự như cách tạo, ghi file txt"

File *.scr chỉ khác file *.txt cái đuôi "scr" thôi mà nhóc.

Nhóc đã tạo file txt được thì đương nhiên tạo file scr được

 

2./ Command: (setq fn (getfiled "Ten file: " "" "txt" 1))

"D:\\q.txt"

-> Với chuỗi  "D:\\q.txt" nhóc hoàn toàn có thể lấy được tên file tạo ra 

 

3./ "Gọi" file *.scr -> Từ "Gọi" của Nhóc là "Load" file scr lên hay là "open" file scr?.

Cả 2 : "Load" file scr lên hay là "open" file scr -> Lisp đều có thể làm được

Command: (setq fn (getfiled "Ten file: " "" "txt" 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
thanhduan2407    227

Cho em hỏi một chút ạ

Em muốn làm 1 thao tác chọn đối tượng phải là Text, chọn sai hoặc chưa chọn được thì phải chọn lại cho đến khi Enter thì kết thúc thì viết phương thức như nào ạ?

Em viết như này rồi! Mong các anh xem dùm. Em chưa tách được không chọn được đối tượng với key Enter (or space) nên chưa thực hiện dc.

(setq loop T)
(while loop
	(setq EntObj  (entsel "\nCh\U+1ECDn Text cho \U+0111\U+1EBFn khi Enter th\U+00EC k\U+1EBFt th\U+00FAc : "))
  	(while
		(or (null EntObj) (/= "TEXT"  (cdr (assoc 0 (entget (car EntObj))))))
		(setq EntObj (entsel "\n\U+0110\U+00E2y kh\U+00F4ng ph\U+1EA3i TEXT! B\U+1EA1n ch\U+1ECDn l\U+1EA1i! "))
	)
  	(cond
	  (T
		(if (or (null EntObj)(/= "TEXT"  (cdr (assoc 0 (entget (car EntObj))))))
		  (progn
		  	(setq Tendiem (list (cdr (assoc 1 (entget (car EntObj))))))
		    	(setq LtsTendiem (append LtsTendiem (list Tendiem)))
		    	
		  )
		  (setq loop nil)
		)
	  )
	)
)

Em cảm ơn các anh!

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
thanhduan2407    227

Các anh, các bác có thể cho em 1 ví dụ thao tác một cái gì đó (ví dụ Entsel đi) cho đến khi Enter thì kết thúc sử dụng hàm Grread được không ạ?

Em cảm ơn ạ

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
Doan Van Ha    2.680

Hàm mẫu chọn 1 đối tượng theo 1 kiểu nhất định. Chừng nào chọn được, hoặc Enter/Space mới kết thúc:

 

;----- Chon 1 doi tuong thoa man dieu kien. Returns:  selected entity ename if successful, else nil.
(defun LM:Selectif ( foo fun str / e )
 (while
  (progn (setq e (car (fun str)))      
   (cond ((eq 'ENAME (type e)) (if (and foo (not (foo e))) (princ "\n** Doi tuong khong hop le **"))))))
 e)
;----- Example
(defun C:TEST()
 (LM:Selectif (lambda (x) (eq "TEXT" (cdr (assoc 0 (entget x))))) nentsel "\nChon 1 Text: "))
 
  • 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
thanhduan2407    227

Dạ, hàm này chưa thỏa mãn bác Hạ ạ! 

Yêu cầu là phải chọn được đối tượng, đối tượng phải là Text và chỉ khi Enter hoặc Space mới kết thúc ạ!

Em chọn vào khoảng trống (nil) thì ......ko dc ạ

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
Doan Van Ha    2.680

Srr, cái này mới chính xác.

 

;----- Nh¾c nhë User chän cho ®Õn khi tho¶, in kÕt qu¶ ra dßng command
(defun LM:SelectIf ( msg pred func keyw / sel )
 (setq pred (eval pred))
 (while
  (progn
   (setvar 'ERRNO 0)
   (if keyw (apply 'initget keyw))
   (setq sel (func msg))
   (cond
   ((= 7 (getvar 'ERRNO)) (princ "\nMissed, Try again."))
   ((eq 'STR (type sel))  nil)
   ((vl-consp sel) (if (and pred (not (pred sel))) (princ "\nInvalid Object Selected."))))))
 sel)
;----- VÝ dô nµy nh¾c nhë cho ®Õn khi 1 Line ®­îc chän, nÕu hîp lÖ sÏ in ra dßng command
(defun c:test ( / entity )
 (setq entity (car (LM:SelectIf "\nSelect a Text: " (lambda ( x ) (eq "TEXT" (cdr (assoc 0 (entget (car x)))))) entsel nil))))
 
  • 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
thanhduan2407    227

Cho em hỏi một chút!

Em muốn tạo 1 hàm Entmake Qleader bởi 2 điểm (P1 là điểm đầu mũi tên, P2 là phía cuối), không ghi chú Text (Node) thì em sẽ phải viết như nào ạ?

Em cảm ơn các bác nhiều!

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ác bác ơi cho em hỏi chút, trong một list có thể gồm nhiều phần tử giống nhau, ví dụ ( "A" "A" 1 1 3 4 0 4). Em muốn xóa các phần tử giống nhau này đi chỉ để lại một phần tử duy nhất, có hàm nào làm được việc này không các bác. Như List ở trên sau khi xử lý sẽ thành ( "A" 1 3 4 0)

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
thanhduan2407    227

Của bạn đây!

(defun LM:_UniqueFuzz ( l fz )
    (if l
      (cons (car l)
        (LM:_UniqueFuzz
          (vl-remove-if '(lambda ( x ) (equal x (car l)  fz)) (cdr l)) fz
        )
      )
    )
)

;;;;Test (LM:_UniqueFuzz (list "A" "A" 1 1 3 4 0 4) 0.00000001)

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


×