Chuyển đến nội dung
Diễn đàn CADViet
Jin Yong

Hỏi về Lisp (thuật toán, ý tưởng, coding,...)

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

Có vẻ như với Vista, Win7 (cad08) thì cái này dễ xơi hơn :

(defun lastload()
(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"
)
)

  • 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

Chịu luôn Bác ơi! Lỗi cũng như #808 ở trên (chỉ khác "*" -> "lsp").

Một cách đơn giản nữa là bạn mò luôn vào registry -> Có đường dẫn đã cho ở trên rồi -> bạn tìm đến địa chỉ đó thử xem sao.

-> vào Start -> Run -> Gõ Regedit ->...

regis.jpg

Máy của Tue_NV không cài Win7 nên không giúp được gì hơn....

À còn 1 cách nữa : nếu bạn tìm không ra là bạn apload xong 1 Lisp nào đó rồi sử dụng Search trong Registry editor rồi xem địa chỉ nó nằm ở đâu -> rồi từ đó xoay sở tiếp

 

Theo như lỗi trên của bạn là cái hàm

(vl-registry-read K "MRUList") -> nil

Tức là nó không đọc được

A string containing registry data, if successful; otherwise nil.

  • 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

Có vẻ như với Vista, Win7 (cad08) thì cái này dễ xơi hơn :

(defun lastload()
(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"
)
)

Chuẩn không cần chỉnh! Mới thử, thấy cái này cũng dùng được cho winXP.

@Tue_NV: rất thank Bác và Ketxu đã mệt mõi vì câu hỏi của tôi. Mọi thứ Bác Tue_NV nói thì tôi sẽ ngâm cứu thê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

@DVH : winvista/7 có cách lưu khác với WinXP 1 chút, bác nên xem lại đường dẫn, vì cơ bản cái MRUList đã không còn, và cách đánh dấu mã hóa cũng khác ^^.

Code Ketxu post chỉ chạy đc trên > winXP

Có lẽ bác xài kiểu : check win -> dùng code tương ứ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

@DVH : winvista/7 có cách lưu khác với WinXP 1 chút, bác nên xem lại đường dẫn, vì cơ bản cái MRUList đã không còn, và cách đánh dấu mã hóa cũng khác ^^.

Code Ketxu post chỉ chạy đc trên > winXP

Có lẽ bác xài kiểu : check win -> dùng code tương ứng ^^

Máy tôi cài Win7: chạy code của Ketxu: OK.

Đem code đó thử ở 2 máy khác cài WinXP: vẫn OK.

Thân thươ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

À, code đó còn phụ thuộc CAD nữa hay sao ý ạ. CAD07 + XP ở cty e thì trả về nil. Kể máy mà khỏe khỏe tí e cũng cài vài cái win với CAD thử với bác, nhưng máy cùi quá. Thôi thì bác bằng lòng với code đó rồi thì dùng tạm vậy ha. Hoặc là kiểm tra hàm e post nếu trả về nil thì xài hàm cũ, cũng k dài hơn là mấy ^^

P/S : là cách này dùng appload dialog để xem, do vậy sẽ không thấy lisp đã load bằng (load..) hoặc (autoload...)

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ông lao của: Tue_NV, Ketxu, Detailing... Nay tôi tổng hợp lại để bạn nào cần thì dùng.

Để thêm đường dẫn thư mục vào "Support File Search Path", chỉ cần dùng hàm (ADD_PATH) là đủ (tất nhiên phải load file đính kèm hoặc chép vào trong file lsp của bạn).

Cái này tôi đã check từ Win 95, 98, 2000, XP, Vista, 7, đều OK.

Tiện lợi của (ADD_PATH) là khi các bạn muốn tặng CADViet một chương trình có cả file LSP và DCL thì khỏi cần phải add path rườm rà, đồng thời cũng khỏi phải đóng gói lại thành VLX (thứ VLX này dễ bị cho là... giấu nghề). Bạn chỉ cần cho hàm (ADD_PATH) vào trong file LSP là đủ.

Trên tinh thần giúp được tí gì cho CADViet thì giúp, nếu có gì gì đó thì mong các bạn bỏ qua cho, hoặc góp ý.

Nếu sử dụng mà OK thì đừng quên thank các Bác ở trên nhé!

Thân thương!

;----- Thªm th­ môc chøa file võa load sau cïng vµo Support File Search Path (®óng víi Win7, Vista, XP, 95, 98).
(defun ADD_PATH( / path str sym lst)
(if (not (LAST_LOAD1)) (LAST_LOAD2))
(if (not (member path (STR=>LST (getenv "ACAD") ";")))
 (setenv "ACAD" (strcat (getenv "ACAD") ";" path))))
