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

[Tư vấn] Entmod đối với điểm chèn của đối tượng Text

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

Chào các bác!

Từ trước đến giờ em vẫn băn khoăn với điểm chèn của Text.

Thường thì căn chỉnh lề của TEXT là LEFT thì không vấn đề gì nhưng nếu căn chỉnh TEXT ở dạng khác thì việc Entmod Text sẽ có vấn đề xảy ra.

Text có 2 mã để lấy toạ độ là 10 và 11.

1. Nếu em có 1 điểm toạ độ mới làm thế nào để cho điểm chèn chuẩn của Text đúng với toạ độ mới đó?

2. Em có 1 đoạn lisp move Text vuông góc với Line hoặc Pline. Nhưng nó chỉ có tác dụng với đối tượng Text căn chỉnh dạng Left.

Nhờ các bác kiểm tra và xem nguyên nhân vì sao ạ?

(defun c:TVG(/ Obj ss );;;;TEXT VUONG GOC
(setq obj (vlax-ename->vla-object (car (entsel "\nChon Line hoac Polyline:"))))
(prompt "\nChon text:")
(setq ss (ssget '((0 . "TEXT"))))
  (mapcar '(lambda(x) (vla-put-InsertionPoint (vlax-ename->vla-object x) (vlax-3d-point (vlax-curve-getClosestPointTo obj (TD:TEXTBASE x) T)))) (acet-ss-to-list ss))
)
(defun TD:TEXTBASE (Ent / Ma72 Ma73  Ma7273Pnt MaBase   )
(setq e (entget Ent))
(setq  Ma72 (cdr (assoc 72 e))
       Ma73 (cdr (assoc 73 e))
)
(setq Ma7273Pnt (list '(0 0 10) '(2 0 11) '(1 0 11) '(3 0 11) '(4 0 11)
		      '(5 0 10) '(0 3 10) '(1 3 11) '(2 3 11) '(0 2 11)
		      '(1 2 11) '(2 2 11) '(0 1 11) '(1 1 11) '(2 1 11)
		)
)
(setq MaBase (nth 0 (vl-remove nil (mapcar '(lambda(x) (if (and (= Ma72 (car x) ) (= Ma73 (cadr x))) (caddr x) nil)) Ma7273Pnt))))
(setq Pnt  (cdr (assoc MaBase (entget ent))))
Pnt
)

 

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

Khi dùng hàm vla thì InsertionPoint tương đương với dxf 10, còn TextAlignmentPoint  tương đương với dxf 11.

Thấy bạn chỉ dùng InsertionPoint  nên thiế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

Khi dùng hàm vla thì InsertionPoint tương đương với dxf 10, còn TextAlignmentPoint  tương đương với dxf 11.

Thấy bạn chỉ dùng InsertionPoint  nên thiếu.

Ôi! Như vậy thì sẽ sai. LISP Convert Text 2D sang 3D sẽ bị sai nốt rùi.

Anh Tốt 77 có cách nào Entmod Text khi thay đổi điểm chèn không ạ?

Hàm TD:TEXTBASE của em ở trên đã tìm được điểm chèn của Text nhưng không biết cách cập nhật lại Text đó.

Cảm ơn anh 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ạn thử cái này.

 

 
(defun c:TVG(/ Obj ss );;;;TEXT VUONG GOC
  (setq obj (vlax-ename->vla-object (car (entsel "\nChon Line hoac Polyline:"))))
  (prompt "\nChon text:")
  (setq ss (ssget '((0 . "TEXT"))))
  (mapcar '(lambda(x / tm)
    (setq tm (TD:TEXTBASE x))
    (if (= (car tm) 10)
      (vla-put-InsertionPoint (vlax-ename->vla-object x) (vlax-3d-point (vlax-curve-getClosestPointTo obj (last tm) T)))
      (vla-put-TextAlignmentPoint (vlax-ename->vla-object x) (vlax-3d-point (vlax-curve-getClosestPointTo obj (last tm) T)))
      ))
 (acet-ss-to-list ss))
)
 
(defun TD:TEXTBASE (Ent / Ma72 Ma73  Ma7273Pnt MaBase   )
  (setq e (entget Ent))
  (setq  Ma72 (cdr (assoc 72 e))
         Ma73 (cdr (assoc 73 e))
  )
  (setq Ma7273Pnt (list '(0 0 10) '(2 0 11) '(1 0 11) '(3 0 11) '(4 0 11)
     '(5 0 10) '(0 3 10) '(1 3 11) '(2 3 11) '(0 2 11)
     '(1 2 11) '(2 2 11) '(0 1 11) '(1 1 11) '(2 1 11)
)
  )
  (setq MaBase (nth 0 (vl-remove nil (mapcar '(lambda(x) (if (and (= Ma72 (car x) ) (= Ma73 (cadr x))) (caddr x) nil)) Ma7273Pnt))))
  (setq Pnt  (cdr (assoc MaBase (entget ent))))
  (list MaBase Pnt)
)
 
  • 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

Trong hàm anh có dùng (last tm), như vậy so với chức năng (cadr tm) thì cũng giống nhau ạ?

Em thay vào cũng ra kết quả như ý muốn

Câu hỏi này hơi ngộ à nghen!

Khi 1 list có 2 phần tử thì phần tử thứ 2 (theo TD) và phần tử cuối cùng (theo Tot77) giống nhau thì có gì lạ?

  • 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

Đã dùng vla-put-... thì sao không dùng vla-get-... để lấy điểm chèn mà dùng TD:textbase làm chi hè?

Thì cũng phải "có nạc có mỡ" chứ.

 

(vlax-for e (vla-get-activeSelectionSet

...

)

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 Hạ: Đã dùng vla-put-... thì sao không dùng vla-get-... để lấy điểm chèn mà dùng TD:textbase làm chi hè?

Bác Gia_Bach: Thì cũng phải "có nạc có mỡ" chứ.

 

(vlax-for e (vla-get-activeSelectionSet

...

)

Hì hì. Tại em biết ít hàm vl- quá nên phải làm thủ công bác ạ.

Bác có thể cho em xin 1 ít kiến thức về Vl- Vlax...ko ạ?

Em thích nó lắm nhưng mò mẫm hơi lâ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

Hì hì. Tại em biết ít hàm vl- quá nên phải làm thủ công bác ạ.

Bác có thể cho em xin 1 ít kiến thức về Vl- Vlax...ko ạ?

Em thích nó lắm nhưng mò mẫm hơi lâu.

ví dụ dùng vl :

(defun c:TVG(/ Obj ss );;;;TEXT VUONG GOC
  (if (and (setq obj (vlax-ename->vla-object (car (entsel "\nChon Line hoac Polyline:"))))
	   (not(prompt "\nChon text:"))
	   (setq ss (ssget '((0 . "TEXT")))) )
  (vlax-for e (vla-get-activeSelectionSet (vla-get-ActiveDocument(vlax-get-acad-object)))    
    (if (equal (vlax-safearray->list (variant-value (vla-get-TextAlignmentPoint e))) '(0.0 0.0 0.0) 0.001)
      (vla-put-InsertionPoint e (vlax-3d-point (vlax-curve-getClosestPointTo obj
						 (vlax-safearray->list (variant-value (vla-get-InsertionPoint e))) T)))
      (vla-put-TextAlignmentPoint e (vlax-3d-point (vlax-curve-getClosestPointTo obj
						     (vlax-safearray->list (variant-value (vla-get-TextAlignmentPoint e))) T))) )  )))

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 cảm ơn anh Gia_Bach.

Em vọc thôi. Hiii.

Nếu có tài liệu về vl-, vlax....rất mong được anh và các bác chia sẻ.

Biết được nhiều kiến thức em sẽ giúp đỡ mng được nhiều hơ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ác Gia_Bach xem lại dùm em.

Cad thông báo: ; error: Automation Error. Not applicable

Em có thể gởi file đó lên, khoanh vùng đối tượng bị lỗi xem sao 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

Lisp của bác Gia_bach thiếu vài trường hợp. Có vẽ như cái này thì phù hợp với ý tưởng của em?


(defun C:HA(/ obj pg);;;;TEXT VUONG GOC
 (if
  (and
   (setq obj (vlax-ename->vla-object (car (entsel "\nChon Line hoac Polyline:"))))
   (not (prompt "\nChon text:"))
   (ssget '((0 . "TEXT"))))
  (vlax-for e (vla-get-activeSelectionSet (vla-get-ActiveDocument (vlax-get-acad-object)))
   (setq pg (vlax-get e 'InsertionPoint))
   (vla-move e (vlax-3d-point pg) (vlax-3d-point (vlax-curve-getClosestPointTo obj pg 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

Dạ, chính xác là như vậy thôi ạ. Hii

Vậy là em lại học được của anh 1 vài hàm thật tuyệt

Cảm ơn bác Hạ nhiều. Bác quả là rất rất nhiệt tì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

@thanhduan2407 : 

sorry, do anh chỉ check trên bản vẽ 3D (Z=0).

 

Không hiểu k/quả mong muốn của em là gì ?15454_canle.jpg

  • 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

@thanhduan2407 : 

sorry, do anh chỉ check trên bản vẽ 3D (Z=0).

 

Không hiểu k/quả mong muốn của em là gì ?

Kết quả mong muốn của em là các điểm chuẩn của TEXT nằm trên đường LINE và PLINE. 2D hay 3D cũng được anh ạ. Em dùng lisp convert Text 3D để đưa cao độ về đúng với nội dung Text.

Cảm ơn anh Gia_Bach và bác Hạ 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

Nhờ các hàm của các bác mà em đã hoàn thiện LISP CONVERT TEXT 3D rồi ạ.

(defun C:CVT3D(/ ss0 ss ss1 ss2 item Caodo Pn)
(vl-load-com)
(setq ss (ssget (list (cons 0  "TEXT"))))
(setq ss1 (ChonTextSo ss))
(setq ss2 (acet-ss-to-list ss1))
(foreach item ss2
	(setq temp (entget item))
	(setq Caodo (cdr (assoc 1 temp)))
  	(setq e (vlax-ename->vla-object item))
  	(setq P1 (vlax-get e 'InsertionPoint))
	(setq Pnt (list (car P1) (cadr P1) (atof Caodo)))
  	(vla-move (vlax-ename->vla-object item) (vlax-3d-point P1) (vlax-3d-point Pnt))
)
(princ)
)

(defun ChonTextSo (ss / ss i ent str ss1) 
    (progn
      (setq i	0
	    ss1	(ssadd)
      )
      (repeat (sslength ss)
	(setq ent (ssname ss i)
	      str (cdr(assoc 1 (entget ent)))
	      i	  (+ 1 i)
	)
	(if (distof str 2)
	  (ssadd ent ss1)
	)
      )
      (if (> (sslength ss1) 0)
	ss1
      )      
    )
)

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

×