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  
xaydung

Lệnh slide với cách chọn mặt phẳng khác!!

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

xaydung    12

Thông thường em hay dùng lệnh slide để tách khối solid bằng cách nhập 3 điểm để tạo nên 1 mặt phẳng cắt!

tuy nhiên em muốn có 1 cách chọn khác như sau:

Chạy lisp hỏi chọn 2 line, 2 line này giao nhau trên mặt 2D (có thể là 2 line trong không gian nhưng phải giao nhau tại 1 điểm) , lisp sẽ tính toán được 3 điểm : 2 điểm trên đường phân giác của góc giữa 2 đường thẳng đó và điểm thứ 3 là 1 điểm nằm phía trên đường phân giác đó. 3 điểm này sẽ tạo ra 1 mặt phẳng gọi là mặt phẳng phân giác của góc tạo bởi 2 đưòng thẳng (nghe có vẻ toán học quá, hi hi). Và chính là 3 điểm mà lệnh slide cần nhập, với mã lệnh là sl2. Mong các bác cao thủ lisp giúp em . thanks!!

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
vndesperados    253
Thông thường em hay dùng lệnh slide để tách khối solid bằng cách nhập 3 điểm để tạo nên 1 mặt phẳng cắt!

tuy nhiên em muốn có 1 cách chọn khác như sau:

Chạy lisp hỏi chọn 2 line, 2 line này giao nhau trên mặt 2D (có thể là 2 line trong không gian nhưng phải giao nhau tại 1 điểm) , lisp sẽ tính toán được 3 điểm : 2 điểm trên đường phân giác của góc giữa 2 đường thẳng đó và điểm thứ 3 là 1 điểm nằm phía trên đường phân giác đó. 3 điểm này sẽ tạo ra 1 mặt phẳng gọi là mặt phẳng phân giác của góc tạo bởi 2 đưòng thẳng (nghe có vẻ toán học quá, hi hi). Và chính là 3 điểm mà lệnh slide cần nhập, với mã lệnh là sl2. Mong các bác cao thủ lisp giúp em . thanks!!

 

 

Ba điểm này thẳng hàng, làm sao tạo mặt phẳng đượ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
xaydung    12
Ba điểm này thẳng hàng, làm sao tạo mặt phẳng được

Bác chưa hiểu ý em rùi, "nằm trên" ở đây không phải là thuộc đường phân giác mà là có thêm toạ độ z khác 0 , còn nằm trên theo ý hiểu của bác là thuộc đường thẳ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
ssg    1.088
Thông thường em hay dùng lệnh slide để tách khối solid bằng cách nhập 3 điểm để tạo nên 1 mặt phẳng cắt!

tuy nhiên em muốn có 1 cách chọn khác như sau:

Chạy lisp hỏi chọn 2 line, 2 line này giao nhau trên mặt 2D (có thể là 2 line trong không gian nhưng phải giao nhau tại 1 điểm) , lisp sẽ tính toán được 3 điểm : 2 điểm trên đường phân giác của góc giữa 2 đường thẳng đó và điểm thứ 3 là 1 điểm nằm phía trên đường phân giác đó. 3 điểm này sẽ tạo ra 1 mặt phẳng gọi là mặt phẳng phân giác của góc tạo bởi 2 đưòng thẳng (nghe có vẻ toán học quá, hi hi). Và chính là 3 điểm mà lệnh slide cần nhập, với mã lệnh là sl2. Mong các bác cao thủ lisp giúp em . thanks!!

Chương trình sau đúng như ý bạn:

