Phát triển AutoCAD bằng ActiveX & VBA - Chương 8: Làm việc trong không gian ba chiều

Vật thể 3 chiều (3D) thường được biểu diễn bởi các

bản vẽ gồm các hình chiếu của nó trên các mặt phẳng

(2D). Mặc dù phương pháp phác hoạ trên được sử

dụng rất rộng rãi trong các ngành kỹ thuật và kiến

trúc, nhưng nó bị hạn chế ở chỗ: bản vẽ 2D phải mô

tả vật thể không gian và phải thể hiện được một cách

trực quan. Hơn nữa, vì các hình chiếu được tạo ra

độc lập nên khả năng lỗi và gây nhầm lẫn là rất lớn.

Vì vậy, ta có thể tạo ra hình 3D thật thay vì thể hiện

nó bằng các hình 2D. Có thể sử dụng các công cụ

của AutoCAD để tạo ra các hình 3D một cách chi tiết

và giống như thật, hơn nữa ta có thể thao tác với

chúng theo nhiều cách khác nhau.

pdf 18 trang dienloan 2120
Bạn đang xem tài liệu "Phát triển AutoCAD bằng ActiveX & VBA - Chương 8: Làm việc trong không gian ba chiều", để tải tài liệu gốc về máy hãy click vào nút Download ở trên

Tóm tắt nội dung tài liệu: Phát triển AutoCAD bằng ActiveX & VBA - Chương 8: Làm việc trong không gian ba chiều

Phát triển AutoCAD bằng ActiveX & VBA - Chương 8: Làm việc trong không gian ba chiều
 Phát triển ứng dụng ActiveX và VBA | 215 
LÀM VIỆC TRONG KHÔNG 
GIAN BA CHIỀU 
8
Trong chương này
ƒ Xác định toạ độ ba chiều 
ƒ Định nghĩa hệ toạ độ 
người dùng 
ƒ Chuyển trục toạ độ 
ƒ Tạo đối tượng ba chiều 
ƒ Hiệu chỉnh trong không 
gian ba chiều 
ƒ Hiệu chỉnh vật thể khối 
Vật thể 3 chiều (3D) thường được biểu diễn bởi các 
bản vẽ gồm các hình chiếu của nó trên các mặt phẳng 
(2D). Mặc dù phương pháp phác hoạ trên được sử 
dụng rất rộng rãi trong các ngành kỹ thuật và kiến 
trúc, nhưng nó bị hạn chế ở chỗ: bản vẽ 2D phải mô 
tả vật thể không gian và phải thể hiện được một cách 
trực quan. Hơn nữa, vì các hình chiếu được tạo ra 
độc lập nên khả năng lỗi và gây nhầm lẫn là rất lớn. 
Vì vậy, ta có thể tạo ra hình 3D thật thay vì thể hiện 
nó bằng các hình 2D. Có thể sử dụng các công cụ 
của AutoCAD để tạo ra các hình 3D một cách chi tiết 
và giống như thật, hơn nữa ta có thể thao tác với 
chúng theo nhiều cách khác nhau. 
 216 | Chương 8: Làm việc trong không gian ba chiều 
1. Xác định tọa độ ba chiều 
Việc xác định toạ độ 3D cũng giống như trong hệ toạ độ 2D, chỉ thêm thành phần 
theo hướng thứ 3, trục Z. Khi vẽ trong 3D, cần xác định được các giá trị toạ độ theo 
các trục X,Y và Z trong hệ toạ độ chung (WCS) cũng như trong hệ toạ độ người 
dùng (UCS). Hình vẽ dưới đây mô tả các trục X, Y, Z của hệ trục WCS: 
Gốc tọa độ WCS Biểu tượng UCS 
Gốc tọa độ UCS 
1.1. Quy tắc bàn tay phải 
Quy tắc bàn tay phải xác định chiều dương của trục Z khi đã biết hướng của trục X 
và Y, đồng thời cũng xác định chiều quay dương xung quanh các trục trong không 
gian 3D. 
Để xác định chiều dương của các trục X, Y, Z, đặt bàn tay phải thẳng, các ngón tay 
hướng thẳng lên trên sao cho mu bàn tay hướng về phía màn hình, ngón cái hướng 
sang ngang, ngón trỏ chỉ hướng thẳng đứng lên trên và ngón giữa gập theo hướng 
vuông góc với lòng bàn tay, khi đó hướng chỉ của ngón cái sẽ trùng với hướng 
dương của trục X, hướng của các ngón trỏ trùng với hướng dương của trục Y, và 
hướng chỉ của ngón giữa là hướng dương của trục Z. Để xác định chiều quay dương 
quanh các trục toạ độ đặt ngón cái trùng theo hướng dương của hệ trục toạ độ, gập 
các ngón tay còn lại hướng vào lòng bàn tay thì hướng gập các ngón tay trùng với 
chiều quay dương quanh trục toạ độ đó. 
1.2. Nhập tọa độ X, Y , Z 
Nhập toạ độ trong hệ trục toạ độ WCS 3D tương tự như nhập tọa độ trong hệ trục 
tọa độ WCS 2D, nhưng cần chỉ ra toạ độ Z bên cạnh toạ độ X, Y. Cũng như hệ trục 
toạ độ 2D, một biến được sử dụng để chuyển các tọa độ vào trong các phương thức 
hay thuộc tính trong ActiveX cũng như để nhập vào một tọa độ. 
 Phát triển AutoCAD bằng ActiveX và VBA | 217 
