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

Đường dẫn của file lisp vừa mới load!!!!!!!!!!!!

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

Tôi thấy có người hỏi vấn đề như thế này:

 

Em có thư mục chứa thư viện nằm trong CD. Có cách nào khi load file lisp nằm trong thu mục này thì nó gán cho biến tenduongan là đường dẩn thư mục chứa file líp này không.

Ví dụ: đường dẩn file lisp như thế này E:\BV\DUY\DUONGAN.LSP

sau khi load lên thì thu được biến tenđuongan là E:\BV\DUY\

Bác nào biết chỉ giúp với.

 

 

Các ban chưa giải quyết triệt để. Xin nói vài lời (tai thấy cái này hay hay).

 

Dài dòng một chút nhé.

Tôi đặt ra trường hợp thế này: Tôi có một file lisp đặt bất kỳ đâu trên ổ đĩa. Mỗi lần tôi cho CAD load file Lisp này tự nó nhận ra nó đang ở thư mục nào?

 

dài dòng nữa. Các bạn mở CAD lên, ở hộp thoại appload đó. Bạn thử load một file lisp nào đó, nhớ để ý đường dẫn của file này. Rồi nhìn xem ở phần LOADED APPLICATION: có dòng đầu tiên mờ mờ nó trùng với đường dẫn của file lisp bạn vừa mới load không?

 

Quay lại với cái trường hợp tôi đặt ra nhé. Bắt đầu cho file lisp này tôi chèn một đoạn CODE như sau:

 

(defun c:tenham(/ path)

(setq path (vl-registry-read "HKEY_CURRENT_USER\\Software\\Autodesk\\AutoCAD\\R17.1\\ACAD-6001:409\\Profiles\\<<Unnamed Profile>>\\Dialogs\\Appload" "MainDialog"))

;CAC CODE TIEP THEO

)

 

 

Save rồi Mở CAD load file này nhé: gõ lệnh TENHAM bạn thấy báo ngay thư mục chứa file lisp. Cần dùng tiếp trong file lisp này thì lấy ra từ biến PATH.

Tui giải thích thêm tí nữa, không tải về các cô các bác gặp lỗi.

Cái hàm: vl-registry-read dùng để đọc khoá từ registry của Windows. ACAD lưu đường dẫn của file lisp vừa load ở khoá dài dòng như trên đó. Ai biết về registry thì biết liền nhé. Còn ai chưa biết thì cứ thế mà làm.

Nhưng còn nữa. CÁc phiên bản CAD khác nhau lại khác nhau tí xíu: ở đoạn này: R17.1\\ACAD-6001:409

 

Để biết được nó chính xác như thế nào phải cài hết các bản cad vào máy rùi tìm. Tôi nói sơ vậy thôi

Nếu là bản 2008 thì nó là như vậy

Bản 2009 thay R17.1 bằng R17.2 và ACAD-6001:409 bằng ACAD-7001:409

Cứ thay như thế nhé:

Bản AutoCad 2004: R16 --- 2001

Bản AutoCad 2005: R16.1 --- 3001

Bản AutoCad 2006: R16.2 --- 4001

Bản AutoCad 2007: R17 --- 5001

Bản AutoCad 2008: R17.1 --- 6001

Bản AutoCad 2009: R17.2 --- 7001

(Chính xác hay chưa tôi chưa kiểm chắc vì không có đủ thời gian để cài hết các bản ACAD)

Thêm một chú ý là dấu "\" trên đường dẫn của khoá trong registry, thì code lisp sửa thành "\\" hoặc "/"

 

 

 

Chúc mọi người công việc thuận lợi!

Ai góp ý nhào vô nhé.

Ai có tưởng gì thì phát biểu 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

Cảm ơn bạn, cách này khá hay. Từ lâu rồi tôi luôn tìm kiếm, nhưng không nghĩ ra là đọc từ đường dẫn của Appload Dialog.

 

Đoạn khác biệt R17.1\\ACAD-6001:409 mà bạn thắc mắc thì rất dễ, có thể dùng hàm (vlax-product-key) để biết chính xác phần này.

Ngoài ra nếu mình cố định ">" thì không phải lúc nào cũng đúng. Điều này chỉ đúng khi người sử dụng chưa định nghĩa một Profile nào. Khi người sử dụng có nhiều profile, để muốn biết profile hiện tại, sử dụng tập hợp hàm (vla-get-activeprofile (vla-get-profiles (vla-get-preferences (vlax-get-acad-object)))) để xác định nó.

 

Như vậy, cải tiến lệnh TENHAM dưới đây sẽ chạy đúng trong mọi phiên bản acad và chạy đúng trong mọi trường hợp profile:

