Đến nội dung


Hình ảnh
- - - - -

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


  • Please log in to reply
36 replies to this topic

#1 dauquangminh

dauquangminh

    biết vẽ arc

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

Đã gửi 26 October 2011 - 09:59 PM

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

Hình đã gửi

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
  • 0

#2 risusu

risusu

    biết vẽ circle

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

Đã gửi 27 October 2011 - 07:52 AM

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

  • 2
^_^0905-0988.782004^_^

#3 dauquangminh

dauquangminh

    biết vẽ arc

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

Đã gửi 27 October 2011 - 08:30 AM

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
  • 0

#4 phamthanhbinh

phamthanhbinh

    biết lệnh adcenter

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

Đã gửi 27 October 2011 - 11:42 AM

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

#5 dauquangminh

dauquangminh

    biết vẽ arc

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

Đã gửi 27 October 2011 - 12:40 PM

File của em đây:
http://www.mediafire...83bvhkctkbzk58z
  • 0

#6 phamthanhbinh

phamthanhbinh

    biết lệnh adcenter

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

Đã gửi 27 October 2011 - 04:32 PM

File của em đây: http://www.mediafire...83bvhkctkbzk58z

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

#7 dauquangminh

dauquangminh

    biết vẽ arc

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

Đã gửi 27 October 2011 - 10:03 PM

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 ạ.
Hình đã gửi

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
  • 0

#8 phamthanhbinh

phamthanhbinh

    biết lệnh adcenter

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

Đã gửi 28 October 2011 - 12:36 PM


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

#9 NguyenNgocSon

NguyenNgocSon

    biết dimbaseline

  • Members
  • PipPipPipPipPip
  • 368 Bài viết
Điểm đánh giá: 39 (tàm tạm)

Đã gửi 28 October 2011 - 01:00 PM

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 !
  • 1

#10 ketxu

ketxu

    Copier - Paster - Editor

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

Đã gửi 28 October 2011 - 01:50 PM

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


#11 Tue_NV

Tue_NV

    KS Võ Quang Tuệ

  • Moderator
  • PipPipPipPipPipPipPip
  • 4296 Bài viết
Điểm đánh giá: 3804 (đỉnh cao)

Đã gửi 28 October 2011 - 02:27 PM

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
  • 0

#12 ketxu

ketxu

    Copier - Paster - Editor

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

Đã gửi 28 October 2011 - 02:50 PM

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


#13 phamthanhbinh

phamthanhbinh

    biết lệnh adcenter

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

Đã gửi 28 October 2011 - 03:11 PM

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

#14 Tue_NV

Tue_NV

    KS Võ Quang Tuệ

  • Moderator
  • PipPipPipPipPipPipPip
  • 4296 Bài viết
Điểm đánh giá: 3804 (đỉnh cao)

Đã gửi 28 October 2011 - 03:39 PM

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
  • 1

#15 ketxu

ketxu

    Copier - Paster - Editor

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

Đã gửi 28 October 2011 - 03:53 PM

-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 ạ
  • 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


#16 NguyenNgocSon

NguyenNgocSon

    biết dimbaseline

  • Members
  • PipPipPipPipPip
  • 368 Bài viết
Điểm đánh giá: 39 (tàm tạm)

Đã gửi 28 October 2011 - 04:15 PM

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 ?
  • 0

#17 phamthanhbinh

phamthanhbinh

    biết lệnh adcenter

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

Đã gửi 28 October 2011 - 05:05 PM

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

#18 dauquangminh

dauquangminh

    biết vẽ arc

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

Đã gửi 30 October 2011 - 02:11 PM

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:
  • 0

#19 dauquangminh

dauquangminh

    biết vẽ arc

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

Đã gửi 18 November 2011 - 04:09 PM

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
  • 0

#20 dauquangminh

dauquangminh

    biết vẽ arc

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

Đã gửi 23 November 2011 - 04:54 PM

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