Đoạn chương trình con dưới đây, trước hết sẽ tạo ra một đường đa tuyến nét mảnh 
2D với 3 đỉnh, sau đó sẽ tạo đường đa tuyến 3D với 3 đỉnh. Chú ý rằng chiều dài 
của mảng chứa các đỉnh đó sẽ tăng lên để chứa thêm toạ độ Z của đường đa tuyến 
3D. Chương trình này kết thúc bởi việc xuất ra toạ độ các đỉnh của đường đa tuyến 
2D và 3D bằng thông báo. 
Định nghĩa và truy vấn toạ độ của đường đa tuyến 2D và 3D 
Ví dụ này sẽ tạo ra 2 đường đa tuyến, trong đó có một đường 3D. Đường đầu tiên là 
đa tuyến 2D và đường thứ hai sẽ là 3D. Ví dụ này cũng sẽ truy vấn toạ độ của 
chúng và hiển thị trên các thông báo. 
Sub Ch8_Polyline_2D_3D() 
Dim pline2DObj As AcadLWPolyline 
Dim pline3DObj As AcadPolyline 
Dim points2D(0 To 5) As Double 
Dim points3D(0 To 8) As Double 
’ Định nghĩa đỉnh polyline 2D 
points2D(0) = 1: points2D(1) = 1 
points2D(2) = 1: points2D(3) = 2 
points2D(4) = 2: points2D(5) = 2 
’ Định nghĩa đỉnh polyline 3D 
points3D(0) = 1: points3D(1) = 1: points3D(2) = 0 
points3D(3) = 2: points3D(4) = 1: points3D(5) = 0 
points3D(6) = 2: points3D(7) = 2: points3D(8) = 0 
’ Tạo polyline 2D 
Set pline2DObj = 
ThisDrawing.ModelSpace.AddLightWeightPolyline(points2D) 
pline2DObj.Color = acRed 
pline2DObj.Update 
’ Tạo polyline 3D 
Set pline3DObj = ThisDrawing.ModelSpace.AddPolyline(points3D) 
pline3DObj.Color = acBlue 
pline3DObj.Update 
’ Lấy các toạ độ đỉnh của các polyline 
Dim get2Dpts As Variant 
Dim get3Dpts As Variant 
get2Dpts = pline2DObj.Coordinates 
get3Dpts = pline3DObj.Coordinates 
’ Hiển thị toạ độ 
MsgBox ("2D polyline (red): " & vbCrLf & _ 
get2Dpts(0) & ", " & get2Dpts(1) & vbCrLf & _ 
get2Dpts(2) & ", " & get2Dpts(3) & vbCrLf & _ 
get2Dpts(4) & ", " & get2Dpts(5)) 
MsgBox ("3D polyline (blue): " & vbCrLf & _ 
get3Dpts(0) & ", " & get3Dpts(1) & ", " & _ 
get3Dpts(2) & vbCrLf & _ 
get3Dpts(3) & ", " & get3Dpts(4) & ", " & _ 
get3Dpts(5) & vbCrLf & _ 
get3Dpts(6) & ", " & get3Dpts(7) & ", " & _ 
get3Dpts(8)) 
End Sub 
 218 | Chương 8: Làm việc trong không gian ba chiều 
2. Định nghĩa hệ tọa độ người dùng 
Định nghĩa một đối tượng hệ toạ độ người dùng (UCS) bao gồm thay đổi vị trí của 
gốc toạ độ (0,0,0) và thay đổi hướng của mặt phẳng XY và trục Z. Hệ toạ độ người 
dùng có thể đặt ở một vị trí và theo một hướng bất kỳ nào đó trong không gian 3D, 
có thể được định nghĩa, lưu lại và sử dụng với số lượng tuỳ vào nhu cầu sử dụng 
của người dùng. Nếu có nhiều cổng nhìn được kích hoạt thì chúng dùng chung một 
hệ trục toạ độ. 
Nếu vẽ nhiều trong không gian 3D thì ta nên định nghĩa sẵn một số hệ trục toạ độ, 
mỗi hệ trục tọa độ có gốc và hướng các trục toạ độ khác nhau, tùy theo yêu cầu cụ 
thể. 
Để chỉ ra gốc toạ độ và hướng của hệ trục toạ độ người dùng, ta cần hiển thị biểu 
tượng của UCS tại gốc của hệ toạ độ đó bằng cách sử dụng thuộc tính 
UCSIconAtOrigin (xem thuộc tính UCSIconOn) và để không hiển thị biểu tượng tại 
gốc tọa độ, nó được hiển thị tại tọa độ WCS được định nghĩa bởi biến hệ thống 
UCSORG. 
Các hệ trục toạ độ người dùng rất hữu ích trong không gian 3D. Ta sẽ dễ dàng sắp 
xếp các hệ toạ độ thẳng hàng với các khối hình học đã có hơn là phải tìm ra độ dịch 
chuyển chính xác của một điểm trong không gian 3D. 
 Hệ trục thứ nhất Hệ trục thứ 2 Mô hình với 2 hệ trục toạ độ 
Có thể định nghĩa hệ trục toạ độ mới trong không gian in cũng như trong không 
gian mô hình, tuy nhiên, các hệ trục người dùng trong không gian in chỉ được thao 
tác thủ công. AutoCAD lưu giữ được 10 hệ trục toạ độ sau cùng, mà được tạo ra 
trong không gian mô hình và trong không gian in. 
Hệ trục toạ độ mới được tạo bằng phương thức Add. Phương thức này yêu cầu 4 giá 
trị đầu vào, bao gồm: toạ độ của điểm gốc ; toạ độ trên trục X, trục Y ; tên của hệ 
trục toạ độ. 
Tất cả các toạ độ của các đối tượng ActiveX Automation của AutoCAD đều nhập 
vào từ hệ toạ độ chung (WCS). Phương thức GetUCSMatrix được dùng để tính ma 
trận biến đổi của một hệ trục UCS bất kỳ. Dùng ma trận này để tìm toạ độ tương 
đương trong WCS. 
 Phát triển AutoCAD bằng ActiveX và VBA | 219 
