Đến nội dung


Hình ảnh
- - - - -

[ Yêu Cầu ] Lisp lọc text số nguyên và text có số thập phân.


  • Please log in to reply
35 replies to this topic

#1 whatcholingon

whatcholingon

    biết lệnh break

  • Members
  • PipPipPipPip
  • 222 Bài viết
Điểm đánh giá: 37 (tàm tạm)

Đã gửi 31 July 2013 - 05:30 PM

Chào mọi người!

Vấn đề của mình như sau:

Trong bản vẽ của mình có 3 đối tượng text

1 là text chữ

2 là text số nguyên

3 là text số có số lẻ đằng sau

 

3 text này giờ đang cùng 1 layer và color giờ mình muốn tách rieng 3 text này thành 3 layer riêng biệt.

Mọi người viết giúp mình lsp sau

Lệnh đầu tiên để tách text chữ là : LTC

Lệnh thứ 2 để tách text số nguyên là: LTN

Lệnh thứ 3 để tách text số có số lẻ là: LTP

 

ây là hình minh họa của mình

96857_h2_convent.jpg

Mong mọi người viết giúp mình, mình đang cần gấp!

Thanks all !

 

 


  • 0

#2 Tue_NV

Tue_NV

    KS Võ Quang Tuệ

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

Đã gửi 31 July 2013 - 06:59 PM

Bạn dùng lệnh Find là được, cần chi lisp

- Chọn và Tìm số thực thì chuỗi tìm -> Find -> nhập kí tự "."  -> Select All

- Chọn và Tìm CHỮ thì chuỗi tìm  -> Find -> nhập kí tự "@"  -> Select All

- Chọn và Tìm SỐ NGUYÊN thì chuỗi tìm  -> Find -> nhập kí tự "~@"  -> Select All -> tiếp tục Find -> nhập kí tự "~."  -> Select All

Chú ý : Option trong lệnh find -> Bỏ dấu tick trong Find whole word only


  • 1

#3 TaiNguyen79

TaiNguyen79

    biết vẽ ellipse

  • Members
  • PipPip
  • 51 Bài viết
Điểm đánh giá: 24 (tàm tạm)

Đã gửi 31 July 2013 - 09:51 PM

Chào mọi người!
Vấn đề của mình như sau:
Trong bản vẽ của mình có 3 đối tượng text
1 là text chữ
2 là text số nguyên
3 là text số có số lẻ đằng sau
 
3 text này giờ đang cùng 1 layer và color giờ mình muốn tách rieng 3 text này thành 3 layer riêng biệt.
Mọi người viết giúp mình lsp sau
Lệnh đầu tiên để tách text chữ là : LTC
Lệnh thứ 2 để tách text số nguyên là: LTN
Lệnh thứ 3 để tách text số có số lẻ là: LTP
 
ây là hình minh họa của mình
96857_h2_convent.jpg
Mong mọi người viết giúp mình, mình đang cần gấp!
Thanks all !

Của bạn đây :


