Đến nội dung


Hình ảnh

Nhờ chỉ giúp để Select đối tượng


  • Please log in to reply
13 replies to this topic

#1 lengan

lengan

    biết vẽ ellipse

  • Members
  • PipPip
  • 54 Bài viết
Điểm đánh giá: 32 (tàm tạm)

Đã gửi 17 April 2008 - 11:00 PM

Các bác trên diễn đàn giúp em với. Em copy hai hoặc ba đối tượng như line, text, polyline..vv Sau đó em muốn move các đối tượng vừa copy. Em dùng lệnh move va đánh thêm " L " để chọn đối tượng " Last " nhưng em chỉ chọn được một đối tượng mà không chọn được hai hoặc ba đối tượng mình vừa copy. Các bác có thể chỉ cho em cách nào để có thể lựa chọn toàn bộ được không? Em xin cảm ơn các bác
  • 0

#2 Nguyen Hoanh

Nguyen Hoanh

    biết lệnh adcenter

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

Đã gửi 17 April 2008 - 11:02 PM

Các bác trên diễn đàn giúp em với. Em copy hai hoặc ba đối tượng như line, text, polyline..vv Sau đó em muốn move các đối tượng vừa copy. Em dùng lệnh move va đánh thêm " L " để chọn đối tượng " Last " nhưng em chỉ chọn được một đối tượng mà không chọn được hai hoặc ba đối tượng mình vừa copy. Các bác có thể chỉ cho em cách nào để có thể lựa chọn toàn bộ được không? Em xin cảm ơn các bác

thay vì L, bạn hãy gõ vào P sẽ được điều bạn muốn.
  • 1

#3 lengan

lengan

    biết vẽ ellipse

  • Members
  • PipPip
  • 54 Bài viết
Điểm đánh giá: 32 (tàm tạm)

Đã gửi 17 April 2008 - 11:08 PM

Cám ơn bác nhưng bác Hoành ơi em muốn move các đối tượng mình vừa copy cơ. Nếu em chọn " P " Cad sẽ chọn cac đối tượng đầu tiên mà không chọn các đối tượng mình vừa thực hiện lệnh copy.
  • 0

#4 Nguyen Hoanh

Nguyen Hoanh

    biết lệnh adcenter

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

Đã gửi 18 April 2008 - 06:50 AM

Cám ơn bác nhưng bác Hoành ơi em muốn move các đối tượng mình vừa copy cơ. Nếu em chọn " P " Cad sẽ chọn cac đối tượng đầu tiên mà không chọn các đối tượng mình vừa thực hiện lệnh copy.

Cái này thì CAD không có sẵn.

Phải dùng lisp mới được.
  • 0

#5 lengan

lengan

    biết vẽ ellipse

  • Members
  • PipPip
  • 54 Bài viết
Điểm đánh giá: 32 (tàm tạm)

Đã gửi 18 April 2008 - 11:21 AM

Cái này thì CAD không có sẵn.

Phải dùng lisp mới được.


Bác Hoành ơi bác có cái lisp nao như vậy không bác. Em không biết cách lập trình lisp nên chắc việc làm một lisp như vậy là rất khó khăn. Bác giúp em với. Em cám ơn bác nhiều
  • 0

#6 KE AN MAY DI VANG

KE AN MAY DI VANG

    biết lệnh adcenter

  • CADViet Team
  • PipPipPipPipPipPipPip
  • 822 Bài viết
Điểm đánh giá: 572 (tốt)

Đã gửi 18 April 2008 - 12:44 PM

Cám ơn bác nhưng bác Hoành ơi em muốn move các đối tượng mình vừa copy cơ. Nếu em chọn " P " Cad sẽ chọn cac đối tượng đầu tiên mà không chọn các đối tượng mình vừa thực hiện lệnh copy.


( Hôm nay tôi được biết thêm 1 điều mới qua bài viết của Nguyen Hoanh:-bạn hãy gõ vào P sẽ được điều bạn muốn.)

Cái này đơn giản thôi mà! Tôi nghĩ không nhất thiết phải tạo lisp đâu bạn ạ. Tội gì phải vòng vo Tam quốc cho tốn mồi ra. Trên diễn đàn đã có bài viết: Tạo block không đặt tên. Bạn chỉ việc:-Ctrl +C rồi > Click chuột phải > Paste as Block là ổn thôi.

Trong quá trình vẽ bạn có thể Paste as Block bất kỳ lúc nào cũng được mà.

