Chuyển đến nội dung
Diễn đàn CADViet
Đăng nhập để thực hiện theo  
dauquangminh

[Yêu cầu]Lisp dãn cách các text đè lên nhau với khoảng cách cho trước

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

Em cũng đã search trên forum thấy có 1 lisp gần giống như vầy nhưng không đúng ý em, nên nhờ các bác viết giúp lisp ạ:

 

dantext2.jpg

 

em có nhiều cụm text đè lên nhau (ví dụ 2 cụm) là 100,200,300,400,500 và 200,300,400,500,600

sau đó dùng lisp chọn nhiều cụm text (ở ví dụ này là 2 cụm) rồi pick 1 điểm bất kỳ (ví dụ điểm A)

thì các text trong các cụm này sẽ dãn cách nhau theo phương ngang với khoảng cách a cho trước

Lưu ý là:

- các text đầu tiên (100 ở cụm trên và 200 ở cụm dưới) sẽ di chuyển về vị trí sát ngay đường gióng thẳng đứng đi qua A như hình vẽ, text tiếp theo sẽ cách text đầu tiên 1 khoảng cách a cho trước

- các text trong cụm không thay đổi thứ tự của nó (ví dụ text 100 ở bên phải gần nhất so với A theo phương ngang thì nó sẽ nằm đầu tiên, text 200 nằm xa hơn 1 ít thì nằm thứ 2...)

 

Cảm ơn các 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

Lisp này không biết đúng ý bạn không? Lệnh tắt là CLT

