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ị

Lisp này hay quá rất là hữu ích góp phần giảm thời gian chỉnh sửa rất nhiều, bên cạnh đó thì còn một điểm nhỏ là trước khi sử dụng thì hộp truy bắt điểm (OSNAP) vẫn ok nhưng khi đánh lệnh thì các truy bắt điểm lại bị "văng" hết, sau khi chỉnh sủa xong thì lại vào OSNAP để chọn lại truy bắt điểm, không biết là tác giả và các anh trên frum có thể khắc phục điều này được không ạh. Xin chân thành cám ơn tác giả về lisp này :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

Về vấn đề truy bắt điểm trong Lisp, để tắt chế độ truy bắt điểm, cách làm thông thường là:

(setq oldos (getvar "osmode"))
(setvar "osmode" 0)
(progn ....)
(setvar "osmode" oldos)

 
Tuy nhiên, nếu phần thân chương trình gặp lỗi, dẫn đến lệnh trả về (setvar "osmode" oldos) không được thực hiện, khi đó, toàn bộ chế độ truy bắt điểm trước khi chạy lệnh đều bị xóa sạch.
Mình thì làm theo cách khác

(if (< (getvar "osmode") 16384)
(progn
(setq osmode-old (getvar "osmode"))
(setvar "osmode" (+ (getvar "osmode") 16384)));Turn OSMODE off
(setq osmode-old nil))
(progn ....)
(if osmode-old (setvar "osmode" osmode-old));Restore OSMODE

Tác dụng của nó là tắt chế độ bắt điểm giống hệt như nhấn nút F3 trên bàn phím. Nếu gặp sự cố trong thân chương trình, người dùng dễ dàng phục hồi chế độ bắt điểm cũ bằng cách nhấn phím F3.

  • 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

Lisp này hay quá rất là hữu ích góp phần giảm thời gian chỉnh sửa rất nhiều, bên cạnh đó thì còn một điểm nhỏ là trước khi sử dụng thì hộp truy bắt điểm (OSNAP) vẫn ok nhưng khi đánh lệnh thì các truy bắt điểm lại bị "văng" hết, sau khi chỉnh sủa xong thì lại vào OSNAP để chọn lại truy bắt điểm, không biết là tác giả và các anh trên frum có thể khắc phục điều này được không ạh. Xin chân thành cám ơn tác giả về lisp này :D

Hề hề hề,

Thực tế thì trong lisp đã trả osnap về giá trị ban đầu.

Song rất có thể như bác Polyline đã nhận xét, quá trình thao tác lisp có lỗi chi đó để mà lisp bị đứt gánh giữa đường. Giá mà bạn cho biết cái gánh ấy nó gẫy chỗ nào thì hay quá. Bởi mình chưa rõ cách xài lisp của bạn, Còn khi mình test với vài trường hợp đơn lẻ thì chưa phát hiện ra lỗi.

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

_Cám ơn bạn Polyline  rất nhiều  như vậy code của lisp sẽ cập nhật thêm và hoàn thiện như sau, midnh đã sử dụng và rất Ok. Khi kết thúc lệnh sẽ tự động trả về cá chế độ truy bắt điểm ban đầu :D 
 
 

(defun c: dkctd (/ oldos p d enlst i ht cn cd ort)
(vl-load-com)
(setq oldos (getvar "osmode"))
(setvar "osmode" (+ (getvar "osmode") 16384))
(setq osmode-old nil)
(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")))))
(if osmode-old (setvar "osmode" osmode-old))
   	;;; 	)
  	;;; 	(setq enlst nil)
   	;;; )
        (command "undo" "e")
)
(setvar "osmode" oldos)
 
(princ)
)  
  • 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

Hề hề hề,

Thực tế thì trong lisp đã trả osnap về giá trị ban đầu.

Song rất có thể như bác Polyline đã nhận xét, quá trình thao tác lisp có lỗi chi đó để mà lisp bị đứt gánh giữa đường. Giá mà bạn cho biết cái gánh ấy nó gẫy chỗ nào thì hay quá. Bởi mình chưa rõ cách xài lisp của bạn, Còn khi mình test với vài trường hợp đơn lẻ thì chưa phát hiện ra lỗi.

hề hề hề,...

