Tải bản đầy đủ (.pdf) (7 trang)

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

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (569.24 KB, 7 trang )

<span class='text_page_counter'>(1)</span><div class='page_container' data-page=1>

<b>L</b>



<b>L</b>

<b>À</b>

<b>À</b>

<b>M</b>

<b>M</b>

<b>V</b>

<b>V</b>

<b>I</b>

<b>I</b>

<b>Ệ</b>

<b>Ệ</b>

<b>C</b>

<b>C</b>

<b>T</b>

<b>T</b>

<b>R</b>

<b>R</b>

<b>O</b>

<b>O</b>

<b>N</b>

<b>N</b>

<b>G</b>

<b>G</b>

<b>K</b>

<b>K</b>

<b>H</b>

<b>H</b>

<b>Ô</b>

<b>Ô</b>

<b>N</b>

<b>N</b>

<b>G</b>

<b>G</b>


<b>G</b>



<b>G</b>

<b>I</b>

<b>I</b>

<b>A</b>

<b>A</b>

<b>N</b>

<b>N</b>

<b>B</b>

<b>B</b>

<b>A</b>

<b>A</b>

<b>C</b>

<b>C</b>

<b>H</b>

<b>H</b>

<b>I</b>

<b>I</b>

<b>Ề</b>

<b>Ề</b>

<b>U</b>

<b>U</b>



<b>8</b>



<b>Trong ch</b>

<b>ươ</b>

<b>ng này</b>



ƒ <b>Xác định toạđộ ba chiều </b>
ƒ <b>Định nghĩa hệ toạđộ</b>


<b>người dùng </b>


ƒ <b>Chuyển trục toạđộ</b>
ƒ <b>Tạo đối tượng ba chiều </b>
ƒ <b>Hiệu chỉnh trong không </b>


<b>gian ba chiều </b>


ƒ <b>Hiệu chỉnh vật thể khối </b>
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ụ


</div>
<span class='text_page_counter'>(2)</span><div class='page_container' data-page=2>

<b>1. </b>

<b>Xác </b>

<b>đị</b>

<b>nh t</b>

<b>ọ</b>

<b>a </b>

<b>độ</b>

<b> ba chi</b>

<b>ề</b>

<b>u </b>



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


<b>1.1. Quy t</b>

<b>ắ</b>

<b>c bàn tay ph</b>

<b>ả</b>

<b>i </b>



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
vng 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ạđộđó.


<b>1.2. Nh</b>

<b>ậ</b>

<b>p t</b>

<b>ọ</b>

<b>a </b>

<b>độ</b>

<b> X, Y , Z </b>



</div>
<span class='text_page_counter'>(3)</span><div class='page_container' data-page=3>

Đ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.


<b>Định nghĩa và truy vấn toạđộ của đường đa tuyến 2D và 3D </b>


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))


</div>
<span class='text_page_counter'>(4)</span><div class='page_container' data-page=4>

<b>2. </b>

<b>Đị</b>

<b>nh ngh</b>

<b>ĩ</b>

<b>a h</b>

<b>ệ</b>

<b> t</b>

<b>ọ</b>

<b>a </b>

<b>độ</b>

<b> ng</b>

<b>ườ</b>

<b>i dùng </b>



Đị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


</div>
<span class='text_page_counter'>(5)</span><div class='page_container' data-page=5>

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.


<b>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 </b>
<b>hệ toạđộ UCS này. </b>


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


<b>3. </b>

<b>Chuy</b>

<b>ể</b>

<b>n tr</b>

<b>ụ</b>

<b>c t</b>

<b>ọ</b>

<b>a </b>

<b>độ</b>




Phương thức TranslateCoordinates sẽ chuyển một điểm hoặc một véctơ từ hệ toạđộ


</div>
<span class='text_page_counter'>(6)</span><div class='page_container' data-page=6>



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 “<i>ActiveX and VBA Reference”</i> để 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 ln là mặt phẳng quan sát của



1<sub> Véc t</sub><sub>ơ</sub><sub> pháp tuy</sub><sub>ế</sub><sub>n (Normal vector): véc t</sub><sub>ơ</sub><sub> pháp tuy</sub><sub>ế</sub><sub>n </sub><sub>đơ</sub><sub>n v</sub><sub>ị</sub><sub> trong h</sub><sub>ệ</sub><sub> to</sub><sub>ạ</sub><sub>độ</sub><sub> WCS, dùng </sub><sub>để</sub><sub>đị</sub><sub>nh </sub>


</div>
<span class='text_page_counter'>(7)</span><div class='page_container' data-page=7>

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.


<b>Biến đổi toạđộ từ hệ trục OCS sang hệ trục WCS </b>


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


</div>

<!--links-->

×