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

Lấy path của lispfile

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

Có cách nào để lấy path của lisp file tự nó không nhỉ?

Các ngôn ngữ khác có biến ___FILE___ để lấy filepath của chính 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

Tự nó là chính nó đấy bác, em cần một đoạn code viết trong file để lấy path của nó. Em nghĩ là ở dòng thứ 2 em đã giải thích cặn kẽ. 

Giả sử có 1 file abc.lsp. Một đoạn code trong file abc.lsp sẽ cho ra path của file VD "c:/lisp/abc.lsp"

https://translate.google.com/translate?hl=vi&sl=en&u=https://stackoverflow.com/questions/224379/what-does-file-mean-in-ruby&prev=search&pto=aue

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

đó là đường dẫn của file load sau cùng trong appload, mà em có appload file đó sau cùng đâu?

Dù sao cũng cảm ơn bác đã gợi ý cho em một hướng đi.

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

Em muốn hỏi có cách nào để lấy path của chính nó không thôi. Bác không muốn hiểu rồi. Bác cho em các tìm ra path của file load sau cùng. Nhưng em hầu như không appload, mà chỉ muốn tận dụng đường dẫn của file để lấy cho các file khác. Như bác nói thì phải appload nó mới ra đường dẫn trong registry, rồi appload file khác nó sẽ ra path khác. Em lấy path cũ  để chèn block bằng cách nào? Chẳng lẽ lại appload lại.

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ô tả cho bác dễ hiểu là như thế này, trước em để lisp ở ổ F, đường dẫn của các file lisp là F:\lisp. Giờ dùng sang máy khác không có ổ F nên đặt ở ổ E. Một file lisp duy nhất nhiệm vụ chỉ để dùng load các file khác có tên là loadlisp.lsp được nạp vào startup. Trong file này trỏ đến load nhiều file lisp con. Mục tiêu của em là có hàm trong file lisp con này lấy được path của file lisp con để khỏi phải thay đổi đường dẫn cho chèn block, hay đọc txt file mỗi khi thay máy tính.

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ôi nghĩ lisp không có khả năng này vì lisp không phải ngôn ngữ hướng đối tượng như ruby.

Bác biết C# thì tìm thử có hàm nào tương tự không.

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ước cũng tìm từ khóa thế này roài mà vẫn chưa ra, với vba thì mình có thể lấy dc đường dẫn của chính file dvb được.

 

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
16 giờ trước, cuongtk2 đã nói:

Mô tả cho bác dễ hiểu là như thế này, trước em để lisp ở ổ F, đường dẫn của các file lisp là F:\lisp. Giờ dùng sang máy khác không có ổ F nên đặt ở ổ E. Một file lisp duy nhất nhiệm vụ chỉ để dùng load các file khác có tên là loadlisp.lsp được nạp vào startup. Trong file này trỏ đến load nhiều file lisp con. Mục tiêu của em là có hàm trong file lisp con này lấy được path của file lisp con để khỏi phải thay đổi đường dẫn cho chèn block, hay đọc txt file mỗi khi thay máy tính.

Mình cũng giống bạn, đi tìm giải pháp khá lâu nhưng không có kết quả, thôi đành làm thủ công vậy.

Set biến đường dẫn thành nhiều biến, từ ổ D:\...file.lsp,  E, F, G, H, ... sau đó Findfile tất cả, cái nào tìm thấy thì lấy cái đó làm đường dẫn.

Như vậy là xong.

PS: giải thích cho mấy bác không hiểu. vụ này là cắm USB chứa các file lisp, ở mỗi máy có thể tên ổ USB sẽ khác nhau, làm vậy để load 1 file lisp là tất cả các file khác có thể được load theo.

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

-Chủ đề này mình cũng lội rồi. Cuối cùng chấp nhận load 1 file lisp file này làm nhiệm vụ hỏi chọn 1 file khác trong thư mục qua thao tác này lấy được đường dẩn thự mục, gán nó cho một biến, biến này sẽ ảnh hưởng đến toàn bộ các thứ dùng đến đường dẩn trong các lisp còn lại.

-Hình như trên cadviet đã có đoạn lisp chọn thư mục không cần chọn file để lọc thư mục nửa. 

-Muốn bỏ qua bước load 1 file lisp và chọn đường dẩn để lấy biến đến nay mình vẫn bí. và cũng chưa tìm thấy giải pháp lisp.

https://www.cadviet.com/forum/topic/5597-lisp-di-động/

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ới câu hỏi chủ thớt thì mình không biết.

- Nhưng đối với chương trình có dung lượng không quá lớn thì mình cho tất cả các loại file (.lsp, .fas, .dcl, .dwg, .txt ...) vào 1 file .VLX (thậm chí cả .vlx).

- Vấn đề lưu, kiểm tra khi đường dẫn thay đổi thì mình đi theo hướng dưới đây, không biết có giúp được gì cho các bạn không???