(defun c:tenham()
 (princ
   (vl-registry-read
     (strcat "HKEY_CURRENT_USER\\"
      (vlax-product-key)
      "\\Profiles\\"
      (vla-get-activeprofile
	(vla-get-profiles
	  (vla-get-preferences
	    (vlax-get-acad-object)
	  )
	)
      )
      "\\Dialogs\\Appload"
     )
     "MainDialog"
   )
 )
 (princ)
)

  • Vote tăng 2

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áy mình cài cả Cad2002 và 2007, chạy cái của bạn nk_long cũng như của anh Hoành đều cho kết quả không đúng. Cụ thể:

Đáng lẽ kết quả đúng là: D:\LapTrinh\AutoLisp

Nhưng kết quả nhận được là: C:\Program Files\AutoCAD 2002

Muốn có được D:\LapTrinh\AutoLisp thì cái key phải toàn là số như sau:

HKEY_USERS\S-1-5-21-343818398-1606980848-682003330-1003\Software\Autodesk\AutoCAD\R17.0\ACAD-5001:409\Profiles\<>\Dialogs\Appload

 

Mình đã thử cái này, kết quả luôn luôn đúng cho cả Cad2002 và 2007:

(defun LastLoad( / K)
(setq K (strcat
"HKEY_CURRENT_USER\\Software\\Microsoft\\Windows\\"
"CurrentVersion\\Explorer\\ComDlg32\\OpenSaveMRU\\*"
))
(vl-registry-read K (substr (vl-registry-read K "MRUList") 1 1))
)

LastLoad trả về Full filename của file đã load cuối cùng bằng appload dialog, bất kể đó là lsp, vlx, arx...

Các bạn kiểm tra giúp xem lastload có đúng với mọi version Cad cũng như trong nhiều tình huống khác nhau hay không?

Từ full filename, có thể lấy path một cách dễ dàng. Ví dụ:

(vl-filename-directory (LastLoad))

  • Vote tăng 5

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áy mình cài cả Cad2002 và 2007, chạy cái của bạn nk_long cũng như của anh Hoành đều cho kết quả không đúng. Cụ thể:

Đáng lẽ kết quả đúng là: D:\LapTrinh\AutoLisp

Nhưng kết quả nhận được là: C:\Program Files\AutoCAD 2002

Muốn có được D:\LapTrinh\AutoLisp thì cái key phải toàn là số như sau:

HKEY_USERS\S-1-5-21-343818398-1606980848-682003330-1003\Software\Autodesk\AutoCAD\R17.0\ACAD-5001:409\Profiles\<<Unnamed Profile>>\Dialogs\Appload

 

Mình đã thử cái này, kết quả luôn luôn đúng cho cả Cad2002 và 2007:

(defun LastLoad( / K)
(setq K (strcat
"HKEY_CURRENT_USER\\Software\\Microsoft\\Windows\\"
"CurrentVersion\\Explorer\\ComDlg32\\OpenSaveMRU\\*"
))
(vl-registry-read K (substr (vl-registry-read K "MRUList") 1 1))
)

LastLoad trả về Full filename của file đã load cuối cùng bằng appload dialog, bất kể đó là lsp, vlx, arx...

Các bạn kiểm tra giúp xem lastload có đúng với mọi version Cad cũng như trong nhiều tình huống khác nhau hay không?

Từ full filename, có thể lấy path một cách dễ dàng. Ví dụ:

(vl-filename-directory (LastLoad))

 

