JWDStructure

دروس VBA AutoCAD 

برمجة أوتوكاد - الدرس السابع - الحصول على إدخالات من المستخدم 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

بتنفيذ هذا الماكرو يظهر في سطر الأوامر ما يلي:

الشكل (7-1)

أدخل الاسم ثم اضغط 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

ويصبح شكل السؤال عند تنفيذ الماكرو كما يلي:

الشكل (7-2)

الأمر 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 مثلاً من أوتوكاد فإنه يعرض سطراً يحوي مجموعة من الخيارات كما في الشكل:

الشكل (7-3)

يمكن اختيار أيّ من هذه الخيارات بكتابة الكلمة كلها أو كتابة الحرف المكتوب بالأحرف الكبيرة، ولكن كيف يتم ذلك باستخدام 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)

تمرين

لنفرض أن أحد الزبائن قد طلب منك الطلب التالي:

أريد أمراً جديداً في أوتوكاد لرسم دائرة مقسمة لأربعة أرباع كما في الشكل التالي:

الشكل (7-4)

بحيث أحدد مركزها ونصف قطرها يدوياً، وكذلك اختيار لون لها من الألوان التالية (الأزرق ، الأحمر ، الأخضر)
الحل:

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 الرسومية وليس من خلال سطر أوامر أوتوكاد.

تحميل