Sử dụng thuộc tính ActiveUCS trong đối tượng Document để kích hoạt một hệ 
toạ độ UCS. Nếu hệ trục UCS đang sử dụng bị thay đổi thì đối tượng UCS mới cần 
được khởi động lại như hệ toạ độ UCS hiện hành để những thay đổi được xuất hiện. 
Hệ trục UCS hiện hành được thiết lập lại bằng cách sử dụng một lần nữa thuộc tính 
ActiveUCS với đối tượng UCS được cập nhật. 
Ví dụ tạo một hệ toạ độ UCS mới, kích hoạt và chuyển toạ độ của một điểm sang 
hệ toạ độ UCS này. 
Thủ tục dưới đây sẽ tạo một hệ trục toạ độ mới và kích hoạt. Sau đó yêu cầu người 
dùng chọn một điểm trong bản vẽ và trả về toạ độ của điểm đó trong cả hệ trục UCS 
và hệ trục WCS. 
Sub Ch8_NewUCS() 
’ Định nghĩa các biến cần dùng 
Dim ucsObj As AcadUCS 
Dim origin(0 To 2) As Double 
Dim xAxisPnt(0 To 2) As Double 
Dim yAxisPnt(0 To 2) As Double 
’ Gán gốc toạ độ cho hệ trục UCS 
origin(0) = 4: origin(1) = 5: origin(2) = 3 
xAxisPnt(0) = 5: xAxisPnt(1) = 5: xAxisPnt(2) = 3 
yAxisPnt(0) = 4: yAxisPnt(1) = 6: yAxisPnt(2) = 3 
’ Thêm hệ trục UCS vào tập đối tượng UserCoordinatesSystems 
Set ucsObj = ThisDrawing.UserCoordinateSystems. _ 
Add(origin, xAxisPnt, yAxisPnt, "New_UCS") 
’ Thể hiện biểu tượng UCS 
ThisDrawing.ActiveViewport.UCSIconAtOrigin = True 
ThisDrawing.ActiveViewport.UCSIconOn = True 
’ Chuyển hệ trục UCS mới thành hệ trục hiện thời 
ThisDrawing.ActiveUCS = ucsObj 
MsgBox "The current UCS is : " & ThisDrawing.ActiveUCS.Name _ 
& vbCrLf & " Pick a point in the drawing." 
’ Tìm toạ độ trong hệ trục WCS và UCS của một điểm 
Dim WCSPnt As Variant 
Dim UCSPnt As Variant 
WCSPnt = ThisDrawing.Utility.GetPoint(, "Enter a point: ") 
UCSPnt = ThisDrawing.Utility.TranslateCoordinates _ 
(WCSPnt, acWorld, acUCS, False) 
MsgBox "The WCS coordinates are: " & WCSPnt(0) & ", " _ 
& WCSPnt(1) & ", " & WCSPnt(2) & vbCrLf & _ 
"The UCS coordinates are: " & UCSPnt(0) & ", " _ 
& UCSPnt(1) & ", " & UCSPnt(2) 
End Sub 
3. Chuyển trục tọa độ 
Phương thức TranslateCoordinates sẽ chuyển một điểm hoặc một véctơ từ hệ toạ độ 
này sang hệ toạ độ khác. Một đối số kiểu point, gọi là OriginalPoint (điểm gốc), có 
thể được hiểu như là một điểm 3D hoặc là một véctơ chuyển vị 3D. Đối số này có 
thể được phân biệt bởi đối số kiểu Boolean và Disp. Nếu đối số Disp được gán 
 220 | Chương 8: Làm việc trong không gian ba chiều 
