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

Lisp căn lề text: Left, Center, Right và Fit (giống word)

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

@A Tue_NV: vấn đề anh nêu em cũng đã biết ngay trong quá trình viết lisp rồi anh ạ. và đây cũng là chủ đích của em... em có cùng quan điểm với anh Duy, thích sử dụng Dtext hơn là Mtext nên viết code thế này tiện thể covert Mtext về Dtext luôn. Và lisp này viết ra mục đích chủ yếu để áp dụng với Mtext thôi anh ạ.

Cái này cũng do mục đích sử dụng của bạn thôi chứ theo Tue_NV bạn không nên xoá cái Mtext đi mà viết lại cái Text mới thay cho Mtext. Theo mình nghĩ là không nên chút nào. Ví dụ như khi ghi các kí tự đặt biệt hoặc là trình bày các định dạng trong Mtext, bạn có thể nào thiết lập lại cho nó về dáng dấp ban đầu? Không thể được và Tue_NV chỉ đưa ra lời khuyên như thế thôi.

 

Nếu bạn covert Mtext về Dtext mà giữ nguyên được định dạng, dáng dấp của Mtext ban đầu thì Tue_NV OK ngay, chứ covert Mtext về Dtext theo cách xoá cái Mtext đi mà viết lại cái Text mới thay cho Mtext thì Tue_NV khó có thể đồng tình với cách làm của bạn lắm :(

  • 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

@ Tue_nv và TuongTrang: cảm ơn ý kiến đóng góp của các anh.

Đúng như A Tuệ nhận xét, cái này là do tính chất đặc thù của công việc em làm, các đối tượng là text trong bản vẽ mà các chương trình em sử dụng tạo ra gần như hoàn toàn là Dtext. và lisp này chủ yếu định hướng đối tượng là Dtext. Em viết nó ban đầu mục đích cũng chỉ để phục vụ việc sắp xếp căn chỉnh các đối tượng text trong các bảng thống kê một cách nhanh nhất.

Còn với Mtext thì lại là vấn đề hoàn toàn khác... Nếu nhu cầu cần có 1 lisp căn lề cho các đối tượng Mtext thì cách thức căn lề mà em sử dụng cho code này là không phù hợp. Cần fải xây dựng một code khác riêng cho nó để phù hợp hơn với những tính chất riêng của Mtext

 

@Phiphi-: Bạn tìm dòng

(setq kc (getdist "\n Nhap khoang cach giua cac text"))

 

Thay bằng đoạn code này

(if (not kc) (setq kc 1))

(setq kc1 (getdist (strcat"\nNhap khoang cach giua cac text < " (rtos kc 2 2) " >: ")))

(if kc1 (setq kc kc1))

chú ý: bạn có thẻ nhập khoảng cách bằng cách nhập số vào dòng nhắc command hoặc có thể nhập khoảng cách bằng cách pick 2 điểm trên màn hì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
Thêm lệnh DX: sắp xếp text theo hàng ngang (Đưa các text về cùng toạ độ Y, giữ nguyên toạ độ X)

(defun c:ft()
(setq txt (ssget '((0 . "*TEXT"))))
(setq mau (entget (car (entsel "\nChon text chuan"))))
(command "undo" "begin")
(setq oldos (getvar "osmode"))
(setq olcol (getvar "CEColor"))
(setq ollay (getvar "Clayer"))
(setq olstyle (getvar "textstyle"))
(setq TB  (textbox mau) LC  (car TB) RC (cadr TB) di (distance LC RC) i 0)
(setq h (cdr(assoc 40 mau)))
(setq x1 (cdr(assoc 10 mau)))
(setq x2 (list (+ (car x1) (* di 0.5) (* -0.03 h)) (cadr x1)))
(setq x3 (list (+ (car x1) di (* -0.06 h)) (cadr x1)))
(setq canle (cond (canle) ("Left")))
(initget "Left Center Right Fit")
(setq canle (cond ((getkword (strcat "\Vi tri can le [Left/Center/Right/Fit/]<" canle ">"))) (canle)))
(repeat (sslength txt)
(setq txt_ent (entget (ssname txt i)))
(setq txt_val (cdr(assoc 1 txt_ent)))
(setq txt_st (cdr(assoc 7 txt_ent)))
(setq txt_lay (cdr(assoc 8 txt_ent)))
(setq txt_h (cdr(assoc 40 txt_ent)))
(setq txt_fctr (cdr(assoc 41 txt_ent)))
(setq txt_clr (cdr(assoc 62 txt_ent)))
(setq y1 (cdr(assoc 10 txt_ent)))
(if (cdr(assoc 43 txt_ent)) (setq txt_fctr 1 y1 (list (car y1) (- (cadr y1) txt_h))))
(setq pt1 (list (car x1) (cadr y1)))
(setq pt2 (list (car x2) (cadr y1)))
(setq pt3 (list (car x3) (cadr y1)))
(command "-style" txt_st "" "" txt_fctr "" "" "" "" "clayer" txt_lay "color" txt_clr "osmode" 0)
(if (eq canle "Left") (command "text" pt1 txt_h 0 txt_val))
(if (eq canle "Center") (command "text" "C" pt2 txt_h 0 txt_val))
(if (eq canle "Right") (command "text" "R" pt3 txt_h 0 txt_val))
(if (eq canle "Fit") (command "text" "F" pt1 pt3 txt_h txt_val))
(setq i (+ i 1))
(command "color" "bylayer")
);repeat
(setvar "textstyle" olstyle)
(setvar "Clayer" ollay)
(setvar "CECOLOR" olcol)
(setvar "osmode" oldos)
(command "erase" txt "")
(prompt"\n[CAN LE TEXT] by Thaistreetz - huuthais@yahoo.com\n")
(command "undo" "end")
);defun
;====================================================================
;dan deu khoang cach cac hang text theo phuong Y
;====================================================================
(defun ss2ent (ss / sodt index lstent)
(setq 	sodt (if ss (sslength ss) 0)
index 0)
(repeat sodt
(setq 	ent (ssname ss index)
index (1+ index)
lstent (cons ent lstent)
);setq
);repeat
(reverse lstent)
)
(defun c:df()
(setq oldos (getvar "osmode"))
(setq 	ss (ssget '((0 . "*TEXT")))
lst (ss2ent ss)
lst (vl-sort lst '(lambda (e1 e2) (< (cadr (assoc 10 (entget e1))) (cadr (assoc 10 (entget e2))))))
lst (vl-sort lst '(lambda (e1 e2) (> (caddr (assoc 10 (entget e1))) (caddr (assoc 10 (entget e2))))))
);setq
(command "undo" "begin")
(setvar "osmode" 15359)
(setq kc (getdist "\n Nhap khoang cach giua cac text"))
(setq ddau (cdr(assoc 10 (entget(car lst)))) i 0 a2 (ssadd))
(setq mau (entget (car (entsel "\nChon text chuan"))))
(setq ptmau (cdr(assoc 10 mau)))
(setq ym (cadr ptmau))
(foreach e lst
(setq ent (entget e))
(setq dcuoi (cdr(assoc 10 ent)))
(setq yi (cadr dcuoi))
(setq ddauu (list (car dcuoi) (- (cadr ddau) (* i kc))))
(if (= yi ym) (setq ptgoc (list (car dcuoi) (- (cadr ddau) (* i kc)))))
(setvar "osmode" 0)
(command "move" e "" dcuoi ddauu)
(setq 	a2 (ssadd e a2))
(setq i (1+ i))
);foreach
(command "move" a2 "" ptgoc ptmau)
(setvar "osmode" oldos)
(prompt"\n[Paragraph TEXT] by Thaistreetz - huuthais@yahoo.com\n")
(command "undo" "end")
(Princ)
)
;======================================================================
;dan deu khoang cach cac text theo phuong X
;======================================================================
(defun c:dfx()
(setq oldos (getvar "osmode"))
(setq 	ss (ssget '((0 . "*TEXT")))
lst (ss2ent ss)
lst (vl-sort lst '(lambda (e1 e2) (< (cadr (assoc 10 (entget e1))) (cadr (assoc 10 (entget e2))))))
lst (vl-sort lst '(lambda (e1 e2) (> (caddr (assoc 10 (entget e1))) (caddr (assoc 10 (entget e2))))))
);setq
(command "undo" "begin")
(setvar "osmode" 15359)
(setq kc (getdist "\n Nhap khoang cach giua cac text"))

(setq ddau (cdr(assoc 10 (entget(car lst)))) i 0 di 0 a2 (ssadd))
(setq mau (entget (car (entsel "\nChon text chuan"))))
(setq ptmau (cdr(assoc 10 mau)))
(setq xm (car ptmau))
(foreach e lst
(setq ent (entget e))
(setq pti (cdr(assoc 10 ent)))
(setq xi (car pti))
(setq ddauu (list (+ (car ddau) di (* i kc)) (cadr ddau)))
(if (= xi xm) (setq ptgoc (list (+ (car ddau) di (* i kc)) (cadr ddau))))
(setq TBi  (textbox ent) LCi  (car TBi) RCi (cadr TBi) dii (distance LCi RCi) di (+ di dii))
(setvar "osmode" 0)
(command "move" e "" pti ddauu)
(setq 	a2 (ssadd e a2))
(setq i (1+ i))
);foreach
(command "move" a2 "" ptgoc ptmau)
(setvar "osmode" oldos)
(prompt"\n[Dan deu khoang cach TEXT theo phuong ngang] by Thaistreetz - huuthais@yahoo.com\n")
(command "undo" "end")
(Princ)
)
;==================================================================
;Sap xep text thang hang (co cung tung do Y)
;==================================================================
(defun c:dx()
(setq oldos (getvar "osmode"))
(setq txt (ssget '((0 . "TEXT"))))
(command "undo" "begin")
(setq ym (cadr (cdr(assoc 10 (entget (car (entsel "\nChon text chuan")))))) i 0)
(repeat (sslength txt)
(setq txt_pt (cdr(assoc 10 (entget (ssname txt i)))))
(setq ptcuoi (list (car txt_pt) ym))
(setvar "osmode" 0)
(command "move" (ssname txt i) "" txt_pt ptcuoi)
(setq i (+ i 1))
);repeat
(setvar "osmode" oldos)
(prompt"\n[sap xep text thang hang] by Thaistreetz - huuthais@yahoo.com\n")
(command "undo" "end")
(Princ)
)

Cảm ơn bác Thaistreetz rất nhiều. Lisp của bác rất hay. Em muốn hỏi bác một chút là khi em dãn các text theo phương ngang, em rất muốn các text dãn cách theo một giá trị khoảng cách mà mình nhập vào (từ tọa độ của text trước đến tọa độ của text kế tiếp cách nhau một khoảng cách). Nếu mình nhập giá trị khoảng cách hơi nhỏ thì các text có thể trùng đè lên nhau cũng được, miễn là các text dãn khoảng cách đều nhau. Em vướng vào trường hợp này khi vẽ mặt trắc dọc. Bác có thể chỉnh sửa giúp em được không ạ? Vẫn là lisp ft_df_dfx_dx.lsp của bác đó. Cảm ơn bác rất 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
muốn các text dãn cách theo một giá trị khoảng cách mà mình nhập vào (từ tọa độ của text trước đến tọa độ của text kế tiếp cách nhau một khoảng cách). Nếu mình nhập giá trị khoảng cách hơi nhỏ thì các text có thể trùng đè lên nhau cũng được, miễn là các text dãn khoảng cách đều nhau. Em vướng vào trường hợp này khi vẽ mặt trắc dọc.

thực sự thì mình chưa hiểu ý muốn của bạn lắm. bạn up bản vẽ minh họa cụ thể để mình xem đc ko?

  • 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
thực sự thì mình chưa hiểu ý muốn của bạn lắm. bạn up bản vẽ minh họa cụ thể để mình xem đc ko?

File mẫu của em đấy

http://www.4shared.com/file/1j-75KFj/banve.html

Sau khi sắp xếp các text xong thì khoảng cách giữa các text mình có thể điều chỉnh theo ý muốn khi nhập giá trị khoảng cách vào

Mong bác xem và chỉnh sửa giúp. Kính mong thư hồi âm.

Cảm ơn bác 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
http://www.4shared.com/file/1j-75KFj/banve.html

Sau khi sắp xếp các text xong thì khoảng cách giữa các text mình có thể điều chỉnh theo ý muốn khi nhập giá trị khoảng cách vào

Mình không chắc là mình đã hiểu ý của bạn. tuy nhiên bạn thử xóa dòng dưới của lệnh dfx rồi thử chạy xem đã đúng ý của bạn chưa.

(setq TBi (textbox ent) LCi (car TBi) RCi (cadr TBi) dii (distance LCi RCi) di (+ di dii))

  • Vote tăng 2

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 không chắc là mình đã hiểu ý của bạn. tuy nhiên bạn thử xóa dòng dưới của lệnh dfx rồi thử chạy xem đã đúng ý của bạn chưa.

(setq TBi (textbox ent) LCi (car TBi) RCi (cadr TBi) dii (distance LCi RCi) di (+ di dii))

bác hiểu rất đúng ý rồi đấy ạ.

Cảm ơn bác rất 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

Rất cảm ơn bác đã giới thiệu cho lisp hay...nhưng mà sau khi em dùng thử thì thấy có chỗ này hơi thắc mắc chút như thế này về dfx ạ...

-Khi mà các text có cùng 1 tung độ y thì khi giãn đều thep phương ngang, các text sẽ sắp xếp theo đúng thứ tự các text có hoành độ x lớn hơn thì sẽ đứng đắng sau text có x nhỏ hơn

- Khi các text có tung độ y khác nhau thì sau khi giãn đều theo phương ngang, text nào có tung đô y lớn nhất sẽ nhảy lên đứng đầu, các text sau sẽ sắp xếp theo giá trị giảm dần y

 

Mong bác sửa giúp cho em là trong mọi trường hợp, dù các text có giá trị y khác nhau cugnx sẽ giãn đều theo phương ngang đúng theo thứ tự text tăng dần giá trị x như ban đầu. Rất chi là cảm ơn bá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

Bác Thaistreetz ơi! bác có thể giúp em tạo hàm array 1 đối tượng bất kỳ (em dùng đối tượng là bock) trong một vùng kín được không hả bác?

Em đang rất rắc rồi khi gặp phải vấn đề này. Chả là em đang trải mảng cây lúa trong một hình diện tích tương đối phức tạp, em cứ phải delete các cây lúa nằm ngoài vùng rất mỏi tay. Bác có thể nghiên cứu giúp em được không hả bác. Em nghĩ là vấn đề này cũng có rất nhiều người quan tâm. Ngoài ra em còn hỏi bác là em cũng có thể xoá đối tượng có cùng 1 thuộc tính trong một vùng kín được không hả bác (em đã dùng lệnh fiter để lọc ra thuộc tính, khi xoá chỉ cần nhấn nút "p"). Mong bác giúp đỡ. Cảm ơn bác rất 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
Bác Thaistreetz ơi! bác có thể giúp em tạo hàm array 1 đối tượng bất kỳ (em dùng đối tượng là bock) trong một vùng kín được không hả bác?

Em đang rất rắc rồi khi gặp phải vấn đề này. Chả là em đang trải mảng cây lúa trong một hình diện tích tương đối phức tạp, em cứ phải delete các cây lúa nằm ngoài vùng rất mỏi tay. Bác có thể nghiên cứu giúp em được không hả bác. Em nghĩ là vấn đề này cũng có rất nhiều người quan tâm. Ngoài ra em còn hỏi bác là em cũng có thể xoá đối tượng có cùng 1 thuộc tính trong một vùng kín được không hả bác (em đã dùng lệnh fiter để lọc ra thuộc tính, khi xoá chỉ cần nhấn nút "p"). Mong bác giúp đỡ. Cảm ơn bác rất nhiều

Hatch có thể giúp bạn giải quyết vấn đề này. bạn nghiên cứu cách tạo mẫu hatch đi.

thêm nữa, vẫn đề bạn nêu không liên quan gì đến nội dung topic này. bạn nên post nó vào topic khác. "viet lisp theo yêu cầu" chẳng hạn, sẽ nhiều nguời có thể giúp bạn hơ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

@Tieptouch: bạn bỏ dòng này trong lệnh dfx đi là đc

lst (vl-sort lst '(lambda (e1 e2) (> (caddr (assoc 10 (entget e1))) (caddr (assoc 10 (entget e2))))))

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

lisp rất hay, nhưng mình có một góp ý nhỏ thế này

Bác Thaistreetz có thể gộp hết các lệnh trong lisp vào làm 1. khi ta chọn text và text mẫu xong, sẽ hiện ra menu tùy chọn :

- canh lề

- dãn dòng

- sắp xếp.

khi chọn vào menu nào, sẽ hiẹn ra từng menu con(vd: canh lề : tría phải, giữa ...). như thế sẽ giản lược được số lượng tên lệnh cần nhớ, và tiện dụng hơn, lisp có lẽ cũng ngắn gọn hơn.

 

mình mới tập tành nghiên cứu nên chưa đủ khả năng làm, mong được chỉ giáo. Thân ! :D

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 Thaistreetz có thể gộp hết các lệnh trong lisp vào làm 1. khi ta chọn text và text mẫu xong, sẽ hiện ra menu tùy chọn :

- canh lề

- dãn dòng

- sắp xếp.

khi chọn vào menu nào, sẽ hiẹn ra từng menu con(vd: canh lề : tría phải, giữa ...). như thế sẽ giản lược được số lượng tên lệnh cần nhớ, và tiện dụng hơn, lisp có lẽ cũng ngắn gọn hơn.

Minh không sửa đâu. vì làm như bạn sẽ mất quá nhiều bước để thực hiện xong 1 lệnh, mất nhiều thời gian làm việc. bản thân lisp này cũng đã quá dài dòng rồi. thực tế làm việc rồi bạn sẽ thấy

ps: code của mình nhưng bạn nào sửa được theo nhu cầu của người của mọi người thì cứ sửa và post thoải mái, tất cả đều public. mình thực sự không thích cái sự cả nể, khách sáo vẫn đang tồn tại trên diễn đàn này. đặc biệt là trong cái box autolisp.

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ạn sửa lỗi này hộ mình với. Dùng lệnh căn lề text ft, df, dfx toàn bị lỗi, Bản vẽ đi kèm đây bạn. co gì PM minh theo mail thaihoang.xdct@gmail.com hoặc nick yahoo:thaihoang.xdct. hoặc nhắn tin cho mình theo số 0914888478 minh đt lại.http://www.mediafire.com/?3al9cc0am1cou05

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ạn sửa lỗi này hộ mình với. Dùng lệnh căn lề text ft, df, dfx toàn bị lỗi, Bản vẽ đi kèm đây bạn. co gì PM minh theo mail thaihoang.xdct@gmail.com hoặc nick yahoo:thaihoang.xdct. hoặc nhắn tin cho mình theo số 0914888478 minh đt lại.http://www.mediafire...3al9cc0am1cou05

Khi chọn đối tượng chuẩn thì bạn chọn TEXT, chứ không thể chọn MTEXT.

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

Trước đây mình có thấy trong diễn đàn đã cung cấp công cụ căn lề text theo 3 kiểu Left, Center, Right. Tuy nhiên công cụ này ko viết bằng autolisp và chỉ chạy được các bản cad 2004, 2005 và 2006 nên mình viết một lisp tương tự để chạy được trên tất cả các bản cad.

- Lisp yêu cầu chọn tất cả các text (Dtext va MText) cần căn lề.

- Chọn một text làm chuẩn để căn lề các text đã chọn theo text đó

- Ngoài chức năng căn lề theo 3 vị trí. Left, Center, Right thì lisp này cung cấp thêm chức năng căn lề theo kiểu Fit, - kéo dãn các dòng cho dài bằng nhau (giống word) và dài bằng text chọn làm chuẩn.

canletxt.jpg

(defun c:ft()(command "undo" "begin")(setq oldos (getvar "osmode"))(setq olcol (getvar "CEColor"))(setq olstyle (getvar "textstyle"))(prompt "\nchon cac text can can le ...")(setq txt (ssget '((0 . "*TEXT"))))(setq mau (entget (car (entsel "\nChon text chuan"))))(setq TB  (textbox mau) LC  (car TB) RC (cadr TB) di (distance LC RC) i 0)(setq x1 (cdr(assoc 10 mau)))(setq x2 (list (+ (car x1) (* di 0.5)) (cadr x1)))(setq x3 (list (+ (car x1) di) (cadr x1)))(setq canle (cond (canle) ("Left")))(initget "Left Center Right Fit")(setq canle (cond ((getkword (strcat "\Vi tri can le [Left/Center/Right/Fit/]<" canle ">"))) (canle)))(repeat (sslength txt)(setq txt_ent (entget (ssname txt i)))(setq txt_val (cdr(assoc 1 txt_ent)))(setq txt_st (cdr(assoc 7 txt_ent)))(setq txt_lay (cdr(assoc 8 txt_ent)))(setq txt_h (cdr(assoc 40 txt_ent)))(setq txt_fctr (cdr(assoc 41 txt_ent)))(setq txt_clr (cdr(assoc 62 txt_ent)))(setq y1 (cdr(assoc 10 txt_ent)))(if (cdr(assoc 43 txt_ent)) (setq txt_fctr 1 y1 (list (car y1) (- (cadr y1) txt_h))))(setq pt1 (list (car x1) (cadr y1)))(setq pt2 (list (car x2) (cadr y1)))(setq pt3 (list (car x3) (cadr y1)))(command "-style" txt_st "" "" txt_fctr "" "" "" "" "clayer" txt_lay "color" txt_clr "osmode" 0)(if (eq canle "Left") (command "text" pt1 txt_h 0 txt_val))(if (eq canle "Center") (command "text" "C" pt2 txt_h 0 txt_val))(if (eq canle "Right") (command "text" "R" pt3 txt_h 0 txt_val))(if (eq canle "Fit") (command "text" "F" pt1 pt3 txt_h txt_val))(setq i (+ i 1))(command "color" "bylayer"));repeat(setvar "textstyle" olstyle)(setvar "CECOLOR" olcol)(setvar "osmode" oldos)(command "erase" txt "")(prompt"\n[CAN LE TEXT] by Thaistreetz - huuthais@yahoo.com\n")(command "undo" "end"));defun

Hiện tại thì mình đã khá hài lòng với lisp này nếu chỉ dùng để căn lề text. Tuy nhiên mình muốn thêm cho nó chức năng giãn dòng cho đều cũng với cách nhập số liệu như trên nhưng đang mắc về thuật giải. Xin nhờ mọi người giúp mình hoàn thiện lisp này với.

 

Edit: đã fix lỗi

 

Bạn ơi cho hỏi mình sử dụng lệnh ft để canh các text cùng toạ độ X, canh lề trái mà sao khi thực hiện, các text biến thành số 0 và bị lệnh góc so với phương X. mình đang cần sử dụng chức năng này, bạn có thể trả lời email cho mình ko? <locxd78@gmail.com>. Thanks

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ạn ơi cho hỏi mình sử dụng lệnh ft để canh các text cùng toạ độ X, canh lề trái mà sao khi thực hiện, các text biến thành số 0 và bị lệnh góc so với phương X. mình đang cần sử dụng chức năng này, bạn có thể trả lời email cho mình ko? <locxd78@gmail.com>. Thanks

 

 

Xin lỗi, mình mới cập nhật lisp của bạn ở trang 2, sử dụng tốt lắm, bây giờ mọi chuyện trở nên dễ dàng rồi, cám ơn nhiều nha.

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ảm ơn bạn vì bản vẽ này giúp mình fát hiện ra 4 điểm còn thiếu sót có thể dẫn đến việc lisp không chạy ra kết quả theo ý muốn. 4 điểm đó gồm:

1. Phải thiết lập UCS với giá trị world (như anh Duy đã nói)

2. Phải thiết lập Angbase về giá trị 0

3. Style của các text phải để heigh text có giá trị mặc định là 0.

4. Tất cả các text cần canh lề không được để ở chế độ màu là byblock

Đây là code mình đã sửa lại để phù hợp với những bản vẽ không được thiết lập các điều kiện như 3 điều kiện đầu tiên. vì thời gian này mình bận quá nên ko có thời gian nghiên cứu sửa nốt điều kiện thứ 4. (nó cũng tương đối ít gặp) nên bạn trước khi sử dụng bạn chỉ cần đổi lại màu text khác màu byblock là OK ko vấn đề gì. Nhờ các bác trên diễn đàn sửa nốt giúp mình phần này vậy.

(defun c:ft()(setq txt (ssget '((0 . "*TEXT"))))(setq mau (entget (car (entsel "\nChon text chuan"))))(command "undo" "begin")(setq oldos (getvar "osmode"))(setq olcol (getvar "CEColor"))(setq ollay (getvar "Clayer"))(setq olstyle (getvar "textstyle"))(setq TB  (textbox mau) LC  (car TB) RC (cadr TB) di (distance LC RC) i 0)(setq h (cdr(assoc 40 mau)))(setq x1 (cdr(assoc 10 mau)))(setq x2 (list (+ (car x1) (* di 0.5) (* -0.03 h)) (cadr x1)))(setq x3 (list (+ (car x1) di (* -0.06 h)) (cadr x1)))(setq canle (cond (canle) ("Left")))(initget "Left Center Right Fit")(setq canle (cond ((getkword (strcat "\Vi tri can le [Left/Center/Right/Fit/]<" canle ">"))) (canle)))(setq oldang (getvar "Angbase"))(command "angbase" 0 "ucs" "w")(repeat (sslength txt)(setq txt_ent (entget (ssname txt i)))(setq txt_val (cdr(assoc 1 txt_ent)))(setq txt_st (cdr(assoc 7 txt_ent)))(setq txt_lay (cdr(assoc 8 txt_ent)))(setq txt_h (cdr(assoc 40 txt_ent)))(setq txt_fctr (cdr(assoc 41 txt_ent)))(setq txt_clr (cdr(assoc 62 txt_ent)))(setq y1 (cdr(assoc 10 txt_ent)))(if (cdr(assoc 43 txt_ent)) (setq txt_fctr 1 y1 (list (car y1) (- (cadr y1) txt_h))))(setq pt1 (list (car x1) (cadr y1)))(setq pt2 (list (car x2) (cadr y1)))(setq pt3 (list (car x3) (cadr y1)))(command "-style" txt_st "" 0 txt_fctr "" "" "" "" "clayer" txt_lay "color" txt_clr "osmode" 0)(if (eq canle "Left") (command "text" pt1 txt_h 0 txt_val))(if (eq canle "Center") (command "text" "C" pt2 txt_h 0 txt_val))(if (eq canle "Right") (command "text" "R" pt3 txt_h 0 txt_val))(if (eq canle "Fit") (command "text" "F" pt1 pt3 txt_h txt_val))(setq i (+ i 1))(command "color" "bylayer"));repeat(command "ucs" "p")(setvar "textstyle" olstyle)(setvar "angbase" oldang)(setvar "Clayer" ollay)(setvar "CECOLOR" olcol)(setvar "osmode" oldos)(command "erase" txt "")(prompt"\n[CAN LE TEXT] by Thaistreetz - huuthais@yahoo.com\n")(command "undo" "end"));defun;=================================================================;dan deu khoang cach cac hang text theo phuong Y;=================================================================(defun ss2ent (ss / sodt index lstent)(setq 	sodt (if ss (sslength ss) 0)	index 0)(repeat sodt(setq 	ent (ssname ss index)	index (1+ index)	lstent (cons ent lstent));setq);repeat(reverse lstent))(defun c:df()(setq oldos (getvar "osmode"))(setq 	ss (ssget '((0 . "*TEXT")))	lst (ss2ent ss)	lst (vl-sort lst '(lambda (e1 e2) (< (cadr (assoc 10 (entget e1))) (cadr (assoc 10 (entget e2))))))	lst (vl-sort lst '(lambda (e1 e2) (> (caddr (assoc 10 (entget e1))) (caddr (assoc 10 (entget e2)))))));setq(command "undo" "begin")(setvar "osmode" 15359)(setq kc (getdist "\n Nhap khoang cach giua cac text"))(setq ddau (cdr(assoc 10 (entget(car lst)))) i 0 a2 (ssadd))(setq mau (entget (car (entsel "\nChon text chuan"))))(setq ptmau (cdr(assoc 10 mau)))(setq ym (cadr ptmau))(foreach e lst(setq ent (entget e))(setq dcuoi (cdr(assoc 10 ent)))(setq yi (cadr dcuoi))(setq ddauu (list (car dcuoi) (- (cadr ddau) (* i kc))))(if (= yi ym) (setq ptgoc (list (car dcuoi) (- (cadr ddau) (* i kc)))))(setvar "osmode" 0)(command "move" e "" dcuoi ddauu)(setq 	a2 (ssadd e a2))(setq i (1+ i)));foreach(command "move" a2 "" ptgoc ptmau)(setvar "osmode" oldos)(prompt"\n[Paragraph TEXT] by Thaistreetz - huuthais@yahoo.com\n")(command "undo" "end")(Princ));=========================================================================;dan deu khoang cach cac text theo phuong X;=========================================================================(defun c:dfx()(setq oldos (getvar "osmode"))(setq 	ss (ssget '((0 . "*TEXT")))	lst (ss2ent ss)	lst (vl-sort lst '(lambda (e1 e2) (< (cadr (assoc 10 (entget e1))) (cadr (assoc 10 (entget e2))))))	lst (vl-sort lst '(lambda (e1 e2) (> (caddr (assoc 10 (entget e1))) (caddr (assoc 10 (entget e2)))))));setq(command "undo" "begin")(setvar "osmode" 15359)(setq kc (getdist "\n Nhap khoang cach giua cac text"))(setq ddau (cdr(assoc 10 (entget(car lst)))) i 0 di 0 a2 (ssadd))(setq mau (entget (car (entsel "\nChon text chuan"))))(setq ptmau (cdr(assoc 10 mau)))(setq xm (car ptmau))(foreach e lst(setq ent (entget e))(setq pti (cdr(assoc 10 ent)))(setq xi (car pti))(setq ddauu (list (+ (car ddau) di (* i kc)) (cadr ddau)))(if (= xi xm) (setq ptgoc (list (+ (car ddau) di (* i kc)) (cadr ddau))))(setq TBi  (textbox ent) LCi  (car TBi) RCi (cadr TBi) dii (distance LCi RCi) di (+ di dii))(setvar "osmode" 0)(command "move" e "" pti ddauu)(setq 	a2 (ssadd e a2))(setq i (1+ i)));foreach(command "move" a2 "" ptgoc ptmau)(setvar "osmode" oldos)(prompt"\n[Dan deu khoang cach TEXT theo phuong ngang] by Thaistreetz - huuthais@yahoo.com\n")(command "undo" "end")(Princ));========================================================================;Sap xep text thang hang (co cung tung do Y);========================================================================(defun c:dx()(setq oldos (getvar "osmode"))(setq txt (ssget '((0 . "TEXT"))))(command "undo" "begin")(setq ym (cadr (cdr(assoc 10 (entget (car (entsel "\nChon text chuan")))))) i 0)(repeat (sslength txt)(setq txt_pt (cdr(assoc 10 (entget (ssname txt i)))))(setq ptcuoi (list (car txt_pt) ym))(setvar "osmode" 0)(command "move" (ssname txt i) "" txt_pt ptcuoi)(setq i (+ i 1)));repeat(setvar "osmode" oldos)(prompt"\n[sap xep text thang hang] by Thaistreetz - huuthais@yahoo.com\n")(command "undo" "end")(Princ))

@A Tue_NV: vấn đề anh nêu em cũng đã biết ngay trong quá trình viết lisp rồi anh ạ. và đây cũng là chủ đích của em... em có cùng quan điểm với anh Duy, thích sử dụng Dtext hơn là Mtext nên viết code thế này tiện thể covert Mtext về Dtext luôn. Và lisp này viết ra mục đích chủ yếu để áp dụng với Mtext thôi anh ạ.

 

@TuongTrang: Mình cũng đang xài cad2010 và mình vẫn chạy được lisp này như thường. bạn hứng thú thì cứ test bét nhè chè đỗ đen đi, ko vấn đề gì sất <_< .

Về câu hỏi của bạn... Đúng là Mtext đã hỗ trợ các kiểu canh lề từ ngay từ ngày ... Mtext đc sinh ra, cái này thì ai cũng biết. còn với Dtext, mỗi text là một đối tượng riêng lẻ nên theo như hiểu biết của mình thì Cad không có lệnh nào để canh lề cho các đối tượng Dtext riêng lẻ này. cũng chính vì thế nên mình mới viết lisp này để canh lề cho Dtext.

Mình cũng đang hiểu câu hỏi của bạn theo một hướng khác, hình như bạn đang muốn đề cập đến vấn đề convert tất cả các đối tượng Dtext được chọn trở lại Mtext và canh lề cho các dòng trong Mtext mới được tạo ra. Cái này mình chưa làm được và có lẽ mình cũng không muốn làm... vì nhu cầu này hình như rất ít người cần và cũng một fần vì chủ quan của mình, dù thế nào thì mình cũng thích dùng Dtext hơn trong mọi trường hợp.

 

Lisp bạn viết rất hay nhưng lệnh DX dùng để gom tất cả các text vào 1 text được chọn thì mình thấy không cần thiết, cũng có thể mình không hiểu ý đồ của bạn vậy mình muốn bạn sửa lệnh DX hoặc thêm 1 lệnh mới có tác dụng căn đều từng text theo môi trường của nó được không ( ví dụ: căn text vào chính giữa hình tròn, hình đa giác...). Thanks :D

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 xin cảm ơn các Bác.

Mình sử dụng và thấy có vấn đề này không biết đó là hạn chế của lisp hay do mình bị lỗi gì không biết.

Khi căn lề theo dạng FiT thì nếu Dtext nào có ít chữ thì nó sẽ fit cho đều.

Tuy nhiên những Dtex này khi dãn ra cho đều thì kích thước chữ sẽ to hơn những hàng Dtext khác.

(Chiều cao text không đổi nhưng nhìn thì thấy text lớn hơn ban đầu)

(file em đính kèm)http://www.cadviet.com/upfiles/3/104866_gui.rar

Như vậy em thấy rất xấu. Em không hiểu về thuật toán lắm nhưng theo em nghĩ thì mình viết code sau cho nếu chiều dài của dòng Dtext đó quá ngắn thì mình sẽ không dãn text hàng đó. Nghĩa là mình khống chế khoảng cách dãn text giữa các từ trong 1 câu Dtext là 1 khoảng nhất định nào đó (khoảng này mình nhìn sao cho đẹp là được). Nếu khi khoảng cách giữa các "từ" trong 1 hàng Dtext dãn ra tới khoảng cách tối đa mình quy ước ở trên mà hàng Dtext này chưa fit được tới khoảng cách lề phải và lề trái thì hàng Dtext này không phải canh nữa.(Giống trong word). Theo em nghĩ như vậy sẽ rất đẹp.

Không biết em nói vậy có gì sai không. Nếu có mong anh em bỏ qua vì mình không hiểu về thuật toán trong lisp nên có thể phát biểu không đúng.

Rất mong các Bác xem thử

Em xin chân thành 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

Bản chất của từ Fit là co kéo sao cho vừa 1 khoảng định trước. Trong CAD này thì co kéo chính cái Width Factor. Chữ ngắn quá thì nó cho width lớn lên, cái bụng cũng to ra để chiếm hết khoảng đã định, chữ dài quá thì nó hít bụng lại.

=> Hy vọng bạn đã hiểu nguyên do ^^

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

×