;tach rieng chu va so
(defun c:chu_so (/ SS1 LopT LopN Count Eg)
(princ "\nChon cac chu ")
(while (null (setq SS1 (ssget (list (cons 0 "Text"))))) (princ "\nChua chon duoc chu "))
(if (= (setq LopT (getstring "\nNhap ten lop se chua cac chu ")) "")
(progn (if (null (tblsearch "layer" "so nguyen")) (command "layer" "N" "chu" "")) (setq LopT "chu")))
(if (= (setq LopN (getstring "\nNhap ten lop se chua cac so ")) "")
(progn (if (null (tblsearch "layer" "so nguyen")) (command "layer" "N" "so" "")) (setq LopN "so")))
(setq Count 0)
(repeat (sslength SS1)
(setq Eg (entget (ssname SS1 Count)))
(if (numberp (distof (cdr (assoc 1 eg))))
(setq Eg (subst (cons 8 lopN) (assoc 8 Eg) Eg))
(setq Eg (subst (cons 8 LopT) (assoc 8 Eg) Eg)));if
(setq Count (1+ Count))
(entmod Eg));repeat
(princ))
;;---------------------
;;tach lay cac chu mang gia tri la so nguyen
(defun c:songuyen (/ SS1 Lopsn Count Eg)
(princ "\nChon cac chu ")
(while (null (setq SS1 (ssget (list (cons 0 "Text"))))) (princ "\nChua chon duoc chu "))
(if (= (setq Lopsn (getstring "\nNhap ten lop se chua cac so nguyen chon duoc : ")) "")
(progn (if (null (tblsearch "layer" "so nguyen")) (command "layer" "N" "so nguyen" ""))(setq Lopsn "so nguyen")));if
(setq Count 0)
(repeat (sslength SS1)
(setq Eg (entget (ssname SS1 Count)) ndung (cdr (assoc 1 eg)))
(if (and (numberp (distof ndung)) (= (type (read ndung) ) 'INT))
(setq Eg (subst (cons 8 lopsn) (assoc 8 Eg) Eg)));end if
(setq Count (1+ Count))
(entmod Eg));repeat
(princ))
;;---------------------
;;Tach lay chu co so bat dau
(defun c:chu_coso (/ SS1 LopT Count Eg)
(princ "\nChon cac chu ")
(while (null (setq SS1 (ssget (list (cons 0 "Text"))))) (princ "\nChua chon duoc chu "))
(if (= (setq LopT (getstring "\nNhap ten lop se chua cac chu ")) "")
(progn (if (null (tblsearch "layer" "so nguyen")) (command "layer" "N" "Chu co so bat dau" ""))
(setq LopT "Chu co so bat dau")));end if
(setq Count 0)
(repeat (sslength SS1)
(setq Eg (entget (ssname SS1 Count)))
(if (not (numberp (distof (cdr (assoc 1 eg)))))
(if (numberp (distof (substr (cdr (assoc 1 eg)) 1 1)))
(setq Eg (subst (cons 8 lopT) (assoc 8 Eg) Eg))))
(setq Count (1+ Count))(entmod Eg))(princ))

Dùng lệnh chu_so để tách riêng chữ và số.
Dùng lệnh songuyen để lấy số nguyên

:( Nếu muốn chọn địa chỉ thửa đất thì dùng lệnh chu_coso để tách lấy những chũ có số bắt đầu

P/S : Bạn có thể cứ bấm enter không cần trả lời . chương trình sẽ tự tạo ra các lớp tạm để chứa các chữ tìm đc
  • 1

#4 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 31 July 2013 - 10:18 PM

Nên gộp 3 lệnh thành 1 lệnh chung, và chỉ chọn đối tượng 1 lần cho cả 3 nhóm.


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


#5 whatcholingon

whatcholingon

    biết lệnh break

  • Members
  • PipPipPipPip
  • 222 Bài viết
Điểm đánh giá: 37 (tàm tạm)

Đã gửi 01 August 2013 - 08:02 AM

Cám ơn mọi người đã quan tâm và giúp đỡ:

- Mình làm theo Mr Tue chỉ thì chỉ tìm được các đối tượng có dấu "." và chỉ tìm từng đối tượng một chọn tất cả các đối tượng có dấu "." thif không được còn tìm số nguyên và số thực thì mình lại không hiểu lắm nên làm không được.

mình có nhập @ nhưng không chọn được đối tượng nào cả.

- Còn lsp của Mr TaiNguyen79 thì mình chỉ thực hiện được lệnh lọc text chữ đưa về layer riêng (chu_so)

còn lệnh (songuyen) thì báo lỗi sau: ; error: bad argument value: positive 0

lệnh (chu_coso) thì thực hiện xong thì các đối tượng vẫn vậy không có thay đổi gì cả.

Mong bạn kiểm tra lại mình.

- Ý của Mr Ha rất hay nếu có thể đưa về 1 lệnh mà khi thực hiện Lsp hỏi cần chọn đối tượng nào thì quả là tuyệt.

nếu có thể bạn viết luôn cho mình!

Thanks all!


  • 0

#6 Tue_NV

Tue_NV

    KS Võ Quang Tuệ

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

Đã gửi 01 August 2013 - 08:13 AM

Cám ơn mọi người đã quan tâm và giúp đỡ:

- Mình làm theo Mr Tue chỉ thì chỉ tìm được các đối tượng có dấu "." và chỉ tìm từng đối tượng một chọn tất cả các đối tượng có dấu "." thif không được còn tìm số nguyên và số thực thì mình lại không hiểu lắm nên làm không được.

mình có nhập @ nhưng không chọn được đối tượng nào cả.

.......

Thanks all!

 

Bạn đã làm công việc chú ý này chưa?

 

.......

Chú ý : Option trong lệnh find -> Bỏ dấu tick trong Find whole word only


  • 0

#7 whatcholingon

whatcholingon

    biết lệnh break

  • Members
  • PipPipPipPip
  • 222 Bài viết
Điểm đánh giá: 37 (tàm tạm)

Đã gửi 01 August 2013 - 08:19 AM

Mình có kiểm tra dòng đó, trong cad của mình dòng đó trống không có đánh dấu.


  • 0

#8 whatcholingon

whatcholingon

    biết lệnh break

  • Members
  • PipPipPipPip
  • 222 Bài viết
Điểm đánh giá: 37 (tàm tạm)

Đã gửi 01 August 2013 - 08:29 AM

Mình nhập @ thì nó hiểu rùi ( lúc trước mình chưa tích vào ô Use wildcards)

nhưng thực hiện được cũng chỉ là tìm từng đối tượng chứ nó không chọn toàn bộ và tách riêng ra thành 1 layer khác cho mình

nhập tìm chữ thì nó tìm từng chữ một trong một text chữ.

nhập tìm số nguyên thì nó tìm cả số thực lẫn số nguyên.

bạn nhìn ở hình ảnh của mình đưa lên đó nó có 3 đối tượng riêng biệt như vậy. trong bản vẽ thì nó có nhiều đối tượng như vậy bây giờ cần phải tách từng text riêng

text: loại đất là text chữ

text: số nguyên là số thứ tự thửa đất

text : số thực là diện tích của thửa đất.

Thanks!


  • 0

#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 01 August 2013 - 08:34 AM

Bạn gởi bản vẽ lên tớ mần cho.

Và bạn thích tách thành 3 layer có tên là gì? X, Y, Z?


  • 0

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

whatcholingon

    biết lệnh break

  • Members
  • PipPipPipPip
  • 222 Bài viết
Điểm đánh giá: 37 (tàm tạm)

Đã gửi 01 August 2013 - 08:50 AM

File đây bạn:

http://www.cadviet.c...s/3/96857_a.dwg

 

 

Layer text chữ là LOAIDAT

Layer text số nguyên là: SOTHUA

Layer text số thực là:  DIENTICH

Thanks!


  • 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 01 August 2013 - 09:55 AM

Lisp tách 3 đối tượng của layer thửa đất thành 3 layer khác nhau: symbol -> "LOAIDAT" ; integer -> "SOTHUA" ; real -> "DIENTICH".

;; Tach 3 doi tuong cua layer thua dat thanh 3 layer khac nhau: symbol, integer, real.
;; Doan Van Ha - CadViet.com - ngay 01/8/2013
(defun C:HA ( / MakeLayer txt)
 (defun MakeLayer (name color)
  (if (not (tblsearch "Layer" name))
   (entmakex (list '(0 . "LAYER") (cons 100 "AcDbSymbolTableRecord") (cons 100 "AcDbLayerTableRecord") (cons 2 name) (cons 70 0) (cons 62 color)))))
 (mapcar '(lambda(x y) (MakeLayer x y)) (list "LOAIDAT" "SOTHUA" "DIENTICH") '(1 2 3))
 (princ "\nChon cac doi tuong Text can phan lop...")
 (ssget '((0 . "TEXT")))
 (vlax-for obj (vla-get-activeselectionset (vla-get-ActiveDocument (vlax-get-acad-object)))
  (if (= (setq txt (type (read (cdr (assoc 1 (entget (vlax-vla-object->ename obj))))))) 'SYM)
   (progn (vla-put-Layer obj "LOAIDAT") (vla-put-Color obj 1))
   (if (= txt 'INT)
    (progn (vla-put-Layer obj "SOTHUA") (vla-put-Color obj 2))
    (progn (vla-put-Layer obj "DIENTICH") (vla-put-Color obj 3))))))
 

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


#12 whatcholingon

whatcholingon

    biết lệnh break

  • Members
  • PipPipPipPip
  • 222 Bài viết
Điểm đánh giá: 37 (tàm tạm)

Đã gửi 01 August 2013 - 10:15 AM

cám ơn Mr Ha rất nhiều. mình không nghĩ là lsp này tuyệt vời đến vậy. chỉ cần 1 thao tác là xong.

Thanks!


  • 0

#13 TaiNguyen79

TaiNguyen79

    biết vẽ ellipse

  • Members
  • PipPip
  • 51 Bài viết
Điểm đánh giá: 24 (tàm tạm)

Đã gửi 01 August 2013 - 12:54 PM

Cám ơn mọi người đã quan tâm và giúp đỡ:
- Mình làm theo Mr Tue chỉ thì chỉ tìm được các đối tượng có dấu "." và chỉ tìm từng đối tượng một chọn tất cả các đối tượng có dấu "." thif không được còn tìm số nguyên và số thực thì mình lại không hiểu lắm nên làm không được.
mình có nhập @ nhưng không chọn được đối tượng nào cả.
- Còn lsp của Mr TaiNguyen79 thì mình chỉ thực hiện được lệnh lọc text chữ đưa về layer riêng (chu_so)
còn lệnh (songuyen) thì báo lỗi sau: ; error: bad argument value: positive 0
lệnh (chu_coso) thì thực hiện xong thì các đối tượng vẫn vậy không có thay đổi gì cả.
Mong bạn kiểm tra lại mình.
- Ý của Mr Ha rất hay nếu có thể đưa về 1 lệnh mà khi thực hiện Lsp hỏi cần chọn đối tượng nào thì quả là tuyệt.
nếu có thể bạn viết luôn cho mình!
Thanks all!

Mình đã sủa lisp lại rồi.Nhưng mình không thích gộp lại để rời còn làm đc việc khác.
  • 1

#14 TaiNguyen79

TaiNguyen79

    biết vẽ ellipse

  • Members
  • PipPip
  • 51 Bài viết
Điểm đánh giá: 24 (tàm tạm)

Đã gửi 01 August 2013 - 12:59 PM

Lisp tách 3 đối tượng của layer thửa đất thành 3 layer khác nhau: symbol -> "LOAIDAT" ; integer -> "SOTHUA" ; real -> "DIENTICH".

;; 
  (if (= (setq txt (type (read (cdr (assoc 1 (entget (vlax-vla-object->ename obj))))))) 'SYM)
   


Bạn DVH chú ý hàm read 1 chút nếu không những chữ mà bắt đầu bởi 1 số sẽ bị chọn thành số .
  • 0

#15 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 01 August 2013 - 01:44 PM

Bạn DVH chú ý hàm read 1 chút nếu không những chữ mà bắt đầu bởi 1 số sẽ bị chọn thành số .

Tôi biết. Tôi cũng hiểu cách ghi kí hiệu thửa đất nữa.

Những chữ dù có số nhưng có chứa ký tự khác số thì nó không phải là số bạn ạ.


  • 0

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


#16 Tue_NV

Tue_NV

    KS Võ Quang Tuệ

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

Đã gửi 01 August 2013 - 01:58 PM

Nếu như chẳng may trên bản vẽ, trong đống text có chứa chữ có "." thì lisp bác HA sẽ......

KL: Không nên dùng hàm (read....... trong TH này 


  • 0

#17 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 01 August 2013 - 02:06 PM

Nếu như chẳng may trên bản vẽ, trong đống text có chứa chữ có "." thì lisp bác HA sẽ......

KL: Không nên dùng hàm (read....... trong TH này 

Nếu như chẳng may trên bản vẽ có 1 text trời ơi "1234567890" bị chọn mà không phải số thửa?

Nếu như trên bản vẽ có những text trời ơi khác?

Những bài toán như thế này không có lisp tuyệt đối đúng nỗi! User phải tự xử thôi, chứ không read cũng vẫn không giải quyết triệt để.


  • 0

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


#18 TaiNguyen79

TaiNguyen79

    biết vẽ ellipse

  • Members
  • PipPip
  • 51 Bài viết
Điểm đánh giá: 24 (tàm tạm)

Đã gửi 01 August 2013 - 03:16 PM

Tôi biết. Tôi cũng hiểu cách ghi kí hiệu thửa đất nữa.
Những chữ dù có số nhưng có chứa ký tự khác số thì nó không phải là số bạn ạ.

Dòng chứa địa chỉ thửa đất có các chữ bắt đầu bằng số đó bạn.
VD
read "2 Lê Lợi" = 2 (INT)
  • 0

#19 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 01 August 2013 - 03:31 PM

1). Trích giải thích của chủ topic.

text: loại đất là text chữ

text : số thực là diện tích của thửa đất.

text: số nguyên là số thứ tự thửa đất

2). Dù là "loại đất" hay "số thứ tự thửa" hay "diện tích thửa" thì cũng không thể "2 Lê Lai" được. Bạn kiếm đâu ra trên bản vẽ?

Còn bạn thích giải quyết triệt để thì xin mời! Tôi chỉ có thể giải quyết được y/c của chủ top thôi, chứ bài toán tổng quát thì bó tay.


  • 0

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


#20 KangKung

KangKung

    biết lệnh array

  • Members
  • PipPipPip
  • 189 Bài viết
Điểm đánh giá: 227 (khá)

Đã gửi 01 August 2013 - 04:02 PM

Bác Hạ thay hàm read bằng distof và dùng thêm hàm if nữa là giải quyết xong bài toán.
  • 0