Đến nội dung


Hình ảnh
- - - - -

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


  • Please log in to reply
17 replies to this topic

#1 united

united

    biết vẽ arc

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

Đã gửi 14 January 2015 - 04:48 PM

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!


  • -1

#2 Doan Van Ha

Doan Van Ha

    biết lệnh adcenter

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

Đã gửi 14 January 2015 - 05:14 PM

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


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


#3 Tot77

Tot77

    biết lệnh adcenter

  • Members
  • PipPipPipPipPipPipPip
  • 990 Bài viết
Điểm đánh giá: 498 (tốt)

Đã gửi 14 January 2015 - 06:21 PM

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

#4 united

united

    biết vẽ arc

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

Đã gửi 14 January 2015 - 06:30 PM

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.


  • 0

#5 united

united

    biết vẽ arc

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

Đã gửi 14 January 2015 - 06:37 PM

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.


  • 0

#6 Tot77

Tot77

    biết lệnh adcenter

  • Members
  • PipPipPipPipPipPipPip
  • 990 Bài viết
Điểm đánh giá: 498 (tốt)

Đã gửi 14 January 2015 - 07:40 PM

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

#7 Tot77

Tot77

    biết lệnh adcenter

  • Members
  • PipPipPipPipPipPipPip
  • 990 Bài viết
Điểm đánh giá: 498 (tốt)

Đã gửi 14 January 2015 - 08:10 PM

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

  • 1

#8 united

united

    biết vẽ arc

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

Đã gửi 14 January 2015 - 08:17 PM

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.


  • -1

#9 Doan Van Ha

Doan Van Ha

    biết lệnh adcenter

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

Đã gửi 14 January 2015 - 09:12 PM

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


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


#10 united

united

    biết vẽ arc

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

Đã gửi 14 January 2015 - 10:36 PM

Đó 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!


  • 0

#11 Doan Van Ha

Doan Van Ha

    biết lệnh adcenter

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

Đã gửi 15 January 2015 - 07:11 AM

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

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


#12 united

united

    biết vẽ arc

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

Đã gửi 15 January 2015 - 09:25 AM

 

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!


  • 0

#13 Doan Van Ha

Doan Van Ha

    biết lệnh adcenter

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

Đã gửi 15 January 2015 - 09:41 AM

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

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


#14 united

united

    biết vẽ arc

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

Đã gửi 15 January 2015 - 10:35 AM

Hoàn hảo ạ. Chân thành cảm ơn sự giúp đỡ của bác!


  • 0

#15 trinhhoanghieu090

trinhhoanghieu090

    Edu level: li8

  • Members
  • PipPipPipPipPip
  • 309 Bài viết
Điểm đánh giá: 29 (tàm tạm)

Đã gửi 15 January 2015 - 10:43 AM

Hoàn hảo ạ. Chân thành cảm ơn sự giúp đỡ của bác!

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


  • 0

#16 united

united

    biết vẽ arc

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

Đã gửi 15 January 2015 - 10:56 AM

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"


  • 0

#17 phanthanh536

phanthanh536

    biết vẽ circle

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

Đã gửi 21 January 2015 - 05:41 PM

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?


  • 0

#18 Tot77

Tot77

    biết lệnh adcenter

  • Members
  • PipPipPipPipPipPipPip
  • 990 Bài viết
Điểm đánh giá: 498 (tốt)

Đã gửi 21 January 2015 - 05:57 PM

Bạn nhap vao bieu tuong "<>" tren thanh cong cu edit, va cho code vao do.



  • 1