Chuyển đến nội dung
Diễn đàn CADViet
Đăng nhập để thực hiện theo  
dunguss3581

[Yêu cầu] Lisp xuất nhập thông tin tọa độ điểm

Các bài được khuyến nghị

Chào các bác. Mình có file txt có format như sau:

 

A 5 5 5

B

A 10 10 10

C

Các bác có thể giúp mình viết lisp:

- Đọc file txt này nếu gặp A thì vẽ text "A" vào tọa độ của dòng A.

- Nếu là ký tự khác A (có thể là B, C ...) thì lấy tọa độ của các text B, C ... từ bản vẽ ghi vào file đã có tại vị trí ngay sau text B, C ... đó.

 

Xin chân thành cảm ơn!

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

- Trả lời nhanh cho bạn, hi vọng nếu bạn yêu thích lisp hoặc cần nó cho công việc của mình thì có thể tự làm và tùy biến. Mình k có CAD ở đây, nếu mình nhầm đoạn nào thì bỏ qua nhé ^^

1. Đọc 1 file ta có hàm Open

(open file method)

+ File : tên file, có thể lấy bằng hàm getfiled

+ Method : kiểu đọc : "a" = append, "w" = write, "r" = read

Hàm open này cũng để ghi 1 file mới. Vậy giả sử bạn ghi ra 1 file tạm ABC.txt nào đó nh

Vậy bạn có thể tách ra thành 2 công việc :

 

(setq doc (open file_du_lieu "r")) (gọi là *a)

 

(setq ghi (open file_tam "w")) (gọi là *B)

 

2. Xử lý dữ liệu từ *a *b :

- Dùng hàm (read-line fileObj) bạn sẽ đọc được từng dòng của file mở Obj và chuyển con trỏ xuống dòng kế tiếp . Khi hết file read-line trả về nil

=> toàn bộ đoạn xử lý nằm trong

(while (setq str (read-line doc))

 

...... Do sth

 

)

 

- Lấy ký tự đầu của str bằng hàm substr và đoạn đằng sau nó, mình k nói lại nữa

- Nếu ký tự đầu là "A" : làm 2 việc

+ 1 : Tạo Point ở tọa độ (read (strcat "(" đoạn đằng sau nó ")")) bằng hàm command hoặc entmake hoặc vla tùy bạn

+ 2 : ghi lại toàn bộ dòng đó vào ghi bằng hàm (write-line str ghi)

 

- Nếu ký tự đầu của str khác "A", giả sử là "B" : gọi 1 hàm con lấy tọa độ điểm text A. Hàm này đơn giản là lấy dxf 10 của text (ssname (ssget "x" (list (cons 0 "*TEXT")(cons 1 "B"))) 0), được tọa độ (x y z).

Ghi strcat "B" + vl-princ-to-string car, cadr last của tọa độ thu được vào file ghi với cấu trúc tương tự mục trên

 

Cuối cùng là xóa file đọc và copy file ghi vòa chỗ cũ với tên file đọc bằng 2 hàm vl-file-copy + vl-file-delete

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

Vấn đề tui chưa làm được là vị trí con trỏ để ghi text tui open file với method "a" thì số liệu lại cứ ghi ra cuối file. hoặc báo lỗi. Các bác xem giúp tui xem sai cú pháp ở đâu?

(defun c:ntn ( / fn fid strht vt x y z)[/font][/color]
[color=#282828][font=helvetica, arial, sans-serif]  (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
)
 )[/font][/color]
[color=#282828][font=helvetica, arial, sans-serif] 
 (princ "vvvvvvvvvvvvvvvvvvvv")
 (setq fn  (getfiled "Chon tep ntd can nhap TN" (getvar "dwgprefix") "txt" 1))
 (setq fid (open fn "a"))[/font][/color]
[color=#282828][font=helvetica, arial, sans-serif]  (setq tencoc(getstring "\n nhap ten coc:"))
 (while (setq strht (read-line fid))
(setq strht (strcat strht "\t\t\t\t"))
(if (/= strht "   ")
 	(progn
(setq
  vt (pos "\t" strht)
  mot (substr strht 1 (1- vt))
  strht (substr strht (1+ vt))

  vt (pos "\t" strht)
  hai (substr strht 1 (1- vt))
  strht (substr strht (1+ vt))

  vt (pos "\t" strht)
  ba (substr strht 1 (1- vt))
  strht (substr strht (1+ vt))[/font][/color]
[color=#282828][font=helvetica, arial, sans-serif]   vt (pos "\t" strht)
  bon (substr strht 1 (1- vt))
  strht (substr strht (1+ vt))
)
 	);het progn
); het if
(princ "da lam den day")
(if (and (= mot "POLE") (= tencoc hai))
 	(progn
 (princ "\nda lam den day nua")
 (write-line "da tim duoc coc" fid)
)
 	)
 )
 (close fid)
)[/font][/color]

[color=#282828][font=helvetica, arial, sans-serif]

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

Mình đã ghi rất rõ bên trên :

- Đọc 1 file, ghi lại ra 1 file tạm để quản lý việc bạn làm.

- Method "a" = append = ghi vào cuối file. Bạn write-line trong chính file bạn mở thì tất nhiên nó sẽ ghi vào cuối file

- Nhận xét về lisp của bạn : có phần hơi bị rườm rà do viết đi viết lại tìm vị trí 1,2,3. Trên diễn đàn có 1 số hàm tách chuỗi bằng ký tự phân cách (bài bạn là "\t") bạn hãy search thử

  • Vote tăng 1

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

Tạo một tài khoản hoặc đăng nhập để nhận xét

Bạn cần phải là một thành viên để lại một bình luận

Tạo tài khoản

Đăng ký một tài khoản mới trong cộng đồng của chúng tôi. Điều đó dễ mà.

Đăng ký tài khoản mới

Đăng nhập

Bạn có sẵn sàng để tạo một tài khoản ? Đăng nhập tại đây.

Đăng nhập ngay

Đăng nhập để thực hiện theo  

×