Dạ em thêm vô nó Ok rồi anh phamthanhbinh ơi  có thể do nó bị "đá" chỗ nào đó , nhưng mà ok rồi :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 phamthanhbinh và bác khanhmytho ơi.Sao máy em báo load lisp success rồi. Với bản hoàn thiện cuối cùng của bác khanhmytho thì khi em đánh lệnh dkctd thì cad 2007 của em nó báo Unknown command "DKCTD".  Press F1 for help. nhỉ?Lệnh là em viết thường lẫn viết hoa rồi nhé.Em chuyển sang down bản gốc ban đầu của bác phamthanhbinh thì máy nhận lệnh dkctd thì cad nhận bình thường.Nhưng khi chạy thì hàng text vẫn trơ trơ ra đó, không chịu dịch chuyển.Các bác xem lại giùm em với.Dịch chuyển move tay mất công quá.

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 và bác khanhmytho ơi.Sao máy em báo load lisp success rồi. Với bản hoàn thiện cuối cùng của bác khanhmytho thì khi em đánh lệnh dkctd thì cad 2007 của em nó báo Unknown command "DKCTD".  Press F1 for help. nhỉ?Lệnh là em viết thường lẫn viết hoa rồi nhé.Em chuyển sang down bản gốc ban đầu của bác phamthanhbinh thì máy nhận lệnh dkctd thì cad nhận bình thường.Nhưng khi chạy thì hàng text vẫn trơ trơ ra đó, không chịu dịch chuyển.Các bác xem lại giùm em với.Dịch chuyển move tay mất công quá.

Hề hề hề,

Hãy gửi bản vẽ của bạn lên nhé. Có nhẽ các text của bạn là Mtext chă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

Anh ơi anh có thể giúp em dãn cách các chữ đè lên nhau như trong bản vẽ em up dưới đây không ạ, em đang thiết kế trắc dọc một tuyến đường, em cám ơn a nhiều

 

 http://www.cadviet.com/upfiles/3/136095_aaaaaaaaaaa_1.dwg

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

Anh ơi anh có thể giúp em dãn cách các chữ đè lên nhau như trong bản vẽ em up dưới đây không ạ, em đang thiết kế trắc dọc một tuyến đường, em cám ơn a nhiều

 

 http://www.cadviet.com/upfiles/3/136095_aaaaaaaaaaa_1.dwg

Hề hề hề,

Bạn đã dùng thử lisp phía trên chưa?? Nếu rồi thì có đạt không?? Và không đạt chỗ nào???

  • 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

Em đã thử lisp trên và sau khi sử dụng lisp các chữ nó không theo ý muốn của em, nó chạy thành 1 cột dài ( em diễn đạt không được tốt ). Em muốn chỉ những chỗ nào nó đè lên nhau mới dãn cách thôi ạ, đa phần là dãn cách ngang, bác xem giúp em được không ạ,e cảm ơ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

Em đã thử lisp trên và sau khi sử dụng lisp các chữ nó không theo ý muốn của em, nó chạy thành 1 cột dài ( em diễn đạt không được tốt ). Em muốn chỉ những chỗ nào nó đè lên nhau mới dãn cách thôi ạ, đa phần là dãn cách ngang, bác xem giúp em được không ạ,e cảm ơn

Hề hề hề,

Hề hề hề,

Lisp này cho phép bạn chọn các nhóm text cần sắp xếp lại chứ đâu phải quét một lần tất cả các text. Vì vậy bạn có thể chọn lựa lần lượt các nhóm text trùng nhau để lisp làm việc.

Có vài điều cần lưu ý bạn như sau:

1/- trên bản vẽ của bạn có rất nhiều text có nội dung hoàn toàn giống nhau nằm đè lên nhau. Bởi vậy bạn nên loại trừ các text này chỉ để lại mỗi giá trị một text rồi mới chạy lisp

2/- Do lisp sẽ sắp xếp các text trong nhó theo vị trí của text đầu tiên về bên trái hay bên phải nên bạn chỉ nên chọ mỗi lần một nhóm text đè lên nhau để sắp xếp lại, sau khi lisp sắp xếp xong nhóm này thì chọn tiếp nhóm khác. Thao tác này giúp bạn kiểm soát được chặt chẽ việc sắp xếp để tránh nhầm lẫn trong quá trình này.

3/- Bạn nên dựa vào vị trí của từng nhóm text trên bản vẽ để lựa chon dãn cách về bên trái hay bên phải để việc bố trí text trên bản vẽ được đẹp mắt.

4/- bạn cũng nên nhò trước số lượng của các text trong mỗi nhóm để lựa chọn khoảng cách dãn text cho hợp lý. Khoảng cách này sẽ không thay đổi trong một lần chạy lisp

 

Hãy thử lại nhé.

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ề,

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

LISP RẤT HỮU ÍCH VÀ HAY NHƯNG NHỜ BÁC PHAMTHANHBINH CHỈNH GIÚP BIẾN KHOẢNG CÁCH "d" VÀ BIẾN TRÁI "t" PHẢI "p" NHẬN GIÁ TRỊ NHẬP TRƯỚC ĐÓ NẾU THỰC HIỆN NHẤN ENTER CÒN NẾU NHẬP GIÁ TRỊ KHÁC THÌ BIẾN SẼ NHẬN GIÁ TRỊ MỚI. VẬY ĐỠ MẤT NHIỀU THAO TÁC NHẬP LIỆU. OK?

  • Vote giảm 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

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  

×