Chuyển đến nội dung
Diễn đàn CADViet
Đăng nhập để thực hiện theo  
amateurday

[Yêu cầu] code tạo danh sách

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

- Trước tiên nhờ mod giải thích cho em về việc hủy bài này nhé.

- Về yêu cầu, em đang cần là code để thực hiện việc tạo list này, hiện giờ thì em đang dùng với block, mai em dùng đến text chẳng lẽ lại nhờ bác, thế thì em bị nói ngay.

Về vấn đề code: code này không phải sắp xếp toàn bộ block trong list (gọi là listfinal đi), mà là sắp xếp từng nhóm được chọn bởi ssget (list1, list 2, list….n), nhóm nào chọn trước thì sort và nhét vào listfinal trước, lần lượt cho đến list…n.

- Không biết em diễn tả vậy có dễ hiểu không thưa các bác?

 

PS:

- Xin lỗi bác Ha là em không dùng tiêu đề của bác do không đúng với ý em. Nếu tiêu đề này bị bỏ vào thùng rác thì em theo ý bác.

- Cảm ơn và nhờ các bác tiế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

À, nghe có vẻ giống Project sắp xếp các nhóm đối tượng trước đây mình làm. Hình như bạn biết lisp rồi, nên mình hướng dẫn nhé :

Đầu tiên là hàm sort từng ssget 1, nó sẽ có dạng :

