Chương I. Lịch sử phát triển môi trường CAD
Chương II. Giới thiệu VBA
Một ứng dụng VBA for CAD sẽ bao gồm một số thành phần sau:
-UserForm là đối tượng giao diện người dùng, bên trong có chứa các đoạn code thực thi
câu lệnh.
- Các modules và các Class
- Các ocx và các thư viện mẫu DLL
I. Biến
Biến là các đại lượng có thể thay đổi được giá trị, dùng để lưu trữ các giá trị
trong quá trình chạy chương trình. VB quản lý các biến thông qua tên biến, trong
các biến thường lưu trữ một kiểu dữ liệu đặc trưng riêng.
1. Khai báo biến
Cú pháp khai báo biến:
Dim <tên biến> as [ As DataType ]
Kiểu dữ liệu ở đây có thể hiểu là Integer, String, Object…
Cú pháp: Option Explicit
Nếu trong chương trình chúng ta khai báo câu lệnh trên thì bắt buộc mọi
biến trước khi sử dụng đều cần phải được khai báo rõ ràng, và ngược lại
nếu không có thì chương trình sẽ tự tạo ra các biến mà chúng ta đã không
khai báo. Tuy nhiên như thế chúng ta sẽ khó mà kiểm soát được các biến
của mình.
Bạn có thể thay đổi tùy chọn khai báo biến trước khi sử dụng bằng cách
vào Tool->Option và thay đổi chọn trong Require Variable Declaration.
Nếu tích chọn thì chương trình lập trình của bạn sẽ yêu cầu phải khai báo
trước khi dùng và ngược lại.
2. Đặt tên biến
Đặt tên biến tuân theo quy tắc sau:
1
- Ký tự đầu tiên phải là chữ
- Không được sử dụng các dấu trắng, (.), !,@,#,$ để đặt tên
- Tên không được dài hơn 255 ký tự
- Không đặt tên trùng với các tên đặc biệt dùng để điều khiển
trong VB, ví dụ như Left vì trong UserForm có câu lệnh
UserForm.Left
- Không thể có 2 biến trùng tên nhau trong một chương trình
Thông thường đặt tên trong VBA thì tên biến thường nói lên kiểu dữ liệu
bên trong nó, vì vậy thông thường để tiện dùng, kiểm tra thì người ta
thường tuân theo quy tắc đặt tên sau:
Ngoài ra người lập trình thường đặt tên theo cú pháp “lạc đà” để dễ đọc:
VD: OptSaveFormat thì chứ S và F viết hoa.
3. Biến và phạm vi sử dụng
Nếu biến được khai báo trong hàm, thủ tục thì nó chỉ được hiểu trong
hàm, thủ tục đó. Đó chính là phạm vi ảnh hưởng của biến. Trong trường
hợp bạn muốn có các biến được sử dụng trong toàn bộ chương trình thì
bạn phải khai báo chúng ở bên ngoài tất cả các hàm và thủ tục, và thông
thường nó ở ngay đầu chương trình.
Biến trong thủ tục: Chỉ được hiểu trong thủ tục đó và bạn không thể khai
báo Public cho biến này
Biến trong Module: Được hiểu trong tất cả các thủ tục thuộc Module đó.
Proceduce Variable
Cú pháp: Dim <Tenbien> as [KieuDuLieu]
VD: Dim Line as AcadLine
Module Variable
Để khai báo biến dùng trong cả Module bạn phải khai báo biến ở ngay
đầu tiên của Module.
Cú pháp: Private <TenBien> as [KieuDuLieu]
VD: Private LayerOn as Bolean
Global Variable
2
Khi bạn muốn có một biến được hiểu trong tất cả chương trình bạn dùng
cú pháp
Cú pháp: Public <TenBien> as [KieuDuLieu]
VD: Public LayerOn as Bolean
Lưu ý rằng bạn không thể dùng từ khóa Public để khai báo biến trong
hàm hoặc thủ tục.
Hằng
Hằng thực chất là biến có giá trị không đổi. Được khai báo trong Module,
hàm, thủ tục
Trong trường hợp bạn muốn có các biến không đổi trong toàn chương
trình thì bạn dùng cú pháp sau:
<Public> Const SaveTime = 15
Hằng khai báo trong hàm, thủ tục sẽ được hiểu trong hàm, thủ tục đó.
<Private> Const SaveTime = 15
II. Kiểu dữ liệu
1. Kiểu dữ liệu Variant
Là kiểu dữ liệu mà bạn hoàn toàn chưa xác định, sau này trong chương
trình tùy theo trường hợp sử dụng mà biến có kiểu dữ liệu này sẽ được
gán tương ứng:
Cú pháp:
Dim <TenBien>
2. Các kiểu dữ liệu cơ bản trong VB
a) Dữ liệu cơ bản đơn
Kiểu dữ
liệu Miền giá trị Chú giải
Integer -32768 đến +32767 Chứa một dải các số nguyên có miền giá trị nt
Long
-2147483648 đến
2147483647 Là một dải các số nguyên ( lớn hơn kiểu Integer)
Single Khoảng 1,4e-45 đến 3,4e+48 Là kiểu số thực chiếm 4 byte của dữ liệu
Double
Khoảng 4,94e-324 đến
1,8e+308
Số thực có độ chính xác gấp đôi, chiếm 8 byte
của dữ liệu
Currency 922,337,203,685,447.00
Đến 922,337,203,685,447
String Khoảng 2 tỉ ký tự Các ký tự kiểu Text
Boolean 1 hoặc 0 True/False hoặc On/Off hoặc Yes/No
Byte 0 đến 255
Data
1/1/100 đến 12/31/9999 và
0:00:00 đến 23:59:59
Variant Tất cả các kiểu giá trị
Đặc biệt trong VBA có sự chuyển đổi từ ký tự sang số:
Private Sub CommandButton1_Click()
Dim cout As Integer
Dim Chuoi As String
Count = 100
Chuoi = "555"
MsgBox ("Integer:" & Count & " String=" & Chuoi)
Count = Chuoi
MsgBox ("Integer:" & Count + 1)
End Sub
3
b) Dữ liệu mảng
Dữ liệu mảng là một thành phần dữ liệu quan trọng lập trình. Dữ liệu
mảng là một tập các giá trị cùng kiểu dữ liệu và được lưu giữ dưới cùng 1
tên biến, các giá trị mảng được truy nhập thông qua các chỉ số của mảng.
Cú pháp:
Dim <TenBien>(0 to 2) as [KieuDuLieu]
VD:
Dim DiemDau(0 to 2) as Double ‘ Khai báo mảng tên DiemDau
gồm 3 phần tử
‘ Kiểu dữ liệu là Double
DiemDau(0)=5 ‘Gán các phần tử cho mảng
DiemDau(1)=6
DiemDau(2)=7
c) Mảng động
Mảng động là mảng khi khai báo ta chỉ xác định kiểu mà không xác định
độ dài của mảng.
Cú pháp: Dim <TenMang>() as [KieuDuLieu]
VD: Dim Index() as Integer
Khi cần xác lập độ dài của mảng ta dùng câu lệnh:
Redim Index(10)
Bất cứ mảng nào khi bạn dùng câu lệnh Redim thì toàn bộ nội dung bên
trong của mảng đó sẽ bị xóa. Muốn không bị xóa nội dung bên trong ta
phải dùng câu lệnh sau:
Redim Preserve Index(10)
Ví dụ:
Dim Diem() As Double
Private Sub CommandButton1_Click() ‘Đoạn code cho Button giá trị
đầu
ReDim Diem(3)
Diem(0) = 1
Diem(1) = 2
Diem(2) = 3
MsgBox ("Diem (0):" & Diem(0) & "Diem (1):" & Diem(1) & "Diem
(2):" & Diem(2))
End Sub
Private Sub CommandButton2_Click() ‘Đoạn code cho Button Redim
ReDim Diem(10)
MsgBox ("Diem (0):" & Diem(0) & "Diem_
(1):" & Diem(1) & "Diem (2):" & Diem(2))
End Sub
Private Sub CommandButton3_Click()
‘Đoạn code cho Button Redim Preserve
ReDim Preserve Diem(10)
MsgBox ("Diem (0):" & Diem(0) & "Diem_
(1):" & Diem(1) & "Diem (2):" & Diem(2))
End Sub
3. Các kiểu dữ liệu VBA for CAD
III. Modules
4
VBA application bao gồm các UseForm, Class, Module.
UserForm
UserForm có chứa đầy đủ các thuộc tính và cách sử dụng giống hệt một giao
diện của VB truyền thống. Trên UserForm bạn có thể thêm các button, textbox…
và tạo ra các sự kiện ứng xử cho chúng. Trong một UserForm có các hàm, thủ
tục, biến và các sự kiện nhằm phục vụ cho bạn tạo ra một ứng dụng đầy đủ.
Trong quá trình lập trình để sử dụng các UserForm cho các lần sau bạn cần
Export UserForm. Bạn vào File->Export File. Lưu tên file, file này sẽ được lưu
dưới đuôi frm.
Để add một UserForm bạn có thể vào File->Import File (Lưu ý rằng file này cần
được tạo bởi VB).
Standard
Standard Module thực chất là một mô đun bạn đã thực hiện, và muốn tận dụng
nó ở các chương trình khác nhau, VBA cho phép bạn xuất các File đó dưới
dạng .bas và Import vào các chương trình khác và dùng lại chúng (Tương tự như
UserForm)
Class
Nền móng của lập trình hướng đối tượng trong VB chính là các Class Module.
Bạn có thể tạo ra một đối tượng mới có các thuộc tính, phương thức và các sự
kiện. Bạn có thể tạo ra các Class trong chương trình, Export các class và sử dụng
5
lại chúng trong các chương trình khác nhau. Cách Import một class tương tự như
UserForm.
IV. Procedures
1. Sub
Sub là một đoạn code hoàn chỉnh, có thể thực hiện một công việc hoặc một
phần công việc của của chương trình. Một Sub có thế được gọi từ một
proceduce khác của chương trình. Khi gọi một Sub có thể có các thông số
truyền vào đi kèm hoặc không có. Khi chương trình gọi một Sub thì không có
giá trị trả về.
Cú pháp khai báo Sub:
[Private|Public|Static] Sub <TenProcedures>([Các Thông Số Đi
Kèm])
<Các câu lệnh>
End Sub
Private Sub CommandButton1_Click()
Dim Layer As AcadLayer
For Each Layer In ThisDrawing.Layers
MsgBox Layer.Name
Next Layer
End Sub
2. Function
Function cơ bản khác Sub đó là khi gọi Function sẽ trả về một giá trị.
Cú pháp khai báo Function:
[Private|Public|Static] Function <TenProcedures>([Các Thông Số Đi Kèm]) as
[KieuDuLieu]
<Các câu lệnh>
End Fuction
Cách để gọi một Function:
GiaTri = TenFunction([DanhSachCacBien])
Một điểm lưu ý là khi các biến truyền vào function thì có thể giá trị đó có thể bị
thay đổi, hoặc có thế không bị thay đổi.
6
Code lập trình cho
button Sub
Private Sub btFunction1_Click()
Dim Tong1 As Double
Dim a1 As Double
Dim b1 As Double
Dim c1 As Double
a1 = txtA.Text
b1 = txtB.Text
c1 = txtC.Text
Tong1 = Module1.TinhTongFunction1(a1, b1, c1)
txtA.Text = a1
txtB.Text = b1
txtC.Text = c1
MsgBox ("Tong=" & Tong1)
End Sub
Code lập trình cho button Fuction1
Private Sub btFuction2_Click()
Dim Tong1 As Double
Dim a1 As Double
Dim b1 As Double
Dim c1 As Double
a1 = txtA.Text
b1 = txtB.Text
c1 = txtC.Text
Tong1 = Module1.TinhTongFunction2(a1, b1, c1)
txtA.Text = a1
txtB.Text = b1
txtC.Text = c1
MsgBox ("Tong=" & Tong1)
End Sub
Code lập trình cho button Fuction2
Public Sub btSub_Click()
Dim Tong1 As Double
Dim a1 As Double
Dim b1 As Double
Dim c1 As Double
a1 = txtA.Text
b1 = txtB.Text
c1 = txtC.Text
MsgBox ("a=" & a1)
Call Module1.TinhTongSub(a1, b1, c1, Tong1)
txtA.Text = a1
7
txtB.Text = b1
txtC.Text = c1
MsgBox ("Tong=" & Tong1)
End Sub
Code lập trình hàm Function1 và Function2
Public Sub TinhTongSub(ByRef a As Double, ByRef b As Double,
ByRef c As Double, ByRef tong As Double)
tong = a + b + c
a = a - 1
b = b - 1
c = c - 1
End Sub
Public Function TinhTongFunction1(ByVal a As Double, ByVal b As
Double, ByVal c As Double) As Double
Dim tong As Double
tong = a + b + c
a = a - 1
b = b - 1
c = c - 1
TinhTongFunction1 = tong
End Function
Public Function TinhTongFunction2(ByRef a As Double, ByRef b As
Double, ByRef c As Double) As Double
Dim tong As Double
tong = a + b + c
a = a - 1
b = b - 1
c = c - 1
TinhTongFunction2 = tong
End Function
Khi hàm truyền vào kiểu ByVal thì các dữ liệu truyền vào sau khi ra khỏi
hàm thì không bị thay đổi giá trị.
Nếu truyền vào kiểu ByRef thì giá trị sẽ bị thay đổi trực tiếp trên giá trị
đó.
3. Event
Event proceduce được thực thi khi sự kiện nào đó xảy ra tương ứng. Bạn
có thể khai báo Event trong class, hoặc ngay trong UserForm hoặc ngay
trong ActiveX.
Event có những tên đặc trưng để phân biệt với các proceduce khác trong
object, giống như các bạn khai báo kiểu int thì khác kiểu double.
VD:
Private Sub btFuction2_Click()
8
Trong câu lệnh này thì tên Event Proceduce gồm 2 phần btFunction2 và
Click, sự kiện Click này để phân biệt với các sự kiện khác như là Bbclick
Private Sub btFuction2_DblClick(ByVal Cancel As
MSForms.ReturnBoolean)
Cùng một đối tượng có rất nhiều sự kiện bên trong nó.
V. Các cấu trúc điều khiển rẽ nhánh
1. If………….then
Khi bạn muốn kiểm tra một điều kiện để thực hiện một câu lệnh bạn dùng
If then
If <DieuKienKiemTra> Then [Câu lệnh]
If <Điều Kiện Kiểm Tra> Then
[Khối câu lệnh]
End if
Điều kiện kiểm tra có thể nhận giá trị True hoặc False, khi Điều kiện
đúng thì thực hiện câu lệnh, khi sai thì không làm gì cả.
2. If………….then………………….Else
Cú pháp:
If <Điều kiện kiểm tra> Then
[Khối câu lệnh1]
Else
[Khối câu lệnh2]
End if
Khi điều kiện kiểm tra là đúng thì chương trình thực hiện Khối câu lệnh 1
(không thực hiện khối câu lệnh 2) và ngược lại.
Lưu ý rằng bạn cũng có thể dùng các lệnh If lồng nhau nhưng chúng
thường mất thời gian để kiểm soát, do vậy nếu trong trường hợp có nhiều
điều kiện kiểm tra để rẽ nhánh chúng ta dùng Select Case
3. Select Case
Select Case <Biến kiểm tra>
Case <Biến kiểm tra>:
[Khối câu lênh]
Case Else
<Khối câu lệnh>
End Select
VD:
Select Case KiemTra
Case "0":
result = MsgBox("Xin chào các ban lop TH1")
Case "1":
MsgBox ("Xin chào các ban lop TH2")
Case "2":
MsgBox ("Xin chào các ban lop TH3")
Case "3":
MsgBox ("Xin chào các ban lop TH4")
Case Else
MsgBox ("Khong la cac gia tri tren")
End Select
VI. Các vòng lặp
Các vòng lặp dùng để xử lý các câu lệnh có tính chất lặp đi lặp lại nhiều lần.
Tùy theo cấu trúc mà bạn dùng vòng lặp có thể kết thúc tại đầu, cuối hoặc
một thời điểm nào đó của chương trình.
9
1. Do While……… Lope
Cú pháp:
Do While <Điều kiện kiểm tra>
[Khối câu lệnh]
Loop
Khi điều kiện kiểm tra đúng thì làm tiếp, điều kiện kiểm tra sai thì dừng
lại.
Bạn cần lưu ý rằng trong khối câu lệnh cần có sự điều khiển để thay đổi
điều kiện kiểm tra vì nếu không thì vòng lặp sẽ lặp mãi không thoát ra
được.
2. Do………….Lope While
Cú pháp:
Do
[Khối câu lệnh]
Loop While <Điều kiện kiểm tra>
Vòng lặp này khác vòng lặp trên đó là khi chạy vòng lặp ít ra chương
trình cũng thực hiện được một lần khối câu lệnh rồi, còn vòng lặp Do
While …. Loop thì có thể không thực hiện khối câu lệnh nào trong trường
hợp điều kiện kiểm tra sai.
3. Do Until Loop và Do Loop Until
Cú pháp:
Do until <Điều kiện kiểm tra>
[Khối câu lệnh]
Loop
B1: Chương trình kiểm tra điều kiện
+Nếu đúng chương trình thực hiện khối câu lệnh
B2:Kiểm tra điều kiện
Do
[Khối câu lệnh]
Loop Until <Điều kiện kiểm tra>
B1: Chương trình thực hiện khối câu lệnh
B2: Chương trình kiểm tra điều kiện. Nếu đúng thì chương trình
dừng lại.
Khi điều kiện kiểm tra đúng thì vòng lặp dừng lại. Cú pháp của các câu
lệnh này ngược lại với Do While Loop và Do Loop While.
Các cú pháp câu lệnh trên được gọi là các vòng lặp không xác định vì ta
không biết chính xác số vòng sẽ lặp. Khi biết chính xác số vòng đã lặp ta
dùng các cú pháp sau.
4. For …………… Next
Cú pháp:
For <Biến đếm> = <Giá trị bắt đầu> to <Giá trị kết thúc>
[Bước nhảy]
[Khối câu lệnh]
Next [Biến đếm]
Đầu tiên biến đếm được gán bằng giá trị bắt đầu
Sau đó thực hiện khối câu lệnh
Tăng giá trị biến đếm theo bước nhảy
Chuyển sang thực hiện khối câu lệnh.
10
Khi biến đếm bằng giá trị kết thúc thì chương trình dừng lại.
VD:
Private Sub CommandButton1_Click()
Dim i As Integer
Dim tron(12) As AcadCircle
Dim Tam(0 To 2) As Double
Dim PI As Double
PI = 3.141592654
Dim x As Double
Dim y As Double
Dim R As Double
R = 10
For i = 1 To 12
Tam(0) = Math.Cos(i * PI / 12) * R
Tam(1) = Math.Sin(i * PI / 12) * R
Tam(2) = 0
Set tron(i) = ThisDrawing.ModelSpace.AddCircle(Tam, 2)
Next
For i = 0 To 12
Tam(0) = Math.Cos(-i * PI / 12) * R
Tam(1) = Math.Sin(-i * PI / 12) * R
Tam(2) = 0
Set tron(i) = ThisDrawing.ModelSpace.AddCircle(Tam, 2)
Next
End Sub
11
5. For ……Each…………Next
For Each <phần tử> In <Danh Sách Chọn>
[Khối câu lệnh]
Next <phần tử>
6. Exit Sub và Exit Function
Public Sub SubName()
….
Exit Sub
….
End Sub
Public Function SubName()
….
Exit Function
….
End Function
Trong khi thực thi chương trình nếu gặp phải câu lệnh Exit Sub thì lập tức
nó sẽ thoát ra khỏi khối câu lệnh mà không thực hiện các lệnh tiếp theo
nữa.
7. Cách sử dụng With….End With
Dùng để nhắc lại cùng một tên đối tượng.
Dim myLayer As AcadLine
myLayer = ThisDrawing.ActiveLayer
myLayer.color = acBlue
myLayer.Linetype = "Continuous"
myLayer.Lineweight = acLnWt000
myLayer.Freeze = False
myLayer.LayerOn = True
myLayer.Lock = False
Khi bạn dùng with bạn có thể tiết kiệm được thời gian code với cú pháp
của nó:
Private Sub UserForm_Click()
Dim myLayer As AcadLine
myLayer = ThisDrawing.ActiveLayer
with myLayer
.color = acBlue
.Linetype = "Continuous"
.Lineweight = acLnWt000
.Freeze = False
.LayerOn = True
.Lock = False
End With
VII. Cấu trúc hướng đối tượng
12
Chương III. Các đối tượng công cụ trong VBA
I. Cách tạo một UseForm
Từ môi trường CAD gõ lệnh VBAMAN sẽ hiện ra bảng VBA Manager
Click chuột chọn New để mở môi trường project mới. Sau đó click vào Visual
Basic Editor.
Sau đó ta click vào Insert -> UserForm để chèn vào một UserForm mới.
13
Bên cạnh UserForm1 chúng thường sẽ nhìn thấy hộp Toolbox. Nếu không nhìn
thấy thì bạn click vào View -> Toolbox để cho nó hiện ra.
Trong hộp Toolbox có rất nhiều đối tượng lập trình. Chúng ta sẽ lần lượt tìm
hiểu về từng đối tượng này trong chương tiếp theo
II. Cài đặt thuộc tính của UseForm
Khi ta click chuột vào vùng của UseForm1 thì trong Frame Properties –
UseForm sẽ hiển thị các thuộc tính của UseForm1.
Các thuộc tính:
(Name) = UseForm1 : Đây là tên biến của Form1, khi chương trình chạy sẽ dùng
tên này như là một biến để gọi tới nó. Bạn có thể thay đổi được tên UseForm1
cho tiện sử dụng.
Caption: Tên hiển thị ở phía trên của UseForm1. Bạn có thể sửa dữ liệu của
caption này. VD: Nhap Du Lieu.
Height: Thuộc tính quy định chiều cao của Form.
Width: Thuộc tính quy định chiều rộng của Form.
Bạn có thể tùy chỉnh các thuộc tính này ngay trên bảng Properties hoặc lập trình
để thay đổi các thuộc tính đó.
Top và Left của Form.
14
III. Cách thêm các đối tượng vào UseForm
Tạo một đối tượng trên UseForm. Bạn có thể dùng cách kéo thả để tạo một đối
tượng.
1. Label
Label hay còn gọi là nhãn. Thông thường nó để chú thích hay định
danh các thông tin cần thiết.
2. Textbox
3. Button
Để lập trình phương thức cho Button Lấy tọa độ bạn Click kép vào nút
Button đó sẽ hiện ra môi trường soạn thảo.
Private Sub CmbPick_Click()
Dim Point As Variant
On Error Resume Next
UserForm1.Hide
Point = ThisDrawing.Utility.GetPoint(, "Select a Point")
'Yeu cau nguoi dung chon diem
If Err Then Exit Sub
txtX.Text = Point(0): txtY.Text = Point(1): txtZ.Text =
Point(2)
'Lay toa do diem ra man hinh
UserForm1.Show
End Sub
Sau khi gõ code xong bạn chạy thử chương trình bằng cách nhấn vào nút
Run
4. C
omboBox
Khi ta
muốn
khống chế
15
người dùng chọn một trong số những lựa chọn có sẵn thì ta ưu tiên
dùng ComboBox.
Để dùng ComboBox các bạn vẫn dùng phương pháp kéo thả và form.
Đoạn code để các bạn add
các Item vào Combobox
Private Sub
UserForm_Activate()
Me.ComboBox1.Clear
Me.ComboBox1.AddItem "Ve Tam Giac"
Me.ComboBox1.AddItem "Ve Hinh Vuong"
Me.ComboBox1.AddItem "Ve hinh Tron"
End Sub
Khi các bạn chọn Index Ve Tam Giac, hoặc Ve Hinh Vuong trong ComboBox sẽ bắt sự
kiện IndexChange.
Để lập trình cho sự kiện đó các bạn gõ đoạn code sau:
Private Sub ComboBox1_Change()
Dim KiemTra As Integer
KiemTra = Me.ComboBox1.ListIndex
Dim View As AcadUCS
Select Case KiemTra
Case "0"
'Ve Tam Giac
UserForm1.Left = 500
Dim Diem1(2) As Double
Dim Diem2(2) As Double
Dim Diem3(2) As Double
Dim Diem4(2) As Double
Dim DuongThang As AcadLine
Diem1(0) = 0: Diem1(1) = 0: Diem1(2) = 0
Diem2(0) = 10: Diem2(1) = 10: Diem2(2) = 0
Diem3(0) = 20: Diem3(1) = 0: Diem3(2) = 0
Set DuongThang = ThisDrawing.ModelSpace.AddLine(Diem1,
Diem2)
Set DuongThang = ThisDrawing.ModelSpace.AddLine(Diem2,
Diem3)
Set DuongThang = ThisDrawing.ModelSpace.AddLine(Diem1,
Diem3)
Update
Case "1"
'Ve Hinh Vuong
Diem1(0) = 0: Diem1(1) = 0: Diem1(2) = 0
Diem2(0) = 0: Diem2(1) = 10: Diem2(2) = 0
Diem3(0) = 10: Diem3(1) = 10: Diem3(2) = 0
Diem4(0) = 10: Diem4(1) = 0: Diem4(2) = 0
Set DuongThang = ThisDrawing.ModelSpace.AddLine(Diem1,
Diem2)
Set DuongThang = ThisDrawing.ModelSpace.AddLine(Diem2,
Diem3)
Set DuongThang = ThisDrawing.ModelSpace.AddLine(Diem3,
Diem4)
Set DuongThang = ThisDrawing.ModelSpace.AddLine(Diem4,
Diem1)
16
Update
Case "2"
Dim HinhTron As AcadCircle
Set HinhTron = ThisDrawing.ModelSpace.AddCircle(Diem1, 10)
Update
End Select
End Sub
Chọn vẽ tam giác Chọn vẽ hình vuông Chọn vẽ hình tròn
5. ListBox
ListBox cho phép hiển thị một dãy các danh sách cho chúng ta lựa chọn 1
trong số những Item đó. Khác với TextBox bạn không thể ghi dữ liệu vào
được.
Các bạn cũng cần add các Item vào trong ListBox để nó hiển thị khi
chương trình chạy:
Private Sub ListBox1_Change()
Dim result As Boolean
KiemTra = ListBox1.ListIndex
Select Case KiemTra
Case "0":
result = MsgBox("Xin chào các ban lop TH1")
Case "1":
MsgBox ("Xin chào các ban lop TH2")
Case "2":
MsgBox ("Xin chào các ban lop TH3")
Case "3":
MsgBox ("Xin chào các ban lop TH4")
Case Else
MsgBox ("Khong la cac gia tri tren")
End Select
Update
End Sub
‘*******************************
Private Sub UserForm_Activate()
Me.ListBox1.AddItem ("Lop 51TH1 pro")
Me.ListBox1.AddItem ("Lop 51TH2 pro")
Me.ListBox1.AddItem ("Lop 51TH3 pro")
Me.ListBox1.AddItem ("Lop 51TH4 pro")
End Sub
‘********************************
Và đây là kết quả của đoạn code trên:
17
Khi bạn Click vào các lớp tương ứng sẽ hiện ra các thông báo.
6. CheckBox
Sử dụng TextBox để xác định một điều kiện ràng buộc có được chọn
hay không.
Nếu ô CheckBox được tích thì có nghĩa điều kiện đó được chọn.
Trong một UserForm có thể có nhiều ô CheckBox được chọn.
Đoạn code tham khảo kiểm tra ô CheckBox có được chọn hay không:
Private Sub CheckBox1_Click()
If CheckBox1.Value Then
MsgBox ("Da chon")
Else
MsgBox ("Chua chon")
End If
End Sub
7. OptionButton
Khi bạn có nhiều sự lựa chọn mà bạn chỉ cho người dùng chỉ được
chọn một trong các lựa chọn đó bạn dùng OptionButton
If OptionButton1.Value = True Then
MsgBox ("Option 1 duoc chon")
Else
If OptionButton2.Value = True Then
MsgBox ("Option 2 duoc chon")
Else
MsgBox ("Option 3 duoc chon")
End If
End If
18
8. ToggleButton
9. Frame
Tác dụng của Frame là khi bạn muốn nhóm các dữ liệu liên quan vào
cùng một vùng, như vậy chương trình của bạn trông sẽ khoa học và
chuyên nghiệp hơn.
Khi thuộc tính Enable của Frame là False thì tất cả các đối tượng trên
Frame đó bạn sẽ không thể tương tác được
10.CommandButton
11.TabStrip
19
12. MultiPage
13. ScrollBar
14. SpinButton
15.Image
20
CHƯƠNG IV: LÀM VIỆC VỚI CÁC LAYER VÀ LINETYPES
I. LAYER
Việc sử dụng các layer và linetypes là các công cụ để nâng cao hiệu quả quản lý
bản vẽ trong khi vẽ và in ấn. Trong chương này chúng ta sẽ học cách để tạo lập,
điều khiển và sử dụng các Layer.
Layer
Layer là một thuộc tính của các đối tượng nét vẽ trong CAD, việc sử dụng các
layer để tạo thành các nhóm đối tượng vẽ khác nhau rất tiện trong quản lý các
đối tượng vẽ. Ví dụ tất các các nét trục được vẽ bằng cùng một layer,.
Accessing Layer
AutoCad tổ chức quản lý layer theo các collection, đây là nơi tập hợp và quản lý
các đối tượng layer trong bản vẽ. Bạn có thể tạo ra các layer tùy theo yêu cầu sử
dụng vẽ của bạn. Để quản lý tất cả các đối tượng này ta khai báo biến
AcadLayers. Đối tượng kiểu AcadLayers này bao gồm tất cả các Layer trong bản
vẽ.
Private Sub CommandButton1_Click()
Dim ObjectLayer As AcadLayers
Set ObjectLayer = ThisDrawing.Layers
MsgBox (ObjectLayer.Count)
End Sub Dim ObjLayers as AcadLayers
Set ObjLayers = ThisDrawing.Layers
Để truy nhập vào một đối tượng Layer cụ thể ta dùng biến AcadLayer.
Dim ObjLayer As AcadLayer
Set ObjLayer = ObjLayers.Item(2)
Set ObjLayer = ObjLayers.Item("Layer4")
MsgBox (ObjLayer.Name)
Câu lệnh Set ObjLayer = ObjLayers.Item(2) có nghĩa là đối tượng ObjLayer
được gán phần tử Layer đứng thứ 2 (thứ tự từ trên xuống trong List Layer mà
bạn thấy trong khi vẽ)
Interating Layer
Các layer cũng cho phép các bạn lặp như với các biến nguyên của vòng lặp for.
Đó gọi là sự lặp các layer.
Private Sub CommandButton2_Click()
Dim ObjLayer As AcadLayer
For Each ObjLayer In ThisDrawing.Layers
MsgBox (ObjLayer.Name)
Next
End Sub
Kiểm tra sự tồn tại của một Layer
Khi lập trình bạn có thể gặp trường hợp cần kiểm tra xem một Layer đã tồn tại
hay chưa (có thể là để dùng, sửa hoặc xóa), bạn cần lưu ý rằng AutoCad quản lý
Layer theo tên. Đoạn Code sau giúp bạn kiểm tra sự có mặt của một Layer.
21
Private Sub CommandButton3_Click()
Dim objLayer As AcadLayer
Dim TenLayer As String
TenLayer = InputBox("Nhap vao ten Layer can KT:")
If TenLayer = "" Then
Exit Sub
End If
For Each objLayer In ThisDrawing.Layers
If 0 = StrComp(objLayer.Name, TenLayer, vbTextCompare)
Then
MsgBox "Layer " & TenLayer & " da ton tai"
Exit Sub
End If
Next
MsgBox "Layer " & TenLayer & " chua ton tai"
End Sub
Lưu ý: Trong AutoCad phân biệt chữ in hoa và chữ thường, ví dụ 2 tên Layer1
và layer1 là hoàn toàn khác nhau. Các bạn cần ghi nhớ khi lập trình để tránh
nhầm lẫn.
Tạo một Layer mới
Bạn có thể tạo các layer tùy theo mục đích sử dụng của mình mà không bị hạn
chế về số lượng. Để tạo một layer mới các bạn dùng cú pháp sau:
Set LayerObject = LayerCollection.Add(LayerName)
Private Sub CommandButton4_Click()
Dim TenLayer As String
22
Dim ObjLayer As AcadLayer
TenLayer = InputBox("Nhap vao ten Layer can them:")
If TenLayer = "" Then
Exit Sub
End If
On Error Resume Next 'Neu loi thi nhay sang buoc tiep theo
Set ObjLayer = ThisDrawing.Layers(TenLayer)
If ObjLayer Is Nothing Then
Set ObjLayer = ThisDrawing.Layers.Add(TenLayer)
If ObjLayer Is Nothing Then
MsgBox "Khong add duoc"
Else
MsgBox "Da them layer " & TenLayer
End If
Else
MsgBox "Layer da co roi"
End If
End Sub
Active một Layer
ThisDrawing.ActiveLayer = ThisDrawing.Layers("Layer1")
Khi bạn sử dụng câu lệnh này bạn nên lưu ý rằng tên layer Layer1 phải tồn tại
trong bản vẽ rồi, nếu không chương trình sẽ báo lỗi.
Tắt/mở một Layer
Trong khi thể hiện bản vẽ, có trường hợp bạn muốn chỉ có một layer nào đó
được hiện trên bản vẽ để tiện cho việc chỉnh sửa, lúc đó bạn cần biết cách tắt mở
các Layer.
Đoạn code sau thực hiện công việc đó
Chỉ hiển thị một Layer nhập vào
Private Sub CommandButton1_Click()
On Error Resume Next
Dim TenLayer As String
Dim ObjLayer As AcadLayer
TenLayer = InputBox("Nhap vao ten Layer muon hien")
If TenLayer = "" Then Exit Sub
For Each ObjLayer In ThisDrawing.Layers
ObjLayer.LayerOn = False
Next ObjLayer
Set ObjLayer = ThisDrawing.Layers(TenLayer)
If ObjLayer Is Nothing Then
MsgBox "Khong ton tai layer yeu cau"
Exit Sub
End If
ObjLayer.LayerOn = True
'UserForm1.Hide
Update
End Sub
Hiển thị tất cả các Layer
Private Sub CommandButton2_Click()
Dim ObjLayer As AcadLayer
23
For Each ObjLayer In ThisDrawing.Layers
ObjLayer.LayerOn = True
Next ObjLayer
'UserForm1.Hide
Update
End Sub
Đóng băng một Layer
Chức năng đóng băng một Layer tức là làm cho người vẽ không thể tác động
được vào Layer đó (mặc dù có trên hình vẽ)
Tương tự như cho Ẩn/Hiện một layer, để đóng băng một Layer bạn dùng câu
lệnh:
ObjLayer.Freeze = True
Ví dụ
Private Sub CommandButton1_Click()
On Error Resume Next
Dim TenLayer As String
Dim ObjLayer As AcadLayer
TenLayer = InputBox("Nhap vao ten Layer muon dong
bang")
If TenLayer = "" Then Exit Sub
For Each ObjLayer In ThisDrawing.Layers
ObjLayer.Freeze = False
Next ObjLayer
Set ObjLayer = ThisDrawing.Layers(TenLayer)
If ObjLayer Is Nothing Then
MsgBox "Khong ton tai layer yeu cau"
Exit Sub
End If
ObjLayer.Freeze = True
'UserForm1.Hide
Update
End Sub
Khóa một Layer
Để khóa một Layer ta dùng phương thức Lock của đối tượng:
ObjLayer.Lock = True
Để kiểm tra một Layer đã bị khóa chưa ta có thể kiểm tra bằng cách
If ObjLayer.Lock Then ……
‘Khối câu lệnh được thực thi khi đối tượng kiểm tra đã bị khóa.
Rename Layer
Xóa Layer
Màu của Layer
Để điều khiển màu của Layer ta dùng cú pháp
ObjLayer.Lock ObjLayer.Color = <Tên mầu>
Tên màu có thể là chữ hoặc các số.
VD: acRed = Màu đỏ
Hoặc ObjLayer.Lock = 1 ‘Màu đỏ
24
Khai báo bằng
Tên
Khai báo bằng chỉ
số Màu hiển thị
acByBlock 0 Hiển thị màu theo Block
acRed 1 Màu đỏ
acYellow 2 Màu vàng
acGreen 3 Màu xanh lá cây
acCyan 4 Màu xanh lục
acBlue 5 Xanh da trời
acMagenta 6 Màu hồng đậm
acWhile 7 Màu trắng
acByLayer 256 Hiển thị theo Layer
Layer Linetypes
Cũng giống như màu, một Layer các kiểu Linetypes. Nếu bạn không gán kiểu
Linetypes cho Layer thì Layer sẽ lấy Linetype mặc định. Tất cả LineType đều
được cài đặt theo Layer.
Mặc định của linetype là kiểu continous (Liên tục). Trong một bản vẽ xây dựng
có rất nhiều nét vẽ cần thể hiện kiểu linetype theo tiêu chuẩn (ví dụ nét trục, nét
khuất, nét thấy…) vì vậy khi lập trình vẽ bạn cần biết các linetype khác nhau.
Để cài đặt linetype bạn dùng phương thức:
objectLayer = “<Tên kiểu lineTypes>”
VD:
objectLayer = “Continuous”
Layer Lineweight
II. LAYER
25