;----- T×m ®­êng dÉn cña file võa load sau cïng (®óng víi Win7, Vista, riªng XP th× tuú m¸y).
(defun LAST_LOAD1 ()
(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"))
(if path (setq path (substr path 1 (- (strlen path) 1)))))
;----- T×m ®­êng dÉn cña file võa load sau cïng (chØ ®óng víi Win XP, 95, 98).
(defun LAST_LOAD2 ( / K)
(setq K (strcat "HKEY_CURRENT_USER\\Software\\Microsoft\\Windows\\" "CurrentVersion\\Explorer\\ComDlg32\\OpenSaveMRU\\*"))
(setq path (vl-registry-read K (substr (vl-registry-read K "MRUList") 1 1))))
;----- Hµm chuyÓn string chøa c¸c sym sang list.
(defun STR=>LST (str sym)
(setq lst '())
(while (vl-string-search sym str)
 (setq lst (cons (substr str 1 (vl-string-search sym str)) lst))
 (setq str (substr str (+ (vl-string-search sym str) 2))))
(cons str lst))

  • 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

Khi dùng VLIDE để kiểm lỗi lisp thì có dòng:

[CHECKING TEXT pcad.lsp loading...]

.

; Check done.

Nhưng khi thêm vài dòng lisp nữa thì báo:

[CHECKING TEXT pcad.lsp loading...]

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

; Check done.

Nhờ các bác giải thích sự khác nhau giữa 2 thông báo này giùm e.Thanks.

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

Khi dùng VLIDE để kiểm lỗi lisp thì có dòng:

[CHECKING TEXT pcad.lsp loading...]

.

; Check done.

Nhưng khi thêm vài dòng lisp nữa thì báo:

[CHECKING TEXT pcad.lsp loading...]

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

; Check done.

Nhờ các bác giải thích sự khác nhau giữa 2 thông báo này giùm e.Thanks.

Nói thiệt, bạn đừng buồn nhé! Nhiều lúc bạn hỏi, trả lời xong, mấy ngày sau mới thấy bạn trên 4rum nhưng bạn chẳng hề có một ý kiến gì. Được, không được, dỡ, hay chả biết, chỉ cứ hỏi. Bạn hãy thông cảm cho những người muốn giúp bạn, là họ luôn ngóng theo để biết đã đáp ứng cái mà bạn muốn chưa. Tôi có 1 nhận xét thế này: CADViet tận tình với những câu hỏi của bạn nhưng bạn không tận tình với sự giúp đỡ của CADViet.

Hy vọng bạn cải thiện.

Thân thương!

P/S (8h32' ngày 4/8/11): riêng câu hỏi này tôi botay.com, hy vọng có ai đó giải thích giùm 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

Ai đã giúp mình hiểu thì mình nhấn nút bình chọn là được rồi chứ nói Cảm ơn thì giống spam quá,nếu chưa hiểu thì mình mới hỏi tiếp.Cảm ơn sự đóng góp 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

Dấu ... => ........ theo mình đánh giá là status progress. Quá trình check càng dài thì càng nhiều dấu thôi (đoán thế ^^). Mà, cũng như bác ĐVH đã nói, bạn hỏi nhưng dường như k check lại câu hỏi của mình có cần thiết không thì phả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à, cũng như bác ĐVH, bạn hỏi nhưng dường như k check lại câu hỏi của mình có cần thiết không thì phải :)

Chà, câu này buồn 5 phút Ketxu ơ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

Chà, câu này buồn 5 phút Ketxu ơi!

Hề, ý Ket nói là ý Ket cũng như ý bác ĐVH nói, chứ k phải bác với bạn ý giống nhau ^^ Thiếu mất từ nên đổi hẳn ý :lol:

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 xin đươc hỏi vấn đề sau:

Khi mình in 1 trang gì đó (Window từ điểm pt1 đến pt2 chẳng hạn). Mình bấm Ctrl P, chọn cửa sổ in, bấm Apply to Layout -->từ lúc này trở về sau khi Prevew sẽ nhìn thấy trang đã chọn trước khi Apply to layout.

- Vậy cho mình hỏi để Apply to layout bằng Lisp thì làm như thế nào?

- Để Preview 1 Window bất kỳ (2 điểm bất kỳ), ngoài cách apply to layout còn cách nào khác nữa không?

1_51.jpg

Cảm ơn mọi 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 xin đươc hỏi vấn đề sau:

Khi mình in 1 trang gì đó (Window từ điểm pt1 đến pt2 chẳng hạn). Mình bấm Ctrl P, chọn cửa sổ in, bấm Apply to Layout -->từ lúc này trở về sau khi Prevew sẽ nhìn thấy trang đã chọn trước khi Apply to layout.

- Vậy cho mình hỏi để Apply to layout bằng Lisp thì làm như thế nào?

- Để Preview 1 Window bất kỳ (2 điểm bất kỳ), ngoài cách apply to layout còn cách nào khác nữa không?

Cảm ơn mọi người!

 

Làm phiền mọi người quá, mình đã tìm thấy câu trả lời. Cảm ơn diễn đà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ôi muốn hỏi về sự khác nhau giữa các hàm sau đây:

(command "LINE" ... )

(command ".LINE" ... )

(command "-LINE" ... )

(command "._LINE" ... )

(command "_.-LINE" ... )

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 muốn hỏi về sự khác nhau giữa các hàm sau đây:

(command "LINE" ... )

(command ".LINE" ... )

(command "-LINE" ... )

(command "._LINE" ... )

(command "_.-LINE" ... )

-Khi dùng (command "undefine" "line") sẽ thu hồi định nghĩa lệnh line nguyên gốc và định nghĩa lại line bằng tác dụng khác thì trong lisp dùng (command "LINE" ... ) no1 sẽ gọi cái line đã được định nghĩa lại kia và ko đúng mong muốn.

-Lúc này dùng (command ".LINE" ... ) (thêm dấu chấm trước tên lệnh) lisp sẽ gọi định nghĩa gốc của lệnh line.

-Còn dấu -;_ và kết hợp thì mình ko rỏ lắm thường với các lệnh hiển thị hộp thoại mà trong lisp mình ko muốn hiển thị thì thêm một trong 2 dấu - hoặc _ trước lệnh để gọi lệnh ko hộp thoại phục vụ lisp của mình.

  • 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

Theo mình nhớ thì :

Line : Thực hiện lệnh Line mà CAD đang lưu trong bộ nhớ, lệnh này có thể là nguyên thủy hoặc đã bị định nghĩa lại

-Line : Thực hiện phiên bản command prompt(không dialog) của lệnh (nếu có)

.Line : Thực hiện lệnh Line nguyên thủy của CAD, bất chấp đã bị định nghĩa lại hay chưa

_Line : Thực hiện lệnh Line của CAD + các bước thông báo, không kể tới sự khác biệt ngôn ngữ trong phiên bản CAD (English Standard)

=> Với việc thực hiện các lệnh command mà có yêu cầu truyền thêm các bước quyết định (command Lệnh "Y" "N"....) => nên dùng _.

  • 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

Mọi người ơi giúp em với:

Em cần chọn các bock có thuộc tính trong bản vẽ! em loay hoay mãi với hàm Ssget nhưng không được! Mọi người có cách gì chỉ em vớ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

Block có ATT thì mã dxf 66 sẽ là 1, do vậy bạn có thể dùng hàm SSGet với Filter sau :

(ssget (list (cons 0 "INSERT")(cons 66 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

Block có ATT thì mã dxf 66 sẽ là 1, do vậy bạn có thể dùng hàm SSGet với Filter sau :

Cám ơn anh Ketxu nhiều!

Anh Ketxu ơi anh chỉ giùm mã dxf nào để phân biệt block cho phép explode hoặc không explode block vậy?

  • Vote giảm 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ôi có 1 đường 2D (line, pline hoặc spline) và 2 điểm p1, p2. Làm sao để tìm giao của đường đó với đoạn thẳng nối p1 và p2.

Điều kiện: không cho phép tạo line tạm nối p1 và p2. Ai biết xin chỉ giù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

Tôi có 1 đường 2D (line, pline hoặc spline) và 2 điểm p1, p2. Làm sao để tìm giao của đường đó với đoạn thẳng nối p1 và p2.

Điều kiện: không cho phép tạo line tạm nối p1 và p2. Ai biết xin chỉ giùm!

Với điều kiện như trên thì chỉ còn cách giải hệ Phưong trình (hình học giải tích) gồm:

- PT bậc nhất đi qua 2 điểm cho trước

- PT bậc 1,2,3 ... của đuờng 2D (vấn đề lại bị tắc ở đây : làm thế nào xác định đuợc PT của đuờng 2D này ?!)

  • 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 điều kiện như trên thì chỉ còn cách giải hệ Phưong trình gồm (hình học giải tích):

- PT bậc nhất đi qua 2 điểm cho trước

- PT bậc 1,2,3 ... của đuờng 2D (vấn đề lại bị tắc ở đây : làm thế nào xác định đuợc PT của đuờng 2D này ?!)

Với LINE hay với PLINE thì có ý tưởng anh ạ, nhưng còn với SPLINE hoặc với Curve cong thì chịu thua.

Cách giải với LINE hay với PLINE (tìm giao điểm bằng hàm Inters)

1. Với LINE đơn giản là tìm điểm đầu với điểm cuối của LINE rồi tìm giao của P1P2 với LINE bằng hàm INTERS

2. Với PLINE : Duyệt qua từng đoạn thẳng của PLINE -> Lấy 2 điểm đầu và cuối của segment -> Tìm giao của đoạn thẳng với P1P2 nếu = NIL thì tìm tiếp -> . Điểm giao là các điểm mà hàm Inters trả về.

  • 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

Cám ơn 2 Bác Gia_Bach và Tue_NV!

Với Line thì dễ, với PLINE không Curve thì như Bác Tue_NV nói là cũng làm được, còn với Curve hoặc SPLINE thì chắc botay.com thôi. Khốn nỗi là tôi cần xử lý trên bản vẽ của người ta, mà nó gồm các đường Line, Pline, Spline rất không có quy luật. Nếu không thể thì chắc chơi kiểu tạo Line tạm thôi, mặc dầu kiểu này nó dẫn tới một số kết quả không ưng ý liên quan tới những vấn đề khác.

Thân thươ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

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

×