Đến nội dung


Hình ảnh
- - - - -

[ yêu cầu ] lisp lọc các đối tượng trên bản vẽ.


  • Please log in to reply
11 replies to this topic

#1 hg_aum

hg_aum

    biết vẽ circle

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

Đã gửi 27 September 2013 - 11:01 PM

em chào tất cả các bác,em đang làm bản đồ địa chính và có vấn đề mong các bác giúp em.Trên bản  vẽ của em có các txt cùng một lớp,cùng màu giờ em muốn tự động chọn tất cả chúng, rồi đưa về các lớp theo yêu cầu.Các đối tượng trên có cùng một cấu trúc như sau(không phải là khối):
12
LUC
Nguyễn Văn A
Thôn 3
22

ý nghĩa và yêu cu
12                   :là số thửa trong bản vẽ nó chạy từ 1 đến n.em muốn chọn chúng rồi đưa vào lớp                                                                                                                      "so thua" trên bản vẽ.
LUC                : là loại đất trên bản vẽ sẽ có nhiều loại nhưng ta sẽ có một danh sách ký hiệu của                                                 chúng(LUC,LUK,LNK....)   và em muốn chọn rồi chuyển                                                                                                        chúng vào lớp "loai dat" trên bản vẽ.
Nguyễn Văn A:  là họ tên người sử dụng đất,em muốn chọn rồi chúng về lớp"chu su dung"trên bản vẽ.
Thôn 3           : là địa chỉ ,tất cả đều giống nhau chỉ khác là số 3 hay 1...ta sẽ chọn và đưa chúng                                                                                                                                      về lớp"dia chi"
22                 :số tờ bản đồ,trong cùng một bản vẽ nó đều giống nhau là 22 tùy vào số tờ bản đồ và                                                                                                                ta sẽ xóa bỏ đối tượng này.

Sau khi  ta đưa được các đối tượng về lớp"so thua" lop"loai dat" lop"dia chi" và xóa bỏ các số 22 thì các txt còn lại chính là lớp"chu su dung" ta có thể chuyển bằng tay.Rất mong  các bác giúp đỡ,em xin chân thành cảm ơn!63415_loc_du_lieu.jpghttp://www.cadviet.c...loc_du_lieu.dwghttp://www.cadviet.c...ch_loai_dat.txt


  • 0

#2 Tue_NV

Tue_NV

    KS Võ Quang Tuệ

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

Đã gửi 28 September 2013 - 06:40 AM

em chào tất cả các bác,em đang làm bản đồ địa chính và có vấn đề mong các bác giúp em.Trên bản  vẽ của em có các txt cùng một lớp,cùng màu giờ em muốn tự động chọn tất cả chúng, rồi đưa về các lớp theo yêu cầu.Các đối tượng trên có cùng một cấu trúc như sau(không phải là khối):
12
LUC
Nguyễn Văn A
Thôn 3
22

.......

 

Chào bạn!

Việc lọc đối tượng với Lisp thì dễ, nhưng khó ở chổ là dựa vào đâu để Lisp nhận dạng 1 cách chính xác thôi

Ví dụ: Số thửa là 22, số tờ bản đồ cũng là 22. Vậy Lisp sẽ dựa vào cái gì để phân biết đâu là số thửa? đâu là số tờ bản đồ??


  • 0

#3 hg_aum

hg_aum

    biết vẽ circle

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

Đã gửi 28 September 2013 - 10:24 AM

Chào bạn!

Việc lọc đối tượng với Lisp thì dễ, nhưng khó ở chổ là dựa vào đâu để Lisp nhận dạng 1 cách chính xác thôi

Ví dụ: Số thửa là 22, số tờ bản đồ cũng là 22. Vậy Lisp sẽ dựa vào cái gì để phân biết đâu là số thửa? đâu là số tờ bản đồ??

