Đến nội dung


Hình ảnh
- - - - -

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


  • Please log in to reply
13 replies to this topic

#1 amateurday

amateurday

    biết lệnh break

  • Members
  • PipPipPipPip
  • 228 Bài viết
Điểm đánh giá: 4 (bình thường)

Đã gửi 29 May 2012 - 10:17 AM

- 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!!!
  • 0

#2 ketxu

ketxu

    Copier - Paster - Editor

  • Moderator
  • PipPipPipPipPipPipPip
  • 5682 Bài viết
Điểm đánh giá: 2605 (tuyệt vời)

Đã gửi 29 May 2012 - 10:40 AM

À, 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
  • 1

Thành viên nhóm CadMagic.
Mời bạn ghé thăm facebook nhóm - Page viết lisp theo yêu cầu  :
CAD MAGIC


#3 Doan Van Ha

Doan Van Ha

    biết lệnh adcenter

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

Đã gửi 29 May 2012 - 10:58 AM

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

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


#4 amateurday

amateurday

    biết lệnh break

  • Members
  • PipPipPipPip
  • 228 Bài viết
Điểm đánh giá: 4 (bình thường)

Đã gửi 29 May 2012 - 11:38 AM

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


  • 0

#5 amateurday

amateurday

    biết lệnh break

  • Members
  • PipPipPipPip
  • 228 Bài viết
Điểm đánh giá: 4 (bình thường)

Đã gửi 29 May 2012 - 01:28 PM

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,......???

Bài viết đã được chỉnh sửa nội dung bởi amateurday: 29 May 2012 - 03:08 PM

  • 0

#6 Doan Van Ha

Doan Van Ha

    biết lệnh adcenter

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

Đã gửi 29 May 2012 - 03:03 PM

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é!
  • 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.


#7 amateurday

amateurday

    biết lệnh break

  • Members
  • PipPipPipPip
  • 228 Bài viết
Điểm đánh giá: 4 (bình thường)

Đã gửi 29 May 2012 - 05:02 PM

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é!!!


  • 1

#8 Doan Van Ha

Doan Van Ha

    biết lệnh adcenter

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

Đã gửi 29 May 2012 - 05:08 PM

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


#9 amateurday

amateurday

    biết lệnh break

  • Members
  • PipPipPipPip
  • 228 Bài viết
Điểm đánh giá: 4 (bình thường)

Đã gửi 29 May 2012 - 09:02 PM

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ỉ???
  • 0

#10 HoaVien

HoaVien

    biết vẽ arc

  • Members
  • PipPip
  • 44 Bài viết
Điểm đánh giá: 12 (tàm tạm)

Đã gửi 29 May 2012 - 09:33 PM

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ơ !
  • 0

#11 ketxu

ketxu

    Copier - Paster - Editor

  • Moderator
  • PipPipPipPipPipPipPip
  • 5682 Bài viết
Điểm đánh giá: 2605 (tuyệt vời)

Đã gửi 29 May 2012 - 09:54 PM

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

Thành viên nhóm CadMagic.
Mời bạn ghé thăm facebook nhóm - Page viết lisp theo yêu cầu  :
CAD MAGIC


#12 amateurday

amateurday

    biết lệnh break

  • Members
  • PipPipPipPip
  • 228 Bài viết
Điểm đánh giá: 4 (bình thường)

Đã gửi 31 May 2012 - 07:52 AM

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é!!!
  • 0

#13 amateurday

amateurday

    biết lệnh break

  • Members
  • PipPipPipPip
  • 228 Bài viết
Điểm đánh giá: 4 (bình thường)

Đã gửi 31 May 2012 - 07:54 AM

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é!!!
  • 0

#14 ketxu

ketxu

    Copier - Paster - Editor

  • Moderator
  • PipPipPipPipPipPipPip
  • 5682 Bài viết
Điểm đánh giá: 2605 (tuyệt vời)

Đã gửi 31 May 2012 - 08:17 AM

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

Thành viên nhóm CadMagic.
Mời bạn ghé thăm facebook nhóm - Page viết lisp theo yêu cầu  :
CAD MAGIC