Đến nội dung


Hình ảnh
- - - - -

Lisp bị lỗi khi gán giá trị text cộng dồn


  • Please log in to reply
1 reply to this topic

#1 duongthanh85

duongthanh85

    biết vẽ pline

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

Đã gửi 15 August 2009 - 10:28 AM

Chương trình có ý tưởng như sau:
Chọn các text bởi chuột theo thứ tự mong muốn, nhấn enter để kết thúc việc lựa chọn. Gán tất cả giá trị text này vào 1 biến trong vòng lặp cách nhau bởi dấu TAB. Kết thúc ghi ra 1 dòng vào file text.

Hình đã gửi

Như với hình này sẽ chọn lần lượt a,b,c... sau đó đo chiều dài; khi em làm không có vòng lặp while chọn text - tức chỉ chọn 2 text- thì chạy ngon lành.

Khi thêm vòng lặp để chọn nhiều text, chạy thử tới bước chọn tới đối tượng thứ 2 thì bị lỗi, lỗi báo như sau:

Command: tm2
Ghi ten file luu ket qua: 12.txt
Chon Text thu nhat :
Chon Text tiep:; error: bad argument type: stringp nil


Lisp em viết như sau:
(defun c:tm2(/ fname obj1 obj2 txt1 txt2 txt3 po1 po2 s)
(vl-load-com)
(setq fname (getstring "\nGhi ten file luu ket qua: "))
(if (setq fname (open fname "a"));open file
(while
(while
(setq obj1 (entsel "\nChon Text thu nhat :"))
(setq obj2 (entsel "\nChon Text tiep:"))
(setq txt1 (cdr (assoc 1 (entget (car obj1))))
txt2 (cdr (assoc 1 (entget (car obj2))))
)
(if (and txt1 txt2)
(setq txt3 (strcat txt3 "\t" txt1 "\t" txt2)))
)






(setq po1 (getpoint "\n Pick diem dau :") S 0 i 0)
(while
(setq po2 (getpoint po1 "\n Pick diem tiep theo de tinh khoang cach/ Enter de ket thuc :"))
(setq S (+ S (distance po1 po2)) po1 po2)
)
(setq ghichu (getstring "\nGhi chu sau ket qua: "))

(if (and txt3 s)
(write-line (strcat txt3 "\t" (rtos s) "\t" ghichu) fname) )


)
(close fname);close file
)
(princ)
)
Trong lisp này có sử dụng code tham khảo từ cadviet)



Mong các huynh xem giùm em xem em viết sai đoạn nào và cần sửa ra sao?
Em cám ơn nhiều.
  • 0
Dương Đình Thành


EDI.com.vn
Mobile : 0903.269.830
duongdinhthanh@edi.com.vn



Thiết kế thi công: Trạm biến áp, đường dây, cáp ngầm, hạ ngầm đường dây, điện tòa nhà, hệ điện thông minh ...

#2 q288

q288

    biết lệnh fillet

  • Members
  • PipPipPipPip
  • 209 Bài viết
Điểm đánh giá: 164 (tàm tạm)

Đã gửi 15 August 2009 - 11:18 AM

Chương trình có ý tưởng như sau:
Chọn các text bởi chuột theo thứ tự mong muốn, nhấn enter để kết thúc việc lựa chọn. Gán tất cả giá trị text này vào 1 biến trong vòng lặp cách nhau bởi dấu TAB. Kết thúc ghi ra 1 dòng vào file text.


Các vòng while của bạn không có điều kiện để thoát ra. Mình viết lại như sau, do không biết file kế quả của bạn như thế nào nên mình sửa không biết có đúng ý bạn không, bạn xem lại nhé.

;; free lisp from cadviet.com
(defun c:tm2(/ fname obj1 obj2 txt1 txt2 txt3 po1 po2 s)
(vl-load-com)
(setq fname (open (getstring "\nGhi ten file luu ket qua: ") "a")
obj1 (entsel "\nChon Text thu nhat :")
txt1 (cdr (assoc 1 (entget (car obj1))))
obj2 (entsel "\nChon Text tiep:")
txt3 txt1
)

(while obj2    
    (setq txt2 (cdr (assoc 1 (entget (car obj2)))))
    (if (and txt3 txt2)
     (setq txt3 (strcat txt3 "\t" txt2))
)
(setq obj2 (entsel "\nChon Text tiep:"))
)

(setq po1 (getpoint "\n Pick diem dau :") S 0 i 0
po2 (getpoint po1 "\n Pick diem tiep theo de tinh khoang cach/ Enter de ket thuc :"))

(while po2
    (setq S (+ S (distance po1 po2))
po1 po2
po2 (getpoint po1 "\n Pick diem tiep theo de tinh khoang cach/ Enter de ket thuc :"))
)

(setq ghichu (getstring "\nGhi chu sau ket qua: "))
(if (and txt3 s)
    (write-line (strcat txt3 "\t" (rtos s) "\t" ghichu) fname)
)
(close fname)
(princ)
)

  • 1