Bạn có thể dồn nó vào góc bản vẽ hoặc xô đẩy nó ra khỏi khung tên bản vẽ cũng được mà.
  • 0
KẺ ĂN MÀY DĨ VÃNG

#7 tranchan

tranchan

    biết lệnh break

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

Đã gửi 18 April 2008 - 01:08 PM

Nếu em chọn " P " Cad sẽ chọn cac đối tượng đầu tiên mà không chọn các đối tượng mình vừa thực hiện lệnh copy.


Tôi biết rồi sẽ có 1 ngày có người đề cập vấn đề này mà. Xin share cho anh em & bác Hoanh chiêu lastn của một expert tên là ZoTo

;	  Note that although AutoCAD's "Last" option selects the last drawn
; object visible, at least partially, on screen, LASTN always selects the
; last n drawn objects, whether visible on screen or not. This includes
; objects on layers that are OFF or FROZEN. Objects on LOCKed layers are
; also selected but cannot be edited whereas objects on FROZEN or OFF layers
; can be edited. Caution: don't specify a value higher than the number of
; objects you have created in the current space (Paper or Model) since you
; last entered that space ie. changed TILEMODE - the results won't be what
; you want.
;;*****************************************************************************
(defun lastn (INT2 / SS2 SSL2) ;define function to take 1 argument
(setq SS2 (ssadd)) ;set SS2 to an empty selection set
(repeat INT2 ;repeat INT2 times
(if (entlast)
(progn
(ssadd (entlast) SS2) ;add last undeleted object to selection set
(entdel (entlast)) ;delete last undeleted object
)
)
)
(setq SSL2 (1- (sslength SS2)));set SSL2 to 1 less than size of selection set
(while (>= SSL2 0) ;while SSL2 is greater than or equal to zero
(entdel (ssname SS2 SSL2)) ;undelete SSL2'th object in selection set
(setq SSL2 (1- SSL2)) ;decrement SL2
)
SS2 ;return selection set to calling function
) ;end (lastn) function
(defun C:LASTN (/ COUNT2) ;define function
;set COUNT2 to number of objects
(setq COUNT2 (getint "\nEnter number of objects: "))
(if (= 0 (getvar "CMDACTIVE")) ;if no other command is active
(progn ;else
(command "._SELECT" (lastn COUNT2) "") ;run SELECT command and (lastn)
(princ) ;exit quietly
)
(lastn COUNT2) ;call (lastn) function with argument
)
)
;;


Sau khi copy xong, đánh lệnh LASTN và giả sử đối tượng đc copy ra là 1000 thì gõ lại 1000 thì sẽ chọn lại đc những đt mới đc copy. Thử rồi biết...

Ưu điểm : lỡ copy 1000 đè lên 5000 đối tượng khác thì ko cần undo mà gõ lastn và số lượng đt là lại move đi mà ko hề hấn gì. Lưu ý ko gõ lớn hơn số lượng đc copy vì nó sẽ chọn thừa ra...
Nhược điểm: về thao tác nếu trên diện tích vẽ rộng rãi ko đụng chạm gì thì cũng ko nhanh hơn vây chọn đt...
Chỉ để tham khảo...
  • 0

#8 Nguyen Hoanh

Nguyen Hoanh

    biết lệnh adcenter

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

Đã gửi 18 April 2008 - 01:17 PM

Bác Hoành ơi bác có cái lisp nao như vậy không bác. Em không biết cách lập trình lisp nên chắc việc làm một lisp như vậy là rất khó khăn. Bác giúp em với. Em cám ơn bác nhiều


lệnh SGL (select group last) dưới đây sẽ làm điều bạn muốn. Chương trình sẽ tìm kiếm và highlight các đối tượng vừa được tạo sau tập chọn Previous. Sẽ chọn các đối tượng vừa được tạo ra bằng lệnh copy, array hay mirror.
(defun c:sgl (/ ss lst cent sp)
(setq sp (ssget "P"))
(if (or (not sp) (= (sslength sp) 0))
(alert "Khong tim thay doi tuong previous!")
(progn
(setq lst (ss2ent sp)
cent (nth 0 lst)
ss (ssadd)
)
(while (setq cent (entnext cent))
(if (not (member cent lst))
(setq ss (ssadd cent ss))
)
)
)
)
(if (/= (sslength ss) 0)
(sssetfirst ss ss)
(alert
"Khong co doi tuong moi nao ke tu khi ban thuc hien lenh\nHay su dung tham so P de chon lai cac doi tuong"
)
)
(princ)
)

