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

Kết hợp Lisp với các ngôn ngữ khác thông qua STARTAPP

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

Mình đang có ý tưởng sử dụng lệnh startapp để chạy một đoạn modun chương trình ở bên ngoài, có thể ở dạng EXE-DLL

Như thế vừa chuyên môn hoá đc những công vịệc mà Lisp khó làm , đóng gói dễ dàng

 

Tuy nhiên, thứ nhất là vấn đề đường dẫn, có thể chúng ta đặt file LSP và EXE trong cùng một thư mục

 

Khi người dùng chạy lệnh được đặt thông qua Defun c:command trong lsp sẽ gọi hàm startapp

 

Giờ có 2 khó khăn ở đây:

 

-Lấy đường dẫn của LSP và EXE (giống nhau vì đặt cùng 1 thư mục): cái này mình có cách là đọc registry nhưng mình nghĩ không hay lắm, vì nó sẽ lấy giá trị của tệp LISP cuối cùng được Load vào thông qua lệnh AP ( đọc khóa

 

(setq K (strcat

    "HKEY_CURRENT_USER\\Software\\Microsoft\\Windows\\"

    "CurrentVersion\\Explorer\\ComDlg32\\OpenSaveMRU\\*"

))

 

Không biết có cách nào hay hơn không??

 

-Thứ 2 , việc chuyển đổi từ đường dẫn tìm ra ví dụ D:\LISP CONG VIEC\2010\LISP-HAY\

sang đường dẫn cho lệnh startapp mình chưa hiểu lắm )D:\\LISP CONG VIEC . D:/ LISP CONG VIEC???

Nếu được bạn nào có thể viết hộ 1 đoạn lisp chuyển đổi này thì tốt quá

Trong trường hợp có dấu cách có bị hiểu lầm là Enter hay không???

 

Mong các bạn nghiên cứu và giải đáp hộ mì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
Mình đang có ý tưởng sử dụng lệnh startapp để chạy một đoạn modun chương trình ở bên ngoài, có thể ở dạng EXE-DLL

Như thế vừa chuyên môn hoá đc những công vịệc mà Lisp khó làm , đóng gói dễ dàng

 

Tuy nhiên, thứ nhất là vấn đề đường dẫn, có thể chúng ta đặt file LSP và EXE trong cùng một thư mục

 

Khi người dùng chạy lệnh được đặt thông qua Defun c:command trong lsp sẽ gọi hàm startapp

 

Giờ có 2 khó khăn ở đây:

 

-Lấy đường dẫn của LSP và EXE (giống nhau vì đặt cùng 1 thư mục): cái này mình có cách là đọc registry nhưng mình nghĩ không hay lắm, vì nó sẽ lấy giá trị của tệp LISP cuối cùng được Load vào thông qua lệnh AP ( đọc khóa

 

(setq K (strcat

    "HKEY_CURRENT_USER\\Software\\Microsoft\\Windows\\"

    "CurrentVersion\\Explorer\\ComDlg32\\OpenSaveMRU\\*"

))

 

Không biết có cách nào hay hơn không??

 

-Thứ 2 , việc chuyển đổi từ đường dẫn tìm ra ví dụ D:\LISP CONG VIEC\2010\LISP-HAY\

sang đường dẫn cho lệnh startapp mình chưa hiểu lắm )D:\\LISP CONG VIEC . D:/ LISP CONG VIEC???

Nếu được bạn nào có thể viết hộ 1 đoạn lisp chuyển đổi này thì tốt quá

Trong trường hợp có dấu cách có bị hiểu lầm là Enter hay không???

 

Mong các bạn nghiên cứu và giải đáp hộ mình

Cái này bạn đọc code của con virus acad.lsp là nhanh nhất. Nó giải đáp được những thắc mắc của bạ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

:iluvyousmiley:

 

Sau một lúc nghiên cứu cũng tìm ra cách rồi, các bạn tham khảo xem đc không nhé

:D

FIle test http://www.mediafire.com/?m18dv886yenp41l

 

Khi gõ lệnh MT sẽ chạy chương trình máy tính nho nhỏ của mình cần :D, máy tính này mà làm bằng Lisp thì chít :D

 

