Chuyển đến nội dung
Diễn đàn CADViet
  • Thông báo

    • Nguyen Hoanh

      CADViet đã hoàn tất nâng cấp   14/09/2017

      Chào các bạn, CADViet đã hoàn tất việc nâng cấp lên phiên bản mới. Tất cả các chức năng đã hoạt động theo kỳ vọng của ban quản trị. Nếu có vấn đề gì cần phản hồi, các bản post ở đây nhé: Trân trọng, Nguyễn Hoành.
Đăng nhập để thực hiện theo  
dragontalon0802

[Nhờ viết lisp] mirror qua 2 đường thẳng song song!

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

cad2.png

Như hình trên, mình muốn vẽ cửa đối xứng qua 2 đường thẳng màu đỏ thì phải vẽ thêm đường phụ rồi mirror qua trung điểm của đường ấy. Như vậy khá bất tiện vì cái này mình sử dụng nhiều. Nhờ bro nào viết giúp mình. Thanks :rolleyes:

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

cad2.png

Như hình trên, mình muốn vẽ cửa đối xứng qua 2 đường thẳng màu đỏ thì phải vẽ thêm đường phụ rồi mirror qua trung điểm của đường ấy. Như vậy khá bất tiện vì cái này mình sử dụng nhiều. Nhờ bro nào viết giúp mình. Thanks :rolleyes:

Bạn dùng cái này xem:

(defun C:M2L()
(vl-load-com) (if (not cal) (arxload "geomcal"))
(prompt "\nChon cac doi tuong can Mirror: ")
(setq ss (ssget))
(setq l1 (entsel "\nChon duong Line thu 1: "))
(setq l2 (entsel "\nChon duong Line thu 2: "))
(setq p1d (cdr (assoc 10 (entget (car l1)))))
(setq p1c (cdr (assoc 11 (entget (car l1)))))
(setq p2d (cdr (assoc 10 (entget (car l2)))))
(setq p2c (cdr (assoc 11 (entget (car l2)))))
(setq p3d (cal "plt(p1d,p2d,0.5)"))
(setq p3c (cal "plt(p1c,p2c,0.5)"))
(initget "Y N") (setq xoa (getkword "\nXoa doi tuong cu <NO>: "))
(if (or (= xoa "N") (not xoa))
 (command ".mirror" ss "" p3d p3c "N")
 (command ".mirror" ss "" p3d p3c "Y")))

  • 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

Dùng lệnh MIRORR bình thường khi đến đoạn chọn trục đối xứng hold Shift + click phải chuột chọn Miđle between two point chọn 2 điểm đầu của đường đỏ, phần tiếp theo bạn tự làm tiếp nha. viết lisp chi cho mất công

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 dùng cái này xem:

(defun C:M2L()

(vl-load-com) (if (not cal) (arxload "geomcal"))

(prompt "\nChon cac doi tuong can Mirror: ")

(setq ss (ssget))

(setq l1 (entsel "\nChon duong Line thu 1: "))

(setq l2 (entsel "\nChon duong Line thu 2: "))

(setq p1d (cdr (assoc 10 (entget (car l1)))))

(setq p1c (cdr (assoc 11 (entget (car l1)))))

(setq p2d (cdr (assoc 10 (entget (car l2)))))

(setq p2c (cdr (assoc 11 (entget (car l2)))))

(setq p3d (cal "plt(p1d,p2d,0.5)"))

(setq p3c (cal "plt(p1c,p2c,0.5)"))

(initget "Y N") (setq xoa (getkword "\nXoa doi tuong cu <NO>: "))

(if (or (= xoa "N") (not xoa))

(command ".mirror" ss "" p3d p3c "N")

(command ".mirror" ss "" p3d p3c "Y")))

Cảm ơn bạn. Lisp dùng tốt lắ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

Dùng lệnh MIRORR bình thường khi đến đoạn chọn trục đối xứng hold Shift + click phải chuột chọn Miđle between two point chọn 2 điểm đầu của đường đỏ, phần tiếp theo bạn tự làm tiếp nha. viết lisp chi cho mất công

Do mình dùng cái này khá nhiều nên thích dùng lisp hơn bạn à. Thanks bạ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

Bạn dùng cái này xem:

(defun C:M2L()

(vl-load-com) (if (not cal) (arxload "geomcal"))

(prompt "\nChon cac doi tuong can Mirror: ")

(setq ss (ssget))

(setq l1 (entsel "\nChon duong Line thu 1: "))

(setq l2 (entsel "\nChon duong Line thu 2: "))

(setq p1d (cdr (assoc 10 (entget (car l1)))))

(setq p1c (cdr (assoc 11 (entget (car l1)))))

(setq p2d (cdr (assoc 10 (entget (car l2)))))

(setq p2c (cdr (assoc 11 (entget (car l2)))))

(setq p3d (cal "plt(p1d,p2d,0.5)"))

(setq p3c (cal "plt(p1c,p2c,0.5)"))

(initget "Y N") (setq xoa (getkword "\nXoa doi tuong cu <NO>: "))

(if (or (= xoa "N") (not xoa))

(command ".mirror" ss "" p3d p3c "N")

(command ".mirror" ss "" p3d p3c "Y")))

Thanks bạn. Giờ mình mới biết Expression PLT :">

P/S :

- Bạn có thể đổi việc kích chọn 2 Line thành 1 thao tác quét chọn 2Line thì thao tác của User sẽ nhanh hơn.

