Đến nội dung


Hình ảnh
- - - - -

Mình cần 1 lisp scale nhiều đối tượng 1lúc


  • Please log in to reply
9 replies to this topic

#1 DuckieVra

DuckieVra

    biết zoom

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

Đã gửi 26 January 2010 - 12:41 PM

Bài toán của mình như sau:
Khi mình chọn nhiều đối tượng 1lúc và dùng lệnh scale thì lệnh hỏi chỉ điểm gốc để scale khi scale tỉ lệ khác đi thì các đối tượng mình chọn bị dịch chuyển tương ứng theo điểm gốc mình đã chọn.Các bro giúp mình làm thế nào để khi scale thì các đối tượng không bị dịch chuyển.(ví dụ như mình muốn scacle nhiều circle 1lúc thì khi chọn điểm gốc là tâm 1circle nào đó thì các circle còn lại cũng scale quanh điểm gốc là chính tâm của các circle đó).
THANKS CÁC BRO NHÌU NHÌU...!!!
  • 0

#2 duy782006

duy782006

    PHẠM QUỐC DUY

  • CADViet Team
  • PipPipPipPipPipPipPip
  • 2155 Bài viết
Điểm đánh giá: 1360 (rất tốt)

Đã gửi 26 January 2010 - 01:41 PM

Bài toán của mình như sau:
Khi mình chọn nhiều đối tượng 1lúc và dùng lệnh scale thì lệnh hỏi chỉ điểm gốc để scale khi scale tỉ lệ khác đi thì các đối tượng mình chọn bị dịch chuyển tương ứng theo điểm gốc mình đã chọn.Các bro giúp mình làm thế nào để khi scale thì các đối tượng không bị dịch chuyển.(ví dụ như mình muốn scacle nhiều circle 1lúc thì khi chọn điểm gốc là tâm 1circle nào đó thì các circle còn lại cũng scale quanh điểm gốc là chính tâm của các circle đó).
THANKS CÁC BRO NHÌU NHÌU...!!!

Vấn đề này cũng đã nói nhiều nơi bạn không chịu khó tìm xem đấy thôi. Thực chất đã có bạn hỏi câu giống như bạn rồi nhưng mà không giải quyết được đâu bạn.
-Khi đưa ra đề bài bạn đừng ví dụ mà phải cụ thể.
-Với hình tròn như ví dụ của bạn thì giải được vì nó có tâm.
-Với block cũng có tâm nhưng rất nhiều đối tượng không biết lấy gì làm đểm cơ sở nên nếu bạn yêu cầu cụ thể cho đối tượng loại nào thì mọi người mới giúp được.
  • 1