bằng True thì đối số OriginalPoint được xem như là véc tơ chuyển vị, ngược 
lại thì được coi như là một điểm. Hai đối số nữa nhằm xác định xem 
OriginalPoint thuộc hệ trục toạ độ nào và nó sẽ được chuyển sang hệ toạ độ 
nào. Các hệ trục toạ độ dưới đây của AutoCAD có thể được xác định từ các đối số 
From và To : 
ƒ WCS 
World Coordinate System (WCS) - hệ trục toạ độ tham chiếu. Tất cả các hệ 
trục toạ độ khác đều được định nghĩa thông qua hệ trục này vì đây là hệ trục 
không thay đổi. Tất cả các giá trị được tính thông qua WCS là ổn định dù có 
sự thay đổi các hệ trục toạ độ khác. Tất cả các điểm sử dụng trong các 
phương thức và thuộc tính của ActiveX đều được biểu diễn trong hệ trục 
WCS ngoại trừ khi có những trường hợp khác được chỉ rõ. 
ƒ UCS 
User Coordinate System (UCS) - hệ trục toạ độ làm việc. Người dùng tạo ra 
hệ trục UCS để tạo thuận lợi cho các thao tác với bản vẽ. Tất cả các điểm 
được chuyển vào dòng lệnh của AutoCAD, bao gồm cả những điểm trả về 
từ các hàm AutoLISP và các hàm mở rộng, là những điểm trong hệ trục 
UCS hiện tại (trừ khi người dùng thêm vào phía trước dấu * ở dấu nhắc 
dòng lệnh). Nếu muốn ứng dụng gửi toạ độ điểm theo hệ trục WCS, OCS, 
DCS đến dòng lệnh của AutoCAD, trước hểt phải chuyển tọa độ về hệ trục 
toạ độ UCS bằng cách gọi phương thức TranslateCoordinates. 
ƒ OCS 
Object Coordinate System (OCS) - giá trị toạ độ được xác định trong các 
phương thức và thuộc tính cho đối tượng Polyline và LightweightPolyline, 
đều được biểu diễn trong hệ toạ độ này, tương đối so với đối tượng. Những 
điểm này thường được chuyển sang hệ toạ độ WCS, hệ toạ độ UCS hiện tại 
hoặc hệ toạ độ DCS hiện tại, tuỳ theo mục đích sử dụng của đối tượng. 
Ngược lại, các điểm trong hệ tọa độ WCS, UCS hay DCS phải được chuyển 
về hệ trục OCS trước khi ghi vào cơ sở dữ liệu bằng chính các thuộc tính đó. 
Xem thêm tài liệu “ActiveX and VBA Reference” để tìm hiểu thêm về các 
phương thức và thuộc tính được sử dụng trong hệ trục toạ độ này. 
Khi chuyển toạ độ sang hệ OCS hoặc ngược lại, cần đưa vào véc tơ pháp 
tuyến1 cho hệ trục OCS trong đối số cuối cùng của hàm 
TranslateCoordinates. 
ƒ DCS 
Display Coordinate System (DCS) - hệ trục toạ độ mà các đối tượng sẽ được 
biến đổi trước khi chúng được hiển thị. Gốc của DCS là điểm được lưu 
trong biến hệ thống TARGET của AutoCAD và trục Z của hệ trục này là 
hướng quan sát. Nói cách khác, khung nhìn luôn là mặt phẳng quan sát của 
1 Véc tơ pháp tuyến (Normal vector): véc tơ pháp tuyến đơn vị trong hệ toạ độ WCS, dùng để định 
nghĩa trục toạ độ z cho hệ toạ độ OCS 
 Phát triển AutoCAD bằng ActiveX và VBA | 221 
hệ trục DCS. Các toạ độ này có thể được sử dụng để xác định xem những 
đối tượng nào sẽ được hiển thị trong AutoCAD. 
ƒ PSDCS 
Paper Space DCS (PSDCS) - hệ trục toạ độ này chỉ có thể được biến đổi từ 
hệ trục DCS hoặc sang hệ trục DCS trong khung nhìn của không gian mô 
hình hiện hành. Thực chất đây là sự biến đổi 2D, trong đó toạ độ X và Y 
luôn được nhân tỷ lệ và tịnh tiến nếu đối số Disp là True, còn toạ độ Z 
chỉ được nhân tỷ lệ nhưng không bao giờ tịnh tiến. Do đó, toạ độ Z có thể 
được dùng để tìm hệ số phóng đại giữa hai hệ trục toạ độ. Hệ trục PSDCS 
chỉ có thể được biến đổi trong khung nhìn của không gian mô hình hiện tại. 
Nếu đối số from là PSDCS thì đối số to sẽ là DCS và ngược lại. 
Biến đổi toạ độ từ hệ trục OCS sang hệ trục WCS 
Ví dụ sau đây sẽ tạo ra đối tượng Polyline trong không gian mô hình. Đỉnh thứ nhất 
của đa tuyến sẽ được biểu diễn theo toạ độ trong cả hệ trục OCS và WCS. Quá trình 
biến đổi ngược từ OCS sang WCS cần phải nhập véc tơ pháp tuyến của hệ trục OCS 
vào đối số cuối cùng trong phương thức TranslateCoordinates. 
Sub Ch8_TranslateCoordinates() 
’ Tạo một polyline trong không gian mô hình. 
Dim plineObj As AcadPolyline 
Dim points(0 To 14) As Double 
’ Gán các đỉnh cho polyline 
points(0) = 1: points(1) = 1: points(2) = 0 
points(3) = 1: points(4) = 2: points(5) = 0 
points(6) = 2: points(7) = 2: points(8) = 0 
points(9) = 3: points(10) = 2: points(11) = 0 
points(12) = 4: points(13) = 4: points(14) = 0 
’ Tạo đối tượng light weight Polyline trong không gian mô hình 
Set plineObj = ThisDrawing.ModelSpace.AddPolyline(points) 
’ Tìm toạ độ X và Y của đỉnh đầu tiên của đường polyline 
Dim firstVertex As Variant 
firstVertex = plineObj.Coordinate(0) 
’ Tìm toạ độ Z của đường polyline sử dụng thuộc tính 
Elevation 
firstVertex(2) = plineObj.Elevation 
’ Thay đổi véc tơ pháp cho polyline để thấy sự sai khác 
’ giữa hai hệ toạ độ 
Dim plineNormal(0 To 2) As Double 
plineNormal(0) = 0# 
plineNormal(1) = 1# 
plineNormal(2) = 2# 
plineObj.Normal = plineNormal 
’ Chuyển toạ độ từ hệ trục OCS sang WCS 
Dim coordinateWCS As Variant 
coordinateWCS = ThisDrawing.Utility.TranslateCoordinates _ 
(firstVertex, acOCS, acWorld, False, plineNormal) 
’ Biểu diễn toạ độ của điểm 
MsgBox "The first vertex has the following coordinates:" _ 
& vbCrLf & "OCS: " & firstVertex(0) & ", " & _ 
 222 | Chương 8: Làm việc trong không gian ba chiều 
