Đến nội dung


Hình ảnh
- - - - -

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


  • Please log in to reply
4 replies to this topic

#1 dunguss3581

dunguss3581

    biết lệnh rotate

  • Advance Member
  • PipPipPip
  • 139 Bài viết
Điểm đánh giá: 5 (bình thường)

Đã gửi 11 May 2012 - 06:33 PM

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!
  • 0

#2 ketxu

ketxu

    Copier - Paster - Editor

  • Moderator
  • PipPipPipPipPipPipPip
  • 5685 Bài viết
Điểm đánh giá: 2606 (tuyệt vời)

Đã gửi 11 May 2012 - 06:41 PM

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

Thành viên nhóm CadMagic.
Mời bạn ghé thăm facebook nhóm - Page viết lisp theo yêu cầu  :
CAD MAGIC


#3 dunguss3581

dunguss3581

    biết lệnh rotate

  • Advance Member
  • PipPipPip
  • 139 Bài viết
Điểm đánh giá: 5 (bình thường)

Đã gửi 11 May 2012 - 07:12 PM

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]

  • 0

#4 ketxu

ketxu

    Copier - Paster - Editor

  • Moderator
  • PipPipPipPipPipPipPip
  • 5685 Bài viết
Điểm đánh giá: 2606 (tuyệt vời)

Đã gửi 11 May 2012 - 07:18 PM

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ử
  • 1

Thành viên nhóm CadMagic.
Mời bạn ghé thăm facebook nhóm - Page viết lisp theo yêu cầu  :
CAD MAGIC


#5 dunguss3581

dunguss3581

    biết lệnh rotate

  • Advance Member
  • PipPipPip
  • 139 Bài viết
Điểm đánh giá: 5 (bình thường)

Đã gửi 11 May 2012 - 07:25 PM

OK. Mình đã hiểu được ý. Xin cảm ơn.
  • 0