Rated 5/5 based on 240179 internet user reviews

Đến nội dung


Hình ảnh
- - - - -

viết chữ theo đường thẳng bất kỳ bằng auto Lisp


  • Please log in to reply
20 replies to this topic

#1 xuanvi

xuanvi

    Chưa sử dụng CAD

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

Đã gửi 26 May 2009 - 05:13 PM

Có pác nào giúp em với.

Em có nhiều đường thẳng khác nhau trên một bản vẽ mà cần ghi các thông số chi tiết lên đường thẳng đó (ví dụ: em cần ghi đường kính các ống cấp nước là D32 lên tất cảc các đường thẳng trên). Vậy có pác nào viết dùm em một cái lisp mà mình có thể nhập đoạn text từ bàn phím rồi chèn đoạn text đó theo đường thẳng bất kỳ không? các đường thẳng tiếp theo chỉ cần chọn là chèn đoạn text vào, lệnh sẽ kết thúc khi ta nhần enter hoặc ESC.

PS:
đoạn Text được chèn vào nằm đúng giữa đường thẳng và có góc quay song song với đoạn thẳng đó.

Cám ơn các pác.
  • 0

#2 q288

q288

    biết lệnh fillet

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

Đã gửi 26 May 2009 - 07:00 PM

Có pác nào giúp em với.

Em có nhiều đường thẳng khác nhau trên một bản vẽ mà cần ghi các thông số chi tiết lên đường thẳng đó (ví dụ: em cần ghi đường kính các ống cấp nước là D32 lên tất cảc các đường thẳng trên). Vậy có pác nào viết dùm em một cái lisp mà mình có thể nhập đoạn text từ bàn phím rồi chèn đoạn text đó theo đường thẳng bất kỳ không? các đường thẳng tiếp theo chỉ cần chọn là chèn đoạn text vào, lệnh sẽ kết thúc khi ta nhần enter hoặc ESC.

PS:
đoạn Text được chèn vào nằm đúng giữa đường thẳng và có góc quay song song với đoạn thẳng đó.

Cám ơn các pác.