firstVertex(1) & ", " & firstVertex(2) & vbCrLf & _ 
"WCS: " & coordinateWCS(0) & ", " & _ 
coordinateWCS(1) & ", " & coordinateWCS(2) 
End Sub 
4. Tạo đối tượng ba chiều 
AutoCAD hỗ trợ ba kiểu mô hình không gian: mô hình khung dây, lưới và khối. 
Mỗi loại có cách tạo và hiệu chỉnh riêng. 
 Khung dây Lưới bề mặt Khối 
Mô hình khung dây: là dạng mô tả các đối tượng không gian dưới dạng khung. 
Trong mô hình này, các đối tượng không có các mặt mà chỉ gồm các điểm, các 
đường thẳng và các đường cong thể hiện các cạnh của vật thể. Có thể tạo mô hình 
khung dây bằng cách bố trí các đối tượng 2D ở bất cứ đâu trong không gian 3D. 
AutoCAD cũng cung cấp một số đối tượng khung dây 3D như đường đa tuyến 3D. 
Vì mỗi đối tượng được tạo thành bởi mô hình khung dâ ...  của một vật thể bằng 
các mặt phẳng. Mật độ lưới hay số mặt được xác định bởi ma trận có MxN đỉnh, 
tương tự như một lưới bao gồm các cột và các hàng. M và N theo thứ tự là chỉ số 
cột và chỉ số hàng của một đỉnh bất kỳ của lưới. Lưới có thể tạo cả trong không gian 
2D và 3D nhưng chủ yếu được sử dụng trong 3D. 
Sử dụng mô hình lưới nếu như không cần chi tiết về một số thuộc tính vật lý (như 
khối lượng, trọng lượng, trọng tâm của vật thể...) nhưng lại cần khả năng che khuất, 
tô bóng và tạo vỏ ngoài, là những tính chất mà mô hình khung dây không thể hiện 
được. Ngoài ra, mô hình lưới bề mặt cũng rất hữu ích để tạo ra các hình không 
thông thường, ví dụ như mô hình 3D của vùng núi. 
Một ô lưới có thể khép kín hoặc không khép kín (mở). Ô lưới là mở theo một hướng 
nào đó nếu cạnh đầu và cạnh cuối của lưới theo hướng đó không trùng nhau như mô 
tả ở hình vẽ dưới đây: 
 224 | Chương 8: Làm việc trong không gian ba chiều 
M mở 
N mở 
M đóng 
N mở
M mở 
N đóng 
M đóng 
N đóng
Để tạo lưới chữ nhật sử dụng phương thức Add3Dmesh. Phương thức này cần 3 
tham số đầu vào: số đỉnh theo hướng M (số cột), số đỉnh theo hướng N (số hàng) và 
một mảng kiểu variant để lưu toạ độ các đỉnh của lưới. Khi một đối tượng 
PolygonMesh được tạo ra, sử dụng thuộc tính Mclose và Nclose để khép kín lưới. 
Ví dụ tạo lưới đa giác 
Ví dụ này sẽ tạo một lưới đa giác kích thước 4x4. Hướng của khung nhìn hiện tại sẽ 
được điều chỉnh để có thể nhìn được lưới trong không gian 3D dễ dàng hơn. 
Sub Ch8_Create3DMesh() 
Dim meshObj As AcadPolygonMesh 
Dim mSize, nSize, Count As Integer 
Dim points(0 To 47) As Double 
’ tạo mảng chứa các điểm 
points(0) = 0: points(1) = 0: points(2) = 0 
points(3) = 2: points(4) = 0: points(5) = 1 
points(6) = 4: points(7) = 0: points(8) = 0 
points(9) = 6: points(10) = 0: points(11) = 1 
points(12) = 0: points(13) = 2: points(14) = 0 
points(15) = 2: points(16) = 2: points(17) = 1 
points(18) = 4: points(19) = 2: points(20) = 0 
points(21) = 6: points(22) = 2: points(23) = 1 
points(24) = 0: points(25) = 4: points(26) = 0 
points(27) = 2: points(28) = 4: points(29) = 1 
points(30) = 4: points(31) = 4: points(32) = 0 
points(33) = 6: points(34) = 4: points(35) = 0 
points(36) = 0: points(37) = 6: points(38) = 0 
points(39) = 2: points(40) = 6: points(41) = 1 
points(42) = 4: points(43) = 6: points(44) = 0 
points(45) = 6: points(46) = 6: points(47) = 0 
 Phát triển AutoCAD bằng ActiveX và VBA | 225 
