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

[Yêu cầu] Offset, chuyện cũ với yêu cầu mới

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

Có ai viết được 1 lệnh, ví dụ circle, mà không cần nhập radius và/hoặc center không?

Cần phải hiểu y/c ở bên topic kia. Đôi khi vì công việc nên người ta cần vậy. Và nếu họ cần như vậy thì rõ ràng nó nhanh hơn. Xem từ trang đầu của topic này thì sẽ rõ. Chẳng hạn lệnh fillet ở đầu topic chẳng để làm gì ư?

1./ Không có ai có thể viết ví dụ circle, mà không cần nhập radius và/hoặc center. Nhưng bác viết là giảm bớt công đoạn nhập khoảng cách" là không đúng rồi....

 

2./Về mục đích và code thì Tue_NV biết trước rồi, biết trước cả khi lệnh fillet ở trang đầu topic trên viết lên. Chỉ có điều là muốn góp ý cho mã Lisp trên tốt hơn thôi. Tỉ như trước đó sử dụng lệnh cd100 chẳng hạn. Lần kế tiếp thay vì nhấn enter để thực hiện lệnh cd100 thì phải gõ lại cd100. Nếu không gõ lại lệnh thì bấm mũi tên đi lên, đi xuống để lấy tên lệnh. Đó chẳng phải "mất công" hay sao? Và các góp ý ở bài viết trên nữa.............

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

 

Theo y/c ở topic dưới đây tôi viết thêm một số lệnh rút gọn:

http://www.cadviet.com/forum/topic/92038-nho-viet-lisp-copy-move-rotate-doi-tuong-theo-1-gia-tri-cho-truoc/

Có 3 lisp, dùng để Copy, Move, Rotate rút gọn.

Lệnh Copy và Move: giảm bớt công đoạn nhập khoảng cách.

Lệnh Rotate: giảm bớt công đoạn nhập góc quay.

Nếu bạn nào hay phải Copy, Move, Rotate kiểu này thì tải về dùng.

 

