برمجة أوتوكاد - الدرس السابع - الحصول على إدخالات من المستخدم 1
النقاط الأساسية
- مقدمة
- التابع GetString
- التابع GetPoint
- التابع GetKeyword
- التابع GetDistance
- تمرين
- خاتمة
مقدمة
تعرفنا في الدرس السابق على كيفية إضافة بعض الكائنات باستخدام VBA، وقبل التعرف على إضافة بقية الكائنات سنتعلم كيف نحصل على قيمة ما من المستخدم عن طريق سطر أوامر أوتوكاد، سواء كانت هذه القيمة عددية أو نصية أو نقطة أو …
إن جميع هذه الأوامر تابعة للكائن Utility الذي هو بدوره ابن للكائن Document، وهذه الأوامر تظهر رسالة ما للمستخدم في سطر الأوامر لتسأله عن إدخال ما.
الأمر GetString
هذا الأمر يحث المستخدم على إدخال قيمة نصية في سطر الأوامر وهو يأخذ الشكل التالي :
RetVal = Object.GetString(HasSpaces, Prompt)
حيث:
- Object: هو كائن Utility المشار إليه سابقاً .
- HasSpaces: وهي قيمة يتم تمريرها إلى الأمر
GetString لتسمح بوجود مسافات ضمن النص أو تمنع ذلك، وتأخذ القيم
التالية :
- True: لتسمح بوجود مسافات ضمن النص.
- False: تمنع وجود مسافات ضمن النص المسترجع وعندها يتصرف الزر Space كالزر Enter.
- Prompt: وهو السؤال الذي سيظهر للمستخدم.
- RetVal: وهي القيمة المسترجعة.
مثال: المثال التالي يسأل المستخدم عن اسمه ويخزنه ضمن متحول ثم يعرضه عن طريق صندوق رسالة.
Public Sub EnterName()
Dim nam As String
nam = ThisDrawing.Utility.GetString(True, "Enter your name :")
MsgBox "Your name is " & nam
End Sub
بتنفيذ هذا الماكرو يظهر في سطر الأوامر ما يلي:
أدخل الاسم ثم اضغط Enter فيظهر صندوق رسالة يحوي الاسم الذي أدخلته.
ولكن لاحظ عند ظهور السؤال فإنه لم يظهر في سطر مستقل !
يمكن إظهاره في سطر مستقل بإضافة الثابت vbCrLf إلى نص السؤال وهذا الثابت يجبر النص على الانتقال إلى سطر جديد، كما في الكود التالي:
Public Sub EnterName()
Dim nam As String
nam = ThisDrawing.Utility.GetString(True, vbCrLf & "Enter your name :")
MsgBox "Your name is " & nam
End Sub
ويصبح شكل السؤال عند تنفيذ الماكرو كما يلي:
الأمر GetPoint
هذا الأمر يحث المستخدم على إدخال نقطة ما إما بواسطة المؤشر أو عن طريق كتابة الإحداثيات في سطر الأوامر، ويأخذ الشكل:
RetVal = Object.GetPoint(Point, Prompt)
حيث:
- Object: هو كائن Utility.
- Point: وهي نقطة تفيد عند إدخالها بظهور خط مطاطي يصل بينها وبين النقطة التي نود إضافتها، وتفيدنا في تعيين الموقع النسبي بين هاتين النقطتين، وليس بالضرورة إدخالها (راجع المثال).
- Prompt: السؤال الذي سيظهر للمستخدم.
- RetVal: قيمة من النوع Variant تشير إلى إحداثيات النقطة المستخرجة.
مثال: المثال التالي يحث المستخدم على إدخال نقطة وتخزين إحداثياتها في متحول ثم إظهار هذه الإحداثيات في صندوق رسالة.
Public Sub GetPoint()
Dim pnt As Variant, msg As String
pnt = ThisDrawing.Utility.GetPoint(, vbCrLf & "Specify a point :")
msg = "x=" & pnt(0) & vbCrLf
msg = msg & "y=" & pnt(1) & vbCrLf
msg = msg & "z=" & pnt(2)
MsgBox msg
End Sub
عند تنفيذ الماكرو يظهر سؤال يحث المستخدم على إدخال نقطة، قم بإدخال إحداثياتها في سطر الأوامر أو اخترها في لوحة الرسم بواسطة المؤشر.
وبعد اختيار النقطة يتم عرض رسالة لإظهار إحداثياتها.
الأمر GetKeyword
عند طلب الأمر Rectangle مثلاً من أوتوكاد فإنه يعرض سطراً يحوي مجموعة من الخيارات كما في الشكل:
يمكن اختيار أيّ من هذه الخيارات بكتابة الكلمة كلها أو كتابة الحرف المكتوب بالأحرف الكبيرة، ولكن كيف يتم ذلك باستخدام VBA؟
قد يقول قائل يمكننا استخدام الأمر GetString السابق لعمل ذلك ثم اختبار القيمة المعادة.
قد تكون هذه الطريقة صحيحة نوعاً ما ولكن لها العديد من المساوئ منها:
- قد يكتب المستخدم كلمة أو حرفاً غير موجود ضمن الخيارات.
- لاختيار كلمة Chamfer مثلاً يمكن كتابة C أو ch أو chamfer … أي يوجد العديد من الاحتمالات لكل كلمة ويجب معالجتها جميعاً.
ولتسهيل عمل ذلك نستخدم الأمر GetKeyword حيث نسمي كل خيار من الخيارات السابقة Keyword.
أما طريقة العمل فتتم كما يلي:
- تعريف الكلمات المتوقع إدخالها من قبل المستخدم عن طريق الأمر InitializeUserInput التابع للكائن Utility.
- استخدام الأمر GetKeyword كما سيتم شرحه.
إن الأمر GetKeyword يأخذ الشكل التالي:
RetVal = Object.GetKeyword(Prompt)
حيث:
- Object: هو كائن Utility.
- Prompt: السؤال الذي سيظهر للمستخدم.
- RetVal: القيمة المعادة وهي إحدى القيم المعرفة بواسطة الأمر InitializeUserInput.
مثال: سنقوم الآن بسؤال المستخدم أن يختار أحد الألوان التالية : (الأزرق - الأحمر - الأخضر)
Public Sub GetKeyword()
Dim str As String
ThisDrawing.Utility.InitializeUserInput 0, "Blue Red Green"
str = ThisDrawing.Utility.GetKeyword _
("Enter the
color [<Blue>,Red,Green] :")
If str = "" Then str = "Blue"
MsgBox "You choose the " & str & " color."
End Sub
لاحظ السطر الثالث الذي يحدد الإدخالات المسموحة من قبل المستخدم.
ثم في السطر الرابع نضع صيغة السؤال ثم نضع الاختيارات الممكنة لتنبيه المستخدم أنه لا يستطيع إدخال غيرها، وقد وضعنا إشارتي <> حول كلمة Blue لإخبار المستخدم أنها القيمة الافتراضية.
وفي السطر الخامس نختبر قيمة المتحول str المعادة من المستخدم، فإن كانت تساوي قيمة فارغة فهذا يعني أن المستخدم أراد اختيار القيمة الافتراضية التي هي Blue لذلك نضع القيمة Blue في المتحول str.
في السطر السادس يتم إظهار صندوق رسالة يخبر المستخدم ماذا اختار.
جرب الكود وفي أول مرة أدخل r ثم re ثم red تلاحظ أن جميع هذه الاختيارات تعيد اللون الأحمر …
التابع GetDistance
يمكننا هذا التابع من الحصول على قيمة مسافة بين نقطتين بواسطة المؤشر أو عن طريق إدخال المسافة في سطر الأوامر، وهو يأخذ الشكل التالي:
RetVal = Object.GetDistance(Point , Prompt)
حيث:
- Object: يشير إلى الكائن Utility
- Point: وهو عبارة عن شعاع يشير إلى إحداثيات النقطة الأولى للمسافة التي نريد قياسها، وهي قيمة اختيارية، وفي حال عدم وجودها يتم اختيار النقطة الأولى بواسطة المؤشر أو بإدخال إحداثياتها في سطر الأوامر.
- Prompt: السؤال الذي سيظهر للمستخدم.
- RetVal: القيمة المعادة وهي تمثل المسافة المطلوبة.
مثال: جرب الماكرو التالي:
Public Sub GetDistance1()
Dim dis As Double
dis = ThisDrawing.Utility.GetDistance(, vbCrLf & "Enter the distance:")
MsgBox dis
End Sub
نفذ الماكرو فيظهر السؤال الذي يطلب منك إدخال المسافة.
يمكنك إدخال المسافة إما بكتابتها مباشرة في سطر الأوامر، أو عن طريق اختيار نقطتين فيقوم أوتوكاد بحساب المسافة تلقائياً.
ولكن لنفرض أن النقطة الأولى موجودة سابقاً لديك (كما في التمرين في آخر الدرس) عندها نمرر إحداثيات هذه النقطة إلى الأمر GetDistance كما في المثال التالي:
Public Sub GetDistance2()
Dim dis As Double
Dim pnt1(0 To 2) As Double
pnt1(0) = 100: pnt1(1) = 250
dis = ThisDrawing.Utility.GetDistance _
(pnt1, vbCrLf & "Enter the distance : ")
MsgBox dis
End Sub
لاحظ عند تنفيذ الماكرو فإن أوتوكاد سيقوم بشكل تلقائي باختيار
النقطة الأولى ذات الإحداثيات (100,250,0)
تمرين
لنفرض أن أحد الزبائن قد طلب منك الطلب التالي:
أريد أمراً جديداً في أوتوكاد لرسم دائرة مقسمة لأربعة أرباع كما في الشكل التالي:
بحيث أحدد مركزها ونصف قطرها يدوياً، وكذلك اختيار لون لها من
الألوان التالية (الأزرق ، الأحمر ، الأخضر)
الحل:
Public Sub AddColoredCircle()
Dim pnt As Variant, rd As Double, clr As String
Dim CircleObj As AcadCircle, LineObj1 As AcadLine, LineObj2
As AcadLine
Dim pnt1(0 To 2) As Double, pnt2(0 To 2) As Double
With ThisDrawing
With .Utility
pnt =
.GetPoint(, vbCrLf & "Specify the center of the shape: ")
rd =
.GetDistance(pnt, "Specify the radius : ")
.InitializeUserInput 0, "Blue Red Green"
clr =
.GetKeyword(vbCrLf _
& "Specify the color [<Blue>,Red,Green] : ")
If clr = ""
Then clr = "Blue"
End With
With .ModelSpace
Set CircleObj
= .AddCircle(pnt, rd)
pnt1(0) =
pnt(0) - rd: pnt1(1) = pnt(1)
pnt2(0) =
pnt(0) + rd: pnt2(1) = pnt(1)
Set LineObj1
= .AddLine(pnt1, pnt2)
pnt1(0) =
pnt(0): pnt1(1) = pnt(1) - rd
pnt2(0) =
pnt(0): pnt2(1) = pnt(1) + rd
Set LineObj2
= .AddLine(pnt1, pnt2)
End With
End With
Select Case clr
Case "Blue"
CircleObj.Color = acBlue
LineObj1.Color = acBlue
LineObj2.Color = acBlue
Case "Red"
CircleObj.Color = acRed
LineObj1.Color = acRed
LineObj2.Color = acRed
Case "Green"
CircleObj.Color = acGreen
LineObj1.Color = acGreen
LineObj2.Color = acGreen
End Select
End Sub
نفذ الماكرو السابق، سيسألك أولاً أن تدخل مركز الشكل. يمكنك إدخاله إما عن طريق المؤشر أو كتابة الإحداثيات مباشرة في سطر الأوامر.
ثم سيسألك عن نصف القطر، يمكنك كتابته مباشرة في سطر الأوامر أو اختيار نقطة تابعة لمحيط الدائرة. ثم يسألك عن اللون.
كرر الأمر عدة مرات، وها قد حصلنا على أمر جديد يمكن إضافته إلى أوامر أوتوكاد.
ملحق
لاحظنا في التمرين السابق استخدام بعض أوامر فيجيوال بيسيك مثل Select Case و With...End With.
الأمر With...End With:
لاحظت سابقاً كيف أن جميع أوامر الحصول على إدخالات المستخدم تابعة للكائن Utility والذي بدوره تابع للكائن ThisDrawing لذلك فإن لكل أمر يجب كتابة العبارة التالية قبله :ThisDrawing.Utility.
ولتسهيل الأمر نستخدم الأمر With...End With فالعبارات التالية:
ThisDrawing.Utility.InitializeUserInput 0, "Blue Red Green"
str = ThisDrawing.Utility.GetKeyword("Enter the color [<Blue>,Red,Green]:")
يمكن مكافأتها بالعبارات التالية:
With ThisDrawing.Utility
.InitializeUserInput 0, "Blue Red Green"
str = .GetKeyword("Enter the color [<Blue>,Red,Green]:")
End With
الأمر Select Case:
لنفرض أنه لدينا متحول اسمه var ونريد اختبار قيمته، حيث لكل اختيار نريد تنفيذ أمر معين، مثلاً إن كان أكبر من 10 ننفذ أمراً ما وإن كان يساوي 4 ننفذ أمراً آخر وإن كان أصغر أو يساوي الصفر ننفذ أمراً ثالثاً. في هذه الحالة نستخدم الأمر Select Case كما يلي:
Select Case var
Case Is > 10
'Do Something
Case Is = 4
'Do Something else
Case Is <= 0
'Do Another things
End Select
لمزيد من المعلومات حول هذه الأوامر يجب الرجوع إلى تعليمات فيجيوال
بيسيك المرفقة مع VBA.
خاتمة
تعلمت في هذا الدرس الأمور التالية:
- الحصول على قيمة نصية من المستخدم.
- الحصول على إحداثيات من المستخدم.
- الحصول من المستخدم على قيمة من مجموعة من القيم المعرفة من قبل البرنامج.
- ثم الحصول على قيمة مسافة بين نقطتين.
- تطبيق حول هذه الأمور.
في الدرس القادم سنتعرف إن شاء الله على كيفية الحصول على إدخالات المستخدم من خلال بيئة VBA الرسومية وليس من خلال سطر أوامر أوتوكاد.
هاتف: +963-31-2220008
جوال: +963-999-824193
سوريا - حمص