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.
ThuyLinh313

Cải tạo các lệnh cơ bản của cad

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

ThuyLinh313    146

Select vào phạm vi đứt của nét đứt thì tất cả method của lệnh select đều không chọn được chứ không riêng gì Fence (trừ select all - ssget "x")

Đó chỉ là 1 phần nguyên nhân. Nguyên nhân chính là do cơ chế select đối tượng của cad, chỉ cho phép chọn các đối tượng đang hiển thị trong phạm vi màn hình (trừ select all - ssget "x") .

Trong method Fence của lệnh select đối tượng thì tập hợp đối tượng lấy được là tập hợp đối tượng trong lần pick cuối (ngay tại thời điểm pick). Bởi vậy, nếu muốn chọn chính xác thì người dùng cần phải chắc chắn rằng trước khi pick điểm cuối cùng, màn hình phải được zoom để toàn bộ điểm đã pick nằm trong phạm vi nhìn tháy trên màn hình. Đây là nguyên nhân chính mà người dùng hay gặp do ít người hiểu cơ chế này.

 

@various: Để sửa lại method này trong khi select đối tượng thì chắn chắn là không thể. Nhưng việc viết lại 1 lệnh để select đối tượng bằng method fence thì đơn giản. Khi nào rảnh mình sẽ viết cho bạn nếu chưa có ai viết và nếu bạn còn cần nó. Tuy nhiên nếu bạn đã hiểu cơ chế này rồi thì mình nghĩ chắc cũng không cần thiết phải viết lại 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
various    9

@various: Để sửa lại method này trong khi select đối tượng thì chắn chắn là không thể. Nhưng việc viết lại 1 lệnh để select đối tượng bằng method fence thì đơn giản. Khi nào rảnh mình sẽ viết cho bạn nếu chưa có ai viết và nếu bạn còn cần nó. Tuy nhiên nếu bạn đã hiểu cơ chế này rồi thì mình nghĩ chắc cũng không cần thiết phải viết lại nhỉ

 

Vâng :). Em nghĩ phụ thuộc vào style của từng người. Cảm ơn bác đã giải đáp thắc mắc. Nếu để select riêng đối tượng thì có rất nhiều cách, cái cân thiết nhất là sử dụng được sau khi thực hiện command phía trước :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
Tue_NV    3.841

Lệnh ST cải tạo lại trên code của bạn ThuyLinh

- Muốn gọi hộp thoại ST -> ở dòng select object -> pick vào vùng trống trên màn hình hoặc enter

- Muốn gọi Style của Text -> ở dòng select object -> pick vào Text


