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

Xin lisp đưa giá trị text vào giá trị attribute block

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

Mình có một số lượng lớn block và text cần đưa dữ liệu của text bên cạnh block vào giá trị của attribute. Xin mọi người giúp đỡ. Xin cảm ơn.

Mình gửi kèm file cad mình muốn đưa giá trị 136.98 vào attribute SO trong block image.png.cef9413147c26a3ee97af84e9318a5ab.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
37 phút trước, Duong Nhat Duy đã nói:

Em còn chưa hiểu đề bài. :))

nếu như block đó không có sẵn trong bản vẽ. mà pick một cái mẫu

thì chỉ cần replace là xong. dễ hơn lisp của bác chạy khá 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
1 giờ trước, tannguyen291 đã nói:

Em còn chưa hiểu đề bài. :))

nếu như block đó không có sẵn trong bản vẽ. mà pick một cái mẫu

thì chỉ cần replace là xong. dễ hơn lisp của bác chạy khá nhiều.

Đề bài bạn ấy nói cụ thể là block text gần nhau có sẵn mà

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
(defun c:t2a ( / noidung entin entout)
  (setq entin (entget(car (nentsel "\nText in")))
        entout  (entget(car (nentsel "\nText out")))
        )
  (if
    (and
    (or (= (ACET-DXF 0 entin) "TEXT")
          (= (ACET-DXF 0 entin) "ATTRIBUTE")
       )
    (or (= (ACET-DXF 0 entout) "TEXT")
          (= (ACET-DXF 0 entout) "ATTRIBUTE")
       )
    )
    (progn
  (setq noidung (ACET-DXF 1 entin))
  (setq entout (subst (cons 1 noidung) (assoc 1 entout) entout)
	)
  (entmod entout)
  
  (princ)
  )
  )
)

Đơn giản như truyền nội dung của dtext, att vào 1 att, text  trong block,  hoặc cho 1 dtext khác. Cái này mình hay áp dụng cho att trong khung tên bản vẽ. Vì truy cập trực tiếp vào đối tượng gốc nên khi out ra 1 text trong block (không là att) thì cần regen để hiển thị đú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
Vào lúc 19/3/2023 tại 14:57, cuongtk2 đã nói:

(defun c:t2a ( / noidung entin entout)
  (setq entin (entget(car (nentsel "\nText in")))
        entout  (entget(car (nentsel "\nText out")))
        )
  (if
    (and
    (or (= (ACET-DXF 0 entin) "TEXT")
          (= (ACET-DXF 0 entin) "ATTRIBUTE")
       )
    (or (= (ACET-DXF 0 entout) "TEXT")
          (= (ACET-DXF 0 entout) "ATTRIBUTE")
       )
    )
    (progn
  (setq noidung (ACET-DXF 1 entin))
  (setq entout (subst (cons 1 noidung) (assoc 1 entout) entout)
	)
  (entmod entout)
  
  (princ)
  )
  )
)

Đơn giản như truyền nội dung của dtext, att vào 1 att, text  trong block,  hoặc cho 1 dtext khác. Cái này mình hay áp dụng cho att trong khung tên bản vẽ. Vì truy cập trực tiếp vào đối tượng gốc nên khi out ra 1 text trong block (không là att) thì cần regen để hiển thị đúng.

Bạn í nói số lượng lớn text với att cạnh nhau ấy anh. Em nghĩ cần phải có bản vẽ gốc để biết nó cạnh nhau là cạnh nhau ntn nữa mới xử lý đca.

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

Quan trọng phải biết bản vẽ gốc nó ntn mới áp dụng chứ ko lại chân ông này cắm vào mông bà kia )))

Tại đề bài hơi hời hợt đó bạn :)), sẵn lisp nhặt trên mạng mình up luôn thôi.

