Đến nội dung


Hình ảnh
- - - - -

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


  • Please log in to reply
13 replies to this topic

#1 leejang

leejang

    biết lệnh move

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

Đã gửi 06 May 2011 - 09:36 PM

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 đỡ !
  • 0

#2 ketxu

ketxu

    Copier - Paster - Editor

  • Moderator
  • PipPipPipPipPipPipPip
  • 5678 Bài viết
Điểm đánh giá: 2605 (tuyệt vời)

Đã gửi 06 May 2011 - 11:08 PM

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

  • 0

Thành viên nhóm CadMagic.
Mời bạn ghé thăm facebook nhóm - Page viết lisp theo yêu cầu  :
CAD MAGIC


#3 phamthanhbinh

phamthanhbinh

    biết lệnh adcenter

  • Moderator
  • PipPipPipPipPipPipPip
  • 6007 Bài viết
Điểm đánh giá: 3113 (tuyệt vời)

Đã gửi 07 May 2011 - 01:54 AM

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

Bài viết đã được chỉnh sửa nội dung bởi phamthanhbinh: 07 May 2011 - 11:41 AM
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ố.

  • 2
Chúc các quý Anh trên diễn đàn luôn khỏe, đẻ thêm được nhiều thứ để mót.

#4 ketxu

ketxu

    Copier - Paster - Editor

  • Moderator
  • PipPipPipPipPipPipPip
  • 5678 Bài viết
Điểm đánh giá: 2605 (tuyệt vời)

Đã gửi 07 May 2011 - 07:26 AM

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

Thành viên nhóm CadMagic.
Mời bạn ghé thăm facebook nhóm - Page viết lisp theo yêu cầu  :
CAD MAGIC


#5 Tue_NV

Tue_NV

    KS Võ Quang Tuệ

  • Moderator
  • PipPipPipPipPipPipPip
  • 4296 Bài viết
Điểm đánh giá: 3804 (đỉnh cao)

Đã gửi 07 May 2011 - 07:45 AM

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

#6 leejang

leejang

    biết lệnh move

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

Đã gửi 07 May 2011 - 05:49 PM

ô 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 ạ !
  • 0

#7 leejang

leejang

    biết lệnh move

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

Đã gửi 08 May 2011 - 05:51 PM

ô 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)
  • 0

#8 Doan Van Ha

Doan Van Ha

    biết lệnh adcenter

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

Đã gửi 08 May 2011 - 06:14 PM

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

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


#9 hhhhgggg

hhhhgggg

    biết dimedit

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

Đã gửi 09 May 2011 - 03:40 AM

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é !
  • 0
Hoàng Giang

#10 Doan Van Ha

Doan Van Ha

    biết lệnh adcenter

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

Đã gửi 09 May 2011 - 06:31 AM

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

Sao thanks mà không bấm nút "+" màu xanh ở dưới nhỉ?
  • 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.


#11 843824

843824

    biết vẽ circle

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

Đã gửi 13 May 2011 - 08:16 PM

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

#12 ketxu

ketxu

    Copier - Paster - Editor

  • Moderator
  • PipPipPipPipPipPipPip
  • 5678 Bài viết
Điểm đánh giá: 2605 (tuyệt vời)

Đã gửi 13 May 2011 - 09:39 PM

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

Thành viên nhóm CadMagic.
Mời bạn ghé thăm facebook nhóm - Page viết lisp theo yêu cầu  :
CAD MAGIC


#13 ngochai_308

ngochai_308

    biết zoom

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

Đã gửi 13 August 2014 - 05:43 PM

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


  • 0

#14 ketxu

ketxu

    Copier - Paster - Editor

  • Moderator
  • PipPipPipPipPipPipPip
  • 5678 Bài viết
Điểm đánh giá: 2605 (tuyệt vời)

Đã gửi 13 August 2014 - 06:03 PM

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


  • 0

Thành viên nhóm CadMagic.
Mời bạn ghé thăm facebook nhóm - Page viết lisp theo yêu cầu  :
CAD MAGIC