cảm ơn anh đã để ý đến vấn đề của em.vấn đề số tờ  bản đồ không quan trọng.Vì trong một bản vẽ  chỉ có một số tờ bản đồ ví dụ là 22.thì tất cả phía dưới các cụm từ đều là số 22 nên ta sẽ không cần dùng lisp nữa,ta sẽ xóa thủ công bằng lệnh Find anh ạ như thế chỉ mất một số thửa là 22 trùng với số tờ bản đồ bị xóa đi thôi ạ.Quan trọng lọc và đưa các số thửa,loại đất,chủ sử dụng và địa chỉ về đúng lớp là ok rồi anh ạ


  • 0

#4 quansla

quansla

    biết lệnh xclip

  • Members
  • PipPipPipPipPipPipPip
  • 642 Bài viết
Điểm đánh giá: 223 (khá)

Đã gửi 29 September 2013 - 01:30 AM

cảm ơn anh đã để ý đến vấn đề của em.vấn đề số tờ  bản đồ không quan trọng.Vì trong một bản vẽ  chỉ có một số tờ bản đồ ví dụ là 22.thì tất cả phía dưới các cụm từ đều là số 22 nên ta sẽ không cần dùng lisp nữa,ta sẽ xóa thủ công bằng lệnh Find anh ạ như thế chỉ mất một số thửa là 22 trùng với số tờ bản đồ bị xóa đi thôi ạ.Quan trọng lọc và đưa các số thửa,loại đất,chủ sử dụng và địa chỉ về đúng lớp là ok rồi anh ạ

Bạn thử Code này xem nào, trình độ viết lisp của mình còn dở lắm về thuật toán thì chắc là rất ngớ ngẩn trước hết cứ đáp ứng nhu cầu của bạn đã, bạn gõ lệnh "THU" (thử) rồi dùng chuột quét chọn hình chữ nhật bao lấy một "cụm Text" mẫu (là cụm gồm đủ 5 Text như bạn đưa ra trên ảnh ý) sau đó nhấn Enter và kiểm tra kết quả.
Chú ý

  •  
  • Để thay đổi bộ lọc của số hiệu đất bạn tạo một file txt mới với nội dung là : mỗi dòng một loại mã hiệu đất (3 ký tự) và lưu lại vào đâu đó khi sử dụng lisp Ngay bước đầu tiên khi Lisp hỏi bạn là hãy quét chọn  Hình chữ nhật bao bộ lọc thi bạn không chọn điểm nữa mà ấn "S" / enter 
  • Cũng ở phần chọn hình chữ nhật bao bộ lọc bạn ấn E lisp sẽ tự thoát 
  • Mẹo: để lisp xử lý triệ để nhất bạn hãy chọn hình bao bộ lọc bao toàn bộ Text mẫu (hoặc bao trùm hẳn ra ngoài Text dài nhất là tốt nhất) vì trong Lisp của mình chỉ xử lý các đối tượng nằm trong khung bằng khung chữ nhật quét ban đầu thôi.

hixx, trình độ văn của mình kém lắm lại đang buồn ngủ, nếu quá khó hiểu bạn cmm lại mình làm video sau. Chúc bạn thành công.
Code


