| |
 |
تطبيقات
AutoCad |
|
أساسيات
AutoCad |
|
|
| بسم الله
الرحمن الرحيم، والصلاة والسلام على سيدنا محمد وعلى آله وصحبه أجمعين
…
موضوع هذه المقالة القطع المكافئ، وأتحدث فيها حول تعريف القطع المكافئ،
ومعادلة القطع المكافئ، وإنشائه في أوتوكاد، و شرح برنامج لرسم القطع المكافئ في أوتوكاد بلغة
فيجوال بيسيك للتطبيقات، مع بعض الأمثلة على
استخدام البرنامج، وأفترض ههنا أن لديك معرفة
سابقة بأوتوكاد وفيجوال بيسيك.
|
| تعريف القطع المكافئ : |
| القطع المكافئ
هو المحل الهندسي لنقاط المستوي متساوية البعد عن نقطة ثابتة وعن
مستقيم ثابت مفروضين من المستوي.
تدعى النقطة الثابتة محرق القطع، أما المستقيم الثابت فيدعى دليل
القطع. |
|
| معادلة القطع المكافئ: |
ليكن القطع المكافئ في الشكل معرّفاً بالمحرق c والدليل
D، والبعد بين c و D هو a. وليكن مبدأ الإحداثيات هو رأس
القطع. b نقطة من القطع أي أنها تحقق العلاقة [cb]=[bf] |
 |
| من المثلث القائم bce، وحسب فيثاغورس نجد: |
| [ce]2 + [be]2 = [bc]2 |
| ولكن : |
[ce] = x [bc] = [bf] = y + a/2 [be] = y –
a/2 |
| نعوض في المعادلة السابقة نجد: |
| x2 + (y – a/2)2 = (y + a/2)2 |
| نصلح المعادلة السابقة فنحصل على معادلة القطع المكافئ
التالية: |
| x2 = 2.a.y |
| وهي معادلة قطع مكافئ محوره يوازي المحور y، أي يوازي دليله المحور
x ويقع رأسه على مركز الإحداثيات.
|
| إنشاء
القطع المكافئ في أوتوكاد: |
إن إحدى خصائص
مجمّع الخطوط (Polyline) أنه يمكن تحويله بمنحن (أو شبه منحن) من
الدرجة الثانية أو الدرجة الثالثة، وما يهمنا هنا هو الدرجة الثانية،
فلو أنشأنا مجمع خطوط على شكل زاوية، وألبسناه هذا المنحني، تكون خصائص
المنحني:
- بدايته ونهايته هما بداية ونهاية الزاوية المرسومة.
- أضلاع الزاوية هي مماسات للقطع كما في
الشكل.
|
 |
| وقد
قلنا سابقاً أن هذا شبه منحن، وذلك لأنه مؤلف من مجموعة قطع مستقيمة،
تحقق رؤوسها المعادلة. ونحوله إلى منحن كامل بتحويله إلى منحني شرائحي.
ولكن كيف يمكن تحديد المماس للقطع المكافئ؟ |
 |
