Đến nội dung


Hình ảnh
- - - - -

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


  • Please log in to reply
23 replies to this topic

#1 thanhduan2407

thanhduan2407

    biết lệnh adcenter

  • Advance Member
  • PipPipPipPipPipPipPip
  • 993 Bài viết
Điểm đánh giá: 223 (khá)

Đã gửi 27 August 2014 - 12:05 PM

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
)

 


  • 0



Tôi là con kiến bò trên sa mạc kiến thức bao la. Biển học thật rộng lớn







#2 Tot77

Tot77

    biết lệnh adcenter

  • Members
  • PipPipPipPipPipPipPip
  • 990 Bài viết
Điểm đánh giá: 498 (tốt)

Đã gửi 27 August 2014 - 12:34 PM

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.


  • 0

#3 thanhduan2407

thanhduan2407

    biết lệnh adcenter

  • Advance Member
  • PipPipPipPipPipPipPip
  • 993 Bài viết
Điểm đánh giá: 223 (khá)

Đã gửi 27 August 2014 - 01:15 PM

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


  • 0



Tôi là con kiến bò trên sa mạc kiến thức bao la. Biển học thật rộng lớn







#4 Tot77

Tot77

    biết lệnh adcenter

  • Members
  • PipPipPipPipPipPipPip
  • 990 Bài viết
Điểm đánh giá: 498 (tốt)

Đã gửi 27 August 2014 - 02:35 PM

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

  • 1

#5 thanhduan2407

thanhduan2407

    biết lệnh adcenter

  • Advance Member
  • PipPipPipPipPipPipPip
  • 993 Bài viết
Điểm đánh giá: 223 (khá)

Đã gửi 27 August 2014 - 03:11 PM

Thật tuyệt vời rồi anh. Em học được của anh rất nhiều

Chúc anh sức khoẻ và thành công


  • 0



Tôi là con kiến bò trên sa mạc kiến thức bao la. Biển học thật rộng lớn







#6 thanhduan2407

thanhduan2407

    biết lệnh adcenter

  • Advance Member
  • PipPipPipPipPipPipPip
  • 993 Bài viết
Điểm đánh giá: 223 (khá)

Đã gửi 27 August 2014 - 03:15 PM

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


  • 0



Tôi là con kiến bò trên sa mạc kiến thức bao la. Biển học thật rộng lớn







#7 Doan Van Ha

Doan Van Ha

    biết lệnh adcenter

  • CADViet Team
  • PipPipPipPipPipPipPip
  • 5448 Bài viết
Điểm đánh giá: 2624 (tuyệt vời)

Đã gửi 27 August 2014 - 04:37 PM

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


  • 1

* Chỉ nên yêu cầu Lisp khi bạn làm việc đó mất cả ngày nhưng họ chỉ viết 1 giờ. Đừng nêu yêu cầu Lisp khi bạn chỉ làm 1 giờ nhưng bắt họ phải mất cả ngày.

* Nhờ viết lisp cũng như đi khám bệnh. Chỉ gởi căn cước và than sắp chết thì không bác sỹ nào cứu sống được.


#8 thanhduan2407

thanhduan2407

    biết lệnh adcenter

  • Advance Member
  • PipPipPipPipPipPipPip
  • 993 Bài viết
Điểm đánh giá: 223 (khá)

Đã gửi 27 August 2014 - 04:58 PM

Hì hì. Em máy móc quá à nghen. Hì hì.


  • 0



Tôi là con kiến bò trên sa mạc kiến thức bao la. Biển học thật rộng lớn







#9 Doan Van Ha

Doan Van Ha

    biết lệnh adcenter

  • CADViet Team
  • PipPipPipPipPipPipPip
  • 5448 Bài viết
Điểm đánh giá: 2624 (tuyệt vời)

Đã gửi 27 August 2014 - 05:18 PM

Đã 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è?




  • 0

* Chỉ nên yêu cầu Lisp khi bạn làm việc đó mất cả ngày nhưng họ chỉ viết 1 giờ. Đừng nêu yêu cầu Lisp khi bạn chỉ làm 1 giờ nhưng bắt họ phải mất cả ngày.

* Nhờ viết lisp cũng như đi khám bệnh. Chỉ gởi căn cước và than sắp chết thì không bác sỹ nào cứu sống được.


#10 gia_bach

gia_bach

    biết lệnh adcenter

  • CADViet Team
  • PipPipPipPipPipPipPip
  • 1435 Bài viết
Điểm đánh giá: 1426 (rất tốt)

Đã gửi 28 August 2014 - 07:32 AM

Đã 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

...

)


  • 0

#11 thanhduan2407

thanhduan2407

    biết lệnh adcenter

  • Advance Member
  • PipPipPipPipPipPipPip
  • 993 Bài viết
Điểm đánh giá: 223 (khá)

