Đến nội dung


Hình ảnh
- - - - -

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


  • Please log in to reply
20 replies to this topic

#1 nk_long

nk_long

    biết vẽ line

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

Đã gửi 11 May 2008 - 03:41 AM

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

#2 Nguyen Hoanh

Nguyen Hoanh

    biết lệnh adcenter

  • Moderator
  • PipPipPipPipPipPipPip
  • 4106 Bài viết
Điểm đánh giá: 4495 (đỉnh cao)

Đã gửi 11 May 2008 - 09:13 AM

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

  • 2

#3 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 May 2008 - 11:27 AM

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))
  • 5

#4 duy782006

duy782006

    PHẠM QUỐC DUY

  • CADViet Team
  • PipPipPipPipPipPipPip
  • 2155 Bài viết
Điểm đánh giá: 1359 (rất tốt)

Đã gửi 14 May 2008 - 02:56 PM

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

Cứ ngỡ trần gian là cõi thật.Cho nên tất bật đến bây giờ.
Tạo hộp thoại bằng lisp My blog QUY ĐỊNH ĐẶT TÊN TOPIC TRONG CHUYÊN MỤC LISPD http://ktsduy.wordpress.com/
Để cám ơn chỉ cần nhấn rep_up.png
(Là nhấn vào nút đó phía bài viết của người ta í chứ đừng có nhè cái hình này mà nhấn miết đi nha :-D


#5 anonmyous

anonmyous

    biết vẽ arc

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

Đã gửi 11 August 2008 - 11:53 AM

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

#6 phamhung12

phamhung12

    biết vẽ ellipse

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

Đã gửi 23 June 2015 - 03:38 PM

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!


  • 0

#7 gia_bach

gia_bach

    biết lệnh adcenter

  • CADViet Team
  • PipPipPipPipPipPipPip
  • 1436 Bài viết
Điểm đánh giá: 1426 (rất tốt)

Đã gửi 23 June 2015 - 03:55 PM

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 ?


  • 0

#8 phamhung12

phamhung12

    biết vẽ ellipse

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

Đã gửi 23 June 2015 - 04:07 PM

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


  • 0

#9 gia_bach

gia_bach

    biết lệnh adcenter

  • CADViet Team
  • PipPipPipPipPipPipPip
  • 1436 Bài viết
Điểm đánh giá: 1426 (rất tốt)

Đã gửi 23 June 2015 - 04:11 PM

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.c...ad/#entry214977


  • 0

#10 phamhung12

phamhung12

    biết vẽ ellipse

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

Đã gửi 23 June 2015 - 04:41 PM

Không hiểu :( . Ý mình muốn có đoạn lisp để kiểm tra đường dẫn file lisp vừa mới Load như Topic, chứ không phải Add file :unsure:


  • 0

#11 Doan Van Ha

Doan Van Ha

    biết lệnh adcenter

  • CADViet Team
  • PipPipPipPipPipPipPip
  • 5454 Bài viết
Điểm đánh giá: 2626 (tuyệt vời)

Đã gửi 23 June 2015 - 04:51 PM

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

  • 0

* Chỉ nên yêu cầu Lisp khi bạn làm việc đó mất cả ngày nhưng họ chỉ viết 1 giờ. Đừng nêu yêu cầu Lisp khi bạn chỉ làm 1 giờ nhưng bắt họ phải mất cả ngày.

* Nhờ viết lisp cũng như đi khám bệnh. Chỉ gởi căn cước và than sắp chết thì không bác sỹ nào cứu sống được.


#12 phamhung12

phamhung12

    biết vẽ ellipse

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

Đã gửi 23 June 2015 - 05:14 PM

THANKS! Nhưng cũng ko thấy đúng đường dẫn :(


 


  • 0

#13 phamhung12

phamhung12

    biết vẽ ellipse

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

Đã gửi 23 June 2015 - 05:31 PM

Test thì ra vầy :

Command: (LOAD "D:/Acad/hskt.lsp") GHICANH

Command:
Command: (LOAD "D:/Acad/path.lsp") C:PATH

Command: path
""


  • 0

#14 Doan Van Ha

Doan Van Ha

    biết lệnh adcenter

  • CADViet Team
  • PipPipPipPipPipPipPip
  • 5454 Bài viết
Điểm đánh giá: 2626 (tuyệt vời)

Đã gửi 23 June 2015 - 06:44 PM

Tôi cũng dùng Win7, cad 2007 như bạn, kết quả OK.

Bạn chuyển sang load bằng lệnh Appload xem sao.


  • 1

* Chỉ nên yêu cầu Lisp khi bạn làm việc đó mất cả ngày nhưng họ chỉ viết 1 giờ. Đừng nêu yêu cầu Lisp khi bạn chỉ làm 1 giờ nhưng bắt họ phải mất cả ngày.

* Nhờ viết lisp cũng như đi khám bệnh. Chỉ gởi căn cước và than sắp chết thì không bác sỹ nào cứu sống được.


#15 phamhung12

phamhung12

    biết vẽ ellipse

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

Đã gửi 23 June 2015 - 07:02 PM

Ok! Appload mới cho kết quả đúng. Vậy là của bác ssg vẫn đúng :) .Thanks!


  • 0

#16 pphung183

pphung183

    biết dimstyle

  • Members
  • PipPipPipPipPip
  • 384 Bài viết
Điểm đánh giá: 425 (tốt)

Đã gửi 24 June 2015 - 12:23 PM

Để 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.

:) 


  • 1

#17 duy782006

duy782006

    PHẠM QUỐC DUY

  • CADViet Team
  • PipPipPipPipPipPipPip
  • 2155 Bài viết
Điểm đánh giá: 1359 (rất tốt)

Đã gửi 24 June 2015 - 12:46 PM

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

Cứ ngỡ trần gian là cõi thật.Cho nên tất bật đến bây giờ.
Tạo hộp thoại bằng lisp My blog QUY ĐỊNH ĐẶT TÊN TOPIC TRONG CHUYÊN MỤC LISPD http://ktsduy.wordpress.com/
Để cám ơn chỉ cần nhấn rep_up.png
(Là nhấn vào nút đó phía bài viết của người ta í chứ đừng có nhè cái hình này mà nhấn miết đi nha :-D


#18 gia_bach

gia_bach

    biết lệnh adcenter

  • CADViet Team
  • PipPipPipPipPipPipPip
  • 1436 Bài viết
Điểm đánh giá: 1426 (rất tốt)

Đã gửi 24 June 2015 - 12:56 PM

...........

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  :(


  • 0

#19 pphung183

pphung183

    biết dimstyle

  • Members
  • PipPipPipPipPip
  • 384 Bài viết
Điểm đánh giá: 425 (tốt)

Đã gửi 24 June 2015 - 01:19 PM

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


  • 1

#20 pphung183

pphung183

    biết dimstyle

  • Members
  • PipPipPipPipPip
  • 384 Bài viết
Điểm đánh giá: 425 (tốt)

Đã gửi 24 June 2015 - 01:27 PM

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


  • 0