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ị

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

Em muốn hỏi chút về hàm Bpoly trong autolisp ạ.

Thường em hay dùng command "_.BOUNDARY" , nhưng sử dụng command khá nhiều hạn chế.

trong lisp có hàm bpoly cách dùng thì (bpoly pt)

nay em ngồi ngâm cứu thì phát hiện có thể đưa các thông số khác để dùng.

ngồi test nãy h thì phát hiện có thể dùng (bpoly pt selectset list ...)

chưa hiểu list này chứa cái gì nhưng nếu là 1 điểm nào đó (kể cả '(0 0 0) )  thì có tạo ra đường bo nhưng thông báo: Invalid option keyword.

bác nào biết cái này chỉ giáo em dùng vớ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

Em nghĩ nó cùng (bpoly) và command boundary cùng truy cập đến 1 thằng nào đó trong hệ thống. Nhưng command là gián tiếp còn lisp khi thêm biến thì trực tiếp (không thấy các msg trả về). 

Bác thử câu lệnh này của em: (bpoly (getpoint) (ssget) '(0 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

Lần đầu tiên biết hàm bpoly. Cái lạ là nó vừa hàm vừa lệnh luôn (lệnh thì dùng như boundary). Còn ra thì chưa hiểu lắm nên hóng.

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
27 phút trước, Doan Van Ha đã nói:

Lần đầu tiên biết hàm bpoly. Cái lạ là nó vừa hàm vừa lệnh luôn (lệnh thì dùng như boundary). Còn ra thì chưa hiểu lắm nên hóng.

em thấy nó không phải command đâu ạ vì nếu là command thì thay (bpoly) vào sẽ chạy.

(defun c:test (/ pt lst )
  (while (setq pt (getpoint))
    (setq lst (cons pt lst))
  )
  (command "boundary")  ;;;;;<<<<<<< (bpoly)
  (apply 'command lst)
  (command "")
)

 

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

(bpoly _point [_selectionset] [ _vector])

Hàm chỉ trả về entity với tham số là pickpoint . (setq ent (bpoly (getpoint)))

Các tham số khác như selectionset, vector không có hiệu ứng gì. 

Kỳ lạ là nó không được xếp vào các hàm chính thức trong help B Functions Reference (AutoLISP) chỉ có boole và boundp.

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

em thấy nó không phải command đâu ạ vì nếu là command thì thay (bpoly) vào sẽ chạy.

Này OK:

(command "bpoly" (getpoint) "")

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

_point : điểm pick

_selectionset : giới hạn các entities lúc lệnh detect boundary

_vector : chưa rõ

 

(defun c:test1 ( / ss vec poly1)
(setq ss (ssget) vec (list 0 1))
(setq poly1 (bpoly (getpoint) ss vec ))
 (if poly1  (command "move" poly1 "" (getpoint) pause) (alert "No entity"))
)

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, cuongtk2 đã nói:

_point : điểm pick

_selectionset : giới hạn các entities lúc lệnh detect boundary

_vector : chưa rõ

 

(defun c:test1 ()
(setq ss (ssget) vec (list 0 1))
(setq poly1 (bpoly (getpoint) ss vec ))
  (command "move" poly1 "" (getpoint) pause)
)

em đang cho rằng vector này để tracking. em thử để '(0 0 1) thì không bo được. (vector vuông góc mặt phẳng chiế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

Vector đó (0 0 1) không việc gì vì nó là đại diện cho mặt phẳng thường dùng (mặt phẳng XY) 

(defun c:test1 ( / ss vec poly1)
(setq ss (ssget) vec (list 0 0 1))
(setq poly1 (bpoly (getpoint) ss vec ))
 (if poly1  (command "move" poly1 "" (getpoint) pause) (alert "No entity create"))
)

image.thumb.png.560d660149bbe1326b09a41ca1c9c69e.png

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 tìm tài liệu đỉnh thật em còn cái hàm BHATCH nữa. các bác xem giúp tài liệu nó ở chỗ nào với ạ.

em thử dùng (bhatch (getpoint)) thì xuất hiện lỗi. có lẽ thiếu biến số nhập vào.

image.png.baf8106c0bade1fac4ad29632d72d3ae.png

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

×