Đến nội dung


Hình ảnh
- - - - -

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


  • Please log in to reply
41 replies to this topic

#1 hai_1401

hai_1401

    biết lệnh rotate

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

Đã gửi 04 October 2009 - 10:16 PM

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:
  • 0

#2 gerberavn

gerberavn

    Chưa sử dụng CAD

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

Đã gửi 05 October 2009 - 02:04 PM

sao bạn ko sự dụng lệnh undo
  • 0

#3 hai_1401

hai_1401

    biết lệnh rotate

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

Đã gửi 05 October 2009 - 09:04 PM

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:
  • 0

#4 Tue_NV

Tue_NV

    KS Võ Quang Tuệ

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

Đã gửi 05 October 2009 - 10:44 PM

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

  • 2

#5 nataca

nataca

    biết lệnh adcenter

  • Members
  • PipPipPipPipPipPipPip
  • 712 Bài viết
Điểm đánh giá: 553 (tốt)

Đã gửi 05 October 2009 - 11:06 PM

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

#6 hai_1401

hai_1401

    biết lệnh rotate

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

Đã gửi 05 October 2009 - 11:14 PM

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:
  • 0

#7 hai_1401

hai_1401

    biết lệnh rotate

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

Đã gửi 05 October 2009 - 11:22 PM

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:
  • 0

#8 nataca

nataca

    biết lệnh adcenter

  • Members
  • PipPipPipPipPipPipPip
  • 712 Bài viết
Điểm đánh giá: 553 (tốt)

Đã gửi 05 October 2009 - 11:36 PM

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

  • 2

#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 06 October 2009 - 08:09 AM

(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
  • 0

#10 nataca

nataca

    biết lệnh adcenter

  • Members
  • PipPipPipPipPipPipPip
  • 712 Bài viết
Điểm đánh giá: 553 (tốt)

Đã gửi 06 October 2009 - 08:23 AM

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

#11 hai_1401

hai_1401

    biết lệnh rotate

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

Đã gửi 06 October 2009 - 10:34 AM

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:
  • 0

#12 nataca

nataca

    biết lệnh adcenter

  • Members
  • PipPipPipPipPipPipPip
  • 712 Bài viết
Điểm đánh giá: 553 (tốt)

Đã gửi 06 October 2009 - 10:58 AM

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

#13 hai_1401

hai_1401

    biết lệnh rotate

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

Đã gửi 06 October 2009 - 12:34 PM

(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 ạ?
  • 0

#14 Tue_NV

Tue_NV

    KS Võ Quang Tuệ

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

Đã gửi 06 October 2009 - 03:33 PM

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

#15 hai_1401

hai_1401

    biết lệnh rotate

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

Đã gửi 06 October 2009 - 06:25 PM

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:
  • 0

#16 hai_1401

hai_1401

    biết lệnh rotate

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

Đã gửi 08 October 2009 - 01:40 AM

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?
  • 0

#17 thiep

thiep

    biết dimbaseline

  • Members
  • PipPipPipPipPip
  • 369 Bài viết
Điểm đánh giá: 260 (khá)

Đã gửi 09 October 2009 - 09:17 AM

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 !!!
  • 1

#18 Tue_NV

Tue_NV

    KS Võ Quang Tuệ

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

Đã gửi 09 October 2009 - 02:42 PM

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 http://www.codecogs....errightarrow{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 -http://www.codecogs.com/eq.latex?\overrightarrow{v} : có độ dài bằng vecto dời http://www.codecogs....errightarrow{v}, nhưng ngược chiều với http://www.codecogs....rrightarrow{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?


  • 1

#19 thiep

thiep

    biết dimbaseline

  • Members
  • PipPipPipPipPip
  • 369 Bài viết
Điểm đánh giá: 260 (khá)

Đã gửi 09 October 2009 - 03:58 PM

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 http://www.codecogs....errightarrow{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 -http://www.codecogs.com/eq.latex?\overrightarrow{v} : có độ dài bằng vecto dời http://www.codecogs....errightarrow{v}, nhưng ngược chiều với http://www.codecogs....rrightarrow{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
  • 1

#20 hai_1401

hai_1401

    biết lệnh rotate

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

Đã gửi 09 October 2009 - 05:30 PM

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:
  • 0