- Mình rất thích cách viết tường minh như của bạn, sẽ dễ dàng hơn để sửa và người khác theo dõi cũng dễ. Việc tinh chỉnh thì có thể để sau, chủ yếu xét tính hiệu dụng trước ^^

-

(initget "Y N") (setq xoa (getkword "\nXoa doi tuong cu <NO>: "))

(if (or (= xoa "N") (not xoa))

(command ".mirror" ss "" p3d p3c "N")

(command ".mirror" ss "" p3d p3c "Y"))

Đoạn này của bạn nên thay bằng

(command ".mirror" ss "" p3d p3c pause)

Vì Y, N thuộc trong bước thao tác của lệnh Mirror, nên ta lợi dụng nó cho tiện hè ^^

  • 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

Thanks bạn. Giờ mình mới biết Expression PLT :">

P/S :

- Bạn có thể đổi việc kích chọn 2 Line thành 1 thao tác quét chọn 2Line thì thao tác của User sẽ nhanh hơn.

- Mình rất thích cách viết tường minh như của bạn, sẽ dễ dàng hơn để sửa và người khác theo dõi cũng dễ. Việc tinh chỉnh thì có thể để sau, chủ yếu xét tính hiệu dụng trước ^^

-

Đoạn này của bạn nên thay bằng

 

Vì Y, N thuộc trong bước thao tác của lệnh Mirror, nên ta lợi dụng nó cho tiện hè ^^

Thanks tất cả góp ý của Bác ^^. Riêng quét 1 lúc 2 line thì hay cái này nhưng có khi cũng chưa hay

ở cái khác. VD: có 1 line nằm giữa 2 line thì lại phải sửa code. Chúc Bác vui

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

Hề hề, can chi đâu, vì yêu cầu của chủ topic là 2 Line đó song song, nên ta chỉ cần lấy thằng ssname 0 và ssname cuối cùng, muốn bao nhiêu Line thì kệ hắn. Cũng có thể là nhanh hơn chăng ^^. Dù sao đó cũng là tiểu tiết. Chúc bạn ngày càng giúp đỡ được nhiều người hơ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

Hề hề, can chi đâu, vì yêu cầu của chủ topic là 2 Line đó song song, nên ta chỉ cần lấy thằng ssname 0 và ssname cuối cùng, muốn bao nhiêu Line thì kệ hắn. Cũng có thể là nhanh hơn chăng ^^. Dù sao đó cũng là tiểu tiết. Chúc bạn ngày càng giúp đỡ được nhiều người hơn :)

ssname 0 và ssname cuối cùng có thể không tính ra trung đ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

(setq p3d (cal "plt(p1d,p2d,0.5)"))

Cái này hay đây, nó còn những lựa chọn nào để tính toán nữa không hả bạ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

Cái này hay đây, nó còn những lựa chọn nào để tính toán nữa không hả bạn?

Trong CAD help ý bác ạ, còn kha khá ^^

  • 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ái này hay đây, nó còn những lựa chọn nào để tính toán nữa không hả bạn?

Cái này tổng quát là (cal "plt(p1,p2,k)"). Tiếc là Bác chưa sử dụng mấy thứ này, nó rất hữu hiệu, ngắn gọn.

Còn rất nhiều công thức CAL nữa Bác ạ, trong Help có hết, hay ra phết.

  • 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

Anh Ketxu cho em hỏi là: Em add lisp của anh vào nhưng cũng có những trường hợp em muốn giữ lại đối tượng vừa Mirror thì em phải làm thế nà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ạn dùng cái này xem:

(defun C:M2L()
(vl-load-com) (if (not cal) (arxload "geomcal"))
(prompt "\nChon cac doi tuong can Mirror: ")
(setq ss (ssget))
(setq l1 (entsel "\nChon duong Line thu 1: "))
(setq l2 (entsel "\nChon duong Line thu 2: "))
(setq p1d (cdr (assoc 10 (entget (car l1)))))
(setq p1c (cdr (assoc 11 (entget (car l1)))))
(setq p2d (cdr (assoc 10 (entget (car l2)))))
(setq p2c (cdr (assoc 11 (entget (car l2)))))
(setq p3d (cal "plt(p1d,p2d,0.5)"))
(setq p3c (cal "plt(p1c,p2c,0.5)"))
(initget "Y N") (setq xoa (getkword "\nXoa doi tuong cu <NO>: "))
(if (or (= xoa "N") (not xoa))
  (command ".mirror" ss "" p3d p3c "N")
  (command ".mirror" ss "" p3d p3c "Y")))

Bạn chưa xét trường hợp 2 line // nhưng ngược chiều nhau, khi đó p3c và p3d trùng nhau.

Nếu 2 line // thì không cần p2c

(setq p3c (cal "plt(p1c,p2d,0.5)"))

  • 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

@@ Bạn dùng lệnh bình thường đi

Nhưng em dùng lệnh bình thường thì cad lại hiểu là đang dùng lệnh lisp, vì cái lisp anh đưa ra cũng là "mi" nên nó trùng với lệnh trong cad. Anh có thể sửa tên lệnh lisp thành "mii" giúp em được không ạ!

  • Vote giảm 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

Bạn tự bật file lên và sửa chữ mi đằng sau chữ c: thành chữ gì bạn muốn, nó là 1 file text thô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

Bạn tự bật file lên và sửa chữ mi đằng sau chữ c: thành chữ gì bạn muốn, nó là 1 file text thôi mà

Em làm được trên cad 2007 nhưng em làm tương tự với cad 2010 thì chưa được. Cảm ơn anh!

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

Đăng nhập để thực hiện theo  

×