Chuyển đến nội dung
Diễn đàn CADViet
  • Thông báo

    • Nguyen Hoanh

      CADViet đã hoàn tất nâng cấp   14/09/2017

      Chào các bạn, CADViet đã hoàn tất việc nâng cấp lên phiên bản mới. Tất cả các chức năng đã hoạt động theo kỳ vọng của ban quản trị. Nếu có vấn đề gì cần phản hồi, các bản post ở đây nhé: Trân trọng, Nguyễn Hoành.
Đăng nhập để thực hiện theo  
nguyenhoangvuong83

Mất OSNAP khi dùng LISP

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

Cháo các bác! mình có vấn đè này muốn hỏi là: Khi dùng autolisp lại bị mất chế độ OSNAP là sao hả các bác? Mỗi lần dùng lisp xong rồi dùng lệnh CAD lại phải bật lại chế độ OSNAP thì phiền phức quá. Ai có cách nào khắc phục không giúp mình với. Cảm ơn trước

  • 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
Khi dùng autolisp lại bị mất chế độ OSNAP ....

 

Cái này là do trong file lisp của bác thiếu fần bẫy lôĩ . Bác để ý kỹ sẽ thấy ... trên dđ

vd 1 hàm bẫy lỗi, khi có lỗi xảy ra sẽ tự động gán các chế độ bắt điểm, ortho ở trạng thái trước đó

;*******************************************************************************

(defun myerror (s)				   ; If an error (such as CTRL-C) occurs
								 ; while this command is active...
 (cond
((= s "quit / exit abort") (princ))
((/= s "Function cancelled") (princ (strcat "\nError: " s)))
 )
 (setvar "cmdecho" CMD)			; Restore saved modes
 (setvar "osmode" OSM)
 (setq *error* OLDERR)			  ; Restore old *error* handler
 (princ)
)

 

gán lại biến older vào ct khi bắt đầu & khi kết thúc

(DEFUN C:CD  ()
(SETQ CMD (GETVAR "CMDECHO"))
(SETQ OSM (GETVAR "OSMODE"))
(SETQ OLDERR *error*
  *error* myerror)
....

 

....
(SETVAR "CMDECHO" CMD)
(SETVAR "OSMODE" OSM)
(setq *error* OLDERR)
(PRINC)
)

  • 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ái này là do trong file lisp của bác thiếu fần bẫy lôĩ . Bác để ý kỹ sẽ thấy ... trên dđ

vd 1 hàm bẫy lỗi, khi có lỗi xảy ra sẽ tự động gán các chế độ bắt điểm, ortho ở trạng thái trước đó

;*******************************************************************************

(defun myerror (s)				  ; If an error (such as CTRL-C) occurs
								; while this command is active...
 (cond
((= s "quit / exit abort") (princ))
((/= s "Function cancelled") (princ (strcat "\nError: " s)))
 )
 (setvar "cmdecho" CMD)		; Restore saved modes
 (setvar "osmode" OSM)
 (setq *error* OLDERR)			 ; Restore old *error* handler
 (princ)
)

 

gán lại biến older vào ct khi bắt đầu & khi kết thúc

(DEFUN C:CD  ()
(SETQ CMD (GETVAR "CMDECHO"))
(SETQ OSM (GETVAR "OSMODE"))
(SETQ OLDERR *error*
  *error* myerror)
....

 

....
(SETVAR "CMDECHO" CMD)
(SETVAR "OSMODE" OSM)
(setq *error* OLDERR)
(PRINC)
)

Có cách nàp dơn giản hơn hkông ban?

Mình thấy cách này cũng hay, nhưng nếu mình sử dụng một lúc nhiều lisp thi không có thời gian để ngồi kiểm tra hết các lỗi đó đượ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ó cách nàp dơn giản hơn hkông ban?