(defun ss2ent (ss / sodt index lstent)
(setq
sodt (if ss
(sslength ss)
0
)
index 0
)
(repeat sodt
(setq ent (ssname ss index)
index (1+ index)
lstent (cons ent lstent)
)
)
(reverse lstent)
)



@ksgia: có thể bác chưa rõ khó khăn của bạn lengan. Vì khi sử dụng cách của bác sẽ bị lâu hơn và phải mất công explode.
@tranchan: lệnh Lastn của bạn sẽ làm người sử dụng khó khăn trong trường hợp của lengan bởi vì họ phải quan tâm đến việc họ đã copy bao nhiêu đối tượng. Sẽ mất của họ một thao tác nhỏ là xem lại bao nhiêu đối tượng vừa được tạo ra (rất khổ khi dùng lệnh array 2 chiều).
  • 3

#9 lengan

lengan

    biết vẽ ellipse

  • Members
  • PipPip
  • 54 Bài viết
Điểm đánh giá: 32 (tàm tạm)

Đã gửi 18 April 2008 - 01:43 PM

@ksgia: có thể bác chưa rõ khó khăn của bạn lengan. Vì khi sử dụng cách của bác sẽ bị lâu hơn và phải mất công explode.
@tranchan: lệnh Lastn của bạn sẽ làm người sử dụng khó khăn trong trường hợp của lengan bởi vì họ phải quan tâm đến việc họ đã copy bao nhiêu đối tượng. Sẽ mất của họ một thao tác nhỏ là xem lại bao nhiêu đối tượng vừa được tạo ra (rất khổ khi dùng lệnh array 2 chiều).
[/quote]

Em xin cám ơn sự nhiệt tình giúp đỡ của các bác trên diễn đàn. Em mong sẽ nhận được nhiều chỉ bảo, đóng góp ý kiến của các bác.
  • 0

#10 tranchan

tranchan

    biết lệnh break

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

Đã gửi 06 June 2008 - 06:40 PM

Lệnh Sgl thì đúng là có ưu điểm là chọn đưọc tất cả tập hợp các đt cuối, và ưu điểm hơn so với lastn ở lệnh array song có 1 điểm bất cập ns

Khi copy 1 tập hợp đối tượng ( ở đây là copy làm 3 lần ) lần đầu không chồng , 2 lần cuối bị chồng lên đối tượng đã có . Gõ lệnh sgl để chọn thì lệnh lại chọn cả tập hợp gồm cả 3 lần copy & đôi tuợng mui tên chú thích ko được chọn khithực hiện lệnh copy.
Hình đã gửi

Vậy với mục đích chỉ chọn đối tượng chỉ bị chồng lên thì sgl ko làm dc. Với Lastn thì ... xem hình sau
chọn dt bằng lastn
Hình đã gửi
dùng lệnh move để di chuyển
Hình đã gửi.

AE đừng nghĩ tui chơi chiêu, vì đúng với ví dụ quá đơn giản như vậy thì có thể chọn ra bằng nhiều cách khác nhau. Và AE cũng đừng lưọng thứ nếu nghĩ rằng mấy thằng cha rỗi hơi làm ba cái chuyện vd chả gặp bao giờ... Nếu ai từng vẽ thép sàn cho những nhà có mb fức tạp sẽ thấy chuyện nầy rất nhiều. Sàn tầng trên tương tự mặt bằng tầng dưói copy tầng dưới lên tầng trên trong khi vô ý lại chông lên mặt bằng nào đó đã vẽ thép rồi nếu ko có lastn thì hay nhất là undo và mong rằng ko có thằng nào cúp cầu giao điện vào lúc đó... :s_big:
  • 0

#11 duy782006

duy782006

    PHẠM QUỐC DUY

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

Đã gửi 07 June 2008 - 09:17 AM

Lệnh Sgl thì đúng là có ưu điểm là chọn đưọc tất cả tập hợp các đt cuối, và ưu điểm hơn so với lastn ở lệnh array song có 1 điểm bất cập ns

Khi copy 1 tập hợp đối tượng ( ở đây là copy làm 3 lần ) lần đầu không chồng , 2 lần cuối bị chồng lên đối tượng đã có . Gõ lệnh sgl để chọn thì lệnh lại chọn cả tập hợp gồm cả 3 lần copy & đôi tuợng mui tên chú thích ko được chọn khithực hiện lệnh copy.

