Chuyển đến nội dung
Diễn đàn CADViet
Đăng nhập để thực hiện theo  
avi612

[Hỏi] Tính độ dài cung tròn và Spline

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

Mình đang thử viết 1 lisp tính độ dài của các đối tượng riêng biệt như line, pline, arc, và spline.

Về phần các đối tượng là line và pline thì mình tính được rồi còn 2 đối tượng nữa là arc (cung tròn) và spline nữa nhưng mình ko biết cách tính và lập hàm như thế nào.

Ai biết giúp mình cấu trúc của hàm tính đó ntn nhá....Tks

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

Chiều dài của 1 curve bất kỳ: line, pline, arc, ellipse, circle, spline:

(setq LEN (vlax-curve-getDistAtParam ename (vlax-curve-getEndParam ename)))

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à! cũng khó đây...Tại mình chưa thạo lắm về thể loại "lisp vla..." này nên vận dụng cũng chưa tốt lắm.

Dưới đây là đoạn lisp mình đã thử làm..nhưng sai cấu trúc...pác xem lại giùm e nó sai ở đâu với...

 

Àh! cho mình hỏi thêm luôn là ngoài dùng những hàm lisp "vla.." này thì mình còn có thể làm cách khác được không, ví như những hàm đơn giãn hơn..

 

(defun c:ttt(/ #sset #Bacc i #tong #tong1 #ssname #ename #dau #cuoi #ent #dis #point)
 (vl-load-com)
 (setvar "CMDECHO" 0)
 (command ".undo" "BE")
 (command ".UCS" "W" ^C^C)
 (Prompt "\n- Ch\U+1ECDn \U+0111o\U+1EA1n th\U+1EB3ng c\U+1EA7n tính t\U+1ED5ng: ")
 (setq #sset (ssget ":N" '((0 . "*LINE,PLINE,ARC,ELLIPSE"))))
 (setq #Bacc (getint "\n- Nh\U+1EADp s\U+1ED1 l\U+1EBB: "))
 (if (null #Bacc) (setq #Bacc 2))
 (setq i 0)
 (setq #tong 0)
 (while
(setq #ssname (ssname #sset i))
(setq #ename (cdr (assoc 0 (entget #ssname))))
(setq #dis (vlax-curve-getDistAtParam #ename (vlax-curve-getEndParam #ename)))          
(setq #tong (+ #tong #dis))
(setq i (1+ i))
 );WHILE
 (setq #tong1 (rtos #tong 2 #Bacc))
 (setq #point (getpoint "\n- Ch\U+1ECDn \U+0111i\U+1EC3m chèn k\U+1EBFt qu\U+1EA3: "))
 (command ".text" "J" "MC" #point 1.7 0 #tong1)
 (command ".undo" "E")
 (princ)
 (princ)
)

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:ttt(/ #sset #Bacc i #tong #tong1 #ssname #ename #dau #cuoi #ent #dis #point)
 (vl-load-com)  (setvar "CMDECHO" 0)  (command ".undo" "BE")
;  (command ".UCS" "W" ^C^C) ;sai
 (command ".UCS" "W"
 (Prompt "\n- Ch\U+1ECDn \U+0111o\U+1EA1n th\U+1EB3ng c\U+1EA7n tính t\U+1ED5ng: ")
 (setq #sset (ssget ":N" '((0 . "*LINE,PLINE,ARC,ELLIPSE")))) ;thua PLINE
 (setq #Bacc (getint "\n- Nh\U+1EADp s\U+1ED1 l\U+1EBB: "))
 (if (null #Bacc) (setq #Bacc 2))
 (setq i 0)
 (setq #tong 0)
 (while
; (setq #ssname (ssname #sset i))
(setq #ename (ssname #sset i))
; (setq #ename (cdr (assoc 0 (entget #ssname)))) ;khong phai ename
(setq #dis (vlax-curve-getDistAtParam #ename (vlax-curve-getEndParam #ename)))          
(setq #tong (+ #tong #dis))
(setq i (1+ i))  );WHILE
 (setq #tong1 (rtos #tong 2 #Bacc))
 (setq #point (getpoint "\n- Ch\U+1ECDn \U+0111i\U+1EC3m chèn k\U+1EBFt qu\U+1EA3: "))
 (command ".text" "J" "MC" #point 1.7 0 #tong1)
 (command ".undo" "E")
 (princ)
 (princ)
)

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

Vla trong trường hợp này đơn giản nhất bạn ạ. Nếu bạn muốn tính cung tròn thì phải sử dụng các công thức tính hình học + lượng giác, spline thì tích phân v..v.. Sẽ khó hơn nhiề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

Uh, mình cũng đã thử dùng công thức tính hình học thử thì nó ra một đống lằng nhằng....nhìn ghê quá thôi thì cứ dùng cái vla này đi đã...cũng ko khó vận dụng mấy...

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  

×