الحاسبة الهندسية في أوتوكاد

أتناول في هذه المقالة موضوع الحاسبة الهندسية (Geometric Calculator) المتوفرة في أوتوكاد، مع استعراض لمجموعة من التعابير والدوال الحسابية، إضافة إلى إمكانية إدخال متغيرات أوتوليسب (AutoLISP) ضمن هذه التعابير. وقد اعتمدت بشكل واسع على ما ورد في ملف المساعدة الخاص بالبرنامج نفسه، مع بعض التصرف في المواطن التي استشعرت فيها ضرورة الإسهاب والتوضيح، داعماً هذا العمل ببعض الرسوم التوضيحية.
*

 
مفهوم الحاسبة الهندسية في أوتوكاد:
يتم الوصول إلى الحاسبة ضمن برنامج أوتوكاد بتنفيذ الأمر CAL، التي يقوم بعملية تقييم (Evaluation) للتعابير (Expressions)، سواءً كانت نقاط (متجه)، أعداداً حقيقية، أوأعداداً صحيحة. فعند كتابة cal في سطر الأوامر يظهر للمستخدم ما يلي:
Command: cal
>>Expression
كما يمكن الوصول إليها (بشكل شفاف) أثناء استخدام أي من أوامر أوتوكاد، بكتابة الفاصلة العلوية كما يلي:
Command: line
Specify first point: 'cal
والعبارة Expression تطلب من المستخدم إدخال التعبير الذي تكون صيغته حسب الغاية التي يحددها المستخدم.
وبشكل عام فإن هناك نوعان من التعابير:
  • التعابير الرقمية.
  • التعابير الاتجاهية.
التعابير الرقمية (Numeric Expression):
هي أعداد حقيقة و دوال تربطها عملية حسابية (operator). وهي كما يلي:
*
العملية
*
الشرح
()
*
إنشاء مجموعات
^
*
الرفع للقوة n
*,/
*
الجداء ، القسمة
+,-
*
الجمع ، الطرح
ومثالها:
1+2
(11+4)*(2^2)
التعابير الاتجاهية (Vector Expression):
هي مجموعة من المتجهات و النقاط و الأعداد و الدوال التي تجمعها عملية معينة. وهي كما يلي:
*
العملية
*
الشرح
()
*
إنشاء مجموعات
&
*
تحدد حاصل الضرب الاتجاهي للمتجهات (النتيجة متجه).
[a,b,c]&[x,y,z] = [(b*z)-(c*y),(c*x)-(a*z),(a*y)-(b*x)]
*
تحدد حاصل الضرب العددي للمتجهات (النتيجة عدد حقيقي).
[a,b,c]*[x,y,z] = ax + by + cz
/,*
*
ضرب وقسمة المتجه بعدد حقيقي.
a*[x,y,z] = [a*x,a*y,a*z]
+,-
*
تحدد حاصل الضرب الاتجاهي للمتجهات (النتيجة متجه).
[a,b,c]+[x,y,z] = [a+x,b+y,c+z]
ومثالها:*******
*End+[1,1,1]
هذا التعبير يؤدي إلى تحديد نقطة تقع على بعد ثلاث وحدات في الاتجاهات (x,y,z) نسبة إلى نقطة نهاية معينة.
وقبل التعرف أكثر على الدوال الموجودة ضمن الأمر CAL علينا أن نتطرق إلى مفهوم المتجه vector.
*
مفهوم المتجه (Vector):
يعرف المتجه بأنه: مجموعة تتكون من ثلاثة عناصر هي الإحداثي السيني (X)، والصادي (Y)، والعيني (Z). وهي مركبات المتجه في نفس الوقت, وهذه المجموعة -بهذه الحالة- لا تكفي لتحديد اتجاه ما إلا إذا كانت منسوبة إلى مرجع، وهذا المرجع هو نقطة الأصل (مبدأ الإحداثيات), ويمثل المتجه بخط ينتهي بسهم منطلقاً من نقطة الأصل.
لقد لاحظنا أن المتجه يشبه النقطة من حيث صيغة التعبير إلا أن الفرق بينهما يتلخص في أن النقطة تعرف موقعاً (location) في الفضاء و المتجه يعرف اتجاهاً (Direction).
وهنا لابد من التأكيد على أن الأمر CAL يدعم جميع صيغ الإحداثيات الموجودة في أوتوكاد وهي كما يلي:
  1. الإحداثيات القطبية (Polar Coordinates):
