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

Nhờ anh chị sửa giúp em cái lisp chọn đối tượng

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

Em có cái lisp chọn đối tượng là các polyline với chiều dài nhập trước. Nhưng khi nhập xong chiều dài thì chọn đối tượng các polyline đã sáng lên rồi nhưng kết thúc lệnh lại ko chọn được cái polyline này, mong anh chị em xem và sửa giúp em
CODE :
(defun c:CLL (/ length filter selection)
  (setq length (getreal "\nEnter the exact length: "))
  
  ;; Tạo điều kiện để lọc polyline
  (setq filter (list '(0 . "LWPOLYLINE") '(70 . 0)))
  
  ;; Sử dụng hàm ssget để lọc ra các polyline thỏa mãn điều kiện
  (setq selection (ssget "_:L" filter))
  
  (if selection
    (progn
      (setq i 0)
      (repeat (sslength selection)
        (setq polyline (ssname selection i))
        
        ;; Kiểm tra chiều dài chính xác của polyline
        (if (= (cdr (assoc 40 (entget polyline))) length)
          (entmod (list (cons 8 "0") polyline)) ; Chọn polyline
        )
        
        (setq i (1+ i))
      )
      (princ "\nPolyline selected.")
    )
    (princ "\nNo polylines found.")
  )
  
  (princ)
)
 

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

Em có cái lisp chọn đối tượng là các polyline với chiều dài nhập trước. Nhưng khi nhập xong chiều dài thì chọn đối tượng các polyline đã sáng lên rồi nhưng kết thúc lệnh lại ko chọn được cái polyline này, mong anh chị em xem và sửa giúp em
CODE :
(defun c:CLL (/ length filter selection)
  (setq length (getreal "\nEnter the exact length: "))
  
  ;; Tạo điều kiện để lọc polyline
  (setq filter (list '(0 . "LWPOLYLINE") '(70 . 0)))
  
  ;; Sử dụng hàm ssget để lọc ra các polyline thỏa mãn điều kiện
  (setq selection (ssget "_:L" filter))
  
  (if selection
    (progn
      (setq i 0)
      (repeat (sslength selection)
        (setq polyline (ssname selection i))
        
        ;; Kiểm tra chiều dài chính xác của polyline
        (if (= (cdr (assoc 40 (entget polyline))) length)
          (entmod (list (cons 8 "0") polyline)) ; Chọn polyline
        )
        
        (setq i (1+ i))
      )
      (princ "\nPolyline selected.")
    )
    (princ "\nNo polylines found.")
  )
  
  (princ)
)
 

Mình thấy bạn chỗ điều kiện lọc đã sai rồi, mã 40 là chiều rộng của polyline mà 

(entmod (list (cons 8 "0") polyline)) ; hàm này là hàm updata lại đối tượng mà đâu phải hàm thêm đối tượng vào tập chọn

bạn sử dùng hàm này nhé: 

(setq ss (ssadd polyline ss)

 

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

Mình thấy bạn chỗ điều kiện lọc đã sai rồi, mã 40 là chiều rộng của polyline mà 

(entmod (list (cons 8 "0") polyline)) ; hàm này là hàm updata lại đối tượng mà đâu phải hàm thêm đối tượng vào tập chọn

bạn sử dùng hàm này nhé: 

(setq ss (ssadd polyline ss)

 

hix nhờ bác code giúp em với, em cũng mới tập tành học nên chưa rõ được, em còn dùng cả GPT để hỗ trợ nma cái này mới vào nên khó quá 

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ủa bạn đây, chỗ fuzz (sai số khoảng cách) nếu muốn nhập tay bạn có thể dùng getreal như trên dòng len.

(vl-load-com)

(defun C:zz ( / ELST FUZZ LEN LEN_PL SS)
  (if
    (and
      (setq len (getreal "\nNhap chieu dai: "))
      (setq fuzz 0.01)
      (setq elst (vl-remove-if 'listp (mapcar 'cadr (if (ssget (list (cons 0 "*LINE"))) (ssnamex (ssget "_P"))))))
      )
    (progn
      (setq ss (ssadd))
      (foreach ent elst
	(setq len_pl (vlax-curve-getDistAtParam ent (vlax-curve-getEndParam ent)))
	(if (equal len len_pl fuzz) (setq ss (ssadd ent ss)))
	)
      (sssetfirst nil ss)
      )
    )
  (princ)
  )

 

  • 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, Duong Nhat Duy đã nói:

Của bạn đây, chỗ fuzz (sai số khoảng cách) nếu muốn nhập tay bạn có thể dùng getreal như trên dòng len.


(vl-load-com)

(defun C:zz ( / ELST FUZZ LEN LEN_PL SS)
  (if
    (and
      (setq len (getreal "\nNhap chieu dai: "))
      (setq fuzz 0.01)
      (setq elst (vl-remove-if 'listp (mapcar 'cadr (if (ssget (list (cons 0 "*LINE"))) (ssnamex (ssget "_P"))))))
      )
    (progn
      (setq ss (ssadd))
      (foreach ent elst
	(setq len_pl (vlax-curve-getDistAtParam ent (vlax-curve-getEndParam ent)))
	(if (equal len len_pl fuzz) (setq ss (ssadd ent ss)))
	)
      (sssetfirst nil ss)
      )
    )
  (princ)
  )

 

THANKS a 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
3 giờ trước, Duong Nhat Duy đã nói:

Của bạn đây, chỗ fuzz (sai số khoảng cách) nếu muốn nhập tay bạn có thể dùng getreal như trên dòng len.


(vl-load-com)

(defun C:zz ( / ELST FUZZ LEN LEN_PL SS)
  (if
    (and
      (setq len (getreal "\nNhap chieu dai: "))
      (setq fuzz 0.01)
      (setq elst (vl-remove-if 'listp (mapcar 'cadr (if (ssget (list (cons 0 "*LINE"))) (ssnamex (ssget "_P"))))))
      )
    (progn
      (setq ss (ssadd))
      (foreach ent elst
	(setq len_pl (vlax-curve-getDistAtParam ent (vlax-curve-getEndParam ent)))
	(if (equal len len_pl fuzz) (setq ss (ssadd ent ss)))
	)
      (sssetfirst nil ss)
      )
    )
  (princ)
  )

 

lisp trên a viết nó chọn cả line rồi, em chỉ muốn chọn đối tượng là polyline thôi a ạ, A thông cảm em mới tìm hiểu code lisp đc 1 2 hôm nên ko rõ sửa ntn. Mong a sửa lại giúp em ạ

  • Vote giảm 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
20 giờ trước, ronaldo2002 đã nói:

lisp trên a viết nó chọn cả line rồi, em chỉ muốn chọn đối tượng là polyline thôi a ạ, A thông cảm em mới tìm hiểu code lisp đc 1 2 hôm nên ko rõ sửa ntn. Mong a sửa lại giúp em ạ

Bạn sửa "*LINE" thành "POLYLINE,LWPOLYLINE"

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  

×