Đến nội dung


Hình ảnh
- - - - -

[Nhờ chỉnh sửa]: Kiểm tra file tồn tại không để thoát hẳn dòng lệnh của lisp.


  • Please log in to reply
11 replies to this topic

#1 luckylucke_2009

luckylucke_2009

    biết zoom

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

Đã gửi 16 July 2012 - 05:03 PM

Nhờ anh chị chỉnh sửa giúp tôi đoạn lisp vẫn còn bị lỗi.
Nội dung của đoạn lisp là: Trong phần chương trình chính, có một chương trình con. Chương trình con này thực hiện kiểm tra sự tồn tại của 1 file trong ổ cứng. Xảy ra 2 trường hợp:
1. Có tồn tại file đang dò tìm, thì cho phép chạy tiếp tục chương trình chính.
2. Không tìm thấy, sẽ thoát khỏi chương trình con, và chương trình chính.
Cám ơn nhiều!
Đoạn code:

(defun C:chaythu
(CHECKFILE)
(alert "Chuong trinh chay binh thuong!")
(princ)

; Ham kiem tra
(defun CHECKFILE (/ CHECK1)
(setq CHECK1 (open "C:/file345.txt" "r"))
(if (= CHECK1 nil)
(alert "Khong tim thay!")
^c^c ; thoat lenh
)
); end CHECKFILE
)

  • 0

#2 ketxu

ketxu

    Copier - Paster - Editor

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

Đã gửi 16 July 2012 - 05:12 PM

- Bạn dùng hàm findfile để kiểm tra sự tồn tại của file, không nhất thiết phải "open" nó.
- Bạn xem lại cấu trúc hàm If
- Hàm con của bạn được load sau khi nó được gọi (được gọi ngay cả khi chưa định nghĩa), hãy đổi vị trí hàm con lên đầu hoặc ra ngoài thân hàm chính
  • 2

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 lp_hai

lp_hai

    biết lệnh measure

  • Members
  • PipPipPipPipPipPip
  • 456 Bài viết
Điểm đánh giá: 202 (khá)

Đã gửi 16 July 2012 - 05:16 PM

Thứ 1 cú pháp của bạn bị sai: ở chương trình chính phải có thêm dấu ) sau (princ) để đóng chương trình chính lại
Chương trình con phải độc lập với chương trình chính bạn ah, bỏ dấu đóng cuối cùng ở trình con.
Còn nội dung code mình chua nói tới
Về yêu cầu cũng chưa rõ: khi tìm thấy file thì trình chính vẫn tiếp tục chạy? chạy đến khi nào? hay tiếp tục chạy là báo: Tìm thấy file?

Nếu vậy bạn chỉ cần một ĐK if là đủ:

(if (open "C:/file345.txt" "r") (princ "\nDa tim thay file"); đây là đoạn mà bạn gọi là chương trình tiếp tục
(princ "\nKhong tim thay file");báo ko tìm thấy
)
  • 0
Hình đã gửi

#4 luckylucke_2009

luckylucke_2009

    biết zoom

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

Đã gửi 17 July 2012 - 08:36 AM

Em rất cám ơn bác ketxu đã quan tâm gỡ rối cho tôi đoạn lisp trên.
Nhờ bác chỉ thêm cấu trúc của hàm findfile đối với 1 file nằm trên mạng nội bộ.
Có phải là: (findfile "\\IP\\ten_thu_muc\\ten_file").
Cám ơn!
  • 0

#5 ketxu

ketxu

    Copier - Paster - Editor

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

Đã gửi 17 July 2012 - 09:10 AM

Bạn hãy thử dùng hàm getfiled để pick chọn đến file, từ đó đọc đường dẫn để xem cấu trúc của nó
  • 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


#6 luckylucke_2009

luckylucke_2009

    biết zoom

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

Đã gửi 21 July 2012 - 09:50 AM