*
الصيغة العامة لها [distance
distance: المسافة.
angle: الزاوية (في المستوي XY).
  1. الإحداثيات الأسطوانية (Cylindrical Coordinates):
*
الصيغة العامة لها [distance
distance : المسافة في المستوي XY, (أي أن المسافة المعطاة هي المسقط العمودي للخط المستقيم على المستوي XY).
angle : الزاوية (في المستوي XY).
z : الإحداثي العيني للنقطة أو البعد الثالث لها، وقد تكون قيمته سالبة أو موجبة.
  1. الإحداثيات الكروية (Spherical Coordinates) :
*
الصيغة العامة لها [distance
distance : المسافة الحقيقية لا الإسقاطية .
angle1 : الزاوية في المستوي XY .
angle2 :الزاوية بين المستوي XY و أي نقطة في الفراغ.
  1. هناك أسلوب رابع يتم التعامل فيه مع نظام الإحداثيات العام (WCS) بدلاً من نظام إحداثيات المستخدم (UCS) و صيغته كالتالي:
[*x,y,z]
[*distance
[*distance>angle,z]
*
في ما سبق عرضنا مقدمة نظرية, ولا تنزعج أخي القارئ إن لم تفهمها, حيث سترجع إليها فيما بعد وتتضح لك أكثر بعد استعراض الجوانب العملية لهذا الأمر.
*
حساب المتجهات (Vectors Calculation):
يوفر لنا أوتوكاد إمكانية استخراج المتجهات من نقطتين من خلال الدالتين vec و vec1:
  1. الدالة vec:
*
vec(p1,p2) صيغتها
وتقوم بعمل ترجمة اتجاهية للنقطتين p1,p2, ولتوضيح الفكرة أكثر إليك أخي القارئ هذا المثال:
لنفترض أن (p1(10,10 و (p2(15,15. عند إخضاع هاتين النقطتين للدالة vec, ستعمل هذه الدالة على الآتي:
p2-p1=(15-10 , 15-10)
******** =(5,5)
فالمحصلة إذن هي المتجه (5,5) المنطلق من نقطة الأصل باتجاه النقطة (5,5).
Command: cal
>> Expression: vec([10,10],[15,15])
(5.0 5.0 0.0)
  1. الدالة vec1:
*
vec1(p1,p2) صيغتها
هذه الدالة تقوم بنفس وظيفة سابقتها، لكن مع فارق واحد. إذ إن مركبات المتجه التي تعيدها الدالة السابقة ذوات وحدات حقيقية، في حين أن مركبات المتجه التي تعيدها هذه الدالة تُؤســس على افتراض أن طول المتجــه هو وحدة واحدة (الناتج هو متجه وحدة unit vector). فعند تطبيق هذه الدالة على المثال السابق تكون النتيجة كما يلي:
Command:cal
>> Expression: vec1([10,10],[15,15])
(0.707107 0.707107 0.0)
أي تم افتراض أن طول المتجه هو 1, وبما أن زاوية ميلان المتجه في مثالنا هذا 45 درجة, بالتالي تكون المركبتان الأفقية و العمودية للمتجه متساويتين وتساوي (0.707107).
Command: move
Select objects
Specify base point or displacement: 'cal
>> Expression: 3*vec1(cen,cen)
Select entity for CEN snap: Specify a circle or an arc
Specify second point of displacement or : Specify a point or press ENTER
:abc(v) وصيغتها العامة abc كما يمكننا استخراج طول متجه عن طريق الدالة
Command: cal
>>Expression: abs([1,2,3])
3.74166*
استخراج المتجه العمودي:
يتم ذلك من خلال الدالة nor التي تقوم بحساب متجه الوحدة (unit vector) العمودي على خط أو مستوي. و تعتمد هذه الدالة أربع صيغ و هي كما يلي:
  1. nor:
*
تقوم باستخراج متجــه الوحدة العمــودي على كائنٍ ما (دائرة, قوس, متعدد الخطوط).
المتجـه الناتج يمثل المحور العيـني (Z-Coordinate) لنظام إحداثيات الكائن (OCS). وفي المثال أدناه نرى كيفية تغيير مسقط الرسم اعتماداً على المحور العمودي على كائنٍ ما (متعدد الخطوط أو دائرة مثلاً):
Command: vpoint
Current view direction: VIEWDIR=current
Specify a view point or [Rotate] : 'cal
>> Expression: nor
>> Select circle, arc or polyline for NOR function
  1. :nor(v)
*
تعيد هذه الدالة متجه الوحدة العمودي ثنائي البعد على متجه آخر.
وفي هذه الدالة يتم التعامل مع مسقط المتجه على المستوي XY ضمن نظام الإحداثيات الحالي (System Coordinate). وتجب ملاحظة أن اتجاه المتجه الناتج إلى اليسار من المتجه الأصلي.
Command: cal
>>Expression: nor([1,1,0])
(-0.707107 0.707107 0.0)
  1. :nor(p1,p2)
*
تعيد هذه الدالة متجه وحدة عمودي ثنائي البعد على الخط الممتد بين p1 و p2.
كما في الدالة السابقة يتم التعامل مع مسقط المتجه على المستوي XY ضمن نظام الإحداثيات الحالي. وتجب ملاحظة أن اتجاه المتجه الناتج إلى اليسار من الخط p1p2:
Command: cal
>> Expression: nor([1,1,1],[2,2,2])
(-0.707107 0.707107 0.0)*
وهنا يجب مراعاة تسلسل النقاط لان ذلك يغير النتيجة:
Command: cal
>> Expression: nor([2,2,2],[1,1,1])
(0.707107 -0.707107 0.0)*
الشكل رقم (1): الدالة (nor(p1,p2
*
  1. :nor(p1,p2,p3)
*
ترجع هذه الدالة متجه الوحدة (ثلاثي الأبعاد) العمودي على المستوي المعرف بالنقاط p1,p2,p3.
*علماً أن المتجه الناتج يعتمد اتجاهه على ترتيب إدخال النقاط الثلاثة إلى الدالة متبعين في ذلك قاعدة اليد اليمنى في تحديد اتجاه العمود على المستوي.
فلو افترضنا النقاط u,v,w نقاطاً تقع ضمن المستوي XY. الآن ندخل هذه النقاط إلى الدالة بتعاقبين مختلفين, ينتج ما يلي:
Command: cal
>>Expression: nor(u,v,w)
(0.0 0.0 1.0)*
Command: cal
>>Expression: nor(u,w,v)
(0.0 0.0 -1.0)
نلاحظ أن اتجاه المتجه الأول نحو الاتجاه الموجب من Z-axis، أما في المثال الثاني يكون متجهاً نحو الاتجاه السالب من Z-axis.
*
الشكل رقم (2): الدالة (nor(p1,p2,p3
*
استخراج قيمة نصف القطر لكائن:
يمكننا من خلال الدالة rad استخراج قيمة نصف القطر لكائن ما، سواءً كان دائرة أو قوساً، أو قوساً هو جزء من متعدد خطوط ثنائي الأبعاد:
Command : circle
Specify center point for circle or [3p/2p/Ttr(tan tan radius)]: انتق مركز الدائرة
Specify radius of circle or [Diameter]: 'cal
>>Expression : 2*rad
>>Select circle, arc or polyline segment for RAD function : انتق الدائرة*
الشكل رقم (3): الدالة rad
*
استخراج الزوايا:
ويتم ذلك من خلال استخدام الدالة ang التي تتبنى الصيغ التالية:
  1. (ang(v: تقوم هذه الصيغة بحساب الزاوية المحصورة بين محور السينات X-axis و المتجه (v) الذي يتم التعامل مع مسقطه على المستوي XY في النظام الحالي لإحداثيات المستخدم UCS.
Command : cal
>>Expression: ang([0.707,0.707,0])
45.0*
Command : cal
>>Expression: ang([1,2,3])
63.4349
حيث [0.707,0.707,0] و [1,2,3] هما متجهان.
*
  1. (ang(p1,p2: تقوم هذه الصيغة بحساب الزاوية المحصورة بين الخط المتجه من p1 إلى p2، ومحور السينات X- axis ويتم التعامل كذلك مع مسقط الخط على المستوي XY في النظام الحالي لإحداثيات المستخدم UCS.
Command: cal
>> Expression: ang([0,0,0],[1,1,1])
45.0*
Command: cal
>>Expression: ang(end,end)
>> Select entity for END snap:
>> Select entity for END snap:*
الشكل رقم (4): الدالة (ang(p1,p2
*
  1. (ang(apex,p1,p2: تقوم هذه الصيغة بحساب الزاوية المحصورة بين الخطين apex-p1 و apex-p2 ويتم التعامل كذلك على المستوي XY في النظام الحالي لإحداثيات المستخدم UCS.
Command: cal
>>Expression:ang([0,0,0],[1,1,1],[1,2,1])
18.4349*
الشكل رقم (5): الدالة (ang(apex,p1,p2
*
  1. (ang(apex,p1,p2,p: تقوم هذه الصيغة بحساب الزاوية المحصورة بين الخطين apex-p1 و apex-p2 , أما p فيقوم بتحديد اتجاه الزاوية.
Command: cal
>>Expression:ang([0,0,0],end,end,[0,0,1])*
الشكل رقم (6)- أ: الدالة (ang(apex,p1,p2,p
*
الشكل رقم (6)- ب: الدالة (ang(apex,p1,p2,p
إيجاد نقطة محددة من مستقيم:
وذلك عن طريق إحدى الدالتين التاليتين:
  1. pld: تقوم هذه الدالة بتعيين نقطة تقع على خط يمر بالنقطتين p1 و p2 وعلى بعد مسافة dist من p1. وعليه فهذه الدالة تعيد قائمة list تمثل الإحداثيات الثلاثة و صيغتها: (pld(p1,p2,dist
Command: cal
>>Expression: pld(end,mid,5)
  1. plt: تقوم هذه الدالة بتعيين نقطة على خط يمر بالنقطتين p1 و p2 ولكن هذه المرة فإن البعد يحدد عن طريق المعامل t الذي يمثل المسافة النسبية عن p1, و صيغتها: (plt(p1,p2,t
Command: cal
>>Expression: plt([0,0,0],[1,1,1],0.5)
0.5 0.5 0.5
حيث تتراوح قيمة المعامل t من صفر إلى 1.
التحويل بين الصيغ المختلفة لوحدات القياس:
يتم ذلك من خلال الدالة cvunit وصيغتها: (cvunit(value, from_unit, to_unit. حيث:*
Value: إما قيمة أو تعبير إحداثي 2d أو 3d لنقطة.
from_unit: الوحدة التي سيتم التحول منها.
to_unit: الوحدة التي سيتم التحول إليها.
Command: cal
>>Expression:cvunit(1,minute,second) لتحويل وحدات الزاوية من الدقيقة إلى الثانية
60.0
Command: cal
>>Expression:cvunit(1,inch,cm) للتحويل من الإنش إلى السنتيمتر
2.54
Command: cal
>>Expression: cvunit([1,1,1] ,inch,cm)
(2.45 2.54 2.54)
Command: cal
>>Expression: cvunit(1,acre,sqyard) للتحويل من الأكر الى اليارد المربع
4840.0
Command: cal
>> Expression: cvunit(1,year,day)
365.0
Command: cal
>> Expression: cvunit(1,meter,angstrom)
1.0e+010
Command: cal
>> Expression: cvunit(100,kelvin,celsius)
-173.15
Command: cal
>> Expression: cvunit(1,mile,meter)
1609.34
Command: cal
>>Expression: cvunit(1,gallon,liter)
3,78541
تدوير نقطة حول محورٍ ما:
و ذلك عن طريق الدالة rot التي تعمل على تدوير نقطة حول محور ولها الصيغتان التاليتان:
  1. الصيغة الأولى تعمل على تدوير النقطة حول المحور Z وهي كما يلي (rot(p,origin,angle. حيث:
*
p النقطة المراد تدويرها.
origin نقطة ارتكاز التدوير.
angle زاوية التدوير.
Command: _circle Specify center point for circle or [3P/2P/Ttr (tan tan radius)]: 'cal
>> Expression: rot(end,[0,0,0],ang(end,end))
>> Select entity for END snap:
>> Select entity for END snap:
>> Select entity for END snap:
(8.88178e-016 14.1421 0.0)
Specify radius of circle or [Diameter]:
يقوم المثال السابق برسم دائرة, مركزها اقتبس من نهاية خط مستقيم, وتم تدويرها حول نقطة الأصل بزاوية معينة اُستخرجت قيمتها باستخدام الدالة ang.
  1. الصيغة الثانية تعمل على تدوير النقطة حول محور يُعرّف داخل الدالة، كما يلي:
(rot(p,Axp1,Axp2,ang. حيث:*
p النقطة المراد تدويرها.
Axp1 النقطة الأولى على محور التدوير.
Axp2 النقطة الثانية على محور التدوير.
angle زاوية التدوير.
مع ملاحظة أن اتجاه محور الدوران من Axp1 إلى Axp2 (تطبق قاعدة اليد اليمنى).
*
الشكل رقم (7): الدالة (rot(p,apx1,apx2,ang
استخراج نقطة من خلال المؤشر (Cursor):
يتم ذلك من خلال الدالة cur التي تعيد نقطة نسبة إلى نظام إحداثيات المستخدم (UCS) الذي يجري استخدامه. وهي بالصيغة التالية:
Command: cal
>>Expression: cur
تحويل التعبير الإحداثي لنقطة بين نظام الإحداثيات العام (WCS) و نظام إحداثيات المستخدم (UCS):
بداية نذكر بأنه هناك نوعان من أنظمة الإحداثيات المستعملة في الأوتوكاد:
الأول:
نظام الإحداثيات العام (WCS) وهو النظام الافتراضي الذي يفترض نقطة أصل ومحاور XYZ على لوحة الرسم والتي على أساسها ونسبة إليها تُعرف إحداثيات كائنات أوتوكاد.
الثاني:
نظام إحداثيات المستخدم (UCS) الذي يحدد فيه المستخدم نقطة أصل أخرى ومحاور جديدة, و عليه إذا كان لدينا نقطة p إحداثياتها (10,10,0) في نظام الإحداثيات العام فانه عند تغيير نقطة الأصل إلى الإحداثيات (10,10,0) ستكون إحداثيات النقطة p نسبة إلى نظام الإحداثيات الجديد (0,0,0).
*
ويوفر الأمر cal إمكانية تحويل التعبير الإحداثي لنقطة، ما بين UCS و WCS، اعتماداً على إحدى الدالتين التاليتين:
  1. الدالة w2u التي تحول التعبير الإحداثي للنقطة p من WCS إلى UCS الحالي. وبالاعتماد على المثال المذكور أعلاه:
Command: cal
>>Expression: w2u([0,0,0])
-10.0 –10.0 0.0
أي أن النقطة التي إحداثياتها (0,0,0) في نظام الإحداثيات العام (WCS) تكون إحداثياتها X= -10 ,Y= -10 , Z=0 *في نظام إحداثيات المستخدم (UCS).
*
  1. الدالة u2w التي تحول التعبير الإحداثي للنقطة p من UCS الحالي إلى WCS. أيضاً لنفس المثال:
Command: cal
>> Expression: u2w([0,0,0])
(10.0 10.0 0.0)
أي أن النقطة التي إحداثياتها (0,0,0) في نظام إحداثيات المستخدم (UCS) تكون إحداثياتها X= 10 ,Y= 10 , Z=0 *في نظام الإحداثيات العام (WCS).
*
الشكل رقم (: الدالة w2u و الدالة u2w
*
تحويل الصيغ المختلفة للزوايا إلى صيغة الدرجات العشرية:
هنالك صيغ متعددة للتعبير عن الزوايا:
أ - القطرية Radian.
ب - gradian (تقسم فيه الدائرة إلى 400 جزء).
ج - درجة دقيقة ثانية degree minute second. ويتم التحويل بينها كما يلي:
Command : cal
>>Expression:400g
360
Command : cal
>>Expression :45d10’30”
45.175
Command : cal
>>Expression :3r
171,887
استخراج نقطة التقاطع (Intersection):
بإمكاننا استخراج نقطة التقاطع بين خطين مستقيمين أومستقيم ومستوي عن طريق الدالتين التاليتين:
  1. (ill(p1,p2,p3,p4 : تقوم هذه الدالة باستخراج نقطة تقاطع مستقيمين. حيث:
*
*p1,p2 نقطتان من المستقيم الأول.
p3,p4 نقطتان من المستقيم الثاني.
  1. (ilp(p1,p2,p3,p4,p5 : تقوم هذه الدالة باستخراج نقطة تقاطع بين خط مستقيم ومستوي معرف بثلاث نقاط. حيث:
*
p1,p2 نقطتان من المستقيم.
p3,p4,p5 ثلاث نقاط تعرف المستوي.
حساب المسافة (Distance):
يمكن ذلك من خلال أربعة دوال يوفرها البرنامج ويتم الوصول إليها من خلال الأمر CAL، وهي كما يلي:
  1. (dist(p1,p2: وتقوم بحساب المسافة بين النقطتين p1 و p2, كما يلي:
Command: cal
>> Expression: dist([0,0,0],[10,10,0])
14.1421
Command: cal
>> Expression: dist(end,plt([0,0,0],[1,1,0],.3))
>> Select entity for END snap:
  1. (dpl(p,p1,p2: تقوم بحساب أقصر مسافة بين النقطة p والخط المار بين النقطتين p1 و p2 :
Command: cal
>> Expression: dpl([10,4],[0,10],[5,5])
2.82843
في هذا المثال نرى أنه ليس من الضروري أن تتقاطع المسافة العمودية بين p و المستقيم p1p2, حيث تم احتساب المسافة العمودية بينp و امتداد المستقيم p1p2.
*
الشكل رقم (9): الدالة dpl
*
  1. (dpp(p,p1,p2,p3: تقوم بحساب المسافة بين النقطة بين p والمستوي المعرف بالنقاط p1,p2,p3, وكما في الشكل ليس من الضروري أن تتقاطع المسافة العمودية بين p و المستوي p1,p2,p3, بل يتم احتساب المسافة العمودية بين p وامتداد المستوي p1,p2,p3 .
*
الشكل رقم (10): الدالة dpp
إسناد القيم إلى متغيرات (Variable):
وهي واحدة من الإمكانيات الجيدة التي يوفرها برنامج أوتوكاد، والتي تمكننا من حفظ قيم نحتاج إليها أثناء عملنا بصورة متكررة وخاصة تلك التي تكون معقدة, وذلك بإسنادها إلى متغيرات (Variables)، كما في الأمثلة التالية:
Command: cal
>> Expression: a=cen (إسناد قائمة الإحداثيات إلى متغير)
>> Select entity for CEN snap: (انتق دائرة أو قوس)
(10.0 10.0 0.0) a تم إسناد هذه القيمة إلى
Command: line
Specify first point: 'cal
>> Expression: a*.5
(5.0 5.0 0.0)
Specify next point or [Undo]: 'cal
>> Expression: [@3,3,0]
(8.0 8.0 0.0)
وقبل الختام لابد من ذكر أن الأمر CAL يدعم الدوال الرياضية التالية:
*
رمز الدالة
*
الدالة
sin(angle)
*
جيب الزاوية
cos(angle)
*
جيب تمام الزاوية
tang(angle)
*
ظل الزاوية
asin(angle)
*
الجيب العكسي
acos(angle)
*
جيب التمام العكسي
atan(angle)
*
الظل العكسي
ln(real)
*
اللغاريتم الطبيعي
log(real)
*
اللغاريتم العشري
sqrt(real)
*
الجذر التربيعي
sqr(real)
*
مربع عدد حقيقي
abs(real)
*
القيمة المطلقة
round(real)
*
تقريب العدد الحقيقي لأقرب عدد صحيح
exp(real)
*
إرجاع e مرفوعاً إلى الأس n
exp10(real)
*
إرجاع العدد 10 مرفوعاً إلى الأس n
trunc(real)
*
إرجاع الجزء الصحيح من العدد بإزالة الجزء العشري
r2d(angle)
*
تحويل الزاوية التقديري القطري إلى الستيني
d2r(angle)
*
تحويل الزاوية من التقدير الستيني إلى القطري
pi
*
إرجاع قيمة الثابت الدائري (3.14)
*
حيث :
real: عدد حقيقي
angle: زاوية مقاسة بالدرجات العشرية (هذا بالنسبة لجميع الدوال خلا الدالتين r2d وd2r )
Command: cal
>> Expression: exp10(2)+ang([0,0],[1,1])
145.0
Command: cal
>> Expression: sin(30)
0.5
Command: cal
>> Expression: cos(ang([0,0],[1,1]))
0.707107

الحاسبة الهندسية في أوتوكاد

Posted by مرسلة بواسطة Mano On 6:14 ص

أتناول في هذه المقالة موضوع الحاسبة الهندسية (Geometric Calculator) المتوفرة في أوتوكاد، مع استعراض لمجموعة من التعابير والدوال الحسابية، إضافة إلى إمكانية إدخال متغيرات أوتوليسب (AutoLISP) ضمن هذه التعابير. وقد اعتمدت بشكل واسع على ما ورد في ملف المساعدة الخاص بالبرنامج نفسه، مع بعض التصرف في المواطن التي استشعرت فيها ضرورة الإسهاب والتوضيح، داعماً هذا العمل ببعض الرسوم التوضيحية.
*

 
مفهوم الحاسبة الهندسية في أوتوكاد:
يتم الوصول إلى الحاسبة ضمن برنامج أوتوكاد بتنفيذ الأمر CAL، التي يقوم بعملية تقييم (Evaluation) للتعابير (Expressions)، سواءً كانت نقاط (متجه)، أعداداً حقيقية، أوأعداداً صحيحة. فعند كتابة cal في سطر الأوامر يظهر للمستخدم ما يلي:
Command: cal
>>Expression
كما يمكن الوصول إليها (بشكل شفاف) أثناء استخدام أي من أوامر أوتوكاد، بكتابة الفاصلة العلوية كما يلي:
Command: line
Specify first point: 'cal
والعبارة Expression تطلب من المستخدم إدخال التعبير الذي تكون صيغته حسب الغاية التي يحددها المستخدم.
وبشكل عام فإن هناك نوعان من التعابير:
  • التعابير الرقمية.
  • التعابير الاتجاهية.
التعابير الرقمية (Numeric Expression):
هي أعداد حقيقة و دوال تربطها عملية حسابية (operator). وهي كما يلي:
*
العملية
*
الشرح
()
*
إنشاء مجموعات
^
*
الرفع للقوة n
*,/
*
الجداء ، القسمة
+,-
*
الجمع ، الطرح
ومثالها:
1+2
(11+4)*(2^2)
التعابير الاتجاهية (Vector Expression):
هي مجموعة من المتجهات و النقاط و الأعداد و الدوال التي تجمعها عملية معينة. وهي كما يلي:
*
العملية
*
الشرح
()
*
إنشاء مجموعات
&
*
تحدد حاصل الضرب الاتجاهي للمتجهات (النتيجة متجه).
[a,b,c]&[x,y,z] = [(b*z)-(c*y),(c*x)-(a*z),(a*y)-(b*x)]
*
تحدد حاصل الضرب العددي للمتجهات (النتيجة عدد حقيقي).
[a,b,c]*[x,y,z] = ax + by + cz
/,*
*
ضرب وقسمة المتجه بعدد حقيقي.
a*[x,y,z] = [a*x,a*y,a*z]
+,-
*
تحدد حاصل الضرب الاتجاهي للمتجهات (النتيجة متجه).
[a,b,c]+[x,y,z] = [a+x,b+y,c+z]
ومثالها:*******
*End+[1,1,1]
هذا التعبير يؤدي إلى تحديد نقطة تقع على بعد ثلاث وحدات في الاتجاهات (x,y,z) نسبة إلى نقطة نهاية معينة.
وقبل التعرف أكثر على الدوال الموجودة ضمن الأمر CAL علينا أن نتطرق إلى مفهوم المتجه vector.
*
مفهوم المتجه (Vector):
يعرف المتجه بأنه: مجموعة تتكون من ثلاثة عناصر هي الإحداثي السيني (X)، والصادي (Y)، والعيني (Z). وهي مركبات المتجه في نفس الوقت, وهذه المجموعة -بهذه الحالة- لا تكفي لتحديد اتجاه ما إلا إذا كانت منسوبة إلى مرجع، وهذا المرجع هو نقطة الأصل (مبدأ الإحداثيات), ويمثل المتجه بخط ينتهي بسهم منطلقاً من نقطة الأصل.
لقد لاحظنا أن المتجه يشبه النقطة من حيث صيغة التعبير إلا أن الفرق بينهما يتلخص في أن النقطة تعرف موقعاً (location) في الفضاء و المتجه يعرف اتجاهاً (Direction).
وهنا لابد من التأكيد على أن الأمر CAL يدعم جميع صيغ الإحداثيات الموجودة في أوتوكاد وهي كما يلي:
  1. الإحداثيات القطبية (Polar Coordinates):
*
الصيغة العامة لها [distance
distance: المسافة.
angle: الزاوية (في المستوي XY).
  1. الإحداثيات الأسطوانية (Cylindrical Coordinates):
*
الصيغة العامة لها [distance
distance : المسافة في المستوي XY, (أي أن المسافة المعطاة هي المسقط العمودي للخط المستقيم على المستوي XY).
angle : الزاوية (في المستوي XY).
z : الإحداثي العيني للنقطة أو البعد الثالث لها، وقد تكون قيمته سالبة أو موجبة.
  1. الإحداثيات الكروية (Spherical Coordinates) :
*
الصيغة العامة لها [distance
distance : المسافة الحقيقية لا الإسقاطية .
angle1 : الزاوية في المستوي XY .
angle2 :الزاوية بين المستوي XY و أي نقطة في الفراغ.
  1. هناك أسلوب رابع يتم التعامل فيه مع نظام الإحداثيات العام (WCS) بدلاً من نظام إحداثيات المستخدم (UCS) و صيغته كالتالي:
[*x,y,z]
[*distance
[*distance>angle,z]
*
في ما سبق عرضنا مقدمة نظرية, ولا تنزعج أخي القارئ إن لم تفهمها, حيث سترجع إليها فيما بعد وتتضح لك أكثر بعد استعراض الجوانب العملية لهذا الأمر.
*
حساب المتجهات (Vectors Calculation):
يوفر لنا أوتوكاد إمكانية استخراج المتجهات من نقطتين من خلال الدالتين vec و vec1:
  1. الدالة vec:
*
vec(p1,p2) صيغتها
وتقوم بعمل ترجمة اتجاهية للنقطتين p1,p2, ولتوضيح الفكرة أكثر إليك أخي القارئ هذا المثال:
لنفترض أن (p1(10,10 و (p2(15,15. عند إخضاع هاتين النقطتين للدالة vec, ستعمل هذه الدالة على الآتي:
p2-p1=(15-10 , 15-10)
******** =(5,5)
فالمحصلة إذن هي المتجه (5,5) المنطلق من نقطة الأصل باتجاه النقطة (5,5).
Command: cal
>> Expression: vec([10,10],[15,15])
(5.0 5.0 0.0)
  1. الدالة vec1:
*
vec1(p1,p2) صيغتها
هذه الدالة تقوم بنفس وظيفة سابقتها، لكن مع فارق واحد. إذ إن مركبات المتجه التي تعيدها الدالة السابقة ذوات وحدات حقيقية، في حين أن مركبات المتجه التي تعيدها هذه الدالة تُؤســس على افتراض أن طول المتجــه هو وحدة واحدة (الناتج هو متجه وحدة unit vector). فعند تطبيق هذه الدالة على المثال السابق تكون النتيجة كما يلي:
Command:cal
>> Expression: vec1([10,10],[15,15])
(0.707107 0.707107 0.0)
أي تم افتراض أن طول المتجه هو 1, وبما أن زاوية ميلان المتجه في مثالنا هذا 45 درجة, بالتالي تكون المركبتان الأفقية و العمودية للمتجه متساويتين وتساوي (0.707107).
Command: move
Select objects
Specify base point or displacement: 'cal
>> Expression: 3*vec1(cen,cen)
Select entity for CEN snap: Specify a circle or an arc
Specify second point of displacement or : Specify a point or press ENTER
:abc(v) وصيغتها العامة abc كما يمكننا استخراج طول متجه عن طريق الدالة
Command: cal
>>Expression: abs([1,2,3])
3.74166*
استخراج المتجه العمودي:
يتم ذلك من خلال الدالة nor التي تقوم بحساب متجه الوحدة (unit vector) العمودي على خط أو مستوي. و تعتمد هذه الدالة أربع صيغ و هي كما يلي:
  1. nor:
*
تقوم باستخراج متجــه الوحدة العمــودي على كائنٍ ما (دائرة, قوس, متعدد الخطوط).
المتجـه الناتج يمثل المحور العيـني (Z-Coordinate) لنظام إحداثيات الكائن (OCS). وفي المثال أدناه نرى كيفية تغيير مسقط الرسم اعتماداً على المحور العمودي على كائنٍ ما (متعدد الخطوط أو دائرة مثلاً):
Command: vpoint
Current view direction: VIEWDIR=current
Specify a view point or [Rotate] : 'cal
>> Expression: nor
>> Select circle, arc or polyline for NOR function
  1. :nor(v)
*
تعيد هذه الدالة متجه الوحدة العمودي ثنائي البعد على متجه آخر.
وفي هذه الدالة يتم التعامل مع مسقط المتجه على المستوي XY ضمن نظام الإحداثيات الحالي (System Coordinate). وتجب ملاحظة أن اتجاه المتجه الناتج إلى اليسار من المتجه الأصلي.
Command: cal
>>Expression: nor([1,1,0])
(-0.707107 0.707107 0.0)
  1. :nor(p1,p2)
*
تعيد هذه الدالة متجه وحدة عمودي ثنائي البعد على الخط الممتد بين p1 و p2.
كما في الدالة السابقة يتم التعامل مع مسقط المتجه على المستوي XY ضمن نظام الإحداثيات الحالي. وتجب ملاحظة أن اتجاه المتجه الناتج إلى اليسار من الخط p1p2:
Command: cal
>> Expression: nor([1,1,1],[2,2,2])
(-0.707107 0.707107 0.0)*
وهنا يجب مراعاة تسلسل النقاط لان ذلك يغير النتيجة:
Command: cal
>> Expression: nor([2,2,2],[1,1,1])
(0.707107 -0.707107 0.0)*
الشكل رقم (1): الدالة (nor(p1,p2
*
  1. :nor(p1,p2,p3)
*
ترجع هذه الدالة متجه الوحدة (ثلاثي الأبعاد) العمودي على المستوي المعرف بالنقاط p1,p2,p3.
*علماً أن المتجه الناتج يعتمد اتجاهه على ترتيب إدخال النقاط الثلاثة إلى الدالة متبعين في ذلك قاعدة اليد اليمنى في تحديد اتجاه العمود على المستوي.
فلو افترضنا النقاط u,v,w نقاطاً تقع ضمن المستوي XY. الآن ندخل هذه النقاط إلى الدالة بتعاقبين مختلفين, ينتج ما يلي:
Command: cal
>>Expression: nor(u,v,w)
(0.0 0.0 1.0)*
Command: cal
>>Expression: nor(u,w,v)
(0.0 0.0 -1.0)
نلاحظ أن اتجاه المتجه الأول نحو الاتجاه الموجب من Z-axis، أما في المثال الثاني يكون متجهاً نحو الاتجاه السالب من Z-axis.
*
الشكل رقم (2): الدالة (nor(p1,p2,p3
*
استخراج قيمة نصف القطر لكائن:
يمكننا من خلال الدالة rad استخراج قيمة نصف القطر لكائن ما، سواءً كان دائرة أو قوساً، أو قوساً هو جزء من متعدد خطوط ثنائي الأبعاد:
Command : circle
Specify center point for circle or [3p/2p/Ttr(tan tan radius)]: انتق مركز الدائرة
Specify radius of circle or [Diameter]: 'cal
>>Expression : 2*rad
>>Select circle, arc or polyline segment for RAD function : انتق الدائرة*
الشكل رقم (3): الدالة rad
*
استخراج الزوايا:
ويتم ذلك من خلال استخدام الدالة ang التي تتبنى الصيغ التالية:
  1. (ang(v: تقوم هذه الصيغة بحساب الزاوية المحصورة بين محور السينات X-axis و المتجه (v) الذي يتم التعامل مع مسقطه على المستوي XY في النظام الحالي لإحداثيات المستخدم UCS.
Command : cal
>>Expression: ang([0.707,0.707,0])
45.0*
Command : cal
>>Expression: ang([1,2,3])
63.4349
حيث [0.707,0.707,0] و [1,2,3] هما متجهان.
*
  1. (ang(p1,p2: تقوم هذه الصيغة بحساب الزاوية المحصورة بين الخط المتجه من p1 إلى p2، ومحور السينات X- axis ويتم التعامل كذلك مع مسقط الخط على المستوي XY في النظام الحالي لإحداثيات المستخدم UCS.
Command: cal
>> Expression: ang([0,0,0],[1,1,1])
45.0*
Command: cal
>>Expression: ang(end,end)
>> Select entity for END snap:
>> Select entity for END snap:*
الشكل رقم (4): الدالة (ang(p1,p2
*
  1. (ang(apex,p1,p2: تقوم هذه الصيغة بحساب الزاوية المحصورة بين الخطين apex-p1 و apex-p2 ويتم التعامل كذلك على المستوي XY في النظام الحالي لإحداثيات المستخدم UCS.
Command: cal
>>Expression:ang([0,0,0],[1,1,1],[1,2,1])
18.4349*
الشكل رقم (5): الدالة (ang(apex,p1,p2
*
  1. (ang(apex,p1,p2,p: تقوم هذه الصيغة بحساب الزاوية المحصورة بين الخطين apex-p1 و apex-p2 , أما p فيقوم بتحديد اتجاه الزاوية.
Command: cal
>>Expression:ang([0,0,0],end,end,[0,0,1])*
الشكل رقم (6)- أ: الدالة (ang(apex,p1,p2,p
*
الشكل رقم (6)- ب: الدالة (ang(apex,p1,p2,p
إيجاد نقطة محددة من مستقيم:
وذلك عن طريق إحدى الدالتين التاليتين:
  1. pld: تقوم هذه الدالة بتعيين نقطة تقع على خط يمر بالنقطتين p1 و p2 وعلى بعد مسافة dist من p1. وعليه فهذه الدالة تعيد قائمة list تمثل الإحداثيات الثلاثة و صيغتها: (pld(p1,p2,dist
Command: cal
>>Expression: pld(end,mid,5)
  1. plt: تقوم هذه الدالة بتعيين نقطة على خط يمر بالنقطتين p1 و p2 ولكن هذه المرة فإن البعد يحدد عن طريق المعامل t الذي يمثل المسافة النسبية عن p1, و صيغتها: (plt(p1,p2,t
Command: cal
>>Expression: plt([0,0,0],[1,1,1],0.5)
0.5 0.5 0.5
حيث تتراوح قيمة المعامل t من صفر إلى 1.
التحويل بين الصيغ المختلفة لوحدات القياس:
يتم ذلك من خلال الدالة cvunit وصيغتها: (cvunit(value, from_unit, to_unit. حيث:*
Value: إما قيمة أو تعبير إحداثي 2d أو 3d لنقطة.
from_unit: الوحدة التي سيتم التحول منها.
to_unit: الوحدة التي سيتم التحول إليها.
Command: cal
>>Expression:cvunit(1,minute,second) لتحويل وحدات الزاوية من الدقيقة إلى الثانية
60.0
Command: cal
>>Expression:cvunit(1,inch,cm) للتحويل من الإنش إلى السنتيمتر
2.54
Command: cal
>>Expression: cvunit([1,1,1] ,inch,cm)
(2.45 2.54 2.54)
Command: cal
>>Expression: cvunit(1,acre,sqyard) للتحويل من الأكر الى اليارد المربع
4840.0
Command: cal
>> Expression: cvunit(1,year,day)
365.0
Command: cal
>> Expression: cvunit(1,meter,angstrom)
1.0e+010
Command: cal
>> Expression: cvunit(100,kelvin,celsius)
-173.15
Command: cal
>> Expression: cvunit(1,mile,meter)
1609.34
Command: cal
>>Expression: cvunit(1,gallon,liter)
3,78541
تدوير نقطة حول محورٍ ما:
و ذلك عن طريق الدالة rot التي تعمل على تدوير نقطة حول محور ولها الصيغتان التاليتان:
  1. الصيغة الأولى تعمل على تدوير النقطة حول المحور Z وهي كما يلي (rot(p,origin,angle. حيث:
*
p النقطة المراد تدويرها.
origin نقطة ارتكاز التدوير.
angle زاوية التدوير.
Command: _circle Specify center point for circle or [3P/2P/Ttr (tan tan radius)]: 'cal
>> Expression: rot(end,[0,0,0],ang(end,end))
>> Select entity for END snap:
>> Select entity for END snap:
>> Select entity for END snap:
(8.88178e-016 14.1421 0.0)
Specify radius of circle or [Diameter]:
يقوم المثال السابق برسم دائرة, مركزها اقتبس من نهاية خط مستقيم, وتم تدويرها حول نقطة الأصل بزاوية معينة اُستخرجت قيمتها باستخدام الدالة ang.
  1. الصيغة الثانية تعمل على تدوير النقطة حول محور يُعرّف داخل الدالة، كما يلي:
(rot(p,Axp1,Axp2,ang. حيث:*
p النقطة المراد تدويرها.
Axp1 النقطة الأولى على محور التدوير.
Axp2 النقطة الثانية على محور التدوير.
angle زاوية التدوير.
مع ملاحظة أن اتجاه محور الدوران من Axp1 إلى Axp2 (تطبق قاعدة اليد اليمنى).
*
الشكل رقم (7): الدالة (rot(p,apx1,apx2,ang
استخراج نقطة من خلال المؤشر (Cursor):
يتم ذلك من خلال الدالة cur التي تعيد نقطة نسبة إلى نظام إحداثيات المستخدم (UCS) الذي يجري استخدامه. وهي بالصيغة التالية:
Command: cal
>>Expression: cur
تحويل التعبير الإحداثي لنقطة بين نظام الإحداثيات العام (WCS) و نظام إحداثيات المستخدم (UCS):
بداية نذكر بأنه هناك نوعان من أنظمة الإحداثيات المستعملة في الأوتوكاد:
الأول:
نظام الإحداثيات العام (WCS) وهو النظام الافتراضي الذي يفترض نقطة أصل ومحاور XYZ على لوحة الرسم والتي على أساسها ونسبة إليها تُعرف إحداثيات كائنات أوتوكاد.
الثاني:
نظام إحداثيات المستخدم (UCS) الذي يحدد فيه المستخدم نقطة أصل أخرى ومحاور جديدة, و عليه إذا كان لدينا نقطة p إحداثياتها (10,10,0) في نظام الإحداثيات العام فانه عند تغيير نقطة الأصل إلى الإحداثيات (10,10,0) ستكون إحداثيات النقطة p نسبة إلى نظام الإحداثيات الجديد (0,0,0).
*
ويوفر الأمر cal إمكانية تحويل التعبير الإحداثي لنقطة، ما بين UCS و WCS، اعتماداً على إحدى الدالتين التاليتين:
  1. الدالة w2u التي تحول التعبير الإحداثي للنقطة p من WCS إلى UCS الحالي. وبالاعتماد على المثال المذكور أعلاه:
Command: cal
>>Expression: w2u([0,0,0])
-10.0 –10.0 0.0
أي أن النقطة التي إحداثياتها (0,0,0) في نظام الإحداثيات العام (WCS) تكون إحداثياتها X= -10 ,Y= -10 , Z=0 *في نظام إحداثيات المستخدم (UCS).
*
  1. الدالة u2w التي تحول التعبير الإحداثي للنقطة p من UCS الحالي إلى WCS. أيضاً لنفس المثال:
Command: cal
>> Expression: u2w([0,0,0])
(10.0 10.0 0.0)
أي أن النقطة التي إحداثياتها (0,0,0) في نظام إحداثيات المستخدم (UCS) تكون إحداثياتها X= 10 ,Y= 10 , Z=0 *في نظام الإحداثيات العام (WCS).
*
الشكل رقم (: الدالة w2u و الدالة u2w
*
تحويل الصيغ المختلفة للزوايا إلى صيغة الدرجات العشرية:
هنالك صيغ متعددة للتعبير عن الزوايا:
أ - القطرية Radian.
ب - gradian (تقسم فيه الدائرة إلى 400 جزء).
ج - درجة دقيقة ثانية degree minute second. ويتم التحويل بينها كما يلي:
Command : cal
>>Expression:400g
360
Command : cal
>>Expression :45d10’30”
45.175
Command : cal
>>Expression :3r
171,887
استخراج نقطة التقاطع (Intersection):
بإمكاننا استخراج نقطة التقاطع بين خطين مستقيمين أومستقيم ومستوي عن طريق الدالتين التاليتين:
  1. (ill(p1,p2,p3,p4 : تقوم هذه الدالة باستخراج نقطة تقاطع مستقيمين. حيث:
*
*p1,p2 نقطتان من المستقيم الأول.
p3,p4 نقطتان من المستقيم الثاني.
  1. (ilp(p1,p2,p3,p4,p5 : تقوم هذه الدالة باستخراج نقطة تقاطع بين خط مستقيم ومستوي معرف بثلاث نقاط. حيث:
*
p1,p2 نقطتان من المستقيم.
p3,p4,p5 ثلاث نقاط تعرف المستوي.
حساب المسافة (Distance):
يمكن ذلك من خلال أربعة دوال يوفرها البرنامج ويتم الوصول إليها من خلال الأمر CAL، وهي كما يلي:
  1. (dist(p1,p2: وتقوم بحساب المسافة بين النقطتين p1 و p2, كما يلي:
Command: cal
>> Expression: dist([0,0,0],[10,10,0])
14.1421
Command: cal
>> Expression: dist(end,plt([0,0,0],[1,1,0],.3))
>> Select entity for END snap:
  1. (dpl(p,p1,p2: تقوم بحساب أقصر مسافة بين النقطة p والخط المار بين النقطتين p1 و p2 :
Command: cal
>> Expression: dpl([10,4],[0,10],[5,5])
2.82843
في هذا المثال نرى أنه ليس من الضروري أن تتقاطع المسافة العمودية بين p و المستقيم p1p2, حيث تم احتساب المسافة العمودية بينp و امتداد المستقيم p1p2.
*
الشكل رقم (9): الدالة dpl
*
  1. (dpp(p,p1,p2,p3: تقوم بحساب المسافة بين النقطة بين p والمستوي المعرف بالنقاط p1,p2,p3, وكما في الشكل ليس من الضروري أن تتقاطع المسافة العمودية بين p و المستوي p1,p2,p3, بل يتم احتساب المسافة العمودية بين p وامتداد المستوي p1,p2,p3 .
*
الشكل رقم (10): الدالة dpp
إسناد القيم إلى متغيرات (Variable):
وهي واحدة من الإمكانيات الجيدة التي يوفرها برنامج أوتوكاد، والتي تمكننا من حفظ قيم نحتاج إليها أثناء عملنا بصورة متكررة وخاصة تلك التي تكون معقدة, وذلك بإسنادها إلى متغيرات (Variables)، كما في الأمثلة التالية:
Command: cal
>> Expression: a=cen (إسناد قائمة الإحداثيات إلى متغير)
>> Select entity for CEN snap: (انتق دائرة أو قوس)
(10.0 10.0 0.0) a تم إسناد هذه القيمة إلى
Command: line
Specify first point: 'cal
>> Expression: a*.5
(5.0 5.0 0.0)
Specify next point or [Undo]: 'cal
>> Expression: [@3,3,0]
(8.0 8.0 0.0)
وقبل الختام لابد من ذكر أن الأمر CAL يدعم الدوال الرياضية التالية:
*
رمز الدالة
*
الدالة
sin(angle)
*
جيب الزاوية
cos(angle)
*
جيب تمام الزاوية
tang(angle)
*
ظل الزاوية
asin(angle)
*
الجيب العكسي
acos(angle)
*
جيب التمام العكسي
atan(angle)
*
الظل العكسي
ln(real)
*
اللغاريتم الطبيعي
log(real)
*
اللغاريتم العشري
sqrt(real)
*
الجذر التربيعي
sqr(real)
*
مربع عدد حقيقي
abs(real)
*
القيمة المطلقة
round(real)
*
تقريب العدد الحقيقي لأقرب عدد صحيح
exp(real)
*
إرجاع e مرفوعاً إلى الأس n
exp10(real)
*
إرجاع العدد 10 مرفوعاً إلى الأس n
trunc(real)
*
إرجاع الجزء الصحيح من العدد بإزالة الجزء العشري
r2d(angle)
*
تحويل الزاوية التقديري القطري إلى الستيني
d2r(angle)
*
تحويل الزاوية من التقدير الستيني إلى القطري
pi
*
إرجاع قيمة الثابت الدائري (3.14)
*
حيث :
real: عدد حقيقي
angle: زاوية مقاسة بالدرجات العشرية (هذا بالنسبة لجميع الدوال خلا الدالتين r2d وd2r )
Command: cal
>> Expression: exp10(2)+ang([0,0],[1,1])
145.0
Command: cal
>> Expression: sin(30)
0.5
Command: cal
>> Expression: cos(ang([0,0],[1,1]))
0.707107

|