;; free lisp from cadviet.com
;;; this lisp was downloaded from http://www.cadviet.com/forum/index.php?showtopic=48658
;Sap xep cac dong text deu nhau theo 1 kieu canh le, lay text goc lam chuan.
(defun c:CLT ( / oldos lst1 ss ki ki0 ki1 ki2 lst ddau dcuoi eget)
 (setq oldos (getvar "osmode")) (setvar "osmode" 0)
 (prompt "Chon nhom Text: ")
 (setq ss (ssget '((0 . "TEXT"))))
 (if (not tyledong) (setq tyledong 1.5))    
 (setq tyledong1 (getreal (strcat "\nVao ty le dong khoang cach dong <" (rtos tyledong 2 2) ">: ")))    
 (if tyledong1 (setq tyledong tyledong1))
 (setq lst1 '(("L" 0 0) ("C" 1 0) ("R" 2 0)))
 (initget 1 "C L R")
 (setq ki (getkword "Enter an option [Center/Left/Right]: "))
 (setq tch (car (entsel "Chon Text chuan: ")))
 (if (= 0 (cdr (assoc 72 (entget tch))))
 	(setq vt (cdr (assoc 10 (entget tch))))
 	(setq vt (cdr (assoc 11 (entget tch)))))
 (setq    ki1 (cadr (setq ki0 (assoc ki lst1)))
   	ki2 (last ki0)
   	lst (vl-remove-if 'listp (mapcar 'cadr (ssnamex ss)))
   lst (vl-sort lst '(lambda (e1 e2) (> (caddr (assoc 10 (entget e1))) (caddr (assoc 10 (entget e2))))))    
   linespc (* (cdr (assoc 40 (entget (car lst)))) tyledong)
   yht (+ (* linespc (- (length lst) (length (member tch lst)) -1)) (cadr vt)))
 (command "undo" "begin")
 (foreach e lst
  (setq eget (entget e)
	dtiep (list (car vt) (setq yht (- yht linespc)) 0)
	eget (subst (cons 72 ki1) (assoc 72 eget) eget)
	eget (subst (cons 73 ki2) (assoc 73 eget) eget)
	eget (if (and (zerop ki1) (zerop ki2))
             	(subst (cons 10 dtiep) (assoc 10 eget) eget)
         (subst (cons 11 dtiep) (assoc 11 eget) eget)))
 (entmod eget))
(command "undo" "end")
(setvar "osmode" oldos)
(princ))

  • 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

không được bạn ơi, lisp này dãn theo phương thẳng đứng mà, vả lại một số không đúng như hình vẽ mình yêu cầu

Hề hề hề,

Muốn đứng hay nằm thì phải post cái bản vẽ của bạn lên. Có vậy mới hy vọng có lisp đúng với yêu cầu của bạn. Với cái hình bạn post chả ai biết đối tượng text của bạn là cái thứ chi chi, text hay mtext???, chúng được sắp xếp theo kiểu chi, đứng hay nằm hay xiên hay sẹo??? Có trật tự hay mất trật tự ........Việc dãn dòng chỉ cần theo phương đứng hay theo mọi phương?????

Tóm lại là nếu không có bản vẽ thì hãy đợi đó??? Hoặc là bạn tìm cách tự sửa cái lisp clt mà dùng.

Hề hề hề,...

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 dùng thử lisp này coi đã ưng ý chưa nhé.

Thực tế khi kiểm tra bản vẽ của bạn thì thấy các Text được sắp xếp khá lộn xộn, không theo một chuẩn mực nào cả.

Mình làm cái lisp này có nhẽ chỉ nhằm thỏa mãn cai yêu cầu cụ thể riên cho cái bản vẽ bạn gửi mà thôi. trường hợp bạn áp dụng với cái bản vẽ khác thì sẽ có nhiều điều phải bàn.

Cụ thể:

Theo yêu cầu là sắp xếp text theo thứ tự điểm đặt text thì chỉ có với nhóm thứ hai là đùng, còn ở nhóm 1 thì sai tòe loe. Lý do là bạn dùng việc căn chỉnh text tùm lum nên nhì trên bản vẽ thì text 400 nằm sau cùng như theo mã định hình text thì text này lại có điểm đặt trước text 300 . Tương tự text 200 sẽ có điểm đặt trước text 100.

Vì thế để cho có kết quả giống như hình kết quả mà bạn gửi lên mình phải dựa vào giá trị số của text để làm. Như vậy nếu với các text không phải giá trị số thì việc sắp xếp này sẽ là vô nghĩa.

Sau khi lisp chạy thì mình đã chuyển toàn bộ các text về dạnh canh lề là BL (bottom left). Điều này để đảm bảo cho các text trông ngay ngắn và đẹp như yêu cầu bạn đã gửi, nhưng lại làm thay đổi cấu trúc ban đầu của chúng.

Hy vọng rằng qua cái lisp này bạn sẽ hiểu và biết cách tổ chức cái bản vẽ của bạn hợp lý hơn để thuận tiện cho việc áp dụng lisp khi cần thiết, Đồng thời nó cũng tốt cho việc hoàn thiện kỹ năng CAD của bạn.

Trong trường hợp gặp khó khăn khi sử dụng cái lisp này, bạn hãy post lên kèm với bản vẽ cần dùng nó, mình sẽ xem xét và chỉnh sửa lại cho phù hợp.



(defun c:dkctd (/ oldos p d enlst i ht ans)
(vl-load-com)

(setq oldos (getvar "osmode"))
(setvar "osmode" 0)
(setq p (getpoint "\n Chon diem chuan ")
       d (getreal "\n Nhap khoang cach chuan: ") )
(prompt "\n Chon nhom text can sap xep")
(setq  enlst (acet-ss-to-list (ssget (list (cons 0 "text") (cons 8 "DienTKTN") (cons 62 2)))))
(while enlst
      (command "undo" "be")
  	(setq i 0)
  	(setq enlst (vl-sort enlst '(lambda (x y) (< (atof (cdr (assoc 1 (entget x)))) (atof (cdr (assoc 1 (entget y))))))))
  	(foreach en enlst
           (setq encode (entget en)
                   ht (cdr (assoc 40 encode))
                   encode (subst (cons 11 (list (+ (+ (car p) ht) (* i (+ d ht))) (caddr (assoc 11 encode)))) (assoc 11 encode) encode)
                   encode (subst (cons 72 0) (assoc 72 encode) encode)
                   encode (subst (cons 73 1) (assoc 73 encode) encode)
                   i (1+ i)
        	)
        	(entmod encode)
       )
       (setq ans (getstring "\n Ban muon tiep tuc chinh text <Y or N> : "))
       (if (= (strcase ans) "Y")
           (progn
            	(prompt "\n Hay chon nhom text can sap xep tiep theo")
            	(setq enlst (acet-ss-to-list (ssget (list (cons 0 "text") (cons 8 "DienTKTN") (cons 62 2)))))
           )
           (setq enlst nil)
       )
       (command "undo" "e")
)
(setvar "osmode" oldos)

(princ)
)            


 

Bạn lưu ý là trong lisp này thay vì bạn yêu cầu phải chọn hai nhóm đối tượng một lúc mình đã giải quyết là chọn lần lượt từng nhóm text. Bởi vì theo mình nghĩ làm như vậy tuy không đúng như yêu cầu của bạn nhưng lại hợp lý hơn. Do hàm ssget trong lisp cho phép chọn từng bộ chọn một chứ không thể chọn một lần được nhiều bộ chọn. Để có thể có nhiều bộ chọn bắt buộc bạn phải chọn nhiều lần mà thôi. Nếu chọn nhiều lần rồi chỉnh một lần thì vẫn phải qua các bước lặp mà thực tế khi sử dụng nếu nhỡ tay chọn nhầm sẽ phải làm lại từ đầu. trong khi theo cách mà mình nghĩ thì bạn có thể chọn lần lượt từng bộ chọn và để cho lisp hoàn thành công việc chỉnh này, bạn hoàn toàn có thể kiểm tra được kết quả của lisp và có thể dừng ở bất cứ đâu khi bạn cần và bạn có thể chọn bao nhiêu bộ chọn là tùy bạn chứ không nhất thiết chỉ là hai.

 

Chúc bạn vui

  • 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

cảm ơn bác phamthanhbinh, em vẫn còn một số khúc mắc ạ, hy vọng không gây phiền cho bác ạ.

dantext3.jpg

 

Nay em gửi file acad lên để bác tư vấn giúp ạ:

file đây ạ: http://www.mediafire.com/?1e1t5e52o508anr

 

thứ 2 là sao lisp không chọn được các text trong file acad "ko chon duoc text.dwg" này nhỉ, hay là text trong file này của em có vấn đề, file đây ạ:

http://www.mediafire.com/?o1n88i92k1hiz8j

 

cảm ơn bác binh

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

 

Nay em gửi file acad lên để bác tư vấn giúp ạ:

file đây ạ: http://www.mediafire...1e1t5e52o508anr

 

thứ 2 là sao lisp không chọn được các text trong file acad "ko chon duoc text.dwg" này nhỉ, hay là text trong file này của em có vấn đề, file đây ạ:

http://www.mediafire...o1n88i92k1hiz8j

 

cảm ơn bác binh

Hề hề hề,

Vậy là do bạn không đọc kỹ bài post cũng như cái lisp mình gửi rồi. Hoặc bạn đã đọc mà không hiểu. Mình xin nói lại một lần nữa và hướng dẫn bạn cách khắc phục các vấn đề mà bạn đã nêu ra bằng cách chỉnh sửa lại lisp để nó phù hợp với yêu cầu của bạn ở các bản vẽ cụ thể của bạn

1/- Không thể có chuyện mất hết truy bắt điểm như bạn nói vì mình đã trả biến hệ thống osmode về giá trị ban đầu của nó ở cuối lisp rồi. Cụ thể đó là dòng code (setvar "osmode" oldos).

Thực tế mình kiểm tra bản vẽ nguyên thủy của bạn thì cái biến hệ thống osmode của bạn đang đặt là 0. Có nghĩa là tất cả các truy bắt điểm được trả về mo rùi.

Nếu bạn không tin thì có thể kiểm tra như sau: Trước và sau khi chạy lisp đều gõ lệnh (getvar "osmode") trên dòng command và enter để kiểm tra giá trị này. Nếu nó bằng nhau thì lisp không sai mà là bản vẽ của bạn đã đặt chế độ osnap khác với cái bạn muốn.

2/- Để làm điều này không khó. Bạn có thể tự làm như sau:

Sửa đoạn code tương ứng trong lisp cũ thành:

;;; (setq ans (getstring "\n Ban muon tiep tuc chinh text <Y or N> : "))

;;; (if (= (strcase ans) "Y")

;;; (progn

(prompt "\n Hay chon nhom text can sap xep tiep theo")

(setq enlst (acet-ss-to-list (ssget (list (cons 0 "text") (cons 8 "DienTKTN") (cons 62 2)))))

;;; )

;;; (setq enlst nil)

;;; )

 

Chú ý là các dòng code có các dấu ( ; ) ở đầu là đã bị vô hiệu hóa rồi. Các dòng code khác vẫn giữ nguyên.

Tuy nhiên việc này có thể gây nhầm lẫn trong quá trinh bạn sử dụng lisp sau này. Tùy bạn chọn cách làm nhưng theo mình thì nên giữ nguyên vì như vậy mỗi lần chạy xong một nhóm bạn có quyền kiểm tra và quyết định tiếp tục hay không.

 

3/- Đây là vấn đề do sự không thống nhất về định dạng căn chỉnh text của bạn mà ra. Điều này mình đã cảnh báo bạn khi gửi lisp cho bạn rồi.

Ở trong lisp mình gửi, các text kết quả được sắp xếp theo giá trị số của nó từ nhỏ tới lớn. Vì vậy nó phù hợp với bản vẽ đầu tiên bạn gửi.

Còn ở bản vẽ thứ hai thì nó không còn phù hợp nữa do lúc này cái trật tự bạn cần không phải là trật tự này nữa. Theo như mình hiểu thì lúc này trật tự bạn cần chính là vị trí đặt nguyên thủy của text

Như vậy bạn sẽ phải đổi lại hàm so sánh (< (atof (cdr (assoc 1 (entget x)))) (atof (cdr (assoc 1 (entget y))))) thành (< (cadr (assoc 11 (entget x))) (cadr (assoc 11 (entget y))))

 

Tuy nhiên ngay cả khi bạn đã sửa như vầy vẫn có thể cho kết quả sai với mong muốn của bạn do cái định dạng căn text của bạn quá lôm côm , không thống nhất trên các bản vẽ.

Nếu bạn muốn cho nó chạy thật chuẩn thì các định dạng căn chỉnh text này của bạn phải thống nhất trên tất cả các bản vẽ mới được.

 

Mình cung cấp cho bạn hai cách sắp xếp text như vầy để bạn tự lực chọn lấy cách dùng phù hợp cho từng bản vẽ. Có thể bạn sẽ phải kết hợp cả hai cách sắp xếp này để có được kết quả như ý.

4/- Việc text nhảy lên một khúc là do trong lisp mình đã định dạng căn text là BL (bottom left) trong khi text của bạn lại được định dạng là khá lung tung.

Nếu bạn muốn thì phải thay đổi lại cái định dạng trong lisp như sau: thay (cons 72 0) bằng (cons 72 1) chẳng hạn rồi test lại.

5/- Cuối cùng cái bản vẽ bạn không chọn được text là do cái bộ chọn khi chọn các đối tượng. Trong lisp của mình sử dụng bộ chọn :

(list (cons 0 "text") (cons 8 "DienTKTN") (cons 62 2)) nghĩa là các đối tượng text thuộc layer DienTKTN và có màu là vàng.

Bạn hãy dựa vào đây để thay thế bộ lọc cho phù hợp với bản vẽ của bạn.

Thí dụ bạn muốn chọn text cùng lớp trên nhưng có màu green thì thay (cons 62 2) bằng (cons 62 3). Và tương tự vậy đối với layer.

 

Hề hề hề,

Chúc bạn vui và thành công.

  • 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

Quả thực lisp này của phamthanhbinh rất hay. Nhưng có thể chỉnh theo hướng như sau không:

- Không phải chọn điểm chuẩn mà lisp tự lấy 1 text làm chuẩn sau đó tự giãn sang 2 bên.

- Xử lý cho toàn bộ bản vẽ để giãn chứ không phải chọn nhóm text

Thâ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

Quả thực lisp này của phamthanhbinh rất hay. Nhưng có thể chỉnh theo hướng như sau không:

- Không phải chọn điểm chuẩn mà lisp tự lấy 1 text làm chuẩn sau đó tự giãn sang 2 bên.

- Xử lý cho toàn bộ bản vẽ để giãn chứ không phải chọn nhóm text

Thân !

Ý tưởng 1 tốt :)

  • 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

Quả thực lisp này của phamthanhbinh rất hay. Nhưng có thể chỉnh theo hướng như sau không:

- Không phải chọn điểm chuẩn mà lisp tự lấy 1 text làm chuẩn sau đó tự giãn sang 2 bên.

- Xử lý cho toàn bộ bản vẽ để giãn chứ không phải chọn nhóm text

Thân !

Cái này Tue_NV đã viết trên diễn đàn mình rồi. Bạn chịu khó tìm kiếm thử.

Khi viết mình đã lấy Text đầu và cuối của bộ Chọn Text -> Tính toán ra điểm giữa và giãn ra 2 bên tính từ điểm giữa đó

- Xử lý toàn bộ e là không có cách. Chỉ có cách là chọn hết cụm này đến cụm khác rồi Lisp xử lý 1 loạt 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

Xử lý toàn bộ bản vẽ nó không thực tế ấy chứ ạ ^^ Vì trong bản vẽ đâu chỉ có những nhóm text thực hiện 1 chức năng :)

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

Xử lý toàn bộ bản vẽ nó không thực tế ấy chứ ạ ^^ Vì trong bản vẽ đâu chỉ có những nhóm text thực hiện 1 chức năng :)

Hề hề hề,

Thực ra thì việc giãn text này đã có khá nhiều lisp rồi. Có người giãn theo kiểu chọn textbox, có người giãn theo cách chọn điểm chèn....

Có người giãn theo cách move text cũ, có người giãn theo cách modify text cũ......

Việc chọn điểm đặt của text đầu tiên hay lấy điểm đặt của text đầu tiên hay chọn một điểm trung gian nào đó chỉ là các yêu cầu cụ thể để giải quyết bài toán mà thôi. Không quá khó để thực hiện

Việc mình viết lisp vừa rồi là theo yêu cầu của chủ thớt, Do các file của chủ thớt có các định dạng text rất lộn xộn nên phương án modify có nhẽ hơi khó xài. Mình đang định sử dụng theo phương án move text cũ dựa theo các textbox không biết có ổn hơn không. Mong các bác cho ý kiến để có thể xử lý hoàn thiện theo yêu cầu của chủ thớt....

Chân thành cám ơn mọi ý kiến đóng góp của các 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

Hề hề hề,

Thực ra thì việc giãn text này đã có khá nhiều lisp rồi. Có người giãn theo kiểu chọn textbox, có người giãn theo cách chọn điểm chèn....

Có người giãn theo cách move text cũ, có người giãn theo cách modify text cũ......

Việc chọn điểm đặt của text đầu tiên hay lấy điểm đặt của text đầu tiên hay chọn một điểm trung gian nào đó chỉ là các yêu cầu cụ thể để giải quyết bài toán mà thôi. Không quá khó để thực hiện

Việc mình viết lisp vừa rồi là theo yêu cầu của chủ thớt, Do các file của chủ thớt có các định dạng text rất lộn xộn nên phương án modify có nhẽ hơi khó xài. Mình đang định sử dụng theo phương án move text cũ dựa theo các textbox không biết có ổn hơn không. Mong các bác cho ý kiến để có thể xử lý hoàn thiện theo yêu cầu của chủ thớt....

Chân thành cám ơn mọi ý kiến đóng góp của các bác.

Cái này em đã viết Với ý tưởng Lấy text đầu và Text cuối -> Tính toán ra điểm giữa và giãn đều ra 2 bên. Mình nghĩ các bạn rất cần.

http://www.cadviet.c...ic=13203&st=560

Bài viết số 583

  • 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

-Bác có thể dùng các hàm getboundingbox với 1 entity :) Textbox có nhược điểm lớn là không dùng với Mtext, còn bounding box thì chấp nhận mọi đối tượng.Cách này sẽ không bị ảnh hưởng bởi định dạng Text ( dùng dxf 10, 11 có thể bị miss) .

- Command Move thì chậm hơn entmod điểm chèn, nhưng tính toán nhanh hơn và ít đau đầu hơn. Có thể dùng vla-move (nhanh hơn 1 chút) 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

Cái này Tue_NV đã viết trên diễn đàn mình rồi. Bạn chịu khó tìm kiếm thử.

Khi viết mình đã lấy Text đầu và cuối của bộ Chọn Text -> Tính toán ra điểm giữa và giãn ra 2 bên tính từ điểm giữa đó

- Xử lý toàn bộ e là không có cách. Chỉ có cách là chọn hết cụm này đến cụm khác rồi Lisp xử lý 1 loạt luôn

Theo mình như ý kiến của chủ thớt có lẽ là sẽ sử dụng bộ lọc cho các text cần hiệu chỉnh trong bản vẽ!

Không có cách nào chỉ lọc ra các nhóm text trùng lên nhau để giãn sao ?

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 mình như ý kiến của chủ thớt có lẽ là sẽ sử dụng bộ lọc cho các text cần hiệu chỉnh trong bản vẽ!

Không có cách nào chỉ lọc ra các nhóm text trùng lên nhau để giãn sao ?

Chào bạn NguyenngocSon,

Căn cứ vào ý kiến của bạn kết hợp với các yêu cầu của chủ thớt, mình chỉnh lại cái lisp để không cần nhập điểm , cho phép giãn các đối tượng text theo phương đứng, giãn từng nhóm text sau mỗi lần lựa chọn với khoảng cách giữa các text được người dùng nhập vô. Lisp này sẽ lấy text đứng đầu tiên bên trái làm chuẩn để căn chỉnh tất cả các text còn lại trong nhóm và chỉnh sửa định dạng căn chỉnh của tất cả các text trong nhóm về giống như text đầu tiên này. Vì vậy sẽ tránh được việc nhảy tọa độ y như ở lisp cũ.

Lisp này sắp xếp các text theo trật tự hiện hành của text trên bản vẽ, không phụ thguộc vào giá trị số của text cũng như điểm đặt của text, khắc phục được các nhược điểm của lisp trước.

Về ý kiến chỉnh 1 lần tất cả các text trùng có trên bản vẽ cũng có thể thực hiện được với điều kiện bạn phải nêu rõ cách chỉnh cho mỗi trường hợp trùng nhau. Vì như bạn biết trên bản vẽ có thể có rất nhiều text trùng nhau theo nhiều cách. Text đứng, text nằm, text xiên , text trùng text, text trùng các đối tượng khác chứa text (tỷ như block), ......

Do vậy bài toán sẽ khá phức tạp nhưng không phải không có cách giải quyết nếu như bạn có thể xác định rõ cách chỉnh cho mỗi trường hợp.

Bạn hãy dùng thử lisp này và cho ý kiến nếu thấy cần bổ sung gì thêm.


(defun c:dkctd (/ oldos p d enlst i ht cn cd)
(vl-load-com)
(setq oldos (getvar "osmode"))
(setvar "osmode" 0)
(setq ;;;;; p (getpoint "\n Chon diem chuan ")
       d (getreal "\n Nhap khoang cach chuan: ") )
(prompt "\n Chon nhom text can sap xep")
(setq  enlst (acet-ss-to-list (ssget (list (cons 0 "text") ))))
(while enlst
      (command "undo" "be")
      (setq i 0)
      (setq enlst (vl-sort enlst '(lambda (x y) (< (caar (acet-ent-geomextents x)) (caar (acet-ent-geomextents y))))))
      (setq p (cdr (assoc 11 (entget (car enlst))))
              cn (cdr (assoc 72 (entget (car enlst))))
              cd (cdr (assoc 73 (entget (car enlst))))
      )
      (foreach en enlst
           (setq encode (entget en)
                   ht (cdr (assoc 40 encode))
                   encode (subst (cons 11 (list (+ (car p)  (* i (+ d ht))) (caddr (assoc 11 encode)))) (assoc 11 encode) encode)
                   encode (subst (cons 72 cn) (assoc 72 encode) encode)
                   encode (subst (cons 73 cd) (assoc 73 encode) encode)
                   i (1+ i) 
            )
            (entmod encode)
       )
      ;;; (setq ans (getstring "\n Ban muon tiep tuc chinh text <Y or N> : "))
      ;;; (if (= (strcase ans) "Y")
      ;;;     (progn 
                (prompt "\n Hay chon nhom text can sap xep tiep theo")
                (setq enlst (acet-ss-to-list (ssget (list (cons 0 "text")))))
      ;;;     )
      ;;;     (setq enlst nil)
      ;;; )
       (command "undo" "e")
)
(setvar "osmode" oldos)

(princ)
)            

 

Chúc bạn vui,

 

@ Bạn dauquangminh: Hãy dùng thử lisp này, nó đã khắc phục được các nhược điểm mà bạn đã nêu trong bài trước. Tuy nhiên nó không chọ bạn chọn điểm đặt trứơc mà tự chọn điểm đặt theo vị trí text đầu tiên của nhóm. Nếu bạn muốn có thể so sánh hai lisp để tự sửa chỗ chọn điểm đặt này. Thực ra theo mình thì chả cần chọn nữa mà sau khi bạn chạy xong nếu thấy chưa ưng thì move một phát cả đám chúng đi theo ý bạn cũng đơn giản mà.

Hề hề hề...

  • 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ẬT TUYỆT VỜI! Lisp của bác gần như là hoàn thiện, còn 1 xíu xiu nữa thôi.

Bác thêm giùm em cái này nhé:

Lisp sẽ hỏi: "Text cố định nằm bên trái (T) hay phải (P):"

nếu T tức là text đầu tiên bên trái cố định, các text còn lại dãn sang phải

nếu P tức là text đầu tiên bên phải cố định, các text còn lại dãn sang trái

 

Với chức năng này, lisp sẽ áp dụng được cho nhiều trường hợp hơn, linh động hơn, đa năng hơn ạ.

:lol:

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 phamthanhbinh giúp em sửa thêm cái lisp được không ạ.

Lisp sẽ hỏi: "Text cố định nằm bên trái (T) hay phải (P):"

nếu T tức là text đầu tiên bên trái cố định, các text còn lại dãn sang phải

nếu P tức là text đầu tiên bên phải cố định, các text còn lại dãn sang trái

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

Các bạn giúp mình với.

Hề hề hề,

Vì topic trôi đi nhanh quá nên mình không kịp xem yêu cầu của bạn. Vấn đề bạn nêu không khó và hoàn toàn có thể làm được. Tuy nhiên như mình đã nói, trong khi chưa có bạn hoàn toàn vẫn có thể xài lisp cũ kèm theo thằng move sau khi chạy lisp mà. Như vậy vừa được việc vừa đỡ sốt suột bạn ạ.

Hãy chờ chút xíu, mình sẽ xem và bổ sung điều bạn cần.

 

A, đây rồi, lisp nóng......

 

 


;;;;;;Sap xep cac text dung theo khoang cach ngang nhap vao. Co hai lua chon: sap xep tu trai qua phai va nguoc lai


(defun c:dkctd (/ oldos p d enlst i ht cn cd ort)
(vl-load-com)
(setq oldos (getvar "osmode"))
(setvar "osmode" 0)
(setq ;;;;; p (getpoint "\n Chon diem chuan ")
       d (getreal "\n Nhap khoang cach chuan: ") )
(prompt "\n Chon nhom text can sap xep")
(setq  enlst (acet-ss-to-list (ssget (list (cons 0 "text") ))))
(while enlst
  	(command "undo" "be")
  	(setq i 0)
  	(setq enlst (vl-sort enlst '(lambda (x y) (< (caar (acet-ent-geomextents x)) (caar (acet-ent-geomextents y))))))
  	(setq ort (getstring "\n Chon huong gian text <T or P>: "))
  	(if (= (strcase ort) "T")
  	(setq p (if (or (/= (cdr (assoc 72 (entget (car enlst)))) 0) (/= (cdr (assoc 73 (entget (car enlst)))) 0))
                       (cdr (assoc 11 (entget (car enlst)))) (cdr (assoc 10 (entget (car enlst))))  )
      		cn (cdr (assoc 72 (entget (car enlst))))
      		cd (cdr (assoc 73 (entget (car enlst))))
  	)
  	(setq p (if (or (/= (cdr (assoc 72 (entget (last enlst)))) 0) (/= (cdr (assoc 73 (entget (last enlst)))) 0))
                       (cdr (assoc 11 (entget (last enlst)))) (cdr (assoc 10 (entget (last enlst))))  )
      		cn (cdr (assoc 72 (entget (last enlst))))
      		cd (cdr (assoc 73 (entget (last enlst))))
              enlst (reverse enlst)
  	)
  	)
  	(foreach en enlst
           (setq encode (entget en)
                   ht (cdr (assoc 40 encode))                  
                   encode (subst (cons 72 cn) (assoc 72 encode) encode)
                   encode (subst (cons 73 cd) (assoc 73 encode) encode)                  
    		)
    		(if (= (strcase ort) "T")
        		(setq  encode (subst (cons 11 (list (+ (car p)  (* i (+ d ht))) (caddr (assoc 11 encode)))) (assoc 11 encode) encode))
        		(setq  encode (subst (cons 11 (list (- (car p)  (* i (+ d ht))) (caddr (assoc 11 encode)))) (assoc 11 encode) encode))
    		)
    		(entmod encode)
    		(setq  i (1+ i))
       )
  	;;; (setq ans (getstring "\n Ban muon tiep tuc chinh text <Y or N> : "))
  	;;; (if (= (strcase ans) "Y")
  	;;; 	(progn
        		(prompt "\n Hay chon nhom text can sap xep tiep theo")
        		(setq enlst (acet-ss-to-list (ssget (list (cons 0 "text")))))
  	;;; 	)
  	;;; 	(setq enlst nil)
  	;;; )
       (command "undo" "e")
)
(setvar "osmode" oldos)

(princ)
)            

Chỉnh sửa theo phamthanhbinh
Bổ sung code vào bài post, sửa sai do chủ thớt phát hiệnn
  • 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

bác phamthanhbinh ơi!

khi chọn phương án hướng dãn text bên phải (P), đúng ra là text bên phải đứng im, và text còn lại (ở giữa và bên trái) dãn sang trái

nhưng khi dùng lisp thì thứ tự text bị đảo ngược, ví dụ:

ta có text đè lên nhau như thế này:.......................................................................ABC

đúng ra khi dùng lisp với hướng dãn text bên phải sẽ thế này:...................A.....B.....C

nhưng thực tế lisp ra kết quả như thế này:.................................................C.....B.....A

:unsure:

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 phamthanhbinh ơi!

khi chọn phương án hướng dãn text bên phải (P), đúng ra là text bên phải đứng im, và text còn lại (ở giữa và bên trái) dãn sang trái

nhưng khi dùng lisp thì thứ tự text bị đảo ngược, ví dụ:

ta có text đè lên nhau như thế này:.......................................................................ABC

đúng ra khi dùng lisp với hướng dãn text bên phải sẽ thế này:...................A.....B.....C

nhưng thực tế lisp ra kết quả như thế này:.................................................C.....B.....A

:unsure:

Hề hề hề,

Lisp nóng quá, phải bỏng rồi hử??? Tại tham ăn đấy mà.

Quả là sơ xuất của mình khi đảo chiều sắp xếp mà không đảo chiều list các point. Cũng tại mình chỉ sửa mà không test lại nên không phát hiện ra lỗi. Lười mà lị......

Sorry, sorry, so.....o ...or...ry nghen.

Chuyện vặt mà, để mình đổi một phát là ngon như ăn ..... bánh đúc ngay. Nhưng mà ăn bánh đúc cũng phải cẩn thận kẻo nghẹn đó nha.

Mình sửa luôn vào bài trước cho đỡ tốn đât nghen.

Hề hề hề,...

  • 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

Mình chỉ muốn nói với bác phamthanhbinh 2 chữ “Tuyệt vời!”. Thú thật là mình rất muốn hoàn thành cái lisp này để xin phép bác phamthanhbinh cho gửi lên khắp các forum. Vì lisp này rất thiết thực cho những ai làm thiết kế giao thông, những ai đã phải chịu cực hình khi cứ move từng text một với hàng trăm bản vẽ trắc ngang như vậy sẽ như cá gặp nước, hổ về rừng, người bắt được vàng khi có được cái lisp này trong tay.

Một lần nữa xin thay mặt những anh em làm thiết kế giao thông gửi lời cảm ơn chân thành nhất đến bác phamthanhbinh - một trong những con người tuyệt vời nhất của cadviet, và xin phép cho mình gửi lisp này đến với các anh em thiết kế khác trên cả nước nhé. :lol:

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 chỉ muốn nói với bác phamthanhbinh 2 chữ “Tuyệt vời!”. Thú thật là mình rất muốn hoàn thành cái lisp này để xin phép bác phamthanhbinh cho gửi lên khắp các forum. Vì lisp này rất thiết thực cho những ai làm thiết kế giao thông, những ai đã phải chịu cực hình khi cứ move từng text một với hàng trăm bản vẽ trắc ngang như vậy sẽ như cá gặp nước, hổ về rừng, người bắt được vàng khi có được cái lisp này trong tay.

Một lần nữa xin thay mặt những anh em làm thiết kế giao thông gửi lời cảm ơn chân thành nhất đến bác phamthanhbinh - một trong những con người tuyệt vời nhất của cadviet, và xin phép cho mình gửi lisp này đến với các anh em thiết kế khác trên cả nước nhé. :lol:

Hề hề hề,

Chớ có vội kẻo nghẹn đó.

Đây là diễn đàn free nên bạn có quyền chia xẻ với bất cứ ai. Tuy nhiên bạn nên nhớ là lisp này mình viết dựa trên cai bản vẽ của bạn gửi. Bởi vậy rất có khả năng với các bản vẽ của người khác nó sẽ ọc ạch giở chứng do nó không được vẽ kiểu của bạn. Tỷ như họ toàn dùng mtext thay vì text như bạn thì cái lisp này toi cơm bạn ạ.

Hề hề hề,

Rất cám ơn bạn đã sử dụng tốt cái lisp này vào đúng việc bạn cần cũng như tinh thần chia sẻ kiến thức với mọi người của bạn.

Khi bạn chia xẻ lisp này với mọi người cũng nên nói rõ những hạn chế của nó thì người dùng mới yên trí nhớn được bạn ạ.

Hề hề hề.

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

Đăng nhập để thực hiện theo  

×