Chuyển đến nội dung
Diễn đàn CADViet
  • Thông báo

    • Nguyen Hoanh

      CADViet đã hoàn tất nâng cấp   14/09/2017

      Chào các bạn, CADViet đã hoàn tất việc nâng cấp lên phiên bản mới. Tất cả các chức năng đã hoạt động theo kỳ vọng của ban quản trị. Nếu có vấn đề gì cần phản hồi, các bản post ở đây nhé: Trân trọng, Nguyễn Hoành.
ANHSURVEY

[Yêu cầu] viết Lisp dời text về vị trí điểm point gần nhất

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

Chào bạn!

 Hiện tại thì điểm canh phải "Right" của Text đã trùng lên point rồi. 

Nếu chuyển điểm canh lề khác của Text trùng lên point thì không cần phải sử dụng Lisp. 

 

- Chọn text (Bằng Quick select hay filter) -> Bấm Ctrol+1 -> Ở Tab Text, mục justify -> Chọn Center là xong

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

Tue_NV Bài toán của mình là: khoảng cách các text đến các point không đều nhau. mình muốn Lisp đưa text về trùng voié điểm point ở gần nhất. Còn ở file minh hoạ của mình thì point và Right của text đang có khoảng cách khác nhau và chưa trùng lên point, Bác kiểm tra xem và giúp em với nhé! Thank!

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

https://www.mediafire.com/?gzwr34czp8wcweg

Bác TUE_NV vẫn chưa rõ ý của em rồi. bác xem lại file minh hoa này nhé! em muốn dời text vào trùng với tâm của point. file minh hoạ giữa point và text còn cách nhau một khoảng. em đã DIM trong file kèm theo

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

Ket đang rất mệt, nên code nhanh cho bạn như vầy thôi, hi vọng bạn dùng đc. Nếu lỗi đâu bạn nhờ các bác khác nhá ^^. Lần sau nếu có yêu CV xin đừng thay tên đổi họ nhiều quá ^^