;use from cadviet-KSPhanThanhTu
(defun C:MT( / K)
(setq K (strcat
    "HKEY_CURRENT_USER\\Software\\Microsoft\\Windows\\"
    "CurrentVersion\\Explorer\\ComDlg32\\OpenSaveMRU\\*"
))
(setq ketqua (vl-filename-directory (vl-registry-read K (substr (vl-registry-read K "MRUList") 1 
1))))
(setq ketqua2 (STRCAT (ReplaceString "\\" "\\\\" ketqua) "\\" "VnCaculator.exe"))
(startapp ketqua2)
);; free lisp from cadviet.com
(defun ReplaceString (old_str new_str str / m n)
 (setq m 0 n (strlen new_str))
 (while (setq m (vl-string-search old_str str m))
(setq str (vl-string-subst new_str old_str str m))
(setq m (+ n m))
)
 str
 )

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 đang có ý tưởng sử dụng lệnh startapp để chạy một đoạn modun chương trình ở bên ngoài, có thể ở dạng EXE-DLL

Như thế vừa chuyên môn hoá đc những công vịệc mà Lisp khó làm , đóng gói dễ dàng

 

Tuy nhiên, thứ nhất là vấn đề đường dẫn, có thể chúng ta đặt file LSP và EXE trong cùng một thư mục

 

Khi người dùng chạy lệnh được đặt thông qua Defun c:command trong lsp sẽ gọi hàm startapp

 

Giờ có 2 khó khăn ở đây:

 

-Lấy đường dẫn của LSP và EXE (giống nhau vì đặt cùng 1 thư mục): cái này mình có cách là đọc registry nhưng mình nghĩ không hay lắm, vì nó sẽ lấy giá trị của tệp LISP cuối cùng được Load vào thông qua lệnh AP ( đọc khóa

 

(setq K (strcat

    "HKEY_CURRENT_USER\\Software\\Microsoft\\Windows\\"

    "CurrentVersion\\Explorer\\ComDlg32\\OpenSaveMRU\\*"

))

 

Không biết có cách nào hay hơn không??

 

-Thứ 2 , việc chuyển đổi từ đường dẫn tìm ra ví dụ D:\LISP CONG VIEC\2010\LISP-HAY\

sang đường dẫn cho lệnh startapp mình chưa hiểu lắm )D:\\LISP CONG VIEC . D:/ LISP CONG VIEC???

Nếu được bạn nào có thể viết hộ 1 đoạn lisp chuyển đổi này thì tốt quá

Trong trường hợp có dấu cách có bị hiểu lầm là Enter hay không???

 

Mong các bạn nghiên cứu và giải đáp hộ mình

Bạn tham khảo các hàm Acet-filename-xxxx, và các hàm trong thư viện DosLib thử xem (fiên bản mới nhất là 8.3 hỗ trợ cad2007 trở lên, với cad đời cũ hơn thì dùng fiên bản 6.1.5)

Việc chuyển đổi đuờng dẫn bạn có thể sử dụng 1 hàm thay thế chuỗi trong 1 chuỗi nào đó. hàm kiểu này thì nhiều rồi. ACET-STR-REPLACE chẳng hạ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
Mình đang có ý tưởng sử dụng lệnh startapp để chạy một đoạn modun chương trình ở bên ngoài, có thể ở dạng EXE-DLL

Như thế vừa chuyên môn hoá đc những công vịệc mà Lisp khó làm , đóng gói dễ dàng

 

Tuy nhiên, thứ nhất là vấn đề đường dẫn, có thể chúng ta đặt file LSP và EXE trong cùng một thư mục

 

Khi người dùng chạy lệnh được đặt thông qua Defun c:command trong lsp sẽ gọi hàm startapp

 

Giờ có 2 khó khăn ở đây:

 

