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

Sửa Lisp xoay thành scale đối tượng tại tâm

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

Em đã có cái lisp xoay đối tượng quanh tâm của chúng, Em muốn nhờ các bác Pro sửa giúp em thành lisp Scale đối tượng quanh tâm của chúng. Hay bác nào có lisp đó thì cho em xin có được ko ? Thanks !

CODE :

;;; ****************************** xoay text quanh tam cua chung *********************************

(defun c:rt ()

(setq cmd (getvar "cmdecho"))

(setvar "cmdecho" 0)

(setq thop (ssget))

(setq gocxoay (getangle "\nGoc xoay cho cac text:"))

(setq gocxoay (/ (* gocxoay 180) pi))

(setq i 0)

(repeat (sslength thop)

(setq dt (ssname thop i))

(setq ds (entget dt))

(setq p1 (cdr (assoc 10 ds)))

(setq p2 (cdr (assoc 11 ds)))

(if (null p2)

(setq dxoay p1)

(setq dxoay (list (* 0.5 (+ (car p1) (car p2)))

(* 0.5 (+ (cadr p1) (cadr p2)))

) )

);;; end if

(command "rotate" dt "" dxoay gocxoay)

(setq i (1+ i))

);;;; end repeat

(setvar "cmdecho" cmd)

(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
Em đã có cái lisp xoay đối tượng quanh tâm của chúng, Em muốn nhờ các bác Pro sửa giúp em thành lisp Scale đối tượng quanh tâm của chúng. Hay bác nào có lisp đó thì cho em xin có được ko ? Thanks !

CODE :

;;; ****************************** xoay text quanh tam cua chung *********************************

(defun c:rt ()

(setq cmd (getvar "cmdecho"))

(setvar "cmdecho" 0)

(setq thop (ssget))

(setq gocxoay (getangle "\nGoc xoay cho cac text:"))

(setq gocxoay (/ (* gocxoay 180) pi))

(setq i 0)

(repeat (sslength thop)

(setq dt (ssname thop i))

(setq ds (entget dt))

(setq p1 (cdr (assoc 10 ds)))

(setq p2 (cdr (assoc 11 ds)))

(if (null p2)

(setq dxoay p1)

(setq dxoay (list (* 0.5 (+ (car p1) (car p2)))

(* 0.5 (+ (cadr p1) (cadr p2)))

) )

);;; end if

(command "rotate" dt "" dxoay gocxoay)

(setq i (1+ i))

);;;; end repeat

(setvar "cmdecho" cmd)

(princ)

)

Bác Pro nào sửa giúp em thành lisp scale đối tượng tại tâm của nó đ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
Bác Pro nào sửa giúp em thành lisp scale đối tượng tại tâm của nó đi ???

 

Bạn phải nói rõ đối tượng là đt gì, text, dim, hay các loại đg như line, arc, pline, spline, circle, đồng thời phải định nghĩa thế nào là tâm mới đc, là trung điểm hay điểm đặt ... thì ng khác mới biết và giúp bạn chứ.

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
Bạn phải nói rõ đối tượng là đt gì, text, dim, hay các loại đg như line, arc, pline, spline, circle, đồng thời phải định nghĩa thế nào là tâm mới đc, là trung điểm hay điểm đặt ... thì ng khác mới biết và giúp bạn chứ.

Đối tượng ở đây là các đường tròn hoặc Line, có hatch Solid ở bên trong, Đề bài có n đường tròn Được Hatch Solid chẳng hạn, mình sẽ phải dùng lisp để scale với Base point là tâm đường tròn đó. Nếu mà mở rộng cho mọi đối tượng được thì tốt quá.

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
Đối tượng ở đây là các đường tròn hoặc Line, có hatch Solid ở bên trong, Đề bài có n đường tròn Được Hatch Solid chẳng hạn, mình sẽ phải dùng lisp để scale với Base point là tâm đường tròn đó. Nếu mà mở rộng cho mọi đối tượng được thì tốt quá.

Tue_NV đã góp ý với bạn tại sao bạn không nghe? Bạn khiến cho Tue_NV không vui rồi đấy

 

Lời đầu tiên, Tue_NV xin góp ý chân thành với bạn hhhhgggg : Khi viết bài bạn nên nhìn nhận vấn đề một cách tổng quát và nói rõ vấn đề vì có thể mọi người không hiểu theo ý bạn và từ đó làm mất thời gian của chính mình và làm mất thời gian của người khác là điều không nên và phải tránh

 

Mở rộng với mọi đối tượng thì tâm được định nghĩa như thế nào ???

 

Đây là code scale n đường tròn tại tâm của đường tròn

(defun c:SCT(/ ci tl n i)
(prompt "\n Moi ban chon CIRCLE")
(setq ci (ssget '((0 . "CIRCLE"))))
(setq tl (getreal "\n Nhap ti le scale :") n (sslength ci) i 0)

(while ((setq ent (ssname ci i))
(command "scale" ent "" (cdr(assoc 10 (entget ent))) tl)
(setq i (1+ i))
)
(princ)
)

  • 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
Em đã có cái lisp xoay đối tượng quanh tâm của chúng, Em muốn nhờ các bác Pro sửa giúp em thành lisp Scale đối tượng quanh tâm của chúng. Hay bác nào có lisp đó thì cho em xin có được ko ? Thanks !

CODE :

;;; ****************************** xoay text quanh tam cua chung *********************************

(defun c:rt ()

(setq cmd (getvar "cmdecho"))

(setvar "cmdecho" 0)

(setq thop (ssget))

(setq gocxoay (getangle "\nGoc xoay cho cac text:"))

(setq gocxoay (/ (* gocxoay 180) pi))

(setq i 0)

(repeat (sslength thop)

(setq dt (ssname thop i))

(setq ds (entget dt))

(setq p1 (cdr (assoc 10 ds)))

(setq p2 (cdr (assoc 11 ds)))

(if (null p2)

(setq dxoay p1)

(setq dxoay (list (* 0.5 (+ (car p1) (car p2)))

(* 0.5 (+ (cadr p1) (cadr p2)))

) )

);;; end if

(command "rotate" dt "" dxoay gocxoay)

(setq i (1+ i))

);;;; end repeat

(setvar "cmdecho" cmd)

(princ)

)

 

Nhờ bác Tue_NV sửa lại Lisp trên để có thể xoay lại điểm tâm: MIDDLE CENTER.

THK.

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 đã góp ý với bạn tại sao bạn không nghe? Bạn khiến cho Tue_NV không vui rồi đấy

 

 

 

Mở rộng với mọi đối tượng thì tâm được định nghĩa như thế nào ???

 

Đây là code scale n đường tròn tại tâm của đường tròn

(defun c:SCT(/ ci tl n i)
(prompt "\n Moi ban chon CIRCLE")
(setq ci (ssget '((0 . "CIRCLE"))))
(setq tl (getreal "\n Nhap ti le scale :") n (sslength ci) i 0)

(while (< i n)
(setq ent (ssname ci i))
(command "scale" ent "" (cdr(assoc 10 (entget ent))) tl)
(setq i (1+ i))
)
(princ)
)

Thanks!

Lisp này cực hay. Bác có thể phát triển lisp này để có thể scale các đối tượng như Donut, Block 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

Thanks!

Lisp này cực hay. Bác có thể phát triển lisp này để có thể scale các đối tượng như Donut, Block không ạ?

Trong lúc bác Tue_NV đi vắng, tạm thời giúp bạn vậy. Lisp này scale các loại đối tượng: Circle, Block, Donut, Rectangle.

;by Tue_NV + Doan Van Ha CADViet.com
(defun c:SCT(/ ci tl n i)
(prompt "\n Moi ban chon CIRCLE/DONUT/BLOCK")
(setq ci (ssget '((0 . "CIRCLE,LWPOLYLINE,INSERT"))))
(setq tl (getreal "\n Nhap ti le scale :") n (sslength ci) i 0)
(while (< i n)
 (setq ent (ssname ci i))
 (if (= (cdr (assoc 0 (entget ent))) "LWPOLYLINE")
  (command "scale" ent "" (centre ent) tl)
  (command "scale" ent "" (cdr (assoc 10 (entget ent))) tl))
 (setq i (1+ i)))
(princ))
;-----
(defun centre(dt / cen)
(vl-load-com)
(if (or (= (cdr (assoc 0 (entget dt))) "REGION")
       	(and (wcmatch (cdr (assoc 0 (entget dt))) "*POLYLINE")
    (= (cdr (assoc 70 (entget dt))) 1)))
  	(if (and (wcmatch (cdr (assoc 0 (entget dt))) "*POLYLINE")
    (= (cdr (assoc 70 (entget dt))) 1))
       	(progn
    		(setq cen (vlax-get (car (vlax-invoke (vla-get-modelspace (vla-get-activedocument (vlax-get-acad-object)))
    	                                  		'addregion (list (vlax-ename->vla-object dt)))) 'Centroid))
    		(entdel (entlast)))
       	(setq cen (vlax-get (vlax-ename->vla-object dt) 'Centroid))))  
cen)

  • 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

Bệnh nghề nghiệp rồi ^^ Cả Block, Donut, Circle đều dùng được Dxf 10 mà bác ^^ Của bác tổng quát rồi

Chọn Donut : (ssget (list (cons 0 "LWPOLYLINE")(cons 90 2)(cons 70 1))))
  • 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

Bệnh nghề nghiệp rồi ^^ Cả Block, Donut, Circle đều dùng được Dxf 10 mà bác ^^ Của bác tổng quát rồi

Tâm Donut lấy dxf 10 hơi rắc rối nên có (centre) thì dùng luôn cho tiện. Còn chọn Donut thì Ket đúng.

Trích dẫn ent là donut có tâm là (80 2):

((-1 . <Entity name: 7ef921a8>) (0 . "LWPOLYLINE") (330 . <Entity name:

7ef90cf8>) (5 . "E5") (100 . "AcDbEntity") (67 . 0) (410 . "Model") (8 . "0")

(100 . "AcDbPolyline") (90 . 2) (70 . 1) (43 . 5.0) (38 . 0.0) (39 . 0.0) (10

77.5 2.0) (40 . 5.0) (41 . 5.0) (42 . 1.0) (10 82.5 2.0) (40 . 5.0) (41 . 5.0)

(42 . 1.0) (210 0.0 0.0 1.0))

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

Trong lúc bác Tue_NV đi vắng, tạm thời giúp bạn vậy. Lisp này scale các loại đối tượng: Circle, Block, Donut, Rectangle.

;by Tue_NV + Doan Van Ha CADViet.com
(defun c:SCT(/ ci tl n i)
(prompt "\n Moi ban chon CIRCLE/DONUT/BLOCK")
(setq ci (ssget '((0 . "CIRCLE,LWPOLYLINE,INSERT"))))
(setq tl (getreal "\n Nhap ti le scale :") n (sslength ci) i 0)
(while (< i n)
 (setq ent (ssname ci i))
 (if (= (cdr (assoc 0 (entget ent))) "LWPOLYLINE")
  (command "scale" ent "" (centre ent) tl)
  (command "scale" ent "" (cdr (assoc 10 (entget ent))) tl))
 (setq i (1+ i)))
(princ))
;-----
(defun centre(dt / cen)
(vl-load-com)
(if (or (= (cdr (assoc 0 (entget dt))) "REGION")
       	(and (wcmatch (cdr (assoc 0 (entget dt))) "*POLYLINE")
	(= (cdr (assoc 70 (entget dt))) 1)))
  	(if (and (wcmatch (cdr (assoc 0 (entget dt))) "*POLYLINE")
	(= (cdr (assoc 70 (entget dt))) 1))
       	(progn
			(setq cen (vlax-get (car (vlax-invoke (vla-get-modelspace (vla-get-activedocument (vlax-get-acad-object)))
	                                  			'addregion (list (vlax-ename->vla-object dt)))) 'Centroid))
			(entdel (entlast)))
       	(setq cen (vlax-get (vlax-ename->vla-object dt) 'Centroid))))  
cen)

Anh DVH ạ ! Cái lisp này khá hay nhưng mà còn hạn chế như sau ? Không thể chọn nhiều đối tượng để scale được 1 lần. Anh sửa sao cho lisp có thể scale nhiều đối tượng tại tâm của mỗi đối tượng được ko ạ ? (Chắc là yêu cầu này hơi khó nhưng mà rất cần thiết ).

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

mình chuyển từ arc thành polyline, vậy có cách nào scale polyline đó tại tâm của nó ko các bác?

Hề hề hề,

Có cách, đó là phải xác định lại "tâm" của cái cung polyline đó. Hãy tham khảo việc xác định tâm vòng tròn ngoại tiếp của một tam giác. Sau đo chơi cái lisp của bác DoanVanHa là Ok

Hề hề hề,...

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

Anh DVH ạ ! Cái lisp này khá hay nhưng mà còn hạn chế như sau ? Không thể chọn nhiều đối tượng để scale được 1 lần. Anh sửa sao cho lisp có thể scale nhiều đối tượng tại tâm của mỗi đối tượng được ko ạ ? (Chắc là yêu cầu này hơi khó nhưng mà rất cần thiết ).

Hề hề hề,

Cái em Girl này có hiểu mình nói gì không cà??? Của bác DoanVanHa cho phép em chơi mút cung thang mà. Tại em khoái chơi nhát một chứ đâu phải bác ấy muốn vậy. Không tin em cứ thử liều mình như chẳng có, chọn một phát dăm bảy nghìn chú xem nó có chơi được không nhé, Đảm bảo chỉ trong .... vài chục cái hít hà là xong thôi.

Hề hề hề,

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

Hề hề hề,

Cái em Girl này có hiểu mình nói gì không cà???

Dạo này thấy diễn đàn thật lắm bài chéo ngoe :)

  • 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

Dear các bạn!

Mình thấy cả 2 lisp rotate center và scale center đều rất hay. Mình có ý kiến nho nhỏ (phần chữ mầu đỏ nhé)cho lisp rotate nhé:

b1: rt

b2: chon các doi tuong

b3: chon tam doi tuong

b4: nhap goc xoay

Sửa b3 và b4 như vậy mọi người dùng sẽ dễ hiểu hơn.

Nếu có gì không phải mong các bạn lượng thứ nha!!

  • 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

Dear các bạn!

Mình thấy cả 2 lisp rotate center và scale center đều rất hay. Mình có ý kiến nho nhỏ (phần chữ mầu đỏ nhé)cho lisp rotate nhé:

b1: rt

b2: chon các doi tuong

b3: chon tam doi tuong

b4: nhap goc xoay

Sửa b3 và b4 như vậy mọi người dùng sẽ dễ hiểu hơn.

Nếu có gì không phải mong các bạn lượng thứ nha!!

Cái này lệnh ROTATE nguyên thủy của Cad có rồ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

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

×