Đến nội dung


Hình ảnh
- - - - -

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


  • Please log in to reply
11 replies to this topic

#1 KS.PhanThanhTu

KS.PhanThanhTu

    biết vẽ point

  • Members
  • PipPip
  • 97 Bài viết
Điểm đánh giá: 76 (tàm tạm)

Đã gửi 13 November 2010 - 04:50 PM

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
  • 0
KS Phan Thanh Tú.Email: Vansulich@yahoo.com

#2 phamngoctukts

phamngoctukts

    biết lệnh adcenter

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

Đã gửi 13 November 2010 - 05:46 PM

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

#3 KS.PhanThanhTu

KS.PhanThanhTu

    biết vẽ point

  • Members
  • PipPip
  • 97 Bài viết
Điểm đánh giá: 76 (tàm tạm)

Đã gửi 13 November 2010 - 06:22 PM

Cái acad.lsp không đúng ý của mình rồi bạn ạ

Bạn đọc kỹ thì sẽ hiểu ý thôi mà
  • 0
KS Phan Thanh Tú.Email: Vansulich@yahoo.com

#4 KS.PhanThanhTu

KS.PhanThanhTu

    biết vẽ point

  • Members
  • PipPip
  • 97 Bài viết
Điểm đánh giá: 76 (tàm tạm)

Đã gửi 13 November 2010 - 06:45 PM

: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...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
)

  • 0
KS Phan Thanh Tú.Email: Vansulich@yahoo.com

#5 Thaistreetz

Thaistreetz

    biết lệnh adcenter

  • Advance Member
  • PipPipPipPipPipPipPip
  • 903 Bài viết
Điểm đánh giá: 505 (tốt)

Đã gửi 13 November 2010 - 07:03 PM

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

Hình đã gửi
IN HIM, I TRUST. THE TRUST IN MY GOD


#6 ssg

ssg

    biết lệnh adcenter

  • Vip
  • PipPipPipPipPipPipPip
  • 1228 Bài viết
Điểm đánh giá: 1087 (rất tốt)

Đã gửi 13 November 2010 - 08:19 PM

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

#7 Thaistreetz

Thaistreetz

    biết lệnh adcenter

  • Advance Member
  • PipPipPipPipPipPipPip
  • 903 Bài viết
Điểm đánh giá: 505 (tốt)

Đã gửi 13 November 2010 - 09:06 PM

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

Hình đã gửi
IN HIM, I TRUST. THE TRUST IN MY GOD


#8 baochilam_hn

baochilam_hn

    Chưa sử dụng CAD

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

Đã gửi 13 November 2010 - 09:58 PM

minh moi vào..mong mọi người giúp đỡ
  • 0
baochilam_hn

#9 KS.PhanThanhTu

KS.PhanThanhTu

    biết vẽ point

  • Members
  • PipPip
  • 97 Bài viết
Điểm đánh giá: 76 (tàm tạm)

Đã gửi 13 November 2010 - 10:29 PM

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!
  • 0
KS Phan Thanh Tú.Email: Vansulich@yahoo.com

#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 14 November 2010 - 02:05 AM

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).
  • 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 ssg

ssg

    biết lệnh adcenter

  • Vip
  • PipPipPipPipPipPipPip
  • 1228 Bài viết
Điểm đánh giá: 1087 (rất tốt)

Đã gửi 14 November 2010 - 06:09 PM

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.c...tent/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.
  • 0

#12 ssg

ssg

    biết lệnh adcenter

  • Vip
  • PipPipPipPipPipPipPip
  • 1228 Bài viết
Điểm đánh giá: 1087 (rất tốt)

Đã gửi 14 November 2010 - 06:26 PM

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