mSize = 4: nSize = 4 
’Tạo lưới không gian 3DMesh trong không gian mô hình 
Set meshObj = ThisDrawing.ModelSpace.Add3Dmesh_ 
(mSize, nSize, points) 
’Thay đổi hướng của cổng nhìn để nhìn rõ hơn hình trụ 
Dim NewDirection(0 To 2) As Double 
NewDirection(0) = -1 
NewDirection(1) = -1 
NewDirection(2) = 1 
ThisDrawing.ActiveViewport.direction = NewDirection 
ThisDrawing.ActiveViewport = ThisDrawing.ActiveViewport 
ZoomAll 
End Sub 
4.3. Tạo lưới đa diện 
Sử dụng phương thức AddPolyfaceMesh để tạo lưới đa diện với mỗi mặt có thể có 
số đỉnh khác nhau. Tạo lưới đa diện tương tự như tạo lưới chữ nhật, cần chỉ ra toạ 
độ của tất cả các đỉnh và sau đó định nghĩa các mặt bằng cách nhập chỉ số của các 
điểm cho các đỉnh của mặt đó. Khi tạo ra một lưới đa diện, có thể chỉ ra các cạnh 
khuất, gán chúng vào các lớp riêng hoặc đổi màu chúng. 
Muốn tạo một cạnh khuất thì nhập chỉ số đỉnh của cạnh đó là số âm. Có thể tham 
khảo thêm trong tài liệu “ActiveX and VBA Reference”, phần phương thức 
AddPolyfaceMesh. 
Tạo lưới đa diện 
Ví dụ này tạo ra một đối tượng PolyfaceMesh trong không gian mô hình. Hướng 
của cổng nhìn sử dụng sẽ được điều chỉnh để có thể nhìn được lưới trong không 
gian 3D dễ dàng hơn. 
Sub Ch8_CreatePolyfaceMesh() 
’Định nghĩa các đỉnh của lưới 
Dim vertex(0 To 17) As Double 
vertex(0) = 4: vertex(1) = 7: vertex(2) = 0 
vertex(3) = 5: vertex(4) = 7: vertex(5) = 0 
vertex(6) = 6: vertex(7) = 7: vertex(8) = 0 
vertex(9) = 4: vertex(10) = 6: vertex(11) = 0 
vertex(12) = 5: vertex(13) = 6: vertex(14) = 0 
vertex(15) = 6: vertex(16) = 6: vertex(17) = 1 
’ Định nghĩa danh sách các mặt 
Dim FaceList(0 To 7) As Integer 
FaceList(0) = 1 
FaceList(1) = 2 
FaceList(2) = 5 
FaceList(3) = 4 
FaceList(4) = 2 
FaceList(5) = 3 
FaceList(6) = 6 
FaceList(7) = 5 
’ Tạo lưới đa diện 
Dim polyfaceMeshObj As AcadPolyfaceMesh 
Set polyfaceMeshObj = ModelSpace.AddPolyfaceMesh_ 
(vertex, FaceList) 
’ Thay đổi hướng nhìn của cổng nhìn để nhìn lưới đa diện. 
Dim NewDirection(0 To 2) As Double 
 226 | Chương 8: Làm việc trong không gian ba chiều 
NewDirection(0) = -1 
NewDirection(1) = -1 
NewDirection(2) = 1 
ThisDrawing.ActiveViewport.direction = NewDirection 
ThisDrawing.ActiveViewport = ThisDrawing.ActiveViewport 
ZoomAll 
End Sub 
4.4. Tạo khối 
Một đối tượng khối (đối tượng 3DSolid) thể hiện được toàn bộ hình khối của vật 
thể. Mô hình khối thể hiện được đầy đủ nhất thông tin của vật thể và là loại mô hình 
ít gây nhầm lẫn nhất. Các hình khối phức tạp được tạo ra và hiệu chỉnh dễ dàng hơn 
các mô hình kiểu lưới và kiểu khung dây. 
Tạo các hình khối từ một trong các hình khối như: hộp, nón, trụ, cầu, hình nêm... 
hoặc bằng cách dập nổi từ một đối tượng 2D theo một đường sinh hoặc quay hình 
2D quanh một trục. Dưới đây là các phương thức để tạo khối: AddBox, AddCone, 
AddCylinder, AddEllipticalCone, AddEllipticalCylinder,AddExtrudedSolid, 
AddExtrudedSolidAlongPath, AddRevolvedSolid, AddSolid, AddSphere, 
AddTorus, AddWedge. 
Tạo khối hình nêm 
Ví dụ này sẽ tạo ra khối đặc hình nêm trong không gian mô hình. Hướng của cổng 
nhìn sử dụng sẽ được điều chỉnh để có thể nhìn được khối trong không gian 3D dễ 
dàng hơn. 
Sub Ch8_CreateWedge() 
Dim wedgeObj As Acad3DSolid 
Dim center(0 To 2) As Double 
Dim length As Double 
Dim width As Double 
Dim height As Double 
’ Định nghĩa khối nêm 
center(0) = 5#: center(1) = 5#: center(2) = 0 
length = 10#: width = 15#: height = 20# 
’ Tạo khối nêm trong không gian mô hình 
Set wedgeObj = ThisDrawing.ModelSpace. _ 
AddWedge(center, length, width, height) 
’ Đổi hướng nhìn của cổng nhìn 
Dim NewDirection(0 To 2) As Double 
NewDirection(0) = -1 
NewDirection(1) = -1 
NewDirection(2) = 1 
ThisDrawing.ActiveViewport.direction = NewDirection 
ThisDrawing.ActiveViewport = ThisDrawing.ActiveViewport 
ZoomAll 
End Sub 
5. Hiệu chỉnh trong không gian 3D 
Mục này sẽ trình bày về sự hiệu chỉnh các đối tượng 3D như : quay, nhân bản và lấy 
đối xứng. 
 Phát triển AutoCAD bằng ActiveX và VBA | 227 