;;;------------------------------------------------------------
(defun inter2L(e1 e2 / d1 d2 p1 p2 p3 p4) ;;;Intersect 2 lines
(setq
   d1 (entget e1)
   d2 (entget e2)
   p1 (cdr (assoc 10 d1))
   p2 (cdr (assoc 11 d1))
   p3 (cdr (assoc 10 d2))
   p4 (cdr (assoc 11 d2))
)
(inters p1 p2 p3 p4)
)
;;;------------------------------------------------------------
(defun C:SL2( / ss es1 e1 es2 e2 pp1 pp2 p01 p02 p a1 a2 a p1 p2)
;;;Odd slice command!
(vl-load-com)
(setq oldos (getvar "osmode"))
(setvar "osmode" 0)
(prompt "\nSelect 3D solid...")
(while (not (setq ss (ssget '((0 . "3DSOLID")))))
   (if (not ss) (prompt "\n3DSolid not found!"))
)
(setq
   es1 (entsel "\nSelect base line 1:")
   e1 (car es1)
)
(redraw e1 3)
(setq
   es2 (entsel "\nSelect base line 2:")
   e2 (car es2)
)
(redraw e2 3)
(setq
   pp1 (cadr es1)
   pp2 (cadr es2)
   p01 (vlax-curve-getClosestPointTo e1 pp1)
   p02 (vlax-curve-getClosestPointTo e2 pp2)
   p (inter2L e1 e2)
   a1 (angle p p01)
   a2 (angle p p02)
   a (/ (+ a1 a2) 2)
   p1 (polar p a 100)
   p2 (list (car p) (cadr p) (+ (caddr p) 100))
)
(command "slice" ss "" "3" p p1 p2 "b")
(redraw e1 4)
(redraw e2 4)
(setvar "osmode" oldos)
)
;;;------------------------------------------------------------

 

Tuy nhiên, mình có 1 yêu cầu: bạn có thể giải thích tại sao phải dùng kiểu slice "khác người" này không? Ví dụ cụ thể để thấy rõ hiệu quả sử dụng của chương trình?

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
xaydung    12
Chương trình sau đúng như ý bạn:

;;;------------------------------------------------------------
(defun inter2L(e1 e2 / d1 d2 p1 p2 p3 p4) ;;;Intersect 2 lines
(setq
   d1 (entget e1)
   d2 (entget e2)
   p1 (cdr (assoc 10 d1))
   p2 (cdr (assoc 11 d1))
   p3 (cdr (assoc 10 d2))
   p4 (cdr (assoc 11 d2))
)
(inters p1 p2 p3 p4)
)
;;;------------------------------------------------------------
(defun C:SL2( / ss es1 e1 es2 e2 pp1 pp2 p01 p02 p a1 a2 a p1 p2)
;;;Odd slice command!
(vl-load-com)
(setq oldos (getvar "osmode"))
(setvar "osmode" 0)
(prompt "\nSelect 3D solid...")
(while (not (setq ss (ssget '((0 . "3DSOLID")))))
   (if (not ss) (prompt "\n3DSolid not found!"))
)
(setq
   es1 (entsel "\nSelect base line 1:")
   e1 (car es1)
)
(redraw e1 3)
(setq
   es2 (entsel "\nSelect base line 2:")
   e2 (car es2)
)
(redraw e2 3)
(setq
   pp1 (cadr es1)
   pp2 (cadr es2)
   p01 (vlax-curve-getClosestPointTo e1 pp1)
   p02 (vlax-curve-getClosestPointTo e2 pp2)
   p (inter2L e1 e2)
   a1 (angle p p01)
   a2 (angle p p02)
   a (/ (+ a1 a2) 2)
   p1 (polar p a 100)
   p2 (list (car p) (cadr p) (+ (caddr p) 100))
)
(command "slice" ss "" "3" p p1 p2 "b")
(redraw e1 4)
(redraw e2 4)
(setvar "osmode" oldos)
)
;;;------------------------------------------------------------

HAyquá, thanks bác ssg ,Lisp hoàn toàn đúng với ý đồ của em, tuy nhiên với line trong không gian thì không chính xác bác à,

mắt phẳng cắt luôn vuông góc với mặt xoy thì chưa chính xác khi line ở trong không gian, lẽ ra mf cắt trong trường hợp này phải nghiêng đi 1 góc x thì mới đúng logic hình học, mong bác giúp đỡ thê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
be_chanh    890

bác ssg đã nói rất rõ rồi, xaydung hãy trả lời câu hỏi của bác ssg trước nhé. Tại sao bác ssg lại hỏi lại vì mọi người như nguyenhoanh hay ssg đều suy nghĩ vấn đề theo logic thôi, khi thấy 1 lisp mà phục vu được ít người (cực ít)(không đúng với logic thông thường) thì các bác ấy không muốn viết đâ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
ssg    1.088
HAyquá, thanks bác ssg ,Lisp hoàn toàn đúng với ý đồ của em, tuy nhiên với line trong không gian thì không chính xác bác à,

mắt phẳng cắt luôn vuông góc với mặt xoy thì chưa chính xác khi line ở trong không gian, lẽ ra mf cắt trong trường hợp này phải nghiêng đi 1 góc x thì mới đúng logic hình học, mong bác giúp đỡ thêm!!

Lần này chắc hoàn toàn đúng với ý đồ của bạn:

 

;;;------------------------------------------------------------
(defun inter2L(e1 e2 / d1 d2) ;;;Intersect 2 lines
(setq d1 (entget e1) d2 (entget e2))
(inters (cdr (assoc 10 d1)) (cdr (assoc 11 d1))
          (cdr (assoc 10 d2)) (cdr (assoc 11 d2))
)
)
;;;------------------------------------------------------------
(defun C:SL2( / oldos ss p01 e1 p02 e2 p a1 a2 a p1 p2)
;;;Slice 3DSolid by bisectional plane
(vl-load-com)
(setq oldos (getvar "osmode"))
(setvar "osmode" 0)
(prompt "\nSelect 3D solid...")
(while (not (setq ss (ssget '((0 . "3DSOLID")))))
   (if (not ss) (prompt "\n3DSolid not found!"))
)
(setvar "osmode" 512)
(setq p nil)
(while (not p)
   (setq
       p01 (getpoint "\nSelect line 1:")
      e1 (ssname (ssget "c" p01 p01'((0 . "LINE"))) 0) 
   )
   (redraw e1 3)
   (setq
       p02 (getpoint "\nSelect line 2:")
       e2 (ssname (ssget "c" p02 p02 '((0 . "LINE"))) 0) 
   )
   (redraw e2 3)
   (if (and e1 e2) (setq p (inter2L e1 e2)))
   (if (not p) (alert "Intersection not found. Select again!"))
   (command "regen")
)
(command "ucs" "n" "3" p01 p p02)
(setq
   p (trans p 0 1)
   p01 (trans p01 0 1)
   p02 (trans p02 0 1)
   a (/ (+ (angle p p01) (angle p p02)) 2)
   p1 (polar p a 100)
   p2 (list (car p) (cadr p) (+ (caddr p) 100))
)
(setvar "osmode" 0)
(command "slice" ss "" "3" p p1 p2 "b")
(command "ucs" "p")
(setvar "osmode" oldos)
(princ)
)
;;;------------------------------------------------------------

 

Nhưng bạn vẫn còn nợ mình 1 câu trả lờ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

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

×