Đến nội dung


Hình ảnh
- - - - -

[Yêu cầu] Lisp scale đối tượng quanh tâm của nó


  • Please log in to reply
14 replies to this topic

#1 hotanphi

hotanphi

    biết vẽ polygon

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

Đã gửi 17 December 2012 - 01:39 PM

Xin chào diễn đàn.
Nhờ anh em diễn đàn viết giúp em Lisp scale đối tượng quanh tâm của nó.
- Trong bản vẽ có rất nhiều đoạn thẳng có chiều dài a. Các đoạn thẳng này hợp với phương nằm ngang 1 góc anpha bất kỳ.
Mình muốn scale các đoạn thẳng này 1 lớn lên hoặc nhỏ lại 1 tỷ lệ nào đó nhưng không là thay đổi vị trí và phương của nó. (Tức là lấy điểm giữa của đoạn thẳng làm tâm scale)
- Vì mình phải làm thủ công hàng trăm đoạn thẳng lâu quá nên mong anh em giúp đỡ. Đối tượng mình cần scale là cọc của tuyến đường.
- Qua đây cũng cho em hỏi nếu scale text Tên cọc cũng lấy tâm của text làm tâm scale luôn được không. Nếu được nhờ anh em viết lisp tổng hợp scale đoạn thẳng và text tên cọc luôn giùm em. Nêu quá phức tạp thì nhờ anh em viết giúp em lisp scale đoạn thẳng quanh tâm của nó và không làm thay đổi phương của nó.
Em xin chân thành cảm ơn.
  • -1

#2 phamthanhbinh

phamthanhbinh

    biết lệnh adcenter

  • Moderator
  • PipPipPipPipPipPipPip
  • 6007 Bài viết
Điểm đánh giá: 3113 (tuyệt vời)

Đã gửi 17 December 2012 - 01:49 PM

Xin chào diễn đàn.
Nhờ anh em diễn đàn viết giúp em Lisp scale đối tượng quanh tâm của nó.
- Trong bản vẽ có rất nhiều đoạn thẳng có chiều dài a. Các đoạn thẳng này hợp với phương nằm ngang 1 góc anpha bất kỳ.
Mình muốn scale các đoạn thẳng này 1 lớn lên hoặc nhỏ lại 1 tỷ lệ nào đó nhưng không là thay đổi vị trí và phương của nó. (Tức là lấy điểm giữa của đoạn thẳng làm tâm scale)
- Vì mình phải làm thủ công hàng trăm đoạn thẳng lâu quá nên mong anh em giúp đỡ. Đối tượng mình cần scale là cọc của tuyến đường.
- Qua đây cũng cho em hỏi nếu scale text Tên cọc cũng lấy tâm của text làm tâm scale luôn được không. Nếu được nhờ anh em viết lisp tổng hợp scale đoạn thẳng và text tên cọc luôn giùm em. Nêu quá phức tạp thì nhờ anh em viết giúp em lisp scale đoạn thẳng quanh tâm của nó và không làm thay đổi phương của nó.
Em xin chân thành cảm ơn.

Hề hề hề,
Muốn cái gì thì cũng cần gửi bản vẽ trước và sau khi dùng lisp lên mới được. Nếu chỉ Scale các đoạn thẳng tại chính giữa của nó thì sau khi làm xong sẽ có một bản vẽ trông không giống ai cả đâu.....
Với text cũng tương tự.
Nếu thực sự cần như vậy, hãy gửi một bản vẽ mẫu lên để mọi người xem thử nó giống cái thằng cu oẳn tà roằn nào nhé.....
  • 0
Chúc các quý Anh trên diễn đàn luôn khỏe, đẻ thêm được nhiều thứ để mót.

#3 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 17 December 2012 - 02:04 PM

Hồi sáng bạn y/c scale line nên đã làm xong. Giờ thêm scale text thì xét sau. Hay search trên cadviet để tìm lisp của Ketxu vậy.
Lisp Scale nhóm Lines tại tâm của mỗi Line.