(defun c:mt2p(/ lst lstData lstT lstP p)
	(and
		(setq ss (ssget (list (cons 0 "TEXT,POINT"))))
		(setq lstData (mapcar 'entget (acet-ss-to-list ss)))
		(foreach e lstData (if (= (cdadr e) "TEXT") (setq lstT (cons e lstT))(setq lstP (cons e lstP))))
	)
	(foreach oT lstT
		(setq p (acet-dxf 11 oT))
		(setq lstP (vl-sort lstP '(lambda(x y)(< (distance (acet-dxf 10 x) p)(distance (acet-dxf 10 y) p)))))
		(entmod (append oT (list (cons 11 (acet-dxf 10 (car lstP))))))
		(setq lstP (cdr lstP))
	)
)
  • Vote tăng 5

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

Ok. Đúng ý của mình rồi. Cảm ơn Bác Ket nhiều nhé! Bác Ket nhiệt tình thật, Cảm ơn bác nhiều!

Hề hề hề,

Dựa trên cái lisp của bác Ketxu, mình sửa lại một chút, hy vọng lisp sẽ chạy nhanh hơn khi bản vẽ có nhiều text và point cần hiệu chỉnh.

 

 

(defun c:movt (/ oldos sslst box polst p)
(vl-load-com)
(setq oldos (getvar "osmode"))
(setvar "osmode" 0)
(command "undo" "be")
(setq sslst (mapcar 'entget (acet-ss-to-list (ssget (list (cons 0 "text"))))))
(foreach e sslst
(setq box (acet-ent-geomextents (cdr (assoc -1 e)))
polst (mapcar 'entget (acet-ss-to-list (ssget "c" (car box) (cadr box) (list (cons 0 "point")))))
p (cdr (assoc 11 e))  )
(if polst
 (progn
(setq polst (vl-sort polst '(lambda (x y) (< (distance (cdr (assoc 10 x)) p) (distance (cdr (assoc 10 y)) p))))  )
 (entmod (subst (cons 11 (cdr (assoc 10 (car polst)))) (assoc 11 e) e) )
 )
)
)
(command "undo" "e")
(setvar "osmode" oldos)
(princ)
)

 

 

 

 

 

 

 

(vl-load-com)
(setq oldos (getvar "osmode"))
  • Vote tăng 6

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 phanthanhbinh cho em hỏi, muốn tăng giới hạn khoảng cách lên thì sửa dòng nào vậy bác, vì có một số điểm khoảng cách giữa text và point chỉ có 0.5 mét mà lisp không move text đó, nó vẫn giữ nguyên vị trí 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 phanthanhbinh cho em hỏi, muốn tăng giới hạn khoảng cách lên thì sửa dòng nào vậy bác, vì có một số điểm khoảng cách giữa text và point chỉ có 0.5 mét mà lisp không move text đó, nó vẫn giữ nguyên vị trí cũ.

Hề hề hề,

Cái ni có lẽ là do cái cách sủ dụng hàm ssget của mình chưa chuẩn rồi. Cần phải check lại.

Mình sử dụng hàm ssget với tham số c nên nò sẽ lựa chọn các point nằm trong hoặc trên hình bao của text. 

Để tăng cái khoảng cách này sẽ phải tăng kích thước cái box lựa chọn lên. Có điều nếu tăng lớn quá sẽ có thể xảy ra trường hợp chọn thừa nhiều điểm làm chậm quá trình chạy lisp.

Bạn thử tăng kích thước cái box này lên 2 lần xem đã ổn chưa nhé,

Thay thế dòng code:

 polst (mapcar 'entget (acet-ss-to-list (ssget "c" (car box) (cadr box) (list (cons 0 "point")))))

bằng dòng code sau:

 polst (mapcar 'entget (acet-ss-to-list (ssget "c" (polar (car box) (* 1.5 pi) (/ (- (cadadr box) (cadar box)) 2)) (polar (cadr box) (* 0.5 pi) (/ (- (cadadr box) (cadar box)) 2)) (list (cons 0 "point")))))

 

Nếu làm như vầy chưa ổn thì bạn tăng tiếp lên thành 3 hay 4 lần. Hy vọng sẽ đạt yêu cầu của bạn. Cách tăng bạn có thể xem kỹ ở dòng code mới thay, kich thước tăng thể hiện ở đoạn code (/ (- (cadadr box) (cadar box)) 2). bạn chỉ cần thay đổi ở đoạn code này là OK.

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

 

@ Bác DoanVanHa: Nhờ bác chỉ giáo thêm các thuật toán mới.

  • 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 Phanthanhbinh cho em hỏi. em sửa code theo bác rồi mà lisp vânx không cải thiện được vấn đề cũ, mà select nhiều text thì bị lỗi dời text không đúng. nó dờ text đi rất xa điểm gần chúng và chồng lên text khác, mong bác chỉ giáo..

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 Phanthanhbinh cho em hỏi. em sửa code theo bác rồi mà lisp vânx không cải thiện được vấn đề cũ, mà select nhiều text thì bị lỗi dời text không đúng. nó dờ text đi rất xa điểm gần chúng và chồng lên text khác, mong bác chỉ giáo..

Hề hề hề,

Có nhẽ do bản vẽ bạn đang xài hệ tọa độ khác chăng. Hãy thử chuyển hệ tọa độ của bản vẽ về world trước khi chạy líp xem sao 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

Bác DoanVanHa: Nhờ bác chỉ giáo thêm các thuật toán mới.

 

Bác DoanVanHa bỏ chút thời gian để viết lisp này cho mọi người tham khảo với ạ. Một bài toán khá tổng quát và thông dụ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

Bác DoanVanHa bỏ chút thời gian để viết lisp này cho mọi người tham khảo với ạ. Một bài toán khá tổng quát và thông dụng!

Có 1 lần tôi đề xuất 1 bài toán trong chủ đề "Code lisp như thế nào để đạt tốc độ tối ưu" nhưng không được nhiều người quan tâm, vì hình như ít ai đụng đến và đã từng "đau khổ" vì tốc độ xử lý như rùa bò của thuật toán.

Xin lỗi mọi người nhé, tôi có đọc một cuốn sách của 1 bô lão về thuật toán người nước ngoài, họ nói đại ý thế này: lập trình mà không tìm ra được thuật toán tối ưu thì chưa gọi là biết lập trình. Hóa ra nó đúng thế. Và mình còn tệ hơn thế.

Lúc nào rảnh tôi sẽ quay lại bài toán này để chúng ta cùng bàn luận. Cuối năm bận quá. Hy vọng thế!

  • 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

Vẫn là file mẫu mà em port lên hôm trước .  bác xem giúp em, và hướng dân cho em với nhé! thank!

Nếu file mẫu không đổi thì Lisp của bác Bình chạy tốt nhé.

 

T/hợp có lỗi, xin cho xem hình minh họa ?

  • 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

gửi Gia_Bach file minh họa lỗi của lisphttp://www.cadviet.com/upfiles/3/126823_yc_viet_lisp.dwg

Với file này, đặt biến hệ thống PDMODE = 35 là Lisp của bác Bình chạy tốt.

 

- tai dòng nhắc lệnh(command) gõ PDMODE enter rồi nhập 35 enter 

  • 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

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


×