Đến nội dung


Hình ảnh
- - - - -

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


  • Please log in to reply
10 replies to this topic

#1 mrphuocvie

mrphuocvie

    biết vẽ ellipse

  • Members
  • PipPip
  • 50 Bài viết
Điểm đánh giá: -8 (bình thường)

Đã gửi 07 June 2014 - 06:06 PM

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.c...nh_minh_hoa.dwg


  • 0

#2 Tot77

Tot77

    biết lệnh adcenter

  • Members
  • PipPipPipPipPipPipPip
  • 990 Bài viết
Điểm đánh giá: 498 (tốt)

Đã gửi 07 June 2014 - 07:23 PM

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)
)

  • 0

#3 mrphuocvie

mrphuocvie

    biết vẽ ellipse

  • Members
  • PipPip
  • 50 Bài viết
Điểm đánh giá: -8 (bình thường)

Đã gửi 07 June 2014 - 08:26 PM

Thanks Tot77. Nó đáp ứng được nguyện vọng của em! Mọi người trong forum thiệt là giỏi! Mong đuọc học hỏi!


  • 0

#4 mrphuocvie

mrphuocvie

    biết vẽ ellipse

  • Members
  • PipPip
  • 50 Bài viết
Điểm đánh giá: -8 (bình thường)

Đã gửi 07 June 2014 - 10:03 PM

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.c..._chinh_code.rar


  • 0

#5 Tot77

Tot77

    biết lệnh adcenter

  • Members
  • PipPipPipPipPipPipPip
  • 990 Bài viết
Điểm đánh giá: 498 (tốt)

Đã gửi 08 June 2014 - 08:46 AM

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)
)

  • 0

#6 mrphuocvie

mrphuocvie

    biết vẽ ellipse

  • Members
  • PipPip
  • 50 Bài viết
Điểm đánh giá: -8 (bình thường)

Đã gửi 08 June 2014 - 10:55 AM

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!


  • 0

#7 Tot77

Tot77

    biết lệnh adcenter

  • Members
  • PipPipPipPipPipPipPip
  • 990 Bài viết
Điểm đánh giá: 498 (tốt)

Đã gửi 08 June 2014 - 12:06 PM

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à đủ.


  • 1

#8 mrphuocvie

mrphuocvie

    biết vẽ ellipse

  • Members
  • PipPip
  • 50 Bài viết
Điểm đánh giá: -8 (bình thường)

Đã gửi 08 June 2014 - 12:30 PM

Thanks anh!


  • 0

#9 mrphuocvie

mrphuocvie

    biết vẽ ellipse

  • Members
  • PipPip
  • 50 Bài viết
Điểm đánh giá: -8 (bình thường)

Đã gửi 10 June 2014 - 06:04 AM

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!


  • 0

#10 Tue_NV

Tue_NV

    KS Võ Quang Tuệ

  • Moderator
  • PipPipPipPipPipPipPip
  • 4296 Bài viết
Điểm đánh giá: 3804 (đỉnh cao)

Đã gửi 10 June 2014 - 06:10 AM

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)


  • 0

#11 Doan Van Ha

Doan Van Ha

    biết lệnh adcenter

  • CADViet Team
  • PipPipPipPipPipPipPip
  • 5447 Bài viết
Điểm đánh giá: 2624 (tuyệt vời)

Đã gửi 10 June 2014 - 06:14 AM

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)


  • 0

* Chỉ nên yêu cầu Lisp khi bạn làm việc đó mất cả ngày nhưng họ chỉ viết 1 giờ. Đừng nêu yêu cầu Lisp khi bạn chỉ làm 1 giờ nhưng bắt họ phải mất cả ngày.

* Nhờ viết lisp cũng như đi khám bệnh. Chỉ gởi căn cước và than sắp chết thì không bác sỹ nào cứu sống được.