C C H H Ư Ư Ơ Ơ N N G G V V : : L L Ậ Ậ P P T T R R Ì Ì N N H H T T R R Ê Ê N N A A U U T T O O C C A A D D 233 Ví dụ sau thêm tất cả các đối tượng đi qua điểm (6.8 , 9.4 , 0) vào đối tượng SelectionSet có tên là “MySelectionSet”: Sub VD_SelectAtPoint() ' Tạo đối tượng SelectionSet Dim ssetObj As AcadSelectionSet On Error Resume Next Set ssetObj = ThisDrawing.SelectionSets("MySelectionSet") If Err <> 0 Then Err.Clear Set ssetObj = ThisDrawing.SelectionSets.Add("MySelectionSet") Else ssetObj.Clear End If ' Thêm tất cả các đối tượng qua điểm (6.8,9.4,0) ' vào đối tượng SelectionSet Dim point(0 To 2) As Double point(0) = 6.8: point(1) = 9.4: point(2) = 0 ssetObj.SelectAtPoint point End Sub PhươngthứcSelectByPolygon Phương thức này thực hiện chọn các đối tượng để thêm vào SelectionSet dựa trên mối tương quan với đường đa tuyến do người lập trình xác định trước. Cú pháp của phương thức này như sau: object.SelectByPolygon Mode, PointsList[, FilterType][, FilterData] Tham số Giải thích Object Là đối tượng SelectionSet Mode Tham số xác định chế độ chọn đối tượng. PointsList Tham số tùy chọn, kiểu Variant (mảng kiểu Double) chứa toạ độ 3 chiều của các đỉnh của đường đa tuyến. FilterType, FilterData Tham số tuỳ chọn, xác định bộ lọc đối tượng (Chi tiết tham khảo phần “Định nghĩa bộ lọc đối tượng cho SelectionSet” trang 236). Giá trị của tham số Mode sẽ xác định cách thức lựa chọn đối tượng khi sử dụng phương thức SelectByPolygon. Giá trị của tham số này có thể là một trong những giá trị sau: Hằng số Giá trị Ý nghĩa acSelectionSetFence 2 Chọn các đối tượng có giao cắt với đường bao đa tuyến có tọa độ các đỉnh xác định bởi PointsList. acSelectionSetWindowPolygon 6 Chọn các đối tượng nằm hoàn toàn bên trong miền đa giác có tọa độ các đỉnh xác định bởi PointsList. acSelectionSetCrossingPolygon 7 Chọn các đối tượng nằm hoàn toàn hoặc một phần bên trong miền đa giác có tọa độ các đỉnh xác định bởi PointsList. AutoCAD sẽ tự động vẽ đa giác từ các tọa độ này theo nguyên tắc các cạnh của đa giác không giao nhau. 234 Minh hoạ dưới đây sẽ làm rõ ý nghĩa các giá trị của tham số Mode. Các đường liền là các đối tượng trên bản vẽ của AutoCAD, còn các đường nét đứt là đường đa tuyến nối các đỉnh được cho bởi tham số PointList. Hình V-10: Minh hoạ các chế độ chọn đối tượng của phương thức SelectByPolygon. Kết quả của phương thức SelectByPolygon là rất khác nhau tuỳ thuộc vào giá trị của tham số Mode. Nếu tham số Mode có giá trị là: Ø Ø acSelectionSetFence: đối tượng được chọn là hình ellipese. Ø Ø acSelectionSetWindowPolygon: đối tượng được chọn là hình chữ nhật và hình tròn. Ø Ø acSelectionSetCrossingPolygon: đối tượng được chọn là tất cả các hình trên. Đoạn mã sau sẽ minh hoạ cách thức sử dụng phương thức SelectByPolygon Sub VD_SelectByPolygon() ' Tạo đối tượng SelectionSet Dim ssetObj As AcadSelectionSet On Error Resume Next Set ssetObj = ThisDrawing.SelectionSets("MySelectionSet") If Err <> 0 Then Err.Clear Set ssetObj = ThisDrawing.SelectionSets.Add("MySelectionSet") Else ssetObj.Clear End If ' Xác định các đỉnh của đường đa tuyến Dim pointsArray(0 To 11) As Double pointsArray(0) = 28.2: pointsArray(1) = 17.2: pointsArray(2) = 0 pointsArray(3) = -5: pointsArray(4) = 13: pointsArray(5) = 0 pointsArray(6) = -3.3: pointsArray(7) = -3.6: pointsArray(8) = 0 pointsArray(9) = 28: pointsArray(10) = -3: pointsArray(11) = 0 ' Xác định chế độ chọn đối tượng Dim mode As Integer mode = acSelectionSetFence ' Chọn đối tượng ssetObj.SelectByPolygon mode, pointsArray End Sub PhươngthứcSelectOnScreen Phương thức này sẽ hiển thị dòng nhắc “ Select object:” tại dòng lệnh và cho phép người dùng chọn đối tượng trực tiếp trên màn hình bản vẽ, cách thao tác trên màn hình AutoCAD này tương tự như khi sử dụng các lệnh thông thường khác của AutoCAD, mà có yêu cầu lựa chọn đối tượng (ví dụ như lệnh Copy). Cú pháp của phương thức này như sau: C C H H Ư Ư Ơ Ơ N N G G V V : : L L Ậ Ậ P P T T R R Ì Ì N N H H T T R R Ê Ê N N A A U U T T O O C C A A D D 235 object.SelectOnScreen [FilterType] [, FilterData] Tham số Giải thích Object Là đối tượng SelectionSet FilterType, FilterData Tham số tuỳ chọn, xác định bộ lọc đối tượng (Chi tiết tham khảo phần “Định nghĩa bộ lọc đối tượng cho SelectionSet” trang 236). Đoạn mã sau sẽ minh hoạ cách thức sử dụng phương thức SelectOnScreen: Sub VD_SelectOnScreen() ' Tạo đối tượng SelectionSet Dim ssetObj As AcadSelectionSet On Error Resume Next Set ssetObj = ThisDrawing.SelectionSets("MySelectionSet") If Err <> 0 Then Err.Clear Set ssetObj = ThisDrawing.SelectionSets.Add("MySelectionSet") Else ssetObj.Clear End If ' Hiển thị thêm dòng nhắc tại dòng lệnh ThisDrawing.Utility.Prompt vbCrLf & "Chon doi tuong tren man hinh:" ' Chọn đối tượng trên màn hình ssetObj.SelectOnScreen End Sub 5.3.3. Thao tác với các đối tượng trong SelectionSet Như phần trước đã trình bày, thực chất đối tượng SelectionSet là một tập đối tượng dùng để nhóm các đối tượng hình học lại với nhau nhằm mục đích hiệu chỉnh các đối tượng hình học đó dễ dàng hơn. Do bản thân là một tập đối tượng nên cách thức truy cập đến tất cả các đối tượng bên trong SelectionSet tốt nhất là sử d ụng cấu trúc lặp “For each … next”. Đoạn mã lệnh sau sẽ yêu cầu người sử dụng thực hiện chọn đối tượng trên màn hình bản vẽ, sau đó tiến hành đổi màu các đối tượng được chọn thành màu xanh. Sub VD_SelectOnScreen() ' Tạo đối tượng SelectionSet Dim ssetObj As AcadSelectionSet On Error Resume Next Set ssetObj = ThisDrawing.SelectionSets("MySelectionSet") If Err <> 0 Then Err.Clear Set ssetObj = ThisDrawing.SelectionSets.Add("MySelectionSet") Else ssetObj.Clear End If ' Chọn đối tượng trên màn hình ThisDrawing.Utility.Prompt vbCrLf & "Chon doi tuong can doi mau:" ssetObj.SelectOnScreen ' Thực hiện các thao tác với đối tượng được chọn Dim ent As AcadEntity For Each ent In ssetObj 236 ' Đoạn chương trình xử lý các đối tượng sẽ nằm ở đây ' Trong ví dụ này, các đối tượng sẽ được đổi màu thành màu xanh ent.Color = acBlue ent.Update Next ent End Sub 5.3.4. Định nghĩa bộ lọc đối tượng cho SelectionSet Trong tất cả các phương thức chọn đối tượng dạng SelectXXX đều có hai tham số tuỳ chọn FilterType và FilterData, là tham số được sử dụng để lọc các đối tượng được chọn theo một tiêu chí nào đó. Các tiêu chí thường được sử dụng bao gồm: loại đối tượng (đường thẳng, đường tròn ), màu sắc, kiểu đường nét, lớp Khi sử dụng bộ lọc đối tượng, chỉ có những đối tượng thoả mãn các tiêu chí trong bộ lọc mới được chọn để thêm vào đối tượng SelectionSet. Để thiết lập b ộ lọc đối tượng, hai tham số FilterType và FilterData cần phải được sử dụng song hành: Ø Ø FilterType: là tham số kiểu Variant, thực chất là một mảng một chiều kiểu Integer chứa mã DXF xác định kiểu lọc đối tượng. Ø Ø FilterData: là tham số kiểu Variant, thực chất là một mảng một chiều kiểu Variant chứa giá trị của kiểu lọc tương ứng trong tham số FilterType. Do có mối quan hệ 1-1 như vậy nên số phần tử của mảng FilterData phải bằng với số phần tử của mảng FilterType. Tuỳ theo nhu cầu mà người lập trình phải chọn cho mình một tiêu chí lọc đối tượng thích hợp. Dưới đây sẽ li ệt kê danh sách các mã DXF tương ứng với một số kiểu lọc đối tượng thường sử dụng: Mã DXF Ý nghĩa -4 Các toán tử điều kiện (sử dụng cho bộ lọc theo nhiều điều kiện kết hợp) 0 Chuỗi thể hiện kiểu đối tượng, chẳng hạn như: Line, Polyline, LWPolyline, Spline, Circle, Arc, Text, Mtext, 1 Chuỗi văn bản của các đối tượng như Text và MText (giá trị thuộc tính Content của các đối tượng này). 2 Chuỗi tương ứng với thuộc tính Name, chẳng hạn như thuộc tính Tag của đối tượng Attribute, thuộc tính name của đối tượng Block,… 6 Chuỗi tương ứng với kiểu đường (Linetype) của các đối tượng. 7 Chuỗi tương ứng với kiểu văn bản (Textstyle) của các đối tượng. 8 Chuỗi tương ứng với tên lớp (Layer) của các đối tượng. 10 Toạ độ điểm chủ yếu của đối tượng, chẳng hạn như: điểm đầu của đối tượng Line, điểm chèn của đối tượng Text, tâm của đối tượng Circle,… 62 Số nguyên xác định màu của đối tượng: 0-ByBlock, 256-ByLayer, 1-Red, 2-Yellow,… các giá trị màu này tương ứng với bảng màu trong AutoCAD. Tất cả các mã DXF có thể tham khảo trong tài liệu trợ giúp của AutoCAD “DXF Reference”, mục DXF Format Ö Group Codes in Numerical Order. CHÚ Ý Khi truyền giá trị cho tham số FilterType và FilterData, số phần tử của mảng FilterType và mảng FilterData phải bằng nhau. Mỗi phần tử của mảng FilterType sẽ tương ứng với một phần tử của mảng FilterData. Lọctheomộtđiềukiện C C H H Ư Ư Ơ Ơ N N G G V V : : L L Ậ Ậ P P T T R R Ì Ì N N H H T T R R Ê Ê N N A A U U T T O O C C A A D D 237 Khi thực hiện lọc theo một điều kiện, số phần tử của các tham số FilterType và FilterData là 1. Tuy nhiên, người lập trình không được gán giá trị trực tiếp mà vẫn phải thực hiện khai báo các tham số này là mảng nhưng chỉ có một phần tử. Ví dụ sau sẽ minh hoạ rõ hơn cách thức tạo bộ lọc đối tượng với chỉ một điều kiện: Sub VD_Filter() ' Tạo đối tượng SelectionSet Dim ssetObj As AcadSelectionSet On Error Resume Next Set ssetObj = ThisDrawing.SelectionSets("SSET") ssetObj.Delete Set ssetObj = ThisDrawing.SelectionSets.Add("SSET") ' Tạo bộ lọc đối tượng: ' Tiêu chí chọn là: Kiểu đổi tượng ' Giá trị của tiêu chí là: “Circle” ' nghĩa là chỉ chọn đối tượng là đường tròn. Dim gpCode(0) As Integer Dim dataValue(0) As Variant gpCode(0) = 0: dataValue(0) = "Circle" ssetObj.SelectOnScreen gpCode, dataValue MsgBox "So doi tuong duoc chon: " & ssetObj.Count End Sub Lọctheonhiềuđiềukiệnkếthợp Khi cần lọc đối tượng theo nhiều điều kiện kết hợp, cần phải thêm vào các toán tử điều kiện trong bộ lọc. Để kết hợp các điều kiện với nhau, các điều kiện phải được đặt giữa các toán tử điều kiện, mã DXF chung củ a các toán tử điều kiện là -4. Dưới đây là danh sách các toán tử điều kiện được sử dụng trong bộ lọc đối tượng: Toán tử Giá trị bắt đầu Giá trị kết thúc Số lượng điều kiện Ý nghĩa AND “<AND” “AND>” ≥ 1 Đối tượng nào thoả mãn tất cả các điều kiện sẽ được chọn. OR “<OR” “OR>” ≥ 1 Đối tượng nào thoả mãn một trong các điều kiện sẽ được chọn. XOR “<XOR” “XOR>” 2 Đối tượng nào thoả mãn một điều kiện và không thoả mãn điều kiện còn lại sẽ được chọn. NOT “<NOT” “NOT>” 1 Đối tượng nào không thoả mãn điều kiện sẽ được chọn. Đoạn mã sau sẽ thực hiện chọn đối tượng có sử dụng bộ lọc theo nhiều điền kiện kết hợp: những đối tượng là đường thẳng hoặc đường tròn và không nằm trên lớp “Layer1” sẽ được chọn. Sub VD_Filter() ' Tạo đối tượng SelectionSet Dim ssetObj As AcadSelectionSet On Error Resume Next Set ssetObj = ThisDrawing.SelectionSets("SSET") ssetObj.Delete Set ssetObj = ThisDrawing.SelectionSets.Add("SSET") . truyền giá trị cho tham số FilterType và FilterData, số phần tử của mảng FilterType và mảng FilterData phải bằng nhau. Mỗi phần tử của mảng FilterType sẽ tương ứng với một phần tử của mảng FilterData Lọctheomộtđiềukiện C C H H Ư Ư Ơ Ơ N N G G V V : : L L Ậ Ậ P P T T R R Ì Ì N N H H T T R R Ê Ê N N A A U U T T O O C C A A D D 2 37 Khi thực hiện lọc theo một điều kiện, số phần tử của các tham số FilterType và FilterData là 1. Tuy nhiên, người lập trình không được gán giá trị trực tiếp. [FilterType] [, FilterData] Tham số Giải thích Object Là đối tượng SelectionSet FilterType, FilterData Tham số tuỳ chọn, xác định bộ lọc đối tượng (Chi tiết tham khảo phần “Định nghĩa bộ lọc