(defun sortss (ss thuoc_tinh_sort)
(vl-sort (mapcar 'vlax-ename->vla-object (acet-ss-to-list ss))
 '(lambda(a B)
  (< (car (vlax-get a 'thuoc_tinh_sort))
(car (vlax-get b 'thuoc_tinh_sort ))
  )
 )
)
)

Ở đây là ví dụ xếp theo x tăng dần, còn xếp sao nữa thì bạn search hàm sắp xếp trên 4room

Tiếp theo là đoạn lấy list all :

(while (setq ss (ssget))
(setq lstFinal (cons (sortss ss thuoc_tinh) lstFinal))
)

Nếu các đối tượng là Block thì thuộc tính lấy là InsertionPoint

LstFinal là cái bạn cần

  • 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

Nếu không hiểu cái tổng quát của anh Ketxu thì dùng cái lẻ tẻ này xem. Chú ý kiểu đối tượng chọn để thay đổi phù hợp (vì tôi viết cho block).

;Doan Van Ha - CADViet.com - Ngay 29/5/2012
;Muc dich: Sap xep cac block theo thu tu nhom duoc chon. Trong moi nhom sap xep theo toa do diem chen: tu trai qua phai (X) va tu tren xuong duoi (Y).
(defun C:HA( / ss lst1)
(setq lst '())
(princ "\nChon tung nhom Blocks...")
(while (setq ss (ssget '((0 . "INSERT"))))
 (setq lst1 (vl-remove-if 'listp (mapcar 'cadr (ssnamex ss))))
 (setq lst1 (vl-sort lst1 '(lambda (e1 e2)
	(if (equal (car (cdr (assoc 10 (entget e1)))) (car (cdr (assoc 10 (entget e2)))) 1E-8)
 	(> (cadr (cdr (assoc 10 (entget e1)))) (cadr (cdr (assoc 10 (entget e2)))))
 	(< (car (cdr (assoc 10 (entget e1)))) (car (cdr (assoc 10 (entget e2)))))))))
 (princ "\nChon nhom Blocks tiep theo...")
 (setq lst (cons lst1 lst)))
(setq lst (reverse lst)))

  • 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

Cảm ơn 2 bác, em chỉnh lại 1 chút của bác Ha để sort trái phải, trên xuống vì của bác là trên xuống trái phải, rất vừa ý em!!!!!!!!!!!

;; free lisp from cadviet.com
;;; this lisp was downloaded from http://www.cadviet.com/forum/index.php?showtopic=64331
;Doan Van Ha - CADViet.com - Ngay 29/5/2012
;Muc dich: Sap xep cac block theo thu tu nhom duoc chon. Trong moi nhom sap xep theo toa do diem chen: tu trai qua phai (X) va tu tren xuong duoi (Y).
(defun C:HA( / ss lst1)
(setq lst '())
(princ "\nChon tung nhom Blocks...")
(while (setq ss (ssget '((0 . "INSERT"))))
 (setq lst1 (vl-remove-if 'listp (mapcar 'cadr (ssnamex ss))))
 (setq lst1 (vl-sort lst1 '(lambda (e1 e2)
 (if (equal (caddr (assoc 10 (entget e1))) (caddr (assoc 10 (entget e2))) 1E-8)
  (< (cadr (assoc 10 (entget e1))) (cadr (assoc 10 (entget e2))))
  (> (caddr (assoc 10 (entget e1))) (caddr (assoc 10 (entget e2))))))))
 (princ "\nChon nhom Blocks tiep theo...")
 (setq lst (cons lst1 lst)))
(setq lst (reverse lst)))

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

Lúc đầu không có code của bác Ha, em không chỉnh được code của bác xu. Giờ em xin phép sửa code bác ketxu tí, ai muốn dùng thì dùng nhé, vì sort theo kiểu hàm cond này nhìn gọn hơn if:

Hàm sort insertpoint theo trái phải, trên xuống.

(defun sortss (ss)
(vl-load-com)
;(setq ss (ssget))
(setq lst (vl-sort (mapcar 'vlax-ename->vla-object (acet-ss-to-list ss))
 '(lambda(a B)
(cond
((/= (cadr (vlax-get a 'insertionpoint)) (cadr (vlax-get b 'insertionpoint))) (> (cadr (vlax-get a 'insertionpoint)) (cadr (vlax-get b 'insertionpoint))))
(= (cadr (vlax-get a 'insertionpoint)) (cadr (vlax-get b 'insertionpoint))) (< (car (vlax-get a 'insertionpoint)) (car (vlax-get b 'insertionpoint)))
)
)
)
)
);sort ss theo diem chen trai sang phai, tren xuong duoi

Tạo danh sách list theo yêu cầu

(defun c:tlss()
(setq lstFinal '())
(while (setq ss (ssget))
(setq lstFinal (cons (sortss ss) lstFinal))
)
(setq lstFinal (reverse lstFinal))
)

Em có 2 thắc mắc thế này:

- Nếu để (defun sortss (/ ss) thì lệnh tlss bị lỗi, lý do tại sao vậy.???

- Trường hợp "(defun sortss (ss)" và "(defun c:tlss(/ ss)" thì biến ss không bị mất sau khi kết thúc lệnh, gõ !ss vẫn tồn tại là sao nhỉ???

 

 

P/S:

- Nhờ các bác xem qua code trên, nếu thừa gì thì bỏ, thiếu thì bổ sung cho em, vì đôi khi lisp chạy ra kết quả nhưng thừa 1 số thao tác không cần thiết do người viết không hiểu kỹ, vd trường hợp này có cần phải thêm hàm (cond t) nữa không,......???

Chỉnh sửa theo amateurday

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

Em có 2 thắc mắc thế này:

- Nếu để (defun sortss (/ ss) thì lệnh tlss bị lỗi, lý do tại sao vậy.???

- Trường hợp "(defun sortss (ss)" và "(defun c:tlss(/ ss)" thì biến ss không bị mất sau khi kết thúc lệnh, gõ !ss vẫn tồn tại là sao nhỉ???

P/S:

- Nhờ các bác xem qua code trên, nếu thừa gì thì bỏ, thiếu thì bổ sung cho em, vì đôi khi lisp chạy ra kết quả nhưng thừa 1 số thao tác không cần thiết do người viết không hiểu kỹ, vd trường hợp này có cần phải thêm hàm (cond t) nữa không,......???

Đỏ: bạn đặt biến ss là cục bộ nên khi bắt đầu vào sử dụng hàm sortss thì ss đã bị NIL mất rồi => list trả về NIL. Còn bị lỗi là do bạn định nghĩa hàm không biến (sortss) nhưng khi sử dụng lại là hàm có biến (sortss ss) => lỗi thừa biến.

Xem ví dụ dưới đây sẽ thấy khi "đụng đến" lệnh HA là a bị nil ngay, cho dù bạn có (setq a T) vào command:

(defun C:HA( / a)
(if a (alert "T") (alert "NIL"))
(setq a T))

Xanh: rất nhiều người nhầm lẫn điều này! Bạn đã đặt đúng, và biến ss sẽ bị khử (ss = nil). Tuy nhiên, cái ss này nó tồn tại ở những lần gọi trước khi bạn sửa lại hàm, chứ không phải ss sau khi dùng hàm đã sửa. Để thấy điều đó bạn paste (setq ss nil) vào command, sau đó sử dụng lại lisp thì chắc chắn ss sẽ nil. Trên 4rum có 1 bài nói về biến toàn cục và cục bộ (của bác Hoành hay SSG tôi không nhớ) rất hay đấy.

Thử (setq a T) rồi dùng lệnh HA thì thấy a nó cứ NIL, nhưng !a=T ngay.

Khác: bạn xem help sử dụng hàm cond nhé!

  • 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

Em không hiểu:

- (/ ss) nghĩa là sau khi thực hiện lệnh thì trả biến về nil, chứ trước khi vào lệnh nó cũng trả về nil sao?

- Về biến thì (defun sortss (/ ss) hay (defun sortss (ss) thì nó cũng là hàm có biến cả chứ bác.

- Về khử biến, nếu theo bác nói thì khi đó, lisp tạo ra 2 biến có nội dung giống nhau à, vấn đề này hơi vô lý, lisp sẽ chọn biến nào để chạy, 2 biến giống nhau thì lisp lưu kiểu gì.

Bác trả lời giúp em nhé!!!
  • 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

1). Bạn đã test ví dụ tôi đưa ra chưa? Cho dù bạn có (setq a T) vào command đi nữa thì khi gọi lệnh HA là a sẽ lập tức nil ngay!

2). Bạn đã tìm đọc bài viết tôi giới thiệu chưa?

3). Biến cục bộ và toàn cục khác nhau 1 trời 1 vực.

Hàm (defun HA( / a b c) là hàm không biến ; hàm (defun HA (a / b c d e) là hàm 1 biến. Số biến là xét biến toàn cục.

Khó hiểu, nhưng không vô lý. Bởi vậy tôi mới nói rất nhiều người mới học lisp dễ bị nhầm.

  • 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

Em hiểu rồi, em cũng đọc rồi. Vậy code này sao lại bị lỗi vậy bác:

(defun C:HA(a)
(setq a(getstring))
(if a(alert "T") (alert "NIL"))
(setq aT))

Tại sao không khai báo biến toàn cục đượ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

Em hiểu rồi, em cũng đọc rồi. Vậy code này sao lại bị lỗi vậy bác:

(defun C:HA(a)
(setq a(getstring))
(if a(alert "T") (alert "NIL"))
(setq aT))

Tại sao không khai báo biến toàn cục được nhỉ???

he, he ...

đúng là a-ma-tơ !

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

Code mình đáng lẽ ngắn mà bạn viết lại nó lại dài quá :) Bạn hãy đưa toàn bộ phần thuộc tính ra ngoài hàm như khi mình viết để có thể tái sử dụng với các đối tượng khác. (như StartPoint với Line, AlignmentPoint với Mtext....)

 

- Những phần bạn thắc mắc phía sau do bạn chưa nắm rõ thế nào là 1 hàm, thế nào là 1 thủ tục.

- Trong lisp, những gì bạn không khai báo mặc định là biến toàn cục.

- Bạn đã khai báo ở dòng đầu thì a lại trở thành đối số của 1 HÀM, không phải là 1 biến

  • 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

Bác có thể nói rõ cho em biết hoặc tài liệu nào đề cập đến:

- Thế nào là 1 hàm, thế nào là 1 thủ tục?

- Đối số khác biến thế nào?

Em có xem Autolisp tutorial nhưng không thấy nói, có thể là không hiểu nên không tìm ra.

 

PS: ngay từ đầu xác định vào đây, mình là amateur rồi, bạn nào giúp mình thì giúp chứ đừng xì pam 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

Bác có thể nói rõ cho em biết hoặc tài liệu nào đề cập đến:

- Thế nào là 1 hàm, thế nào là 1 thủ tục?

- Đối số khác biến thế nào?

Em có xem Autolisp tutorial nhưng không thấy nói, có thể là không hiểu nên không tìm ra.

 

he, he ...

đúng là a-ma-tơ !

PS: ngay từ đầu xác định vào đây, mình là amateur rồi, bạn nào giúp mình thì giúp chứ đừng xì pam 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

Bác có thể nói rõ cho em biết hoặc tài liệu nào đề cập đến:

- Thế nào là 1 hàm, thế nào là 1 thủ tục?

- Đối số khác biến thế nào?

Em có xem Autolisp tutorial nhưng không thấy nói, có thể là không hiểu nên không tìm ra.

 

PS: ngay từ đầu xác định vào đây, mình là amateur rồi, bạn nào giúp mình thì giúp chứ đừng xì pam nhé!!!

 

Nôm na là : Thủ tục là nó làm 1 việc nào đó, k cần kết quả trả về. Giống như 1 hàm dạng C:

Hàm thì bao giờ cũng cần kết quả trả về

Biến là đại diện cho 1 biến số có giá trị thay đổi trong quá trình chạy hàm, thủ tục

Đối số là thông số mà hàm yêu cầu

Ví dụ khai báo hàm (defun sort (ss thuoc_tinh / a) thì ss và thuộc tính là 2 đối số yêu cầu của hàm, khi bạn gọi hàm này ở 1 nơi khác kiểu gì nó cũng phải có dạng (sort ss thuoc_tinh)

- a là biến số cục bộ (tạm) của hàm, chỉ dùng tính toán trong thân hàm sort, sau đó nó mất đi

  • 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

Đăng nhập để thực hiện theo  

×