Đến nội dung


Hình ảnh
- - - - -

[Đã xong] Lisp vẽ Circle, Ellipse, Rectang kiểu rút gọn


  • Please log in to reply
8 replies to this topic

#1 Doan Van Ha

Doan Van Ha

    biết lệnh adcenter

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

Đã gửi 31 December 2013 - 08:54 AM

Chúc mừng năm mới 2014 !

Nhân dịp năm mới 2014, xin gởi các bạn món quà Xuân là 3 lisp vẽ Circle, Ellipse, Rectang theo kiểu rút gọn.

Các lisp này không thay thế các lệnh gốc, nhưng nó sử dụng gọn hơn nếu như nhu cầu của các bạn chỉ là đơn giản như các lisp.

Lisp 1: vẽ nhiều Circle liên tục với Radius cố định và tâm thay đổi.

Cú pháp ví dụ: CR125 (vẽ các Circle có Radius bằng 125)

;; Lenh Circle rut gon.
;; Doan Van Ha - CadViet.com - 31/12/2013
;----- Circle_Radius (by HA). Draw Circle voi Radius co dinh, Center tu chon. Nhap lenh theo cau truc: CR10, CR125, CR1.5 ...
(vl-load-com)
(if (null circle_reactor) (setq circle_reactor (vlr-command-reactor nil '((:vlr-unknownCommand . Circle_HA)))))
(defun Circle_HA (a b / cmd)
 (and
  (wcmatch (setq cmd (strcase (nth 0 b))) "CR*")
  (setq rad (distof (substr cmd 3)))
  (vla-SendCommand (vla-get-ActiveDocument (vlax-get-acad-object)) "Circle1 "))
 (princ))
(defun Circle1( / p osm)
 (setvar "cmdecho" 0) (setq osm (getvar "osmode"))
 (while (setq p (getpoint "\nSpecify center point: "))
  (setvar "osmode" 0)
  (vl-cmdf "circle" p rad)
  (setvar "osmode" osm)))
(vlax-add-cmd "Circle1" 'Circle1)
 

  • 7

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


#2 Doan Van Ha

Doan Van Ha

    biết lệnh adcenter

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

Đã gửi 31 December 2013 - 08:55 AM

Lisp 2: vẽ nhiều Ellipse liên tục với 2 bán trục (// OX và // OY) cố định và tâm thay đổi.

Cú pháp ví dụ: R20C30 (vẽ các Ellipse có bán trục Rộng theo OX là 20, bán trục Cao theo OY là 30)

;; Lenh Ellipse rut gon.
;; Doan Van Ha - CadViet.com - 31/12/2013
;----- Ellipse_MajorAxis_MinorAxis (by HA). Draw Ellipse voi Radius Major Axis va Minor Axis co dinh, Center tu chon.  Nhap lenh theo cau truc 2 ban truc: R100C50 ...
(vl-load-com)
(if (null ellipse_reactor) (setq ellipse_reactor (vlr-command-reactor nil '((:vlr-unknownCommand . Ellipse_HA)))))
(defun Ellipse_HA (a b / cmd)
 (defun #String:Get-Numbers(str) ((lambda (l) (read (strcat "(" (vl-list->string (mapcar '(lambda (a b c) (if (or (< 47 b 58) (and (= 45 b) (< 47 c 58) (not (< 47 a 58))) (and (= 46 b) (< 47 a 58) (< 47 c 58))) b 32)) (cons nil l) l (append (cdr l) (list nil)))) ")" ))) (vl-string->list str)))
 (and
  (wcmatch (setq cmd (strcase (nth 0 b))) "R*C*")
  (setq rong (car (#String:Get-Numbers cmd)))
  (setq cao (cadr (#String:Get-Numbers cmd)))
  (vla-SendCommand (vla-get-ActiveDocument (vlax-get-acad-object)) "Ellipse1 "))
 (princ))
(defun Ellipse1( / p osm)
 (setvar "cmdecho" 0) (setq osm (getvar "osmode"))
 (while (setq p (getpoint "\nSpecify center point: "))
  (setvar "osmode" 0)
  (vl-cmdf "ellipse" "c" p (polar p 0 rong) (polar p (/ pi 2) cao))
  (setvar "osmode" osm)))
(vlax-add-cmd "Ellipse1" 'Ellipse1)
 

  • 6

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


#3 Doan Van Ha

Doan Van Ha

    biết lệnh adcenter

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

Đã gửi 31 December 2013 - 08:56 AM

Lisp 3: vẽ nhiều Rectang liên tục với chiều rộng và chiều cao cố định và tâm thay đổi hoặc hướng của điểm corner thay đổi.

Cú pháp ví dụ: W40H50 (vẽ các Rectang có Width theo OX là 40Height theo OY là 50)

;; Lenh Rectang rut gon.
;; Doan Van Ha - CadViet.com - 31/12/2013
;----- Rectangle_Width+Height (by HA). Draw Rectangle voi Width va Height co dinh, 2 diem Corner de xac dinh huong, hoac Center tu chon. Nhap lenh theo cau truc: W100H50 ...
(vl-load-com)
(if (null rectang_reactor) (setq rectang_reactor (vlr-command-reactor nil '((:vlr-unknownCommand . Rectang_HA)))))
(defun Rectang_HA (a b / cmd #String:Get-Numbers)
 (defun #String:Get-Numbers(str) ((lambda (l) (read (strcat "(" (vl-list->string (mapcar '(lambda (a b c) (if (or (< 47 b 58) (and (= 45 b) (< 47 c 58) (not (< 47 a 58))) (and (= 46 b) (< 47 a 58) (< 47 c 58))) b 32)) (cons nil l) l (append (cdr l) (list nil)))) ")" ))) (vl-string->list str)))
 (and
  (wcmatch (setq cmd (strcase (nth 0 b))) "W*H*")
  (setq wid (car (#String:Get-Numbers cmd)))
  (setq hei (cadr (#String:Get-Numbers cmd)))
  (vla-SendCommand (vla-get-ActiveDocument (vlax-get-acad-object)) "Rectang1 "))
 (princ))
(defun Rectang1( / p q pt ang osm)
 (setvar "cmdecho" 0) (setq osm (getvar "osmode"))
 (while
  (and
   (not (initget "c"))
   (setq p (getpoint "\nSpecify first corner point or [Center]: "))
   (if (= 'STR (type p))
    (and
     (setq pt (getpoint "\nSpecify center point for rectang: "))
(setq p (list (- (car pt) (/ wid 2.)) (- (cadr pt) (/ hei 2.))))
(setq q (list (+ (car pt) (/ wid 2.)) (+ (cadr pt) (/ hei 2.)))))
(and
     (setq q (getpoint p "\nSpecify point to the direction of other corner: "))
     (not (equal (car p) (car q) 1E-8)) (not (equal (cadr p) (cadr q) 1E-8))
     (setq ang (angle p q))
     (setq q
      (cond
       ((< 0 ang (* 0.5 pi)) (list (+ (car p) wid) (+ (cadr p) hei)))
       ((< (* 0.5 pi) ang pi) (list (- (car p) wid) (+ (cadr p) hei)))
       ((< pi ang (* 1.5 pi)) (list (- (car p) wid) (- (cadr p) hei)))
       ((< (* 1.5 pi) ang (* 2 pi)) (list (+ (car p) wid) (- (cadr p) hei))))))))
  (setvar "osmode" 0)
  (if (and p q) (vl-cmdf "Rectang" p q))
  (setvar "osmode" osm)))
(vlax-add-cmd "Rectang1" 'Rectang1)
 

  • 5

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


#4 nguyenbd1

nguyenbd1

    biết lệnh text

  • Members
  • PipPipPipPip
  • 276 Bài viết
Điểm đánh giá: 13 (tàm tạm)

Đã gửi 31 December 2013 - 07:24 PM

quá hay bác hà ơi... hay nhất là lisp cr*. e xjn hỏj bác gjờ em mún vẽ dt bằng cách nhâp d.kjnh chứ ko phảj là bkjnh thj sua nhu the nào hả bác
  • 0

#5 Doan Van Ha

Doan Van Ha

    biết lệnh adcenter

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

Đã gửi 31 December 2013 - 08:07 PM

Bạn sửa như thế này để vẽ theo đường kính:

(vl-cmdf "circle" p rad)

Thành:

(vl-cmdf "circle" p (/ rad 2.))

Hoặc để khỏi sửa lisp, ví dụ muốn vẽ circle có đường kính 100 thì bạn nhập CR50.

 


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


#6 Doan Van Ha

Doan Van Ha

    biết lệnh adcenter

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

Đã gửi 01 January 2014 - 08:30 AM

Bác hoành oi. Rât cảm ơn bác. Có tối ưu dc nửa ko bak. Ý e la thay vj gõ cr* gjờ chỉ gõ c*.

Vì tôi viết nhiều lệnh kiểu này nên sợ có thể bị trùng nhau mà đành dùng tới 2 ký tự "C" và "R".

Nếu bạn chỉ dùng mỗi lisp vẽ Circle thì có thể sửa 2 chỗ này, chứ tôi không sửa lisp đã post:

1). Sửa CR* thành C*

2). Sửa số 3 thành số 2

Bác Hoành là bác nào vậy ta?


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


#7 Tue_NV

Tue_NV

    KS Võ Quang Tuệ

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

Đã gửi 03 January 2014 - 04:26 PM

Chào bạn Khuatduyluong!

 

Mình trước đó đã viết bài trả lời cho bạn. Nhưng vì thấy lạc chủ đề nên xóa đi rồi.

Với bài toán của bạn thì chỉ cần dùng 1 lệnh CAD là xong

Có điều, bạn nên post vào chủ đề khác để không bị loãng chủ đề của bác Ha nhé. Mình sẽ trả lời cho bạn

Và không viết bài có nội dung khác chủ đề của topic này vào đây nhé!

 

Thanks All! 


  • 0

#8 Tue_NV

Tue_NV

    KS Võ Quang Tuệ

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

Đã gửi 04 January 2014 - 07:38 AM

@All: Tôi sẽ xoá các bài viết không liên quan đến chủ đề của topic này 


  • 0

#9 khuatduyluong

khuatduyluong

    biết vẽ rectang

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

Đã gửi 04 January 2014 - 07:40 AM

Chào bạn Khuatduyluong!

 

Mình trước đó đã viết bài trả lời cho bạn. Nhưng vì thấy lạc chủ đề nên xóa đi rồi.

Với bài toán của bạn thì chỉ cần dùng 1 lệnh CAD là xong

Có điều, bạn nên post vào chủ đề khác để không bị loãng chủ đề của bác Ha nhé. Mình sẽ trả lời cho bạn

Và không viết bài có nội dung khác chủ đề của topic này vào đây nhé!

 

Thanks All! |

Chỉ cần dùng một lệnh Cad thôi ah? Vậy thì dù bài toán của mình đã giải quyết xong mình cũng sẽ lập một topic riêng. Cũng sorry Bác Ha vì đã chèn nội dung của mình vào topic của bác bởi vì khi đọc đến mình thấy có chút ít liên quan nên post luôn.


  • 0