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

[Yêu Cầu] Di chuyển toàn bộ Text; Mtext đến đường line hoặc Plinenie

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

Các khoảng cách giữa text và Mtext với line hoặc Pline không đều nhau sấu nhìn mất mỹ quan quá.

Nhờ Các Bác viết cho 1 lisp di chuyển toàn bộ các  text và Mtext đến line hoặc Pline đều nhau theo khoảng cách như ví dụ trên.  Cám ơn Các Bác Nhiều.

VD.dwg

  • 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
3 giờ trước, pdhuyxn2 đã nói:

Các khoảng cách giữa text và Mtext với line hoặc Pline không đều nhau sấu nhìn mất mỹ quan quá.

Nhờ Các Bác viết cho 1 lisp di chuyển toàn bộ các  text và Mtext đến line hoặc Pline đều nhau theo khoảng cách như ví dụ trên.  Cám ơn Các Bác Nhiều.

VD.dwg

mình thấy bên leemac có lisp Align Text to Curve (Auto Re-align) cũng khá hay b dùng thử xem được như b không.

Khi b setup text theo 1 đường line, pline... khi b di chuyển đường line, pline đó thì TEXT cũng di chuyển theo luôn

http://www.lee-mac.com/dtcurve.html

  • Like 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
2 phút trước, Hoanghung97 đã nói:

mình thấy bên leemac có lisp Align Text to Curve (Auto Re-align) cũng khá hay b dùng thử xem được như b không.

Khi b setup text theo 1 đường line, pline... khi b di chuyển đường line, pline đó thì TEXT cũng di chuyển theo luôn

http://www.lee-mac.com/dtcurve.html

Cái Lisp trên không làm được theo Ý muốn của Mình remove hàng loạt Bạn Ạ. ThanK You!

 

 

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 như bạn mong muốn thì có thể viết được nhưng độ chính xác thì k cao lắm. vì phải so sánh tất cả các đường line hoặc pline để chọn ra đường chuẩn sau đó move text.

Với bản vẽ đơn giản thì ok, nhưng với bản vẽ quá lớn. chương trình sẽ chạy chậm vì phải so sánh quá nhiều. ưu tiên chọn từng vùng để chạy lệnh

