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

Lisp đưa đối tượng về vị trí cũ sau khi move?

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

Em vừa mới move nhiều đối tượng A,B,C... trong đó có move nhầm 1 số đối tượng ko cần phải move là B,C... em muốn có 1 cái lisp để đưa các đối tượng này về vị trí cũ mong các bác giúp đỡ :cheers:

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
sao bạn ko sự dụng lệnh undo

Oạch, undo thì nó kéo hết cả các đối tượng về hả bác? :cheers:

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 vừa mới move nhiều đối tượng A,B,C... trong đó có move nhầm 1 số đối tượng ko cần phải move là B,C... em muốn có 1 cái lisp để đưa các đối tượng này về vị trí cũ mong các bác giúp đỡ :cheers:

Bạn sử dụng 2 Lisp này xem sao

Lệnh mnh : thực hiện y như lệnh Move của CAD (-> Move đối tượng A, B, C -> vị trí mới)

-> Lệnh tmn -> kế thừa lệnh mnh -> đưa đối tượng đuợc chọn Move nhầm về vị trí cũ)

(defun c:mnh(/ base second)
(setq ss (ssget))
(setq base (getpoint "\n Base point :"))
(setq second (getpoint base "\n Second point :"))
(command "move" ss "" base second)
(setq kc (distance base second))
(setq ang (angle second base))
(princ)
)
;
(defun c:tmn(/ ss po)
(prompt "\n Chon doi tuong Move nham :")
(setq ss (ssget))
(setq po (polar '(0 0 0) ang kc))
(command "move" ss "" '(0 0 0) po)
(princ)
)

  • 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ạn sử dụng 2 Lisp này xem sao

Lệnh mnh : thực hiện y như lệnh Move của CAD (-> Move đối tượng A, B, C -> vị trí mới)

-> Lệnh tmn -> kế thừa lệnh mnh -> đưa đối tượng đuợc chọn Move nhầm về vị trí cũ)

(defun c:mnh(/ base second)
(setq ss (ssget))
(setq base (getpoint "\n Base point :"))
(setq second (getpoint base "\n Second point :"))
(command "move" ss "" base second)
(setq kc (distance base second))
(setq ang (angle second base))
(princ)
)
;
(defun c:tmn(/ ss po)
(prompt "\n Chon doi tuong Move nham :")
(setq ss (ssget))
(setq po (polar '(0 0 0) ang kc))
(command "move" ss "" '(0 0 0) po)
(princ)
)

Vấn đề là ở chỗ lúc mình Move là mình ko cố tình move nhầm. Nếu như cách của bác thì phải thay lệnh Move của Cad bằng lệnh move của lisp rùi. Tìm cách lấy lại vị trí vừa move như lệnh OPPS cũng khoai phết

  • 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ạn sử dụng 2 Lisp này xem sao

Lệnh mnh : thực hiện y như lệnh Move của CAD (-> Move đối tượng A, B, C -> vị trí mới)

-> Lệnh tmn -> kế thừa lệnh mnh -> đưa đối tượng đuợc chọn Move nhầm về vị trí cũ)

(defun c:mnh(/ base second)
(setq ss (ssget))
(setq base (getpoint "\n Base point :"))
(setq second (getpoint base "\n Second point :"))
(command "move" ss "" base second)
(setq kc (distance base second))
(setq ang (angle second base))
(princ)
)
;
(defun c:tmn(/ ss po)
(prompt "\n Chon doi tuong Move nham :")
(setq ss (ssget))
(setq po (polar '(0 0 0) ang kc))
(command "move" ss "" '(0 0 0) po)
(princ)
)

Đầu tiên em xin cảm ơn bác Tuệ đã nhiệt tình giúp đỡ. Thứ 2 em muốn thỉnh giáo bác 1 điều, đó là bác nói MNH giống hệt với lệnh Move của cad, tuy nhiên khi em dùng lệnh này thì thấy 1 điều, đó là với lệnh Move của cad, sau khi mình chọn bắt điểm (BASE POINT) và trong lúc chờ điểm đặt (SECOND POINT) thì tại con trỏ sẽ hiện lên ảnh của các đối tượng mình vừa chọn, tuy nhiên khi em dùng lệnh MNH trong lisp trên thì hoàn toàn ko thấy, do vậy khi mình MNH 1 đối tượng lớn thì khó hình dung ra khoảng trống và vị trí để mình đặt, như thế có thể mình sẽ đặt vật không đúng như ý muốn. Bác Tuệ và các bác có cách nào xử lý việc này ko ạ, làm sao để khi gõ MNH thì giống 100% với lệnh Move của Cad ấy ạ, xin cảm ơn các bác rất nhiều :cheers:

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
Vấn đề là ở chỗ lúc mình Move là mình ko cố tình move nhầm. Nếu như cách của bác thì phải thay lệnh Move của Cad bằng lệnh move của lisp rùi. Tìm cách lấy lại vị trí vừa move như lệnh OPPS cũng khoai phết

Ý của em cũng giống với ý bác Nataca đấy bác Tuệ ạ, nếu đã dùng lisp này thì phải thay lệnh Move trong cad bằng lệnh Move trong lisp của bác, vì thế em không muốn nó khác đi 1 tí gì so với lệnh Move của cad :cheers:

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ủa em cũng giống với ý bác Nataca đấy bác Tuệ ạ, nếu đã dùng lisp này thì phải thay lệnh Move trong cad bằng lệnh Move trong lisp của bác, vì thế em không muốn nó khác đi 1 tí gì so với lệnh Move của cad :cheers:

(defun c:mnh(/ base second)
(setq ss (ssget))
(setq base (getpoint "\n Base point :"))
(setq second (ACET-SS-DRAG-MOVE ss base "\n Second point :"))
(command "move" ss "" base second)
(setq kc (distance base second))
(setq ang (angle second base))
(princ)
)

nếu cố tình dùng lisp thì tthay hàm getpoint bằng hàm ACET-SS-DRAG-MOVE là được. Ban có thể sửa tên lệnh của lisp này là lệnh Move luôn cũng được. Không sao cả. Muốn nó thành luôn lệnh của cad thì thêm câu lệnh này:

(vlax-add-cmd "Move" 'c:mnh)

  • 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
(defun c:mnh(/ base second)
(setq ss (ssget))
(setq base (getpoint "\n Base point :"))
(setq second (ACET-SS-DRAG-MOVE ss base "\n Second point :"))
(command "move" ss "" base second)
(setq kc (distance base second))
(setq ang (angle second base))
(princ)
)

nếu cố tình dùng lisp thì tthay hàm getpoint bằng hàm ACET-SS-DRAG-MOVE là được. Ban có thể sửa tên lệnh của lisp này là lệnh Move luôn cũng được. Không sao cả. Muốn nó thành luôn lệnh của cad thì thêm câu lệnh này:

(vlax-add-cmd "Move" 'c:mnh)

Chào Nataca.

Natca có thể nói rõ hơn về hàm vlax-add-cmd. Sao mình thêm câu lệnh (vlax-add-cmd "Move" 'c:mnh) này vào trong Lisp mnh nhưng không được. Mình còn chưa hiểu về hàm này lắm.

Nataca và các bạn có thể giải thích rõ hơn về vấn đề này được không?

 

Cảm ơn

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
Chào Nataca.

Natca có thể nói rõ hơn về hàm vlax-add-cmd. Sao mình thêm câu lệnh (vlax-add-cmd "Move" 'c:mnh) này vào trong Lisp mnh nhưng không được. Mình còn chưa hiểu về hàm này lắm.

Nataca và các bạn có thể giải thích rõ hơn về vấn đề này được không?

 

Cảm ơn

Em quên mất là hàm (vlax-add-cmd "tên lệnh" 'tên lệnh trong lisp) chỉ dùng để thêm các lệnh mới ngoài lệnh Cad mặc định sẵn. Hàm này biến 1 lệnh trong lisp thành một lệnh như trong Cad. Tức ta có thể dùng lại nó bằng dòng lệnh (command "tên hàm mới đặt" ...) hay tạo lệnh tắt cho nó ngay trong file acad.pgp

  • 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 quên mất là hàm (vlax-add-cmd "tên lệnh" 'tên lệnh trong lisp) chỉ dùng để thêm các lệnh mới ngoài lệnh Cad mặc định sẵn. Hàm này biến 1 lệnh trong lisp thành một lệnh như trong Cad. Tức ta có thể dùng lại nó bằng dòng lệnh (command "tên hàm mới đặt" ...) hay tạo lệnh tắt cho nó ngay trong file acad.pgp

Thế cụ thể là thế nào hở các bác :cheers:

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
Thế cụ thể là thế nào hở các bác :cheers:

đây: (vlax-add-cmd "M" 'c:mnh). Bạn đánh lệnh M để move

  • 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
(defun c:mnh(/ base second)
(setq ss (ssget))
(setq base (getpoint "\n Base point :"))
(setq second (ACET-SS-DRAG-MOVE ss base "\n Second point :"))
(command "move" ss "" base second)
(setq kc (distance base second))
(setq ang (angle second base))
(princ)
)

nếu cố tình dùng lisp thì tthay hàm getpoint bằng hàm ACET-SS-DRAG-MOVE là được. Ban có thể sửa tên lệnh của lisp này là lệnh Move luôn cũng được. Không sao cả. Muốn nó thành luôn lệnh của cad thì thêm câu lệnh này:

(vlax-add-cmd "Move" 'c:mnh)

 

 

Bác Nataca ơi, hình như khi dùng lisp này mà mình dùng lệnh MNH để move vật đi theo khoảng cách thì không đúng so với dùng lệnh Move bình thường bác ạ, ví dụ gõ MNH rồi gõ khoảng cách 2000 (sang bên trái) thì có lúc nó lại move đối tượng lên trên hoặc sang phải cơ, bác xem lại giúp em được ko ạ?

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 Nataca ơi, hình như khi dùng lisp này mà mình dùng lệnh MNH để move vật đi theo khoảng cách thì không đúng so với dùng lệnh Move bình thường bác ạ, ví dụ gõ MNH rồi gõ khoảng cách 2000 (sang bên trái) thì có lúc nó lại move đối tượng lên trên hoặc sang phải cơ, bác xem lại giúp em được ko ạ?

Rất cảm ơn Nataca.

Chào hai_1401. Bạn sử dụng Code đã chỉnh lại dưới đây xem có đúng ý không nhé.

(defun c:mnh(/ base second)
(setq ss (ssget))
(setq base (getpoint "\n Base point :"))
(setq second (ACET-SS-DRAG-MOVE ss base "\n Second point :" 0))
(command "move" ss "" base second)
(setq kc (distance base second))
(setq ang (angle second base))
(princ)
)

Còn muốn để đối tượng trở về vị trí cũ thì sử dụng lisp tmn.

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
Rất cảm ơn Nataca.

Chào hai_1401. Bạn sử dụng Code đã chỉnh lại dưới đây xem có đúng ý không nhé.

(defun c:mnh(/ base second)
(setq ss (ssget))
(setq base (getpoint "\n Base point :"))
(setq second (ACET-SS-DRAG-MOVE ss base "\n Second point :" 0))
(command "move" ss "" base second)
(setq kc (distance base second))
(setq ang (angle second base))
(princ)
)

Còn muốn để đối tượng trở về vị trí cũ thì sử dụng lisp tmn.

 

Chưa được bác Tuệ ạ, vẫn bị lỗi khi move theo kích thước, sai cả hướng nữa :cheers:

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

Thêm 1 lỗi nữa bác Tuệ ạ, dùng lệnh move trong lisp của bác, mỗi khi để chế độ "Ortho on" và tiến hành move đối tượng thì dù có bắt điểm vào 1 điểm Second Point nào đó thì nó vẫn ưu tiên Ortho chứ ko ưu tiên bắt điể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
Em vừa mới move nhiều đối tượng A,B,C... trong đó có move nhầm 1 số đối tượng ko cần phải move là B,C... em muốn có 1 cái lisp để đưa các đối tượng này về vị trí cũ mong các bác giúp đỡ :bigsmile:

Chào Hai, sau khi thực hiện lệnh move của cad, trong kho dữ liệu lưu trữ, các đối tượng bị move sẽ được cad đặt tên ename mới và các đối tượng cũ được xem như bị đánh dấu xóa. Hiện nay, thiep chưa thấy 1 mối liên kết nào giữa đối tượng cũ (bị đánh dấu xóa) và đối tượng mới, vì vậy cũng không truy cập vào kho dữ liệu đối tượng cũ được. Nếu biết kho dữ liệu đối tượng cũ, thì chúng ta mới truy cập được toạ độ đối tượng cũ trước khi bị move, và chúng ta mới move đối tượng mới trở về tọa độ cũ. Còn không truy cập vào kho dữ liệu đối tượng cũ được thì bó tay.com !!!

  • 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
Chào Hai, sau khi thực hiện lệnh move của cad, trong kho dữ liệu lưu trữ, các đối tượng bị move sẽ được cad đặt tên ename mới và các đối tượng cũ được xem như bị đánh dấu xóa. Hiện nay, thiep chưa thấy 1 mối liên kết nào giữa đối tượng cũ (bị đánh dấu xóa) và đối tượng mới, vì vậy cũng không truy cập vào kho dữ liệu đối tượng cũ được. Nếu biết kho dữ liệu đối tượng cũ, thì chúng ta mới truy cập được toạ độ đối tượng cũ trước khi bị move, và chúng ta mới move đối tượng mới trở về tọa độ cũ. Còn không truy cập vào kho dữ liệu đối tượng cũ được thì bó tay.com !!!

Chào thiep

Tue_NV đồng ý với bạn về những điều bạn nói. Nhưng với việc bó tay.com thì mình chưa đồng ý.

Lệnh MOVE của CAD là lệnh thực hiện việc di chuyển đối tượng dựa trên phép tịnh tiến với vecto dời eq.latex?\overrightarrow{v}

 

Nếu để di chuyển đối tượng về lại vị trí cũ thì chúng ta cũng thực hiện phép tịnh tiến với vectơ dời -eq.latex?\overrightarrow{v} : có độ dài bằng vecto dời eq.latex?\overrightarrow{v}, nhưng ngược chiều với eq.latex?\overrightarrow{v}. Lisp tmn ở bài viết trên của Tue_NV thể hiện điều đó. Tuy nhiên nhìn vào Lisp tmn chắc rằng Thiep cũng sẽ có ý kiến vì nó chưa hoàn thiện lắm

 

Nhân tiện đây cũng xin hỏi thiep về hàm ACET-SS-DRAG-MOVE : Tại sao khi nhập khoảng cách trực tiếp (direct distance) thì hàm này thực hiện không giống như của CAD. Khi ta thực hiện lênh Move của CAD thì khi nhập khoảng cách trực tiếp (direct distance) -> Cad sẽ di chuyển đối tượng theo hướng di chuyển của chuột với khoảng cách mà ta đã nhập vào

 

Và còn 1 điểm nữa là điều mà bạn Hai đã hỏi. Thiep và mọi người có thể giải thích dùm được không?

Xin cảm ơn

Thêm 1 lỗi nữa bác Tuệ ạ, dùng lệnh move trong lisp của bác, mỗi khi để chế độ "Ortho on" và tiến hành move đối tượng thì dù có bắt điểm vào 1 điểm Second Point nào đó thì nó vẫn ưu tiên Ortho chứ ko ưu tiên bắt điểm?
  • 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
Chào thiep

Tue_NV đồng ý với bạn về những điều bạn nói. Nhưng với việc bó tay.com thì mình chưa đồng ý.

Lệnh MOVE của CAD là lệnh thực hiện việc di chuyển đối tượng dựa trên phép tịnh tiến với vecto dời eq.latex?\overrightarrow{v}

 

Nếu để di chuyển đối tượng về lại vị trí cũ thì chúng ta cũng thực hiện phép tịnh tiến với vectơ dời -eq.latex?\overrightarrow{v} : có độ dài bằng vecto dời eq.latex?\overrightarrow{v}, nhưng ngược chiều với eq.latex?\overrightarrow{v}. Lisp tmh ở bài viết trên của Tue_NV thể hiện điều đó. Tuy nhiên nhìn vào Lisp tmh chắc rằng Thiep cũng sẽ có ý kiến vì nó chưa hoàn thiện lắm

 

Nhân tiện đây cũng xin hỏi thiep về hàm ACET-SS-DRAG-MOVE : Tại sao khi nhập khoảng cách trực tiếp (direct distance) thì hàm này thực hiện không giống như của CAD. Khi ta thực hiện lênh Move của CAD thì khi nhập khoảng cách trực tiếp (direct distance) -> Cad sẽ di chuyển đối tượng theo hướng di chuyển của chuột với khoảng cách mà ta đã nhập vào

 

Và còn 1 điểm nữa là điều mà bạn Hai đã hỏi. Thiep và mọi người có thể giải thích dùm được không?

Xin cảm ơn

Chào Tue_nv, theo mình thì lisp của Tue vẫn còn phải yêu cầu điểm base point và secon point. Còn ý tưởng của Hai_1401 là chỉ pick vào đối tượng nào vừa bị move thì đối tượng đó về lại vị trí cũ trước khi bị move. Phải không Hai_1410? Đây mới là vấn đề nan giải, bó tay Thiep!

Còn hàm ACET-SS-DRAG-MOVE, trả về 1 điểm pick sau cùng (p2), nó thể hiện 1 hình ảnh động giống như lệnh move, và như vậy sau khi có được điểm p2 mà hàm ACET-SS-DRAG-MOVE trả về, ta dùng lệnh move các đối tượng theo 2 điểm. Nếu ta không sử dụng điểm p2 này vào lệnh move, ví dụ dùng lệnh move vơi 1 điểm và 1 khoảng cách, thì không cần phải sử dụng hàm ACET-SS-DRAG-MOVE nữa.

khi đặt ở chế độ Ortho, thì cusor trên màn hình chỉ đi ngang hay đi đứng thôi và khi pick điểm thì điểm chỉ ở hàng ngang hay hàng đứng thôi.

Thân chào Tue_nv

  • 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
Chào Hai, sau khi thực hiện lệnh move của cad, trong kho dữ liệu lưu trữ, các đối tượng bị move sẽ được cad đặt tên ename mới và các đối tượng cũ được xem như bị đánh dấu xóa. Hiện nay, thiep chưa thấy 1 mối liên kết nào giữa đối tượng cũ (bị đánh dấu xóa) và đối tượng mới, vì vậy cũng không truy cập vào kho dữ liệu đối tượng cũ được. Nếu biết kho dữ liệu đối tượng cũ, thì chúng ta mới truy cập được toạ độ đối tượng cũ trước khi bị move, và chúng ta mới move đối tượng mới trở về tọa độ cũ. Còn không truy cập vào kho dữ liệu đối tượng cũ được thì bó tay.com !!!

Em cũng nghĩ là lệnh move trong cad không thể áp dụng để sử dụng cho lisp này nên anh Tuệ mới viết để hình thành nên lệnh move mới trong lisp, vì thế nó ko thể toàn diện và giống hệt với lệnh move trong cad. Tuy vậy em vẫn mong muốn lệnh move trong lisp này sẽ hạn chế tối đa những điểm mà em đã nêu và có thể thay thế cho lệnh move trong cad.

Cảm ơn các anh đã quan tâm :bigsmile:

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
Chào Tue_nv, theo mình thì lisp của Tue vẫn còn phải yêu cầu điểm base point và secon point. Còn ý tưởng của Hai_1401 là chỉ pick vào đối tượng nào vừa bị move thì đối tượng đó về lại vị trí cũ trước khi bị move. Phải không Hai_1410? Đây mới là vấn đề nan giải, bó tay Thiep!

Còn hàm ACET-SS-DRAG-MOVE, trả về 1 điểm pick sau cùng (p2), nó thể hiện 1 hình ảnh động giống như lệnh move, và như vậy sau khi có được điểm p2 mà hàm ACET-SS-DRAG-MOVE trả về, ta dùng lệnh move các đối tượng theo 2 điểm. Nếu ta không sử dụng điểm p2 này vào lệnh move, ví dụ dùng lệnh move vơi 1 điểm và 1 khoảng cách, thì không cần phải sử dụng hàm ACET-SS-DRAG-MOVE nữa.

khi đặt ở chế độ Ortho, thì cusor trên màn hình chỉ đi ngang hay đi đứng thôi và khi pick điểm thì điểm chỉ ở hàng ngang hay hàng đứng thôi.

Thân chào Tue_nv

Chào Hai_1410 và Tue_nv, nói là bó tay, nhưng mình vẫn suy nghĩ để giải quyết bài toán này. Và qua 1 đêm ngủ chập chờn, sáng nay mình viết 1 đoạn lisp này đây:

(defun dxf (id en) (cdr (assoc id (entget en))))
(defun c:unmove (/ en1 p1 en2 p2 en)
 (setq en1 (entlast)
p1 (dxf 10 en1))
 (command "undo" 1)
 (setq en2 (entlast)
p2 (dxf 10 en2))
 (command "redo")
 (while (setq en (car (entsel "\nPick a obj to undo move: ")))
   (command "move" en "" p1 p2)
 )
 (princ)
 )

  • 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
Chào Hai_1410 và Tue_nv, nói là bó tay, nhưng mình vẫn suy nghĩ để giải quyết bài toán này. Và qua 1 đêm ngủ chập chờn, sáng nay mình viết 1 đoạn lisp này đây:

(defun dxf (id en) (cdr (assoc id (entget en))))
(defun c:unmove (/ en1 p1 en2 p2 en)
 (setq en1 (entlast)
p1 (dxf 10 en1))
 (command "undo" 1)
 (setq en2 (entlast)
p2 (dxf 10 en2))
 (command "redo")
 (while (setq en (car (entsel "\nPick a obj to undo move: ")))
   (command "move" en "" p1 p2)
 )
 (princ)
 )

Cách dùng Undo của bạn là một ý tưởng hay. Tuy nhiên nó chỉ đúng với 1 đối tượng (nếu vậy thì dùng luôn lệnh Undo luôn có phải nhanh hơn không). Ý bạn Hai_1410 là Move một số đối tượng nhưng trong số đó có chọn nhầm vài đối tượng không cần Move.

  • 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
Cách dùng Undo của bạn là một ý tưởng hay. Tuy nhiên nó chỉ đúng với 1 đối tượng (nếu vậy thì dùng luôn lệnh Undo luôn có phải nhanh hơn không). Ý bạn Hai_1410 là Move một số đối tượng nhưng trong số đó có chọn nhầm vài đối tượng không cần Move.

Chào nataca, vâng, 1 số đối tượng không cần move và nó lỡ bị move rồi, bây giờ dùng lisp của Thiep sẽ đưa nó về vị trí cũ. Vẫn đúng với nhiều đối tượng vừa bị move chứ nataca?

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
Chào Hai_1410 và Tue_nv, nói là bó tay, nhưng mình vẫn suy nghĩ để giải quyết bài toán này. Và qua 1 đêm ngủ chập chờn, sáng nay mình viết 1 đoạn lisp này đây:

(defun dxf (id en) (cdr (assoc id (entget en))))
(defun c:unmove (/ en1 p1 en2 p2 en)
 (setq en1 (entlast)
p1 (dxf 10 en1))
 (command "undo" 1)
 (setq en2 (entlast)
p2 (dxf 10 en2))
 (command "redo")
 (while (setq en (car (entsel "\nPick a obj to undo move: ")))
   (command "move" en "" p1 p2)
 )
 (princ)
 )

Cảm ơn anh Thiệp đã nhiệt tình giúp đỡ, em đã dùng thử qua và thấy lisp anh viết đã gần như là đạt được mong muốn, tuy nhiên nếu có thể thì anh có thể fix lại những đặc điểm này giúp em được không ạ:

- Sau khi dùng lệnh Move, nếu như mình dùng chế độ zoom bản vẽ hoặc ấn phím ESC (Cancel) thì sau đó lệnh Unmove của lisp không còn tác dụng.

- Mỗi lần move chỉ được 1 đối tượng, có cách nào có thể select nhiều Object để unmove thì hay quá.

Nhờ các anh xem giúp, em xin cảm ơn :bigsmile:

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
Chào nataca, vâng, 1 số đối tượng không cần move và nó lỡ bị move rồi, bây giờ dùng lisp của Thiep sẽ đưa nó về vị trí cũ. Vẫn đúng với nhiều đối tượng vừa bị move chứ nataca?

Uhm đúng rồi. Mình nhầm :bigsmile: . Cái này tận dụng phương của một đối tượng trong nhóm đối tượng làm chuẩn vì nhóm đối tượng cùng bị move với 1 vector. Ah, Thiep chú ý khi Move thì ename của đối tượng không bị đổ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


×