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  
mrphuocvie

Nhờ giúp đỡ viết LISP!

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

mrphuocvie    8

Do đặc thù công việc và vốn hiểu biết về autolisp còn yếu nên em có gặp một xíu khó khăn mong các anh chị em giúp đỡ!

Em cần một đoạn LISP có tác dụng:khi ta click vào viewport nào thì nó làm thay đổi kích thước vùng nhìn viewport đó (cụ thể là lớn hơn viewport một hệ số x: nhập vào từ người dùng). Nói một cách dễ hiểu hơn là thay đổi thông số Height và Width trong tab Geometry nhưng cố định giá trị tất cả các giá trị còn lại của viewport đó.

Mong mọi người giúp đỡ!

Cụ thể mọi người xem file đính kèm!

Chân thành cảm ơn!

http://www.cadviet.com/upfiles/3/132006_hinh_minh_hoa.dwg

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
Tot77    501

Bạn thử cái này.

 

(defun c:dvp()
  (vl-load-com)
  (setq vp (vlax-ename->vla-object (car (entsel "\nChon Viewport:")))
hs (getreal "\nHe so nhan:"))
  (vla-put-Height vp (* hs (vla-get-Height vp)))
  (vla-put-Width vp (* hs (vla-get-Width vp)))
  (vla-put-CustomScale vp (/ (vla-get-CustomScale vp) hs 1.0))
  (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
mrphuocvie    8

Trước hết, cảm ơn Tot77 đã hỗ trợ em!

Yêu cầu phát sinh trong quá trình ứng dụng lisp nên đã có một số chỉnh sửa LISP của Tot77, cho em xin lỗi nhé!

Nhân tiện đây cho em nhờ mọi người một lần nữa hi!

Vì phải chỉnh 1 lúc rất nhiều viewport như vậy, nên việc nhập "He so nhan" nhiều lần cũng không tiện nên em có viết thêm 1 đoạn lisp cho cái hệ số nhân đó, với mục đích: nếu hệ số nhân ban đầu = nil thì nhập, nếu /= nil thì lấy hệ số nhân lúc trước, nếu thay đổi thì nhập vào.

Ý tưởng của em là thế, tuy nhiên bị 1 lỗi là khi em thay đổi hệ số nhân mới thì nó không thực hiện lệnh của cả lisp này mà chỉ nhập vào he so nhan mới vào báo lỗi. Em loay hoay mãi từ chiều đến giờ không hiểu được.

Điều em mong muốn mọi người giúp em là khi em thay đổi hệ số nhân mới thì nó thực hiện hoàn thiện lisp luôn. Và một mong muốn nữa là nếu được thì chỉnh giúp em lại đoạn code như ý tưởng thế này được không ạ! Khi em nhập mới, nếu em không nhập gì thì sẽ lấy giá trị cũ, nếu nhập mới thì nhập trực tiếp số luôn mà không phải thông qua một bước nữa là nhấn phím "Y" đồng ý đổi (chú ý: nếu là text thì yêu cầu nhập lại).

Mong mọi người giúp đỡ!

Chân thành cảm ơn! File đính kèm: http://www.cadviet.com/upfiles/3/132006_chinh_code.rar

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
Tot77    501

Vậy bạn sửa như sau:

 

(defun c:dvp (/ vp hs hs1)
  (setvar "cmdecho" 0)
  (vl-load-com)
  (setq vp (vlax-ename->vla-object (car (entsel "\nSelect Viewport:"))))
  
  (if (or (not hs) (/= 'REAL (type hs))) (setq hs 1.1))
  (setq hs1 (getreal (strcat "\nInput scale coefficient <" (rtos hs) ">(Enter to accept) :")))
  (if hs1 (setq hs hs1))
  
  (vla-put-Height vp (* hs (vla-get-Height vp)))   
  (vla-put-Width vp (* hs (vla-get-Width vp)))
  (vla-put-CustomScale vp (/ (vla-get-CustomScale vp) hs 1.0))
  (setvar "cmdecho" 1)
  (princ "\nCompleted command!")
  (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
mrphuocvie    8

Cảm ơn Tot77 rất nhiều!

Ah! Anh ơi cho em hỏi luôn một xíu được không ah!

Với vốn hiểu biết ít ỏi về autolisp thì những tài liệu đọc qua(tài liệu từ forum, Autolisp_reference_guide(Autodesk), Autolisp and Visuallisp (Nguyễn Hữu Lộc)) thì em chưa được biết các hàm như: vla-put-Heightvla-put-Width, vla-put-CustomScale...

Em biết, muốn giỏi cần phải có thời gian đầu tư và "nội công" nữa nhưng thời gian em có ít quá nên em mong anh chỉ giúp em tài liệu nào để em biết được những hàm này và tương tự như thế được không ah!

Rất mong nhận được phản hồi từ Tot77 và mọi người!

Trân trọ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
Tot77    501

Bạn vào lệnh vlide rồi bấm F1, trong phần ActiveX and VBA Reference > Objects

Mỗi Object đều có 3 phần Properties, Methods và Events.

Các Properties có thể thêm tiền tố vla-get- hoặc vla-put- để lấy dữ liệu và đặt dữ liệu.

Các Methods có thêm tiền tố vla- để tạo lệnh.

Các Events thì liên quan đến tiền tố vlr- để xử lý biến cố.

Nếu bạn biết tiếng Anh thì coi trong đó là đủ.

  • 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
mrphuocvie    8

Làm thế nào để tác động đến thông số Insertion scale trong bảng Units về milimeter?

Hãy cho 1 một dòng code nhé mọi ngườ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
Tue_NV    3.841

Làm thế nào để tác động đến thông số Insertion scale trong bảng Units về milimeter?

Hãy cho 1 một dòng code nhé mọi người!

Thanks!

 

(setvar "Insunits" 4)

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
Doan Van Ha    2.676

Làm thế nào để tác động đến thông số Insertion scale trong bảng Units về milimeter?

Hãy cho 1 một dòng code nhé mọi người!

Thanks!

Đây:

(setvar 'insunits 4)

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  

×