(defun c:thu (/ Setlist_dat newlayer  dis dt enti flag1 i loc ls ls1 N p0 p1 p2 pA pB ss ssdt Tvalue x
     *myerr ang1 ang2 dis1 dis2 enti flag1 i line ls olderr p1 p10 p2 ss0 ssdt Tvalue x)
  (defun *myerr (msg);
    (princ "Error: ")(princ msg)
    (princ)
    (if olderr (setq *error* olderr))
    (princ))
 
  (defun newlayer ( a b c d)
(if (not (tblsearch "layer" a))
(command "-layer" "n" a "c" b a "l" c a "lw" d a "")
;(command "-layer" "s" a "c" b a "l" c a "lw" d a "")
)
  )
 
  
  (defun Setlist_dat (/ duondan f ls)
    (setq duondan (getfiled "\nChon file chua danh sach Ma dat" "" "txt" 2)
 ls (list))
    (setq f (open duondan "r"))
    (while (setq line (read-line f))
      (setq ls (append (list line) ls))
      )
    (close f)
    (setq flag1 T)
    (setq #ls ls)
    ls    
    )
  ;;nhap vl-load,tao bo loc "loc" va khoi tao layer can thiet
  (vl-load-com)
  (setq olderr *error* *error* *myerr)
  (newlayer "so thua" 1 "Continuous " 0)
  (newlayer "loai dat" 2 "Continuous " 0)  
  (newlayer "chu su dung" 3 "Continuous " 0)
  (newlayer "dia chi" 4 "Continuous " 0)
  
  (or #ls (setq #ls '("DXH" "PNK" "DNL" "DBV" "SON" "TON" "DCS" "BCS" "ONT" "ODT" "DGD" "NTD" "SKK"
    "SKX" "MVT" "CQP" "DDT" "DTL" "DGT" "TSC" "RPK" "RDT" "RPT" "RST" "RDN" "RPN"
    "RSN" "MNC" "TSN" "TSL" "SKC" "COC" "SKS" "LNK" "LNQ" "LNC" "DVH" "BHK" "DYT"
    "CAN" "DCH" "TSK" "LMU" "TIN" "DTT" "LUK" "LUC" "LUN")))
  (setq ls #ls)
  (setq loc (mapcar '(lambda (x)(cons 1 x))ls))
  (setq loc (append '(( -4 . "<AND"))
   '((0 . "TEXT,MTEXT"))
   '(( -4 . "<OR"))
   loc
   '(( -4 . "OR>"))
   '(( -4 . "AND>"))))
  ;;;ket thuc khoi tao
 
 
  
  (setq flag1 nil)
  (while (null flag1)
      (initget "Setting Exit")
      (setq p1 (getpoint "\nQuet Hinh chu nhat bao bo loc or [Setting Exit] <Select>"))
      (cond
( (= p1 "Setting")(setq ls (SETLIST_DAT )))
( (= p1 "Exit")(exit))
( (= 'LIST (type p1))
(progn
  
  (if (setq p2 (getcorner p1)
    ss (acet-ss-to-list(ssget
 "_w"
 p1
 p2
 loc
 ))
    ss0 (car ss))     
    (progn
      (setq flag1 T)
      (setq ang1 (angle (setq p10 (cdr(assoc 10 (entget ss0)))) p1)
    ang2 (angle p10 p2)
    dis1 (distance p10 p1)
    dis2 (distance p10 p2))
      (princ)
      )
    (alert "\nBan da chon vung khong co KH mau dat phu hop\n"))
))
(T (setq flag1 nil)(prompt "\nBan da chon vung khong co DATA phu hop reSected or Exit\n")(princ)))
      )
  (if flag1
    (if (setq ss (acet-ss-to-list(ssget "X" loc)))
      (mapcar '(lambda (x / p10 p1 p2 ssdt)
(setq p10 (cdr(assoc 10 (entget x)))
      p1 (polar p10 ang1 dis1)
      p2 (polar p10 ang2 dis2)
      ssdt (acet-ss-to-list(ssget "_W" p1 p2)))
(foreach i ssdt
  (setq Tvalue (cdr(assoc 1 (setq enti (entget i)))))
  (cond
    ( ( wcmatch Tvalue "Th*#") (entmod(subst (cons 8 "dia chi") (assoc 8 enti) enti)))
    ( (> (atoi Tvalue) 0) (entmod(subst (cons 8 "so thua") (assoc 8 enti) enti)))
    ( (and (= (strlen Tvalue) 3) (member (car(list Tvalue)) ls))
     (entmod(subst (cons 8 "loai dat") (assoc 8 enti) enti)))
    (T (entmod(subst (cons 8 "chu su dung") (assoc 8 enti) enti)))
    )
  ))
     ss)
      )
    )
  (command "_change" "_all" "" "p" "co" "bylayer" "")
  (if olderr (setq *error* olderr))
  (princ)
  )

 

101306_63415_loc_du_lieu.jpg


  • 0

#5 hg_aum

hg_aum

    biết vẽ circle

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

Đã gửi 30 September 2013 - 08:10 AM

thank bạn Quansla nhé,mình thử lisp rồi,tuy tốc độ hơi chậm với tờ bản đồ có khoảng hơn 700 cụm txt nhưng vậy cũng được rồi.Chỉ cố vấn đề là khi mình chọn cả tờ bản đồ luôn thì có nhưng cụm vẫn bị sai,thôn 3 vẫn vào lớp "chu su dung" .Mình gửi lại file mình đã thực hiện bạn kiểm tra lại và có khoang chỗ sai, bạn xem giúp mình nhé.http://www.cadviet.c...415_loi_csd.rar 

quansla
  • 0

#6 quansla

quansla

    biết lệnh xclip

  • Members
  • PipPipPipPipPipPipPip
  • 642 Bài viết
Điểm đánh giá: 223 (khá)

Đã gửi 30 September 2013 - 11:02 PM

Nhờ bác nào giúp chủ pic, giúp luôn em hoàn thành vấn đề chủ pic với, Các bác cứ viết lại hoàn toàn hoặc sửa thuật toán cho líp e cũng được. Máy em hiện đang bị hỏng bàn phím. đánh mấy dòng này toàn bằng bàn phím ảo KIS, hix


  • 0

#7 hg_aum

hg_aum

    biết vẽ circle

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

Đã gửi 02 October 2013 - 01:45 PM

lisp của bạn chưa ổn nên mình đành làm bo thành nhều lần vậy.Khi nào rảnh bạn hoàn thiện giúp mình với nhé,thank bạn nhiều1


  • 0

#8 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 02 October 2013 - 04:24 PM

lisp của bạn chưa ổn nên mình đành làm bo thành nhều lần vậy.Khi nào rảnh bạn hoàn thiện giúp mình với nhé,thank bạn nhiều1

Hề hề hề,
Gửi bạn lisp này để bạn dùng thử. Nếu ưng mình sẽ hoàn thiện tiếp.
Lisp mới chỉ phân loại các đối tượng theo đúng cấu trúc của nhòm đối tượng mà bạn đã gửi bản vẽ mẫu lên. Trường hợp các nhónm đối tượng có cấu trúc không đúng như file bạn gửi,( chẳng hạn mỗi nhóm không đúng 5 đối tượng, vị trí tương đối của các text trong mỗi nhóm không tương ứng, góc text thay đổi, căn lề của mỗi text thay đổi, các text không cùng trên layer 52 và cùng có màu 7 .... ) thì lisp sẽ phân loại sai. Đó chính là lý do mà mình không làm hoàn chỉnh lisp này ngay vì chưa hiểu cái bạn cần có hoàn toàn đúng như mẫu bạn gửi hay không.
Kết quả của lisp này chỉ mới là chuyển màu các đối tượng cùng một phân loại về cùng một màu để bạn dễ nhận biết mà thôi.
Lisp chưa được test trên các bản vẽ đồ sộ với hàng trăm hàng ngàn nhóm text như bạn nói song với bản vẽ bạn gửi lên chỉ gồm hai nhóm text thì nó chưa bị lỗi. Có thể sẽ phát sinh lỗi nếu như trên bản vẽ của bạn có quá nhiều nhóm text có vị trí tương đối quá gần nhau. Điều này mình nghĩ là hiếm có vì các thửa đất đều phải đủ rộng để các text có chỗ ngồi và dữ liệu cho mỗi thửa thường phải được nhập cùng nhau để tránh nhầm lẫn. Hy vọng mình đoán đúng và lisp đáp ứng được yêu cầu của bạn.
http://www.cadviet.c...cdulieutext.lsp
  • 0
Chúc các quý Anh trên diễn đàn luôn khỏe, đẻ thêm được nhiều thứ để mót.

#9 ndtnv

ndtnv

    biết lệnh minsert

  • Members
  • PipPipPipPipPipPip
  • 437 Bài viết
Điểm đánh giá: 384 (khá)

Đã gửi 03 October 2013 - 10:17 AM

Trong bản vẽ phải có đủ 5 layer trong list ll

Bạn thêm vào các hàm tạo layer, bẫy lỗi ...

 

(defun Dxf(n e) (cdr (assoc n e)))
(defun ModDxf(n v e)
    (if (Dxf n e)
        (entmod (subst (cons n  v) (assoc n e) e))
        (entmod (append e (list (cons n  v))))
    )
)

(defun c:plt (/ g h i l5 ll ls p x y) ; Phan Loai Text
    (setq fz 0.1) ; sai so
     (setq ll '("so thua" "loai dat" "chu su dung" "dia chi" "to ban do"))
     (setq ls (vl-remove-if 'listp (mapcar 'cadr (ssnamex (ssget (list '(0 . "TEXT")
   (cons 1 (strcat "DXH,PNK,DNL,DBV,SON,TON,DCS,BCS,ONT,ODT,DGD,NTD,SKK,SKX,MVT,CQP,"
   "DDT,DTL,DGT,TSC,RPK,RDT,RPT,RST,RDN,RPN,RSN,MNC,TSN,TSL,SKC,COC,SKS,"
   "LNK,LNQ,LNC,DVH,BHK,DYT,CAN,DCH,TSK,LMU,TIN,DTT,LUK,LUC,LUN")))))))) ; Liet ke cac loai dat
    ;(setq t1 (getvar "Millisecs"))

    (foreach e ls
        (setq g (entget e) p (dxf 11 g) h (dxf 40 g) x (car p) y (cadr p))
        (setq l5 (vl-sort (vl-remove-if 'listp (mapcar 'cadr (ssnamex    (ssget "C" (list (- x h) (- y (* 4.5 h))) (list (+ x h) (+ y h h))
                                             (list '(-4 . "<AND") '(0 . "TEXT")  '(-4 . ">") (cons 11 (list (- x fz) 0 0) ) '(-4 . "<") (cons 11 (list (+ x fz) 0 0) ) '(-4 . "AND>")))))    )
                                                (function (lambda (e1 e2) (> (cadr (dxf 11 (entget e1))) (cadr (dxf 11 (entget e2))))))))
        (if (and (= 5 (length l5 )) (= 1(vl-position e l5)))
            (progn (setq i 0)
                (foreach f l5
                    (ModDxf 8 (nth i ll)(entget f))
                    (setq i (1+ i)))
                )
             (entmake (list (cons 0 "CIRCLE") (cons 10 p) (cons 40 (* 5 h)) (cons 62 6) )) ; Danh dau vi tri sai
            )
        )
    ;(/ (- (getvar "Millisecs") t1) 1000.)
)

  • 0

#10 hg_aum

hg_aum

    biết vẽ circle

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

Đã gửi 05 October 2013 - 03:47 PM

bạn phamthanhbinh và bạn ndtnv ơi.bạn hiểu đúng ý của mình rồi đấy bạn hãy hoàn thiện lisp giúp mình với nhé.Mình muốn bạn thêm lisp của bạn ndtnv vào trước để mình kiểm tra dữ liệu trước,rồi mới thực hiện lệnh lọc bạn nhé.


  • 0

#11 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 October 2013 - 12:08 AM

bạn phamthanhbinh và bạn ndtnv ơi.bạn hiểu đúng ý của mình rồi đấy bạn hãy hoàn thiện lisp giúp mình với nhé.Mình muốn bạn thêm lisp của bạn ndtnv vào trước để mình kiểm tra dữ liệu trước,rồi mới thực hiện lệnh lọc bạn nhé.

Hề hề hề,

Mình thấy cách lấy nhóm text của bác ndtnv hay hơn cách làm của mình nên mình chỉ bổ sung vào lisp của bác ấy phần check và tạo layer mới nếu chưa có cũng như xác định màu cho các layer để bạn dễ kiểm soát mà thôi. Bạn dùng thử xem đã hài lòng chưa nhé.

http://www.cadviet.c.../3/5194_plt.lsp


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

#12 hg_aum

hg_aum

    biết vẽ circle

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

Đã gửi 11 October 2013 - 07:40 PM

cám ơn bạn phamthanhbinh và ndtnv vì lisp plt nhé,mình dùng thấy rất  ok!


  • 0