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. tôi chưa thấy bản vẽ có thể hiện điểm mia + ghi chú (vì bản thân điểm mia khi nối thành các đối tượng, được căn cứ trên ghi chú điểm) do đó, tôi thường biên tập khi xuất bản vẽ giao chủ đầu tư tất cả các trạm máy đều qui về một layer caodo (dung lượng file nhẹ, ít layer đỡ gặp erro. . .) còn muốn dùng layer để quản lý từng đối tượng, tôi thường dùng tiện ích group trong acad.

    Ý của Vbao là đúng rồi, như tnmtpc đã đề cập, ghi chú chỉ áp dụng khi cần thiết, không phải điểm mia nào cũng có ghi chú, chẳng hạn, điểm mia đại diện cho điểm lỗ khoan, mà trong khu vực đo có nhiều lỗ khoan, mỗi lỗ khoan có một tên gọi riêng mà không thể lấy tên điểm mia để thay thế tên lỗ khoan được, yêu cầu sản phẩm phải có ghi chú tên kèm theo, do vậy có thể ghép tên điểm và code chung một layer, nhưng những ghi chú đặc biệt như trên phải nằm trên một layer. như vậy đằng nào cũng quản lý theo lớp, thêm một lớp nữa cũng không là vấn đề. Mình nghĩ như vậy, các bạn thấy thế nào?


  2. Tôi cho rằng nên sử dụng text 2D (tận dụng các lệnh hiệu chỉnh khác của accad như : find, mo . . hoặc các lisp tiện ích khác)

    Block + att nếu tôi nhớ không lầm chỉ hiển thị được 256 ký tự ! ( hihi cái này phải hỏi lại anh Hoành) trong khi các anh em đi mia nhiều khi báo ghi chú điểm nhiều hơn số ký tự này, muốn hiệu chỉnh thuộc tính, sẽ khó hơn cho người mới học cad (bạn thử tượng tượng nếu tôi cần nâng hoặc hạ cao độ điểm mia hàng loạt do có sai sót , nếu dùng text thuần túy tôi có thể sử dụng tiện ích caltext.lsp của cadviet hiệu chỉnh một cách dễ dàng)

    Layer không nên phân biệt : caodo, code, tendiem, ghichu. . .vì trong một bản vẽ (nhất là các bản vẽ tổng thể diện tích khảo sát lớn) sẽ có nhiều trạm máy, nếu vẽ một đối tượng địa vật do nhiều trạm máy đọc tới, các text cao độ nằm chồng đè lên nhau dày đặc, nếu tôi muốn tắt layer caodo của trạm máy 1 để dễ quan sát các đối tượng của trạm máy 2 sẽ khó khăn vì layer caodo có cả trong 2 trạm máy ! do đó tôi đề nghị :

    dòng 1 : text cao độ

    dòng 2 (text height = ½ text cao độ) : số TT - ghi chú điểm – mã điểm (có ký hiệu đặc biệt để phân biệt )

    tất cả sẽ cùng trên 1 layer của trạm máy do

    điểm chèn text nên để mặc định (Justify = left) sau này nếu cần move về dấu chấm thập phân của text cao độ ta sử dụng lệnh fi của acad đễ thực hiện

     

    http://www.cadviet.com/upfiles/diahinhRE.dwg

    Nếu không tạo layer riêng sẽ rất bất tiện, vì khi in bản vẽ địa hình chỉ cần in các địa vật, cao độ. điểm mia,ghi chú (nếu cần thiết), trong khi đó mã điểm không ẩn được thì gay lắm, bản vẽ khi in ra "nặng lắm"


  3. Chưa hiểu câu hỏi của bạn!

     

    Rất vui nếu bạn chia sẻ lisp này cùng mọi người.

    Ý của dnhqs là giá trị thuộc tính của khối (ví dụ cd là 20.15) khi bung khối , tất cả text hiển thị là cd, không phải là 20.15

    phải vậy không dnhqs? Đó là nhược điểm khi tạo block


  4. Xin có ý kiến:

    Trong CAD nên sử dụng Block-Att kg nên dùng text vì dễ dàng truy xuất mà kg bị ảnh hưởng bởi các đối tượng text khác trong bản vẽ, và có thể view hoặc ẩn các cột dữ liệu khi cần. Còn về vị trí chính là điểm chèn của Block-Att

    Hơi khó xử một chút là nếu tạo các đối tượng là Block, các text, kể cả point đều là thành phần của block giống như cogo point trong Land desktop. khi in bản vẽ có một số thành phần phải ẩn đi như code hoặc ghi chú, nếu các đối tượng là text nằm trên các layer riêng biệt, khi in, tắt layer chứa đối tượng không cần in sẽ tiện hơn, còn tạo riêng mỗi text là một block thì có nên không? mọi người cùng bàn kỹ thử nhé, để tìm ra giải pháp tối ưu


  5. một số nhận xét:

    - trong excel chỉ nên có 1 sheet dữ liệu nhập, dùng chung cho địa chính và địa hình, sau khi tính toán X Y Z (theo quan điểm của từng cá nhân), sẽ link và xuất qua sheet 2 theo yêu cầu từng ngành (ex: địa chính không sử dụng cao độ, địa hình có sử dụng . . .)

    người lập trình chỉ cần lưu ý các điểm sau :

    - save file *.xls theo định dạng nào? comma hay tab delimited ? để dễ lập trình, trong file *.txt bao gồm các dữ liệu nào?

    (số TT điểm - X - Y - Z - ghi chú - mã điểm) sau đó import vào cad

    - trong *.dwg nên sử dụng font .shx, các dữ liệu như số TT, ghi chú, mã điểm có text height = 1/2 text cao độ (dễ quan sát khi có nhiều điểm mia gần nhau)

    - text cao độ ghi trong bản vẽ là text 2D hay là block có Att (giải quyết điểm point nằm trùng với dấu phân cách thập phân)

    - point là 2D hay 3D? (điều này ành hưởng đến cách vẽ đường đồng mức)

    - các yếu tố trên (point, text, block có att . . .dạng 2D hoặc 3D) nếu xuất ngược lại về excel dễ dàng hay không? (dùng để thêm "mắm muối" vào dữ liệu cho . . .phong phú) :)

    một vài ý kiến xin đóng góp. Thanks

    Ok! "dự án Land Cadviet Utility " khởi động rồi đấy! Vbao góp ý rất thực tế, nhưng địa chính và địa hình là hai anh hòan tòan độc lập nhau, rất hiếm có sự kết hợp này, nếu có thì vẫn phải có hai sản phẩm bản vẽ riêng. Vấn đề đặt ra ở đây là dự án Land Cadviet Utility (cứ gọi thế cho nó óach) là cầu nối giữa Excel và Cad, do đó dữ liệu để từ Excel sang Cad phải được các nhà trắc địa xử lý hòan chỉnh. Đối với bản vẽ địa hình thì dữ liệu phải gồm: tên điểm, tọa độ X,Y,Z, code và ghi chú, đối với địa chính gồm có tọa độ X,Y, code, ghi chú, còn các thông tin khác như chủ sử dụng phải được sử lý bên Cad (hai file mẫu trang sổ đo .xls nên xem là hai file độc lập). Thống nhất với Vbao là định dạng kiểu file txt trong hộp thọai chọn dữ liệu để nhập nên đa dạng (*.CSV, *.TXT ...), đối với Font, text height nên là tùy chọn trong hộp thọai nhập, kể cả layer chứa đối tượng, text mình nghĩ nên là 2D thì hay hơn, vấn đề dấu chấm thập phân trùng với point có lẽ Bác Ssg giải quyết được vì độ cao điểm chi tiết luôn lấy hai số lẻ, nếu không trùng thì cũng chẳng sao. Đối với địa hình thì đương nhiên point phải là 3D (vì khả năng còn giao tiếp với các chương trình 3D khác nữa chớ

    Xuất ra file báo cáo: chủ yếu dành cho bản vẽ địa chính, sau khi nối điểm tạo thành thửa đất, chương trình phải đánh số thửa tự động, tính diện tích, còn lọai đất và tên chủ sử dụng mình nghĩ là phải nhập bằng thủ công thôi. Sau khi hòan chỉnh bản vẽ, xuất ra file báo cáo có các thông tin sau : mảnh bản đồ, số thửa, diện tích, lọai đất, tên chủ sử dụng

    Có gì trao đổi tiếp nhé


  6. mình sẵn sàng đợi tnmtpc phân công đây

    Hôm nay mới chính thức tiếp kiến với Vbao, rất mong sự nhiệt tình của các bạn để ý tưởng của Bác Ssg và các thành viên khác trong diễn đàn sớm thành "chánh quả", trước hết mình post file mẫu để các bạn trong nghề tham khảo trước, có thông tin phản hồi, tu chỉnh lại rồi mới "đệ trình" lên trên chớ! Trong file, mình tạo riêng hai mảng địa chính và địa hình, mỗi mảng có file .xls và .dwg tương ứng. Sau khi tu chỉnh rồi mình mới đề ra các hành tự, tổng hợp thành các yêu cầu theo ý Bác Ssg

    http://www.cadviet.com/upfiles/mau_2.rar


  7. Đoạn lisp dưới đây đã sửa được lỗi đọc lăm-năm.

    (setq
     donvi	 (list " nghin" " trieu" " ty")
     lstso	 (list
       (cons "0" " khong")
       (cons "1" " mot")
       (cons "2" " hai")
       (cons "3" " ba")
       (cons "4" " bon")
       (cons "5" " nam")
       (cons "6" " sau")
       (cons "7" " bay")
       (cons "8" " tam")
       (cons "9" " chin")
       (cons "0" " muoi")
     )
     s_tram " tram"
     s_muoi " muoi"
     s_linh " linh"
     s_tu	 " tu"
     s_lam	 " lam"
    )
    (defun c:doctext ()
     (setq	ent (car (entsel "\nHay pick vao text so can doc: "))
    tt  (entget ent)
    gt  (cdr (assoc 1 tt))
    ok  t
    lst (mapcar '(lambda (x)
    	       (if (or (> x 57) (< x 48))
    		 (setq ok nil)
    	       )
    	     )
    	    (vl-string->list gt)
        )
     )
     (if ok
       (progn
         (setq
    p  (getpoint "\nPick toa do cua text moi: ")
    tt (subst (cons 1 (substr (docso gt) 2)) (cons 1 gt) tt)
    tt (subst (cons 10 p) (assoc 10 tt) tt)
         )
         (entmake tt)
       )
       (alert "\nText vua chon khong phai la so nguyen duong")
     )
    )
    (defun docso (str)
     (defun doc1 (so)
       (cdr (assoc so lstso))
     )
     (defun doc3 (a b c)
       (if	(= a "0")
         (setq a1 "")
         (setq a1 (strcat (doc1 a) s_tram))
       )
    
       (if	(= b "0")
         (if (/= a "0")
    (setq b1 s_linh)
    (setq b1 "")
         )
         (if (= b "1")
    (setq b1 s_muoi)
    (setq b1 (strcat (doc1 B ) s_muoi))
         )
       )
    
       (setq c1
       (cond
         ((= c "0") "")
         ((and (= c "4") (/= b "1")) s_tu)
         ((and (= c "5") (/= b "0")) s_lam)
         (t (doc1 c))
       )
       )
    
       (strcat a1 b1 c1)
     )
    
     (setq	lstchar	 (reverse (mapcar 'chr (vl-string->list str)))
    len	 (length lstchar)
    dvht	 0
    kq	 ""
    strdonvi ""
     )
    
     (while (>= (length lstchar) 3)
       (setq
         kqht     (strcat
    	 (doc3 (nth 2 lstchar) (nth 1 lstchar) (nth 0 lstchar))
           )
         kq       (strcat kqht strdonvi kq)
         lstchar  (cdddr lstchar)
         dvht     (if (= dvht 2)
    	 0
    	 (1+ dvht)
           )
         strdonvi (nth dvht donvi)
       )
     )
     (if (/= (length lstchar) 0)
       (progn
         (while (< (length lstchar) 3)
    (setq lstchar (append lstchar (list "0")))
         )
         (setq kqht (strcat
    	   (doc3 (nth 2 lstchar) (nth 1 lstchar) (nth 0 lstchar))
    	 )
        kq	 (strcat kqht (nth dvht donvi) kq)
         )
       )
     )
     kq
    )
    

    Lần này thì hết "ngọng" nhưng vẫn đọc không đúng Bác Hòanh ạ! Cụ thể là có sự nhầm lẫn từ hàng triệu đọc thành tỷ, nghìn đọc thành triệu(lạm phát ghê quá Bác nhỉ!). Mà sao Bác không viết rộng ra cho cả chuỗi số thực , lỡ gặp tiền xu thì bó tay không đọc được

    • Vote tăng 1

  8. Lisp dưới đây biến 1 text là số nguyên dương thành một dòng text, là chữ viết.

     

    Ví dụ: 1234567890 sẽ trở thành 'mot nghin hai tram ba muoi tu ty nam tram sau muoi bay trieu tam tram chin muoi'

     

    tên lệnh là doctext (đọc text).

     

    (setq
     donvi (list " nghin" " trieu" " ty")
     lstso (list
    	(cons "0" " khong")
    	(cons "1" " mot")
    	(cons "2" " hai")
    	(cons "3" " ba")
    	(cons "4" " bon")
    	(cons "5" " nam")
    	(cons "6" " sau")
    	(cons "7" " bay")
    	(cons "8" " tam")
    	(cons "9" " chin")
    	(cons "0" " muoi")
    )
     s_tram " tram"
     s_muoi " muoi"
     s_linh " linh"
     s_tu " tu"
    )
    (defun c:doctext()  
     (setq ent (car (entsel "\nHay pick vao text so can doc: "))	
    tt  (entget ent)
    gt  (cdr (assoc 1 tt))
    ok  t
    lst (mapcar '(lambda (x) (if (or (> x 57) (< x 48)) (setq ok nil))) (vl-string->list gt))
     )
     (if ok
       (progn
         (setq
    p   (getpoint "\nPick toa do cua text moi: ")
    tt (subst (cons 1 (substr (docso gt) 2)) (cons 1 gt) tt)
        tt (subst (cons 10 p) (assoc 10 tt) tt)
         )
         (entmake tt)
       )
       (alert "\nText vua chon khong phai la so nguyen duong")
     )
    )
    (defun docso (str)
    
    
     (defun doc1 (so)
       (cdr (assoc so lstso))
     )
     (defun doc3 (a b c)
       (if	(= a "0")
         (setq a1 "")
         (setq a1 (strcat (doc1 a) s_tram))
       )
       (if	(= b "0")
         (if (/= a "0")
    (setq b1 s_linh)
    (setq b1 "")
         )
         (if (= b "1")
    (setq b1 s_muoi)
    (setq b1 (strcat (doc1 B ) s_muoi))
         )
       )
       (if	(= c "0")
         (setq c1 "")
         (if (and (/= b "0") (= c "4"))
    (setq c1 s_tu)
    (setq c1 (doc1 c))
         )
       )
       (strcat a1 b1 c1)
     )
    
     (setq	lstchar	(reverse (mapcar 'chr (vl-string->list str)))
    len	(length lstchar)	
    dvht	0
    kq	""
    strdonvi ""
     )
    
     (while (>= (length lstchar) 3)
       (setq
         kqht    (strcat
    	(doc3 (nth 2 lstchar) (nth 1 lstchar) (nth 0 lstchar))
          )
         kq      (strcat kqht strdonvi kq)
         lstchar (cdddr lstchar)
         dvht    (if (= dvht 2)
    	0
    	(1+ dvht)
          )
         strdonvi (nth dvht donvi)
       )
     )
     (if (/= (length lstchar) 0)
       (progn
         (while (< (length lstchar) 3)
    (setq lstchar (append lstchar (list "0")))
         )
         (setq kqht (strcat
    	   (doc3 (nth 2 lstchar) (nth 1 lstchar) (nth 0 lstchar))
    	 )
        kq	 (strcat kqht (nth dvht donvi) kq)
         )
       )
     )
     kq
    )
    

    Bác Hòanh viết cừ thật, nhưng lisp đọc không đúng và "ngọng líu ngọng lo" Bác ạ, ví dụ nhé:114565231, đọc là: mot tram muoi tu ty nam tram sau muoi nam trieu hai tram ba muoi mot . Không phân biệt "năm", "lăm"...Bác sửa lisp lại chút đi! thêm phần số thập phân nữa chớ

    • Vote tăng 1

  9. Chuyên mục này là sự nối tiếp từ các ý tưởng ở topic sau:

     

    http://www.cadviet.com/forum/index.php?sho...40&start=40

     

    Cám ơn bạn tnmtpc, ssg đã “sáng” ra được đôi chút. Về tổng quan thì được rồi, nhưng để triển khai thì cần phải cụ thể hơn nữa.

    Quan điểm chung: tận dụng tối đa các công cụ của Excel để nhập, xử lý và lưu trữ dữ liệu, không nên nhập số liệu thô từ Acad. Chương trình sẽ là “cầu nối” giữa Acad với Excel và có các chức năng cơ bản sau:

    1) Đọc dữ liệu từ Excel, tự động vẽ các đối tượng Acad cho từng trường hợp ứng dụng cụ thể

    2) Đọc dữ liệu từ Acad, xuất sang Excel theo những quy cách định trước

    3) Thực hiện tự động các tác vụ chuyên môn, có tính lặp lại, mất nhiều thời gian trong Acad

    4) Thực hiện các tiện ích thông thường, chung nhất của người dùng Acad, không phân biệt chuyên ngành

     

    Với mỗi mảng chức năng nêu trên, cần phải chia nhỏ ra thành từng trường hợp cụ thể (tạm gọi là module) với những mô tả chi tiết hơn. Mình đã nói rồi, về chuyên môn mình không rành nên nhờ các bạn trong ngành lập giúp “Bảng tổng hợp các yêu cầu” theo mẫu ví dụ sau (riêng chức năng 4 mình tự làm cũng được):

    Module 1:

    1) Chức năng: Vẽ bản đồ địa chính, lấy số liệu từ Excel

    2) Dữ liệu đầu vào: bảng Excel với các cột Name, X, Y, Code, Note. Ví dụ minh họa bằng file *.xls

    3) Kết quả đầu ra:

    - Vẽ points theo tọa độ X, Y

    - Viết texts theo Name, Code và Note

    - Nối các points bằng lines theo Code (như chương trình anh Hoành vừa làm)

    - Ví dụ minh họa bằng file *.dwg với kết quả bằng số liệu cụ thể, tương ứng với file *.xls trên

    4) Các chú thích thêm để rõ ý hơn (nếu có)

     

    Module 2: (như trên)

    v.v…

     

    Lưu ý: quy định viết text cao độ với dấu chấm thập phân nằm đúng vị trí point có bắt buộc không? Cái này hơi khó cho lập trình. Đối tượng text trong Acad được định vị bằng điểm Insert của nó, tức là điểm có hình vuông nhỏ (mặc định màu blue) khi bạn bấm select vào đối tượng text. Hiện mình vẫn chưa nghĩ ra cách gì để lấy tọa độ dấu chấm thập phân của text vì nó phụ thuộc quá nhiều thứ: font, độ dài số, kích thước các chữ số khác nhau (số 1 hẹp hơn số 2, 3…). Có thể thay bằng điểm Insert của Text đúng vị trí Point được không?

     

    Một chương trình ứng dụng tổng hợp, không chỉ đơn giản là phép cộng số học các trình đơn lẻ có sẵn đã post trên diễn đàn. Chúng phải được biên tập và xử lý lại thành một thể thống nhất, có tính tổ chức tốt hơn, giao diện được chăm chút hơn, thuận tiện hơn cho người dùng, dễ dàng chỉnh lý, bổ sung, phát triển… Để hoàn thành chương trình, phải cần nhiều thời gian và công sức của nhiều người (xin nhấn mạnh, một mình ssg không kham nổi!). Nếu có bạn nào vừa có chuyên môn Trắc địa, vừa biết về lập trình hỗ trợ với ssg thì hay quá?

     

    Kế hoạch thực hiện đề nghị như sau:

    1) Hoàn thành “Bảng tổng hợp các yêu cầu”. Theo ssg, bạn tnmtpc chủ động lập trước, các bạn khác trong ngành góp ý bổ sung

    2) Căn cứ vào bảng tổng hợp trên, xây dựng nên cái khung chương trình và đưa ra bản dùng thử (có thể chưa có đủ các module dự kiến). Ssg sẽ cố gắng hoàn thành trong thời gian sớm nhất có thể. Mục đích: có cái cụ thể để các bạn phân tích và góp ý thêm.

    3) Chỉnh sửa và bổ sung, công bố version 1.0 của chương trình. Về chỗ này, chương trình cần 1 cái tên chính thức, các bạn cũng đề xuất luôn (ví dụ như LandCadViet Utility, viết tắt là LCV có được không?)

    4) Không ngừng bổ sung và hoàn thiện thêm trong quá trình sử dụng

     

    Rất mong sự đóng góp tích cực của tất cả các bạn.

    Nhất trí với Ssg và ủng hộ hết mình. Tnmtpc sẽ cố trong thời gian sớm nhất gửi bảng tổng hợp các yêu cầu và hai file *.dwg và *.xls để có cơ sở nghiên cứu chương trình

    Giá như Ssg Ssg am tường về trắc địa hoặc tnmtpc có được kiến thức về lisp như Bác Ssg nhỉ. Mà sao các Bác trắc địa không ai lên tiếng vậy cà?

    • Vote giảm 1

  10. có mmột câu hỏi ngớ ngẩn, mong các bạn xem xét: lisp có biết đọc số không? ví dụ trên màn hình Cad có một chuõi số thực, chẳng hạn 11541.25, lisp đọc chuỗi này và ghi thành chữ vào một vị trí nào đó trên màn hình, quan trọng là phải "đọc" đúng, nghĩa là phân biệt được "mười", "một", "mốt"; "năm" và "lăm". Ở ví dụ này là "mười một nghìn năm trăm bốn mươi mốt phảy hai lăm

    • Vote tăng 1

  11. Từ lâu mình đã có ý tổng hợp các tiện ích liên quan đến Trắc địa - Bản đồ vào 1 chương trình duy nhất, như là bản thử nghiệm thuộc dự án CadViet Utility (CVU). Nếu như mình am hiểu tương đối về chuyên ngành Trắc địa thì có lẽ chương trình đã ra mắt anh em rồi. Đáng tiếc là mình chỉ hiểu lơ mơ, chưa có được cái nhìn toàn diện để tổng hợp. Bởi vậy, muốn có được chương trình, rất cần sự hỗ trợ của các bạn trong ngành. Cụ thể, mình đang cần những cái sau:

    1) Hiểu biết về những công việc cụ thể, từ lúc vác máy đi ngắm cho đến lúc ra được bản đồ địa chính hoặc địa hình; các công việc liên quan đến xử lý, biên tập, trích xuất thông tin, lập báo cáo... từ các file bản đồ đã lập.

    2) Các quy ước, quy trình, quy phạm của ngành có liên quan đến các việc trên

    3) Các ví dụ, với số liệu cụ thể, bằng chính các file *.xls, *.dwg... mà các bạn thực hiện trong công tác thực tế, được trình bày với quy cách mà các bạn cho là đẹp nhất, chuẩn nhất (nếu file lớn, chỉ cần trích 1 đoạn thôi). Các file minh hoạ này có ý nghĩa rất quan trọng đối với người lập trình:

    - Giúp người lập trình hiểu chính xác vấn đề. Xin lưu ý các bạn một lần nữa, chương trình cần đầy đủ các thông tin, kể cả những thông tin có thể bị bỏ qua, không đề cập tới (vì bị cho là nhỏ nhặt): layer, màu sắc, chiều cao text, vị trí text so với point... Nhiều thứ lắm, liệt kê chắc chắn sẽ thiếu, nhưng ví dụ cụ thể bằng file thì tự thân nó đã có đầy đủ.

    - Có cái cụ thể để test và chỉnh sửa chương trình khi lập xong

    Hoan nghênh Bác đã có “thai ngén” một dự án liên quan đến trắc địa –Bản đồ, thực ra trắc địa cũng như bao nghành khác , nó rộng lắm, nhưng chỉ nói về việc đo và xử lý số liệu để tạo bản đồ thì có thể khái quát như sau:

    1/Lập lưới khống chế khu vực đo: lưới là tập hợp các điểm mốc mà sau này có thể dùng làm điểm đặt máy để đo chi tiết. Các điểm mốc tạo thành một mạng bao gồm nhiều hình tam giác, đa giác hoặc một đường chuyền hở(các đọan thẳng nói với nhau tạo thành đường gấp khúc). Việc đo đạc trên lưới là để xác định được độ cao và tọa độ của từng điểm mốc (Bác không phải dân trong nghề nên không cần hiểu sâu nội dung này)

    2/Đo chi tiết: đặt máy tại một điểm mốc đã biết tọa độ và độ cao, chọn một điểm khác đã biết tọa độ để làm hướng khởi đầu (máy ngắm điểm này có góc ngang là 0), quay máy ngắm điểm dựng mia(gọi là điểm chi tiết) để đọc số, ở đây xin đề cập đối với máy thông thường (máy kinh vĩ quang cơ, hòan tòan ghi chép bằng thủ công), thông tin đọc, ghi gồm có: tên điểm mia, chiều dài nghiêng từ máy đến mia (nghiêng bỡi vì đường nhìn lên hay xuống phụ thuộc vào điểm mia cao hay thấp), góc ngang (theo độ, phút, giây so với hướng khởi đầu), góc đứng( tùy lọai máy, nhưng phổ thông nhất vẫn là 0o00’00” khi ống kính nằm ngang, ống kính hướng lên trên là góc dương, tăng dần từ 0 dến +90o, ngược lại là góc âm ),cao mia, ghi chú (phần này giúp cho công tác biên tập nội nghiệp( ví dụ: điiểm nào nối tới điểm nào, điểm nào là cây, nhà, …)

    * Nếu không thích đọc chiều dài nghiêng trực tiếp thì có thể đọc dây trên, chiều dài nghiêng được tính như sau: (dây trên - cao mia)x 0.2 (đơn vị là mét)

    3/Xử lý số liệu đo: tính khỏang cách ngang từ máy đến mia, độ cao điểm mia, tọa độ điểm mia

    -công thức tính K/cách ngang: S= D.cos2v ; trong đó: D là chiều dài nghiêng (mét), v là góc đứng

    -Công thức tính độ cao điểm mia: H=Hm +(D.sin(2v))/2 +i-l ;trong đó Hm là độ cao mốc đặt máy, i là chiều cao của máy, l là cao mia

    Khi tọa độ điểm máy đã biết, dựa vào góc ngang so với hướng khởi đầu và chiều dài ngang S mới vừa xác định để xác định tọa độ điểm mia (gọi là phương pháp tọa độ cực)

    4/Tạo bản vẽ: vẽ điểm mia theo phương pháp cực, ghi độ cao, thực hiện nối điểm nếu có, hoặc vẽ các địa vật nhờ vào ghi chú

    *Nếu là dân địa chính thì không cần tính độ cao, chỉ tính K/cách ngang, thực hiện ngay việc nối các cạnh thửa, tính diện tích thửa, đánh số thứ tự thửa theo chiều trái qua phải, từ trên xuống và ghi các thông tin vào thửa như tên người sử dụng, lọai đất, diện tích và vẽ các địa vật khác

    *Nếu là dân địa hình thì công tác khá quan trọng và phức tạp là chạy đường đồng mức (bình đồ), dựa vào giá trị độ cao của điểm mia, vẽ các địa vật khác

    5/Text thể hiện thông tin :

    -Đối với bản đồ địa chính thì thông tin được ghi vào tâm thửa đất dạng hỗn số, các thông tin khác ghi ở vị trí bất kỳ trong thửa

    Đối với bản đồ địa hình, độ cao lấy tròn đến hai số lẻ và ghi tại vị trí sao cho dấu chấm thập phân trùng chấm điểm mia, ghi chú thường được ghi bên dưới lệch về phải, tên điểm ghi ở trên

    Về màu sắc, chiều cao text là tùy chọn. Màu sắc qui chuẩn thường áp dụng cho bản đồ chuyên đề (như thổ nhưỡng, qui họach đất đai…), chiều cao phụ thuộc vào tỷ lệ bản đồ

    6/Trích xuất thông tin, lập báo cáo: đối với bản đồ địa chính, sau khi hòan chỉnh bản đồ, cần trích xuất ra file báo cáo gồm các thông tin địa lý (tọa độ đỉnh thửa), số hiệu thửa đất, diện tích, lọai đất, tên người sử dụng…

    Xuất phát từ nội dung trên, yêu cầu đặt ra cho chương trình mà Lisp thực hiện có hai giải pháp đối với mỗi mảng:

    1/Đối với địa chính: nếu xử lý số liệu bên excel, bảng cơ sở dữ liệu có các cột: tên điểm, tọa độ X,Y, ghi chú (hoặc code), xuất qua Cad, dùng lệnh nối điểm để tạo thành thửa đất, tạo tâm thửa, đánh số thửa tự động, tính diện tích và ghi vào thửa; Nếu xử lý trực tiếp bên Cad thì yêu cầu nhập dữ liệu trong hộp thọai, gồm các edit_box: tên trạm máy, cao máy, hướng khởi đầu; tên điểm mia, dài nghiêng (hoặc dây trên), cao mia, góc ngang, góc đứng, ghi chú ,hoặc code

    2/Đối với địa hình: nếu xử lý số liệu bên Excel, gồm các cột: tên điểm, tọa độ X,Y, Z, ghi chú ,hoặc code, xuất qua Cad, chương trình thực hiện nối các địa vật như sông, suối, đường giao thông, hoặc vẽ các ký hiệu địa vật như cây, cột cờ, trụ điện…(các Symbol này được cất giữ trong một thư viện nào đó). Nếu xử lý trực tiếp trong Cad, yêu cầu hộp thọai như trên nhưng phải tính thêm độ cao để ghi lên điểm mia

    Mỗi lọai thông tin nằm trên một layer riêng (ví dụ tendiem, docao, code…)

    ( cái vướng của việc xử lý trực tiếp trên Cad là một lần thực hiện lệnh cho một điểm mia nhưng lại phải nhập lại thông tin trạm máy, nếu được nhập tất cả các điểm mia trong một trạm máy cho mỗi một lần thực hiện lệnh và lưu được dữ liệu thì sẽ ưu thế hơn)

    Quá dài dòng phải không Bác Ssg?, nói tóm lại là không dám yêu cầu cao hơn (chẳng hạn chạy được bình đồ), yêu cầu là xử lý số liệu đo, dùng lệnh để vẽ và thể hiện thông tin các đối tượng đo đạc

    Sẽ có người cho rằng sao không sử dụng các chương trình khác (SDR, Sufer, Autodesk survey…), thực ra các chương trình đó không phải dân trắc địa nào cũng biết, hơn nữa nhiều người (như tôi) vẫn thích chơi Cad hơn

    Hy vọng rằng “ thai nghén” của bác sớm đơm hoa kết trái, chúc sức khỏe, thành đạt

    Quí đàn anh trắc địa bỏ qua nếu những khái quát trên đây có gì thiếu sót, mong được góp ý để diễn đàn thêm sôi động

    Gửi kèm file mẫu để Bác Ssg tham khảo

     

    http://www.cadviet.com/upfiles/mau.dwg

    • Vote tăng 1

  12. Cái sườn đã có sẵn, thêm 1 hay nhiều cột nữa không thành vấn đề. Tuy nhiên, mình thấy quy cách trên bản vẽ do vbao và cuongcv3 đề xuất khác với bản vẽ của bạn.

    Theo mình, các bạn nên thống nhất nhau trước, nêu yêu cầu tổng hợp và cụ thể hoá bằng các file:

    - 1 file *.xls với đầy đủ các số liệu

    - 1 file *.dwg sau khi chạy chương trình

    Bác nói quá đúng!, mỗi anh mỗi khác, nhưng thực ra về cái gốc không thể khác nhau được. Bản vẽ Cad chứa dữ liệu không gian, còn bên Excel có thể hiểu là chứa dữ liệu thuộc tính. Dữ liệu có thể gồm nhiều thứ, nhưng không thể thiếu các thông tin cơ bản là tên điểm mia, tọa độ X,Y, độ cao Z, ghi chú điểm (có thể xem cái này là code cũng được nhưng tốt nhất nên cho một cột riêng). đôí vơí dân bản đồ địa chính(không quan tâm Z), code dùng nôí cạnh thửa, dân bản đồ địa hình, code dùng nôí các địa vật như đường giao thông, sông suôí...Như vậy code phaỉ được nhập vào ngay Excel để khi qua Cad tự động nôí điểm là quan trọng lắm chớ, còn cách thể hiện vị trí text cuả điểm mia (tên điểm, độ cao, ghi chú,...) tất nhiên có qui định nhưng không quan trọng. Chẳng qua bạn VBao, Cuongcv3 quên hoặc ngại không đề cập đến code.

    Đó Bác thấy không, trắc địa vẫn là trắc địa: đo, xử lý số liệu thô, đưa qua chương trình nào đó (Cad chẳng hạn) tạo thành bản vẽ.

    Cảm ơn Bác quan tâm, mong rằng Bác và các cao thủ nghiên cứu viết một lisp chung để xử lý số liệu đo và tạo bản vẽ nhanh. Đưa vào kho dữ liệu lisp của diễn đàn để mọi ngươì dễ tìm thấy. Cám ơn Bác lần nữa


  13. Chương trình xuất dữ liệu từ Excel sang Cad cuả Bác Ssg thật tuyệt, dân trắc địa gặp phải cái này thì ưng ý lắm, xin đề xuất thêm vơí Bác Ssg là trong dữ liệu cuả Excel, ngoaì pointname, X,Y,Z, còn có thêm cột "code" nữa, khi xuất qua Cad, dùng lệnh JD cuả Bác Hoành viết cho tnmtpc để nôí điểm theo code thì trên cả tuyệt vơì Bác ạ! Bác viết thêm một chút nữa nhé! Bà con trắc địa đang chờ đấy


  14. - Nếu muốn nằm ở layer line, bạn thêm mã lệnh (cons 8 "lines") sau mã (cons 0 "LINE") là được.

    - Lisp này mình chủ định viết bạn, là cho R14 (vì mở file của bạn ra thấy version file của bạn là R14). Tất cả các lệnh của lisp đều sử dụng mã cơ bản. Bạn thử lại lần nữa xem.

    Bảo đảm vơí Bác Hòanh là không chạy được trên Cad 14, vì đã thử trên 4 máy tính khác sử dụng Cad14 vẫn báo lỗi, coppy nguyên nội dung text Bác xem nhé

    Command: _appload

    Loading E:\soft\autolisp\cadviet\noidiemtheocode.lsp ...

     

    Command: jd

     

    Select objects: Other corner: 26 found

     

    Select objects:

    error: null function

    (POS SEP STR)

    (SETQ VT (POS SEP STR))

    (WHILE (SETQ VT (POS SEP STR)) (SETQ KQ (APPEND KQ (LIST (SUBSTR STR 1 (1-

    VT)))) STR (SUBSTR STR (1+ VT))))

    (EXPLODE (SUBSTR CODE 2) "-")

    (SETQ PC (CAR PP) TENDIEM (TIMGAN PC LSTTENDIEM) CODE (CDR PP) P (CDR (ASSOC

    TENDIEM LSTPOINT)) LSTC (EXPLODE (SUBSTR CODE 2) "-"))

    (FOREACH PP LSTCODE (SETQ PC (CAR PP) TENDIEM (TIMGAN PC LSTTENDIEM) CODE (CDR

    PP) P (CDR (ASSOC TENDIEM LSTPOINT)) LSTC (EXPLODE (SUBSTR CODE 2) "-"))

    (FOREACH CC LSTC (SETQ F (ASSOC CC LSTPOINT)) (IF F (PROGN (SETQ P0 (CDR F))

    (MAKELINE P0 P)))))

    (C:JD)

    *Cancel*


  15. Lệnh là JD (Joint các Điểm).

     

    Chương trình yêu cầu bạn nhập các đối tượng vào (lẫn lộn cả point và text). Chương trình tự phân biệt đâu là point, đâu là tên điểm và đâu là code rồi thực thi như yêu cầu của bạn.

     

    Text không cần trùng điểm chèn với point mà chỉ cần gần point là chương trình nhận biết được.

     

    (defun c:jd ()
     (setq
       ss         (ssget
    	 '((-4 . "<OR")
    	   (-4 . "<AND")(0 . "POINT") (8 . "DIEM")(-4 . "AND>")
    	   (-4 . "<AND")(0 . "TEXT") (8 . "TENDIEM")(-4 . "AND>")
    	   (-4 . "<AND")(0 . "TEXT") (8 . "CODE")(-4 . "AND>")
    	   (-4 . "OR>")
    	  )
           )
       lstent     (ss2ent ss)
    
       lsttendiem (mapcar '(lambda	(e)
    		  (cons	(cdr (assoc 10 (entget e)))
    			(cdr (assoc 1 (entget e)))
    		  )
    		)
    	       (filter lstent "TEXT" "TENDIEM")
           )
       lstcode    (mapcar '(lambda	(e)
    		  (cons	(cdr (assoc 10 (entget e)))
    			(cdr (assoc 1 (entget e)))
    		  )
    		)
    	       (filter lstent "TEXT" "CODE")
           )
       lstpoint   (mapcar '(lambda (e) (cdr (assoc 10 (entget e))))
    	       (filter lstent "POINT" "DIEM")
           )
       lstpoint   (mapcar '(lambda	(p)
    		  (cons (timgan p lsttendiem) p)
    		)
    	       lstpoint
           )
     )
     (foreach pp lstcode
       (setq
         pc       (car pp)
         tendiem (timgan pc lsttendiem)
         code    (cdr pp)
         p       (cdr (assoc tendiem lstpoint))      
         lstc (explode (substr code 2) "-")
       )
    
       (foreach cc	lstc
         (setq f (assoc cc lstpoint))
         (if f
    (progn
      (setq p0 (cdr f))
      (makeline p0 p)
    )
         )
       )
     )
    
     (princ)
    )
     (defun timgan	(p lst / dmin ppluu)
       (foreach pp	lst
         (setq d (distance p (car pp)))
         (if (or (not dmin) (> dmin d))
    (setq
      dmin d
      ppluu	pp
    )
         )
       )
       (cdr ppluu)
     )
    
    (defun filter(lstent otype olayer / kq)
     (foreach pp lstent
        (setq tt (entget pp))
        (if (and
       (member (cons 0 otype) tt)
       (member (cons 8 olayer) tt)
     )
          (setq kq (append kq (list pp)))
        )
     )
     kq
    )
    
    (defun pos (sub st / l1 l2 index)
     (setq	index 1
    l1    (strlen sub)
    l2    (strlen st)
     )
     (while
       (and (<= (+ index l1 -1) l2) (/= sub (substr st index l1)))
        (setq index (1+ index))
     )
     (if (= sub (substr st index l1))
       index
       nil
     )
    )
    
    (defun explode (str sep / kq)
     (setq kq nil)
     (while (setq vt (pos sep str))
       (setq
         kq  (append kq (list (substr str 1 (1- vt))))
         str (substr str (1+ vt))
       )
     )
     (setq kq (append kq (list str)))
     kq
    )
    
    (defun makeline	(p1 p2)
     (entmake (list (cons 0 "LINE") (cons 10 p1) (cons 11 p2)))
    )
    
    (defun ss2ent(ss / sodt index lstent)
     (setq
       sodt (if ss (sslength ss) 0)	   
       index 0
     )
     (repeat sodt
       (setq ent (ssname ss index)
      index (1+ index)
      lstent (cons ent lstent)
       )
     )
     (reverse lstent)
    )
    

    Xin phép Bác Hoành cho tôi được thêm đọan mã sau vào cái lisp Bác đã viết: (command "layer" "M" "lines" nill)

    để đối tượng lines tạo ra luôn nằm trên Layer "LINES", cho nó đâu ra đấy, anh em sử dụng lisp này đỡ vất vả

    Bác Hòanh cho hỏi thêm chút nhé! Có khi nào các điểm nằm gần nhau bị nối nhầm không Bác ? Nếu Point là 3D có thực hiện được không ?

    Hình như cái Lisp này nó không chịu chơi vơí thằng Cad R14 Bác a! Khổ nỗi máy mình xưa quá, mấy Thằng Cad đời hậu sinh nó không hạp


  16. Mình chạy thử trên file mẫu của bạn, kết quả: OK! Bạn thử lại xem sao.

    Lưu ý:

    1) Vô hiệu hóa tất cả các trình lisp khác đang chạy (nếu có) của bạn. Bạn có dùng trình lisp nào đặt ở chế độ autoload không?

    2) Sau khi load file, bấm F2 xem nó có báo gì khác ngoài dòng "...successfully loaded" không? Nếu có tức là không ổn, bạn đã thao tác sai cái gì đó không biết!

    cám ơn Bác SSG nhiều, có lẽ chương trình Cad ở nhà bị lỗi hay sao bác ạ(Cad 14), vừa rồi chạy thử máy trên cơ quan (Cad 2004), đúng là OK!


  17. Mình chạy thử trên file mẫu của bạn, kết quả: OK! Bạn thử lại xem sao.

    Lưu ý:

    1) Vô hiệu hóa tất cả các trình lisp khác đang chạy (nếu có) của bạn. Bạn có dùng trình lisp nào đặt ở chế độ autoload không?

    2) Sau khi load file, bấm F2 xem nó có báo gì khác ngoài dòng "...successfully loaded" không? Nếu có tức là không ổn, bạn đã thao tác sai cái gì đó không biết!

    Mình sẽ xem lại, nhưng mình vẫn load file bình thường, không có gì lạ xảy ra cả, gõ lệnh, nhắc chọn đối tượng, chọn xong, Enter, báo lỗi như trên


  18. Lệnh là JD (Joint các Điểm).

     

    Chương trình yêu cầu bạn nhập các đối tượng vào (lẫn lộn cả point và text). Chương trình tự phân biệt đâu là point, đâu là tên điểm và đâu là code rồi thực thi như yêu cầu của bạn.

     

    Text không cần trùng điểm chèn với point mà chỉ cần gần point là chương trình nhận biết được.

     

    (defun c:jd ()
     (setq
       ss         (ssget
    	 '((-4 . "<OR")
    	   (-4 . "<AND")(0 . "POINT") (8 . "DIEM")(-4 . "AND>")
    	   (-4 . "<AND")(0 . "TEXT") (8 . "TENDIEM")(-4 . "AND>")
    	   (-4 . "<AND")(0 . "TEXT") (8 . "CODE")(-4 . "AND>")
    	   (-4 . "OR>")
    	  )
           )
       lstent     (ss2ent ss)
    
       lsttendiem (mapcar '(lambda	(e)
    		  (cons	(cdr (assoc 10 (entget e)))
    			(cdr (assoc 1 (entget e)))
    		  )
    		)
    	       (filter lstent "TEXT" "TENDIEM")
           )
       lstcode    (mapcar '(lambda	(e)
    		  (cons	(cdr (assoc 10 (entget e)))
    			(cdr (assoc 1 (entget e)))
    		  )
    		)
    	       (filter lstent "TEXT" "CODE")
           )
       lstpoint   (mapcar '(lambda (e) (cdr (assoc 10 (entget e))))
    	       (filter lstent "POINT" "DIEM")
           )
       lstpoint   (mapcar '(lambda	(p)
    		  (cons (timgan p lsttendiem) p)
    		)
    	       lstpoint
           )
     )
     (foreach pp lstcode
       (setq
         pc       (car pp)
         tendiem (timgan pc lsttendiem)
         code    (cdr pp)
         p       (cdr (assoc tendiem lstpoint))      
         lstc (explode (substr code 2) "-")
       )
    
       (foreach cc	lstc
         (setq f (assoc cc lstpoint))
         (if f
    (progn
      (setq p0 (cdr f))
      (makeline p0 p)
    )
         )
       )
     )
    
     (princ)
    )
     (defun timgan	(p lst / dmin ppluu)
       (foreach pp	lst
         (setq d (distance p (car pp)))
         (if (or (not dmin) (> dmin d))
    (setq
      dmin d
      ppluu	pp
    )
         )
       )
       (cdr ppluu)
     )
    
    (defun filter(lstent otype olayer / kq)
     (foreach pp lstent
        (setq tt (entget pp))
        (if (and
       (member (cons 0 otype) tt)
       (member (cons 8 olayer) tt)
     )
          (setq kq (append kq (list pp)))
        )
     )
     kq
    )
    
    (defun pos (sub st / l1 l2 index)
     (setq	index 1
    l1    (strlen sub)
    l2    (strlen st)
     )
     (while
       (and (<= (+ index l1 -1) l2) (/= sub (substr st index l1)))
        (setq index (1+ index))
     )
     (if (= sub (substr st index l1))
       index
       nil
     )
    )
    
    (defun explode (str sep / kq)
     (setq kq nil)
     (while (setq vt (pos sep str))
       (setq
         kq  (append kq (list (substr str 1 (1- vt))))
         str (substr str (1+ vt))
       )
     )
     (setq kq (append kq (list str)))
     kq
    )
    
    (defun makeline	(p1 p2)
     (entmake (list (cons 0 "LINE") (cons 10 p1) (cons 11 p2)))
    )
    
    (defun ss2ent(ss / sodt index lstent)
     (setq
       sodt (if ss (sslength ss) 0)	   
       index 0
     )
     (repeat sodt
       (setq ent (ssname ss index)
      index (1+ index)
      lstent (cons ent lstent)
       )
     )
     (reverse lstent)
    )
    

    Bác Hoành xem lại giúp, tôi thực hiện trên file mẫu, sau khi nhập lệnh, chọn đôí tượng, chương trình báo lỗi:

    error: null function

    (POS SEP STR)

    (SETQ VT (POS SEP STR))

    (WHILE (SETQ VT (POS SEP STR)) (SETQ KQ (APPEND KQ (LIST (SUBSTR STR 1 (1-

    VT)))) STR (SUBSTR STR (1+ VT))))

    (EXPLODE (SUBSTR CODE 2) "-")

    (SETQ PC (CAR PP) TENDIEM (TIMGAN PC LSTTENDIEM) CODE (CDR PP) P (CDR (ASSOC

    TENDIEM LSTPOINT)) LSTC (EXPLODE (SUBSTR CODE 2) "-"))

    (FOREACH PP LSTCODE (SETQ PC (CAR PP) TENDIEM (TIMGAN PC LSTTENDIEM) CODE (CDR

    PP) P (CDR (ASSOC TENDIEM LSTPOINT)) LSTC (EXPLODE (SUBSTR CODE 2) "-"))

    (FOREACH CC LSTC (SETQ F (ASSOC CC LSTPOINT)) (IF F (PROGN (SETQ P0 (CDR F))

    (MAKELINE P0 P)))))

    (C:JD)

    *Cancel*

    Không thấy line nào xuất hiện cả bác ạ!


  19. Bạn có thể có thể upload 1 file dwg mẫu được không?

    Trong đó thể hiện: Trạng thái trước khi sử dụng lệnh và trạng thái sau khi sử dụng lệnh (các line nối được thêm vào).

     

    P/S: có thể cách nói khác nhau, nhưng tôi thấy cách nói 'điểm mia nằm trong layer "diem"' đỡ lẫn hơn là 'điểm mia nằm trên lớp "diem"' vì thuật ngữ layer đã trở nên quá quen thuôc trong AutoCAD (bạn dùng thuật ngữ 'lớp', tôi luận 1 lúc mới hiểu).

    Gửi Bác Hòanh file mẫu theo gợi ý của Bác. Xin nêu một chút cho cụ thể là điểm chèn text của tên điểm (M1, M2...) và code (jM1, jM2...) trùng vơí tọa độ điểm mia, chỉ có khác là tên điểm ở TL, code ở BL, chiều cao text bây giờ không quan tâm nưã bác ạ! Cám ơn Bác Hoành nhiều

    http://www.cadviet.com/upfiles/mau.rar


  20. Bạn có thể có thể upload 1 file dwg mẫu được không?

    Trong đó thể hiện: Trạng thái trước khi sử dụng lệnh và trạng thái sau khi sử dụng lệnh (các line nối được thêm vào).

     

    P/S: có thể cách nói khác nhau, nhưng tôi thấy cách nói 'điểm mia nằm trong layer "diem"' đỡ lẫn hơn là 'điểm mia nằm trên lớp "diem"' vì thuật ngữ layer đã trở nên quá quen thuôc trong AutoCAD (bạn dùng thuật ngữ 'lớp', tôi luận 1 lúc mới hiểu).

    Cám ơn Bác Hoành đã quan tâm, tối mai tôi gửi 1 file dwg nhờ Bác giúp( Bác thông cảm, từ ngữ mình nó "thuần Việt" quá

×