-Lấy đường dẫn của LSP và EXE (giống nhau vì đặt cùng 1 thư mục): cái này mình có cách là đọc registry nhưng mình nghĩ không hay lắm, vì nó sẽ lấy giá trị của tệp LISP cuối cùng được Load vào thông qua lệnh AP ( đọc khóa

 

(setq K (strcat

    "HKEY_CURRENT_USER\\Software\\Microsoft\\Windows\\"

    "CurrentVersion\\Explorer\\ComDlg32\\OpenSaveMRU\\*"

))

 

Không biết có cách nào hay hơn không??

 

-Thứ 2 , việc chuyển đổi từ đường dẫn tìm ra ví dụ D:\LISP CONG VIEC\2010\LISP-HAY\

sang đường dẫn cho lệnh startapp mình chưa hiểu lắm )D:\\LISP CONG VIEC . D:/ LISP CONG VIEC???

Nếu được bạn nào có thể viết hộ 1 đoạn lisp chuyển đổi này thì tốt quá

Trong trường hợp có dấu cách có bị hiểu lầm là Enter hay không???

 

Mong các bạn nghiên cứu và giải đáp hộ mình

1- Có cách khác: EXE đặt ở đâu cũng được, miễn là bạn thiết lập Support File Search Path cho nó. Có thể thiết lập tự động bằng:

;;;------------------------------------------------------------------------------

(defun addspath(s) ;;;Add support file search path

(setenv "ACAD" (strcat (getenv "ACAD") ";" s))

)

;;;------------------------------------------------------------------------------

Sau đó, gọi startapp chỉ cần filename, không cần path.

 

2- Chỗ này ssg không hiểu, sao lại phải lằng nhằng như vậy? Cứ theo đúng quy ước vế path trong lisp.

Ví dụ: bạn có file exe ở "D:\vi du\vncalc.exe"

thì cứ (startapp "D:\\vi du\\vncalc.exe") là nó chạy phà phà! Thử là biết liền mà?

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
2- Chỗ này ssg không hiểu, sao lại phải lằng nhằng như vậy? Cứ theo đúng quy ước vế path trong lisp.

Ví dụ: bạn có file exe ở "D:\vi du\vncalc.exe"

thì cứ (startapp "D:\\vi du\\vncalc.exe") là nó chạy phà phà! Thử là biết liền mà?

Việc các hàm lisp thường trả về đường dẫn dạng "\\" gây ra nhiều khó khăn trong quá trình sử dụng nên buộc phải chuyển về dạng "/". một vài lần em gặp phải trường hợp này khi lập trình điều khiển DCL. Có thể bạn PhanThanhTu cũng đã rơi vào trường hợp như em từng gặp. Em nghĩ không phải tự nhiên mà autolisp sinh ra 2 cách nhận diện đường dẫn file bá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

Cảm ơn bác ssg và Thaistreez đã quan tâm và trả lời

1- Có cách khác: EXE đặt ở đâu cũng được, miễn là bạn thiết lập Support File Search Path cho nó. Có thể thiết lập tự động bằng:
;;;------------------------------------------------------------------------------
(defun addspath(s);;;Add support file search path
(setenv "ACAD" (strcat (getenv "ACAD") ";" s))
)
;;;------------------------------------------------------------------------------
Sau đó, gọi startapp chỉ cần filename, không cần path.

 

Theo mình nghĩ thì với vị trí người dùng thì chúng ta hoàn toàn chưa biết họ sẽ tải chương trình chúng ta về máy và lưu ở thư mục cũng như ổ đĩa nào cả.

Bản thân mình thì tạo 1 thư mục riêng để lưu lại những chương trình hay sử dụng

Nên nếu làm như bác ssg thì thật sự là chưa biết cho chương trình nào vào trong support path của cad cả.

 

Hơn nữa xét về lâu dài, nhiều chương trình mà add vào thế e rằng không hay lắm.

 

Về vấn đề xử lý đường dẫn thì có thể nói là ổn rồi.

 

Chỉ có vấn đề tìm đường dẫn hiện thời của tệp LSP cũng như DLL,EXE thì vẫn chưa được hoàn thiện lắm

Mong các bác hồi âm!

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ỉ có vấn đề tìm đường dẫn hiện thời của tệp LSP cũng như DLL,EXE thì vẫn chưa được hoàn thiện lắm

Mong các bác hồi âm!

