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

Kiểm Tra Vị Trí TEXT

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

Dear All!

Các bác ơi bản vẽ của em text bị trùng đè lên polyline mà tìm thủ công rất lâu vì vậy em muốn có một modul VBA tìm tự động. yêu cầu bây giờ như sau:

- quét tất cả các đối tượng trên bản vẽ

- Kiểm tra nếu có text nào bị trùng đè thì báo 1 point tại vị trí đó

Em mong được các cao thủ VBA trợ giúp. em đã up ví dụ trên diễn đàn.Em cảm ơn các bác rất nhiều!

http://www.cadviet.com/upfiles/Vi_du.jpg

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

Thuật giải thô thiển có thể như sau:

 

Áp dụng cho các Text nằm ngang or đứng (trường hợp xiên fải giải khác 1 chút)

 

Sử dụng 2 hàm sau:

 

1. Một đối tượng Text bao giờ cũng nằm gọn trong 1 hình chữ nhật, tương đương với 1 polyline.

Sử dụng hàm TextObj.GetBoundingBox MinPoint, MaxPoint để biết vị trí của hình chữ nhật này.

Trong đó MinPoint, MaxPoint là mảng 3 phần tử.

Từ 2 điểm này sẽ biết 4 điểm để tạo ra polyline đường bao, gọi đó là RecObj

 

2. Hàm IntersectWith dùng để xác định các điểm giao giữa các đường. Tuy nhiên nếu có giao điểm thì chỉ 1 là đủ.

Cú pháp CacGiaoDiem= PLineObj.IntersectWith(RecObj,0)

 

CacGiaoDiem là mảng các điểm liên tiếp nhau theo thứ tự X, Y, Z

 

 

Triển khai:

Dùng 2 tập chọn đối tượng, TexSelSet cho Text, PLineSelSet cho Line/Polyline

 

Duyệt qua từng đối tượng TextObj trong tập chọn TexSelSet

Ứng với mỗi TextObj, xác định được hình chữ nhật qua 2 điểm --> có 4 điểm của hình chữ nhật --> tạo ra đối tượng RecObj

duyệt qua từng PLineObj trong tập chọn PLineSelSet

dùng hàm PLineObj.IntersectWith để tìm giao điểm giữa PLineObj và RecObj

 

Nếu không có giao điểm thì tìm theo PLine kế tiếp

 

Nếu có thì tạo Point tại điểm giao đầu tiên và chuyển sang tìm với TextObj kế tiếp

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
Thuật giải thô thiển có thể như sau:

 

Áp dụng cho các Text nằm ngang or đứng (trường hợp xiên fải giải khác 1 chút)

 

Sử dụng 2 hàm sau:

 

1. Một đối tượng Text bao giờ cũng nằm gọn trong 1 hình chữ nhật, tương đương với 1 polyline.

Sử dụng hàm TextObj.GetBoundingBox MinPoint, MaxPoint để biết vị trí của hình chữ nhật này.

Trong đó MinPoint, MaxPoint là mảng 3 phần tử.

Từ 2 điểm này sẽ biết 4 điểm để tạo ra polyline đường bao, gọi đó là RecObj

 

2. Hàm IntersectWith dùng để xác định các điểm giao giữa các đường. Tuy nhiên nếu có giao điểm thì chỉ 1 là đủ.

Cú pháp CacGiaoDiem= PLineObj.IntersectWith(RecObj,0)

 

. . .

@anhcos, thuật giải của bạn sẽ không đúng khi các đường Polyline cắt BoundingBox mà chưa chắc cắt text, vì text không nằm "gọn" trong BoundingBox như bạn nghĩ đâu, nhiều khi text còn khoảng trống nữa.

Thiep đề nghị 1 giải pháp khác:

- xét từng text một, nếu có 1 khoảng trống thì chèn 1 ký từ lạ vào, là ký tự không giống 1 ký tự nào trong các text, ví dụ "mua buon12" thay bằng "mua_buon12"

- tạo tập hợp chọn là các curve (ở đây đề bài đặt ra là polyline),

- từng polyline một, sẽ lọc lấy các nút đỉnh đưa vào list, tạo listfence.

- tạo tập hợp chọn TEXT bằng fence, listfence ở trên.

- từng text chọn được sẽ đáng dấu bằng vòng tròn.

- trả lại text gốc bằng cách xóa ký tự lạ (trả lại tên "mua_buon12" thành "mua buon12" cho em!)

- ok.

Thiep chỉ quen viết lisp thôi chưa rành VBA, Mua_buon nếu cần lisp, xin đề nghị ở topic "viết lisp theo yêu cầ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

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

×