Chuyển đến nội dung
Diễn đàn CADViet
Jin Yong

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

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

13 phút trước, cuongtk2 đã nói:

Có vẻ như bạn định sort objects có cùng attribute Tag theo attribute Value.  

Vâng đúng rồi, mấy nay hơi vơi việc cải tiến cái lisp thống kê thép 1 chút, các bước rây ria xong rồi nhưng còn cái đoạn thực sắp xếp thứ tự theo số thứ tự chưa làm được ko ưng cái bụng cho lắm.

Cụ thể là mình có nhiều block att của các hình dạng thép trong đó tất cả các block điều có 1 tag là "TT" thể hiện số thứ tự, giờ mình muốn sắp sếp tập chọn này theo thứ tự TT tăng dần sau đó chạy tiếp đoạn lisp hiện có cho nó ra đúng thứ tự từ nhỏ tới lớn. Mình ngó tới entmod, entsel, vl , mapcar, lamb... các thứ là bị đau đầu nên ko cách nào đọc hiểu các hàm sắp xế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

Đây nhé: 

(setq ss (mapcar 'vlax-ename->vla-object (ACET-SS-TO-LIST (ssget))))
(setq ss (VL-SORT  (lambda (o1 o2) (< (LM:vl-getattributevalue (o1 "TT" )
                                        (LM:vl-getattributevalue (o2 "TT" ))
                                        ) ss)))

  • 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 phút trước, cuongtk2 đã nói:

Đây nhé: 

(setq ss (mapcar 'vlax-ename->vla-object (ACET-SS-TO-LIST (ssget))))
(setq ss (VL-SORT  (lambda (o1 o2) (< (LM:vl-getattributevalue (o1 "TT" )
                                        (LM:vl-getattributevalue (o2 "TT" ))
                                        ) ss)))

Cho xin luôn cái LM:vl-getattributevalue với bác!

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ình ghét lisp vì dùng hàm của nó không biết thứ tự, kiểu và số lượng tham số. Không có help thì = đánh đố, hàm màu xanh đàng hoàng.

  • 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

Lý Mặc 

;; Get Attribute Value  -  Lee Mac
;; Returns the value held by the specified tag within the supplied block, if present.
;; blk - [vla] VLA Block Reference Object
;; tag - [str] Attribute TagString
;; Returns: [str] Attribute value, else nil if tag is not found.

(defun LM:vl-getattributevalue ( blk tag )
    (setq tag (strcase tag))
    (vl-some '(lambda ( att ) (if (= tag (strcase (vla-get-tagstring att))) (vla-get-textstring att)))
        (vlax-invoke blk 'getattributes)
    )
)

  • 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
4 phút trước, cuongtk2 đã nói:

Đây nhé: 

(setq ss (mapcar 'vlax-ename->vla-object (ACET-SS-TO-LIST (ssget))))
(setq ss (VL-SORT  (lambda (o1 o2) (< (LM:vl-getattributevalue (o1 "TT" )
                                        (LM:vl-getattributevalue (o2 "TT" ))
                                        ) ss)))

Ngoài thiếu hàm LM thì cú pháp cũng nhầm chú cuongtk2 ơ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

Mình đã soạn lại cho nó đàng hoàng hơn. Rất xin lỗi vì mình cứ nghĩ nó chỉ là dạng thuật toán, dùng hàm giả lập.

Nếu att value của Duy chỉ có mỗi số thì có thể dùng atof tại doichuthanhso.

(setq ss (mapcar 'vlax-ename->vla-object (ACET-SS-TO-LIST (ssget))))
(setq ss (VL-SORT  ss (lambda (o1 o2)
                        (<
                        (doichuthanhso (LM:vl-getattributevalue o1 "SH" ))
                         (doichuthanhso (LM:vl-getattributevalue o2 "SH" ))
                        )
                     )
                     )
                   )
     (setq dautien (LM:VL-GETATTRIBUTEVALUE (car ss) "SH"))
      

  • 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
3 giờ trước, duy782006 đã nói:

Hỏi nửa thì ngại nhưng bí nên lại hỏi. Mình muốn tập hợp là object tạo ra từ ssget, và xếp theo giá trị tag từ nhỏ đến lớn luôn với nhồi từ trưa giờ mà không được! Cảm ơn nhiều.

 

Thì bạn dùng hàm của mình

(setq ss (acet-ss-to-list (ssget)))

(setq lst (mapcar 'vlax-ename->vla-object ss))

(setq lst (xepatt lst "TENTAG" '<))

chỉ việc dùng thôi 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
6 phút trước, tannguyen291 đã nói:

Thì bạn dùng hàm của mình

Khổ cho đồng chí Duy là Autolisp thì nhuyễn mà đụng đến Visualisp thì phải uống Aspirin.

  • 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 Hạ nói đúng, VisualLisp nó sinh để có thể giao tiếp với phần mềm khác. Cảm giác nó nửa OPPs nửa không?

Rất khó hiểu được đối tượng vla nếu mình không có kiến thức sâu về tin học.  

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

Cho mình hỏi. Mình có giá trị sin của một góc giờ làm sao đổi ra giá trị của góc đó ạ? Mình thử hàm ngược là arcsin thì lisp không biết hàm này.

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

;----- ArcSine - Lee Mac, Args: -1 <= x <= 1
(defun asin (x) (cond ((< 1.0 (abs x)) nil) ((equal (abs x) 1.0 1e-8) (* x pi 0.5)) (T (atan x (sqrt (- 1.0 (* x x)))))))
 

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

×