Đến nội dung


Hình ảnh
- - - - -

Kiểm Tra Vị Trí TEXT


  • Please log in to reply
3 replies to this topic

#1 mua_buon12

mua_buon12

    biết vẽ circle

  • Members
  • PipPip
  • 34 Bài viết
Điểm đánh giá: 0 (bình thường)

Đã gửi 27 June 2009 - 04:01 PM

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.c...files/Vi_du.jpg
  • 0
Khi Lập Trình Kiến Thức Là Một Phần, Nghệ Thuật Mới Là Tất Cả.

#2 anhcos

anhcos

    biết lệnh hatchedit

  • Advance Member
  • PipPipPipPip
  • 260 Bài viết
Điểm đánh giá: 170 (tàm tạm)

Đã gửi 27 June 2009 - 10:01 PM

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
  • 0
Clear sky!

MF Rock collection.

#3 thiep

thiep

    biết dimbaseline

  • Members
  • PipPipPipPipPip
  • 369 Bài viết
Điểm đánh giá: 260 (khá)

Đã gửi 29 June 2009 - 05:19 PM

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"
  • 0

#4 mua_buon12

mua_buon12

    biết vẽ circle

  • Members
  • PipPip
  • 34 Bài viết
Điểm đánh giá: 0 (bình thường)

Đã gửi 30 June 2009 - 06:46 PM

Em cảm ơn về sự giúp đỡ của các bác.Em sẽ áp dụng những kiến thức này vào công việc. Thank for all!
  • 0
Khi Lập Trình Kiến Thức Là Một Phần, Nghệ Thuật Mới Là Tất Cả.