(setq *tl* nil)
(defun C:HA( / osm ss tl i p1 p2 pg ent)
;Doan Van Ha - CADViet.com - Ngay 17/12/2012
;Chuc nang: Scale nhom Lines tai Center cua moi Line.
(or cal (arxload "geomcal"))
(command "undo" "be")
(setq osm (getvar "osmode"))
(while
(and
(princ "\nChon nhom Lines can Scale...")
(setq ss (ssget '((0 . "Line")))))
(setvar "osmode" 0)
(if (not *tl*) (setq *tl* 1.0))
(initget 6)
(setq tl (getreal (strcat "\nHe so Scale <" (rtos *tl* 2) ">: ")))
(if (not tl) (setq tl *tl*) (setq *tl* tl))
(setq i -1)
(while (setq ent (ssname ss (setq i (1+ i))))
(setq p1 (cdr (assoc 10 (entget ent))))
(setq p2 (cdr (assoc 11 (entget ent))))
(setq pg (cal "plt(p1,p2,0.5)"))
(if (/= tl 1) (command "scale" ent "" pg tl))))
(setvar "osmode" osm)
(command "undo" "end")
(princ))

  • 1

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

hotanphi

    biết vẽ polygon

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

Đã gửi 17 December 2012 - 02:12 PM

Dạ trước hết em xin cảm ơn anh
Em xin gửi bản vẽ lên nhờ anh em diễn đàn giúp đỡ.
Đây là file cad em đính kèm
Em xin chân thành cảm ơn
http://www.mediafire...dk5e82u6z6zrh23
  • 0

#5 hotanphi

hotanphi

    biết vẽ polygon

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

Đã gửi 17 December 2012 - 02:17 PM

Hồi sáng bạn y/c scale line nên đã làm xong. Giờ thêm scale text thì xét sau. Hay search trên cadviet để tìm lisp của Ketxu vậy.
Lisp Scale nhóm Lines tại tâm của mỗi Line.<pre class="cadvietlispcode">file: ha.lsp</pre>

Em cảm ơn anh Hà
Nhưng khi sử dụng lisp anh gửi thì các line khi scale nó nhảy khỏi vị trí khác anh ạ
File bản vẽ em gửi phía trên.
Em xin cảm ơn
Nhờ anh khắc phục giúp
  • 0

#6 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 17 December 2012 - 02:26 PM

Bạn UCS về W trước khi dùng lisp (để khỏi sửa lisp) là OK thôi.
  • 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 phamthanhbinh

phamthanhbinh

    biết lệnh adcenter

  • Moderator
  • PipPipPipPipPipPipPip
  • 6007 Bài viết
Điểm đánh giá: 3113 (tuyệt vời)

Đã gửi 17 December 2012 - 04:18 PM

Em cảm ơn anh Hà Nhưng khi sử dụng lisp anh gửi thì các line khi scale nó nhảy khỏi vị trí khác anh ạ File bản vẽ em gửi phía trên. Em xin cảm ơn Nhờ anh khắc phục giúp

Hề hề hề,
Dựa theo bản vẽ bạn gửi, mình đoán ý và viết cái lisp này, bạn dùng thử coi có ưng ý không. Lisp có hai lựa chọn phương án scale:
1/- Phương án A: lisp chỉ scale các đoạn thẳng.
2/- Phương án B: lisp scale các đoạn thẳng và các text đi kèm theo tâm là điểm giữa của đoạn thẳng.

http://www.cadviet.c...pecialscale.lsp


(defun C:Spsc (/ oldos lnlst ans k p1 p2 p3 d ss)
(vl-load-com)
(command "undo" "be")
(setq oldos (getvar "osmode"))
(setvar "osmode" 0)
(command "ucs" "w")
(setq lnlst (acet-ss-to-list (ssget (list (cons 0 "line")))))
(setq ans (getstring "\n Chon phuong an scale <A or B> : "))
(setq k (getreal "\n Nhap ty le scale: "))
(foreach ln lnlst
(setq p1 (cdr (assoc 10 (entget ln)))
p2 (cdr (assoc 11 (entget ln)))
p3 (mapcar '(lambda (x y) (/ (+ x y) 2)) p1 p2)
d (distance p1 p2) )
(if (= (strcase ans) "A")
(command "scale" ln "" p3 k)
(progn
(setq ss (ssget "w" (list (- (car p3) (* 1.5 d)) (- (cadr p3) (* 1.5 d)))
(list (+ (car p3) (* 1.5 d)) (+ (cadr p3) (* 1.5 d))) ))
(command "scale" ss "" p3 k)
)
)
)
(command "ucs" "p")
(setvar "osmode" oldos)
(command "undo" "e")
(princ)
)


Lưu ý là lisp chỉ ứng dụng cho các đoạn thẳng là line chứ không dùng cho pline.
  • 1
Chúc các quý Anh trên diễn đàn luôn khỏe, đẻ thêm được nhiều thứ để mót.

#8 hotanphi

hotanphi

    biết vẽ polygon

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

Đã gửi 18 December 2012 - 08:21 AM

Hề hề hề,
Dựa theo bản vẽ bạn gửi, mình đoán ý và viết cái lisp này, bạn dùng thử coi có ưng ý không. Lisp có hai lựa chọn phương án scale:
1/- Phương án A: lisp chỉ scale các đoạn thẳng.
2/- Phương án B: lisp scale các đoạn thẳng và các text đi kèm theo tâm là điểm giữa của đoạn thẳng.

Da em xin cảm ơn anh phamthanhbinh.
Khi sử dụng lisp của anh e thấy như thế này mong anh chỉnh sửa giúp
Giữa 2 phương án A và B không có sự khác biệt anh ạ
Tức là với phương án B: B: lisp scale các đoạn thẳng và các text đi kèm theo tâm là điểm giữa của đoạn thẳng. Tuy nhiên text không scale được mà chỉ scale đoạn thẳng như phương án A. (Theo em nghĩ vì mình select objects trước dòng lệnh chọn phương án A hoặc B. Nên khi chọn phương án B thì phần text và đọa thẳng đi kèm ko được chọn mà chỉ chọn được các đoạn thẳng vì vậy các text này ko được scale theo đoạn thẳng.
- Có ý này mong anh xem giúp em thử được không. Anh viết giùm em đoạn code để move các text và đoạn thẳng đi kèm theo text ra xa hoặc lại gần 1 khoảng a nào đó nhưng không làm tây đổi phương (góc) của các đoạn thẳng và các text đi kèm này. Nếu được thì anh viết giúp
Mong anh Bình xem và chỉnh sửa giúp em.
Xin cảm ơn anh và mọi người trên diễn đàn
  • 0

#9 phamthanhbinh

phamthanhbinh

    biết lệnh adcenter

  • Moderator
  • PipPipPipPipPipPipPip
  • 6007 Bài viết
Điểm đánh giá: 3113 (tuyệt vời)

Đã gửi 18 December 2012 - 10:27 AM

Da em xin cảm ơn anh phamthanhbinh.
Khi sử dụng lisp của anh e thấy như thế này mong anh chỉnh sửa giúp
Giữa 2 phương án A và B không có sự khác biệt anh ạ
Tức là với phương án B: B: lisp scale các đoạn thẳng và các text đi kèm theo tâm là điểm giữa của đoạn thẳng. Tuy nhiên text không scale được mà chỉ scale đoạn thẳng như phương án A. (Theo em nghĩ vì mình select objects trước dòng lệnh chọn phương án A hoặc B. Nên khi chọn phương án B thì phần text và đọa thẳng đi kèm ko được chọn mà chỉ chọn được các đoạn thẳng vì vậy các text này ko được scale theo đoạn thẳng.
- Có ý này mong anh xem giúp em thử được không. Anh viết giùm em đoạn code để move các text và đoạn thẳng đi kèm theo text ra xa hoặc lại gần 1 khoảng a nào đó nhưng không làm tây đổi phương (góc) của các đoạn thẳng và các text đi kèm này. Nếu được thì anh viết giúp
Mong anh Bình xem và chỉnh sửa giúp em.
Xin cảm ơn anh và mọi người trên diễn đàn

Hề hề hê,
Mình đã test với bản vẽ bạn gửi thì OK, còn cái bạn làm không được hãy gửi lên để mình kiểm tra. mình đoán là do text của bạn nằm quá xa đoạn thẳng nên khi chọn tập ss bởi cửa sổ, nó không chọn được text.
Nếu muốn move, bạn chỉ cần thay đổi dòng code lệnh scale bằng code của lệnh move là OK.
Hãy làm thử xem sao nhé.
  • 0
Chúc các quý Anh trên diễn đàn luôn khỏe, đẻ thêm được nhiều thứ để mót.

#10 sumi

sumi

    biết lệnh array

  • Members
  • PipPipPip
  • 185 Bài viết
Điểm đánh giá: 55 (tàm tạm)

Đã gửi 23 July 2013 - 05:25 PM

e cũng đang tìm lisp này, giờ tìm dc rồi!

Nhưng ko biết các a có thể sửa lisp để có thể áp dụng dc mới các đối tượng khác nữa dc ko? ví dụ: áp dụng dc cho circle, block, polyline..

thanks!

 

P/S: Mình đang tìm lại lisp trim các đoạn line, pline trong vùng giao nhau chúng, lúc trước có load trên 4rum về rồi nhưng lại làm mất. Bạn nào có thì gửi lại giúp mình với. Mình ko muốn tạo 1 topic nữa sợ loãng 4rum mất.

cảm ơn nhiều!


  • 0
"Xin chào bạn. Đây là tổng đài tin nhắn. Ấn phím 1 để có 1 lời khen. Phím 2 cho một lời chúc tốt đẹp. Phím 3 cho 1 nụ hôn. Phím 4 cho 1 cuộc hẹn. Nếu muốn tất cả hãy bấm số của tôi"

#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 23 July 2013 - 07:05 PM

e cũng đang tìm lisp này, giờ tìm dc rồi!

Nhưng ko biết các a có thể sửa lisp để có thể áp dụng dc mới các đối tượng khác nữa dc ko? ví dụ: áp dụng dc cho circle, block, polyline..

thanks!

 

P/S: Mình đang tìm lại lisp trim các đoạn line, pline trong vùng giao nhau chúng, lúc trước có load trên 4rum về rồi nhưng lại làm mất. Bạn nào có thì gửi lại giúp mình với. Mình ko muốn tạo 1 topic nữa sợ loãng 4rum mất.

cảm ơn nhiều!

Để scale quanh tâm thì bạn phải định nghĩa tâm là điểm nào trên đối tương: block, pline... Scale đối tượng nào cũng được cả, chỉ là vấn đề tâm mà thôi.


  • 1

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


#12 sumi

sumi

    biết lệnh array

  • Members
  • PipPipPip
  • 185 Bài viết
Điểm đánh giá: 55 (tàm tạm)

Đã gửi 23 July 2013 - 10:29 PM

Để scale quanh tâm thì bạn phải định nghĩa tâm là điểm nào trên đối tương: block, pline... Scale đối tượng nào cũng được cả, chỉ là vấn đề tâm mà thôi.

 

nhưng vấn đề là dùng với lisp thì chỉ chọn dc đối tượng là line thôi, ko chọn đc pline và circle hay block a ah!


  • 0
"Xin chào bạn. Đây là tổng đài tin nhắn. Ấn phím 1 để có 1 lời khen. Phím 2 cho một lời chúc tốt đẹp. Phím 3 cho 1 nụ hôn. Phím 4 cho 1 cuộc hẹn. Nếu muốn tất cả hãy bấm số của tôi"

#13 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 23 July 2013 - 10:32 PM

nhưng vấn đề là dùng với lisp thì chỉ chọn dc đối tượng là line thôi, ko chọn đc pline và circle hay block a ah!

Cứ định nghĩa tâm rất rõ ràng của từng kiểu đối tượng mà bạn cần scale, sau đó sẽ có lisp mới chứ không phải lisp cũ ở trên.


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


#14 minhngockt

minhngockt

    biết vẽ pline

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

Đã gửi 03 July 2014 - 09:39 PM

Nhờ bác Hà viết hộ em lisp tương tự như trên nhưng ứng dụng với đường pline, em cảm ơn bác nhiều


  • 0

#15 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 03 July 2014 - 09:44 PM

Tâm Pline ở đâu?


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