Đã gửi 28 August 2014 - 08:15 AM

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.


  • 0



Tôi là con kiến bò trên sa mạc kiến thức bao la. Biển học thật rộng lớn







#12 gia_bach

gia_bach

    biết lệnh adcenter

  • CADViet Team
  • PipPipPipPipPipPipPip
  • 1435 Bài viết
Điểm đánh giá: 1426 (rất tốt)

Đã gửi 28 August 2014 - 08:28 AM

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

  • 0

#13 thanhduan2407

thanhduan2407

    biết lệnh adcenter

  • Advance Member
  • PipPipPipPipPipPipPip
  • 993 Bài viết
Điểm đánh giá: 223 (khá)

Đã gửi 28 August 2014 - 09:15 AM

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.


  • 0



Tôi là con kiến bò trên sa mạc kiến thức bao la. Biển học thật rộng lớn







#14 thanhduan2407

thanhduan2407

    biết lệnh adcenter

  • Advance Member
  • PipPipPipPipPipPipPip
  • 993 Bài viết
Điểm đánh giá: 223 (khá)

Đã gửi 28 August 2014 - 09:23 AM

Bác Gia_Bach xem lại dùm em.

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


  • 0



Tôi là con kiến bò trên sa mạc kiến thức bao la. Biển học thật rộng lớn







#15 Doan Van Ha

Doan Van Ha

    biết lệnh adcenter

  • CADViet Team
  • PipPipPipPipPipPipPip
  • 5448 Bài viết
Điểm đánh giá: 2624 (tuyệt vời)

Đã gửi 28 August 2014 - 02:12 PM

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é.


  • 0

* Chỉ nên yêu cầu Lisp khi bạn làm việc đó mất cả ngày nhưng họ chỉ viết 1 giờ. Đừng nêu yêu cầu Lisp khi bạn chỉ làm 1 giờ nhưng bắt họ phải mất cả ngày.

* Nhờ viết lisp cũng như đi khám bệnh. Chỉ gởi căn cước và than sắp chết thì không bác sỹ nào cứu sống được.


#16 thanhduan2407

thanhduan2407

    biết lệnh adcenter

  • Advance Member
  • PipPipPipPipPipPipPip
  • 993 Bài viết
Điểm đánh giá: 223 (khá)

Đã gửi 28 August 2014 - 04:12 PM

Chắc là do em đưa ra yêu cầu quá cao nên vậy.

http://www.cadviet.c...vuong_goc_1.dwg


  • 0



Tôi là con kiến bò trên sa mạc kiến thức bao la. Biển học thật rộng lớn







#17 Doan Van Ha

Doan Van Ha

    biết lệnh adcenter

  • CADViet Team
  • PipPipPipPipPipPipPip
  • 5448 Bài viết
Điểm đánh giá: 2624 (tuyệt vời)

Đã gửi 29 August 2014 - 08:38 AM

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


  • 1

* Chỉ nên yêu cầu Lisp khi bạn làm việc đó mất cả ngày nhưng họ chỉ viết 1 giờ. Đừng nêu yêu cầu Lisp khi bạn chỉ làm 1 giờ nhưng bắt họ phải mất cả ngày.

* Nhờ viết lisp cũng như đi khám bệnh. Chỉ gởi căn cước và than sắp chết thì không bác sỹ nào cứu sống được.


#18 thanhduan2407

thanhduan2407

    biết lệnh adcenter

  • Advance Member
  • PipPipPipPipPipPipPip
  • 993 Bài viết
Điểm đánh giá: 223 (khá)

Đã gửi 29 August 2014 - 08:54 AM

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


  • 0



Tôi là con kiến bò trên sa mạc kiến thức bao la. Biển học thật rộng lớn







#19 gia_bach

gia_bach

    biết lệnh adcenter

  • CADViet Team
  • PipPipPipPipPipPipPip
  • 1435 Bài viết
Điểm đánh giá: 1426 (rất tốt)

Đã gửi 29 August 2014 - 09:22 AM

@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


  • 1

#20 Doan Van Ha

Doan Van Ha

    biết lệnh adcenter

  • CADViet Team
  • PipPipPipPipPipPipPip
  • 5448 Bài viết
Điểm đánh giá: 2624 (tuyệt vời)

Đã gửi 29 August 2014 - 09:31 AM

Ngoài yếu tố 3D thì nó còn dính thêm 2 trường hợp là Fit và Align nữa bác ạ.


  • 2

* Chỉ nên yêu cầu Lisp khi bạn làm việc đó mất cả ngày nhưng họ chỉ viết 1 giờ. Đừng nêu yêu cầu Lisp khi bạn chỉ làm 1 giờ nhưng bắt họ phải mất cả ngày.

* Nhờ viết lisp cũng như đi khám bệnh. Chỉ gởi căn cước và than sắp chết thì không bác sỹ nào cứu sống được.