Chuyển đến nội dung
Diễn đàn CADViet
  • Thông báo

    • Nguyen Hoanh

      CADViet đã hoàn tất nâng cấp   14/09/2017

      Chào các bạn, CADViet đã hoàn tất việc nâng cấp lên phiên bản mới. Tất cả các chức năng đã hoạt động theo kỳ vọng của ban quản trị. Nếu có vấn đề gì cần phản hồi, các bản post ở đây nhé: Trân trọng, Nguyễn Hoành.
Đăng nhập để thực hiện theo  
united

[Yêu cầu] Lisp xóa text (hoặc line) theo thứ tự cách quãng.

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

united    1

Thứ nhất, xin cảm ơn các bác vì đã quan tâm!

Thứ hai, xin các bác viết giúp em cái lisp dùng để xóa các text (hoặc line) đã chọn theo 1 thứ tự cách quãng nhất định.

Trong đó các text thẳng hàng, còn các line thì song song thẳng đứng ạ. Thứ tự có thể từ trái sang phải hoặc ngược lại.

Ví dụ như này ạ:

 

120472_ex_1.png

 

Một lần nữa cảm ơn các bác!

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

Vậy nhập thứ tự khoảng cách như thế nào?

như trong hình text là 2,4,7, line là 2,3,5 hay sao?

Chính xác là thế ạ. Hàng có thể có nhiều text nhưng thứ tự xóa tính từ trái sang thì không đổ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
united    1

Ai hiểu được đề này thì phải gọi là thiên tài! ;)

Như cái hình em đưa lên thôi ạ. Giả sử em có 1 hàng bao gồm 7 text và em muốn 1 cái lisp như thế này ạ:

Gõ lệnh >>> Chọn hàng text >>> Space và nó xóa các text thứ 2, 4, 7 (tính từ trái sang)

Như thế thôi ạ.

PS: có lẽ là tại em đưa cái thứ tự của Text với Line khác nhau nên bác khó hiể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
Tot77    501

Bạn thử lsp này. Khi nó hỏi cách thì nếu muốn giữ 1 xoá 1 thì gõ 1, nếu muốn giữ 1 xoá 2 thì gõ 2.

 