Mình thấy cách này cũng hay, nhưng nếu mình sử dụng một lúc nhiều lisp thi không có thời gian để ngồi kiểm tra hết các lỗi đó được:(

hướng dẫn sử dụng trước khi dùng đi bác e mò cả buổi rồ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
Có cách nàp dơn giản hơn hkông ban?

Mình thấy cách này cũng hay, nhưng nếu mình sử dụng một lúc nhiều lisp thi không có thời gian để ngồi kiểm tra hết các lỗi đó được:(

Nếu cần thiết thì bạn viết một cái lisp, nội dung chỉ có phần đặt chế độ bắt điểm, đưa nó vào cái cặp của lệnh AP. Thích cái bắt dính nào thì công các giá trị của nó lại.

Các giá trị của biến OSMODE như sau:

0 NONe

1 ENDpoint

2 MIDpoint

4 CENter

8 NODe

16 QUAdrant

32 INTersection

64 INSertion

128 PERpendicular

256 TANgent

512 NEArest

1024 QUIck

2048 APParent Intersection

4096 EXTension

8192 PARallel

Vi dụ tôi cần bắt điểm đầu END, điểm giữa MID và điểm giao nhau INT thì: lấy 1+2+32=35 ===> (setvar "osmode" 35)

Xài một lisp nào đó mà thấy chế độ bắt dính mất tiêu thì gõ cái lệnh của lisp khôi phục bắt dính ===> Xong!

Cái lisp còi xương của tôi như thế này chẳng hạn:

(defun C:1 ()
(setvar "osmode" 35)
  (princ)
 )

:mellow:

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
Nếu cần thiết thì bạn viết một cái lisp, nội dung chỉ có phần đặt chế độ bắt điểm, đưa nó vào cái cặp của lệnh AP. Thích cái bắt dính nào thì công các giá trị của nó lại.

Các giá trị của biến OSMODE như sau:

0 NONe

1 ENDpoint

2 MIDpoint

4 CENter

8 NODe

16 QUAdrant

32 INTersection

64 INSertion

128 PERpendicular

256 TANgent

512 NEArest

1024 QUIck

2048 APParent Intersection

4096 EXTension

8192 PARallel

Vi dụ tôi cần bắt điểm đầu END, điểm giữa MID và điểm giao nhau INT thì: lấy 1+2+32=35 ===> (setvar "osmode" 35)

Xài một lisp nào đó mà thấy chế độ bắt dính mất tiêu thì gõ cái lệnh của lisp khôi phục bắt dính ===> Xong!

Để không mất OSNAP thì trước khi dùng Lisp, ta lưu giá trị OSMODE với 1 biến oldos

(setq oldos (getvar "OSMODE"))

 

Trong khi dùng Lisp nếu muốn thực hiện bắt điểm PERpendicular chẳng hạn thì :

 

(setvar "osmode" 128)

 

gần cuuói đoạn Lisp ta phải trả lại biến OSMODE = giá trị của oldos ban đầu để không làm mất đi chế độ OSNAP ban đầu cua user

 

(setvar "osmode" oldos)

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

Đây là 1 vấn đề cũ, nhưng vẫn chưa giải quyết được. Mình cũng thấy rất khó chịu với lỗi này. Xin các cao thủ chỉ cho 1 hướng giải quyết vấn đề này một cách đơn giản hơn. Chứ thực sự những người không rành về lisp như mình thì đọc các comment trên biết lỗi do đâu nhưng vẫn không khắc phục được.

Cảm ơ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

Đây là 1 vấn đề cũ, nhưng vẫn chưa giải quyết được. Mình cũng thấy rất khó chịu với lỗi này. Xin các cao thủ chỉ cho 1 hướng giải quyết vấn đề này một cách đơn giản hơn. Chứ thực sự những người không rành về lisp như mình thì đọc các comment trên biết lỗi do đâu nhưng vẫn không khắc phục được.

Cảm ơn!

Ý bạn là muốn giải quyết theo kiểu nào cho tiện nhất, hãy đề xuất xem có thể giúp khô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

Đây là 1 vấn đề cũ, nhưng vẫn chưa giải quyết được. Mình cũng thấy rất khó chịu với lỗi này. Xin các cao thủ chỉ cho 1 hướng giải quyết vấn đề này một cách đơn giản hơn. Chứ thực sự những người không rành về lisp như mình thì đọc các comment trên biết lỗi do đâu nhưng vẫn không khắc phục được.

Cảm ơn!

 

Với trường hợp một số người viết lisp quên k đặt lại biến osmode sau khi thay đổi nó, có thể gây phiền toái, các bạn hãy app lisp này

 

http://www.cadviet.com/upfiles/3/24067_rsvrs_1.rar

 

Chỉ cần cho vào Startup suite thôi, không cần làm gì cả :)

 

Chú ý : không hoàn toàn phù hợp với các bạn chuyên Ấn Esc khi đang thực hiện dở 1 lisp nào đó ^^

  • 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

 

Với trường hợp một số người viết lisp quên k đặt lại biến osmode sau khi thay đổi nó, có thể gây phiền toái, các bạn hãy app lisp này

 

http://www.cadviet.c...24067_rsvrs.rar

 

Chỉ cần cho vào Startup suite thôi, không cần làm gì cả :)

 

Chú ý : không hoàn toàn phù hợp với các bạn chuyên Ấn Esc khi đang thực hiện dở 1 lisp nào đó ^^

Nếu đã đưa vào Startup suite thì có lẽ "chấp" luôn cả việc ấn esc hoặc chương trình bị lỗi chứ 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

Ketxu vừa sửa lại để hợp với lỗi ESC, vẫn link trên. Tuy nhiên vẫn khuyến kháo nó k phải cứu cánh cho các trường hợp ESC, vì đôi khi có người dùng reactor để vào trong hàm *error*, 2 cái mà đánh nhau thì tệ lắm :)

 

@bác ĐVH : chấp hay k là do code ở trong đó chứ k do cho vào His đâu bác ơi ^^ Lúc đầu e copy nhầm cái mà - tổng quát - nhưng chưa hoàn thiện. E phải sửa lại ở trên r

  • 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

Ketxu vừa sửa lại để hợp với lỗi ESC, vẫn link trên. Tuy nhiên vẫn khuyến kháo nó k phải cứu cánh cho các trường hợp ESC, vì đôi khi có người dùng reactor để vào trong hàm *error*, 2 cái mà đánh nhau thì tệ lắm :)

@bác ĐVH : chấp hay k là do code ở trong đó chứ k do cho vào His đâu bác ơi ^^ Lúc đầu e copy nhầm cái mà - tổng quát - nhưng chưa hoàn thiện. E phải sửa lại ở trên r

Đỏ: đúng thế!

Xanh: cái này thì bác lơ mơ lắ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

Để không mất OSNAP thì trước khi dùng Lisp, ta lưu giá trị OSMODE với 1 biến oldos

(setq oldos (getvar "OSMODE"))

 

Trong khi dùng Lisp nếu muốn thực hiện bắt điểm PERpendicular chẳng hạn thì :

 

(setvar "osmode" 128)

 

gần cuuói đoạn Lisp ta phải trả lại biến OSMODE = giá trị của oldos ban đầu để không làm mất đi chế độ OSNAP ban đầu cua user

 

(setvar "osmode" oldos)

Bác Tuệ cho em hỏi "biến Oldos" là gì à, có phải là biến trước khi mình load lisp không ạ? Hay là một biến bất kỳ mình có thể đặt cho mình dễ nhớ... Chủ đề cũ quá, có bác nào giúp em với, 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

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  

×