Rất cám ơn bác ketxu! Cho tôi hỏi thêm 1 cái nữa.
Sau khi chỉnh sửa đoạn code lại:

(Prompt "\Thi hanh bang lenh \"chaythu\".")
;Chuong trinh chinh
(Defun C:chaythu ()

(chophep)

(command "_.TEXT" "mc" (list 0.0 0.0 0.0) 5.0 0.0 "CHAY BINH THUONG")

(alert "Chuong trinh chay binh thuong!")
(princ)
);end defun chinh
(defun chophep (/ CHECK)
(setq CHECK (findfile "C:\\Windows\\win111.ini"))
(if (= CHECK nil)
(Alert "ban ko duoc su dung chuong trinh nay!")
^c^c; thoat lenh
);end if
);end chophep

Tuy nhiên, vẫn còn một vấn đề là dòng ^c^c để thoát lệnh không có tác dụng. Mục đích của tôi là sau khi tìm không thấy file "win111.ini" thì sẽ thoát hẳn khỏi defun chính luôn. Nhờ bác hướng dẫn thêm!
  • 0

#7 ketxu

ketxu

    Copier - Paster - Editor

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

Đã gửi 21 July 2012 - 04:46 PM

Bạn chưa đọc kỹ hàm If rồi.
Sau khi kiếm tra điều kiện If, nó chỉ thực hiện 1 việc thôi. Đúng (k nil) thì làm 1 việc A, nil thì làm 1 việc B (1 việc = 1 cái trong cặp dấu () ý)
=> Hàm if của bạn viết bị sai ý nghĩa, ^c^c chỉ thực hiện khi kiểm tra tìm thấy file. Khi k thấy file thì chỉ thực hiện hàm alert
Muốn gộp nhiều việc làm 1, bạn hãy đọc qua hàm Progn để gộp alert + ^c^c vào làm 1 ^^
  • 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


#8 luckylucke_2009

luckylucke_2009

    biết zoom

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

Đã gửi 22 July 2012 - 11:21 AM

Bạn chưa đọc kỹ hàm If rồi.
Sau khi kiếm tra điều kiện If, nó chỉ thực hiện 1 việc thôi. Đúng (k nil) thì làm 1 việc A, nil thì làm 1 việc B (1 việc = 1 cái trong cặp dấu () ý)
=> Hàm if của bạn viết bị sai ý nghĩa, ^c^c chỉ thực hiện khi kiểm tra tìm thấy file. Khi k thấy file thì chỉ thực hiện hàm alert
Muốn gộp nhiều việc làm 1, bạn hãy đọc qua hàm Progn để gộp alert + ^c^c vào làm 1 ^^

Nhưng khi tôi bỏ hẳn alert trong hàm IF thì vẫn không hiểu ^C^C để thoát lệnh.
Vẫn chưa hiểu, xin chỉ giúp thêm!

(Prompt "\Thi hanh bang lenh \"chaythu\".")
;Chuong trinh chinh
(Defun C:chaythu ()

(chophep)

(command "_.TEXT" "mc" (list 0.0 0.0 0.0) 5.0 0.0 "CHAY BINH THUONG")

(alert "Chuong trinh chay binh thuong!")
(princ)
);end defun chinh
(defun chophep (/ CHECK)
(setq CHECK (findfile "C:\\Windows\\win11111.ini"))
(if (= CHECK nil)
^^C)
);end chophep

Kết quả vẫn chạy ra dòng text: CHAY BINH THUONG. Chứ không ngắt lệnh!?
  • 0

#9 ketxu

ketxu

    Copier - Paster - Editor

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

Đã gửi 22 July 2012 - 11:44 AM

À, bạn lại phải xem thêm cả về lệnh ^c^c của bạn là gì nữa :)
Bạn đọc 2 ví dụ này là hiểu :


(defun c:test()
(defun a ()^c^c)
(a)
(princ "Chay xong (a) roi thi no chay tiep princ")
(princ)
)
(defun c:test1()
(defun b ()(princ "Chay xong (B) roi thi k chay tiep princ")(exit))
(B)
(princ)
)

