Đến nội dung


Hình ảnh
- - - - -

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


  • Please log in to reply
24 replies to this topic

#1 Song Nhi

Song Nhi

    biết vẽ rectang

  • Members
  • PipPip
  • 83 Bài viết
Điểm đánh giá: 52 (tàm tạm)

Đã gửi 18 April 2013 - 12:50 AM

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ữ]


  • 0

#2 KangKung

KangKung

    biết lệnh array

  • Members
  • PipPipPip
  • 189 Bài viết
Điểm đánh giá: 227 (khá)

Đã gửi 18 April 2013 - 01:37 PM

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.c...c_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")

  • 1

#3 Song Nhi

Song Nhi

    biết vẽ rectang

  • Members
  • PipPip
  • 83 Bài viết
Điểm đánh giá: 52 (tàm tạm)

Đã gửi 18 April 2013 - 09:37 PM

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!


  • 0

#4 KangKung

KangKung

    biết lệnh array

  • Members
  • PipPipPip
  • 189 Bài viết
Điểm đánh giá: 227 (khá)

Đã gửi 18 April 2013 - 11:05 PM

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.c..._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")

  • 3

#5 ketxu

ketxu

    Copier - Paster - Editor

  • Moderator
  • PipPipPipPipPipPipPip
  • 5682 Bài viết
Điểm đánh giá: 2605 (tuyệt vời)

Đã gửi 18 April 2013 - 11:32 PM

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 ở đó


  • 0

Thành viên nhóm CadMagic.
Mời bạn ghé thăm facebook nhóm - Page viết lisp theo yêu cầu  :
CAD MAGIC


#6 Doan Van Ha

Doan Van Ha

    biết lệnh adcenter

  • CADViet Team
  • PipPipPipPipPipPipPip
  • 5449 Bài viết
Điểm đánh giá: 2625 (tuyệt vời)

Đã gửi 18 April 2013 - 11:40 PM

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.


  • 0

* Chỉ nên yêu cầu Lisp khi bạn làm việc đó mất cả ngày nhưng họ chỉ viết 1 giờ. Đừng nêu yêu cầu Lisp khi bạn chỉ làm 1 giờ nhưng bắt họ phải mất cả ngày.

* Nhờ viết lisp cũng như đi khám bệnh. Chỉ gởi căn cước và than sắp chết thì không bác sỹ nào cứu sống được.


#7 ketxu

ketxu

    Copier - Paster - Editor

  • Moderator
  • PipPipPipPipPipPipPip
  • 5682 Bài viết
Điểm đánh giá: 2605 (tuyệt vời)

Đã gửi 19 April 2013 - 04:32 AM

Đườ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 ^^


  • 0

Thành viên nhóm CadMagic.
Mời bạn ghé thăm facebook nhóm - Page viết lisp theo yêu cầu  :
CAD MAGIC


#8 thanhduan2407

thanhduan2407

    biết lệnh adcenter

  • Advance Member
  • PipPipPipPipPipPipPip
  • 995 Bài viết
Điểm đánh giá: 223 (khá)

Đã gửi 19 April 2013 - 10:47 AM

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. 


  • 0



Tôi là con kiến bò trên sa mạc kiến thức bao la. Biển học thật rộng lớn







#9 KangKung

KangKung

    biết lệnh array

  • Members
  • PipPipPip
  • 189 Bài viết
Điểm đánh giá: 227 (khá)

Đã gửi 19 April 2013 - 12:11 PM

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.


  • 1

#10 ketxu

ketxu

    Copier - Paster - Editor

  • Moderator
  • PipPipPipPipPipPipPip
  • 5682 Bài viết
Điểm đánh giá: 2605 (tuyệt vời)

Đã gửi 19 April 2013 - 12:20 PM

KK đọc kỹ lại đi đã


  • 0

Thành viên nhóm CadMagic.
Mời bạn ghé thăm facebook nhóm - Page viết lisp theo yêu cầu  :
CAD MAGIC


