Đến nội dung


Hình ảnh
- - - - -

"[Yêu cầu] Nhờ viết Lisp ghi chiều dài - độ dốc, hướng dốc


  • Please log in to reply
33 replies to this topic

#1 ECO

ECO

    biết zoom

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

Đã gửi 19 May 2012 - 05:06 AM

Mình đang phải chỉnh sửa một số bản vẽ về giao thông, nhưng không phải dân giao thông chuyên ngành nên khá vất vả.
Mình muốn nhờ các cao thủ viết giúp một lisp như sau:
- Nội dung:
+ Lisp dùng để ghi độ dài đối tượng chọn ( line, arc, pline), hoặc khoảng cách giữa hai điểm pick: L= ...m
+ Lisp ghi thêm độ dốc i=....% - Bằng cách nhập cao độ điểm đầu và cao độ điểm cuối.( Vì mình làm trên bình đồ 2D)
+ Dòng ghi L=...m nằm trên, dòng ghi i;...% nằm dưới, ở giữa là mũi tên chỉ hướng dốc nằm trùng với đường line chọn.
+ Mũi tên vẽ theo hướng độ dốc từ điểm cao độ lớn hơn xuống điểm cao độ nhỏ hơn
+ Nếu có được tùy chọn để phần Text và mũi tên tạo thành 1 block Attribute nằm trong 1 layer, và có thể tùy biến kích thước Scale tùy thuộc tỷ lệ bản vẽ muốn in để dễ quản lý thì tốt.
- Mình gửi kèm file Cad có block Attribute theo nội dung mình cần, mong các bạn giúp đỡ.
Hình đã gửi
http://www.mediafire...zw48mobxuv2exkp
Xin chân thành cảm ơn các bạn trước.
  • 0

#2 ECO

ECO

    biết zoom

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

Đã gửi 19 May 2012 - 11:04 AM

Trên Diễn đàn mình cũng thấy có Lisp ghi độ dốc, và lisp ghi chiều dài, nhưng theo hai kiểu khác nhau nên không kết hợp làm một được.
Mình cũng chỉ mới biết tập tọe về Lisp nên nhờ các bro chỉ giáo.
  • 0

#3 ketxu

ketxu

    Copier - Paster - Editor

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

Đã gửi 19 May 2012 - 11:21 AM

Yêu cầu không khó, nếu không ai viết giùm bạn thì tối nay mình viết :)
  • 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


#4 phamthanhbinh

phamthanhbinh

    biết lệnh adcenter

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

Đã gửi 19 May 2012 - 11:22 AM

Mình đang phải chỉnh sửa một số bản vẽ về giao thông, nhưng không phải dân giao thông chuyên ngành nên khá vất vả.
Mình muốn nhờ các cao thủ viết giúp một lisp như sau:
- Nội dung:
+ Lisp dùng để ghi độ dài đối tượng chọn ( line, arc, pline), hoặc khoảng cách giữa hai điểm pick: L= ...m
+ Lisp ghi thêm độ dốc i=....% - Bằng cách nhập cao độ điểm đầu và cao độ điểm cuối.( Vì mình làm trên bình đồ 2D)
+ Dòng ghi L=...m nằm trên, dòng ghi i;...% nằm dưới, ở giữa là mũi tên chỉ hướng dốc nằm trùng với đường line chọn.
+ Mũi tên vẽ theo hướng độ dốc từ điểm cao độ lớn hơn xuống điểm cao độ nhỏ hơn
+ Nếu có được tùy chọn để phần Text và mũi tên tạo thành 1 block Attribute nằm trong 1 layer, và có thể tùy biến kích thước Scale tùy thuộc tỷ lệ bản vẽ muốn in để dễ quản lý thì tốt.
- Mình gửi kèm file Cad có block Attribute theo nội dung mình cần, mong các bạn giúp đỡ.
http://www.mediafire...zw48mobxuv2exkp
Xin chân thành cảm ơn các bạn trước.

Hề hề hề,
1/- Bạn cần nói rõ hơn về độ dài đối tượng mà bạn cần trong trường hợp bạn dùng phương án pick 2 điểm và hai diểm đó là các mút của một đoạn cong.
2/- Độ dốc bạn nói được tính theo chiều dài đối tượng hay khoảng cách giữa hai mút của đối tượng??
3/- Mũi tên sẽ ra sao nếu đoạn bạn chọn ghi là đoạn cong???
4/- Trường hợp mũi tên quay ngược chiều thì các text có ngược chiều theo không hay là vẫn giữ nguyên khái niệm trên dưới như của bạn.???
5/- Cứ theo như bản vẽ bạn gửi thì khái niệm trên và dưới của bạn hơi ..... đặc biệt.
Bạn hãy xem lại và trả lời các câu hỏi trên thì may ra mới có lisp đúng theo ý bạn được.
  • 1
