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

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

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

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

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

  • 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

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.

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

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

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

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

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

  • Vote tăng 3

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

@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).

 

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.

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

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.

sgl.jpg

 

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

lastn1.jpg

dùng lệnh move để di chuyển

lastn2.jpg.

 

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:

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

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

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

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
[/codeBOX]

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

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)))

  • 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

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

×