Chuyển đến nội dung
Diễn đàn CADViet
Song Nhi

[yêu cầu] LISP xuất lần lược các góc của tuyến

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

Các anh chị giúp em viết LISP với nội dung này với:
118347_untitled.jpg
Có sẵn một đường ziczac gồm nhiều line nối nhau thành một tuyến liên tục và hở. LISP xuất ra lần lược các góc giữa các line (radian) của tuyến đó, tại các vị trí line giao với đối tượng khác (như arc hay elip ...) thì bỏ qua, chỉ xuất các góc giữa 2 line liên tục.
Similar topics from web:
Lisp tính diện tích một hình khép kín
Download Phần mềm thống kê cốt thép TIP
Diễn đàn của các kỹ sư kết cấu Việt Nam
Ngôn ngữ AutoLISP
Lisp sử dụng trong cad?
Diễn đàn CADViet
Lisp thống kê thép?
Tổng hợp cách cài đặt và sử dụng NOVA [Lưu Trữ ...
Lập trình
Học CAD cùng Hanoigio [Lưu Trữ]
Học AutoCad
Đăng ký website vào danh bạ
Phân lớp đất đắp trong thi công đường!
Cần lisp vẽ mc ngang, dọc của dầm, móng
Phần mềm trợ giúp trong Autocad [Lưu Trữ]

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

Theo tôi bạn nên vẽ tuyến đó bằng PLINE (hoặc dùng Lisp nối các Line rời rạc đó thành PLINE) rồi dùng Lisp dưới đây.

http://www.cadviet.com/upfiles/3/71162_lisp_thong_ke_goc_cua_pline.lsp

;==========LISP THONG KE GOC CUA PLINE==========
;=============KANGKUNG 18/04/2013===============
(defun C:Goc ( / i plsel pldata verts bend)
  (vl-load-com)
  (setq bendlist(list))
  (while (not (setq plsel (ssget '((0 . "LWPOLYLINE,POLYLINE"))))))
  (setq pldata (entget (ssname plsel 0)) verts (mapcar 'cdr (vl-remove-if-not '(lambda (x) (= (car x) 10)) pldata)))
  (setq i 1)
  (while (> (length verts) 2)
    (setq ang1 (angle (car verts) (cadr verts)) ang2 (angle (cadr verts) (caddr verts))
	  bend (if (> (abs (- ang2 ang1)) pi)
		 (+ (min ang1 ang2) (- (* pi 2) (max ang1 ang2)))
		 (abs (- ang2 ang1)))
	  bendlist (append bendlist (list (strcat "\nGoc " (itoa i) ": " (rtos (- pi bend)))))
	  verts (cdr verts)
	  i(1+ i))
    )
  (foreach x bendlist (princ (strcat x " ")))
  (princ)
)
(princ "\n              KangKung - 18/04/2013\n")
(princ "\n           Nhap GOC de chay chuong trinh\n")
  • 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

Chân thành cám ơn bác KangKung đã giúp em! Cho em được đòi hỏi thêm chút xíu nữa nhen.

 

Bác lồng thêm vào phần đầu: sau khi chọn một số line, nó sẽ chuyển nhóm line đó thành pline trước khi thao tác, sau đó, khi thao tác xong rồi, lại explode pline đó trả ra lại thành các line thành phần như lúc đầu.

 

Ngoài ra, không biết điều em sắp đòi hỏi tiếp theo có quá đáng lắm không nữa, giả định chưa biết trước là Pline có bao nhiêu đoạn line thành phần cấu thành, đặt là n. Sau khi LISP chạy xong sẽ gán cho các biến a1 = giá trị góc thứ nhất; a2 = giá trị góc thứ hai; ...; an = giá trị góc thứ n. Em tính lấy hàm này làm một hàm con, từ các giá trị góc xuất ra, em tính toán một giá trị khác.

 

Chân thành cám ơn các bác đã quan tâm đến vấn đề của em!

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

1. Bác lồng thêm vào phần đầu: sau khi chọn một số line, nó sẽ chuyển nhóm line đó thành pline trước khi thao tác, sau đó, khi thao tác xong rồi, lại explode pline đó trả ra lại thành các line thành phần như lúc đầu.

 

2. Ngoài ra, không biết điều em sắp đòi hỏi tiếp theo có quá đáng lắm không nữa, giả định chưa biết trước là Pline có bao nhiêu đoạn line thành phần cấu thành, đặt là n. Sau khi LISP chạy xong sẽ gán cho các biến a1 = giá trị góc thứ nhất; a2 = giá trị góc thứ hai; ...; an = giá trị góc thứ n. Em tính lấy hàm này làm một hàm con, từ các giá trị góc xuất ra, em tính toán một giá trị khác.

1. Đã sửa theo ý bạn. Sau khi chọn Lisp sẽ nối các Line thành PLine và phá vỡ khi chạy xong.

2. Sau khi chạy xong thì toàn bộ giá trị góc được lưu trong danh sách bendlist, bạn cần giá trị nào chỉ việc gọi ra thôi. Ví dụ:

a1 = (nth 0 bendlist) 

a2 = (nth 1 bendlist)

a3 = (nth 2 bendlist)

...................................

an = (nth (- n 1) bendlist)

http://www.cadviet.com/upfiles/3/71162_lisp_thong_ke_goc_cua_pline_rev1.lsp

;==========LISP THONG KE GOC CUA PLINE==========
;=============KANGKUNG 18/04/2013===============
(defun C:Goc ( / i plsel pldata verts bend taphop )
  (vl-load-com)
  (setq taphop (ssget '((0 . "LINE"))))
  (command "PEDIT" (ssname taphop 0) "Y" "J" taphop "" "")
  (setq plsel (entlast) bendlist(list))
  (setq pldata (entget plsel) verts (mapcar 'cdr (vl-remove-if-not '(lambda (x) (= (car x) 10)) pldata)))
  (setq i 1)
  (while (> (length verts) 2)
    (setq ang1 (angle (car verts) (cadr verts)) ang2 (angle (cadr verts) (caddr verts))
	  bend (if (> (abs (- ang2 ang1)) pi)
		 (+ (min ang1 ang2) (- (* pi 2) (max ang1 ang2)))
		 (abs (- ang2 ang1)))
	  bendlist(append bendlist (list (- pi bend)))
	  verts (cdr verts)
	  i(1+ i))
    )
  (command "EXPLODE" plsel)
  (princ)
)
(princ "\n              KangKung - 18/04/2013\n")
(princ "\n           Nhap GOC de chay chuong trinh\n")
  • 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

Chọn 1 line đường dẫn, sau đó cho nó tự tìm Line tiếp giáp cũng được mà ^^

 

@KangKung : vl-remove-if-not cdr assoc 10 chỉ áp dụng cho LWPline mới này thôi, ở Polyline 3D tọa độ k nằ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

Chọn 1 line đường dẫn, sau đó cho nó tự tìm Line tiếp giáp cũng được mà ^^

 

@KangKung : vl-remove-if-not cdr assoc 10 chỉ áp dụng cho LWPline mới này thôi, ở Polyline 3D tọa độ k nằm ở đó

Cái màu đỏ này nguy hiểm, bởi rất có thể tại endpoint này lại xuất hiện rất nhiều startpoint khá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

Đường dẫn chạy đó thì ket đoán chỉ có 1 và có bộ lọc riêng, k lo k lo ^^ Hoặc ít nhất là tìm thứ tự theo tập line đã chọn. Nhìn hình thì biết ngay giải pháp join vào, tí explode ra dở rồ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

Bác KangKung có nhận ra ý đồ của chủ thớt không? Em thì cứ nghĩ là tạo tệp bình sai cơ đấy. 

Cái này em cũng viết lâu rồi. Mấy khi dùng đâ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

Haizz! Bạn Song Nhi có ý đồ gì thì chỉ bạn ấy biết chắc chắn. Gia Cát Dự là tạo ra tệp bình sai gồm cạnh và góc. Cạnh thì đơn giản là cứ chọn đâu thì ra chiều dài đó rồi và Song Nhi chỉ vướng ở phần góc giữa các cạnh liên tiếp nhau mà thôi. Mục đích như vậy nên Song Nhi mới muốn chọn từng cạnh một (là LINE)chứ không phải là nhiều cạnh cùng lúc (là PLINE). Dùng cách chọn 1 Line sau đó tự động nối các Line tiếp giáp như của Ketxu thì vứt vì các lý do sau:

1. Không cho người sử dụng chọn 1 đoạn con nào đó trong 1 tuyến dài. Ví dụ chỉ muốn chọn 1 đoạn ở giữa thì Lisp  cứ cho ra toàn tuyến vì thế kết quả chả biết đâu là góc mình cần

2. Với những lưới đo cạnh phức tạp có nhiều điểm nút (ít nhất 3 đường thẳng giao nhau tại 1 điểm) thì Lisp sẽ nối các Line thế nào với nhau?

3. Với những tuyến đo có cạnh chung, nếu nối cạnh chung vào một PLINE nào đó rồi thì tuyến sau sẽ không dùng cạnh chung đó được nữa => phải vẽ thêm 1 Line khác vào cạnh chung đó gây bất tiện.

4....

Vì những lý do trên nên yêu cầu bạn Song Nhi đưa ra là dễ hiểu. Trước khi dùng Lisp đối tượng là Line thì sau khi chạy Lisp phải trả về đối tượng như ban đầu.

  • 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

Ketxu cũng nên đọc kỹ lại yêu cầu của chủ thớt. Yêu cầu sao thì viết vậy chả lẽ sai.

Còn việc dùng vl-remove-if-not cdr assoc 10 vẫn tốt với PLine cùng cao độ. Nếu 3DPline thì có hàm khác lo gì. (acet-geom-vertex-list (ssname (ssget '((0 . "LWPOLYLINE,POLYLINE"))) 0))

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 kỹ chứ. Nói kỹ hơn một chút nhé.

 

- 1. OP Không có file cad, chỉ nói có 1 đường gồm các Line liên tục, loại trừ các điểm giao với đối tượng khác, còn là Line tiếp giáp thì tính tất (theo hình vẽ) + không có rẽ nhánh. Tất nhiên đó là cách hiểu của ketxu (ngoại đạo) theo hình và OP mô tả. May mà bạn trong ngành nên bắt được ý là có thể nó chỉ là 1 đoạn trong cả một ... trường đoạn. Nói cách khác, ý dễ hiểu của OP chỉ dùng cho các bạn thôi ^^. Ta sang ý 2 nhé

 

- 2. Khi có thể là 1 đoạn trong cả 1 tuyến dài, và có thể rẽ nhánh => ketxu đã đề đạt là tìm đường Line tiếp giáp trong các Line đã chọn, hình như KK chưa đọc bài này ? (kỹ ?). Nếu k thích giải pháp này, sang ý 3, nói về phương án của KK và tại sao có ý 2

 

- 3 : đầu tiên, OP muốn lisp thực hiện với hàng loạt Line, nhưng KK đề nghị OP chuyển sang vẽ Pline để chạy lisp ^^

Cái dở thứ nhất là có thể cái đường zz đấy k phải do OP vẽ từ đầu đến cuối . OK. Sang ý 3a và 3b

 

+ 3.a : Tự bạn OP join bằng tay hoặc vẽ bằng Pline rồi chạy lisp bài #2 của KK : 

        Trong lisp này sai đầu tiên như ketxu đã nói, bạn gán cả Pline 3D vào trong bộ lọc, nhưng khi tính lại chỉ làm với assoc 10. Một là bỏ hẳn ra khỏi bộ lọc, 2 là    nếu có nó thì phải tính. Mình k nói là KK không có cách tính, mà là nên chăm sóc nó thôi ^^

 

+ 3.b : Chọn một loạt Line và KK dùng lisp để Join vào, sau đó explode ra. Lại nảy sinh các vấn đề sau :

 - Dòng command Pedit : KK đã bao giờ làm việc với biến PEDITACCEPT ?

 - Dòng gán đường dẫn là Entlast : Join bằng Pedit không phải bao giờ cũng chỉ có 1 đối tượng mới sinh

 - Điều gì khiến KK nghĩ là Join lại bằng lệnh Pedit xong, đến lúc Explode ra các Line trở về được trạng thái ban đầu ?

 

P/s :à,  cái đoạn tính góc ấy, sau khi có list đỉnh rồi, có lẽ chỉ cần đến 3 dòng nữa thôi, lúc nào rỗi KK thử hem ^^

Cám ơn KK vì các lisp đều đã có tên và dọn biến đẹp đẽ ^^ KK chỉ cần post code như giờ là được rồi, k cần attatch thêm file nữa đâu ^^ Tiếp tục giữ vững phong độ code KK nhé 

  • 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

Vote anh KangKung - LISP sửa lại của anh đã thoả mãn yêu cầu của em rùi!

PS: Vì vấn đề của em mà làm các bác bất hoà với nhau thấy ấy nấy quá!

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

Mình cũng không rõ ý đồ của SongNhi là gì. Nếu di theo tuyến thì sẽ tính toán góc trái hay phải cho thống nhất, khi đó đọc góc lái là biết tuyến quẹo trái hay phải luô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

 

Theo tôi bạn nên vẽ tuyến đó bằng PLINE (hoặc dùng Lisp nối các Line rời rạc đó thành PLINE) rồi dùng Lisp dưới đây.

http://www.cadviet.com/upfiles/3/71162_lisp_thong_ke_goc_cua_pline.lsp

;==========LISP THONG KE GOC CUA PLINE==========
;=============KANGKUNG 18/04/2013===============
(defun C:Goc ( / i plsel pldata verts bend)
  (vl-load-com)
  (setq bendlist(list))
  (while (not (setq plsel (ssget '((0 . "LWPOLYLINE,POLYLINE"))))))
  (setq pldata (entget (ssname plsel 0)) verts (mapcar 'cdr (vl-remove-if-not '(lambda (x) (= (car x) 10)) pldata)))
  (setq i 1)
  (while (> (length verts) 2)
    (setq ang1 (angle (car verts) (cadr verts)) ang2 (angle (cadr verts) (caddr verts))
	  bend (if (> (abs (- ang2 ang1)) pi)
		 (+ (min ang1 ang2) (- (* pi 2) (max ang1 ang2)))
		 (abs (- ang2 ang1)))
	  bendlist (append bendlist (list (strcat "\nGoc " (itoa i) ": " (rtos (- pi bend)))))
	  verts (cdr verts)
	  i(1+ i))
    )
  (foreach x bendlist (princ (strcat x " ")))
  (princ)
)
(princ "\n              KangKung - 18/04/2013\n")
(princ "\n           Nhap GOC de chay chuong trinh\n")

Mình có dùng thử lisp này, rất hay, nhưng bạn có thể cho mình kết quả chính xác hơn không? Lisp này chỉ xuất được 2 số phần thập phân, nên khi chuyển sang độ phút giây nó sai khá nhiều. Bạn có thể điều chỉnh thành 6 số sau phần thập phân được không? Mà nếu có lip xuất độ phút giây luôn thì càng tốt. Cảm ơ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

2. Sau khi chạy xong thì toàn bộ giá trị góc được lưu trong danh sách bendlist, bạn cần giá trị nào chỉ việc gọi ra thôi. Ví dụ:


a1 = (nth 0 bendlist) 


a2 = (nth 1 bendlist)


a3 = (nth 2 bendlist)


...................................


an = (nth (- n 1) bendlist)


Cái danh sách bendlist nó ở chổ nào vậy bạn mình tìm khô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

 

2. Sau khi chạy xong thì toàn bộ giá trị góc được lưu trong danh sách bendlist, bạn cần giá trị nào chỉ việc gọi ra thôi. Ví dụ:

a1 = (nth 0 bendlist) 

a2 = (nth 1 bendlist)

a3 = (nth 2 bendlist)

...................................

an = (nth (- n 1) bendlist)

Cái danh sách bendlist nó ở chổ nào vậy bạn mình tìm không có

 

Đơn giản là nó nằm trong lisp chứ ở đâu :wacko:

Muốn thấy nó thi thay : (princ) bằng bendlist     :)

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

64998_luoi_1.jpganh chị nào có cái lisp mà khi chon đường pl nó xuất qua excel cả góc và cạnh luôn không.(góc theo chiều kim đồng hồ) 

Đây bạn: ( của Mr. Gia - Bach)

http://www.cadviet.com/upfiles/5/96857_angleclockwisepolyline.rar

  • 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

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

×