Chúc các quý Anh trên diễn đàn luôn khỏe, đẻ thêm được nhiều thứ để mót.

#5 ECO

ECO

    biết zoom

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

Đã gửi 19 May 2012 - 12:08 PM

Cảm ơn bác, em sẽ nói cụ thể luôn ạ.
1. Độ dài khi pick chỉ áp dụng cho đoạn thẳng, đối với đoạn cong sẽ không pick 2 điểm mà pick chọn đối tượng ( Kiểu như Dim độ dại cung)
2. Độ dốc được tính theo độ chênh cao giữa 2 điểm ( số này được nhập tay)/chiều dài. Ví dụ chiều dài 45m, độ cao điểm 1 là +35m, độ cao điểm 2 là +39.5m , lisp sẽ vẽ mũi tên quay từ điểm 2 về điểm 1 ( Không phụ thuộc thứ tự pick), và ghi độ dốc i=10%.
(i=39.5-35/45*100%). Vì đang ở bước Quy hoạch nên không cần tính độ dài theo dốc, chỉ cần độ dài trên mặt phẳng - tức là độ dài thực của đối tượng.
3. Mũi tên sẽ nằm ở trung điểm đoạn cong và có phương tiếp tuyến với đoạn cong.
4. Nếu mũi tên xoay ngược thì Text vẫn trên dưới như thế này ạ:
5. Hì hì, đúng là khó diễn đạt, nên em phải chơi cái hình lên. Đại khái là xoay kiểu gì thì nó vẫn như vầy ạ:
Hình đã gửi
  • 0

#6 phamthanhbinh

phamthanhbinh

    biết lệnh adcenter

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

Đã gửi 19 May 2012 - 03:49 PM

Cảm ơn bác, em sẽ nói cụ thể luôn ạ. 1. Độ dài khi pick chỉ áp dụng cho đoạn thẳng, đối với đoạn cong sẽ không pick 2 điểm mà pick chọn đối tượng ( Kiểu như Dim độ dại cung) 2. Độ dốc được tính theo độ chênh cao giữa 2 điểm ( số này được nhập tay)/chiều dài. Ví dụ chiều dài 45m, độ cao điểm 1 là +35m, độ cao điểm 2 là +39.5m , lisp sẽ vẽ mũi tên quay từ điểm 2 về điểm 1 ( Không phụ thuộc thứ tự pick), và ghi độ dốc i=10%. (i=39.5-35/45*100%). Vì đang ở bước Quy hoạch nên không cần tính độ dài theo dốc, chỉ cần độ dài trên mặt phẳng - tức là độ dài thực của đối tượng. 3. Mũi tên sẽ nằm ở trung điểm đoạn cong và có phương tiếp tuyến với đoạn cong. 4. Nếu mũi tên xoay ngược thì Text vẫn trên dưới như thế này ạ: 5. Hì hì, đúng là khó diễn đạt, nên em phải chơi cái hình lên. Đại khái là xoay kiểu gì thì nó vẫn như vầy ạ:

Hề hề hề,
Bạn dùng thử cái này rồi cho ý kiến nhé. Với line và arc thì chắc là ổn, riêng với pline có thể bạn chưa thật ứng ý vì điểm đặt mũi tên và text.
Về hướng mũi tên chỉ độ dốc do bạn không nói rõ điểm thứ nhất và điểm thứ hai được chọn ra sao nên mình chơi phương án cho bạn tự chọn vậy. Khi bạn thấy chiều mũi tên chưa đúng khi lisp hỏi bạn chỉ cần nhập y hay Y là nó sẽ đổi chiều theo ý bạn.


