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

[Đã xong] Lisp xóa text nằm ngoài khoảng giá trị !

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

Em muốn có Lisp xóa các text nằm ngoài khoảng ( a,b ) mà người dùng nhập vào. Lisp này sẽ ứng dụng trong việc dò ra các cao độ hiện trạng bị lỗi mà khảo sát cung cấp.

Cụ thể khi chạy lisp như sau :

Command: Xoa

Chọn đối tượng:

Nhập giá trị nhỏ nhất a=

Nhập giá trị lớn nhất b= (b>a)

khi đó lisp sẽ xóa đi toàn bộ các text có giá trị nằm ngoài khoảng ( a,b )

Rất mong các bác pro giú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

Tại sao 1 yêu cầu mà lại 2 lisp bạn nhỉ ????

(defun c:eo(/ a b num)
   (setq a (getreal "\n Nh\U+1EADp gi\U+00E1 tr\U+1ECB nh\U+1ECF nh\U+1EA5t a = :")
         b (getreal "\n Nh\U+1EADp gi\U+00E1 tr\U+1ECB l\U+1EDBn nh\U+1EA5t b = (b>a): "))
   (foreach x (vl-remove-if 'listp (mapcar 'cadr (ssnamex (ssget '((0 . "TEXT"))))))
       (if (or(<(setq num (atof (acet-dxf 1 (entget x)))) a) ( > num B)) (entdel x))
 ))

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ại sao 1 yêu cầu mà lại 2 lisp bạn nhỉ ????

(defun c:eo(/ a b num)
   (setq a (getreal "\n Nh\U+1EADp gi\U+00E1 tr\U+1ECB nh\U+1ECF nh\U+1EA5t a = :")
         b (getreal "\n Nh\U+1EADp gi\U+00E1 tr\U+1ECB l\U+1EDBn nh\U+1EA5t b = (b>a): "))
   (foreach x (vl-remove-if 'listp (mapcar 'cadr (ssnamex (ssget '((0 . "TEXT"))))))
       (if (or(<(setq num (atof (acet-dxf 1 (entget x)))) a) ( > num B)) (entdel x))
 ))

Hề hề hề,

Đây là lisp thứ 2 để bạn ấy tha hồ mà chọn hỉ?????


(defun c:eo1 (/ a b num sst ssl txt )
(vl-load-com)
(setq a (getreal "\n Nh\U+1EADp gi\U+00E1 tr\U+1ECB nh\U+1ECF nh\U+1EA5t a = :")
         b (getreal "\n Nh\U+1EADp gi\U+00E1 tr\U+1ECB l\U+1EDBn nh\U+1EA5t b = (b>a): ")
         sst (ssget (list (cons 0 "*TEXT")))
         ssl (acet-ss-to-list sst)
)
(foreach x ssl
            (setq txt (cdr (assoc 1 (entget x)))
                     num (atof txt)
            )
            (if (and (atof txt)(or (< num a) (> num b )))
                (command "erase" x "")
            )
)
)

 

Mong bác Ketxu chớ giận vì cái éo này do cái eo của bác đẻ ra ấy mà......

Chỉnh sửa theo phamthanhbinh
Chỉnh lại lisp theo góp ý của bác Tue_NV để loại các text không có giá trị số.
  • Vote tăng 2

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

K ngờ bác thức khuya đến vậy để giúp bạn ấy. Thật cảm động quá :wub: . Chúc bác ngày 1 mạnh khoẻ và yêu đời hơn ^^

P/S : Cái éo của bác kỹ càng hơn cái eo của em ^^

  • 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

Hề hề hề,

Đây là lisp thứ 2 để bạn ấy tha hồ mà chọn hỉ?????


(defun c:eo1 (/ a b num sst ssl txt )
(vl-load-com)
(setq a (getreal "\n Nh\U+1EADp gi\U+00E1 tr\U+1ECB nh\U+1ECF nh\U+1EA5t a = :")
         b (getreal "\n Nh\U+1EADp gi\U+00E1 tr\U+1ECB l\U+1EDBn nh\U+1EA5t b = (b>a): ")
         sst (ssget (list (cons 0 "*TEXT")))
         ssl (acet-ss-to-list sst)
)
(foreach x ssl
            (setq txt (cdr (assoc 1 (entget x)))
                     num (atof txt)
            )
            (if(or (< num a) (> num B))
                (command "erase" x "")
            )
)
)

 

Mong bác Ketxu chớ giận vì cái éo này do cái eo của bác đẻ ra ấy mà......

Cai éo của bác Bình nên thay dòng này mới kĩ được :lol:

Dòng này :

(if (or (< num a) (> num B ))

(command "erase" x "")

)

-> Nên sửa thành :

(if (and (distof txt) (or (< num a) (> num B )))

(command "erase" x "")

)

  • 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

ô sờ kê. Chuẩn không cần chỉnh bác à. hôm trước em post nhầm cái số 2 nên làm khổ các bác. hic. Em xin lỗi. Bi h thì việc dò cao độ bị lỗi không còn tốn nhiều công sức nữa. Thanks bác và cảm ơn diễn đàn nhiều 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

ô sờ kê. Chuẩn không cần chỉnh bác à. hôm trước em post nhầm cái số 2 nên làm khổ các bác. hic. Em xin lỗi. Bi h thì việc dò cao độ bị lỗi không còn tốn nhiều công sức nữa. Thanks bác và cảm ơn diễn đàn nhiều nhiều ạ !

hic ! hôm trước em chạy thử thì không vấn đề gì ? Nhưng hôm nay khi dùng lisp để làm việc thì có lỗi xảy ra là. Text là chữ, nó không xóa đi được. Phiền bác sửa giúp em để lisp xóa các đối tượng không phải là text số đi ạ ? Ví dụ như chứ A, B ... có giá trị nằm ngoài khoảng (a,B)

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

hic ! hôm trước em chạy thử thì không vấn đề gì ? Nhưng hôm nay khi dùng lisp để làm việc thì có lỗi xảy ra là. Text là chữ, nó không xóa đi được. Phiền bác sửa giúp em để lisp xóa các đối tượng không phải là text số đi ạ ? Ví dụ như chứ A, B ... có giá trị nằm ngoài khoảng (a,B)

Mạn phép bác Ketxu nhé!

Bạn thay chữ "atof" bằng chữ "distof" trong file lisp là được. Nó xóa tất cả ký tự không phải là số.

  • Vote tăng 2

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ạn phép bác Ketxu nhé!

Bạn thay chữ "atof" bằng chữ "distof" trong file lisp là được. Nó xóa tất cả ký tự không phải là số.

Vâng, được rồi ạ. Thanks bác nhé !

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

Chào các a pro Ketxu - phamthanhbinh - Tue_VN ... và các bác khác nữa.

( ko biết a Bình nhớ e không nhỉ )

- E xin hỏi chút xíu cái này .Mong các anh có thể giải thích cho e chút xíu.

 

Chả là e muốn học cài đuờng lisp để có thể ứng dụng nhanh vào 1 số việc cần thiết - chứ ko tham vọng pro như các a.Hà hà.

 

Mong đuợc giải thích 1 số điều ( có lẽ là cơ bản ) của lisp trên.

1. E hiện giờ chỉ mới biết đuợc 115 tên lệnh lisp ( tải từ 1 file 115 ... của diễn đàn ).Cũng chưa biết hết đuợc công dụng 115 lệnh này.

Nhưng Chắc là còn nhiều lệnh khác mà trong này chưa viết đuợc.Như ssl - sst ... và 1 loạt (...) phía sau ssl.

Xin các a giải thích giúp e mấy thằng này là thế nào với.

 

2. E có thể hiểu và tìm thêm về những cú pháp - và tên lệnh để viết lisp ở chổ nào.

 

3. Sao các dòng nhắc màu tím. E hiểu là nhập giá trị nhỏ nhất , lớn nhất ... sao không hiện lên như vậy mà nó có những ký tự thay thế lạ vậy ?

 

4. 1 cái nữa là e hiểu theo như yêu cầu lisp thì sẽ có quét chọn 1 vùng trong bản vẽ. Không hiểu lisp này lấy giá trị vùng này ntn ?

Vì cứ nghĩ sẽ có lệnh nào lấy cái giá trị phần tử trong này chứ. Rồi nó nếu như có text trùng , line ,pl ... các dạng khác thì ntn ?

( Do e cũng muốn viết 1 lisp dạng quét chọn 1 vùng bản vẽ gồm nh thứ như thế này - rồi lọc ra 1 dạng.VD : text / pl/ line/ arc )

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

.Như ssl - sst ... và 1 loạt (...) phía sau ssl.

Xin các a giải thích giúp e mấy thằng này là thế nào với.

 

2. E có thể hiểu và tìm thêm về những cú pháp - và tên lệnh để viết lisp ở chổ nào.

 

3. Sao các dòng nhắc màu tím. E hiểu là nhập giá trị nhỏ nhất , lớn nhất ... sao không hiện lên như vậy mà nó có những ký tự thay thế lạ vậy ?

 

4. 1 cái nữa là e hiểu theo như yêu cầu lisp thì sẽ có quét chọn 1 vùng trong bản vẽ. Không hiểu lisp này lấy giá trị vùng này ntn ?

Vì cứ nghĩ sẽ có lệnh nào lấy cái giá trị phần tử trong này chứ. Rồi nó nếu như có text trùng , line ,pl ... các dạng khác thì ntn ?

( Do e cũng muốn viết 1 lisp dạng quét chọn 1 vùng bản vẽ gồm nh thứ như thế này - rồi lọc ra 1 dạng.VD : text / pl/ line/ arc )

Mình xin mạo muội trả lời mấy câu bạn hỏi thế này ^^

- Đỏ : cái lố ssl,sst... mà bạn thấy đó chỉ là biến, là gán cho các biến ssl, sst các giá trị tương ứng sau nó, chứ không phải là hàm.Cả đoạn này :

(setq a (getreal "\n Nh\U+1EADp gi\U+00E1 tr\U+1ECB nh\U+1ECF nh\U+1EA5t a = :")

b (getreal "\n Nh\U+1EADp gi\U+00E1 tr\U+1ECB l\U+1EDBn nh\U+1EA5t b = (b>a): ")

sst (ssget (list (cons 0 "*TEXT")))

ssl (acet-ss-to-list sst)

)

là 1 hàm gán setq. Nó sẽ gán lần lượt giá trị vào các biến : Nhỏ nhất : a, Lớn nhất :b, Tập chọn ssget : sst, và list các ename của đối tượng : ssl . Hàm setq có thể gán một lúc nhiều cặp biến - giá trị như lisp trên

- Xanh : mình thấy có 3 công cụ hữu hiệu nhất : Cadviet, F1 (Help của CAD) và Google.

- Tím : đây là string đã được chuyển qua chuỗi Unicode Hexa, để CAD có thể hiển thị Tiếng VIệt bình thường (Unicode)

Bạn có thể qua đây để đọc về topic vẫn đang thảo luận về nó :

Tiếng Việt trong Lisp

- Vàng : việc quét chọn đối tượng được thực hiện bởi hàm ssget, với đối số là list bộ lọc như trong lisp trên :

(setq sst (ssget (list (cons 0 "*TEXT")))

Bộ lọc (list (cons 0 "*TEXT")) sẽ chỉ cho hàm ssget chọn các đối tượng có hậu tố TEXT (MTEXT,TEXT..)..

=> Ví dụ muốn chọn Pline, dòng code của bạn sẽ là (ssget (list (cons 0 "PLINE"))), chọn ARC,Line tương tự

Để đi sâu hơn bạn cần đọc chút ít về record đối tượng, các mã DXF của nó...

P/S : theo mình, bạn nên thử bắt đầu từ chuyên mục Hướng dẫn lập trình lisp :) CHúc bạn thành cô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

Kính thưa các bác, em mạn phép xin các bác sửa giúp để em có lisp chọn những số nằm trong đoạn xác định [a;b] (có bao gồm 2 giá trị a,b ) được không ạ, cái này rất tiện cho em trong công tác thống kê trong cad ạ.

Em xin chân thành cảm ơn! :)

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

Trên diễn đàn đã có rồi. Mình nhớ k nhầm thì có cách đây khoảng 4 5 năm gì đó. Bạn thử tìm xem, k có thì mình viết lại cho . Code thì cũng ngắn thô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

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


×