;; Cac lenh Copy, Move, Rotate rut gon.
;; Doan Van Ha - CadViet.com - 28/12/2013
(vl-load-com)
;----- Copy_Distance (by HA). Copy Objects voi Distance, diem goc va huong tu chon. Nhap lenh theo cau truc: CD10, CD100, CD1.5 ...
(if (null copy_reactor) (setq copy_reactor (vlr-command-reactor nil '((:vlr-unknownCommand . Copy_HA)))))
(defun Copy_HA (a b / cmd dis)
 (and
  (wcmatch (setq cmd (strcase (nth 0 b))) "CD*")
  (setq dis (distof (substr cmd 3)))
  (setq ss (ssget))
  (setq p (getpoint "\nSpecify base point: "))
  (setq q (getpoint p "\nSpecify point to the direction of the copy: "))
  (setq q (polar p (angle p q) dis))
  (vla-SendCommand (vla-get-ActiveDocument (vlax-get-acad-object)) "(command \"_.Copy\" ss \"\" p q) "))
 (princ))
;----- Move_Distance (by HA). Move Objects voi Distance, diem goc va huong tu chon. Nhap lenh theo cau truc: MD10, MD100, MD1.5 ...
(if (null move_reactor) (setq move_reactor (vlr-command-reactor nil '((:vlr-unknownCommand . Move_HA)))))
(defun Move_HA (a b / cmd dis)
 (and
  (wcmatch (setq cmd (strcase (nth 0 b))) "MD*")
  (setq dis (distof (substr cmd 3)))
  (setq ss (ssget))
  (setq p (getpoint "\nSpecify base point: "))
  (setq q (getpoint p "\nSpecify point to the direction of the move: "))
  (setq q (polar p (angle p q) dis))
  (vla-SendCommand (vla-get-ActiveDocument (vlax-get-acad-object)) "(command \"_.Move\" ss \"\" p q) "))
 (princ))
;----- Rotate_Angle (by HA). Rotate Objects voi Angle, diem goc tu chon. Nhap lenh theo cau truc: RA10d5'3", RA90, RA1.5 ...
(if (null rotate_reactor) (setq rotate_reactor (vlr-command-reactor nil '((:vlr-unknownCommand . Rotate_HA)))))
(defun Rotate_HA (a b / cmd)
 (and
  (wcmatch (setq cmd (strcase (nth 0 b))) "RA*")
  (setq ang (substr cmd 3))
  (setq ss (ssget))
  (setq p (getpoint "\nSpecify base point: "))
  (vla-SendCommand (vla-get-ActiveDocument (vlax-get-acad-object)) "(command \"_.Rotate\" ss \"\" p ang) "))
 (princ))
 

 

Trước tiên em cảm ơn bác đã giúp đở em.  :)

Lisp này gần được nhưng có thể nào  em chỉ cần nhập c1 thôi là tự hiểu khoảng cách là 50 khô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

Lisp Copy với Distance cố định.

Ví dụ cách gọi lệnh: C12, để copy objects với distance 12, có hướng tự chọn (xác định bởi 2 điểm).

ttp://www.cadviet.com/upfiles/3/67029_copy_distance.zip

 

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

Lisp Copy với Distance cố định.

Ví dụ cách gọi lệnh: C12, để copy objects với distance 12, có hướng tự chọn (xác định bởi 2 điểm).

http://www.cadviet.com/upfiles/3/67029_copy_distance_1.zip

 

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

Lisp Copy với Distance cố định.

Ví dụ cách gọi lệnh: C12, để copy objects với distance 12, có hướng tự chọn (xác định bởi 2 điểm).

http://www.cadviet.com/upfiles/3/67029_copy_distance_2.zip

 

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

Lisp Copy với Distance cố định.

Ví dụ cách gọi lệnh: C12, để copy objects với distance 12, có hướng tự chọn (xác định bởi 2 điểm).

http://www.cadviet.com/upfiles/3/67029_copy_distance_2.zip

Vẫn không phải như thế này bác Hà ơi,

Em nói rõ rồi mà bác, không có cách nào chỉ cần gỏ c1 thôi là tự hiểu copy với khoảng cách 50 được ạ? ( và c2 là 100, c3 là 150). Nó giống hệt lệnh copy nhưng bỏ bước nhập khảng cách 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

Vẫn không phải như thế này bác Hà ơi,

Em nói rõ rồi mà bác, không có cách nào chỉ cần gỏ c1 thôi là tự hiểu copy với khoảng cách 50 được ạ? ( và c2 là 100, c3 là 150). Nó giống hệt lệnh copy nhưng bỏ bước nhập khảng cách thôi.

Viết lisp mà chỉ copy với 1 trong 3 khoảng cách 50, 100, 150 thôi ư? Vậy khi muốn copy 400 thì lisp chịu à?

Sửa thì quá dễ nhưng tôi phiền bạn là sẽ không bao giờ sửa theo cái kiểu như vậy, bởi tôi không thể chiều lòng sự làm biếng quá giới hạ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

 

Lisp của bác đây:

;========LISP OFFSET==========
;====KANGKUNG 28/03/2013======
(defun C:LG12()
  (command "UNDO" "BE")
  (setq os(getvar "OSMODE"))
  (setvar "OSMODE" 0)
  (setq dt (car(entsel)) i (/ pi 2))
  (repeat 2
    (setq pt (polar (vlax-curve-getPointAtDist dt 0) (+ (angle (vlax-curve-getPointAtDist dt 0) (vlax-curve-getPointAtDist dt (+ 0 0.1))) i) 1))
    (of "3" pt "00_Mep duong")
    (of "6" pt "00_Mep he")
    (setq i (/ pi -2))
    )
  (setvar "OSMODE" os)
  (command "UNDO" "END")
  )
(defun C:LG13()
  (command "UNDO" "BE")
  (setq os(getvar "OSMODE"))
  (setvar "OSMODE" 0)
  (setq dt (car(entsel)) i (/ pi 2))
  (repeat 2
    (setq pt (polar (vlax-curve-getPointAtDist dt 0) (+ (angle (vlax-curve-getPointAtDist dt 0) (vlax-curve-getPointAtDist dt (+ 0 0.1))) i) 1))
    (of "3.5" pt "00_Mep duong")
    (of "6.5" pt "00_Mep he")
    (setq i (/ pi -2))
    )
  (setvar "OSMODE" os)
  (command "UNDO" "END")
  )
(defun of(di pt la)
  (command "offset" di dt pt "")
  (if (= (tblsearch "Layer" la) nil)
    (progn
      (command "LAYER" "N" la "")
      (vla-put-layer (vlax-ename->vla-object (entlast)) la))
    (vla-put-layer (vlax-ename->vla-object (entlast)) la)))
(princ "\n                Written By KangKung - 28/03/2013\n")

Nhờ các anh giúp em sửa cái lisp trên để khi ta chon tim đường thì nó sẽ offset sang 2 bên, với khoảng cách là 6m từ tim và đổi màu 2 đối tượng vừa offset sẽ thuộc layer màu xanh và và có nét chấm chấm như đoạn code này với ạ: 

(COMMAND "-LAYER" "M" "Lo gioi" "COLOR" 3 "" "")

...........................................

(COMMAND "CHPROP" A PAUSE "C" "GREEN" "LA" "LO GIOI" "lT" "DOT" "S" "2.5" "LW" "0.5" "")

  • Vote giảm 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

Thấy bạn đã "Lượn" qua rất nhiều topic để yêu cầu vấn đề này. Mình thêm 1 tý vào lisp của bác Ket, bạn thử xem nhé!

(defun c:oo (/ #d layerAdd ss)

(vl-load-com)

(defun layerAdd (Layername layerlinetype layercolor / acadDoc theLayers newLayer layname_select)

(setq acadDoc (vla-get-activedocument (vlax-get-acad-object)))

(setq theLayers (vla-get-layers acadDoc))

(if (not (tblsearch "ltype" layerlinetype))

(vla-load (vla-get-linetypes acadDoc) layerlinetype "acadiso.lin"))

(if (null (tblsearch "LAYER" Layername))

(progn (setq newLayer (vla-add theLayers Layername))

(if layerlinetype

(vla-put-linetype newLayer layerlinetype))

(if layercolor

(vla-put-color newLayer layercolor)))))

(layerAdd "TUONG" "CONTINUOUS" 4)

(layerAdd "TIM" "CENTER" 8)

(or #dist (setq #dist 1))

(setq #d (cond ((getdist (strcat "\nKhoang cach Offset <" (vl-princ-to-string #dist) ">: ")))

(#dist)))

(if (not #d)

(setq #d #dist)

(setq #dist #d))

(princ "\nChon doi tuong: ")

(if (setq ss (ssget (list (cons 0 "Ellipse,Lwpolyline,Spline,Line,Circle,Arc,Pline,Xline"))))

(foreach item (mapcar 'vlax-ename->vla-object (acet-ss-to-list ss))

(vla-offset item #d)

(vla-put-layer (vlax-ename->vla-object (entlast)) "TUONG")

(vla-offset item (- #d))

(vla-put-layer (vlax-ename->vla-object (entlast)) "TUONG")

(vla-put-layer item "TIM")))

(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

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


×