AE đừng nghĩ tui chơi chiêu, vì đúng với ví dụ quá đơn giản như vậy thì có thể chọn ra bằng nhiều cách khác nhau. Và AE cũng đừng lưọng thứ nếu nghĩ rằng mấy thằng cha rỗi hơi làm ba cái chuyện vd chả gặp bao giờ... Nếu ai từng vẽ thép sàn cho những nhà có mb fức tạp sẽ thấy chuyện nầy rất nhiều. Sàn tầng trên tương tự mặt bằng tầng dưói copy tầng dưới lên tầng trên trong khi vô ý lại chông lên mặt bằng nào đó đã vẽ thép rồi nếu ko có lastn thì hay nhất là undo và mong rằng ko có thằng nào cúp cầu giao điện vào lúc đó... :s_big:

Cả hai cái điều có cái hay riêng. Nếu biết linh hoạt sử dụng sẽ đem lại lợi ích thiết thực cho người dùng. Nếu làm siêng ngồi đọc hết 2 cái này rồi kết hợp lại thì càng hay nhưng đúng như TRANCHAN nói ít khi dùng đến nên tùy theo mục đích mà dùng 1 trong 2 cái trên là ok rồi. Cám ơn cả 2 bác. (cái này có thể ứng dụng vào 1 vài lisp của mình lâu nay bị vấn đề này toàn phải đi lòng vòng ví dụ các bác xem cái lệnh cải tiến ALGIN thì thấy).
  • 0

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


#12 nguyentam1109

nguyentam1109

    biết vẽ circle

  • Members
  • PipPip
  • 35 Bài viết
Điểm đánh giá: 11 (tàm tạm)

Đã gửi 10 July 2008 - 09:16 PM

Các bác trên diễn đàn giúp em với. Em copy hai hoặc ba đối tượng như line, text, polyline..vv Sau đó em muốn move các đối tượng vừa copy. Em dùng lệnh move va đánh thêm " L " để chọn đối tượng " Last " nhưng em chỉ chọn được một đối tượng mà không chọn được hai hoặc ba đối tượng mình vừa copy. Các bác có thể chỉ cho em cách nào để có thể lựa chọn toàn bộ được không? Em xin cảm ơn các bác

khi ban chọn đối tương thứ hai thử đè thêm phím Shift xem sao
  • 0

#13 tranchan

tranchan

    biết lệnh break

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

Đã gửi 12 September 2012 - 03:08 PM

Dưới đây mình xin dẫn ra một ứng dụng lập ra dựa theo lastn; cho phép thao tác copy một nhóm đối tượng rồi sau đó scale nhóm đối tượng mới đc tạo ra xong.

Về mục đích copy -move hay copy- rotate đều có thể làm tương tự.
Đây ko fải là cách làm duy nhất để hiện thực hóa mục đích trên song cách này có vẻ tổng quát và logic


(defun lastn (INT2 / SS2 SSL2)
(setq SS2 (ssadd))
(repeat INT2
(if (entlast)
(progn
(ssadd (entlast) SS2)
(entdel (entlast))
)
)
)
(setq SSL2 (1- (sslength SS2)))
(while (>= SSL2 0)
(entdel (ssname SS2 SSL2))
(setq SSL2 (1- SSL2))
)
SS2 ;return selection set to calling function
)
;++++++++++++
(defun c:cx (/ p1 p2 ss)
(setq scl1 (getreal (strcat "\nEnter scale factor: <"
(if *scl1* (rtos *scl1* ) "") ">:"))
);setq
(if scl1
(setq *scl1* scl1)
(if *scl1* (setq scl1 *scl1*))
)
(setq ss (ssget ))
(setq p1 (getpoint "\nBase point:"))
(setq p2 (getpoint p1"\nTo point:" ))
(setq count2 (sslength ss))
(command "copy" ss "" p1 p2 "" )
(if (= 0 (getvar "cmdactive"))
(progn
(command "._select" (lastn count2) "")
(princ)
);prg
(lastn count2)
);if
(command "scale" "previous" "" p2 scl1 )
(prompt "\nDone...")
(princ)
);def

  • 0

#14 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 12 September 2012 - 03:46 PM

Nói chung là logic. Tuy nhiên, cách chọn đối tượng sinh ra từ lệnh trước (copy) để dùng cho lệnh sau (move, scale, mirror...) là hơi... dài.
Tham khảo cách chọn tập sss để dùng cho lệnh sau:
(setq ss (ssget) sss (ssadd) ent (entlast))
(command "copy" ss "" p1 p2)
(while (setq ent (entnext ent))
(setq sss (ssadd ent sss)))
  • 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.