- Về câu hỏi của bạn, một hàm con yêu cầu phải trả lại kết quả. Hàm (chophep) của bạn phải trả lại nilk hoặc khác nil
Hãy dùng chính kết quả này làm điều kiện cho hàm chính, đại loại như

(defun check (file_name)(findfile file_name))

(defun c:hamchinh()
(if (check tên_file)
(Doan code neu tim thay file)
(Doan code neu k tim thay file)
) ;End_if

  • 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


#10 phamngoctukts

phamngoctukts

    biết lệnh adcenter

  • CADViet Team
  • PipPipPipPipPipPipPip
  • 1107 Bài viết
Điểm đánh giá: 696 (tốt)

Đã gửi 22 July 2012 - 12:14 PM

Nhưng khi tôi bỏ hẳn alert trong hàm IF thì vẫn không hiểu ^C^C để thoát lệnh.
Vẫn chưa hiểu, xin chỉ giúp thêm!


(Prompt "\Thi hanh bang lenh \"chaythu\".")
;Chuong trinh chinh
(Defun C:chaythu ()

(chophep)

(command "_.TEXT" "mc" (list 0.0 0.0 0.0) 5.0 0.0 "CHAY BINH THUONG")

(alert "Chuong trinh chay binh thuong!")
(princ)
);end defun chinh
(defun chophep (/ CHECK)
(setq CHECK (findfile "C:\\Windows\\win11111.ini"))
(if (= CHECK nil)
^^C)
);end chophep

Kết quả vẫn chạy ra dòng text: CHAY BINH THUONG. Chứ không ngắt lệnh!?



Thấy bạn loay hoay mãi vẫn chưa được vậy nên tốt nhất là sửa code cho bạn từ đó bạn có thể đưa ra cách làm.

(Prompt "\Thi hanh bang lenh \"chaythu\".")

;Chuong trinh chinh
(Defun C:chaythu ()
(if (chophep (setq dd "C:\\Windows\\win11111.ini"))
(progn
(command "_.TEXT" "mc" (list 0.0 0.0 0.0) 5.0 0.0 "CHAY BINH THUONG")
(alert "Chuong trinh chay binh thuong!")
)
(alert (strcat "khong tim thay file: " dd))
)
(princ)
);end defun chinh
(defun chophep (CHECK)
(setq kq (findfile CHECK))
kq
);end chophep

  • 0
Tất cả vì sự phát triển của diễn đàn ...
Cám ơn đừng nói lời suông mà hãy nhấn Hình đã gửi!

#11 luckylucke_2009

luckylucke_2009

    biết zoom

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

Đã gửi 22 July 2012 - 03:09 PM

Cám ơn bác ketxu và phamngoctukts do không rành mấy lệnh của lisp nên làm phiền mấy bác quá nhiều. Không nhớ đọc ở đâu cái lệnh thoát 2 cấp là ^c^c, nên bị lòng vòng mãi. Tôi đã thử thay ^C^C trong đoạn code đã gởi bằng (exit) là chạy như ý muốn.
  • 0

#12 lp_hai

lp_hai

    biết lệnh measure

  • Members
  • PipPipPipPipPipPip
  • 456 Bài viết
Điểm đánh giá: 202 (khá)

Đã gửi 23 July 2012 - 10:29 AM

Cám ơn bác ketxu và phamngoctukts do không rành mấy lệnh của lisp nên làm phiền mấy bác quá nhiều. Không nhớ đọc ở đâu cái lệnh thoát 2 cấp là ^c^c, nên bị lòng vòng mãi. Tôi đã thử thay ^C^C trong đoạn code đã gởi bằng (exit) là chạy như ý muốn.

hehehe, hình như bác lộn ^c^c là nằm trong macro, nó để thoát lệnh trước đó, dùng trong tạo nút lệnh
  • 0
Hình đã gửi