(defun c:st (/ style c-style)
(initdia)
 (setq style (car (nentsel)))
 (if style (progn
     (setq style (cdr (assoc 7 (entget style))) c-style (getvar "textstyle"))
     (setvar "textstyle" style)
     (or (command "style")
         (if (= (getvar "textstyle") style)
       (setvar "textstyle" c-style)
     )))
(command "style")
)
(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
ThuyLinh313    146

Mình nhận được một số lời than phiền của đồng nghiệp là lệnh U (undo) đôi khi không thực hiện được và báo lỗi như sau:

Command: u
Start of Group encountered.
Must enter UNDO END to go back further.
Mình cũng đã một vài lần gặp phải thông báo này và chắc rằng các bạn cũng vậy nếu các bạn có sử dụng Lisp cho công việc.
Nguyên nhân là do người viết Lisp kiểm soát lỗi người dùng thoát lệnh băng ESC không tốt. Lệnh lisp tạo vị trí Undo Begin nhưng không có Undo End. Thông báo trên là yêu cầu người dùng nhập Undo End thì mới tiếp tục Undo được. Hơi thủ công nên mình quyết định cải tạo lệnh này. Có 2 phương án cho các bạn lựa chọn.
 
PA1: Vì U là lệnh gốc của cad nên Lisp thông thường không thể can thiệp được. Mình viết 1 lệnh mới luôn, thay vì dùng U, bạn dùng Y sẽ không bao giờ gặp thông báo trên:
(defun C:Y (/) (if (= (getvar "undoctl") 61) (command "undo" "end")) (command "undo" "") (princ))
 
PA2: Can thiệp trực tiếp vào lệnh gốc U. Phương án này mình không khuyến khích các bạn sử dụng trừ những bạn có khả năng viết Lisp, sử dụng và quản lý tốt phần Reactor. Nếu có hứng thú thì các bạn có thể tham khảo code dưới để tích hợp vào hệ thống các Lisp Reactor của các bạn. Lợi ích của phương án này là có tác dụng kể cả với việc bạn dùng tổ hợp Ctrl+Z thay cho lệnh U.
 
(vlr-editor-reactor "Command Started" '((:vlr-commandwillstart . Callback-CmdStarted)))
(defun Callback-CmdStarted (rt cmd)
(and (equal cmd '("U"))
(= (getvar "undoctl") 61)
(vla-EndUndoMark (vla-get-activedocument (vlax-get-acad-object)))))

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
ThuyLinh313    146

@Hoằn: có lẽ em đã nhầm lẫn, vì lisp của bạn ThuyLinh không phải như lệnh edit. Hay em có ý kiến gì sâu xa mà anh chưa hiểu?

@Ketxu: cần phải nói cho rõ ra là "cải tiến" hay "bổ sung" thêm 1 lệnh phụ. Xét về tính "bổ sung" thì tốt, nhưng nói rằng "cải tiến" thì không ổn. Vì khi đó lệnh nguyên thủy đã chết rồi.

Hôm nay mới để ý thấy cái ý kiến này của ĐVH. Bạn không hiểu hay cố tính không hiểu nhỉ? Các lệnh mà mình "cải tiến" bên trên bản thân nó cũng chỉ là lệnh tắt. Ví dụ: Br lệnh gốc là Break, J lệnh gốc là Join.... cơ bạn ạ. Không có lệnh nguyên thủy nào chết cả, bản thân cad vẫn vậy, chỉ có trải nghiệm của người dùng là khác đi thô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
ThuyLinh313    146

Nếu bạn lười đến mức ngại với con chuột lên góc màn hình để đóng bản vẽ thì lisp dưới đây sẽ giúp bạn thay thế công việc "nặng nhọc" đó bằng 1 lệnh tắt.

(defun C:CF () ; Close file
(if (= (rem (getvar "dbmod") 2) 0) 
(command "close" "y") 
(vla-sendcommand (vla-get-activedocument (vlax-get-acad-object)) "close ")))

Mình nói thế cho vui thôi, lisp này mục đích để cải tạo lại 1 chút thao tác đóng bản vẽ.

Với cách close bản vẽ thông thường thì nếu có bất kì thay đổi nào của bản vẽ, kể cả bạn mở bản vẽ ra chỉ để zoom và pan để xem thì khi đóng lại, Cad hâm vẫn cứ hỏi bạn 1 câu vô nghĩa: có lưu trước khi đóng hay không? Dùng Lisp trên bạn sẽ né được câu hỏi này. Nó đặc biệt hữu dụng với những ai thường xuyên làm công việc duyệt bản vẽ của đồng nghiệp.

 

Chú ý: với những bạn có add sẵn các lisp khởi động cùng cad mà bản thân các lisp này thay đổi 1 hay nhiều biến hệ thống nào đó của cad thì để né câu hỏi trên bạn cần thêm 2 thao tác sau nữa:

- Đặt hàm (acad-push-dbmod) vào Đầu lisp đầu tiên trong danh mục Startup Suite

- Đăt hàm (acad-pop-dbmod) vào Cuối lisp cuối cùng trong danh mục Startup Suite

Chúc các bạn duyệt bản vẽ vui 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

.Nó đặc biệt hữu dụng với những ai thường xuyên làm công việc duyệt bản vẽ của đồng nghiệp.

 

Cảm ơn bà chị :D. Đúng là lâu nay rất khó chịu vì thao tác này. Có lúc mở cả đống lên. Hỗ trợ view bằng idwg tab. Đến lúc đóng lại thì... sweat.gif

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
Thaistreetz    515

Phong cach viet lisp voi tu duy cua ke luoi bieng giong minh. Hoi truoc minh cung viet 1 lenh y het the nay. Cung dat ten lenh la cf lun, khac la dung sendkey =))

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
Truong_AAn    68

Nhờ ThuyLinh313 viết giúp mình lisp cải tạo lệnh Extrude.

 khi gõ E10 thì cad sẽ exrude từ hình 2d  thành khối solid có chiều cao 10 thay vì phải đánh lệnh ext nhập chiều cao...

Thnk các 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

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


×