(defun c:gdd ()
(vl-load-com)
(setq oldos (getvar "osmode"))
(setvar "osmode" 0)
(command "undo" "be")
(setq ent (car (entsel "\n Chon doan can ghi do doc "))
obj (vlax-ename->vla-object ent)
h1 (getreal "\n Nhap cao do diem dau: ")
h2 (getreal "\n Nhap cao do diem cuoi: ")
h (getreal "\n Nhap chieu cao text: ")
p1 (vlax-curve-getstartpoint obj)
p2 (vlax-curve-getendpoint obj)
p3 (vlax-curve-getpointatparam obj (/ (vlax-curve-getendparam obj) 2))
len (vlax-curve-getdistatpoint obj p2)
v (vlax-curve-getfirstderiv obj (/ (vlax-curve-getendparam obj) 2))
ang (atan (/ (cadr v) (car v)))
i (/ (* (abs (- h1 h2)) 100) len)
)
(command "pline" (polar p3 ang (* 5 h)) "w" 0.0 h (polar p3 ang (* 3 h)) "w" (/ h 4) (/ h 4) (polar p3 (+ ang pi) (* 5 h)) "")
(setq mt (entlast))
(if (> ang pi)
(setq ang (- ang pi))
)
(command "text" "j" "mc" (polar p3 (+ ang (/ pi 2)) h) h (* (/ ang pi) 180) (strcat "i = " (rtos i 2 4) "%"))
(command "text" "j" "mc" (polar p3 (- ang (/ pi 2)) h) h (* (/ ang pi) 180) (strcat "L = " (rtos len 2 1) "(m)"))
(setq ans (getstring "\n Ban muon doi chieu doc <y or n>: "))
(if (= (strcase ans) "Y")
(command "rotate" mt "" p3 180)
)
(command "undo" "e")
(setvar "osmode" oldos)
(princ)
)
Đây chỉ là lisp thử chưa hoàn chỉnh, bạn cứ việc cho biết những điều cần hoàn thiện, mình sẽ hoàn thiện lại sau nhé.
Chúc bạn vui.
  • 5
Chúc các quý Anh trên diễn đàn luôn khỏe, đẻ thêm được nhiều thứ để mót.

#7 ECO

ECO

    biết zoom

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

Đã gửi 19 May 2012 - 05:47 PM

