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

tnmtpc

Thành viên
  • Số lượng nội dung

    365
  • Đã tham gia

  • Lần ghé thăm cuối

  • Ngày trúng

    7

Bài đăng được đăng bởi tnmtpc


  1. Chào bác tnmtpc,

    Bác thử kiểm tra lại mấy cái block fpt_alt, FPT_NUM, fpt_des của bác xem sao. Lisp của bác hoa35ktxd không tạo block mới mà chỉ insert các block cũ của bác vào bản vẽ mà thôi. Có nhẽ mấy cái block của bác có vấn đề gì đó bác ạ....

    Thế thì chưa trúng ý mình rồi. Bản vẽ nguồn của mình (bản vẽ chỉ có đối tượng text) đã up đâu có chứa block bliết gì đâu, yêu cầu lisp chuyển toàn bộ các text thành block, các bạn xem lại giúp đi


  2. Chào bác tnmtpc,

    Bác chạy thử cái lisp đã bổ sung này nhé. Hy vọng giải quyết được các vấn đề bác đã nêu.

    Khi lisp yêu cầu bác chọn đối tượng cao độ, tên điểm, hay mô tả điểm, nếu trên bản vẽ không có các đối tượng này hoặc bác không muốn chọn chúng thì bác chỉ cần nhấn Enter để bỏ qua việc chọn và lisp sẽ tiếp tục chạy cho đến cuối cùng.

    (defun c:atbl (/ en els ln st ht gt pt txt cl at1 at2 at3 n i )
    (command "undo" "be")
    (setq cl (getvar "clayer"))
    (setq CMD (getvar "CMDECHO")
           OSM (getvar "OSMODE")
           ATT (Getvar "ATTDIA")
    )
    (setvar "CMDECHO" 0)
    (setvar "OSMODE" 0)
    (setvar "ATTDIA" 0)
    (if (= (tblsearch "block" "fpt_alt1") nil)
    (progn
    (setq en (car(entsel "\n Chon doi tuong cao do")))
    (if (/= en nil)
    (progn
    (setq els (entget en)
           ln (cdr (assoc 8 els))
           st (cdr (assoc 7 els))
           ht (cdr (assoc 40 els))
           gt (cdr (assoc 50 els))
           pt (cdr (assoc 10 els))
           txt (cdr(assoc 1 els))
    )
    (command "layer" "s" ln "")
    (command "attdef" "v" "" "fpt_alt" "" txt "s" st pt ht gt)
    (setq at1 (entlast))
    (command "block" "FPT_ALT1" pt at1 "" )))))
    (if (= (tblsearch "block" "fpt_num1") nil)
    (progn
    (setq en (car(entsel "\n Chon doi tuong ten diem")))
    (if (/= en nil)
    (progn
    (setq els (entget en)
           ln (cdr (assoc 8 els))
           st (cdr (assoc 7 els))
           ht (cdr (assoc 40 els))
           gt (cdr (assoc 50 els))
           pt (cdr (assoc 10 els))
           txt (cdr(assoc 1 els))
    )
    (command "layer" "s" ln "")
    (command "attdef" "v" "" "fpt_num" "" txt "s" st pt ht gt)
    (setq at2 (entlast))
    (command "block" "FPT_NUM1" pt at2 "" )))))
    (if (= (tblsearch "block" "fpt_des1") nil)
    (progn
    (setq en (car(entsel "\n Chon doi tuong mo ta diem")))
    (if (/= en nil)
    (progn
    (setq els (entget en)
           ln (cdr (assoc 8 els))
           st (cdr (assoc 7 els))
           ht (cdr (assoc 40 els))
           gt (cdr (assoc 50 els))
           pt (cdr (assoc 10 els))
           txt (cdr(assoc 1 els))
    )
    (command "layer" "s" ln "")
    (command "attdef" "v" "" "fpt_des" "" txt "s" st pt ht gt)
    (setq at3 (entlast))
    (command "block" "FPT_DES1" pt at3 "" )))))
    (command "layer" "s" cl "")
    (alert "\n Chon cac doi tuong can thay the")
    (setq ss (ssget  '((0 . "TEXT")))
           n (sslength ss)
           i 0)
    (while (< i n)
    (setq en (ssname ss i)
           els (entget en)
           ln (cdr (assoc 8 els))
           st (cdr (assoc 7 els))
           ht (cdr (assoc 40 els))
           gt (cdr (assoc 50 els))
           pt (cdr (assoc 10 els))
           txt (cdr(assoc 1 els))
    )
    (if (and (= ln "ELEVATIONS") (/= (tblsearch "block" "fpt_alt1") nil))
    (progn
    (command "erase" en "")
    (command "insert" "FPT_ALT1" pt "" "" "" txt "")))
    (if (and (= ln "NUMBERS") (/= (tblsearch "block" "fpt_num1") nil))
    (progn
    (command "erase" en "")
    (command "insert" "FPT_NUM1" pt "" "" "" txt "")))
    (if (and (= ln "DESCRIPTION") (/= (tblsearch "block" "fpt_des1") nil))
    (progn
    (command "erase" en "")
    (command "insert" "FPT_DES1" pt "" "" "" txt "")))
    (setq i (1+ i))
    )
    (setvar "CMDECHO" CMD)
    (setvar "OSMODE" OSM)
    (setvar "ATTDIA" ATT)
    (command "undo" "e")
    (princ)
    )
    

    Chúc bác vui...

    Phamthanhbinh xem lại giúp : sau khi chọn các đối tượng theo yêu cầu của lisp, tất cả các block thông tin của mỗi điểm đều có giá trị y chang, ví dụ ban đầu chọn điểm 4 có cao độ là 3.83 thì kết quả tất cả các điểm đều có ATL là 3.83, NUM là 4. Đối với DES cũng vậy. Làm phiền các bạn nhiều quá


  3. Tôi đã sửa lại đôi chút, có thể chạy được cho các tình huống bác đưa ra.

    Đầu tiên chọn POINT (vàng) tiếp theo chọn ALT, NUM, DES.

    - Nếu chỉ có mỗi NUM bác cứ chọn cả 3 lần là NUM

    - Nếu chỉ có NUM và ALT thì chọn đúng ALT và NUM còn khi hỏi DES bác cứ chọn bất kỳ cái nào cũng được

    - Nếu chỉ có NUM và DES thì chọn ALT là cái nào cũng được nhưng phải chọn NUM và DES cho đúng.

    Việc chọn những giá trị trên chỉ nhằm mục đích xác định vị trí của các giá trị đó so với POINT thôi còn khi chạy chính thức nó chỉ quan tâm đến các TEXT đó nằm trên lớp nào để chèn BLOCK tương ứng.

    trục trặc rồi hoa35ktxd ơi: sau khi chọn xong, chương trình chạy rẹc rẹc nhìn dòng lệnh thấy đã mắt lắm nhưng cuối cùng chỉ có các point trên màn hình, còn các thứ khác mất tiêu


  4. Cám ơn Phamthanhbinh, hoa35ktxd . cả hai lisp đều hoạt động tốt, lúc đầu mình chạy lisp của Phamthanhbinh lại bị xuất hiện hộp thoại và bắt nhập giá trị các thuộc tính, sau đó chạy lisp của hoa35ktxd thì ổn và chạy lại lisp của Phamthanhbinh (lúc này đã thiết lập ATTDIA về 0) kết quả như ý. Tuy nhiên cả hai lisp còn một chút xíu lỗi là trong trường hợp bản vẽ không có mô tả (DES) thì không lấy gì để chọn, nếu Enter thì không cho kết quả chuyển đổi block. Đây là trường hợp sẽ gặp, thường thì file dữ liệu khi nhập khẩu điểm vào Cad bắt buột phải có là tên điểm(NUM), điểm chèn (POINT), còn các thuộc tính khác như độ cao (ALT) chỉ có trong bản vẽ địa hình, địa chính thì không, mô tả điểm (DES) có thể có hoặc không. Hai lisp trên áp dụng tốt cho trường hợp của mình, ở đây mình muốn lisp áp dụng phổ biến cho nhiều trường hợp, do vậy các bạn có thể chỉnh sửa lại những thuộc tính nào không có (ALT hoặc DES) thì trả lời tại dòng nhắc lệnh là Enter, các thuộc tính nào có thì chuyển block bình thường.

    Lần nữa cám ơn các bạn

    • Vote tăng 1

  5. Gửi bác đoạn code sau xem có được không.

    Vì trong bản vẽ của bác có sẵn các Block rồi nên tôi không tạo Block.

    Nguyên lý hoạt động:

    Chọn độ cao (đỏ), chọn điểm chèn (vàng), chọn số (xanh) của 1 cụm để tính toán khoảng cách của các Text với Point, cái này bác phải thống nhất với cách tạo Block của bác, sau đó chương trình sẽ xóa các Text đi và chèn Block tương ứng vào vị trí đó cho bác.

    Loay hoay mãi vì không để ý bản vẽ của bác có các đối tượng nằm trên cao độ khác nhau nên cứ loạn xị ngậu.

    Vẫn không làm được:

    Sau khi gọi lệnh, Chọn độ cao (đỏ), chọn điểm chèn (vàng), chọn số (xanh)-> xuất iện hộp thoại Enter Attributes, và cứ thế mà OK mãi mãi, chẳng thấy có hiệu ứng gì. Các Bác xem lại giúp

    Để thống nhất vị trí các thuộc tính của điểm ( NUM. ALT. DES) với điểm chèm, bản vẽ NXYZC.dwg đã được cập nhật lại ở link trên


  6. Chào bạn tnmtpc,

    Không biết cái này có đúng ý bạn không??? Do không thấy cái thuộc tính FPT_DES nên mình không tạo block cho cái thuộc tính này được. Các block FPT_ALT và FPT_NUM do trên bản vẽ bạn gửi đã có nên mình đổi tên nó là FPT_ALT1 và FPT_NUM1.

    Block FPT_ALT1 có màu theo lớp của thuộc tính cao độ còn block FPT_NUM1 thì có màu theo lớp của thuộc tính tên điểm. Các block này khi bạn insert nó vào bản vẽ sẽ có lớp là lớp hiện hành của bản vẽ bạn ạ chứ không phải là chúng nằm trên các lớp khác nhau đâu...... Lớp (layer) chỉ là của thuộc tính mà thôi.

    Việc tạo block cho thuộc tính FPT_DES theo mình nghĩ cũng tương tự như vậy song do chưa có cái mẫu nên mình chưa làm, bạn có thể tự làm tiếp nhé.

     

    Theo mình nghĩ thì bạn có thể tạo 1 block có chứa cả 2 (hay 3) thuộc tính là FPT_ALT, FPT_NUM, (FPT_DES) và cả point nữa sẽ tiện dụng hơn khi bạn phải sửa chữa nhiểu đối tượng bạn ạ.

    Sau khi làm được các block này thì mình nghĩ việc giải quyết cái block chung đó không còn khó nữa bạn ạ.

    Chúc bạn vui.

    Cám ơn bạn đã quan tâm giúp mình, nhưng lisp không cho ra kết quả gì cả: sau khi gõ lệnh nó bảo chọn đối tượng cao độ, tiếp theo chọn đối tượng tên điểm, và dòng lệnh không nhắc làm gì cả, bản vẽ thì vẫn vậy. Tiếp tục gọi lệnh, nó bảo chọn đối tượng cao độ, chọn xong nó yêu cầu có định nghĩa lại hay không, kết quả nó tạo ra một block FPT_ALT đè lên text độ cao

    Đây là nội dung hiển thị của dòng lệnh:

    Command: atbl

     

    Chon doi tuong cao do

    Chon doi tuong ten diem

    Command: atbl

     

    Chon doi tuong cao do

    Yes or No, please.

    Redefine it? [Yes/No] : n

     

    Nôm na là muốn chuyển nhanh từ bản vẽ một (textXYZ) sang bản vẽ hai (blockXYZ): các text trở thành block tương ứng, chọn hàng loạt chứ không phải pick từng cái một

    bản vẽ dưới đây có chứa DES

    http://www.cadviet.com/upfiles/3/nxyzc_5.dwg

    Chuyển các text trong bản vẽ này thành block


  7. Có phải bác muốn tạo thành Block có chứa 3 đối tượng: Point đồng thời là Basepoint và 2 Text liền kề ko?

    Nếu đúng như thế tôi sẽ nghiên cứu.

    Không phải block có 3 đối tượng, tương ứng với mỗi text sẽ chuyển thành một block có 1Tag với tên tag trùng tên block và thuộc một lớp riêng

     

    Chào bác tnmtpc,

    Thực ra mình cũng đã thử làm theo yêu cầu của bác nhưng quả thật là có chỗ bí. Nếu chỉ tạo thành một block thông thường thì có nhẽ có thể không phiền lắm, nhưng để tạo thành block có chứa các thuộc tính đúng như bác yêu cầu thì hơi gay. Cái bí nhất chính là làm sao chuyển được các mã dxf của các text đã có thành các mã chứa trong thuộc tính của block. Mình loay hoay mà chưa có giải pháp nào khả dĩ. Bác cố gắng chờ thêm vậy...

    Chúc bác vui.

     

    À mà sao mấy hôm nay không thể load mấy cái file bác gửi về để thí nghiệm cả bác ạ. Bác thử gửi lại xem nhé.

    Link vẫn bình thường mà ,để mình gửi lại. Giúp mình nhé!

    http://www.cadviet.com/upfiles/3/txttoblk.rar


  8. Mình có một bản vẽ bao gồm các point với các thông tin của point là tên điểm, độ cao và mô tả dạng text đi kèm:

    http://www.cadviet.com/upfiles/3/textxyz.dwg

    Muốn chuyển nhanh sang định dạng block như bản vẽ sau:

    http://www.cadviet.com/upfiles/3/blockxyz.dwg

    Nhờ các bạn viết lisp: nhập lệnh, quét chọn những đối tượng cần chuyển, Enter.

    (Tag block tên điểm là FPT_NUM, Tag của độ cao là FPT_ALT, Tab của mô tả là FPT_DES)

    Cám ơn trước

    Chưa có ai giúp mình cái này ??


  9. Chào tnmtpc

    Có 1 điểm mà Tue_NV muốn hỏi bạn tnmtpc là :

    Trong file blockxyz.dwg

    Tag block tên điểm là FPT_NUM -> ten Block là : FPT_NUM

    Tag của độ cao là FPT_ALT -> ten Block là : FPT_ALT

    Còn Tab của mô tả là FPT_DES là Tab gì? trong bản vẽ thấy không thể hiện và không hiểu nó là cái gì nữa?

    Còn point thì sao?

    Đại khái là không hiểu được ý của bạn?

    Bạn vui lòng giải thích rõ nhé

    Chà thiếu sót quá, tên tag của mô tả trùng với tên block như hai thằng kia vậy. Mô tả ở đây là ghi chú cho điểm ấy mà, do trong file dữ liệu thiếu mất trường này này nó không có trên bản vẽ. Point là dạng ký hiệu chuẩn của Cad thôi mà, vị trí của nó là điểm chèn các thông tin của điểm.

    Nôm na là hai bản vẽ trên nếu xét về tọa độ thì không có gì thay đôi, nhưng có một số tiện ích không thực thi với đối tượng text nên phải chuyển sang block để thao tác


  10. Mình có một bản vẽ bao gồm các point với các thông tin của point là tên điểm, độ cao và mô tả dạng text đi kèm:

    http://www.cadviet.com/upfiles/3/textxyz.dwg

    Muốn chuyển nhanh sang định dạng block như bản vẽ sau:

    http://www.cadviet.com/upfiles/3/blockxyz.dwg

    Nhờ các bạn viết lisp: nhập lệnh, quét chọn những đối tượng cần chuyển, Enter.

    (Tag block tên điểm là FPT_NUM, Tag của độ cao là FPT_ALT, Tab của mô tả là FPT_DES)

    Cám ơn trước


  11. anh chỉ e cách nào để biết tên lẹnh vói

    có một chương trình dùng để dịch ngược file fas thành file lisp (tất nhiên không phải file lisp hoàn chỉnh) nhưng đọc được. tên lệnh là những từ nằm sau C:

    Chương trình này đã đề cập trên diễn đàn này rồi, bạn chịu khó search với từ khoá là : dịch ngược


  12. Cái này mình mạn phép chỉnh bản quyền của tác giả 1 ty để làm theo yêu cầu của bạn

    Có gì pm nhé

    ;; free lisp from cadviet.com
    (defun c:RFT (/ code data f h line pt pxy spc txt stt ten)
    				;Read File Txt
         ;|  By : Gia Bach, gia_bach @  www.CadViet.com             |;
     (vl-load-com)
     (defun Split (str / i kitu line lst txtPhanbiet)
       (setq i 1
      txtPhanbiet
       (strcat (chr 9) (chr 32) (chr 44))
       )
       (while (< i (strlen str))
         (setq kitu (substr str i 1))
         (if (vl-string-search kitu txtPhanbiet)
    (progn
      (if (null Lst)
        (setq Lst (list (substr Str 1 (- i 1))))
        (setq Lst (append Lst (list (read (substr Str 1 (- i 1))))))
      )
      (setq	Str (substr Str (+ i 1))
    	i   1
      )
    )
    (setq i (1+ i))
         )
       )
       (setq Lst (append Lst (list Str)))
     )
     (or *h* (setq *h* 2))
     (initget 6)
     (setq	h (getdist (strcat "\nNhap chieu cao Text <" (rtos *h*) "> :")
      )
     )
     (if h
       (setq *h* h)
       (setq h *h*)
     )
     (if (setq ten (getfiled "Chon File txt" (getvar "dwgprefix") "txt" 8))
       (progn
         (or (tblsearch "layer" "Point")
      (command "-layer" "n" "Point" "")
         )
         (or (tblsearch "layer" "Sothutu")
      (command "-layer" "n" "Sothutu" "c" 3 "Sothutu" "")
         )
         (or (tblsearch "layer" "Caodo")
      (command "-layer" "n" "Caodo" "c" 4 "Caodo" "")
         )
         (or (tblsearch "layer" "Code")
      (command "-layer" "n" "Code" "c" 2 "Code" "")
         )
         (setq spc	(vla-get-ModelSpace
    	  (vla-get-ActiveDocument (vlax-get-Acad-Object))
    	)
         )
         (setq f (open (findfile ten) "r"))
         (while (setq Line (read-line f))
    (if (wcmatch
          Line
          (strcat "*" (chr 9) "*,*" (chr 32) "*,*`" (chr 44) "*")
        )
      (progn
        (setq data (split Line)
    	  code (last data)
        )
        (if	(and
    	  (= (vl-list-length data) 5)
    	  (setq pt (vl-remove code (cdr data)))
    	  (not (vl-catch-all-error-p
    		 (vl-catch-all-apply 'vlax-3d-point pt)
    	       )
    	  )
    	)
    ;;;neu du lieu data co 5 bien so
          (progn
    	(setq stt (car data)
    	      pXY (list (car pt) (cadr pt))
    	)
    	(vla-put-Layer
    	  (vla-addpoint spc (vlax-3d-point pXY))
    	  "Point"
    	)
    	(vla-put-Layer
    	  (setq	txt (vla-addtext
    		      spc
    		      stt
    		      (vlax-3d-point (list 0 0 0))
    		      h
    		    )
    	  )
    	  "Sothutu"
    	)
    	(vla-put-Alignment txt 8)
    	(vla-put-TextAlignmentPoint txt (vlax-3d-point pXY))
    	(vla-put-Layer
    	  (setq	txt (vla-addtext
    		      spc
    		      code
    		      (vlax-3d-point (list 0 0 0))
    		      h
    		    )
    	  )
    	  "Code"
    	)
    	(vla-put-Alignment txt 6)
    	(vla-put-TextAlignmentPoint
    	  txt
    	  (vlax-3d-point (polar pXY 0 (* 0.2 h)))
    	)
    	(vla-put-Layer
    	  (vla-addtext spc (caddr pt) (vlax-3d-point pXY) h)
    	  "Caodo"
    	)
          )
          ;;het progn list data=5
    ;;;neu du lieu data co 4 bien so (ban co the dung ham COND hoac if de bay loi
          (progn
    	(setq pt (vl-remove code (cdr data)))
    	(not (vl-catch-all-error-p
    	       (vl-catch-all-apply 'vlax-3d-point pt)
    	     )
    	)
    	(setq stt (car data)
    	      pXY (list (car pt) (cadr pt))
    	)
    	(vla-put-Layer
    	  (vla-addpoint spc (vlax-3d-point pXY))
    	  "Point"
    	)
    	(vla-put-Layer
    	  (setq	txt (vla-addtext
    		      spc
    		      stt
    		      (vlax-3d-point (list 0 0 0))
    		      h
    		    )
    	  )
    	  "Sothutu"
    	)
    	(vla-put-Alignment txt 8)
    	(vla-put-TextAlignmentPoint txt (vlax-3d-point pXY))
    	(vla-put-Layer
    	  (vla-addtext spc (last data) (vlax-3d-point pXY) h)
    	  "Caodo"
    	)
          )
    ;;;het progn list=4
        )
      )
    )
         )
       )
     )
     (princ)
    )

    Lisp có trục trặc:

    Nếu hàng nào có đủ 5 cột thì nó hiểu cột thứ 5 là "độ cao" còn cột thứ tư bị lờ đi

    Trong trắc địa trục X là trục bắc, Y là trục đông, khác với trục toạ độ Đề các trong toán học, do vậy lisp đã thể hiện vị trí points sai.

    Các point được bắn vào cad là 2D , nên gán Z cho nó để còn sử dụng vào việc tạo bình đồ. Nếu ai không cần chế độ 3D point thì chỉ cần sử dụng lệnh là phẳng là xong

    Bác xem lại các vấn đề trên.


  13. Lisp yêu cầu cấu trúc file điểm đo có 5 cột : STT X Y Z Code.

    Data của file toado9.txtntdau.txt chỉ có 4 cột : STT X Y Z làm sao lấy đuợc giá trị Code?

    pótay :(

    Yêu cầu không rõ ràng, do vậy làm khó cho GIA_BACH. pó tay là phải. Để mình nói hộ cho các bạn ấy yêu cầu thế này nhé:

    Yêu cầu một lisp như sau: sau khi gõ lệnh lisp, xuất hiện hộp thoại chọn file dữ liệu. File dữ liệu có định dạng STT X Y Z CODE, tuy nhiên không nhất thiết phải có đầy đủ 5 cột, nhưng tối thiểu phải có 4 cột trong đó 3 cột bắt buột là STT X Y, cột còn lại là tùy chọn (có thể là Z có thể là CODE). Về kiểu phân tách dữ liệu giữa các cột có thể là dấu tab, dấu cách, dấu phảy nhưng kiểu nào một kiểu không thể lẫn lộn nhiều kiểu trong một file. Thực thể bắn vào Cad có thể là point kèm theo các thông tin STT Z CODE được phân lớp riêng, hoặc có thể là block do người sử dụng lựa chọn.

    Diễn giải như thế không biết đã trúng ý chưa


  14. Bạn thử Lisp : Xuất tọa độ và các Tag (STT, mã code) của Block Attribute ra file Text (Bao gồm : Số thứ tự, text mã Code, toạ độ X-Y-Z)

    Truờng hợp cao độ Z của Block bị đưa về "0" thì lấy giá trị của Tag Cao độ (EL.EV).

    (defun c:exTA(/ Caodo Des ent i obj pos ss str Stt tmp z zero)
     (vl-load-com)
     (princ "\nChon doi tuong can xuat thuoc tinh :" )
     (if (and
    (setq ss (ssget (list (cons 0 "INSERT")(cons 66 1)(cons 2 "D_chitiet"))))
    (setq tmp (getfiled "Ten file xuat toa do" (getvar "dwgprefix") "txt" 1))  )
       (progn
         (setq tmp (open tmp "a") i -1)
         (write-line "STT,DESCP,X,Y,Z" tmp)
         (while (setq ent (ssname ss (setq i (1+ i))))
    (setq obj (vlax-ename->vla-object ent)
          pos (mapcar 'rtos (vlax-get obj 'InsertionPoint)))
    (foreach att (vlax-invoke obj 'GetAttributes)
      (cond
        ( (= (vla-get-TagString att) "EL.EV")
          (setq Caodo (vla-get-TextString att)) )
        ( (= (vla-get-TagString att) "DESCP")
          (setq Des (vla-get-TextString att)) )
        ( (= (vla-get-TagString att) "POINT")
          (setq Stt (vla-get-TextString att)) ))  )
    (if (and
          (= 0 (atof (setq z(caddr pos))))
          (/= 0 (atof Caodo)))
      (setq z Caodo))
    (write-line (strcat Stt (chr 44) Des (chr 44)
    		    (car pos) (chr 44) (cadr pos) (chr 44) z  )
      	    tmp))
         (close tmp)) )
     (princ))

    Mình đã chọn đối tượng là các khối thuộc tính nhưng không thấy gì cả

×