لنفرض
النقطة b أحد أطراف القطع (نقطة من القطع) وf مسقطها على الدليل. من
خصائص القطع المكافئ أن المماس للقطع في النقطة b عمودي على القطعة cf.
أما خطوات الرسم فهي كما يلي :
بفرض أن المحرق والدليل وارتفاع القطع معلومة، نقوم بما يلي:
- تحديد النقطة b: نرسم دائرة نصف قطرها
ارتفاع القطع مضافاً له نصف المسافة بين المحرق والدليل، وتمر من
المحرق وتمس الدليل فيكون مركزها هو النقطة b.
- رسم المماس في b : نرسم النقطة f مسقط b
على الدليل ثم نرسم عموداً من b على cf.
- نأخذ نظير هذا المماس بالنسبة لمحور القطع المار من المحرق فيكون
المماس الآخر، نمدد كلا المماسين حتى يلتقيا في نقطة واحدة، ثم
نحولهما إلى مجمع خطوط واحد.
- نختار الأمر تحرير مجمع خطوط (pedit)، ثم ننتقي مجمع الخطوط
السابق، ونكتب s لتحويله إلى منحن، ثم x للخروج من الأمر.
- نختار هذا المنحني (شبه المنحني) ثم نكتب ch لإظهار نافذة
الخصائص، نغير الخصيصة Fit/Smooth إلى تربيعي (Quadratic)، فيتحول
إلى منحن تربيعي من الدرجة الثانية.
- نكتب الأمر تحرير منحنى شرائحي (splinedit)، ثم ننتقي شبه
المنحني السابق فيتحول إلى منحني شرائحي (Spline)، ثم نخرج من
الأمر، وهو المطلوب
وقد قمت بكتابة برنامج بلغة VBA يختصر هذه العملية كلها ويقوم برسم
قطع مكافئ في الحالات التالية :
- المحرق والدليل وارتفاع القطع معلومة.
- عرض وارتفاع ورأس القطع معلومة.
|
| شرح البرنامج: |
قم أولاً بتشغيل VBA بالضغط على (ALT + F11) معاً، فتظهر النافذة
الرئيسية لفيجوال بيسيك للتطبيقات. أضف وحدة نمطية (module) جديدة،
من القائمة Insert > Module. تظهر نافذة فارغة، لكتابة
البرنامج. يتألف البرنامج من إجرائين (Sub) ووظيفتين (Function):
|
| الوظيفة/ الإجراء |
|
الشرح |
| Parabola |
|
الإجراء الرئيسي الذي يُستدعى، وهو
يتحكم بالأجزاء الأخرى للبرنامج. |
| DrawParabola |
|
الجزء الذي يقوم برسم القطع بعد
تمرير المعطيات له. |
| GetInfo1 |
|
الوظيفة الأولى، نحصل منه على
المعطيات المطلوبة لرسم القطع، والمعطيات هي المحرق والدليل
وارتفاع القطع، ويعيد القيمة True في حال الاختيار الصحيح. |
| GetInfo2 |
|
الوظيفة الثانية، نحصل منه على
المعطيات المطلوبة لرسم القطع، والمعطيات هي عرض وارتفاع ورأس
القطع، ويعيد القيمة True في حال الاختيار
الصحيح. | |
|
الوظيفة GetInfo1 : سأقوم بشرح هذا الجزء
بالتفصيل، أما الجزء الثاني GetInfo2 فهو شبيه به، ولن أتطرق إلى شرحه،
ولكني سأدرج شفرته. أما شفرة GetInfo1 فموضحة في الشكل
التالي: |
|
Private Function GetInfo1(a
As Single, h As
Single, pnt As Variant) As
Boolean Dim
o As Object, TN As String, lin As
acadLine Dim
pnt1(0 To 2) As Double On Error GoTo
anError pnt
= ThisDrawing.Utility.GetPoint(, "Specify point:
") Do Do ThisDrawing.Utility.GetSubEntity
o, a1, a2, a3, "Select Line:
" TN
=
TypeName(o) Loop While TN <>
"IAcadLine" Set lin =
o If Abs(lin.StartPoint(1) - lin.EndPoint(1))
> 10 ^ -10 Then MsgBox
"يجب أن يكون الخط
أفقياً" Else Exit
Do End If Loop a = pnt(1) -
lin.StartPoint(1) pnt1(0) = pnt(0):
pnt1(1) = pnt(1) - a / 2: pnt1(2) =
pnt(2) Do h
= Abs(ThisDrawing.Utility.GetDistance(pnt1, "Specify height:
")) ThisDrawing.Utility.Prompt
"Height must be nonzero." Loop While h =
0
GetInfo1 = True anError: Err.Clear End Function |
| نلاحظ أن هذه الوظيفة من النوع Private، لأننا لن نحتاج
لها خارج الوحدة النمطية، ولا نريدها أن تظهر في لائحة الماكروات في
أوتوكاد.
نلاحظ أن القيم a,h,pnt قد مُررت للوظيفة، وفي الحقيقة سيتم إدخالها
ضمن هذه الوظيفة. نقوم أولاً باختيار نقطة المحرق، وتخزينها في
المتحول pnt، بواسطة الطريقة GetPoint. ثم نختار خطاً أفقياً من
النوع خط (line) وليس من النوع مجمع خطوط (polyline)، ونخزّنه في
المتحول lin، بواسطة الطريقة GetSubEntity.
نقوم بحساب قيمة a في السطر: |
|
a = pnt(1) – lin.StartPoint(1) |
حيث يتم تعريف كل نقطة بمصفوفة من ثلاثة عناصر هي
x,y,z. نحسب إحداثيات رأس القطع ونخزنها في المتحول pnt1، وفائدة
ذلك في الخطوة التالية. ندخل الارتفاع بواسطة الطريقة GetDistance،
وهي المسافة الشاقولية بين رأس القطع pnt1 وطرف القطع، ويمكن إدخالها
إما بواسطة الفأرة أو بإدخال القيمة في سطر الأوامر. تعيد الوظيفة
القيمة True في حال أدخلت المعطيات جميعها، ويعيد القيم a,h,pnt. |
| الوظيفة GetInfo2: |
Private
Function GetInfo2(a As Single, h
As Single, pnt As
Variant) As Boolean On Error GoTo
anError: With
ThisDrawing.Utility Do W
= Abs(.GetDistance(, "Specify width:
")) Loop While W =
0 Do h
= .GetDistance(, "Specify height:
") Loop While h =
0 pnt =
.GetPoint(, "Specify peak for parabola:
") End
With a = (W / 2) ^ 2 / (2 *
h) pnt(1) = pnt(1) + a /
2 h =
Abs(h) ThisDrawing.ModelSpace.AddPoint
pnt GetInfo2 = True anError: Err.Clear End Function |
| الإجراء DrawParabola: |
Private Sub DrawParabola(a As Single, h As
Single, pnt As
Variant) Dim
m As Single, y As Single Dim plin As
AcadPolyline, ppnt(0 To 8) As Double
x =
Sqr(Abs(2 * a * h)) m = x /
a If a < 0
Then h = -h y
= h - m *
x ppnt(0) =
-x + pnt(0): ppnt(1) = h + pnt(1) - a / 2: ppnt(2) =
pnt(2) ppnt(3) = pnt(0): ppnt(4) = y +
pnt(1) - a / 2: ppnt(5) = pnt(2) ppnt(6)
= x + pnt(0): ppnt(7) = h + pnt(1) - a / 2: ppnt(8) =
pnt(2) Set plin =
ThisDrawing.ModelSpace.AddPolyline(ppnt) plin.Type
= acQuadSplinePoly
End
Sub |
عرفنا المتحولات التالية: m: ميل
المماس. plin: مجمع الخطوط الذي سنرسمه. ppnt: إحداثيات النقاط
المعرفة للقطع. نقوم بتمرير المتحولات a,h,pnt لهذا الجزء من
البرنامج، ونحسب إحداثيات رؤوس مجمع الخطوط كما في الشفرة. نقوم -
بعد حساب الإحداثيات ppnt – برسم مجمع خطوط بواسطة الطريقة
AddPolyLine، ثم نغيّر الخصيصة Type إلى acQuadSplinePoly. |
| الإجراء Parabola: |
Public
Sub Parabola() Dim pnt As
Variant Dim
a As Single, h As Single, j As
Boolean On Error GoTo
Leave
ThisDrawing.Utility.InitializeUserInput
0, "P W" i =
ThisDrawing.Utility.GetKeyword("Enter an option [Point and line /
Width and height] : ") If i = "" Then i =
"P" Select Case
i Case
"P" j
= GetInfo1(a, h,
pnt) Case
"W" j
= GetInfo2(a, h, pnt) End Select If j = False Then
GoTo
Leave DrawParabola
a, h, pnt ThisDrawing.SendCommand
"splinedit l x
" Leave: Err.Clear End Sub |
نلاحظ، أولاً، أنه من النوع Public لأننا نحتاج إلى
ظهوره في لائحة الماكروات في أوتوكاد. لدينا طريقتان لإدخال
المعطيات، ولذلك نحتاج إلى توجيه المستخدم باختيار إحداهما بواسطة
الطريقة GetKeyword، وسيكون جوابه بكتابة P إذا أراد اختيار Point and
line (في حالة إدخال المحرق والدليل) أو W إذا أراد اختيار Width and
height (في حالة إدخال ارتفاع وعرض القطع)، والحالة الافتراضية هي
P. ولتعريف الإدخالات التي تفهمها الطريقة GetKeyword نستخدم قبلها
الطريقة InitializeUserInput كما في الشفرة.
إذا اختار المستخدم الحالة الأولى ننقله إلى الجزء GetInfo1 وإلا
نقلناه إلى GetInfo2، وذلك للحصول على المتحولات a,h,pnt المشروحة
سابقاً.
نمرر هذه المتحولات إلى الجزء DrawParabola لرسم القطع.
الخطوة الأخيرة هي تحويل مجمع الخطوط إلى منحني شرائحي، وفي الحقيقة
لم أعرف طريقة برمجية لتحويله، أو طريقة لرسم منحني شرائحي من الدرجة
الثانية، لذلك لجأت إلى استخدام سطر أوامر أوتوكاد!
قم بحفظ البرنامج ولننتقل الآن للتنفيذ.
|
| تشغيل البرنامج: |
انتقل لنافذة أوتوكاد واكتب الأمر التالي
: vbarun تظهر نافذة تحوي أسماء الماكروات الفعالة، اختر
Parabola ثم اضغط الزر Run. يظهر السطر التالي : |
| Enter an option [Point and line / Width
and height] : |
اكتب P لاختيار الحالة الأولى أو W للحالة
الثانية
في الحالة الأولى : يعرض أوتوكاد الرسالة Specify
point لاختيار نقطة تمثل المحرق. ثم Select line لاختيار مستقيم
أفقي يمثل الدليل. ثم Specify height لتحديد ارتفاع
القطع.
من أجل الحالة الثانية: يعرض أوتوكاد الرسالة Specify
width لتحديد عرض القطع بتحديد نقطتين باستخدام الفأرة، أو إدخال قيمة
في نافذة الأوامر. ثم Specify height لتحديد ارتفاع القطع. ثم
Specify peak for parabola لتحديد رأس القطع. يتم عندها رسم القطع
وكذلك تحديد محرقه.
|
| أمثلة على استخدام البرنامج: |
| مسألة أولى:
ليكن المستقيم D الأفقي والنقطة a والمستقيم E والمطلوب : رسم دائرة
تمس D وتمر من a ومركزها يقع على E
الحل:
إن المحل الهندسي لمراكز الدوائر التي تمر من a وتمس D هو قطع مكافئ
محرقه a ودليله D ونقطة تقاطعه مع E هي مركز الدائرة المطلوبة، وفي هذا
المثال حلان. |
 |
| مسألة ثانية:
ليكن لدينا مستقيم D أفق ومستقيم آخر E ودائرة C والمطلوب رسم دائرة
تمس D وتمس C ومركزها يقع على E
الحل:
إن المحل الهندسي لمراكز الدوائر التي تمس المستقيم D وتمس الدائرة
C هو قطع مكافئ محرقه مركز الدائرة C ودليله هو مستقيم موازٍ للمستقيم
D ويبعد عنه بمقدار نصف قطر الدائرة C من الجهة المعاكسة لجهة وجود
الدائرة بالنسبة للمستقيم D.
نرسم هذا القطع فتكون نقط تقاطعه مع المستقيم E هي مراكز الدوائر
المطلوبة. |
 |
| ملاحظات هامة عن البرنامج:
1- قصدت التبسيط في هذا البرنامج لسهولة فهمه، وقد أدى هذا إلى نقطة
الضعف التالية: يعمل البرنامج فقط إذا كان الدليل أفقياً والمحاور
المستخدمة هي المحاور العالمية، ويمكن تطويره بأن يقوم البرنامج بتحويل
الإحداثيات من المحاور العالمية إلى المحاور المستخدمة، وسأقوم بتطويره
إن شاء الله وسأضع النسخة الجديدة في هذا الموقع.
2- يمكنك تحميل البرنامج مجاناً، ولا يسمح بنشره في موقع آخر، بدون
إذن مني، ولتشغيله راجع فقرة (نجوم أوتوكاد وكذلك مسابقة أوتوكاد – رقم
15) في منتدى CAD في هذا الموقع لاستخدام البرنامج من خلال شريط
الأدوات.
لتنزيل نسخة من البرنامج
اضغط
هنا.
|
| |
| وآخر دعوانا أن الحمد لله رب
العالمين. |
|
|