(defun c:tt  (/ file fwrite myfile path LM:getfiles:browseforfolder LM:getfiles:fixdir)
  (defun LM:getfiles:fixdir  (dir)
    (vl-string-right-trim "\\" (vl-string-translate "/" "\\" dir)))
  (defun LM:getfiles:browseforfolder  (msg dir flg / err fld pth shl slf)
    (setq err (vl-catch-all-apply (function (lambda (/ app hwd)
                                              (if (setq app (vlax-get-acad-object)
                                                        shl (vla-getinterfaceobject app "shell.application")
                                                        hwd (vl-catch-all-apply 'vla-get-hwnd (list app))
                                                        fld (vlax-invoke-method shl
                                                                                'browseforfolder
                                                                                (if (vl-catch-all-error-p hwd)
                                                                                  0
                                                                                  hwd)
                                                                                msg
                                                                                flg
                                                                                dir))
                                                (setq slf (vlax-get-property fld 'self)
                                                      pth (LM:getfiles:fixdir (vlax-get-property slf 'path))))))))
    (if slf
      (vlax-release-object slf))
    (if fld
      (vlax-release-object fld))
    (if shl
      (vlax-release-object shl))
    (if (vl-catch-all-error-p err)
      (prompt (vl-catch-all-error-message err))
      pth))
  (setq myfile "myfile.txt")
  (cond ((and (setq path (getenv "MYPROGRAM\\MYPATH"))
              (setq file (findfile (strcat path "\\" myfile)))))
        ((progn (while (not
                         (and (setq path (LM:getfiles:browseforfolder "Chon thu muc" nil 512))
                              (setq file (findfile (strcat path "\\" myfile))))))
                (setenv "MYPROGRAM\\MYPATH" path))))
  ;; chuong trinh chinh
  (setq fwrite (open file "a"))
  (alert (write-line (strcat "Duong dan mac dinh:\n" path) fwrite))
  (close fwrite)
  (princ))

Dir.LSP

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
10 giờ trước, quocmanh04tt đã nói:

- Với câu hỏi chủ thớt thì mình không biết.

- Nhưng đối với chương trình có dung lượng không quá lớn thì mình cho tất cả các loại file (.lsp, .fas, .dcl, .dwg, .txt ...) vào 1 file .VLX (thậm chí cả .vlx).

- Vấn đề lưu, kiểm tra khi đường dẫn thay đổi thì mình đi theo hướng dưới đây, không biết có giúp được gì cho các bạn không???

(defun c:tt  (/ file fwrite myfile path LM:getfiles:browseforfolder LM:getfiles:fixdir)
  (defun LM:getfiles:fixdir  (dir)
    (vl-string-right-trim "\\" (vl-string-translate "/" "\\" dir)))
  (defun LM:getfiles:browseforfolder  (msg dir flg / err fld pth shl slf)
    (setq err (vl-catch-all-apply (function (lambda (/ app hwd)
                                              (if (setq app (vlax-get-acad-object)
                                                        shl (vla-getinterfaceobject app "shell.application")
                                                        hwd (vl-catch-all-apply 'vla-get-hwnd (list app))
                                                        fld (vlax-invoke-method shl
                                                                                'browseforfolder
                                                                                (if (vl-catch-all-error-p hwd)
                                                                                  0
                                                                                  hwd)
                                                                                msg
                                                                                flg
                                                                                dir))
                                                (setq slf (vlax-get-property fld 'self)
                                                      pth (LM:getfiles:fixdir (vlax-get-property slf 'path))))))))
    (if slf
      (vlax-release-object slf))
    (if fld
      (vlax-release-object fld))
    (if shl
      (vlax-release-object shl))
    (if (vl-catch-all-error-p err)
      (prompt (vl-catch-all-error-message err))
      pth))
  (setq myfile "myfile.txt")
  (cond ((and (setq path (getenv "MYPROGRAM\\MYPATH"))
              (setq file (findfile (strcat path "\\" myfile)))))
        ((progn (while (not
                         (and (setq path (LM:getfiles:browseforfolder "Chon thu muc" nil 512))
                              (setq file (findfile (strcat path "\\" myfile))))))
                (setenv "MYPROGRAM\\MYPATH" path))))
  ;; chuong trinh chinh
  (setq fwrite (open file "a"))
  (alert (write-line (strcat "Duong dan mac dinh:\n" path) fwrite))
  (close fwrite)
  (princ))

Dir.LSP

Chỉ cần findfile chính nó là ra được path, tuy nhiên có thể xảy ra ngoại lệ double file. Đó là lý do mình muốn có hàm như thế

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

Hoặc là tạo file .bat đặt trong thư mục lisp để lấy đường dẫn của chính nó rồi ghi lên reg. Rồi file lisp autoload mình chạy file .bat đấy rồi lấy đường dẫn từ reg về nhỉ.

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

Lúc nãy lên GG tìm lại thấy một vấn đề nan giải, một file lsp được biên dịch thành abc.fas. Một người dùng khác lại rename thành bcd.fas. Như vậy tìm abc không có ý nghĩa, file đã biên dịch không thể nào sửa thành tìm bcd

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
33 phút trước, cuongtk2 đã nói:

Chỉ cần findfile chính nó là ra được path, tuy nhiên có thể xảy ra ngoại lệ double file. Đó là lý do mình muốn có hàm như thế

Bạn có thể gán điều kiện find nhiều file, thêm nữa đọc và kiểm tra nội dung của file text nào đó mà bạn quy định.

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

×