Thật ra nếu đúng ý chủ thớt thì đề bài này mình cũng gặp khá nhiều, kiểu bản vẽ đang có sẵn nhiều tem đất (block att) và các text diện tích gần mỗi tem, yêu cầu bắn text đó vào att chỉ định, khi đó việc tạo mới block như a Cường nói là ko hợp lý vì block cũ còn mang các thông tin khác nữ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
22 giờ trước, Duong Nhat Duy đã nói:

Tại đề bài hơi hời hợt đó bạn :)), sẵn lisp nhặt trên mạng mình up luôn thôi.

Thật ra nếu đúng ý chủ thớt thì đề bài này mình cũng gặp khá nhiều, kiểu bản vẽ đang có sẵn nhiều tem đất (block att) và các text diện tích gần mỗi tem, yêu cầu bắn text đó vào att chỉ định, khi đó việc tạo mới block như a Cường nói là ko hợp lý vì block cũ còn mang các thông tin khác nữa.

Đúng rồi bạn! Cái này mình cũng từng viết trường hợp nối các text nằm cạnh nhau lại nên cũng hiểu vấn đề ở bản vẽ nữa.

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ái này cũng đơn giản thôi,

1. Chọn 1 text mẫu và 1 block mẫu. Xác định khoảng cách 2 đối tượng đó (d1)

2. Dùng ssget X để lọc text. => ls1

3. Dùng ssget X để lọc insert => ls2, chuyển nó về dạng ((ent1 position1) (ent2 position2)...)

4. Với mỗi text trong ls1 , sử dụng text positon  (p0) để làm cơ sở cho việc sort ls2 by distane to p0. => ls3

5. Truyền nội dung text cho phần tử đầu tiên ls3 (nếu tìm thấy insert thoả mãn khoảng cách  d1 +- sai số).

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

Cái này cũng đơn giản thôi,

1. Chọn 1 text mẫu và 1 block mẫu. Xác định khoảng cách 2 đối tượng đó (d1)

2. Dùng ssget X để lọc text. => ls1

3. Dùng ssget X để lọc insert => ls2, chuyển nó về dạng ((ent1 position1) (ent2 position2)...)

4. Với mỗi text trong ls1 , sử dụng text positon  (p0) để làm cơ sở cho việc sort ls2 by distane to p0. => ls3

5. Truyền nội dung text cho phần tử đầu tiên ls3 (nếu tìm thấy insert thoả mãn khoảng cách  d1 +- sai số).

Dạ. trước em đối với text em cũng là tương tự như thế này.

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 mọi người, bữa giờ em không có thời gian vào lại diễn đàn, e cũng có tìm được một lisp đưa text vào thay cho giá trị của attribute như bên dưới. có điều nó hơi thủ công.

 

(defun c:t2a ( / ss pt ent txt oldsnap)
(while (setq ent (nentsel "Pick Attribute"))
(setq pt (cadr ent))
(setq tag (cdr (assoc 2  (entget (car ent)))))
(setq ent (entsel "pick text"))
(setq txt (cdr (assoc 1  (entget (car ent)))))
(setq oldsnap (getvar 'osmode))
(setvar 'osmode 0)
(setq ss (ssget pt))
(foreach att (vlax-invoke (vlax-ename->vla-object (ssname SS 0 )) 'getattributes)
        (if (= tag (strcase (vla-get-tagstring att)))
        (vla-put-textstring att txt)
        )
)
)
(setvar 'osmode oldsnap)
(princ)
)

 

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

Cho em hỏi cũng dạng yêu cầu như vậy có lisp thực hiện dạng sao chép văn bản vào block att khung tên như vậy không ạimage.thumb.png.832eab3e3d1e926fbb315a18222151e9.png

Lệnh Q1 nhé bạ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
3 giờ trước, OngNguyenVanHan đã nói:

Cho em hỏi cũng dạng yêu cầu như vậy có lisp thực hiện dạng sao chép văn bản vào block att khung tên như vậy không ạimage.thumb.png.832eab3e3d1e926fbb315a18222151e9.png

Nếu sử dụng cho khung tên thì bạn có thể tham khảo video này của mình ak.

https://www.youtube.com/watch?v=9Bn3o1ciIyM

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

×