Bạn thử dùng cái này xem. Kiểu chữ và chiều cao chữ do bạn chọn trước khi vào lệnh.
(defun c:int ()
  (setq ss (ssget '((0 . "LINE")))
	  chu (getstring "Chen chu :"))
  (setq os (getvar "OSMODE"))
  (setvar "OSMODE" 0)
  (repeat (sslength ss)
	(setq v  (ssname ss 0)
	  p1 (cdr (assoc 10 (entget v)))
	  p2 (cdr (assoc 11 (entget v)))
	  pm (polar p1 (angle p1 p2) (* 0.5 (distance p1 p2)))
	)
	(command "text" "j" "MC" pm "" (* 180 (/ (angle p1 p2) pi)) chu)
	(ssdel v ss)
  )
  (setvar "OSMODE" os)
)

  • 1

#3 huyhuong

huyhuong

    biết vẽ circle

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

Đã gửi 26 May 2009 - 08:46 PM

[quote name='q288' date='May 26 2009, 19:00' post='61630']
Bạn thử dùng cái này xem. Kiểu chữ và chiều cao chữ do bạn chọn trước khi vào lệnh.



mình đã thử lisp của bạn và có ý kiến như sau"
+ lisp chỉ dùng được với line, với polyline,... thì không dùng được
+ dòng text theo mình nghĩ thì lên đặt bên trên đường thẳng. dòng text này nên tạo sẵn trong cad chứ nhập từ dòng commad thì đánh chữ có dấu rất khó, hoặc là chèn những ký tự toán học vào cũng phức tạp.
hy vọng bạn sẽ hoàn thiện lisp trên. cảm ơn bạn rất nhiều.
  • 0

#4 q288

q288

    biết lệnh fillet

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

Đã gửi 27 May 2009 - 07:31 AM

mình đã thử lisp của bạn và có ý kiến như sau"
+ lisp chỉ dùng được với line, với polyline,... thì không dùng được
+ dòng text theo mình nghĩ thì lên đặt bên trên đường thẳng. dòng text này nên tạo sẵn trong cad chứ nhập từ dòng commad thì đánh chữ có dấu rất khó, hoặc là chèn những ký tự toán học vào cũng phức tạp.
hy vọng bạn sẽ hoàn thiện lisp trên. cảm ơn bạn rất nhiều.


mình theo yêu cầu của bạn xuanvi mà, nếu bạn yêu cầu thì mình sửa cũng đc, nhưng để xuanvi có ý kiến thế nào đã.
  • 0

#5 xuanvi

xuanvi

    Chưa sử dụng CAD

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

Đã gửi 27 May 2009 - 09:48 AM

Cám ơn bạn q288 đã có bài viết. Mình đã dùng thử, thấy rất được. Tuy nhiên mình còn một vấn đề cần bạn giúp là:

Sau khi chèn text vào đường thẳng đã chọn rồi, con chuột vẫn ở rạng "ô vuông", mình chọn đường thẳng khác nó lại chèn đoạn text trên vào đường thẳng mình vừa chọn. Lệnh sẽ kết thúc khi mình nhấn Enter hoặc ESC.

Mình xin giải thích: Trên bản vẽ có nhiều đoạn line, mình muốn chèn một đoạn text cố định vào tất cả các đường line đó. chỉ cần một lệnh: chọn line chèn text, chọn line chèn text,....enter, esc -->kết thúc lệnh. Như vậy giảm được rất nhiều thời gian.

Cám ơn bạn huyhuong đã có ý kiến đóng góp. Tuy nhiên ở đây mình chỉ cần ghi các thông số kỹ thuật lên đoạn line đó thôi, không cần ghi tiếng việt có dấu. thông số kỹ thuật có thể khác nhau theo từng trường hợp, do vậy đoạn text mình phải nhập vào từ bàn phím.

Để text nằm trên đoạn thẳng mình chỉ cần thay "MC" bằng "BC" như đoạn mã dưới đây là được:

(command "text" "j" "BC" pm "" (* 180 (/ (angle p1 p2) pi)) chu)

Nếu bạn q288 mà viết cho cả đường pline thì tốt.

PS:

Hơn nữa, bạn cần xử lý góc chèn text, để text không bị ngược như khi ta chèn text vào đoạn thẳng mà được vẽ từ phải qua trái ( Điểm p1 bên phải, p2 bên trái theo trục thẳng đứng)
  • 1

#6 q288

q288

    biết lệnh fillet

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

Đã gửi 27 May 2009 - 12:32 PM

Cám ơn bạn q288 đã có bài viết. Mình đã dùng thử, thấy rất được. Tuy nhiên mình còn một vấn đề cần bạn giúp là:

Sau khi chèn text vào đường thẳng đã chọn rồi, con chuột vẫn ở rạng "ô vuông", mình chọn đường thẳng khác nó lại chèn đoạn text trên vào đường thẳng mình vừa chọn. Lệnh sẽ kết thúc khi mình nhấn Enter hoặc ESC.

Mình xin giải thích: Trên bản vẽ có nhiều đoạn line, mình muốn chèn một đoạn text cố định vào tất cả các đường line đó. chỉ cần một lệnh: chọn line chèn text, chọn line chèn text,....enter, esc -->kết thúc lệnh. Như vậy giảm được rất nhiều thời gian.

Cám ơn bạn huyhuong đã có ý kiến đóng góp. Tuy nhiên ở đây mình chỉ cần ghi các thông số kỹ thuật lên đoạn line đó thôi, không cần ghi tiếng việt có dấu. thông số kỹ thuật có thể khác nhau theo từng trường hợp, do vậy đoạn text mình phải nhập vào từ bàn phím.

Nếu bạn q288 mà viết cho cả đường pline thì tốt.

PS:

Hơn nữa, bạn cần xử lý góc chèn text, để text không bị ngược như khi ta chèn text vào đoạn thẳng mà được vẽ từ phải qua trái ( Điểm p1 bên phải, p2 bên trái theo trục thẳng đứng)


Bạn thử cái này xem sao, nếu k muốn chèn nữa thì enter hơn là esc, vì esc làm thoát lệnh giữa chừng sẽ mất osnap.
(defun c:int(/ chu os ent obj ndai p1 p2 pm ang dau1)
  (setq	chu (getstring "Chen chu :")
		os (getvar "OSMODE")
	ent (car (entsel "\nChon duong de chen :")))
  (setvar "OSMODE" 0)

  (while ent
	(setq obj  (vlax-ename->vla-object ent)
	  ndai (/ (vlax-curve-getDistAtParam obj (vlax-curve-getEndParam obj)) 2)
	  pr   (vlax-curve-getParamAtDist obj ndai)  
	  p1   (vlax-curve-getPointAtParam obj (- pr 0.1))
	  p2   (vlax-curve-getPointAtParam obj (+ pr 0.1))
	  pm   (vlax-curve-getPointAtParam obj pr)
	  ang  (if (< (car p1) (car p2)) (angle p1 p2) (angle p2 p1))
	)
	(command "text" "j" "BC" pm "" (* 180 (/ ang pi)) chu)
	(setq ent (car (entsel "\nChon duong de chen :")))
  )
  (setvar "OSMODE" os)
)

  • 3

#7 xuanvi

xuanvi

    Chưa sử dụng CAD

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

Đã gửi 27 May 2009 - 02:04 PM

ôi, hay quá! cám ơn bạn q288 rất nhiều. Mình là người mới bắt đầu học lisp, nên loay hoay mãi mà không ra.

cái này rất giúp ích cho mình trong thiết kế.

Ah, mà bạn viết bằng cái gì vậy, có cả mầu cho các lệnh, dấu ngoặc vậy? Mình viết bằng notepad nên theo dõi rất khó khăn.

Bạn có tài liệu hướng dẫn lập trình lisp mà dễ hiểu không, chỉ cho mình với. Mỗi lần làm cái gì lại đi nhờ vả, ngại lắm!!!
  • 0

#8 xuanvi

xuanvi

    Chưa sử dụng CAD

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

Đã gửi 27 May 2009 - 02:15 PM

bạn q288 ơi, cho mình hỏi chút: tại sao khi AP lên máy này thì được, AP lên máy khác lại không được?

Có một vấn đề nảy sinh:

- Text nhập vào sẽ lấy theo font của style hiện tại (current style). Không can thiệp được chiều cao của text.
- Nếu dùng lệnh "ST", thay đổi chiều cao chữ trong ô "Height" của style hiện hành thì chương trình sẽ có lỗi xảy ra: ví dụ text sẽ nhảy thành số, góc nghiêng không song song với đường thẳng đã chọn.

vậy mình có thể yêu cầu nhập vào chiều cao của đoạn text được không? như vậy không ảnh hưởng bởi style hiện tại mà có thể tuỳ chọn chiều cao text cho phù hợp.

mong sớm nhận được giúp đỡ của mọi người.
  • 0

#9 q288

q288

    biết lệnh fillet

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

Đã gửi 27 May 2009 - 02:18 PM

ôi, hay quá! cám ơn bạn q288 rất nhiều. Mình là người mới bắt đầu học lisp, nên loay hoay mãi mà không ra.
cái này rất giúp ích cho mình trong thiết kế.
Ah, mà bạn viết bằng cái gì vậy, có cả mầu cho các lệnh, dấu ngoặc vậy? Mình viết bằng notepad nên theo dõi rất khó khăn.
Bạn có tài liệu hướng dẫn lập trình lisp mà dễ hiểu không, chỉ cho mình với. Mỗi lần làm cái gì lại đi nhờ vả, ngại lắm!!!


Trong diễn đàn nếu muốn viết có màu thì để đoạn code ở giữa cặp code ... /code nếu là đoạn code ngắn, hoặc codebox... /codebox nếu là code dài (có dấu [] . Ở phía dưới có nút "trợ giúp BB code" đó).
Còn khi viết lisp thì mình dùng trình soạn thảo của visual lisp (trong acad đánh lệnh vlide).
Về tài liệu thì mình chẳng đọc cái gì khác ngoài help của acad và visual lisp (nhấn f1), ngoài ra mình xem các ct ng khác viết rồi đoạn code nào thấy hay hay mình bắt chước (dĩ nhiên phải hiểu nó làm công việc gì mới đc) . Cái quan trọng nhất là thuật toán, cái đó mình phải tự suy nghĩ chứ k bắt chước ai đc.
Chúc bạn thành công.
  • 0

#10 q288

q288

    biết lệnh fillet

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

Đã gửi 27 May 2009 - 02:29 PM

bạn q288 ơi, cho mình hỏi chút: tại sao khi AP lên máy này thì được, AP lên máy khác lại không được?


À mình quên thêm dòng (vl-load-com) ở đầu ct. Không hiểu sao các cad 2007 về sau họ không tự động load các hàm visual lisp như các cad cũ hơn. Tốt nhất bạn nên để dòng đó vào file acad.lsp và vào options->system->chọn "load acad.lsp with every drawing" để khỏi phải bận tâm cứ phải load với từng lệnh.
  • 1

#11 q288

q288

    biết lệnh fillet

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

Đã gửi 28 May 2009 - 07:51 AM

bạn q288 ơi, cho mình hỏi chút: tại sao khi AP lên máy này thì được, AP lên máy khác lại không được?

Có một vấn đề nảy sinh:

- Text nhập vào sẽ lấy theo font của style hiện tại (current style). Không can thiệp được chiều cao của text.
- Nếu dùng lệnh "ST", thay đổi chiều cao chữ trong ô "Height" của style hiện hành thì chương trình sẽ có lỗi xảy ra: ví dụ text sẽ nhảy thành số, góc nghiêng không song song với đường thẳng đã chọn.

vậy mình có thể yêu cầu nhập vào chiều cao của đoạn text được không? như vậy không ảnh hưởng bởi style hiện tại mà có thể tuỳ chọn chiều cao text cho phù hợp.

mong sớm nhận được giúp đỡ của mọi người.


Mình sửa lại như sau, tên lệnh đổi lại là ist vì int trùng với intersect của acad. Cao chữ nhập 1 lần, lần sau nếu k muốn đổi thì enter.
(defun c:ist(/ chu os ent obj ndai p1 p2 pm ang caoc)
  (setq	chu (getstring "Chen chu :")
	caoc (getreal (strcat "\nCao chu <" (rtos (getvar "USERR1")) ">:"))
		os (getvar "OSMODE")
	ent (car (entsel "\nChon duong de chen :")))
  (setvar "OSMODE" 0)
  (if (not caoc) (setq caoc (getvar "USERR1")) (setvar "USERR1" caoc))
  (while ent
	(setq obj  (vlax-ename->vla-object ent)
	  ndai (/ (vlax-curve-getDistAtParam obj (vlax-curve-getEndParam obj)) 2)
	  pr   (vlax-curve-getParamAtDist obj ndai)  
	  p1   (vlax-curve-getPointAtParam obj (- pr 0.1))
	  p2   (vlax-curve-getPointAtParam obj (+ pr 0.1))
	  pm   (vlax-curve-getPointAtParam obj pr)
	  ang  (if (< (car p1) (car p2)) (angle p1 p2) (angle p2 p1))
	)
	(command "text" "j" "BC" pm caoc (* 180 (/ ang pi)) chu)
	(setq ent (car (entsel "\nChon duong de chen :")))
  )
  (setvar "OSMODE" os)
)

  • 1

#12 archhnm

archhnm

    biết zoom

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

Đã gửi 31 May 2009 - 01:45 PM

Tuyệt , mình test và ok
  • 0

#13 cavoitrang_11

cavoitrang_11

    biết zoom

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

Đã gửi 05 June 2009 - 10:26 PM

Bác ơi tại sao em load lisp thì cad lại báo như sau:
*error* functionbad argument type: fixnump: "BYLAYER"
  • 0

#14 w1nDream

w1nDream

    biết lệnh ddedit

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

Đã gửi 10 October 2009 - 11:03 AM

Mình sửa lại như sau, tên lệnh đổi lại là ist vì int trùng với intersect của acad. Cao chữ nhập 1 lần, lần sau nếu k muốn đổi thì enter.

(defun c:ist(/ chu os ent obj ndai p1 p2 pm ang caoc)
  (setq	chu (getstring "Chen chu :")
	caoc (getreal (strcat "\nCao chu <" (rtos (getvar "USERR1")) ">:"))
		os (getvar "OSMODE")
	ent (car (entsel "\nChon duong de chen :")))
  (setvar "OSMODE" 0)
  (if (not caoc) (setq caoc (getvar "USERR1")) (setvar "USERR1" caoc))
  (while ent
	(setq obj  (vlax-ename->vla-object ent)
	  ndai (/ (vlax-curve-getDistAtParam obj (vlax-curve-getEndParam obj)) 2)
	  pr   (vlax-curve-getParamAtDist obj ndai)  
	  p1   (vlax-curve-getPointAtParam obj (- pr 0.1))
	  p2   (vlax-curve-getPointAtParam obj (+ pr 0.1))
	  pm   (vlax-curve-getPointAtParam obj pr)
	  ang  (if (< (car p1) (car p2)) (angle p1 p2) (angle p2 p1))
	)
	(command "text" "j" "BC" pm caoc (* 180 (/ ang pi)) chu)
	(setq ent (car (entsel "\nChon duong de chen :")))
  )
  (setvar "OSMODE" os)
)


Pác q288 có thể fát triển nó thành viết chữ theo đường path có sẵn được hok?Cái này cũng đã nhiều người hỏi nhưng chắc vẫn chưa có câu trả lời xác đáng.
Hiện tại thì chi viết dạng Arctext (chỉ nhận đường arc).Còn Pl và Spl thì chịu.Hi vọng pác q288 và các tiền bối có thể giúp đỡ.thks!
:bigsmile:
  • 0
__Tâm tựa lưu thủY__
Vi nhân nan

#15 ngo_tieu_my

ngo_tieu_my

    Chưa sử dụng CAD

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

Đã gửi 12 October 2009 - 12:14 AM

chủ thớt hình như là dân nước. nếu vậy thì bạn có thể chỉnh dim để tạo dim ghi theo mẫu VD D200-i=0.02-l= xxx trong đó là xxx là chiều dài đoạn thẳng khi bạn ghi chiều dài đoạn thẳng đó như bình thường thì sẽ ra y như mẫu, chiều dài = chiều dai đo. nói thì hơi khó hiểu. có gì ban pm Ym ht33n19586 mình sẽ send cho mẫu.
  • 0

#16 elleHCSC

elleHCSC

    biết lệnh copy

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

Đã gửi 14 October 2009 - 02:13 PM

Các bạn thử xem đồ chơi của "khoai tây" xem nó thế nào nhé :

http://www.asmitools...isps/Talon.html
  • 0
Share for all, all will share !

--------------------
HTTP://WWW.HCSC.VN
HTTP://WWW.HCSC.COM.VN

#17 mhspirit

mhspirit

    biết pan

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

Đã gửi 13 March 2012 - 10:47 AM

Mình sửa lại như sau, tên lệnh đổi lại là ist vì int trùng với intersect của acad. Cao chữ nhập 1 lần, lần sau nếu k muốn đổi thì enter.

(defun c:ist(/ chu os ent obj ndai p1 p2 pm ang caoc)
  (setq	chu (getstring "Chen chu :")
	caoc (getreal (strcat "\nCao chu <" (rtos (getvar "USERR1")) ">:"))
		os (getvar "OSMODE")
	ent (car (entsel "\nChon duong de chen :")))
  (setvar "OSMODE" 0)
  (if (not caoc) (setq caoc (getvar "USERR1")) (setvar "USERR1" caoc))
  (while ent
	(setq obj  (vlax-ename->vla-object ent)
  	ndai (/ (vlax-curve-getDistAtParam obj (vlax-curve-getEndParam obj)) 2)
  	pr   (vlax-curve-getParamAtDist obj ndai)  
  	p1   (vlax-curve-getPointAtParam obj (- pr 0.1))
  	p2   (vlax-curve-getPointAtParam obj (+ pr 0.1))
  	pm   (vlax-curve-getPointAtParam obj pr)
  	ang  (if (< (car p1) (car p2)) (angle p1 p2) (angle p2 p1))
	)
	(command "text" "j" "BC" pm caoc (* 180 (/ ang pi)) chu)
	(setq ent (car (entsel "\nChon duong de chen :")))
  )
  (setvar "OSMODE" os)
)

làm sao viết chữ tiếng việt được đây bạn,thanks
  • 0

#18 Doan Van Ha

Doan Van Ha

    biết lệnh adcenter

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

Đã gửi 13 March 2012 - 01:09 PM

làm sao viết chữ tiếng việt được đây bạn,thanks

Để viết được các câu tiếng Việt:
1). Chọn text sytle có font có thể viết được tiếng Việt.
2). Trong lisp, thay dòng (getstring "Chen chu :") bởi dòng (getstring T "Chen chu :")
  • 2

#19 RNDCE

RNDCE

    Chưa sử dụng CAD

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

Đã gửi 31 May 2014 - 12:52 AM

Gửi bạn Doan Van Ha,

Nhờ bạn chỉnh lại một chút ist.lsp được không:

 Thay vì pick từng line để thêm text, bạn có thể chỉnh để mình quét cửa sổ chọn nhiều đối tượng một lúc rối thêm text cho nhanh hơn không.

Mong phản hồi sớm của bạn.


  • 0

#20 minhtri2701

minhtri2701

    biết vẽ rectang

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

Đã gửi 31 May 2014 - 10:20 AM

bác Doan Van HA xem giúp là líp này sao đánh nhiều chử không được vậy??

 

vd : đánh D20 thì được, nhưng đánh ống pvc D20 lại không được, khi đánh dấu cách thì lisp lại chuyển sang nhập chiều cao chử!!

 

thanks


  • 0