(defun c:tes()
(command "undo" "be")
(prompt "\nChon text, line can xoa:")
(setq ss (vl-remove-if 'listp (mapcar 'cadr (ssnamex (ssget '((0 . "*TEXT,*LINE"))))))
ss (vl-sort ss '(lambda (x y) (< (car (cdr (assoc 10 (entget x)))) (car (cdr (assoc 10 (entget y)))))))
ck (1+ (getint "\nCach:"))
n -1)
(while (< (setq n (1+ n)) (length ss))
(and (/= 0 (rem n ck)) (entdel (nth n ss))))
(command "undo" "e") (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
united    1

Khó hiểu ở chỗ bạn nhập dãy 2,4,7 ở chỗ nào. Nếu là xoá 2,4,6,8 hoặc 2,3,5,6 thì dễ hiểu hơn

Khổ một nỗi dãy text em thường phải xóa nó lại không có quy luật đẹp như thế. Nhưng đa số có thứ tự 3, 4, 10,11.

  • 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
Doan Van Ha    2.676

Khổ một nỗi dãy text em thường phải xóa nó lại không có quy luật đẹp như thế. Nhưng đa số có thứ tự 3, 4, 10,11.

Đó là đa số. Còn thiểu số thì thứ tự như thế nào?

Nếu được bình chọn "câu hỏi trời ơi nhất trên CadViet" thì tôi sẽ vote ngay cho bạn!

Bạn đặt vấn đề như thế thì tôi tin rằng sẽ hỏi đi hỏi lại không dưới mười lần, trong khi xem ra vấn đề không khó.

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

Đó là đa số. Còn thiểu số thì thứ tự như thế nào?

Nếu được bình chọn "câu hỏi trời ơi nhất trên CadViet" thì tôi sẽ vote ngay cho bạn!

Bạn đặt vấn đề như thế thì tôi tin rằng sẽ hỏi đi hỏi lại không dưới mười lần, trong khi xem ra vấn đề không khó.

Thực sự xin lỗi vì làm bác đau đầu. Cũng vì em không hiểu về lisp nên không tìm ra cách diễn đạt dễ hiểu.

Em nghĩ đơn giản là chỉ cần gán các đối tượng theo STT từ 1 đến n, sau đó chọn bất kỳ số mình muốn rồi xóa đi nên mới yêu cầu như thế.

Còn về vấn đề "đa số", là em muốn các bác xử lý trường hợp đó thôi ạ, còn lại "thiểu số" em sẽ xử lý thủ công.

 

Và nếu không xóa theo thứ tự "3, 4, 10, 11" được thì xóa theo "3, 4" cũng được ạ.

Cảm ơn các bác 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
Doan Van Ha    2.676

Chắc là bạn muốn xóa các Text hoặc Line theo các số thứ tự nhập vào tính từ bên trái, ví dụ "1,3,4,6". Nếu đúng vậy thì thử xem:

 

(defun C:XOA(/ lst1 lst2)
 (command "undo" "be")
 (prompt "\nChon cac Text hoac Line can xoa...")
 (setq lst1 (vl-remove-if 'listp (mapcar 'cadr (ssnamex (ssget '((0 . "*TEXT,*LINE"))))))
       lst1 (vl-sort lst1 '(lambda(x y) (< (cadr (assoc 10 (entget x))) (cadr (assoc 10 (entget y))))))
       lst2 (#String->ListString (getstring "\nNhap cac so thu tu can xoa [VD: 1,3,5]: ") ","))
 (foreach n lst2
  (entdel (nth (1- (atoi n)) lst1))) 
 (command "undo" "e")
 (princ))
(defun #String->ListString(str del / pos lst)
 (while (setq pos (vl-string-search del str))
  (setq lst (cons (substr str 1 pos) lst)
        str (substr str (+ pos 1 (strlen del)))))
 (reverse (cons str lst)))
 
  • 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
united    1

 

Chắc là bạn muốn xóa các Text hoặc Line theo các số thứ tự nhập vào tính từ bên trái, ví dụ "1,3,4,6". Nếu đúng vậy thì thử xem:

Dạ ý em là thế ạ. Nhưng phiền bác thêm 1 chút nữa là bác thêm luôn list thứ tự cần xóa vào trong lisp giúp em ạ. Tức là chỉ cần gõ lệnh >>> chọn đối đối tượng >>> Space là xong ạ. Em sẽ tạo nhiều lisp với list cần xóa khác nhau.

Cảm ơn 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
Doan Van Ha    2.676

Nãy post nhầm tí. Sửa lại:

 

(defun C:XOA(/ lst1 lst2)
 (command "undo" "be")
 (prompt "\nChon cac Text hoac Line can xoa...")
 (setq lst1 (vl-remove-if 'listp (mapcar 'cadr (ssnamex (ssget '((0 . "*TEXT,*LINE"))))))
       lst1 (vl-sort lst1 '(lambda(x y) (< (cadr (assoc 10 (entget x))) (cadr (assoc 10 (entget y)))))))
 (foreach n '(2 4 5 7) ; List cac STT can xoa la (2 4 5 7), ban edit tai day nhe!
  (entdel (nth (1- n) lst1))) 
 (command "undo" "e")
 (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
united    1

Có cái nút thanks màu xanh ở đây nè bạn, nhấn vô dưới bài viết của bác Doan Van Ha ấy. :D

133631_capture_1.jpg

Dạ em biết nhưng lại thế này ạ:

"You have reached your quota of positive votes for the day"

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ạn thử lsp này. Khi nó hỏi cách thì nếu muốn giữ 1 xoá 1 thì gõ 1, nếu muốn giữ 1 xoá 2 thì gõ 2.

 

(defun c:tes()
(command "undo" "be")
(prompt "\nChon text, line can xoa:")
(setq ss (vl-remove-if 'listp (mapcar 'cadr (ssnamex (ssget '((0 . "*TEXT,*LINE"))))))
ss (vl-sort ss '(lambda (x y) (< (car (cdr (assoc 10 (entget x)))) (car (cdr (assoc 10 (entget y)))))))
ck (1+ (getint "\nCach:"))
n -1)
(while (< (setq n (1+ n)) (length ss))
(and (/= 0 (rem n ck)) (entdel (nth n ss))))
(command "undo" "e") (princ)
)

làm thế nào để đăng lisp lên như bác đc vậ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

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  

×