Chuyển đến nội dung
Diễn đàn CADViet
Đăng nhập để thực hiện theo  
huunhantvxdts

Lấy chiều cao chữ của Tag trong Block Att

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

23 phút trước, huunhantvxdts đã nói:

Mình có boclk Att có các tag bây giờ mình muốn lấy chiều cao chữ của các Tag

Nhờ mọi người ai biết chỉ giùm, cám ơn mọi người

Cái này theo em thì bác lấy ScaleY của block trước rồi dùng vlax-for duyệt qua từng thành phần của Block, kiểm tra Objectname nếu là AcDbAttribute thì lấy thông tin tag, chiều cao rồi nhân với Scale Y để lấy chiều cao thực tế của Block đó. (vì chiều cao duyệt qua vlax-for là ở tỷ lệ 1-1) 

  • 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

Dùng menthod GetAttributes để lấy danh sách att.

Kiểm tra att nào có tag đúng theo ý bạn rồi lấy thôi mà.

Vì chiều cao text này thay đổi dc nên lấy theo block ko đúng lắm.

 

Test:

(mapcar '(lambda(x) (list (vla-get-tagstring x) (vla-get-height x)))
      (vlax-invoke (vlax-ename->vla-object(car(entsel))) 'GetAttributes))

 

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

Dùng menthod GetAttributes để lấy danh sách att.

Kiểm tra att nào có tag đúng theo ý bạn rồi lấy thôi mà.

Vì chiều cao text này thay đổi dc nên lấy theo block ko đúng lắm.

 

Test:

  • cadvietlisp.lsp
    lisp help
  •  

(mapcar '(lambda(x) (list (vla-get-tagstring x) (vla-get-height x)))
      (vlax-invoke (vlax-ename->vla-object(car(entsel))) 'GetAttributes))

 

Cám ơn bạn 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
13 giờ trước, ngokiet đã nói:

Dùng menthod GetAttributes để lấy danh sách att.

Kiểm tra att nào có tag đúng theo ý bạn rồi lấy thôi mà.

Vì chiều cao text này thay đổi dc nên lấy theo block ko đúng lắm.

 

Test:

  • cadvietlisp.lsp
    lisp help
  •  

(mapcar '(lambda(x) (list (vla-get-tagstring x) (vla-get-height x)))
      (vlax-invoke (vlax-ename->vla-object(car(entsel))) 'GetAttributes))

 

Tiện bác cho em hỏi, có Method nào cho phép chọn đối tượng khác bên trong block không bác, giả sử lấy ra tọa độ Polyline trong block 

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, Doan Van Ha đã nói:

Sao không dùng nentsel rồi lấy?

Bác Hạ ơi, nếu dùng Nentsel thì chỉ lấy được của 1 block, và chỉ được 1 Polyline. Nếu lấy được nhiều Polyline  trong Block giống dạng Vlax-for nhưng ở tọa độ của block trong Model để lấy tọa độ chuẩn thì cháu chưa biết (ngoài cách phá ra rồi ssget "W", sau đó insert lại) có vẻ không ổn lắ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

Tham khảo 2 hàm lấy các đối tượng bên trong các blocks chọn. Từ đó kiểm tra thằng nào Polyline để lấy thông tin.


;----- 
(defun GetBlockEntities  (Blk / tStr)
  (if (tblsearch "BLOCK" Blk)
    (GetObj (tblobjname "BLOCK" Blk))))
(defun GetObj  (bObj)
  (if (setq bObj (entnext bObj))
    (cons bObj (GetObj bObj))))
;----- 
(defun C:kk( / nfo items)
 (if (= (cdr (assoc 0 (setq nfo (entget (car (entsel)))))) "INSERT")
  (vlax-for item
   (vla-item (vla-get-blocks (vla-get-activedocument (vlax-get-acad-object)))
    (cdr (assoc 2 nfo)))
   (setq items (cons (vlax-vla-object->ename item) items)))))

 

  • 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
16 phút trước, Doan Van Ha đã nói:

Tham khảo 2 hàm lấy các đối tượng bên trong các blocks chọn. Từ đó kiểm tra thằng nào Polyline để lấy thông tin.

 



;----- 
(defun GetBlockEntities  (Blk / tStr)
  (if (tblsearch "BLOCK" Blk)
    (GetObj (tblobjname "BLOCK" Blk))))
(defun GetObj  (bObj)
  (if (setq bObj (entnext bObj))
    (cons bObj (GetObj bObj))))
;----- 
(defun C:kk( / nfo items)
 (if (= (cdr (assoc 0 (setq nfo (entget (car (entsel)))))) "INSERT")
  (vlax-for item
   (vla-item (vla-get-blocks (vla-get-activedocument (vlax-get-acad-object)))
    (cdr (assoc 2 nfo)))
   (setq items (cons (vlax-vla-object->ename item) items)))))

 

Bác ơi, hàm này của bác như cháu nói ở trên, nó chỉ ra thông tin của các entity ở lúc tạo block, tỷ lệ 1-1, còn khi đã move hoặc ở tỷ lệ khác thì không lấy được tọa độ chuẩn

  • 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
14 phút trước, Doan Nguyen Van đã nói:

Bác ơi, hàm này của bác như cháu nói ở trên, nó chỉ ra thông tin của các entity ở lúc tạo block, tỷ lệ 1-1, còn khi đã move hoặc ở tỷ lệ khác thì không lấy được tọa độ chuẩn

Phát hiện được ý hay từ câu hỏi của cháu: té ra tọa độ điểm của các entity trong block là cố định dù đã move!!! Thanks.

Trong trường hợp này bác sẽ dùng cách này:

(command "undo" "begin")

lấy (entlast)

nổ block

lấy các entity sinh ra sau entlast

lấy thông tin chúng

(command "undo" "end")

(command "u") 

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

Phát hiện được ý hay từ câu hỏi của cháu: té ra tọa độ điểm của các entity trong block là cố định dù đã move!!! Thanks.

Trong trường hợp này bác sẽ dùng cách này:

(command "undo" "begin")

lấy (entlast)

nổ block

lấy các entity sinh ra sau entlast

lấy thông tin chúng

(command "undo" "end")

(command "u") 

Ý tưởng của bác khá hay, có lẽ việc lấy entity sau entlast sẽ không bị chọn nhầm so với ssget "W", để cháu test thử xem, thank bá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
1 giờ} trướ}c, Doan Nguyen Van đã nói:

Tiện bác cho em hỏi, có Method nào cho phép chọn đối tượng khác bên trong block không bác, giả sử lấy ra tọa độ Polyline trong block 

Bác dùng Vlax-dump-object sẽ biết có menthod nào mà.

 

- Menthod có thễ dùng để lấy polyline là Explore

Tuy nhiên nó như lệnh explore của Cad. Là tạo ra các object explore. Nhưng nó trả về danh sách object cho bạn kiểm tra cần lấy cái nào. Và xóa cái không cần thiết.

 

Thật ra lấy các attributes thì bạn cũng có thể dùng entnext 

Entnext block nó trả về att đầu tiên. entnext att dầu nó trả về att tiếp nếu không có thì nó tra về ent có tên là SEQEND.

Vì các Att tồn tại là ent của CAD nên có thể chỉnh font, text, style ... như 1 text bình thường. Và khi getattributes thì nó trả về các vbaobject của các att đó. 

Còn các thành phần khác thì không có obj tương ứng nên ko dc.

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

Bác dùng Vlax-dump-object sẽ biết có menthod nào mà.

 

- Menthod có thễ dùng để lấy polyline là Explore

Tuy nhiên nó như lệnh explore của Cad. Là tạo ra các object explore. Nhưng nó trả về danh sách object cho bạn kiểm tra cần lấy cái nào. Và xóa cái không cần thiết.

 

Thật ra lấy các attributes thì bạn cũng có thể dùng entnext 

Entnext block nó trả về att đầu tiên. entnext att dầu nó trả về att tiếp nếu không có thì nó tra về ent có tên là SEQEND.

Vì các Att tồn tại là ent của CAD nên có thể chỉnh font, text, style ... như 1 text bình thường. Và khi getattributes thì nó trả về các vbaobject của các att đó. 

Còn các thành phần khác thì không có obj tương ứng nên ko dc.

Cảm ơn bác nhé, cái này e thấy giống vla-expode, mà có vẻ gọn hơn, thank bá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
17 phút trước, Doan Nguyen Van đã nói:

Cảm ơn bác nhé, cái này e thấy giống vla-expode, mà có vẻ gọn hơn, thank bác

Là 1 mà. vla vs vlax. Cái GetAttributes kia cũng vậy mà có vla-GetAttributes.

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

Là 1 mà. vla vs vlax. Cái GetAttributes kia cũng vậy mà có vla-GetAttributes.

Tại dùng Vla-explode thì nó chỉ nổ block thôi chứ không ra List vla như Vlax-invoke 

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
11 phút trước, Doan Nguyen Van đã nói:

Tại dùng Vla-explode thì nó chỉ nổ block thôi chứ không ra List vla như Vlax-invoke 

Có mà bác. Nó dạng variant thôi.

(vlax-safearray->list (vlax-variant-value (vla-explode (vlax-ename->vla-object (car(entsel))))))

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

Có mà bác. Nó dạng variant thôi.

(vlax-safearray->list (vlax-variant-value (vla-explode (vlax-ename->vla-object (car(entsel))))))

^^, thế nên e mới bảo cái Vlax-invoke nó gọn 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

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
Đăng nhập để thực hiện theo  

×