#11 KangKung

KangKung

    biết lệnh array

  • Members
  • PipPipPip
  • 189 Bài viết
Điểm đánh giá: 227 (khá)

Đã gửi 19 April 2013 - 12:32 PM

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))


  • 0

#12 ketxu

ketxu

    Copier - Paster - Editor

  • Moderator
  • PipPipPipPipPipPipPip
  • 5682 Bài viết
Điểm đánh giá: 2605 (tuyệt vời)

Đã gửi 19 April 2013 - 01:23 PM

Ồ, đọ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é 


  • 1

Thành viên nhóm CadMagic.
Mời bạn ghé thăm facebook nhóm - Page viết lisp theo yêu cầu  :
CAD MAGIC


#13 Song Nhi

Song Nhi

    biết vẽ rectang

  • Members
  • PipPip
  • 83 Bài viết
Điểm đánh giá: 52 (tàm tạm)

Đã gửi 19 April 2013 - 04:15 PM

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á!


  • 0

#14 thanhduan2407

thanhduan2407

    biết lệnh adcenter

  • Advance Member
  • PipPipPipPipPipPipPip
  • 995 Bài viết
Điểm đánh giá: 223 (khá)

Đã gửi 19 April 2013 - 07:36 PM

Đây là thảo luận mà bạn SongNhi. Các bác ấy đều là các Lisper Pro. 

À, ý đồ của bạn là gì thế?  :wub:


  • 0



Tôi là con kiến bò trên sa mạc kiến thức bao la. Biển học thật rộng lớn







#15 tien2005

tien2005

    biết lệnh properties

  • Members
  • PipPipPipPip
  • 257 Bài viết
Điểm đánh giá: 94 (tàm tạm)

Đã gửi 23 April 2013 - 02:17 PM

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


  • 0

#16 minhcv90

minhcv90

    Chưa sử dụng CAD

  • Members
  • Pip
  • 4 Bài viết
Điểm đánh giá: 0 (bình thường)

Đã gửi 19 November 2014 - 08:59 AM

sao trường hợp này của em không chạy được lisp góc,các Pro xem giúp em với.thanks http://www.cadviet.c...00_drawing2.dwg 


  • 0

#17 nguyenphuocgtvt

nguyenphuocgtvt

    Chưa sử dụng CAD

  • Members
  • Pip
  • 1 Bài viết
Điểm đánh giá: 0 (bình thường)

Đã gửi 13 February 2015 - 10:18 AM

 

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.c...c_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


  • 0

#18 Doan Van Ha

Doan Van Ha

    biết lệnh adcenter

  • CADViet Team
  • PipPipPipPipPipPipPip
  • 5449 Bài viết
Điểm đánh giá: 2625 (tuyệt vời)

Đã gửi 13 February 2015 - 10:25 AM

Bạn format units bao nhiêu chữ số thập phân thì nó xuất ra bấy nhiêu.


  • 0

* Chỉ nên yêu cầu Lisp khi bạn làm việc đó mất cả ngày nhưng họ chỉ viết 1 giờ. Đừng nêu yêu cầu Lisp khi bạn chỉ làm 1 giờ nhưng bắt họ phải mất cả ngày.

* Nhờ viết lisp cũng như đi khám bệnh. Chỉ gởi căn cước và than sắp chết thì không bác sỹ nào cứu sống được.


#19 trinhngoctri

trinhngoctri

    biết vẽ pline

  • Members
  • PipPip
  • 62 Bài viết
Điểm đánh giá: -1 (bình thường)

Đã gửi 31 July 2015 - 02:37 PM

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ó


  • 0

#20 pphung183

pphung183

    biết dimstyle

  • Members
  • PipPipPipPipPip
  • 384 Bài viết
Điểm đánh giá: 425 (tốt)

Đã gửi 31 July 2015 - 03:36 PM

 

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


  • 0