Đến nội dung


Hình ảnh
- - - - -

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


  • Please log in to reply
6 replies to this topic

#1 xaydung

xaydung

    biết lệnh trim

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

Đã gửi 22 December 2007 - 05:50 PM

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

#2 vndesperados

vndesperados

    biết lệnh xref

  • Members
  • PipPipPipPipPipPipPip
  • 547 Bài viết
Điểm đánh giá: 253 (khá)

Đã gửi 31 December 2007 - 05:56 PM

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

#3 xaydung

xaydung

    biết lệnh trim

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

Đã gửi 01 January 2008 - 01:18 AM

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

#4 ssg

ssg

    biết lệnh adcenter

  • Vip
  • PipPipPipPipPipPipPip
  • 1228 Bài viết
Điểm đánh giá: 1087 (rất tốt)

Đã gửi 03 January 2008 - 04:00 PM

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

#5 xaydung

xaydung

    biết lệnh trim

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

Đã gửi 03 January 2008 - 10:34 PM

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

#6 be_chanh

be_chanh

    biết lệnh adcenter

  • Moderator
  • PipPipPipPipPipPipPip
  • 1712 Bài viết
Điểm đánh giá: 889 (rất tốt)

Đã gửi 03 January 2008 - 10:53 PM

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

t: 097.323.1199 | m: cudstk@gmail.com | w: http://www.aicollect.com


#7 ssg

ssg

    biết lệnh adcenter

  • Vip
  • PipPipPipPipPipPipPip
  • 1228 Bài viết
Điểm đánh giá: 1087 (rất tốt)

Đã gửi 04 January 2008 - 02:19 PM

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