Cứ ngỡ trần gian là cõi thật.Cho nên tất bật đến bây giờ.
Tạo hộp thoại bằng lisp My blog QUY ĐỊNH ĐẶT TÊN TOPIC TRONG CHUYÊN MỤC LISPD http://ktsduy.wordpress.com/
Để cám ơn chỉ cần nhấn rep_up.png
(Là nhấn vào nút đó phía bài viết của người ta í chứ đừng có nhè cái hình này mà nhấn miết đi nha :-D


#3 thonghoang1

thonghoang1

    biết vẽ polygon

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

Đã gửi 26 January 2010 - 01:44 PM

đâu cần phải lisp,mình làm thế này nha:bạn thử vẽ 5 hình tròn sau đó vẽ đường thằng đi qua các tâm đường tròn đó(mục đích để bạn con nó có bị dịch đi không đấy mà) sau đó bạn chọn các hình tròn đó và ấn ctrl + 1 vào bảng đấy tăng Radius lên theo ý bạn là ok,thử đi nha,
  • 2

#4 DuckieVra

DuckieVra

    biết zoom

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

Đã gửi 27 January 2010 - 09:45 PM

đâu cần phải lisp,mình làm thế này nha:bạn thử vẽ 5 hình tròn sau đó vẽ đường thằng đi qua các tâm đường tròn đó(mục đích để bạn con nó có bị dịch đi không đấy mà) sau đó bạn chọn các hình tròn đó và ấn ctrl + 1 vào bảng đấy tăng Radius lên theo ý bạn là ok,thử đi nha,

Rất cảm ơn 2bạn Duy và Hoàng đã chú ý trả lời câu hỏi mình.Vì mình mới tham gia cadviet nen chua có điều kiện tìm hiểu đc nhiều nên còn nhiều fần mình chưa đọc hết mong các bạn thông cảm.Đúng như bạn Hoàng nói nếu đơn giản là đường tròn thì làm đc như thế.Vấn đề của mình là đường tròn đã đc tô solid rùi thì ko làm đc như vậy.Mong các bạn giúp mình nhá.1 lần nữa cảm ơn 2bạn.!!!
  • 0

#5 DuckieVra

DuckieVra

    biết zoom

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

Đã gửi 30 January 2010 - 12:37 PM

Bạn xem lại câu trả lời của bác DUY nhé, quan trọng ở đây ko fải vấn đề dùng lisp hay ko, mà bạn phải xác định được tâm scale mà bạn muốn với từng đối tượng khác nhau là như thế nào.
Ví dụ, như bạn nói đường tròn thì là tâm ==> quá đơn giản. nhưng block là ở đâu; hình chữ nhật là góc nào hay là giao của 2 đường chéo, text là điểm đặt text hay sao (text thì có nhiều định dạng điểm chèn),...đại khái như vậy
P/S: bài toán này trước đây mình nhớ ko lầm thì đã có người đặt đề tài rồi thì fải

Cám ơn các bạn đã quan tâm vấn đề của mình.Mình xin nói cụ thể hơn mong các bạn giúp đc.Tức là mình vẽ cốt thép bằng những đường tròn đã đc hacth solid giờ mình muốn thay đổi đường kính của những đường tròn đó mà ko làm dịch chuyển chúng khỏi vị trí tâm như lúc ban đầu thì làm thế nào.Rất mong sự quan tâm giúp đỡ của các bạn trên diễn đàn. Thanks....!
  • 0

#6 Tue_NV

Tue_NV

    KS Võ Quang Tuệ

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

Đã gửi 30 January 2010 - 02:32 PM

Cám ơn các bạn đã quan tâm vấn đề của mình.Mình xin nói cụ thể hơn mong các bạn giúp đc.Tức là mình vẽ cốt thép bằng những đường tròn đã đc hacth solid giờ mình muốn thay đổi đường kính của những đường tròn đó mà ko làm dịch chuyển chúng khỏi vị trí tâm như lúc ban đầu thì làm thế nào.Rất mong sự quan tâm giúp đỡ của các bạn trên diễn đàn. Thanks....!

Sao bạn không vẽ mặt cắt cốt thép bằng lệnh donut?
Lệnh scale donut tại tâm của nó nằm ở đây :
http://www.cadviet.c...amp;#entry68859
Bài viết số 10 bạn nhé

Còn Lisp scale "đường tròn" cốt thép của bạn thì bạn hãy thử code này nhé :

(defun TraceCIRCLE (obj / sp ep inc pt ptlst)
;Thanks gia_bach for this function;
(setq sp 0
ep (* 2 pi)
inc (/ ep 72) )
(while (< sp ep)
(setq pt (vlax-curve-getPointAtParam obj sp)
ptlst (cons pt ptlst)
sp (+ inc sp)) )
(reverse ptlst)
)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(defun c:sct (/ sscir i n ent cen lstp ss tl vl ov)
;copyright by Tue_NV
(vl-load-com)
(setq vl '("osmode" "orthomode" "cmdecho") ; Sys Var list
ov (mapcar 'getvar vl)) ; Get Old values
(mapcar 'setvar vl '(0 0 0))
(command "undo" "be")
(if (not *tl*) (setq *tl* 1.0))
(setq tl (getdist (strcat "\n Nhap he so ti le < " (rtos *tl* 2 2) " > : ")))
(if (not tl) (setq tl *tl*) (setq *tl* tl))
(if (setq sscir (ssget (list (cons 0 "CIRCLE"))))
(progn
(setq n (sslength sscir) i 0)

(while (< i n)
(setq ent (ssname sscir i)
cen (cdr (assoc 10 (entget ent)))
)

(if (= (cdr (assoc 0 (entget ent))) "CIRCLE")
(progn
(setq lstp (traceCircle (setq ob (vlax-ename->vla-object ent))) )
(if (setq ss (ssget "cp" lstp (list(cons 0 "HATCH")) ))
(command "scale" ss ent "" cen tl)
)
);progn
);if
(setq i (1+ i))
);while
(command "undo" "e")
(mapcar 'setvar vl ov) ; reset Sys Vars
);progn
(alert "\n Ban chua chon doi tuong nao ca")
);if
(princ)
)

  • 1

#7 DuckieVra

DuckieVra

    biết zoom

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

Đã gửi 02 February 2010 - 08:57 PM

Sao bạn không vẽ mặt cắt cốt thép bằng lệnh donut?
Lệnh scale donut tại tâm của nó nằm ở đây :
http://www.cadviet.c...amp;#entry68859
Bài viết số 10 bạn nhé

Còn Lisp scale "đường tròn" cốt thép của bạn thì bạn hãy thử code này nhé :


(defun TraceCIRCLE (obj / sp ep inc pt ptlst)
;Thanks gia_bach for this function;
(setq sp 0
ep (* 2 pi)
inc (/ ep 72) )
(while (< sp ep)
(setq pt (vlax-curve-getPointAtParam obj sp)
ptlst (cons pt ptlst)
sp (+ inc sp)) )
(reverse ptlst)
)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(defun c:sct (/ sscir i n ent cen lstp ss tl vl ov)
;copyright by Tue_NV
(vl-load-com)
(setq vl '("osmode" "orthomode" "cmdecho") ; Sys Var list
ov (mapcar 'getvar vl)) ; Get Old values
(mapcar 'setvar vl '(0 0 0))
(command "undo" "be")
(if (not *tl*) (setq *tl* 1.0))
(setq tl (getdist (strcat "\n Nhap he so ti le < " (rtos *tl* 2 2) " > : ")))
(if (not tl) (setq tl *tl*) (setq *tl* tl))
(if (setq sscir (ssget (list (cons 0 "CIRCLE"))))
(progn
(setq n (sslength sscir) i 0)

(while (< i n)
(setq ent (ssname sscir i)
cen (cdr (assoc 10 (entget ent)))
)

(if (= (cdr (assoc 0 (entget ent))) "CIRCLE")
(progn
(setq lstp (traceCircle (setq ob (vlax-ename->vla-object ent))) )
(if (setq ss (ssget "cp" lstp (list(cons 0 "HATCH")) ))
(command "scale" ss ent "" cen tl)
)
);progn
);if
(setq i (1+ i))
);while
(command "undo" "e")
(mapcar 'setvar vl ov) ; reset Sys Vars
);progn
(alert "\n Ban chua chon doi tuong nao ca")
);if
(princ)
)

thanks Tue NV nhìu nhá.Mình sẽ thử.Cadviet thật tuyệt vời vì trong 4rum toàn những người nhiệt tình. Thaks all.
(Ngoài lề 1chút sao mình vào phần trả lời nhanh ko gõ đc tiếng Việt nhỉ.Chỉ giúp mình nhá.hihì)
  • 0

#8 DuckieVra

DuckieVra

    biết zoom

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

Đã gửi 02 February 2010 - 11:55 PM

Mình đã thử và rất hiệu quả, thanks Tue_NV nhìu nhìu.hì. Để lisp này hoàn hảo hơn mình có câu hỏi mở thêm là: Tue_NV có thể nâng cấp lisp này chút nữa được ko, cụ thể là mình có thể chọn điểm bất kỳ trên circle đc tô solid để làm tâm scale (các circle khác cũng tự động lấy điểm đó làm tâm scale) được ko nhỉ ?. Rất mong Tue_NV quan tâm tìm hiểu.hì.
  • 0

#9 Tue_NV

Tue_NV

    KS Võ Quang Tuệ

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

Đã gửi 03 February 2010 - 03:20 AM

Mình đã thử và rất hiệu quả, thanks Tue_NV nhìu nhìu.hì. Để lisp này hoàn hảo hơn mình có câu hỏi mở thêm là: Tue_NV có thể nâng cấp lisp này chút nữa được ko, cụ thể là mình có thể chọn điểm bất kỳ trên circle đc tô solid để làm tâm scale (các circle khác cũng tự động lấy điểm đó làm tâm scale) được ko nhỉ ?. Rất mong Tue_NV quan tâm tìm hiểu.hì.

Bạn thử code này nhé :

(defun TraceCIRCLE (obj / sp ep inc pt ptlst)
;Thanks gia_bach for this function;
(setq sp 0
ep (* 2 pi)
inc (/ ep 72) )
(while (< sp ep)
(setq pt (vlax-curve-getPointAtParam obj sp)
ptlst (cons pt ptlst)
sp (+ inc sp)) )
(reverse ptlst)
)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(defun c:sct (/ sscir i n ent cen lstp ss tl vl ov cen_po ang dis R Rr di)
;copyright by Tue_NV
(vl-load-com)
(setq vl '("osmode" "orthomode" "cmdecho") ; Sys Var list
ov (mapcar 'getvar vl)) ; Get Old values
(mapcar 'setvar vl '(0 0 0))
(command "undo" "be")
(if (not *tl*) (setq *tl* 1.0))
(setq tl (getdist (strcat "\n Nhap he so ti le < " (rtos *tl* 2 2) " > : ")))
(if (not tl) (setq tl *tl*) (setq *tl* tl))
(if (setq sscir (ssget (list (cons 0 "CIRCLE"))))
(progn
(setq n (sslength sscir) i 0)
(setq ent (ssname sscir 0)
cen (cdr (assoc 10 (entget ent)))
Rr (cdr (assoc 40 (entget ent)))
)
(mapcar 'setvar vl ov)
(setq cen_po (getpoint cen "\n Nhap diem bat ki tren Circle lam tam :"))
(mapcar 'setvar vl '(0 0 0))
(setq ang (angle cen cen_po))
(setq di (- (distance cen cen_po) Rr))
(vla-ZoomExtents (vlax-get-acad-object))
(while (< i n)
(setq ent (ssname sscir i)
cen (cdr (assoc 10 (entget ent)))
R (cdr (assoc 40 (entget ent)))
dis (+ (/ (* di R) Rr) R)
cen_po (polar cen ang dis)
)
(if (= (cdr (assoc 0 (entget ent))) "CIRCLE")
(progn
(setq lstp (traceCircle (setq ob (vlax-ename->vla-object ent))) )
(if (setq ss (ssget "cp" lstp (list(cons 0 "HATCH")) ))
(command "scale" ss ent "" cen_po tl)
)
);progn
);if
(setq i (1+ i))
);while
(command "undo" "e")
(mapcar 'setvar vl ov) ; reset Sys Vars
);progn
(alert "\n Ban chua chon doi tuong nao ca")
);if
(princ)
(vla-ZoomPrevious (vlax-get-acad-object))
)

  • 1

#10 DuckieVra

DuckieVra

    biết zoom

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

Đã gửi 05 February 2010 - 12:42 AM

OA....! Tue_NV thật là lợi hai nha. Đây đúng là lisp mình đang cần. Vô cùng cám ơn Tue_NV nhá. Cadviet muôn năm.hehe.
  • 0