5.1. Quay 
Phương thức Rotate sẽ quay đối tượng 2D quanh một điểm và chiều quay được 
xác định theo hệ toạ độ WCS. Sử dụng phương thức Rotate3D để quay đối tượng 
3D quanh một trục xác định, phương thức này cần 3 tham số đầu vào gồm: toạ độ 
trong hệ WCS của 2 điểm xác định trục quay và góc quay tính theo radian. 
Để quay đối tượng 3D có thể sử dụng một trong 2 phương thức Rotate hoặc 
Rotate3D. Dưới đây là một thủ tục tạo một khối hộp và quay nó quanh một trục. 
Tạo khối hộp và quay nó quanh một trục 
Ví dụ sau sẽ tạo một khối hộp, sau đó sẽ định nghĩa trục quay và quay khối hộp 
quanh trục đó với góc quay 300. 
Sub Ch8_Rotate_3DBox() 
Dim boxObj As Acad3DSolid 
Dim length As Double 
Dim width As Double 
Dim height As Double 
Dim center(0 To 2) As Double 
’ Định nghĩa khối hộp 
center(0) = 5: center(1) = 5: center(2) = 0 
length = 5 
width = 7 
height = 10 
’ Tạo khối hộp trong không gian mô hình 
Set boxObj = ThisDrawing.ModelSpace. _ 
AddBox(center, length, width, height) 
’ Định nghĩa trục quay thông qua 2 điểm 
Dim rotatePt1(0 To 2) As Double 
Dim rotatePt2(0 To 2) As Double 
Dim rotateAngle As Double 
rotatePt1(0) = -3: rotatePt1(1) = 4: rotatePt1(2) = 0 
rotatePt2(0) = -3: rotatePt2(1) = -4: rotatePt2(2) = 0 
rotateAngle = 30 
rotateAngle = rotateAngle * 3.141592 / 180# 
’ Quay khối hộp 
boxObj.Rotate3D rotatePt1, rotatePt2, rotateAngle 
ZoomAll 
End Sub 
 228 | Chương 8: Làm việc trong không gian ba chiều 
5.2. Nhân bản1 
Phương thức ArrayRectangular sẽ thực hiện nhân bản đối tượng theo dạng 
chữ nhật. Ngoài việc xác định số hàng và số cột theo các hướng tương ứng là trục X 
và trục Y, cần xác định số tầng tức là số phần tử theo hướng trục Z. 
Đối tượng nhân bản Kết quả 
Nhân bản đối tượng 3D 
Ví dụ dưới đây sẽ tạo ra một đường tròn và sau đó nhân bản dạng chữ nhật gồm 
(4hàng × 4cột × 3tầng) 
Sub Ch8_CreateRectangularArray() 
’ Tạo đường tròn 
Dim circleObj As AcadCircle 
Dim center(0 To 2) As Double 
Dim radius As Double 
center(0) = 2: center(1) = 2: center(2) = 0 
radius = 0.5 
Set circleObj = ThisDrawing.ModelSpace. _ 
AddCircle(center, radius) 
’ Định nghĩa kích thước dãy hình chữ nhật 
Dim numberOfRows As Long 
Dim numberOfColumns As Long 
Dim numberOfLevels As Long 
Dim distanceBwtnRows As Double 
Dim distanceBwtnColumns As Double 
Dim distanceBwtnLevels As Double 
numberOfRows = 4 
numberOfColumns = 4 
numberOfLevels = 3 
distanceBwtnRows = 1 
distanceBwtnColumns = 1 
distanceBwtnLevels = 4 
’ Nhân bản đối tượng 
Dim retObj As Variant 
1 Nhân bản (Array): là quá trình tạo ra một (hoặc nhiều) đối tượng mới giống hệt như đối tượng 
ban đầu theo một quy luật bố trí dạng chữ nhật hoặc theo dạng tọa độ cực (và có thể xoay hình mới 
được tạo đi một góc nào đó). 
 Phát triển AutoCAD bằng ActiveX và VBA | 229 
retObj = circleObj.ArrayRectangular _ 
(numberOfRows, numberOfColumns, _ 
numberOfLevels, distanceBwtnRows, _ 
distanceBwtnColumns, distanceBwtnLevels) 
ZoomAll 
End Sub 
5.3. Lấy đối xứng 
Phương thức Mirror3D sẽ lấy đối xứng các đối tượng qua một mặt phẳng đối 
xứng được xác định bởi 3 điểm. 
Đối tượng lấy đối xứng Định nghĩa mặt phẳng đối xứng Sau khi lấy đối xứng 
Lấy đối xứng trong không gian 3D 
Ví dụ này sẽ tạo một khối hộp trong không gian mô hình và sau đó sẽ lấy đối xứng 
khối hộp đó qua một mặt phẳng và khối hộp đối xứng sẽ có màu đỏ. 
Sub Ch8_MirrorABox3D() 
’ Tạo đối tượng khối 
Dim boxObj As Acad3DSolid 
Dim length As Double 
Dim width As Double 
Dim height As Double 
Dim center(0 To 2) As Double 
center(0) = 5#: center(1) = 5#: center(2) = 0 
length = 5#: width = 7: height = 10# 
’ Tạo khối hộp (đối tượng 3DSolid) trong không gian mô hình 
Set boxObj = ThisDrawing.ModelSpace. _ 
AddBox(center, length, width, height) 
’ Định nghĩa mặt phẳng đối xứng bởi 3 điểm 
Dim mirrorPt1(0 To 2) As Double 
Dim mirrorPt2(0 To 2) As Double 
Dim mirrorPt3(0 To 2) As Double 
mirrorPt1(0) = 1.25: mirrorPt1(1) = 0: mirrorPt1(2) = 0 
mirrorPt2(0) = 1.25: mirrorPt2(1) = 2: mirrorPt2(2) = 0 
mirrorPt3(0) = 1.25: mirrorPt3(1) = 2: mirrorPt3(2) = 2 
’ Lấy đối xứng khối hộp 
Dim mirrorBoxObj As Acad3DSolid 
Set mirrorBoxObj = boxObj.Mirror3D _ 
(mirrorPt1, mirrorPt2, mirrorPt3) 
mirrorBoxObj.Color = acRed 
ZoomAll 
End Sub 
 230 | Chương 8: Làm việc trong không gian ba chiều 