(defun c:test (/ lsttxt lstln item mx1 distan eng dis2 ang2)
  (foreach item (acet-ss-to-list (ssget '((0 . "TEXT,LINE,*POLYLINE"))))
    (if (= "TEXT" (cdr (assoc 0 (entget item))))
      (setq lsttxt (cons (cons item (cdr (assoc 10 (entget item)))) lsttxt))
      (setq lstln (cons (vlax-ename->vla-object item) lstln))
    )
  )
  (setq distan (getdist "\nKhoang cach text:"))
  (foreach item lsttxt
    (setq 
      mx1 (mapcar '(lambda (x / dis1 pt ) (vlax-curve-getClosestPointTo x (cdr item))) lstln)
      mx1 (car (vl-sort mx1 '(lambda (a b) (< (distance (cdr item) a) (distance (cdr item) b)))))
      eng (entget (car item))
      dis2 (cdr (assoc 40 eng))
      ang2 (cdr (assoc 50 eng))
    )
    (if (< (sin (- ang2 (angle (cdr item) mx1))) -1e-14)
      (setq mx1 (polar mx1 (angle mx1 (cdr item)) (+ distan dis2)))
      (setq mx1 (polar mx1 (angle mx1 (cdr item)) distan))
    )
    (entmod (subst (cons 10 mx1) (assoc 10 eng) eng))
  )
  (princ)
)

 

  • Like 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
8 phút trước, tannguyen291 đã nói:

Lisp như bạn mong muốn thì có thể viết được nhưng độ chính xác thì k cao lắm. vì phải so sánh tất cả các đường line hoặc pline để chọn ra đường chuẩn sau đó move text.

Với bản vẽ đơn giản thì ok, nhưng với bản vẽ quá lớn. chương trình sẽ chạy chậm vì phải so sánh quá nhiều. ưu tiên chọn từng vùng để chạy lệnh


(defun c:test (/ lsttxt lstln item mx1 distan eng)
  (foreach item (acet-ss-to-list (ssget '((0 . "TEXT,LINE,*POLYLINE"))))
    (if (= "TEXT" (cdr (assoc 0 (entget item))))
      (setq lsttxt (cons (cons item (cdr (assoc 10 (entget item)))) lsttxt))
      (setq lstln (cons (vlax-ename->vla-object item) lstln))
    )
  )
  (setq distan (getdist "\nKhoang cach text:"))
  (foreach item lsttxt
    (setq 
      mx1 (mapcar '(lambda (x / dis1 pt ) (vlax-curve-getClosestPointTo x (cdr item))) lstln)
      mx1 (car (vl-sort mx1 '(lambda (a b) (< (distance (cdr item) a) (distance (cdr item) b)))))
      mx1 (polar mx1 (angle mx1 (cdr item)) distan)
      eng (entget (car item))
      eng (subst (cons 10 mx1) (assoc 10 eng) eng)
    )
    (entmod eng)
  )
  (princ)
)

 

đồng ý với quan điểm của bác. vd  như ở dưới hình khi nhập 1.5 thì khoảng cách từ đường line đến text đúng = khoảng cách nhập  (1.5) + height text (2.02)= 3.7

image.png.f57de9697f849218c7ceb8ca3b2a3f89.png   

image.png.cfc043892e5ed380440555bfbf09f9fe.png

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
2 phút trước, Hoanghung97 đã nói:

đồng ý với quan điểm của bác. vd  như ở dưới hình khi nhập 1.5 thì khoảng cách từ đường line đến text đúng = khoảng cách nhập  (1.5) + height text (2.02)= 3.7

  

 

Bạn nhanh tay quá. mình đã sửa lại lisp rồi. kk bạn xem code từ lúc chưa sửa.

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

với bản vẽ của thớt gửi lên thì chỉ có alignment Left thì đúng .sang alignment khác sang Top Left chẳng hạn thì nó bị sai bác lúc này thì lại phải trừ height, tương như xét đến các trường hợp căn chỉnh text khác nữa bác. xét đến cả bên trái, phải đường line nữa

image.png.f2873474caa53a39525bae2eb7e1d6b5.png

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
15 giờ trước, Hoanghung97 đã nói:

với bản vẽ của thớt gửi lên thì chỉ có alignment Left thì đúng .sang alignment khác sang Top Left chẳng hạn thì nó bị sai bác lúc này thì lại phải trừ height, tương như xét đến các trường hợp căn chỉnh text khác nữa bác. xét đến cả bên trái, phải đường line nữa

image.png.f2873474caa53a39525bae2eb7e1d6b5.png

 

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
49 phút trước, pdhuyxn2 đã nói:

image.png.b1e9ed9fde95694bbf5073fef0ad0cba.png

Cái này có cách nào khắc phục được không Các Bác Ơi ?

có cách đợi bác @tannguyen291fix cho không thì đợi mình rảnh mình fix, dạo này đang chạy deadline chưa có thời gian ngồi viết

  • Like 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
1 giờ} trướ}c, pdhuyxn2 đã nói:

Cái này có cách nào khắc phục được không Các Bác Ơi ?

mình fix lại rồi bạn xem thế nào nhé. 

(defun c:test (/ lsttxt lstln item mx1 distan eng dis2 ang2)
  (foreach item (acet-ss-to-list (ssget '((0 . "TEXT,LINE,*POLYLINE"))))
    (if (= "TEXT" (cdr (assoc 0 (entget item))))
      (setq lsttxt (cons (cons item (cdr (assoc 10 (entget item)))) lsttxt))
      (setq lstln (cons (vlax-ename->vla-object item) lstln))
    )
  )
  (setq distan (getdist "\nKhoang cach text:"))
  (foreach item lsttxt
    (setq 
      mx1 (mapcar '(lambda (x / dis1 pt ) (vlax-curve-getClosestPointTo x (cdr item))) lstln)
      mx1 (car (vl-sort mx1 '(lambda (a b) (< (distance (cdr item) a) (distance (cdr item) b)))))
      eng (entget (car item))
      dis2 (cdr (assoc 40 eng))
      ang2 (cdr (assoc 50 eng))
    )
    (if (< (sin (- ang2 (angle (cdr item) mx1))) -1e-14)
      (setq mx1 (polar mx1 (angle mx1 (cdr item)) (+ distan dis2)))
      (setq mx1 (polar mx1 (angle mx1 (cdr item)) distan))
    )
    (vla-move (vlax-ename->vla-object (car item)) (vlax-3d-point (cdr item)) (vlax-3d-point mx1))
    ;(entmod (subst (cons 10 mx1) (assoc 10 eng) eng))
  )
  (princ)
)

 

  • Like 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
3 phút trước, tannguyen291 đã nói:

mình fix lại rồi bạn nhé. 


(defun c:test (/ lsttxt lstln item mx1 distan eng dis2 ang2)
  (foreach item (acet-ss-to-list (ssget '((0 . "TEXT,LINE,*POLYLINE"))))
    (if (= "TEXT" (cdr (assoc 0 (entget item))))
      (setq lsttxt (cons (cons item (cdr (assoc 10 (entget item)))) lsttxt))
      (setq lstln (cons (vlax-ename->vla-object item) lstln))
    )
  )
  (setq distan (getdist "\nKhoang cach text:"))
  (foreach item lsttxt
    (setq 
      mx1 (mapcar '(lambda (x / dis1 pt ) (vlax-curve-getClosestPointTo x (cdr item))) lstln)
      mx1 (car (vl-sort mx1 '(lambda (a b) (< (distance (cdr item) a) (distance (cdr item) b)))))
      eng (entget (car item))
      dis2 (cdr (assoc 40 eng))
      ang2 (cdr (assoc 50 eng))
    )
    (if (< (sin (- ang2 (angle (cdr item) mx1))) -1e-14)
      (setq mx1 (polar mx1 (angle mx1 (cdr item)) (+ distan dis2)))
      (setq mx1 (polar mx1 (angle mx1 (cdr item)) distan))
    )
    (vla-move (vlax-ename->vla-object (car item)) (vlax-3d-point (cdr item)) (vlax-3d-point mx1))
    ;(entmod (subst (cons 10 mx1) (assoc 10 eng) eng))
  )
  (princ)
)

 

Ngon Rồi Bác Ạ. Cám ơn Bác. Chúc Bác và GĐ Mạnh Khỏe Hạnh Phúc và Thành Đạ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

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

×