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

Sửa lại lệnh DIM cho tiện dụng hơn

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

Chào cả nhà,

Xin giúp mình viết 1 lisp để gọi lệnh DIM:

;;;Khi gõ lệnh thi chuyển sang lớp "Dim" - nếu ko có lớp "Dim" thì tạo lớp "Dim" -
;;;Sau khi xong lệnh hoặc "error" thi chuyển về lớp hiện tại

 

Mình viết lisp sau mà nó ko chạy như ý muốn. Mọi người chỉnh giúp mình sai ở chỗ nào. Xin cám ơn !

(defun C:D (/ CLA)
  (setq CLA (getvar "clayer"))
  (setvar "clayer" "DIM")
  (setq PT1 (getpoint "Pick the first point: "))
  (setq PT2 (getpoint PT1 "Pick second point: "))
  (command "._dimlinear" PT1 PT2)
  (setvar "clayer" CLA)
  (princ)

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 bạn sài cad đời cao thì bạn gán biến dimlayer là dim thì dim nó sẽ tạo ở layer dim.

còn bạn muốn viết lisp thì phải kết thúc lệnh command thì mới setvar clayer lại được.

ví dụ:

(defun c:dl(/ ll)
  (setq ll (getvar 'clayer))
  (setvar 'clayer "dim")
  (command "_dimlinear")
  (while (/= (getvar 'cmdactive) 0) (command pause))
  (setvar 'clayer ll))

 

  • 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
22 giờ trước, ngokiet đã nói:

Nếu bạn sài cad đời cao thì bạn gán biến dimlayer là dim thì dim nó sẽ tạo ở layer dim.

còn bạn muốn viết lisp thì phải kết thúc lệnh command thì mới setvar clayer lại được.

ví dụ:


(defun c:dl(/ ll)
  (setq ll (getvar 'clayer))
  (setvar 'clayer "dim")
  (command "_dimlinear")
  (while (/= (getvar 'cmdactive) 0) (command pause))
  (setvar 'clayer ll))

 

 

Lisp của bạn rất hay, cách gán biến dimlayer cũng rất hay! Cám ơn bạn nhiều!

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ào lúc 9/8/2020 tại 20:07, ngokiet đã nói:

Nếu bạn sài cad đời cao thì bạn gán biến dimlayer là dim thì dim nó sẽ tạo ở layer dim.

còn bạn muốn viết lisp thì phải kết thúc lệnh command thì mới setvar clayer lại được.

ví dụ:


(defun c:dl(/ ll)
  (setq ll (getvar 'clayer))
  (setvar 'clayer "dim")
  (command "_dimlinear")
  (while (/= (getvar 'cmdactive) 0) (command pause))
  (setvar 'clayer ll))

 

 

Mình muốn thêm 1 tùy chọn, bạn sửa giúp mình với:

- Khi gọi lệnh dim nhưng hủy lệnh (ấn phím hủy 'ESC hoặc phải chuột) thì lớp hiện hành trở về lớp trước khi gọi lệnh dim. 

Cám ơn bạn nhiều !

 

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

(defun c:dl(/ ll *error*)

  (setq ll (getvar 'clayer))

  (setvar 'clayer "dim")

  (defun *error*(msg)

    (princ "Error: ") (princ msg) 

     (setvar 'clayer ll) (princ))

  (command "_dimlinear")

  (while (/= (getvar 'cmdactive) 0) (command pause))

  (setvar 'clayer ll))

 

  • 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
20 giờ trước, ngokiet đã nói:

(defun c:dl(/ ll *error*)

  (setq ll (getvar 'clayer))

  (setvar 'clayer "dim")

  (defun *error*(msg)

    (princ "Error: ") (princ msg) 

     (setvar 'clayer ll) (princ))

  (command "_dimlinear")

  (while (/= (getvar 'cmdactive) 0) (command pause))

  (setvar 'clayer ll))

 

Tuyệt vời! Cám ơn bạn nhiều!

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ào lúc 6/11/2022 tại 12:16, ngokiet đã nói:

(defun c:dl(/ ll *error*)

  (setq ll (getvar 'clayer))

  (setvar 'clayer "dim")

  (defun *error*(msg)

    (princ "Error: ") (princ msg) 

     (setvar 'clayer ll) (princ))

  (command "_dimlinear")

  (while (/= (getvar 'cmdactive) 0) (command pause))

  (setvar 'clayer ll))

 

bạn ơi mình dùng thì nó báo lỗi thế này ko biết xử lý ntn, cảm ơn bạn:
 error: no function definition: SETVAR\ \ \

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
4 giờ trước, DNcouples đã nói:

bạn ơi mình dùng thì nó báo lỗi thế này ko biết xử lý ntn, cảm ơn bạn:
 error: no function definition: SETVAR\ \ \

Thấy lisp không có gì sai cả. mà không hiểu sao báo lỗi này luôn.

nếu cad mới thử coi có lệnh DIMLAYER. nếu có thì khỏi cần đến lisp này.

không thì thử cái này:

(defun c:DL ( / old *error* msg)
 (defun *error*(msg)
    (princ "Error: ") (princ msg) 
     (setvar 'clayer old) (princ))

    (setq old (getvar 'clayer))
    (setvar 'clayer "DIM")
    (command "_dimlinear")
    (while (= 1 (logand 1 (getvar 'cmdactive)))
        (command "\\")
    )
    (setvar 'clayer old)
    (princ)
)

  • Like 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
6 giờ trước, vietduc147258 đã nói:

Thấy lisp không có gì sai cả. mà không hiểu sao báo lỗi này luôn.

nếu cad mới thử coi có lệnh DIMLAYER. nếu có thì khỏi cần đến lisp này.

không thì thử cái này:

(defun c:DL ( / old *error* msg)
 (defun *error*(msg)
    (princ "Error: ") (princ msg) 
     (setvar 'clayer old) (princ))

    (setq old (getvar 'clayer))
    (setvar 'clayer "DIM")
    (command "_dimlinear")
    (while (= 1 (logand 1 (getvar 'cmdactive)))
        (command "\\")
    )
    (setvar 'clayer old)
    (princ)
)

lúc đầu mình dùng đc lisp trên, nhưng 1 hồi nó tự nhảy về layer khác, ko theo layer mình set.
mình load lại lisp thì nó báo lỗi như vậy, reset máy các kiểu vẫn bị.

thử load lisp mới của bạn vẫn bị :(

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 giờ trước, DNcouples đã nói:

lúc đầu mình dùng đc lisp trên, nhưng 1 hồi nó tự nhảy về layer khác, ko theo layer mình set.
mình load lại lisp thì nó báo lỗi như vậy, reset máy các kiểu vẫn bị.

thử load lisp mới của bạn vẫn bị :(

Thử các lisp sau.

Layer direct của leemac. Hoặc lisp trong bài viết này

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

×