6. Hiệu chỉnh vật thể khối 
Có thể tạo ra các hình khối phức tạp từ các vật thể khác bằng cách kết hợp các khối, 
cắt khối, giao nhau của các khối. Sử dụng phương thức Boolean hoặc 
CheckInterference để thực hiện các phép hiệu chỉnh nói trên. 
Các khối trước khi dùng Boolean giao cắt Sau khi thực hiện Boolean giao cắt 
Đoạn chương trình dưới đây sẽ tạo một khối hộp và một khối trụ trong không gian 
mô hình. Sau đó sẽ tìm giao của hai khối và tạo khối mới từ phần giao của hai khối 
trên. Để quan sát được tốt hơn, khối hộp sẽ có màu trắng và khối trụ sẽ có màu xanh 
và khối giao sẽ có màu đỏ. 
Tìm phần giao của 2 khối 
Ví dụ này sẽ tạo một khối hộp và một khối trụ trong không gian mô hình. Sau đó sẽ 
tìm giao của hai khối và tạo khối mới từ phần giao của hai khối trên. Để quan sát 
được tốt hơn, khối hộp sẽ có màu trắng và khối trụ sẽ có màu xanh và khối giao sẽ 
có màu đỏ. 
Sub Ch8_FindInterferenceBetweenSolids() 
’ Định nghĩa khối hộp 
Dim boxObj As Acad3DSolid 
Dim length As Double 
Dim width As Double 
Dim height As Double 
Dim center(0 To 2) As Double 
center(0) = 5: center(1) = 5: center(2) = 0 
length = 5 
width = 7 
height = 10 
’ Tạo khối hộp trong không gian mô hình có màu trắng 
Set boxObj = ThisDrawing.ModelSpace. _ 
AddBox(center, length, width, height) 
boxObj.Color = acWhite 
’ Định nghĩa khối trụ 
Dim cylinderObj As Acad3DSolid 
Dim cylinderRadius As Double 
Dim cylinderHeight As Double 
center(0) = 0: center(1) = 0: center(2) = 0 
cylinderRadius = 5 
cylinderHeight = 20 
’ Tạo khối trụ có màu xanh 
Set cylinderObj = ThisDrawing.ModelSpace.AddCylinder _ 
(center, cylinderRadius, cylinderHeight) 
cylinderObj.Color = acCyan 
’ Tìm phần giao của hai khối và tạo ra khối mới có màu đỏ. 
Dim solidObj As Acad3DSolid 
 Phát triển AutoCAD bằng ActiveX và VBA | 231 
Set solidObj = boxObj.CheckInterference(cylinderObj, True) 
solidObj.Color = acRed 
ZoomAll 
End Sub 
Các khối còn có thể được hiệu chỉnh theo các cách khác như: lấy mặt cắt của các 
khối bởi các mặt phẳng sử dụng phương thức SectionSolid hoặc cắt một khối 
thành hai phần sử dụng phương thức SliceSolid. 
Mặt phẳng cắt được 
xác định bởi 3 điểm 
Một nửa được giữ 
lại sau khi cắt 
Giữ lại cả hai phần 
sau khi cắt 
Cắt khối thành hai phần 
Ví dụ sau sẽ tạo một khối hộp trong không gian mô hình. Sau đó sẽ cắt khối hộp 
bằng một mặt phẳng xác định bởi 3 điểm và khối cắt được trả về kiểu đối tượng 
3DSolid. 
Sub Ch8_SliceABox() 
’ Định nghĩa đối tượng khối hộp 
Dim boxObj As Acad3DSolid 
Dim length As Double 
Dim width As Double 
Dim height As Double 
Dim center(0 To 2) As Double 
center(0) = 5#: center(1) = 5#: center(2) = 0 
length = 5#: width = 7: height = 10# 
’ Tạo khối hộp (đối tượng 3DSolid) trong không gian mô hình 
Set boxObj = ThisDrawing.ModelSpace.AddBox _ 
(center, length, width, height) 
boxObj.Color = acWhite 
’ Định nghĩa mặt phẳng cắt thông qua 3 điểm 
 232 | Chương 8: Làm việc trong không gian ba chiều 
Dim slicePt1(0 To 2) As Double 
Dim slicePt2(0 To 2) As Double 
Dim slicePt3(0 To 2) As Double 
slicePt1(0) = 1.5: slicePt1(1) = 7.5: slicePt1(2) = 0 
slicePt2(0) = 1.5: slicePt2(1) = 7.5: slicePt2(2) = 10 
slicePt3(0) = 8.5: slicePt3(1) = 2.5: slicePt3(2) = 10 
’ Cắt khối hộp thành các phần và chuyển màu 
’ các phần đó thành đỏ 
Dim sliceObj As Acad3DSolid 
Set sliceObj = boxObj.SliceSolid _ 
(slicePt1, slicePt2, slicePt3, True) 
sliceObj.Color = acRed 
ZoomAll 
End Sub 
Tương tự như các lưới, vật thể khối sẽ được hiển thị là mô hình khung dây cho đến 
khi thực hiện ẩn, tô bóng hoặc tạo vỏ. Ngoài ra, có thể tính toán các thuộc tính của 
khối như thể tích, mô men quán tính, trọng tâm khối... bằng cách sử dụng các thuộc 
tính sau: MomentOfInertia, PrincipalDirections, PrincipalMoments, 
ProductOfInertia, RadiiOfGyration, Volume. 
Thuộc tính ContourlinesPerSurface điểu khiển số lượng đường để thể hiện các phần 
đường cong của khung dây. 
Thuộc tính RenderSmoothness điều chỉnh độ trơn của các đường thấy và khuất của 
vật thể. 

File đính kèm:

  • pdfphat_trien_autocad_bang_activex_vba_chuong_8_lam_viec_trong.pdf