Cảm ơn bác nhiều ạ, em đã dùng thử và xài luôn cho bản vẽ rồi, hì hì. Dùng cho Line, Arc rất ngon lành, ghi được cho cả Spline luôn. Sướng. Quả là bá chấy !
Chỉ có một chút mong bác viết thêm một chút để trọn vẹn:
- Ví dụ như cần ghi theo các cạnh của một Rectang hoặc Poligon, hoặc Pline gấp khúc chẳng hạn thì cần chuyển sang kiểu Pick và nhập cao độ từng điểm liên tiếp, độ dài sẽ lấy theo khoảng cách hai điểm pick liền nhau đó, như kiểu Dimcontinue ấy ạ.
- Đoạn nhập chiều cao Text, nên để một giá trị mặc định, ví dụ thường dùng là 3, để đỡ phải lặp lại mỗi lần nhập lệnh.
- Nếu gom Text và mũi tên lại thành một Block Attribute thì sẽ tiện cho việc quản lý bản vẽ ( Các bác làm về Quy hoạch Cấp thoát Nước có thể điều chỉnh Block này thành dạng B=...( Định trước cho Block), L=...m, i=...% để sử dụng khi ghi thông số tuyến ống.
Chúc bác cuối tuần vui vẻ. Em lại vục mặt cày tiếp đây ạ.
  • 0

#8 phamcongvb

phamcongvb

    Chưa sử dụng CAD

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

Đã gửi 19 May 2012 - 06:14 PM

Em có chút góp ý: Dùng luôn style đang có để không phải nhập chiều cao text
  • 0

#9 ECO

ECO

    biết zoom

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

Đã gửi 23 May 2012 - 06:59 PM

Mong các bác ra tay giúp đỡ ạ.
  • 0

#10 quang_lac

quang_lac

    biết lệnh mirror

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

Đã gửi 23 May 2012 - 07:43 PM

giết gà dùng dao mổ trâu làm j, cái này có thể dễ dàng tạo được bằng cách thiết lập trong dimentions mà, sao phải khổ thế
  • 0

#11 ECO

ECO

    biết zoom

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

Đã gửi 24 May 2012 - 11:29 AM

giết gà dùng dao mổ trâu làm j, cái này có thể dễ dàng tạo được bằng cách thiết lập trong dimentions mà, sao phải khổ thế

Chỉ tạo được chiều dài và mũi tên bác ơi, còn tính toán độ dốc nữa cơ mà.
  • 0

#12 ECO

ECO

    biết zoom

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

Đã gửi 18 June 2012 - 11:03 AM

Hic, có bác nào giúp mình được không ạ?
  • 0

#13 phamthanhbinh

phamthanhbinh

    biết lệnh adcenter

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

Đã gửi 18 June 2012 - 09:34 PM

Hic, có bác nào giúp mình được không ạ?

Hề hề hề,
Xin lỗi vì bạn phải đợi lâu.Vừa qua mình cũng hơi bận nên không đọc được yêu cầu của bạn.
Đây là cái mình đã sửa lại từ cái lisp cũ, không biết đã đúng với cái bạn yêu cầu hay chưa. Nếu chưa xin đừng ngại nói rõ chỗ chưa được để mình ngâm tiếp.


(defun c:gdd (/ oldos )
(vl-load-com)
(setq oldos (getvar "osmode"))
(setvar "osmode" 0)
(command "undo" "be")
(makeattbl "GHIDODOC1" nil)
(makeattbl "GHIDODOC2" T)
(alert "\n Hay chon cac pline, line, arc can ghi do doc ")
(setq ssl (acet-ss-to-list (ssget (list (cons 0 "*line,arc")))))
(foreach ent ssl
(ghidodoc ent)
)
(command "undo" "e")
(setvar "osmode" oldos)
(princ)
)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;; Tao block thuoc tinh
(defun makeattbl (name Tflag / p e1 e2 e3 )
(setvar "aflags" 0)
(if (not (tblsearch "block" name ))
(progn
(setq p (list 0.0 0.0 0.0))
(if Tflag
(command "pline" (polar p pi 15) "w" 0.0 3 (polar p pi 9) "w" 0.75 0.75 (polar p 0 15) "")
(command "pline" (polar p 0 15) "w" 0.0 3 (polar p 0 9) "w" 0.75 0.75 (polar p pi 15) "")
)
(setq e1 (entlast))
(command "attdef" "" "Dodoc" "dodoc" "10%" "j" "mc" (polar p (/ pi 2) 3) 3 0 )
(setq e2 (entlast))
(command "attdef" "" "length" "dodai" "500" "j" "mc" (polar p (- (/ pi 2)) 3) 3 0 )
(setq e3 (entlast))
(command "block" name p e1 e2 e3 "")
) )
)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(defun ghidodoc (ent / obj h1 h2 plst p2 p3 len i v ang ans)
(setq els (entget ent) )
(if (or (= (cdr (assoc 0 els)) "LINE") (= (cdr (assoc 0 els)) "ARC"))
(progn
(command "pedit" ent "y" "")
(setq ent (entlast))
)
)
(redraw ent 3)
(setq obj (vlax-ename->vla-object ent)
plst (acet-geom-vertex-list ent)
h1 (getreal "\n Nhap cao do diem dau: ") )
(foreach p plst
(setq par (vlax-curve-getparamatpoint obj p)
;;;;;;;; h (getreal "\n Nhap chieu cao text: ")
;;;;;;;; p1 (vlax-curve-getstartpoint obj)
p2 (vlax-curve-getpointatparam obj (1+ par)) )
(if p2 (progn
(setq p3 (vlax-curve-getpointatparam obj (+ par 0.5))
h2 (getreal "\n Nhap cao do diem ke tiep: ")
len (- (vlax-curve-getdistatpoint obj p2) (vlax-curve-getdistatpoint obj p))
v (vlax-curve-getfirstderiv obj (+ par 0.5))
ang (atan (/ (cadr v) (car v)))
i (/ (* (abs (- h1 h2)) 100) len) )
(command "insert" "GHIDODOC1" "R" (* (/ ang pi) 180) p3 "" "" (strcat "i = " (rtos i 2 4) "%") (strcat "L = " (rtos len 2 1) "(m)") )
(setq ans (getstring "\n Ban co dong y voi chieu do doc nay < y or n> : "))
(if (= (strcase ans) "N")
(progn
(command "erase" "last" "")
(command "insert" "GHIDODOC2" "R" (* (/ ang pi) 180) p3 "" "" (strcat "i = " (rtos i 2 4) "%") (strcat "L = " (rtos len 2 1) "(m)") )
)
)
)
)
(setq h1 h2)
)
(redraw ent 4)
)
Chúc bạn luôn vui.
  • 3
Chúc các quý Anh trên diễn đàn luôn khỏe, đẻ thêm được nhiều thứ để mót.

#14 ECO

ECO

    biết zoom

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

Đã gửi 02 July 2012 - 11:25 AM

Cảm ơn bác phamthanhbinh rất nhiều, lisp dùng ngon rồi bác ạ.
Cảm ơn diễn đàn, chúc Cadviet ngày càng phát triển.
  • 0

#15 softwater

softwater

    biết zoom

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

Đã gửi 19 July 2012 - 03:09 PM

cảm ơn bạn đã có lisp hay
nhưng đường mũi tên và chữ bé quá so với mặt bằng
Vậy có cách nào làm lơn hơn trong quá trình thực hiện lệnh không????
  • 0

#16 conglamxdk11

conglamxdk11

    biết zoom

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

Đã gửi 23 April 2013 - 10:54 PM

cảm ơn bác đã chia sẻ lisp nhưng am dung lisp của bác vẫn chưa được ,em không hiểu cái chỗ nhập toạ độ điểm đầu điểm cuối như thế nào trong autocad mong bác chỉ giáo 


  • 0

#17 luiz

luiz

    biết vẽ line

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

Đã gửi 24 April 2013 - 03:43 AM

các bác cho em hỏi cái lisp trên làm sao để chọn được hướng mũi tên quay đúng hướng từ điểm cao hơn về điểm thấp hơn??? sẵn tiện nhờ các bác sửa giu,f em lisp trên thêm bước pick điểm đầu => cao độ điểm đầu => pick điểm cuối => cao độ điểm cuối. sau đó lisp tính chiều dài và độ dốc theo 2 điểm đó đồng thời mũi tên sẽ quay theo hướng từ điểm pick trước đến điểm pick sau. tks các bác


  • 0

#18 phamthanhbinh

phamthanhbinh

    biết lệnh adcenter

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

Đã gửi 24 April 2013 - 02:19 PM

cảm ơn bạn đã có lisp hay
nhưng đường mũi tên và chữ bé quá so với mặt bằng
Vậy có cách nào làm lơn hơn trong quá trình thực hiện lệnh không????

 

Hề hề hề,

Muốn mũi tên to hay bé dài hay ngắn thì bạn hãy sửa nó trong các dòng code:

(command "pline" (polar p pi 15) "w" 0.0 3 (polar p pi 9) "w" 0.75 0.75 (polar p 0 15) "")
(command "pline" (polar p 0 15) "w" 0.0 3 (polar p 0 9) "w" 0.75 0.75 (polar p pi 15) "")

Trong code đó:

Mủi tên dài 6, đỉnh rộng 0 đáy rộng 3

Thân dài 24 rộng 0,75.


  • 1
Chúc các quý Anh trên diễn đàn luôn khỏe, đẻ thêm được nhiều thứ để mót.

#19 phamthanhbinh

phamthanhbinh

    biết lệnh adcenter

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

Đã gửi 24 April 2013 - 02:27 PM

cảm ơn bác đã chia sẻ lisp nhưng am dung lisp của bác vẫn chưa được ,em không hiểu cái chỗ nhập toạ độ điểm đầu điểm cuối như thế nào trong autocad mong bác chỉ giáo 

Hề hề hề,

Bạn đã dùng lisp chưa vậy??? Trong lisp chỉ có yêu cầu nhập cao độ điểm đầu và nhập cao độ điểm cuối chứ có bắt nhập toạ độ điểm đâu nhỉ?? Các điểm đầu và cuối này là do lisp tự xác định theo đường pline cần tính độ dốc cơ mà.....


  • 0
Chúc các quý Anh trên diễn đàn luôn khỏe, đẻ thêm được nhiều thứ để mót.

#20 tientracdia

tientracdia

    biết lệnh scale

  • Members
  • PipPipPip
  • 147 Bài viết
Điểm đánh giá: -11 (hơi kém)

Đã gửi 25 April 2013 - 07:25 AM

Mong muốn bạn viết bổ sung Lisp tính độ dốc với việc thực hiện như sau :

Chọn điểm đầu tuyến, chọn text cao độ tự nhiên hoăc nhập vào;;

Chọn điểm cuối tuyến, chọn text cao độ tự nhiên hoăc nhập vào.

Chọn chiều thể hiện ( Đầu - Cuối hay Cuối - Đầu ) và tính độ dốc theo chiều.

Cám ơn.


  • 0