Theo mình biết thì các hàm trong lisp không có thằng nào có thể tìm kiếm được file bất kì trên ổ đía mà chỉ tìm được file trong support search path thôi.

Để giải quyết vấn đề này mình nghĩ là dùng chức năng search của getfiled (mất thêm một vài thao tá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
Cảm ơn bác ssg và Thaistreez đã quan tâm và trả lời

1- Có cách khác: EXE đặt ở đâu cũng được, miễn là bạn thiết lập Support File Search Path cho nó. Có thể thiết lập tự động bằng:
;;;------------------------------------------------------------------------------
(defun addspath(s);;;Add support file search path
(setenv "ACAD" (strcat (getenv "ACAD") ";" s))
)
;;;------------------------------------------------------------------------------
Sau đó, gọi startapp chỉ cần filename, không cần path.

 

1- Theo mình nghĩ thì với vị trí người dùng thì chúng ta hoàn toàn chưa biết họ sẽ tải chương trình chúng ta về máy và lưu ở thư mục cũng như ổ đĩa nào cả.

Bản thân mình thì tạo 1 thư mục riêng để lưu lại những chương trình hay sử dụng

Nên nếu làm như bác ssg thì thật sự là chưa biết cho chương trình nào vào trong support path của cad cả.

 

2- Hơn nữa xét về lâu dài, nhiều chương trình mà add vào thế e rằng không hay lắm.

 

Về vấn đề xử lý đường dẫn thì có thể nói là ổn rồi.

 

3- Chỉ có vấn đề tìm đường dẫn hiện thời của tệp LSP cũng như DLL,EXE thì vẫn chưa được hoàn thiện lắm

Mong các bác hồi âm!

1- Có nhiều cách làm để đạt được mục đích trên. Bạn tham khảo bài Chia đất của ssg như một cách khả dĩ:

http://www.cadviet.com/cadnews/content/view/98/1/

 

2- Theo ssg là chẳng hề gì, AutoCAD chấp nhận tất! Hơn nữa, số lượng app nói chung không phải là quá nhiều?

 

3- Dùng lastload để định vị Path của Application ssg thử nhiều rồi, kết quả chính xác, không phải lăn tăn. Cách làm của ssg là thiết lập Support File Search Path chỉ 1 lần (khi user chạy lisp lần đầu, các lần sau kiểm tra nếu có thì thôi). Các Application "chính thống" vẫn thường làm như vậy khi setup. Bạn cẩn thận hơn thì chuẩn bị luôn đoạn Uninstall để trả lại nguyên trạng khi user không muốn dùng App của bạn nữa.

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
Theo mình biết thì các hàm trong lisp không có thằng nào có thể tìm kiếm được file bất kì trên ổ đía mà chỉ tìm được file trong support search path thôi.

Để giải quyết vấn đề này mình nghĩ là dùng chức năng search của getfiled (mất thêm một vài thao tác).

Không có cái "ăn sẵn" (theo ssg biết thì ngôn ngữ lập trình nào cũng vậy thôi). Tuy nhiên, người ta thường cấp sẵn các "đồ nghề" để programmer có thể... lôi cổ ra bất cứ "chú" nào mình muốn.

Lisp tương tác với hệ thống khá hạn chế nhưng vẫn "chơi" được.

Ví dụ, với hàm vl-directory-files, bạn có thể lấy được toàn bộ các Sub Folders trên ổ đĩa hoặc trong 1 Folder nào đó:

;;;------------------------------------------------------
(defun fd(d / dl x y) ;;;Return ALL Sub Folders in d
(setq
   dl (vl-directory-files d "*" -1)
   res (append res (list d))
)
(foreach x dl
   (setq y (strcat d "\\" x))
   (if (and (not (vl-string-search "." y)) (not (vl-string-search ".." y))) (fd y))
)
res
)
;;;------------------------------------------------------
(defun C:VD( / d x)
(setq
 d (getstring "\nNhap path va ten Folder: " T)
 res nil
 res (fd d)
)
(foreach x res (princ "\n") (princ x))
(princ)
)
;;;------------------------------------------------------

Có kết quả res, dùng findfile sẽ tìm được file.

  • 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  

×