Cảm ơn mọi người đã giải quyết được thắc mắt của mình. Nhưng mình dị ứng với mấy hàm vl lắm có cách gì không dùng hàm vl không. (đọc path từ full filename mà không dùng hàm vl- thì mình làm đượ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

Bạn ơi, trong cái PATH của bạn :

HKEY_USERS\S-1-5-21-343818398-1606980848-682003330-1003\Software\Autodesk\AutoCAD\R17.0\ACAD-5001:409\Profiles\<<Unnamed Profile>>\Dialogs\Appload

thì cái dãy S-1-5-21-343818398-1606980848-682003330-1003\ hình như mỗi máy nó lại mỗi khác, có cách gì khắc phục ko 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

Nhờ các bạn Lisper xem lại sao Lisp LastLoad     (vl-filename-directory (LastLoad)) nó không chạy đúng đường dẫn file lisp vừa Load. Thanks!

Hàm LastLoad của bác SSG viết cách đây cũng hơn 7 năm rồi,

chắc lúc đó bác SSG sử dụng Win XP khác với hệ điều hành hiện tại 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

Mình xài Win7 Cad2007. gia_bach giúp cải thiện lisp LastLoad của bác SSG dùm .  Thanks!

Tôi không có win 7 để check,

Tham khảo bài của bác Hà : http://www.cadviet.com/forum/topic/66933-hoi-cach-load-menu-bang-lisp-khong-dung-lenh-menuload/?do=findComment&comment=214977

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

Thử cái này. Nếu không được nữa thì hỏi Cụ Windows nhé! Lisp lấy path của file lisp vừa load.

(defun C:PATH( / path K K1)
 (setq path (vl-registry-read (strcat "HKEY_CURRENT_USER\\" (vlax-product-key) "\\Profiles\\" (vla-get-activeprofile (vla-get-profiles (vla-get-preferences (vlax-get-acad-object)))) "\\Dialogs\\Appload") "MainDialog"))
 (setq K (strcat "HKEY_CURRENT_USER\\Software\\Microsoft\\Windows\\" "CurrentVersion\\Explorer\\ComDlg32\\OpenSaveMRU\\*"))
 (setq K1 (vl-registry-read K "MRUList"))
 (cond
  (path (substr path 1 (- (strlen path) 1)))
  (K1 (vl-registry-read K (substr K1 1 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

Để kiểm tra đường dẫn file lisp vừa mới Load đúng với mọi phiên bản Cad bạn cần có kiến thức chút ít về Khóa Registry (Ai đã học qua Quản trị mạng đều biết về nó và may quá là tôi đã học qua khóa này :) ). Ở đây tôi đề cập đến mục :

HKEY_CURRENT_USER: Nơi lưu những thông tin về phần mềm, các lựa chọn, các thiết lập ... của người dùng đang Logon.

Các bước  :

1/ Appload một file .lsp và hãy nhớ đường dẫn tới file .lsp ; copy chúng

2/ Trong Run window bạn gõ regedit -> Enter -> Yes

3/ Click chuột vào HKEY_CURRENT_USER, ấn Ctrl+F -> Ctrl+V -> FindNext

Bạn sẽ thấy đường dẫn tới file .lsp nằm trong “MainDialog” với khóa REG_SZ (Khóa dạng chuỗi). Bạn truy ngược lại đường dẫn tới khóa này là ra vấn đề.

4/ Đóng Registry Editor, tiếp tục Appload một file .lsp có đường dẫn khác

5/ Bạn lại vào Run window gõ regedit -> Enter -> Yes thì bạn sẽ thấy đường dẫn khác nằm trong “MainDialog”

Từ đây công việc của Lisp là dùng hàm (vl-registry-read reg-key) để đọc giá trị reg-key

chính là đường  dẫn tới file .lsp.

:) 

  • 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

Hiểu theo kiểu nông dân thì với mỗi máy ta lại truy sẽ cho kết quả luôn đúng. Vậy théc méc theo kiểu nông dân đã truy cho từng máy thì việc lấy đường dẩn tự động có ứng dụng gì.

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

...........

3/ Click chuột vào HKEY_CURRENT_USER, ấn Ctrl+F -> Ctrl+V -> FindNext

..............

:)

Với Windows 8.1, CAD 2014-2015, tìm trong registry không chỉ khoá HKCU mà toàn bộ computer nhưng chẳng thấy file lisp đã load đâu cả.

hay tại tôi chưa qua khoá Quản trị mạ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

Hiểu theo kiểu nông dân thì với mỗi máy ta lại truy sẽ cho kết quả luôn đúng. Vậy théc méc theo kiểu nông dân đã truy cho từng máy thì việc lấy đường dẩn tự động có ứng dụng gì.

“lấy đường dẩn tự động có ứng dụng gì” thì mình không rõ nhưng cách truy tìm như trên là có ứng dụng đấy bạn ạ.

Nếu máy bạn nhiễm virus chẳng hạn như autopico.exe sẽ làm máy chạy chậm kinh khủng. Bạn phải truy tìm ra nó và xóa chúng đi trên ổ cứng là chưa đũ vì nó co thể tái sinh bất cứ lúc nào, bạn phài truy tận sào huyệt mà nó ần núp trong regisgy mà tiêu diệt…và đây là cách diệt virus bằng tay  :)

  • 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

Với Windows 8.1, CAD 2014-2015, tìm trong registry không chỉ khoá HKCU mà toàn bộ computer nhưng chẳng thấy file lisp đã load đâu cả.

hay tại tôi chưa qua khoá Quản trị mạng  :(

Điều đó chứng tỏ phần mềm Cad 2014-2015 không còn tạo ra lọa khóa dạng chuỗi nữa bạn ah, có thể nó tạo ra dạng khóa bảo mật hơn không phải kiểu chuỗi dễ phát hiện và điều này thì Lisp cũng thua vì ta không biết nó lưu vào đâu trong Regisgy :D

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  

×