# تعلم التحكم ببرنامج أتوكاد من خلال فجوال بيزك واصنع برنامجك الخاص خطوة بخطوة



## Hossam-am (27 فبراير 2010)

السلام عليكم ورحمة الله تعالى وبركاته 
تعلم التحكم ببرنامج أتوكاد من خلال فجوال بيزك
أرسم في أتوكاد ما تشاء...وخذ منه ما تشاء ...وصدر البيانات التي تريدها ...وأرسل له التعليمات الني تريدها..
اصنع برنامجك ...الذي يحسب لك الأطوال ..المساحات...الحجوم...
إصنع برنامجك...الذي يولد لك ما شئت من العناصر الرسومية...من الخطوط والأقواس ومجمعات الخطوط والشرائح ...والكتل والسمات والتهشير والنصوص ...والأبعاد...وكل ما ترغب
إصنع برنامجك ...الذي يرسم عنك المقاطع الطولية والعرضية لمجسم أو طريق...والذي يهشر بالنيابة عنك المقاطع ويضع بياناتها وإحداثياتها ويخرج لك الجداول...
إصنع برنامجك الذي يرسم لك تفريد حديد التسليح ... ويولد المقاطع العرضية والطولية ويضع الأبعاد والنصوص ويجهز لك اللوحة للطباعة بشكل كامل ...
إصنع برنامجك الذي يحسب لك مساحات الحفر والردم وحجومها ..والذي يساعدك في حساب الكميات وحصرها ...ويخرج لك دفاتر المساحة !!!!
مهندس المساحة ... إصنع برنامج يخرج لك المقاسم والعقارات ويحسب التجاوزات ويضع أحجار التخوم ...واسهم الملكية يخرج الاضبارة الحسابية كاملة ويخرج اللوحات النهائية مع أرصاد المسح الفني ...
كل ذلك بمتابعتك لي بهذه الدروس التي سأتناول فيها شرحا مفصلا للتعامل مع برنامج أتوكاد من خلال لغة فجوال بيزك ... مع الأمثلة العملية والتطبيقات التي قد تفيد أي مهندس لا على التعيين..
هدفي من هذا هو نشر حصيلة ما جمعته حول هذا الموضوع منذ أكثر من عشر سنوات مع العلم أن المواضيع التي تتناول هذا الموضوع وبالأخص العربية منها قليلة جدا 
وهدفي الأهم نشر هو إفادتكم بإذن الله ولا أطلب إلا دعوة من دعواتكم الكريمة
وبحول الله نبدأ......
م.حسام​


----------



## مصعب الممصعب (27 فبراير 2010)

شئ جميل خاصه ان البعض يفضلها علي ال لسبات


----------



## Hossam-am (27 فبراير 2010)

*الدرس الأول*

الدرس الأول​· افتح مشروع فجوال بيزك جديد يحوي إطاراً واحداً  Form1 وموديول واحد Module1 وخزنه في أي مكان تختاره وسمه VBcad .
· حيث سنعتمد في دروسنا القادمة على تطوير هذا المثال خطوة بخطوة ليكون شاملاً بإذن الله .
· الآن قم بعمل زر  Command1 وأضفه للفورم وقم بتغيير خاصية caption ليصبح (Open New Drawing) . وقم بعمل زر Command2 وأضفه للفورم وقم بتغيير خاصية caption ليصبح (Close New Drawing ) وقم بعمل زر Command3 وأضفه للفورم وقم بتغيير خاصية caption ليصبح (Exit) .
· يجب الآن تحميل مكتبة كائن الأوتوكاد ضمن المشروع ونقوم بعمل ذلك من قائمة Project نختار References ، ثم نبحث في مربع الحوار الذي يظهر لدينا عن مكتبة الأتوكاد ذات الإصدار المرتبط بالنسخة المحملة على جهازك (2000-2004-2007-2009....) ونفعل هذا الخيار Autocad 2009 Type Library ثم موافق .
· نفتح صفحة الموديول  Module1 ونكتب السطر التالي :


```
Public Acadapp As AcadApplication
```
​حيث Acadapp متحول تم تعريفه ليمثل تطبيق أو كائن الأتوكاد ...أي أن هذا المتحول وكأنه برنامج الأتوكاد نفسه سنتعامل مع الأتوكاد من خلاله (وإن كان التعبير غير دقيق).
· الآن في حدث النقر  Click على زر (Open New Drawing) نكتب السطر التالي :



```
Private Sub Command1_Click()
        Set Acadapp = CreateObject("AutoCAD.Application.17")
        Acadapp.Documents.Add
        Acadapp.Visible = True
        Acadapp.WindowState = acMax        
End Sub
```
​الشرح :
- نقوم أولا بفتح تطبيق أو كائن أتوكاد (Object) من خلال وظيفة CreateObject وإسناد هذا الكائن إلى المتحول Acadapp من خلال وظيفة Set . وهنا أصبح المتحول Acadapp يمثل التطبيق المفتوح وسنتعامل مع التطبيق أو الكائن من خلاله . وهنا نلاحظ الجملة "AutoCAD.Application.17" وهي لنسخ الكاد بعد 2004 أما قبل 2004 نكتب "AutoCAD.Application.16"
- من خلال هذا المتحول (الذي سنتعامل معه وكأنه تطبيق الأتوكاد ) نقوم بفتح ملف جديد من خلال السطر 


```
Acadapp.Documents.Add
```
​- نقوم بعد ذلك بجعل تطبيق الأتوكاد ظاهراً على الشاشة من خلال 


```
Acadapp.Visible = True
```
​- يمكن التحكم بنافذة برنامج الأتوكاد من خلال :


```
Acadapp.WindowState = acMax
```
​الآن إحفظ العمل وشغل البرنامج واضغط زر (Open New Drawing) ولاحظ النتيجة .
ولكن : 
ماذا لو كان برنامج الأتوكاد مفتوحاً عند تشغيل البرنامج ؟
عندها سيقوم بتشغيل برنامج الأتوكاد مرة ثانية ... هنا نستطيع اختبار كون أتوكاد مفتوحأ أم لا كما يلي :
سنعدل الكود السابق بشكل كامل ليصبح على الشكل :



```
Private Sub Command1_Click()
    On Error Resume Next
        Set Acadapp = GetObject(, "AutoCAD.Application.17")
        Acadapp.Documents.Add
        Acadapp.Visible = True
        Acadapp.WindowState = acMax
    If Err.Number <> 0 Then
        Set Acadapp = CreateObject("AutoCAD.Application.17")
        Acadapp.Documents.Add
        Acadapp.Visible = True
        Acadapp.WindowState = acMax
        Err.Clear
    End If
End Sub
```
​ 
شرح :
نقوم أولاً باختبار كون أتوكاد مفتوحاً أو لا من خلال وظيفة GetObject وإسناد التطبيق المفتوح إلى المتحول Acadapp من خلال وظيفة set . لو كان أتوكاد غير مفتوحأ سنحصل على خطأ Error .
نختبر قيمة الخطأ فإذا كانت مختلفة عن الصفر معنى ذلك وقوع خطأ وهو كون التطبيق مغلق عندها نستخدم وظيفة CreateObject لفتح التطبيق واسناده للمتحول acadapp من خلال set  
الآن إحفظ العمل وشغل البرنامج واضغط زر (Open New Drawing) ولاحظ النتيجة .
ملاحظة: لاحظ أنه في كل استعمال لتعليمة Acadapp.Documents.Add نكون قد فتحنا ملف جديد ..أي أنه يمكن فتح عدة ملفات باستخدام هذه التعليمة إلا أن الملف الأخير يكون هو الفعال ActiveDocument وعند إرسال أي أمر إلى البرنامج سيتم التعامل مع هذا الملف .

كيف نغلق ملف أتوكاد وننهي البرنامج ؟
قم بكتابة الكود التالي في حدث النقر على زر Close New Drawing على الشكل :


```
Private Sub Command2_Click()
    Acadapp.ActiveDocument.Close (False)
    Acadapp.Quit
    Set Acadapp = Nothing
End Sub
```
​الشرح :
- السطر الأول إغلاق الملف الحالي(الفعال) باستخدام Close ولاحظ كتابة كلمة False وهي تعني أغلق الملف بدون حفظ التغييرات (فمثلا لو قمت بإجراء تعديلات على الملف الرسومي وقمت بمحاولة الإغلاق بدون كلمة false ستعترضك رسالة للسؤال هل تريد الحفظ أم لا ). 
- نقوم بعد ذلك بإنهاء البرنامج بتعليمة Quit .
- نفرغ المتحول Acadapp من ارتباطه بكائن الأتوكاد من خلال إسناد Nothing إليه من خلال وظيفة Set .
لكن ماذا لو أردنا إغلاق الملف الحالي وحفظ التغييرات ؟
بما أنه قد قمنا بفتح ملف جديد فارغ فإذا أردنا حفظه عند إغلاقه يجب استخدام SaveAs وسنشرح ذلك كما يلي :
- قم بعمل زر Command4 وأضفه للفورم وقم بتغيير خاصية caption ليصبح (SaveAs) .
- في حدث النقر على الزر Command4 نكتب :


```
Private Sub Command4_Click()
    Dim Path0 As String
    Path0 = "D:/VBcad.dwg"
    Acadapp.ActiveDocument.SaveAs Path0, ac2007_dwg
End Sub
```
​لقد قمنا بعمل نسخة عن الملف الحالي باستخدام الأمر SaveAs حيث يمثل Path0 إسم ومسار الملف كاملاً و ac2007_dwg يدل على حفظ الملف بصيغة 2007 كملف رسومي (يمكن مثلا حفظه 2004 ويمكن حفظه بتنسيق dxf ) .

ماذا لو أردنا فتح ملف رسومي موجود ؟
- قم بعمل زر Command5 وأضفه للفورم وقم بتغيير خاصية caption ليصبح (OpenExsistDrwing) .
- في حدث النقر على الزر Command5 نكتب :


```
Private Sub Command5_Click()
    On Error Resume Next
        Set Acadapp = GetObject(, "AutoCAD.Application.17")
        Path0 = "D:/VBcad.dwg"
        Acadapp.Documents.Open Path0
        Acadapp.Visible = True
       Acadapp.WindowState = acMax
    If Err.Number <> 0 Then
        Set Acadapp = CreateObject("AutoCAD.Application.17")
        Path0 = "D:/VBcad.dwg"
        Acadapp.Documents.Open Path0
        Acadapp.Visible = True
        Acadapp.WindowState = acMax
        Err.Clear
    End If
End Sub
```
​لاحظ أننا نقوم بفتح الملف المخزن سابقا من خلال تعليمة Open حيث نكتب بعها مسار الملف كاملا Path0 .

ماذا لو أردنا حفظ التغييرات في هذا الملف ؟
- قم بعمل زر Command6 وأضفه للفورم وقم بتغيير خاصية caption ليصبح (Save Changes) .
- في حدث النقر على الزر Command6 نكتب :


```
Private Sub Command6_Click()
    Acadapp.ActiveDocument.Save
End Sub
```
​لاحظ استخدام تعليمة Save لحفظ التغييرات على ملف مخزن سابقاً .

بعد هذا نستطيع الآن تجربة ما قمنا بعملة بالترتيب التالي :
1- فتح ملف جديد من خلال النقر على زر Open New Drawing .
2- عمل نسخة عن الملف (حفظ لأول مرة ) بتحديد اسم الملف ومساره كاملاً (تستطيع إظهار رسالة للمستخدم ليسأله فيها عن تحديد المسار واسم الملف ولكن هذا ليس المهم هنا فهدفنا البساطة في الشرح وليس التعقيد ) بالضغط على زر Save As .
3- إغلاق الملف الحالي بالضغط على زر Close New Drawing .
4- فتح الملف الذي قمنا بتخزينه سابقاً بالضغط على زر Open Exists Drawing .
5- حفظ التغييرات عليه بالضغط على زر Save Changes .
6- إغلاق الملف الحالي وإنهاء برنامج أتوكاد بالضغط على زر Close New Drawing .
يتبع...
م.حسام


----------



## أبو محمد الرملي (27 فبراير 2010)

جزاك الله خيرا.
مشاركة متميزة جدا، سأتابعها معك أولا بأول إن شاء الله تعالى.
كثـّر الله من أمثالك.


----------



## مهندس وائل العتيبي (27 فبراير 2010)

شكرا


----------



## kazali016 (27 فبراير 2010)

جزاك الله خيرا


----------



## Hossam-am (27 فبراير 2010)

*الدرس الثاني ... التعامل مع الطبقات*

الدرس الثاني ​بسم الله الرحمن الرحيم​سنتحدث في هذه الحلقة عن التعامل مع الطبقات .... كيفية إنشاء طبقة جديدة وكيفية جعل طبقة هي الطبقة الحالية وكيفية حذف طبقة وكيفية تغيير خصائص الطبقات ...ألخ
وبحول الله نبدأ :
إنشاء طبقة جديدة في الملف الرسومي :
- نفتح صفحة التعريفات العامة للبرنامج Module1 ونكتب ما يلي :


```
Public LayerObj As AcadLayer
```
حيث تم تعريف عنصر اسمه LayerObj  على أنه طبقة في أتوكاد .
- قم بعمل زر Command7 وأضفه للفورم وقم بتغيير خاصية caption ليصبح (AddNewLayer) .
- في حدث النقر على الزر Command7 نكتب :


```
Private Sub Command7_Click()
    Set LayerObj = Acadapp.ActiveDocument.Layers.Add("جدران خارجية ")
    LayerObj.Color = acRed
    LayerObj.Lineweight = 0.5
    Acadapp.ActiveDocument.ActiveLayer = LayerObj
End Sub
```
نقوم بإضافة طبقة جديدة إلى الملف الرسومي ونسميها كما نشاء مثلا (جدران خارجية) ونسندها إلى الكائن LayerObj من خلال وظيفة Set بحيث يصبح هذا الكائن يمثل الطبقة ويعبر عنها ويمكن التحكم بخصائص الطبقة وتعديلها وحذفها من خلاله .
لتغيير لون الطبقة إلى أحمر مثلاً نغير خاصية Color للعنصر LayerObj إلى acRed ولتغيير سماكة الخطوط التي سترسم على الطبقة نغير خاصية Lineweight للعنصر LayerObj إلى 0.5  مثلاً .
وأخيراً عند إضافة عدة طبقات لابد من جعل إحدى الطبقات هي الحالية وذلك من خلال خاصية ActiveLayer للملف الرسومي الحالي ActiveDocument ونجعلها تساوي العنصر LayerObj .
تستطيع تجريب ما قمنا به بفتح ملف رسومي جديد من خلال الضغط على زر Open New Drawing ثم الضغط على زر AddNewLayer ولاحظ النتيجة .
ملاحظة : 
يمكن حذف الطبقة في أي وقت باستخدام الخاصية LayerObj.Delete في أي مرحلة من البرنامج (بشرط ألا تكون هي الطبقة الحالية وإلا سنحصل على رسالة خطأ).
دمتم بخير
م.حسام​


----------



## Hossam-am (27 فبراير 2010)

*الدرس الثالث...رسم الخطوط*

الدرس الثالث​بسم الله الرحمن الرحيم​سنتحدث في هذه الحلقة عن الكائنات الرسومية في أتوكاد (رسم الخطوط – الدوائر – الأقواس – مجمعات الخطوط – المضلعات – الشرائح – القطع الناقص – التهشير...)
ملاحظة : سيبقى هذا الدرس مفتوح لحين الانتهاء من كافة العناصر السابقة ...أما العناصر ذات الخصوصية مثل المناطق و الكتل والسمات والنصوص والأبعاد فسنتحدث عنها في دروس قادمة إنشاء الله ..
وبحول الله نبدأ :​رسم الخطوط​
كما نعلم فإن أي خط يتحدد بنقطة بدايته ونقطة نهايته .. أي لرسم خط نحتاج لنقطتين ...وكل نقطة تتعين بثلاثة بارامترات وهي X , Y , Z  .
لننتقل إلى التطبيق :
- نفتح صفحة التعريفات العامة للبرنامج Module1 ونكتب ما يلي :


```
Public startPoint(2) As Double
Public endPoint(2) As Double
Public acLine As AcadLine
```
 

حيث تم تعريف متحول اسمه مثلاً startPoint على أنه نقطة بداية الخط .
وتم تعريف متحول اسمه مثلاً endPoint على أنه نقطة نهاية الخط .
و تم تعريف عنصر اسمه acLine  على أنه خط في أتوكاد .
- قم بعمل زر Command8 وأضفه للفورم وقم بتغيير خاصية caption ليصبح (DrawLine) .
- في حدث النقر على الزر Command8 نكتب :


```
Private Sub Command8_Click()
    startPoint(0) = 10 'X
    startPoint(1) = 10 'Y
    startPoint(2) = 0 'Z
    endPoint(0) = 30 'X
    endPoint(1) = 30 'Y
    endPoint(2) = 0 'Z
Set acLine = Acadapp.ActiveDocument.ModelSpace.AddLine(startPoint, endPoint)
    Acadapp.ZoomExtents
End Sub
```
تستطيع تجريب ما قمنا به بفتح ملف رسومي جديد من خلال الضغط على زر Open New Drawing ثم الضغط على زر DrawLine ولاحظ النتيجة .
ملاحظات : 
للعنصر الرسومي السابق مجموعة من الخصائص يمكن التحكم بها أو معرفتها من خلال الكود على الشكل التالي :
1- زاوية الخط Angle وهي الزاوية التي يميل بها الخط عن الافق مقاسة بدءاً من محور X الأفقي وباتجاه عكس عقارب الساعة (ومقدرة بالراديان ) . للحصول على زاوية الخط السابق يمكن إضافة السطور التالية :


```
Dim LineAngle As Double
LineAngle = acLine.Angle
```
2 - الخاصية Delta وهي تعطي فرق الإحداثيات بين نقطتي البداية والنهاية . لمعرفتها نضيف السطور التالية :


```
Dim LineDelta As Variant
    Dim dx, dy, dz As Double
    LineDelta = acLine.Delta
    dx = LineDelta(0)
    dy = LineDelta(1)
    dz = LineDelta(2)
```
 
الخاصيتان السابقتان Angle و Delta هما للقراءة فقط .. أي يمكن معرفة زاوية من خلال الخاصية angle ولكن لا يمكن إسناد قيمة لهذه الخاصية .
3- الخاصية EndPoint تعيد إحداثيات نقطة نهاية الخط . لمعرفتها نكتب السطور التالية :


```
Dim lineEndPnt As Variant
    Dim x, y, z As Double
    lineEndPnt = acLine.endPoint
    x = lineEndPnt(0)
    y = lineEndPnt(1)
    z = lineEndPnt(2)
```
ويمكن تغيير نقطة النهاية للخط بإسناد قيمة لهذه الخاصية على الشكل :


```
lineEndPnt(0) = 40
    lineEndPnt(1) = 50
    lineEndPnt(2) = 0
    acLine.endPoint = lineEndPnt
```
 
4- الخاصية StartPoint تعيد إحداثيات نقطة بداية الخط . لمعرفتها نكتب السطور التالية :


```
Dim lineStartPnt As Variant
    Dim x1, y1, z1 As Double
    lineStartPnt = acLine.startPoint
    x1 = lineStartPnt(0)
    y1 = lineStartPnt(1)
    z1 = lineStartPnt(2)
```
ويمكن تغيير نقطة البداية للخط بإسناد قيمة لهذه الخاصية على الشكل :


```
lineStartPnt(0) = 5
    lineStartPnt(1) = 15
    lineStartPnt(2) = 0
    acLine.startPoint = lineStartPnt
```
 
5- الخاصية Layer تعيد اسم الطبقة التي رسم عليها الخط . لمعرفتها نكتب السطور التالية :


```
Dim LineLayer As String
    LineLayer = acLine.Layer
```
ويمكن تغيير طبقة الخط بإسناد قيمة لهذه الخاصية .
6- الخاصية Length تعيد طول الخط . لمعرفة طول الخط السابق نكتب :


```
Dim LineLength As Double
    LineLength = acLine.Length
```
وهذه الخاصية للقراءة فقط لا يمكن إسناد قيمة لها .
هناك المزيد من الخصائص مثل Linetype نمط الخط و LinetypeScale مقياس رسم الخط المتقطع وهي للقراءة فقط . والخاصية Lineweight لمعرفة سماكة الخط أثناء الطباعة وهي للقراءة والكتابة .
7- الخاصية Thickness تعيد المسافة التي يمتد (ينبثق) فيها الخط بالاتجاه المعامد لمستويه ، وهذه الخاصية للقراءة والكتابة .

ملاحظة : الطرق Methods المتبعة للتحكم بالعنصر مثل أوامر التعديل Copy و Move....ألخ فسيتم شرحها في درس مستقل نظراً لكونها مشتركة بين معظم العناصر الرسومية .

أعتذر عن إسراعي في الدروس ...فقد قمت بطرح مجموعة من هذه الدروس في منتدى سابق وأريد أن أصل إلى نفس المرحلة لأكمل هنا إن شاء الله
ولكن لا بد من إعطاء الأخوة بعض الوقت للتمعن والتطبيق....لذلك أترككم الآن مع استعدادي لتقبل جميع ملاحظات الأخوة مع الشكر...
في رعاية الله
م.حسام​


----------



## life for rent (27 فبراير 2010)

جزاك الله كل خير وبارك فيك


----------



## العبد لله (28 فبراير 2010)

مجهود كبير جدا الله يبارك فيك

ياريت يا بش مهندس ترفعلنا ملفات الفيجوال بيزك جاهزه

فضلا لا امراً

خالص الشكر


----------



## Hossam-am (28 فبراير 2010)

أخي مع التقدم بالدروس إن شاء الله سأرفق المثال كاملا
لكن لكي تستفيد يجب أن تجرب تطبيق الخطوات بنفسك أخي 
حتى كتابة الكود
دمت بخير
م.حسام


----------



## كناعنة (28 فبراير 2010)

بارك الله فيك موضوع متميز جدا ارجو لك التوفيق فيه والاستمرار ونحن نتابع معك
والله معك يوفقك باذنه


----------



## سردار عزالدين علي (28 فبراير 2010)

موضوع جميل ومفيد ولكن اذا كان الدروس بصيغة PDF او power point مع الشكر وبارك الله فيك


----------



## essam-elkady (28 فبراير 2010)

thanks


----------



## Hossam-am (28 فبراير 2010)

شكرا إخواني على الردود
سأرفق الملف بصيغة pdf قريبا إنشاء الله...فهي غير جاهزة بعد ..وتكتمل مع تقدم الدروس
ولكن ... أتجنب ذلك بقصد المناقشة والمشاركة وطرح الامثلة والاسفسارات هنا في المنتدى ...فبرأيي النقاش حول المادة العلمية مهم بقدر المادة العلمية نفسها...
دمتم بخير
م.حسام


----------



## Hossam-am (28 فبراير 2010)

*تابع الدرس الثالث...رسم الدائرة*

رسم دائرة​
كما نعلم فإن أي دائرة تتحدد بنقطة المركز Center ونصف القطر radius ... أي لرسم الدائرة نحتاج لمعرفة مركزها والذي يتحدد بثلاثة بارامترات x,y,z ونصف قطرها .
لننتقل إلى التطبيق :
- نفتح صفحة التعريفات العامة للبرنامج Module1 ونكتب ما يلي :


```
Public circleObj As AcadCircle
Public center(2) As Double
Public radius As Double
```
حيث تم تعريف متحول اسمه مثلاً center على أنه نقطة مركز الدائرة .
وتم تعريف متحول اسمه مثلاً radius  على أنه نصف قطر الدائرة .
و تم تعريف عنصر اسمه circleObj  على أنه دائرة في أتوكاد .
- قم بعمل زر Command9 وأضفه للفورم وقم بتغيير خاصية caption ليصبح (DrawCircle) .
- في حدث النقر على الزر Command9 نكتب :


```
Private Sub Command9_Click()
    center(0) = 2
    center(1) = 2
    center(2) = 0
    radius = 0.5
    Set circleObj = Acadapp.ActiveDocument.ModelSpace.AddCircle(center, radius)
    Acadapp.ZoomExtents
End Sub
```
تستطيع تجريب ما قمنا به بفتح ملف رسومي جديد من خلال الضغط على زر Open New Drawing ثم الضغط على زر DrawCircle ولاحظ النتيجة .
ملاحظات : 
للعنصر الرسومي السابق مجموعة من الخصائص يمكن التحكم بها أو معرفتها من خلال الكود على الشكل التالي :
1- الخاصية Area  وهي تعيد مساحة سطح الدائرة . للحصول عليها نكتب :


```
Dim circleArea As Double
circleArea = circleObj.Area
```
ونستطيع تغيير مساحة سطح الدائرة بإسناد قيمة لهذه الخاصية على الشكل :


```
circleArea = 2
circleObj.Area = circleArea
```
2- الخاصية Center  وهي تعيد إحداثيات مركز الدائرة . للحصول عليها نكتب :


```
Dim circleCenter As Variant
Dim x, y, z As Double
circleCenter = circleObj.center
x = circleCenter(0)
y = circleCenter(1)
z = circleCenter(2)
```
ونستطيع تغيير إحداثيات مركز الدائرة بإسناد قيمة لهذه الخاصية على الشكل :


```
circleCenter(0) = 4
circleCenter(1) = 5
circleCenter(2) = 0
circleObj.center = circleCenter
```
3- الخاصية Circumference  وهي تعيد طول محيط الدائرة . للحصول عليها نكتب :


```
Dim circleCircumference As Double
circleCircumference = circleObj.Circumference
```
 
ونستطيع تغيير طول محيط الدائرة بإسناد قيمة لهذه الخاصية على الشكل :


```
circleCircumference = 10
circleObj.Area = circleCircumference
```
 
4- الخاصية Radius  وهي تعيد قيمة نصف قطر الدائرة . والخاصية Diameter وهي تعيد قطر الدائرة للحصول عليهما نكتب :


```
Dim circleradius As Double
Dim circleDiameter As Double
circleradius = circleObj.radius
circleDiameter = circleObj.Diameter
```
وهاتان الخاصيتان للقراءة والكتابة يمكن تغييرها بإسناد قيمة لهما كما في الخصائص السابقة .

ويمتلك هذا العنصر الرسومي بالإضافة للخصائص السابقة مجموعة من الخصائص الأخرى مثل Layer وهي تعيد إسم الطبقة التي رسمت عليها الدائرة وهي للقراءة والكتابة أي يمكن تغييرها بإسناد قيمة لها (كما سبق شرحه في رسم الخط) . 
وهناك المزيد من الخصائص مثل Linetype نمط الخط الذي رسمت به الدائرة و LinetypeScale مقياس رسم الخط المتقطع وهي للقراءة فقط . والخاصية Lineweight لمعرفة سماكة الخط الذي رسمت به الدائرة أثناء الطباعة وهي للقراءة والكتابة . وأيضاً الخاصية Thickness وهي للقراءة والكتابة .​​​


----------



## Hossam-am (28 فبراير 2010)

*تابع الدرس الثالث...رسم الأقواس*

رسم الأقواس​لكي نرسم أي قوس من دائرة يلزمنا معرفة المركز Center والذي يتحدد بثلاثة بارامترات x,y,z ونصف القطر radius بالإضافة إلى زاوية البدايةللقوس StartAngle وزاوية النهاية للقوس EndAngle .
- زاوية البداية StartAngle هي الزاوية التي تحدد نقطة بداية القوس _StartPoint _وتقاس اعتباراً من المحور الأفقي X وباتجاه عكس عقارب الساعة ومقدرة بالراديان .
- زاوية النهاية EndAngle هي الزاوية التي تحدد نقطة نهاية القوس _EndPoint _وتقاس اعتباراً من المحور الأفقي X وباتجاه عكس عقارب الساعة ومقدرة بالراديان .
لننتقل إلى التطبيق :
- نفتح صفحة التعريفات العامة للبرنامج Module1 ونكتب ما يلي :


```
Public arcObj As AcadArc
```
حيث تم تعريف الكائن arcObj على أنه قوس في أتوكاد .
- قم بعمل زر Command10 وأضفه للفورم وقم بتغيير خاصية caption ليصبح (DrawArc) .
- في حدث النقر على الزر Command10 نكتب :


```
Private Sub Command10_Click()
    Dim centerArc(0 To 2) As Double
    Dim radiusArc As Double
    Dim startAngleInDegree As Double
    Dim endAngleInDegree As Double
    Dim startAngleInRadian As Double
    Dim endAngleInRadian As Double
    Dim PI As Double
    PI = 4 * Atn(1) '3.1415926535897932
    centerArc(0) = 10
    centerArc(1) = 20
    centerArc(2) = 0
    radiusArc = 30
    startAngleInDegree = 30
    endAngleInDegree = 110
    startAngleInRadian = startAngleInDegree * PI / 180
    endAngleInRadian = endAngleInDegree * PI / 180
    Set arcObj = Acadapp.ActiveDocument.ModelSpace.AddArc(centerArc, radiusArc, startAngleInRadian, endAngleInRadian)
    Acadapp.ZoomExtents
End Sub
```
الشرح :
- تم تعريف متحول centerArc يمثل إحداثيات مركز القوس وتم إعطاء قيم x,y,z له .
- تم تعريف متحول radiusArc يمثل نصف قطر دائرة القوس وتم إعطاء قيمة له .
- تم تعريف متحول startAngleInDegree يمثل زاوية بداية القوس مقدرة بالدرجات وتم إعطاء قيمة له ولتكن 30 درجة .
- تم تعريف متحول endAngleInDegree يمثل زاوية نهاية القوس مقدرة بالدرجات وتم إعطاء قيمة له ولتكن 110 درجة .
- تم تعريف متحول PI يمثل النسبة الثابتة π المعتمدة وقيمته تساوي 3.141592653589793 ويمكن حسابها مباشرة من خلال العلاقة الثابتة
 PI = 4 * Atn(1) .
- تم تعريف متحول startAngleInRadian  يمثل زاوية بداية القوس مقدرة بالراديان وتم حساب قيمته بالتحويل من الدرجات إلى راديان :


```
startAngleInRadian = startAngleInDegree * PI / 180
```
- تم تعريف متحول endAngleInRadian  يمثل زاوية بداية القوس مقدرة بالراديان وتم حساب قيمته بالتحويل من الدرجات إلى راديان :


```
endAngleInRadian = endAngleInDegree * PI / 180
```
- تم بعد ذلك إسناد هذه القيم إلى العنصر arcObj من خلال وظيفة Set .
تستطيع تجريب ما قمنا به بفتح ملف رسومي جديد من خلال الضغط على زر Open New Drawing ثم الضغط على زر DrawArc ولاحظ النتيجة . 

خصائص القوس :
للعنصر الرسومي السابق مجموعة من الخصائص يمكن التحكم بها أو معرفتها من خلال الكود على الشكل التالي :
1- الخاصية .ArcLength وهي تعيد طول القوس . للحصول عليها نكتب :

```
Dim Length As Double
Length = arcObj.ArcLength
```
وهذه الخاصية للقراءة فقط أي يمكن معرفة طول القوس لكن لا يمكن تغييره بإسناد قيمة لهذه الخاصية .
2 - الخاصيةArea  وهي تعيد مساحة السطح المحصور بين القوس والمستقيم الواصل بين نقطة بداية القوس ونقطة نهايته . للحصول عليها نكتب :


```
Dim ArcArea As Double
ArcArea = arcObj.Area
```
 
وهذه الخاصية للقراءة فقط أي يمكن معرفة المساحة لكن لا يمكن تغييرها بإسناد قيمة لهذه الخاصية .
3- الخاصية Center  وهي تعيد إحداثيات مركز دائرة القوس . للحصول عليها نكتب :


```
Dim ArcCenter As Variant
Dim x, y, z As Double
ArcCenter = arcObj.center
x = ArcCenter(0)
y = ArcCenter(1)
z = ArcCenter(2)
```
ونستطيع تغيير إحداثيات مركز القوس بإسناد قيمة لهذه الخاصية على الشكل :


```
ArcCenter(0) = 4
ArcCenter(1) = 5
ArcCenter(2) = 0
arcObj.center = ArcCenter
```
4- الخاصية Radius  وهي تعيد قيمة نصف قطر القوس . للحصول عليهما نكتب :


```
Dim Arcradius As Double
Arcradius = arcObj.radius
```
وهذه الخاصية للقراءة والكتابة يمكن إسناد قيمة لهما وتغييرها على الشكل :


```
arcObj.radius = 20
```
5- الخاصية TotalAngle وهي تعيد قيمة القطاع الزاوي الذي يحصره القوس مقدر بالراديان . للحصول عليهما نكتب :


```
Dim ArcTotalAngle As Double
ArcTotalAngle = arcObj.TotalAngle
```
يمكن تحويل هذه الزاوية إلى درجات كما يلي :


```
ArcTotalAngle = (arcObj.TotalAngle) * 180 / PI
```
وهذه الخاصية للقراءة فقط ولا يمكن تغييرها .
6 – الخاصيتان StartAngle و EndAngle تعيدان زاوية البداية والنهاية للقوس مقدرة بالراديان وهما للقراءة والكتابة ويمكن تغييرها بإسناد قيمة لها .

7 – الخاصية StartPoint تعيد إحداثيات نقطة بداية القوس . لمعرفتها نكتب السطور التالية :


```
Dim ArcStartPnt As Variant
    Dim x1, y1, z1 As Double
    ArcStartPnt = arcObj.startPoint
    x1 = ArcStartPnt(0)
    y1 = ArcStartPnt(1)
 z1 = ArcStartPnt(2)
```
 
وهذه الخاصية للقراءة فقط ولا يمكن تغييرها .
7 – الخاصية EndPoint تعيد إحداثيات نقطة نهاية القوس بنفس الطريقة السابقة وهذه الخاصية للقراءة فقط ولا يمكن تغييرها . 


يتبع ...
م.حسام​


----------



## Hossam-am (28 فبراير 2010)

^


----------



## Eng Ma7moud (28 فبراير 2010)

جزاك الله كل خير


----------



## كناعنة (1 مارس 2010)

بارك الله فيك وشكرا لك نحن بانتظار المزيد من الخير الذي تقدمه


----------



## AHMAD237 (1 مارس 2010)

جزاك الله خيراً و نرجوا الاستمرار


----------



## Hossam-am (1 مارس 2010)

*تابع الدرس الثالث ... رسم مجمعات الخطوط*

رسم مجمعات الخطوط​ Polylines​​
- مجمع الخطوط Polyline يمكن رسمه بمعرفة النقاط التي يمر بها وله نوعان :
- Polyline وهو مجمع الخطوط المعروف حيث يمر بمجموعة نقاط نعرف لكل منها ثلاث بارامترات X,Y,Z ويستخدم للرسم ثلاثي الأبعاد .
- LightWeightPolyline وهو مجمع خطوط يمر بمجموعة نقاط تقع في مستوي واحد نعرف لكل منها X,Y ويستخدم للرسم ثنائي الأبعاد . 
وسنقوم بشرح التعامل مع النوع الثاني المستوي LightWeightPolyline .
لننتقل إلى التطبيق :
- نفتح صفحة التعريفات العامة للبرنامج Module1 ونكتب ما يلي :


```
Public plineObj As AcadLWPolyline 
Public PlinePoints() As Double
```
حيث تم تعريف الكائن plineObj  على أنه مجمع خطوط ثنائي في أوتوكاد .
وتم تعريف متحول لتخزين إحداثيات النقاط على شكل مصفوفة ديناميكية لم نحدد أبعادها .
- قم بعمل زر Command11 وأضفه للفورم وقم بتغيير خاصية caption ليصبح (DrawPolyline) .
- في حدث النقر على الزر Command11 نكتب :


```
Private Sub Command11_Click()
    ReDim PlinePoints(1 To 10) As Double
    PlinePoints(1) = 75: PlinePoints(2) = 65
    PlinePoints(3) = 135: PlinePoints(4) = 125
    PlinePoints(5) = 230: PlinePoints(6) = 160
    PlinePoints(7) = 330: PlinePoints(8) = 100
    PlinePoints(9) = 255: PlinePoints(10) = -10
    Set plineObj = Acadapp.ActiveDocument.ModelSpace.AddLightWeightPolyline(PlinePoints)
    Acadapp.ZoomExtents
End Sub
```
الشرح :
- تم إعادة تعريف مصفوفة النقاط PlinePoints(1 To 10) أي افترضنا أن العنصر سيمر من خمسة نقاط ولكل نقطة بعدين x,y وبالتالي أي توجد عشرة أبعاد . ولو أردنا جعل مجمع الخطوط يمر من 6 نقاط مثلا كنا سنعرف له مصفوفة النقاط من 1 إلى 12 .
- تم إعطاء قيم x,y لكل نقطة من نقاط المجمع بالترتيب مع الأخذ بعين الاعتبار أنه يجب إدخال إحداثيات النقاط بشكل متسلسل وليس بشكل عشوائي .
النقطة الأولى مثلا عرفت بالخليتين 1 و 2
أما النقطة الثانية فعرفت بالخليتين 3 و 4 ...... وهكذا
- تم بعد ذلك إسناد مصفوفة النقاط إلى العنصر plineObj من خلال وظيفة Set وباتباع الطريقة AddLightWeightPolyline .
تستطيع تجريب ما قمنا به بفتح ملف رسومي جديد من خلال الضغط على زر Open New Drawing ثم الضغط على زر DrawPolyline ولاحظ النتيجة .​


----------



## Hossam-am (2 مارس 2010)

خصائص LightWeightPolyline :
للعنصر الرسومي السابق مجموعة من الخصائص أهمها :
1- الخاصيةArea  وهي تعيد مساحة السطح الذي يغلفه مجمع الخطوط في حال كان مغلقاً وتعيد السطح المحصور بين مجمع الخطوط وبين المستقيم الواصل بين نقطة البداية ونقطة النهاية في حال كان مفتوحاً . للحصول عليها نكتب :



```
Dim PlineArea As Double
PlineArea = plineObj.Area
```
 
وهذه الخاصية للقراءة فقط أي يمكن معرفة المساحة لكن لا يمكن تغييرها بإسناد قيمة لهذه الخاصية .
2- الخاصية Closed  وهي تحدد فيما إذا كان مجمع الخطوط مغلقاً أو مفتوحاً وهي تعيد قيمة منطقية True في حال كان العنصر مغلقا و False في حال كان مفتوحاً. لمعرفة ذلك نكتب :


```
Dim closedState As Boolean
closedState = plineObj.Closed
```
ويمكن تغيير هذه الخاصية بإسناد قيمة لها على الشكل :


```
plineObj.Closed = True
```
 
حيث بهذه الطريقة نجعل الكائن مغلقاً . ويمكن إعادة جعل الكائن مفتوحاً بكتابة :


```
plineObj.Closed = False
```
 
3- الخاصية ConstantWidth وهي تعيد أو تحدد قيمة العرض الثابت (سماكة الخط) لأجزاء مجمع الخطوط . لمعرفة هذه الخاصية نكتب :


```
Dim plineWidth As Double
plineObj.ConstantWidth = 0.5
```
ويمكن تغيير عرض الخط بإسناد قيمة لهذه الخاصية على الشكل :


```
plineObj.ConstantWidth = 0.5
```
 
4- الخاصية Coordinate وهي تحدد قيم الإحداثيات لعقدة (رأس ) محددة يمر بها مجمع الخطوط . ويمكن الإفادة من هذه الخاصية كما يلي :
مع الإشارة إلى أن أتوكاد يبدأ بترقيم كل عقدة من عقد مجمع الخطوط ابتداءً من الرقم 0 أي أن العقدة الأول رقمها 0 والثانية رقمها 1 والثالثة رقمها 2 وهكذا . لمعرفة إحداثيات عقدة معينة ولتكن العقدة رقم 3 نكتب :


```
Dim coord As Variant
Dim x, y As Double
coord = plineObj.Coordinate(2)
x = coord(0)
y = coord(1)
```
نستطيع تغيير قيمة إحداثيات أي عقدة من عقد مجمع الخطوط كما يلي :


```
coord(0) = 270
coord(1) = 200
plineObj.Coordinate(2) = coord
plineObj.Update
```
​


----------



## Hossam-am (2 مارس 2010)

5- الخاصية Coordinates وهي تعيد مصفوفة تحوي قيم الإحداثيات لجميع العقد (الرؤوس ) التي يمر بها مجمع الخطوط . ويمكن الإفادة من هذه الخاصية كما يلي :
لاستخراج مصفوفة إحداثيات عقد مجمع الخطوط نكتب :


```
Dim retCoord As Variant
retCoord = plineObj.Coordinates
```
لقراءة قيم إحداثيات العقدة رقم 2 مثلاً نكتب:



```
x = retCoord(2)
y = retCoord(3)
```
حيث أن أتوكاد كما أشرنا يبدأ دائما بالترقيم من الصفر فالعقدة رقم 1 رقمها 0 وتحجز الخليتين 0 و 1 لكل من x و y 
والعقدة رقم 2 رقمها 1 وتحجز الخليتين 2 و 3 لكل من x و y .... وهكذا ..
يمكن تعديل قيم إحداثيات العقدة 2 ضمن مجمع الخطوط بإسناد قيمة لها على الشكل :


```
x = 150
y = 130
retCoord(2) = x
retCoord(3) = y
plineObj.Coordinates = retCoord
plineObj.Update
```
 
6- الخاصية Layer تعيد اسم الطبقة التي رسم عليها مجمع الخطوط. لمعرفتها نكتب السطور التالية :


```
Dim plineLayer As String
plineLayer = plineObj.Layer
```
ويمكن تغيير طبقة مجمع الخطوط بإسناد قيمة لهذه الخاصية .
7- الخاصية Length تعيد طول مجمع الخطوط . لمعرفة طول مجمع الخطوط السابق نكتب :


```
Dim plineLength As Double
plineLength = plineObj.Length
```
وهذه الخاصية للقراءة فقط لا يمكن إسناد قيمة لها .​


----------



## Hossam-am (2 مارس 2010)

8- الخاصية Linetype​هذه الخاصية كما أشرنا سابقا تحدد نمط الخط لمختلف العناصر الرسومية (مستمر – متقطع ...) . وسنقوم الآن بشرحها مفصلاً نظراً لأهميتها .
عند فتح ملف جديد في أتوكاد فإنه تلقائياً يحدد ثلاثة أنواع من أنماط الخطوط وهي :


```
ByLayer
ByBlock
Continuous
```
لنفرض أننا نريد رسم مجمع الخطوط السابق على شكل متقطع أي بنمط مختلف عن ما سبق وليكن النمط ACAD_ISO02W100 . للقيام بذلك يجب إضافة نمط خط جديد حيث يجب تحميله Load وإضافته إلى الملف الرسومي إذا لم يكن محملاً سابقاً . للقيام بذلك هناك مجموعة من الخطوات يجب إنجازها . نقوم بما يلي :
- نفتح صفحة التعريفات العامة للبرنامج Module1 ونكتب ما يلي :


```
Public linetypeColl As AcadLineTypes
Public entry As AcadLineType
Public linetypeName As String
```
نعرف المتحول linetypeColl على أنه يمثل مجموعة أنماط الخطوط المدرجة ضمن الملف الرسومي . ونعرف المتحول entry على أنه نمط واحد من هذه الأنماط . ونعرف المتحول linetypeName لتخزين إسم هذا النمط . وقد جعلنا هذه المتحولات عامة لاستخدامها في أي مكان من البرنامج .
لنضيف الأسطر التالية في إجراء رسم مجمع الخطوط - حدث النقر على الزر Command11 - وهي كالتالي :



```
Dim k As Integer
linetypeName = "ACAD_ISO02W100"
Set linetypeColl = Acadapp.ActiveDocument.Linetypes
k = 0
For Each entry In linetypeColl
    If linetypeName = entry.Name Then
        k = 1
        Exit For
    End If
Next
If k = 0 Then
    Acadapp.ActiveDocument.Linetypes.Load "ACAD_ISO02W100", "acad.lin"
End If
plineObj.Linetype = linetypeName
```
 
الشرح :
سنقوم باختبار وجود النمط ACAD_ISO02W100 ضمن الملف الرسومي فإذا كان موجودا معنى ذلك أنه محمل سابقاً وإن لم يكن موجودا نقوم بتحميله . وسنجري الاختبار كما يلي :
- نقوم في البداية بتعريف متحول k ليكون معيار نجاح الاختبار أو فشله . ونخزن إسم النمط المطلوب ACAD_ISO02W100 في المتحول linetypeName .
- نقوم بإسناد مجموعة الأنماط المدرجة ضمن الملف الرسومي إلى المتحول linetypeColl من خلال وظيفة Set . حبث linetypeColl يمثل مجموعة الأنماط .
- باعتبار أن المتحول entry تم تعريفه على أنه نمط واحد من هذه الأنماط نفتح حلقة اختبار في كل مرة نسند للمتحول entry أحد الأنماط الموجودة في المجموعة linetypeColl من خلال السطر For Each entry In linetypeColl . 
- فإذا كان إسم هذا النط entry.Name يساوي linetypeName الذي يمثل النمط المطلوب ACAD_ISO02W100 معنى ذلك أننا وجدنا هذا النمط مدرجا سابقا ضمن الملف الرسومي هنا نعطي قيمة للمتحول K معيار الاختبار تساوي 1 وننهي الحلقة . أما إذا لم نجد النمط المطلوب معنى ذلك أنه لم يدرج سابقا ضمن الملف الرسومي ويحتاج لإدراج وتبقى قيمة k تساوي 0
- الآن بعد الخروج من الحلقة نختبر قيمة K . فإذا كان يساوي 0 معنى ذلك كما قلنا سابقا أن النمط المطلوب يحتاج لإدراجه ضمن الملف الرسومي باستخدام تعليمة Load  من ملف الأنماط acad.lin من خلال السطر :


```
Acadapp.ActiveDocument.Linetypes.Load "ACAD_ISO02W100", "acad.lin"
```
تجدر الإشارة إلى أنه من الضروري التأكد من كون النمط المطلوب إدراجه موجود ضمن الملف acad.lin وإلا سنحصل على خطأ .
- نقوم بعد ذلك بتغيير خاصية Linetype لمجمع الخطوط لتصبح مساوية لقيمة المتحول linetypeName .
9- الخاصية LinetypeScale  تحدد نسبة طول الشحطة إلى الفراغ أو النقطة في الخط المتقطع وفقا لواحدات الرسم ضمن الملف . وهذه الخاصية للقراءة والكتابة فمثلا لتغيير مقياس رسم الخط للعنصر السابق نكتب :


```
plineObj.LinetypeScale = 0.5
plineObj.Update
```
 
يتبع في درس قادم إن شاء الله
دمتم بخير
م.حسام​


----------



## ابوغيثالشمري (2 مارس 2010)

بارك الله فيك وياريت تجعلها في روابط حتى لاتختلط مع المداخلات ويسهل حفظها


----------



## RESEARCHER (2 مارس 2010)

جزاك الله خيراً


----------



## Hossam-am (3 مارس 2010)

*تابع الدرس الثالث...وظائف التحكم بمجمع الخطوط*

الطرق Methods المتبعة للتحكم بمجمع الخطوط​
1- الطريقة AddVertex نستطيع من خلالها إضافة عقدة (رأس أو ذروة) إلى العقد التي يمر منها مجمع الخطوط . الصيغة العامة لهذه الطريقة على الشكل :


```
plineObj.AddVertex Index, Point
```
 - حيث Index وهو رقم صحيح موجب يدل على موضع إدراج العقدة الجديدة ضمن عقد مجمع الخطوط . فمثلا عند رسم مجمع الخطوط السابق عرفنا له مصفوفة نقاط مؤلفة من خمس نقاط واتفقنا أن أتوكاد يرقم النقاط بدءا من الرقم 0 أي العقد الخمس السابقة تأخذ الأرقام من 0 إلى 4 حيث 0 للعقدة الأولى و4 للعقدة الخامسة وهكذا . 
فلو عرفنا له قيمة Index تساوي 0 مثلا سيقوم البرنامج بزرع عقدة جديدة وإعطاءها الرقم صفر وإزاحة العقد السابقة بمقدار 1 . ولو عرفنا له قيمة Index تساوي 3 مثلا سيقوم البرنامج بزرع عقدة جديدة وإعطاءها رقم 3 وإزاحة العقد ذوات الأرقام 3 و 4 لتصبحان 4 و 5 .
لو أردنا زرع عقدة بعد آخر عقدة أي العقدة رقم 4 سنقوم بجعل قيمة Index تساوي 5 . لكننا لا نستطيع إعطاء قيمة لـ Index تكون سالبة أو إعطاؤه قيمة أكبر من 5 فعندها نحصل على رسالة خطأ .
- Point متحول نخزن فيه إحداثيات العقدة الجديدة .
لإضافة عقدة جديدة لمجمع الخطوط السابق نكتب :


```
Dim newVertex(0 To 1) As Double
newVertex(0) = 250
 newVertex(1) = 100
plineObj.AddVertex 3, newVertex
```
 2- الطريقة SetBulge  نستطيع من خلالها صنع تقوّس (بروز منحني) بين عقدتين من عقد مجمع الخطوط . الصيغة العامة لها على الشكل :


```
plineObj.SetBulge Index, Value
```
- حيث Index وهو رقم صحيح موجب يمثل رقم القطعة Segment التي عندها سيتم إجراء التقوس بمقدار محدد . فكما نعلم فإن مجمع الخطوط يمر من مجموعة من العقد (الرؤوس) وكل عقدتين يحصران بينهما جزء (قطعة) Segment من مجمع الخطوط وأيضا يقوم أوتوكاد بترقيم القطع التي يتألف منها اعتبارا من الرقم 0 . ونشير أنه إذا كان مجمع الخطوط مغلقا فعدد القطع يساوي عدد العقد . أما إذا كان مجمع الخطوط مفتوحاً فعدد القطع يساوي عدد العقد -1 .
- أما Value فلها حكاية أخرى .....
Value : قيمة ظل ربع القطاع الزاوي الذي يحصره القوس الذي سوف يتم رسمه ......
فمثلاً إذا كانت Value تساوي 1 معناه أن مقدار ربع القطاع الزاوي الذي يحصره القوس الذي سوف يتم رسمه يساوي 45 وبالتالي القطاع الزاوي يساوي 180 أي سيتم رسم نصف دائرة ..................
إذا كانت قيمة Value موجبة معنى ذلك أنه سيتم رسم البروز القوسي باتجاه عقارب الساعة وإذا كانت سالبة سيتم رسم البروز القوسي باتجاه عكس عقارب الساعة.
إذا أردنا إنشاء بروز قوسي بين العقدتين 3 و 4 لمجمع الخطوط السابق باتجاه عكس عقارب الساعة مثلا نكتب :


```
plineObj.SetBulge 3, -0.5
```
 
 3- الطريقة  SetWidth تغيير عرض مجمع الخطوط Width لجزء معين منه . الصيغة العامة لهذه الطريقة هي :


```
plineObj.SetWidth SegmentIndex, StartWidth, EndWidth
```
حيث :
SegmentIndex يمثل رقم الجزء (القطعة) من مجمع الخطوط التي نريد تغيير عرض مجمع الخطوط عندها .
StartWidth يمثل العرض عند بداية القطعة التي تم اختيارها و EndWidth يمثل العرض عند نهاية القطعة التي تم اختيارها .
لتعديل عرض الخط لمجمع الخطوط السابق للقطعة التي رقمها يساوي 2 أي القطعة الثالثة منه نضيف الكود التالي :


```
Dim SegmentIndex As Integer
Dim StartWidth As Double
Dim EndWidth As Double
SegmentIndex = 2
StartWidth = 0.5
EndWidth = 1.2
plineObj.SetWidth SegmentIndex, StartWidth, EndWidth
```
 
4- الطريقة GetBulge نستطيع من خلالها معرفة قيمة البروز أو (التقوس) لأحد أجزاء مجمع الخطوط . الصيغة العامة لها :


```
RetVal = plineObj.GetBulge(Index)
```
حيث :
- Index رقم جزء مجمع الخطوط الذي نريد معرفة مقدار التقوس عنده . وكما شرحنا سابقا فإن أتوكاد يرقم الأجزاء بين كل عقدتين اعتبارا من الرقم 0 .
- RetVal المتحول الذي يتم به تخزين قيمة التقوس أو البروز ويجب أن يكون Double .
لمعرفة قيمة التقوس لمجمع الخطوط السابق عند الجزء رقم 3 نكتب :


```
Dim currentBulge As Double
currentBulge = plineObj.GetBulge(3)
```
حيث currentBulge متحول تم تعريفه لتخزين قيمة البروز للجزء رقم 3 المحصور بين العقدتين ذوات الأرقام 3 و 4 أي العقدتين الرابعة والخامسة وفق إدخالاتنا المبدأية .
5- الطريقة GetWidth  نستطيع من خلال هذه الطريقة معرفة عرض مجمع الخطوط Width لجزء معين منه . 
كما شرحنا سابقا من خلال طريقة SetWidth فإنه يتم تغيير عرض جزء من مجمع الخطوط من خلال إسناد قيمة للمتحول StartWidth وقيمة أخرى للمتحول EndWidth . 
أما لمعرفة قيمة عرض الخط لجزء من مجمع الخطوط عند نقطة بدايته ونقطة نهايته يتم ذلك من خلال استخدام الوظيفة GetWidth . 
فمثلا لمعرفة قيمة عرض الخط للجزء رقم 2 من مجمع الخطوط نكتب :


```
Dim curStartWidth As Double
Dim curEndWidth As Double
plineObj.GetWidth 2, curStartWidth, curEndWidth
```
حيث قامت الوظيفة GetWidth بإرجاع قيمة العرض للجزء رقم 2 عند بدايته وتخزينه في المتحول curStartWidth وكذلك إرجاع قيمة العرض للجزء رقم 2 عند نهايته وتخزينه في المتحول curEndWidth .
لرؤية قيم المتغيرات curStartWidth و curEndWidth نستطيع طباعة القيم من خلال إضافة السطر التالي مثلا :


```
message_string = "The segment " & 2 _
& " has a start width of " & StartWidth _ 
& " and an end width of " & EndWidth
MsgBox message_string, , "GetWidth Example"
```
 
6- الطريقة  Explode لتفجير مجمع الخطوط إلى أجزائه الرئيسية التي يتكون منها (خطوط وأقواس ...) . الصيغة العامة لهذه الوظيفة هي :


```
RetVal = plineObj.Explode
```
حيث RetVal متحول على شكل Variant يستخدم لتخزين العناصر الناتجة عن هذه الوظيفة .
نستطيع استخدام الوظيفة Explode مباشرة بدون تخزين العناصر الناتجة عن عملية التفجير بكتابة السطر التالي :


```
plineObj.Explode
```
أما إذا أردنا تخزين العناصر المتولدة عن التفجير للاستفادة منها في أماكن أخرى من البرنامج حسب رغبة المستخدم نستطيع ذلك من خلال كتابة الأسطر التالية :


```
Dim explodedObjects As Variant
explodedObjects = plineObj.Explode
```
حيث تم تعريف متحول explodedObjects لتخزين العناصر الناتجة عن التفجير .
لرؤية نتائج هذه الوظيفة يمكن التحكم بالعناصر المتولدة عنها والمخزنة في المتحول السابق . نستطيع مثلا تغيير لون هذه العناصر من خلال كتابة الأسطر التالية :

```
Dim I As Integer
For I = 0 To UBound(explodedObjects)
    explodedObjects(I).Color = I
    explodedObjects(I).Update
Next
```
يتبع.....​


----------



## Hossam-am (4 مارس 2010)

*تابع الدرس الثالث... رسم القطع الناقص*

رسم القطع الناقص​ Ellipse​بسم الله الرحمن الرحيم..
نعلم أن القطع الناقص يتعين بثلاثة أشياء وهي :
- مركز القطع Center وله ثلاثة بارمترات X,Y,Z تحدد إحداثيات مركز القطع .
- المحور الكبير MajorAxis وله ثلاثة بارمترات X,Y,Z تحدد قيم مساقط شعاع المحور الكبير للقطع على المحاور الإحداثية أي الشعاع الواصل بين نقطة مركز القطع ونقطة الذروة البعيدة للقطع (نصف القطر الكبير للقطع).
- المحور الصغير MinorAxis  وله ثلاثة بارمترات X,Y,Z تحدد قيم مساقط شعاع المحور الصغير للقطع على المحاور الإحداثية أي الشعاع الواصل بين نقطة مركز القطع ونقطة الذروة القريبة للقطع (نصف القطر الصغير للقطع).
- وبما أن محوري القطع متعامدان فيمكن تحديد المحور الصغير كنسبة إلى طول المحور الكبير RadiusRatio .
ننتقل إلى التطبيق :
- قم بعمل زر Command12 وأضفه للفورم وقم بتغيير خاصية caption ليصبح (Draw Ellipse) .
- في حدث النقر على الزر Command12 نكتب :



```
Private Sub Command12_Click()
    Dim EllipseObj As AcadEllipse
    Dim majAxis(0 To 2) As Double
    Dim center(0 To 2) As Double
    Dim radRatio As Double
    '------------
    center(0) = 5
    center(1) = 5
    center(2) = 0
    '------------
    majAxis(0) = 10
    majAxis(1) = 20
    majAxis(2) = 0
    radRatio = 0.3
    '------------
    Set EllipseObj = Acadapp.ActiveDocument.ModelSpace.AddEllipse(center, majAxis, radRatio)
    Acadapp.ZoomExtents
End Sub
```
 
حيث تم تعريف الكائن EllipseObj على أنه قطع ناقص في أوتوكاد .
وتم تعريف متحول center لتخزين قيم إحداثيات مركز القطع .
وتم تعريف متحول majAxis لتخزين قيم مساقط شعاع المحور الكبير للقطع على المحاور الإحداثية أي الشعاع الواصل بين نقطة مركز القطع ونقطة الذروة البعيدة للقطع .
وتم تعريف متحول  radRatio لتخزين نسبة طول القطر الصغير إلى الطول الكبير ويجب أن تكون موجبة تماماً .
بعد ذلك تم رسم القطع الناقص باستخدام الوظيفة AddEllipse ,
تستطيع تجريب ما قمنا به بفتح ملف رسومي جديد من خلال الضغط على زر Open New Drawing ثم الضغط على زر Draw Ellipse ولاحظ النتيجة .​


----------



## Hossam-am (4 مارس 2010)

*خصائص القطع الناقص*

خصائص القطع الناقص Ellipse :​
للعنصر الرسومي السابق مجموعة من الخصائص يمكن التحكم بها أو معرفتها من خلال الكود على الشكل التالي :
1- الخاصيةArea  وهي تعيد مساحة السطح الذي يغلفه قوس القطع الناقص في حال كان مغلقاً وتعيد السطح المحصور بين قوس القطع الناقص وبين المستقيم الواصل بين نقطة البداية ونقطة النهاية في حال كان مفتوحاً . للحصول عليها نكتب :


```
Dim EllipseArea As Double
EllipseArea = EllipseObj.Area
```
 
وهذه الخاصية للقراءة فقط أي يمكن معرفة المساحة لكن لا يمكن تغييرها بإسناد قيمة لهذه الخاصية .
2- الخاصيةCenter   وهي تعيد إحداثيات مركز القطع الناقص . للحصول عليها نكتب :


```
Dim EllipseCenter As Variant
Dim x, y, z As Double
EllipseCenter = EllipseObj.center
x = EllipseCenter(0)
y = EllipseCenter(1)
z = EllipseCenter(2)
```
 
ونستطيع تغيير إحداثيات مركز القطع الناقص بإسناد قيمة لهذه الخاصية على الشكل :


```
EllipseCenter(0) = 4
EllipseCenter(1) = 5
EllipseCenter(2) = 0
EllipseObj.center = EllipseCenter
```
 
3- الخاصية MajorAxis وهي تعيد قيم مساقط شعاع المحور الكبير للقطع على المحاور الإحداثية . للحصول عليها نكتب :

```
Dim retMajAxis As Variant
Dim x1, y1, z1 As Double
retMajAxis = EllipseObj.MajorAxis
x1 = retMajAxis(0)
y1 = retMajAxis(1)
z1 = retMajAxis(2)
```
ونستطيع تغيير قيم هذه المساقط بإسناد قيمة لهذه الخاصية على الشكل :

```
retMajAxis(0) = 5
retMajAxis(1) = 5
retMajAxis(2) = 0
EllipseObj.MajorAxis = retMajAxis
EllipseObj.Update
```
4- الخاصية MinorAxis وهي تعيد قيم مساقط شعاع المحور الصغير للقطع على المحاور الإحداثية . للحصول عليها نكتب :


```
Dim retMinAxis As Variant
Dim x2, y2, z2 As Double
retMinAxis = EllipseObj.MinorAxis
x2 = retMinAxis(0)
y2 = retMinAxis(1)
z2 = retMinAxis(2)
```
وهذه الخاصية للقراءة فقط لا يمكن تغييرها .

5- الخاصيتان MajorRadius و MinorRadius تعيدان طول نصف القطر الكبير ونصف القطر الصغير للقطع الناقص . للحصول عليها نكتب :

```
Dim EllipseMajorRadius  As Double
Dim EllipseMinorRadius  As Double
EllipseMajorRadius = EllipseObj.MajorRadius
EllipseMinorRadius = EllipseObj.MinorRadius
```
 

6- الخاصية RadiusRatio وهي تعيد نسبة طول القطر الصغير إلى طول القطر الكبير للقطع الناقص. للحصول عليها نكتب :

```
Dim CurentRadiusRatio As Double
CurentRadiusRatio = EllipseObj.RadiusRatio
```
ونستطيع تغيير هذه النسبة بإسناد قيمة لهذه الخاصية على الشكل :


```
Dim NewRadiusRatio As Double
NewRadiusRatio = 0.75
EllipseObj.RadiusRatio = NewRadiusRatio
```
أو نستطيع أن نكتب مباشرة :


```
EllipseObj.RadiusRatio = 0.75
```
 
7- الخاصية startAngle هي الزاوية التي تحدد نقطة بداية قوس القطع الناقص _StartPoint _وتقاس اعتباراً من المحور الأفقي X وباتجاه عكس عقارب الساعة ومقدرة بالراديان . و الخاصية endAngle هي الزاوية التي تحدد نقطة نهاية قوس القطع الناقص _EndPoint_ وتقاس اعتباراً من المحور الأفقي X وباتجاه عكس عقارب الساعة ومقدرة بالراديان .
هاتان الخاصيتان مهمتان جداً عندما نريد رسم جزء من قوس القطع الناقص مثلاً..
فلرسم جزء من قوس القطع الناقص السابق مثلا ... نرسمه كاملا كما شرحنا سابقا ثم نضيف الكود التالي :


```
Dim startAngleInDegree As Double
Dim endAngleInDegree As Double
Dim startAngleInRadian As Double
Dim endAngleInRadian As Double
Dim PI As Double
PI = 4 * Atn(1) '3.1415926535897932
startAngleInDegree = 30
endAngleInDegree = 110
startAngleInRadian = startAngleInDegree * PI / 180
endAngleInRadian = endAngleInDegree * PI / 180
EllipseObj.StartAngle = startAngleInRadian
EllipseObj.EndAngle = endAngleInRadian
EllipseObj.Update
```
 
8 – الخاصية StartPoint تعيد إحداثيات نقطة بداية قوس القطع الناقص . لمعرفتها نكتب السطور التالية :


```
Dim EllipseStartPnt As Variant
Dim x3, y3, z3 As Double
EllipseStartPnt = EllipseObj.startPoint
x3 = EllipseStartPnt(0)
y3 = EllipseStartPnt(1)
z3 = EllipseStartPnt(2)
```
وهذه الخاصية للقراءة فقط ولا يمكن تغييرها .
9 – الخاصية EndPoint تعيد إحداثيات نقطة نهاية قوس القطع الناقص . بنفس الطريقة السابقة وهذه الخاصية للقراءة فقط ولا يمكن تغييرها . 

ويمتلك هذا العنصر الرسومي بالإضافة للخصائص السابقة مجموعة من الخصائص الأخرى مثل Layer وهي تعيد إسم الطبقة وهي للقراءة والكتابة و Linetype نمط الخط و LinetypeScale مقياس رسم الخط المتقطع وهي للقراءة فقط . والخاصية Lineweight لمعرفة سماكة الخط أثناء الطباعة وهي للقراءة والكتابة . وأيضاً الخاصية Thickness وهي للقراءة والكتابة .

يتبع......​


----------



## المهندسه العراقيه8 (4 مارس 2010)

جزاك الله خير


----------



## Hossam-am (5 مارس 2010)

*التعمل مع الكتل ....*

التعامل مع الكتل​ Blocks​بسم الله الرحمن الرحيم..
سنقوم بهذا الدرس بإذن الله بشرح طريقة إنشاء الكتل المؤلفة من مجموعة من العناصر الرسومية وطرق التحكم بها وأهم خصائصها وطريقة إدراج هذه الكتلة والتعديل عليها .
من المعروف أن الكتلة تتألف من مجموعة من العناصر الرسومية التي تتحد مع بعضها على شكل كتلة رسومية واحدة . الصيغة العامة لإنشاء كتلة هي :


```
RetVal = Acadapp.ActiveDocument.Blocks.Add(InsertionPoint, Name)
```
حيث :
InsertionPoint نقطة إمساك الكتلة عند إنشائها .
Name إسم الكتلة المراد إنشاؤها .
RetVal عنصر يتم تعريفه على أنه كتلة في أتوكاد .
ننتقل إلى التطبيق :
سنقوم الآن بشرح مثال عملي يتضمن ما يلي :
1- فتح ملف رسومي جديد .
2- إنشاء مجموعة من الطبقات في الملف الرسومي .
3- إنشاء كتلة في الملف الرسومي .
4- رسم مجموعة من العناصر الرسومية ( خط – دائرة – قوس – مجمع خطوط ....) وإضافتها لهذه الكتلة .
5- إدراج الكتلة .
للقيام بذلك نقوم بما يلي :
- قم بعمل زر Command13 وأضفه للفورم وقم بتغيير خاصية caption ليصبح (AddBlock) .
- في حدث النقر على الزر Command13 نكتب الكود التالي :

```
Private Sub Command13_Click()
    'Open new drawing
    On Error Resume Next
        Set Acadapp = GetObject(, "AutoCAD.Application.17")
        Acadapp.Documents.Add
        Acadapp.Visible = True
        Acadapp.WindowState = acMax
    If Err.Number <> 0 Then
        Set Acadapp = CreateObject("AutoCAD.Application.17")
        Acadapp.Documents.Add
        Acadapp.Visible = True
        Acadapp.WindowState = acMax
        Err.Clear
    End If
    '-----------------------
    'Define layers
    Dim LineLyerObj As AcadLayer
    Dim CircleLyerObj As AcadLayer
    Dim ArcLyerObj As AcadLayer
    Dim PolyLyerObj As AcadLayer
    Dim BlockLyerObj As AcadLayer
    '-----------------------
    'add Layers to the drawing
    Set LineLyerObj = Acadapp.ActiveDocument.Layers.Add("Lines")
    LineLyerObj.Color = acRed
    LineLyerObj.Lineweight = 0.3
    Set CircleLyerObj = Acadapp.ActiveDocument.Layers.Add("Circles")
    CircleLyerObj.Color = acYellow
    CircleLyerObj.Lineweight = 0.25
    Set ArcLyerObj = Acadapp.ActiveDocument.Layers.Add("Arcs")
    ArcLyerObj.Color = acGreen
    ArcLyerObj.Lineweight = 0.4
    Set PolyLyerObj = Acadapp.ActiveDocument.Layers.Add("Polylines")
    PolyLyerObj.Color = acMagenta
    PolyLyerObj.Lineweight = 0.5
    Set BlockLyerObj = Acadapp.ActiveDocument.Layers.Add("Blocks")
    BlockLyerObj.Color = acMagenta
    BlockLyerObj.Lineweight = 0.25
    '-----------------------
    'Define Block
    Dim BlockObj As AcadBlock
    Dim InsertionPoint(0 To 2) As Double
    Acadapp.ActiveDocument.ActiveLayer = BlockLyerObj
    InsertionPoint(0) = 0#
    InsertionPoint(1) = 0#
    InsertionPoint(2) = 0#
    Set BlockObj = Acadapp.ActiveDocument.Blocks.Add(InsertionPoint, "Sample")
    '-----------------------
    'Add Line To Block
    Dim acadLine As acadLine
    Dim startPointH(2) As Double
    Dim endPointH(2) As Double
    Acadapp.ActiveDocument.ActiveLayer = LineLyerObj
    startPointH(0) = 280
    startPointH(1) = 240
    startPointH(2) = 0
    endPointH(0) = 380
    endPointH(1) = 400
    endPointH(2) = 0
    Set acadLine = BlockObj.AddLine(startPointH, endPointH)
    '-----------------------
    'Add Circle To Block
    Dim acCircleObj As AcadCircle
    Dim centerH(2) As Double
    Dim radiusH As Double
    Acadapp.ActiveDocument.ActiveLayer = CircleLyerObj
    centerH(0) = 250
    centerH(1) = 180
    centerH(2) = 0
    radiusH = 50
    Set acCircleObj = BlockObj.AddCircle(centerH, radiusH)
    '-----------------------
    'Add Arc To Block
    Dim centerArc(0 To 2) As Double
    Dim radiusArc As Double
    Dim startAngleInDegree As Double
    Dim endAngleInDegree As Double
    Dim startAngleInRadian As Double
    Dim endAngleInRadian As Double
    Dim PI As Double
    Acadapp.ActiveDocument.ActiveLayer = ArcLyerObj
    PI = 4 * Atn(1) '3.1415926535897932
    centerArc(0) = 210
    centerArc(1) = 330
    centerArc(2) = 0
    radiusArc = 50
    startAngleInDegree = 30
    endAngleInDegree = 110
    startAngleInRadian = startAngleInDegree * PI / 180
    endAngleInRadian = endAngleInDegree * PI / 180
    Set arcObj = BlockObj.AddArc(centerArc, radiusArc, startAngleInRadian, endAngleInRadian)
    '-----------------------
    'Add Polyline To Block
    Dim acPlineObj As AcadLWPolyline
    Dim PlinePointsH(1 To 10) As Double
    Acadapp.ActiveDocument.ActiveLayer = PolyLyerObj
    PlinePointsH(1) = 75: PlinePointsH(2) = 65
    PlinePointsH(3) = 135: PlinePointsH(4) = 125
    PlinePointsH(5) = 230: PlinePointsH(6) = 160
    PlinePointsH(7) = 330: PlinePointsH(8) = 100
    PlinePointsH(9) = 255: PlinePointsH(10) = -10
    Set acPlineObj = BlockObj.AddLightWeightPolyline(PlinePointsH)
    '-----------------------
    '-----------------------
    '-----------------------
    'Insert the Block
    Dim blockRefObj As AcadBlockReference
    Acadapp.ActiveDocument.ActiveLayer = BlockLyerObj
    InsertionPoint(0) = 100
    InsertionPoint(1) = 200
    InsertionPoint(2) = 0
    Set blockRefObj = Acadapp.ActiveDocument.ModelSpace.InsertBlock(InsertionPoint, "Sample", 1#, 1#, 1#, 0)
    Acadapp.ZoomExtents
End Sub
```
 
​


----------



## Hossam-am (5 مارس 2010)

شرح كود تعريف الكتلة وإدراجها ....
1- قمنا في بداية الأمر بتعريف متحول Acadapp على أنه تطبيق أوتوكاد ثم اختبار كون برنامج الأتوكاد قيد التشغيل فعندها نقوم بإضافة ملف جديد فارغ أو نقوم بتشغيل برنامج الأتوكاد ثم إضافة ملف جديد فارغ . وقد شرحنا هذه الطريقة بالتفصيل في دروس سابقة . فهذا الجزء من الكود يعمل بنفس عمل الكود الخاص بالضغط على الزر Open New Drawing السابق شرحه .
2- نقوم بعد ذلك بتعريف مجموعة من الطبقات في الملف الرسومي ثم إضافة هذه الطبقات إلى الملف وتغيير بعض خصائصها وذلك على فرض أن كل عنصر رسومي موجود على طبقة معينة مختلفة عن الأخرى . حتى الكتلة التي سيتم إنشاؤها سنعرف لها طبقة مستقلة على فرض أننا سنقوم بإدراجها على هذه الطبقة . وقد قمنا بشرح ذلك في دروس سابقة .
3- نقوم بعد ذلك بتعريف الكتلة من خلال الكود :


```
Dim BlockObj As AcadBlock
    Dim InsertionPoint(0 To 2) As Double
    Acadapp.ActiveDocument.ActiveLayer = BlockLyerObj
    InsertionPoint(0) = 0#
    InsertionPoint(1) = 0#
    InsertionPoint(2) = 0#
Set BlockObj = Acadapp.ActiveDocument.Blocks.Add(InsertionPoint, "Sample")
```
حيث قمنا بتعريف متحول BlockObj على أنه كتلة في أتوكاد وقمنا بتعريف متحول InsertionPoint لتخزين إحداثيات نقطة إمساك الكتلة .
قمنا بعد ذلك بإضافة كتلة جديدة إلى الملف الرسومي من خلال Blocks.Add وقمنا بتسمية هذه الكتلة "Sample" على سبيل المثال .
4- نقوم بعد ذلك بإضافة مجموعة من العناصر الرسومية ( خط و دائرة وقوس ومجمع خطوط ) إلى الكتلة السابقة . وهنا يجب الانتباه إلى أننا قمنا بإضافة هذه العناصر إلى الكتلة مباشرة وليس إلى الملف الرسومي . فمثلا عند رسم الخط في الملف الرسومي كنا نكتب السطر التالي :


```
Set acLine = Acadapp.ActiveDocument.ModelSpace.AddLine (startPoint, endPoint)
```
في هذه الحالة سيتم رسم الخط ضمن الملف الرسومي مباشرة
أما لإضافة الخط السابق إلى الكتلة نكتب السطر التالي :


```
Set acadLine = BlockObj.AddLine(startPointH, endPointH)
```
أي تم الاستعاضة عن العبارة Acadapp.ActiveDocument.ModelSpace.AddLine بالعبارة BlockObj.AddLine .
5- بعد ذلك نقوم بإدراج هذه الكتلة ضمن الملف الرسومي 
للقيام بذلك علينا تحديد ما يلي :
- إحداثيات نقطة الإدراج InsertionPoint .
- إسم الكتلة المراد إدراجها .
- المقياس الأفقي للكتلة Xscale.
- المقياس الشاقولي للكتلة Yscale.
- المقياس المتعامد في الاتجاه Z وهو Zscale.
- زاوية الدوران Rotation .
للقيام بإدراج الكتلة السابقة نقوم بكتابة الكود التالي وهو الجزء الأخير من الكود السابق على الشكل :


```
Dim blockRefObj As AcadBlockReference
    Acadapp.ActiveDocument.ActiveLayer = BlockLyerObj
    InsertionPoint(0) = 100
    InsertionPoint(1) = 200
    InsertionPoint(2) = 0
Set blockRefObj = Acadapp.ActiveDocument.ModelSpace.InsertBlock (InsertionPoint, "Sample", 1#, 1#, 1#, 0)
```
 
حيث قمنا بتعريف عنصر blockRefObj على أنه عنصر إدراج (عنصر ارتباط) .
ثم قمنا بجعل الطبقة الحالية هي الطبقة BlockLyerObj لإدراج الكتلة عليها .
ثم قمنا بعد ذلك بتحديد إحداثيات نقطة إدراج الكتلة InsertionPoint .
ثم قمنا بعد ذلك بإدراج الكتلة السابقة من خلال الوظيفة InsertBlock . حيث الشكل العام لهذه الوظيفة هي :


```
RetVal = Acadapp.ActiveDocument.ModelSpace.InsertBlock (InsertionPoint, Name, Xscale, Yscale, ZScale, Rotation)
```
 
وباعتماد قيم تساوي 1 للمقاييس وتساوي 0 لزاوية الدوران وتحديد إسم الكتلة السابقة للإدراج "Sample" نكون قد قمنا بإدراج هذه الكتلة .​يتبع في درس قادم إن شاء الله​


----------



## Hossam-am (5 مارس 2010)

ارجو من الأخوة الأفاضل متابعة الشرح خطوة بخطوة ومحاولة
تطبيق الأمثلة والسؤال عند اللزوم حيث اعتقد أن المادة 
العلمية المشروحة هنا على قدر كبير من الأهمية لكل مهندس 
لا على التعيين ولكل من يستخدم برنامج الأتوكاد ...
أرجو الاهتمام والتفاعل ...
دمتم بخير​


----------



## Hossam-am (5 مارس 2010)

*التعامل مع السمات Attribute ....*

التعامل مع السمات​Attribute​
السمات : لعلها من أهم العناصر الرسومية على الإطلاق من حيث فوائدها الكبيرة في تخزين البيانات المتعلقة ببلوكة معينة وتغيير قيمها وخصائصها وإمكانية تصديرها إلى خارج الملف الرسومي واستيرادها مجددا وغير ذلك الكثير من الخصائص .
وسنقوم بشرح هذا العنصر بشيء من التفصيل نظرا لأهميته الكبيرة (ربما المهندسون المعماريون يعلمون تماما مدى أهميته) .
إنشاء سمة في الملف الرسومي  Attribute:
لإنشاء سمة في الملف الرسومي نستخدم الوظيفة AddAttribute والصيغة العامة لها على الشكل :


```
RetVal = object.AddAttribute(Height, Mode, Prompt, InsertionPoint, Tag, Value)
```
حيث :
RetVal عنصر يتم تعريفه على أنه سمة في أتوكاد .
object إما أن يكون ModelSpace Collection أو PaperSpace Collection أو Block .
أي يمكن إنشاء السمة ضمن حيز الموديل ModelSpace أو الورقة PaperSpace أو تضمينها لكتلة Block .
أما الوظيفة AddAttribute فلها البارامترات التالية :
Height ارتفاع نص السمة .
Mode وهي تأخذ مجموعة من القيم أهمها :
1- acAttributeModeVerify 
2- acAttributeModeInvisible : هذا الخيار يعني بأن قيمة السمة لن تظهر عند إدراج بلوكة تحوي هذه السمة ضمن الملف الرسومي .
3-  acAttributeModeConstant: هذا الخيار يعطي قيمة ثابتة للسمة عند إدراج بلوكة تحوي هذه السمة ضمن الملف الرسومي .
4-  acAttributeModeLockPosition: هذا الخيار يقفل موقع إدراج السمة بحيث لا يسمح بتغيير موضعها عند إدراج بلوكة تحوي هذه السمة ضمن الملف الرسومي .
5-  acAttributeModePreset: هذا الخيار يجعل السمة تأخذ القيمة الافتراضية لها عند إنشاءها ولا يمكن تحرير السمة بعد ذلك لتغيير قيمتها عند إدراج بلوكة تحوي هذه السمة ضمن الملف الرسومي .
Prompt نص الموجه الذي يسأل عن قيمة السمة عند إدراج بلوكة تحوي هذه السمة ضمن الملف الرسومي .
InsertionPoint نقطة إمساك السمة .
Tag إسم السمة عند إنشاءها أو ما يسمى باللقب .
Value القيمة المبدئية أو الافتراضية للسمة عند إنشائها .

الآن لننتقل إلى التطبيق العملي لهذه الطريقة :
سنقوم بشرح مثال عملي عن طريقة تعريف السمة وإدراجها ضمن الملف الرسومي بشكل عملي .
لنفترض أننا سنقوم بإنشاء بلوكة ضمن الملف الرسومي . ثم سنضيف مجموعة من الخطوط لهذه البلوكة Polylines على طبقة معينة ثم سنضمن البلوكة السابقة ثلاثة عناصر من السمات Attribute إحداها سنخزن فيها رقم الغرفة مثلا وتكون ظاهرة عند إدراج البلوكة . والثانية سنخزن فيها اسم الغرفة (جلوس معيشة ----) وتكون ظاهرة والثالثة سنخزن فيها مساحة الغرفة وتكون مخفية .
الآن لننشئ زر جديد Commanad14 ونضيفه للفورم ونجعل خاصية Caption له تساوي AddAttribute .
في حدث النقر على زر Commanad14 لنكتب الكود التالي :​


----------



## Hossam-am (5 مارس 2010)

```
Private Sub Command14_Click()
    'Open new drawing
    On Error Resume Next
        Set Acadapp = GetObject(, "AutoCAD.Application.17")
        Acadapp.Documents.Add
        Acadapp.Visible = True
        Acadapp.WindowState = acMax
    If Err.Number <> 0 Then
        Set Acadapp = CreateObject("AutoCAD.Application.17")
        Acadapp.Documents.Add
        Acadapp.Visible = True
        Acadapp.WindowState = acMax
        Err.Clear
    End If
    '-----------------------
    'Define layers
    Dim LyerObj1 As AcadLayer
    Dim LyerObj2 As AcadLayer
    Dim LyerObj3 As AcadLayer
    Dim BlockLyerObj As AcadLayer
    '-----------------------
    'add Layers to the drawing
    Set LyerObj1 = Acadapp.ActiveDocument.Layers.Add("RoomNumber")
    LyerObj1.Color = acRed
    LyerObj1.Lineweight = 0.3
    Set LyerObj2 = Acadapp.ActiveDocument.Layers.Add("RoomFuntion")
    LyerObj2.Color = acYellow
    LyerObj2.Lineweight = 0.25
    Set LyerObj3 = Acadapp.ActiveDocument.Layers.Add("RoomArea")
    LyerObj3.Color = acGreen
    LyerObj3.Lineweight = 0.4
    Set BlockLyerObj = Acadapp.ActiveDocument.Layers.Add("Blocks")
    BlockLyerObj.Color = acMagenta
    BlockLyerObj.Lineweight = 0.25
    '-----------------------
    'Define Block
    Dim BlockObj As AcadBlock
    Dim insertionPoint(0 To 2) As Double
    Acadapp.ActiveDocument.ActiveLayer = BlockLyerObj
    insertionPoint(0) = 0#
    insertionPoint(1) = 0#
    insertionPoint(2) = 0#
    Set BlockObj = Acadapp.ActiveDocument.Blocks.Add(insertionPoint, "Sample")
    '-----------------------
    'Add Polylines To Block
    Dim acPlineObj1 As AcadLWPolyline
    Dim acPlineObj2 As AcadLWPolyline
    Dim acPlineObj3 As AcadLWPolyline
    Dim PlinePointsH(1 To 8) As Double
    
    Acadapp.ActiveDocument.ActiveLayer = LyerObj1
    PlinePointsH(1) = 0: PlinePointsH(2) = 20
    PlinePointsH(3) = 0: PlinePointsH(4) = 30
    PlinePointsH(5) = 30: PlinePointsH(6) = 30
    PlinePointsH(7) = 30: PlinePointsH(8) = 20
    Set acPlineObj1 = BlockObj.AddLightWeightPolyline(PlinePointsH)
    acPlineObj1.Closed = True
    
    Acadapp.ActiveDocument.ActiveLayer = LyerObj2
    PlinePointsH(1) = 0: PlinePointsH(2) = 10
    PlinePointsH(3) = 0: PlinePointsH(4) = 20
    PlinePointsH(5) = 30: PlinePointsH(6) = 20
    PlinePointsH(7) = 30: PlinePointsH(8) = 10
    Set acPlineObj2 = BlockObj.AddLightWeightPolyline(PlinePointsH)
    acPlineObj2.Closed = True
    
    Acadapp.ActiveDocument.ActiveLayer = LyerObj3
    PlinePointsH(1) = 0: PlinePointsH(2) = 0
    PlinePointsH(3) = 0: PlinePointsH(4) = 10
    PlinePointsH(5) = 30: PlinePointsH(6) = 10
    PlinePointsH(7) = 30: PlinePointsH(8) = 0
    Set acPlineObj3 = BlockObj.AddLightWeightPolyline(PlinePointsH)
    acPlineObj3.Closed = True
    '-----------------------
    'Define Attributes
    Dim attributeObj1 As AcadAttribute
    Dim attributeObj2 As AcadAttribute
    Dim attributeObj3 As AcadAttribute
    Dim Height As Double
    Dim Mode As Long
    Dim Prompt As String
    Dim Tag As String
    Dim Value As String
    
    Acadapp.ActiveDocument.ActiveLayer = LyerObj1
    Height = 5
    Mode = acAttributeModeVerify
    Prompt = "New Prompt"
    insertionPoint(0) = 13
    insertionPoint(1) = 23
    insertionPoint(2) = 0
    Tag = "Number"
    Value = "Number"
    Set attributeObj1 = BlockObj.AddAttribute(Height, Mode, Prompt, insertionPoint, Tag, Value)
    
    Acadapp.ActiveDocument.ActiveLayer = LyerObj2
    Height = 5
    Mode = acAttributeModeVerify
    Prompt = "New Prompt"
    insertionPoint(0) = 4
    insertionPoint(1) = 14
    insertionPoint(2) = 0
    Tag = "Funtion"
    Value = "Funtion"
    Set attributeObj2 = BlockObj.AddAttribute(Height, Mode, Prompt, insertionPoint, Tag, Value)
    
    Acadapp.ActiveDocument.ActiveLayer = LyerObj3
    Height = 5
    Mode = acAttributeModeInvisible
    Prompt = "New Prompt"
    insertionPoint(0) = 10
    insertionPoint(1) = 3
    insertionPoint(2) = 0
    Tag = "Area"
    Value = "Area"
    Set attributeObj3 = BlockObj.AddAttribute(Height, Mode, Prompt, insertionPoint, Tag, Value)
    '-----------------------
    'Insert the Block
    Dim blockRefObj As AcadBlockReference
    Acadapp.ActiveDocument.ActiveLayer = BlockLyerObj
    insertionPoint(0) = 100
    insertionPoint(1) = 100
    insertionPoint(2) = 0
    Set blockRefObj = Acadapp.ActiveDocument.ModelSpace.InsertBlock(insertionPoint, "Sample", 1#, 1#, 1#, 0)
    '-----------------------
    Dim VarAttributes As Variant
    VarAttributes = blockRefObj.GetAttributes
    VarAttributes(0).TextString = "1"
    VarAttributes(1).TextString = "Living"
    VarAttributes(2).TextString = "40"
    '-----------------------
    Acadapp.ZoomExtents
End Sub
```


----------



## Hossam-am (5 مارس 2010)

شرح الكود :
1- قمنا في بداية الأمر بتعريف متحول Acadapp على أنه تطبيق أوتوكاد ثم اختبار كون برنامج الأوتوكاد قيد التشغيل فعندها نقوم بإضافة ملف جديد فارغ أو نقوم بتشغيل برنامج الأوتوكاد ثم إضافة ملف جديد فارغ . وقد شرحنا هذه الطريقة بالتفصيل في دروس سابقة . فهذا الجزء من الكود يعمل بنفس عمل الكود الخاص بالضغط على الزر Open New Drawing السابق شرحه ويمكن الاستغناء عنه ولكن يجب أولا الضغط على زر فتح ملف رسومي جديد Open New Drawing .
2- نقوم بعد ذلك بتعريف مجموعة من الطبقات في الملف الرسومي ثم إضافة هذه الطبقات إلى الملف وتغيير بعض خصائصها . 
3- نقوم بعد ذلك بتعريف الكتلة من خلال الكود :


```
Dim BlockObj As AcadBlock
    Dim InsertionPoint(0 To 2) As Double
    Acadapp.ActiveDocument.ActiveLayer = BlockLyerObj
    InsertionPoint(0) = 0#
    InsertionPoint(1) = 0#
    InsertionPoint(2) = 0#
Set BlockObj = Acadapp.ActiveDocument.Blocks.Add(InsertionPoint, "Sample")
```
حيث قمنا بتعريف متحول BlockObj على أنه كتلة في أتوكاد وقمنا بتعريف متحول InsertionPoint لتخزين إحداثيات نقطة إمساك الكتلة .
قمنا بعد ذلك بإضافة كتلة جديدة إلى الملف الرسومي من خلال Blocks.Add وقمنا بتسمية هذه الكتلة "Sample" على سبيل المثال .
4- نقوم بعد ذلك بإضافة مجموعة من العناصر الرسومية (مجموعة من مجمعات الخطوط ) إلى الكتلة السابقة . 
5- نقوم بعد ذلك بتعريف ثلاثة عناصر على أنها سمات في أوتوكاد وفقا للكود :


```
Dim attributeObj1 As AcadAttribute
    Dim attributeObj2 As AcadAttribute
 Dim attributeObj3 As AcadAttribute
```
ثم نعرف مجموعة من المتحولات لتخزين بارامترات إنشاء السمة التي تحدثنا عنها في بداية الدرس وهي وفقا للكود :



```
Dim Height As Double
    Dim Mode As Long
    Dim Prompt As String
    Dim Tag As String
    Dim Value As String
```
الآن نعطي قيما لهذه البارمترات (ارتفاع نص السمة – ونظام الإظهار- ونص الموجه- وإسم أو لقب السمة – والقيمة المبدئية لها ) ثم نضيف السمة إلى الكتلة السابقة مباشرة باستخدام الوظيفة AddAttribute كما في الكود :


```
Height = 5
    Mode = acAttributeModeVerify
    Prompt = "New Prompt"
    insertionPoint(0) = 13
    insertionPoint(1) = 23
    insertionPoint(2) = 0
    Tag = "Number"
    Value = "Number"
    Set attributeObj1 = BlockObj.AddAttribute(Height, Mode, Prompt, insertionPoint, Tag, Value)
```
ونكرر ذلك للسمات الأخرى.
6- نقوم بإدراج هذه الكتلة بنفس الطريقة التي تعلمناها سابقا من خلال تعريف عنصر ارتباط بكتلة أو عنصر إدراج blockRefObj ثم استخدام الوظيفة InsertBlock كما في الكود :


```
Dim blockRefObj As AcadBlockReference
    Acadapp.ActiveDocument.ActiveLayer = BlockLyerObj
    insertionPoint(0) = 100
    insertionPoint(1) = 100
    insertionPoint(2) = 0
    Set blockRefObj = Acadapp.ActiveDocument.ModelSpace.InsertBlock(insertionPoint, "Sample", 1#, 1#, 1#, 0)
```
7- وهنا الخطوة المهمة والتي تمثل الجزء الأخير من الكود السابق حيث نقوم بالتقاط السمات الموجودة ضمن البلوكة السابقة blockRefObj من خلال الوظيفة GetAttributes وغسناد النتيجة إلى متحول VarAttributes والذي يتم تعريفه بشكل Variant كما في الكود :


```
Dim VarAttributes As Variant
    VarAttributes = blockRefObj.GetAttributes
```
أي أننا قمنا بربط السمات الموجودة ضمن الكتلة بالمتحول VarAttributes ويمكن التحكم بخصائص هذه السمات من خلاله . وأهم هذه الخصائص هي خاصية TextString التي تتيح التحكم بقيمة نص السمة Value . كما في الكود :


```
VarAttributes(0).TextString = "1"
    VarAttributes(1).TextString = "Living"
    VarAttributes(2).TextString = "40"
```
 
حيث أول سمة تم إضافتها للكتلة هي attributeObj1 وهي أول سمة ستتخزن في المتحول VarAttributes وستأخذ الموضع VarAttributes(0) وبنفس الطريقة ستأخذ بقية السمات المواضع VarAttributes(1) و VarAttributes(2) .

إلى هنا أخواني أكون قد أنهيت الجولة الأولى من الدروس حيث وصلت إلى نفس الموضع الذي وصلت إليه في المنتدى الآخر كما اشرت في بداية مشاركاتي .. ومن الآن وصاعدا سأوقف الدروس في ذلك المنتدى وساكملها هنا بعون الله ضمن منتداكم الرائع ...
ساعطي أخواني قليلا من الوقت للتمعن في هذه المعلومات ومراجعتها لمن يحب المتابعة معي وتنمية مهاراته في هذه اللغة الرائعة ..... جاهز في كل مرة لاستقبال استفساراتكم واقتراحاتكم بحول الله ...
دمتم بخير​


----------



## م/السيد الشيخ (5 مارس 2010)

موضوع جميل جدا جدا بارك الله فيك ونفع بك


----------



## كناعنة (5 مارس 2010)

بارك الله فيك نحن نتابع باذن الله ونقم بتحضير الاسئلة


----------



## Hossam-am (8 مارس 2010)

سبحان الله


----------



## Hossam-am (11 مارس 2010)

ارجو من الأخوة الأفاضل متابعة الشرح خطوة بخطوة ومحاولة
تطبيق الأمثلة والسؤال عند اللزوم حيث اعتقد أن المادة 
العلمية المشروحة هنا على قدر كبير من الأهمية لكل مهندس 
لا على التعيين ولكل من يستخدم برنامج الأتوكاد ...
أرجو الاهتمام والتفاعل ...
دمتم بخير​


----------



## Hossam-am (17 مارس 2010)

سبحان الله


----------



## أبو محمد الرملي (17 مارس 2010)

والله أخجلتني يا مهندس حسام بحرصك على إفادة أعضاء المنتدى بهذه الدروس المتخصصة النافعة ، وبالمقابل فالتجاوب منا ضعيف ، وأرجو ألا يصرفك ذلك عن إتمام الدروس ، والأجر والثواب عند من يكافئ الحسنة بعشر أمثالها وبأكثر من ذلك .
سياق تنزيل الدروس كان سريعا بعض الشئ، خاصة على من ليس لديه خلفية مسبقة عن هذا الموضوع ، لذا أرجو أن تصبر علينا قليلا حتى نستوعب ما طرحته ونطبقه على مهل وفهم، ثم نسأل حضرتك عما أشكل علينا من أمور.
غفر الله لك ولوالديك.


----------



## أبو محمد الرملي (2 أبريل 2010)

أخي م. حسام

عذرا عن هذا التأخير في تطبيق دروسك القيمة عن التحكم ببرنامج الأوتوكاد من خلال الفيجوال بيسك ، ولكن ..... البداية دائما صعبة ، ثم تتيسر الأمور.

بصراحة دروس ممتعة ومشوقة ، ومشروحة خطوة بخطوة ، ولذا لم أجد صعوبة في التطبيق ، ولكن الصعوبة كانت في فهم واستيعاب بعض النقاط والتي سأسردها عليك واحدا تلو الآخر ، وأرجو أن يتسع صدرك للإجابة عليها ، وأسأل الله تعالى أن يكون ذلك في ميزان حسناتك.

السؤال الأول : 
عند حفظ الملف لأول مرة ، أو عند فتح ملف موجود ، كيف أجعل البرنامج يظهر لي نافذة أستطيع من خلالها تحديد مسار الملف وإسمه ؟

السؤال الثاني: 
في درس الطبقات ، هناك ملاحظتان:

الأولى: أنه لم يقبل اسم الطبقة باللغة العربية ( جدران خارجية ) وظهرت لي رسالة خطا ، وعندما غيرتها إلى ( External Walls) تم تنفيذ الكود بدون مشاكل.

الثانية : عند تعيين قيمة لل ( Line Weight ) بمقدار ( 5 مم ) فأقل فإنه يعتبرها ( 0.00مم ) ولا أدري لماذا . أما عند تعيين القيمة بأكثر من ( 5 مم ) فتظهر رسالة خطأ !!

السؤال الثالث : 

إقتباس: 
زاوية الخط Angle وهي الزاوية التي يميل بها الخط عن الافق مقاسة بدءاً من محور X الأفقي وباتجاه عكس عقارب الساعة (ومقدرة بالراديان ) . للحصول على زاوية الخط السابق يمكن إضافة السطور التالية :
مخطوطة PHP:
​Dim LineAngle As Double
​LineAngle = acLine.Angle 

نفّذت الكود ولكن لم يظهر لي شئ !!



السؤال الرابع : 

إقتباس:
5- الخاصية Layer تعيد اسم الطبقة التي رسم عليها الخط . لمعرفتها نكتب السطور التالية :
مخطوطة PHP:
​Dim LineLayer As String
LineLayer = acLine.Layer​

ويمكن تغيير طبقة الخط بإسناد قيمة لهذه الخاصية .

أرجو توضيح هذه النقطة.

السؤال الخامس :

إقتباس: 
خاصية Area وهي تعيد مساحة سطح الدائرة . للحصول عليها نكتب :
مخطوطة PHP:
​Dim circleArea As Double
​circleArea = circleObj.Area 

ما المقصود بعبارة ( تعيد مساحة سطح الدائر ة) ، فلقد نفذت الكود ولم يحصل شئ !!

السؤال السادس والأخير :

إقتباس: 
​PI = 4 * Atn(1) 3.1415926535897932  

عند تنفيذ الكود ظهرت رسالة خطأ ، فعدلته إلى : 

(PI = 4 * Atn (1 

وهي تعطى نفس النتيجة ( 3.1415926535897932 )

فتم تنفيذ الكود بدون مشاكل.

وختاما .... أرجو منك الإجابة على هذه الإستفسارات ، وتكملة هذه الدروس الشيقة.

مع تمنياتي لك بالسعادة في الدارين .


----------



## أبو محمد الرملي (10 أبريل 2010)

أخي الحبيب حسام 

أرجو منك تكملة هذه الدروس وعدم الإنقطاع ...... عسى الله تعالى أن يجعلها في ميزان حسناتك.


----------



## علاء شيخ محمود (10 أبريل 2010)

*السلام عليكم (جميع الدروس على ملف وورد)*

بعد اذنك اخي حسام أنا حبيت أجمع دروسك كلها علىملف وورد لتعم الفائدة 
مع خالص الشكر​


----------



## محمودشمس (10 أبريل 2010)

بارك الله فيك


----------



## Hossam-am (13 أبريل 2010)

السلام عليكم ورحمة الله تعالى وبركاته
شكرا للأخوان على اهتمامهم بالموضوع
سأكون معكم قريبا جدا بإذن الله
القليل من الوقت
دمتم بخير


----------



## أبو محمد الرملي (13 أبريل 2010)

أخي علاء ...

مجهود طيب ، ولكن أرجو مراجعة المستند وإعادة تنسيقه، لأن بعض العبارات قد حصل فيها تقديم وتأخير .... ربما بسبب عمليات النسخ واللصق. بارك الله في جهودك.

أخي حسام .... نحن بالإنتظار، جزاك الله خيرا.


----------



## أبو العز عادل (14 أبريل 2010)

جزاك الله خير


----------



## sariiii (14 أبريل 2010)

مشكور جدا جدا


----------



## رافد عليوي حسن (16 سبتمبر 2010)

شكرااااااااااااااااااا جزيلااااااااااااااااا على الموضوع الجميل


----------



## almohandesw (16 سبتمبر 2010)

شيئ جميل


----------



## Hossam-am (26 ديسمبر 2011)

*التعامل مع النصوص Mtext*

*[FONT=&quot]التعامل مع النصوص[/FONT]*​ *Mtext**[FONT=&quot][/FONT]*​ [FONT=&quot] [/FONT]
[FONT=&quot]بسم الله الرحمن الرحيم ....[/FONT]
[FONT=&quot]سنقوم بهذا الدرس بإذن الله بشرح طريقة إنشاء نص متعدد الأسطر [/FONT]Mtext[FONT=&quot] ونتعرف على أهم خصائصه وطرق التحكم بهذا العنصر .[/FONT]
[FONT=&quot]الصيغة العامة لإنشاء نص متعدد هي :[/FONT]

```
RetVal = Acadapp.ActiveDocument.ModelSpace. AddMText(InsertionPoint, Width, Text)
```
[FONT=&quot] 
[/FONT]​ 
[FONT=&quot]حيث :[/FONT]
InsertionPoint[FONT=&quot] نقطة إدراج النص (الزاوية اليسارية العلوية من الإطار المغلف للنص)[/FONT]
Width[FONT=&quot] وهو يمثل عرض الإطار المستطيل الذي يحصر النص المتعدد[/FONT]
Text[FONT=&quot] المحتوى الفعلي للنص[/FONT]
RetVal [FONT=&quot] عنصر يتم تعريفه على أنه نص متعدد في أتوكاد[/FONT] .[FONT=&quot][/FONT]
*[FONT=&quot]لننتقل إلى التطبيق :[/FONT]*
[FONT=&quot]- قم بعمل زر [/FONT]Command16[FONT=&quot] وأضفه للفورم وقم بتغيير خاصية [/FONT]caption[FONT=&quot] ليصبح [/FONT](AddMtext)[FONT=&quot] .[/FONT]
[FONT=&quot]- في حدث النقر على الزر [/FONT]Command16[FONT=&quot] نكتب :[/FONT]

```
Private Sub Command16_Click()
     On Error Resume Next
          Set Acadapp = GetObject(, "AutoCAD.Application.17")
          Acadapp.Documents.Add
          Acadapp.Visible = True
          Acadapp.WindowState = acMax
      If Err.Number <> 0 Then
          Set Acadapp = CreateObject("AutoCAD.Application.17")
          Acadapp.Documents.Add
          Acadapp.Visible = True
          Acadapp.WindowState = acMax
          Err.Clear
      End If
      '--------------------------------------
      '--------------------------------------
      Dim MTextObj As AcadMText
      Dim corner(0 To 2) As Double
      Dim width As Double
      Dim text As String
      corner(0) = 0
      corner(1) = 10
      corner(2) = 0
      width = 10
      text = "This is the String for the Mtext Object"
      Set MTextObj = Acadapp.ActiveDocument.ModelSpace.AddMText(corner, width, text)
      Acadapp.ZoomExtents
  End Sub
```
[FONT=&quot] [/FONT][FONT=&quot][/FONT] *[FONT=&quot]شرح الكود السابق :[/FONT]*
[FONT=&quot]1 - القسم الأول من الكود لفتح ملف أتوكاد موجود أو ملف جديد وقد شرحنا هذه الطريقة بالتفصيل في دروس سابقة وأنا حريص على تكراره في مطلع كل كود فقط للتنبيه . ويمكن الاستغناء عنه ولكن يجب أولا الضغط على زر فتح ملف رسومي جديد [/FONT]
OpenNewDrawing .
[FONT=&quot]2 – تم تعريف عنصر اسمه مثلاً [/FONT]MTextObj[FONT=&quot] على أنه نص متعدد في اتوكاد .[/FONT]
[FONT=&quot]3- تم تعريف متحول اسمه [/FONT]corner[FONT=&quot] لتخزين إحداثيات نقطة إدراج النص [/FONT]InsertionPoint[FONT=&quot] وهي تمثل إحداثيات الزاوية العلوية اليسارية للإطار المستطيل المحيط بالنص المتعدد .[/FONT]
[FONT=&quot]4- تم تعريف متحول اسمه [/FONT]width[FONT=&quot] لتخزين عرض الإطار السابق .[/FONT]
[FONT=&quot]5- تم تعريف متحول اسمه [/FONT]text[FONT=&quot] لتخزين المحتوى الفعلي للنص المتعدد .[/FONT]
[FONT=&quot]تم بعد ذلك إعطاء قيم للمتغيرات السابقة وإسناد هذه القيم إلى العنصر[/FONT] MTextObj[FONT=&quot]من خلال تعليمة[/FONT] Set [FONT=&quot]باستخدام الوظيفة[/FONT] AddMText .[FONT=&quot].[/FONT]
[FONT=&quot]تستطيع تجريب ما قمنا به بالضغط على زر[/FONT] AddMText [FONT=&quot]ولاحظ النتيجة[/FONT] .[FONT=&quot][/FONT]


----------



## Hossam-am (26 ديسمبر 2011)

*خصائص النص المتعدد*

*[FONT=&quot]أهم خصائص النص المتعدد [/FONT]**Mtext**[FONT=&quot] :[/FONT]*​ [FONT=&quot]للعنصر الرسومي السابق مجموعة من الخصائص يمكن التحكم بها أو معرفتها من خلال الكود على الشكل التالي :[/FONT]
[FONT=&quot]1- الخاصية[/FONT] BackgroundFill [FONT=&quot] وهي تحدد ما إذا كانت خلفية الإطار المستطيل المغلف للنص المتعدد مليئة أو شفافة . لتجريب تأثير هذه الخاصية سنقوم برسم دائرة تتقاطع مع النص المتعدد السابق ونجعل الخاصية السابقة [/FONT]False[FONT=&quot] حيث نضيف للكود السابق الأسطر اللازمة لرسم دائرة (يجب رسم الدائرة قبل رسم النص المتعدد لكي يظهر التأثير) يصبح الكود السابق على الشكل التالي :[/FONT]

```
Private Sub Command16_Click()
     On Error Resume Next
          Set Acadapp = GetObject(, "AutoCAD.Application.17")
          Acadapp.Documents.Add
          Acadapp.Visible = True
          Acadapp.WindowState = acMax
      If Err.Number <> 0 Then
          Set Acadapp = CreateObject("AutoCAD.Application.17")
          Acadapp.Documents.Add
          Acadapp.Visible = True
          Acadapp.WindowState = acMax
          Err.Clear
      End If
      '--------------------------------------
      Dim circleObj As AcadCircle
      Dim CircleReference(0 To 2) As Double
      Dim radius As Double
      CircleReference(0) = 0
      CircleReference(1) = 0
      CircleReference(2) = 0
      radius = 5
  [LEFT]    Set circleObj = Acadapp.ActiveDocument.ModelSpace.AddCircle(CircleReference, radius)[/LEFT]
      '--------------------------------------
      Dim MTextObj As AcadMText
      Dim corner(0 To 2) As Double
      Dim width As Double
      Dim text As String
      corner(0) = 0
      corner(1) = 10
      corner(2) = 0
      width = 10
      text = "This is the String for the Mtext Object"
  [LEFT]    Set MTextObj = Acadapp.ActiveDocument.ModelSpace.AddMText(corner, width, text)[/LEFT]
      Acadapp.ZoomExtents
      '--------------------------------------
      MTextObj.BackgroundFill = True
  End Sub
```
[FONT=&quot] [/FONT] [FONT=&quot]قم بتجريب الكود السابق ولاحظ النتيجة . قم بعد ذلك بتغيير السطر الأخير في الكود ليصبح على الشكل التالي ولاحظ النتيجة :[/FONT]
[FONT=&quot] [/FONT]

```
MTextObj.BackgroundFill = False
```
 [FONT=&quot]وهذه الخاصية للقراءة والكتابة .[/FONT]
[FONT=&quot] [/FONT]
[FONT=&quot]2- الخاصية[/FONT] Height [FONT=&quot]: وهي تسمح بالتحكم بارتفاع النص وفقاً للوحدات المعتمدة في الرسم وهي للقراءة والكتابة فيمكن قراءة ارتفاع النص المتعدد الذي قمنا بإدراجه سابقاً كما يلي :[/FONT]

```
Dim oldheight As Double
  oldheight = MTextObj.Height
```
[FONT=&quot][/FONT] [FONT=&quot]كما يمكن تغيير ارتفاع النص السابق كما يلي :[/FONT]

```
MTextObj.Height = 5
```
 
[FONT=&quot]3- الخاصية [/FONT] LineSpacingDistance[FONT=&quot]: وهي تسمح بالتحكم بالمسافة الشاقولية التي تحدد التباعد بين أسطر النص المتعدد وفقاً للوحدات المعتمدة في الرسم وهي للقراءة والكتابة فيمكن قراءة قيمة هذا التباعد للنص المتعدد الذي قمنا بإدراجه سابقاً كما يلي :[/FONT]
[FONT=&quot] [/FONT]

```
Dim CurrentDistance As Double
  CurrentDistance = MTextObj.LineSpacingDistance
```
[FONT=&quot][/FONT] [FONT=&quot] [/FONT]
[FONT=&quot]كما يمكن تغيير قيمة هذا التباعد كما يلي :[/FONT]

```
MTextObj.LineSpacingDistance = 15
  CurrentDistance = MTextObj.LineSpacingDistance
```
 [FONT=&quot]4- الخاصية [/FONT] LineSpacingFactor[FONT=&quot]: قيمة العامل الذي تضرب قيمته بقيمة المسافة الشاقولية بين الأسطر والتي تم التحدث عنها سابقاً . فلمعرفة قيمة هذا العامل للنص المتعدد الذي قمنا بإدراجه سابقاً نكتب :[/FONT]
[FONT=&quot] [/FONT]

```
Dim currFactor As Double
  currFactor = MTextObj.LineSpacingFactor
```
[FONT=&quot]ويمكن تغيير قيمة هذا العامل على الشكل :[/FONT]

```
MTextObj.LineSpacingFactor = 4
```
 
[FONT=&quot]5- الخاصية [/FONT]TextString[FONT=&quot] : وهي تعيد محتوى النص الذي تم إدراجه وتخزنه في متحول ليتم استخدامه في أماكن أخرى من البرنامج . فلمعرفة محتوى النص المتعدد الذي قمنا بإدراجه سابقاً نكتب :[/FONT]

```
Dim MtextString As String
  MtextString = MTextObj.TextString
```
 [FONT=&quot]كما يمكن تغيير قيمة هذا النص كما يلي :[/FONT]

```
MTextObj.TextString = "Hello World"
```
 
[FONT=&quot]6- الخاصية [/FONT]width [FONT=&quot]: وهي تعيد قيمة عرض الإطار المستطيل المغلف للنص الذي تم إدراجه وتخزنه في متحول ليتم استخدامه في أماكن أخرى من البرنامج . فلمعرفة قيمة هذا العرض للنص السابق نكتب :[/FONT]

```
Dim currWidth As Double
  currWidth = MTextObj.width
```
[FONT=&quot][/FONT] [FONT=&quot]كما يمكن تغيير قيمة هذا العرض كما يلي :[/FONT]

```
MTextObj.width = 100
```
[FONT=&quot][/FONT]
[FONT=&quot]جرب الكود ثم حدد النص في شاشة الرسم ولاحظ كيف تغيرت قيمة العرض .[/FONT]
[FONT=&quot] [/FONT]
[FONT=&quot]7- بقي أن نتحدث عن خاصية مهمة جدا وهي [/FONT]StyleName[FONT=&quot] حيث تعيد هذه الخاصية إسم النمط النصي الذي تم كتابة النص به وللتعرف على هذه الخاصية نتعرف أولاً على خاصية مهمة هي خاصية إضافة نمط نصي جديد وتتم بإضافة الأسطر التالية للكود السابق :[/FONT]

```
Dim newText As AcadTextStyle
  Set newText = Acadapp.ActiveDocument.TextStyles.Add("VB4arab")
   newText.Height = 0.5
  newText.fontFile = "C:/AutoCAD/Fonts/italic.shx"
  MTextObj.StyleName = "Hello World"
```
 [FONT=&quot]نقوم أولاً بتعريف عنصر [/FONT]newText[FONT=&quot] على أنه نمط نصي في أتوكاد . ثم نقوم بإنشاء نمط نصي جديد وليكن اسمه [/FONT]"VB4arab"[FONT=&quot] من خلال وظيفة [/FONT]Set[FONT=&quot] . نقوم بعد ذلك بتعديل خصائص هذا النمط من خلال إعطاء قيمة للارتفاع من خلال خاصية [/FONT]Height[FONT=&quot] وتحديد مسار الفونت الذي سيعتمد في هذا النمط من خلال خاصية [/FONT]fontFile[FONT=&quot] . نقوم بعد ذلك بتغيير خاصية [/FONT]StyleName[FONT=&quot] للنص المتعدد بحيث تصبح [/FONT]"VB4arab"[FONT=&quot] كما هو مبين في السطر الأخير من هذا البرنامج .[/FONT]
[FONT=&quot]نتابع في درس آخر إن شاء الله[/FONT]
[FONT=&quot]دمتم بخير[/FONT]
[FONT=&quot]م.حسام
[/FONT]


----------



## Hossam-am (26 ديسمبر 2011)

*التعامل مع التهشير Hatch*

*[FONT=&quot]التعامل مع التهشير[/FONT]*​ *Hatch**[FONT=&quot][/FONT]*​ [FONT=&quot]بسم الله الرحم الرحيم ...[/FONT]
[FONT=&quot]سنقوم في هذا الدرس بإذن الله بشرح طريقة إضافة تهشير إلى عنصر أو مجموعة عناصر تشكل حيزاً مغلقاً قابلاً للتهشير في الملف الرسومي .[/FONT]
[FONT=&quot]الصيغة العامة لإضافة تهشير هي :[/FONT]

```
RetVal = object.AddHatch(PatternType, PatternName, Associativity [, HatchObjectType])
```
 [FONT=&quot]حيث أن الخيار بين قوسين [/FONT][HatchObjectType][FONT=&quot] يعني أن هذا الخيار افتراضي [/FONT]
[FONT=&quot]الصيغة السابقة تعتمد الوظيفة [/FONT]AddHatch[FONT=&quot] لإضافة تهشير إلى الملف الرسومي وتعتمد مجموعة من المتغيرات وهي :[/FONT]
[FONT=&quot]1- [/FONT]PatternType [FONT=&quot]: نمط نقش التهشير وهي تأخذ إحدى القيم التالية :[/FONT]
[FONT=&quot] - [/FONT]acHatchPatternTypePredefined[FONT=&quot] : وهي اختيار نمط التهشير من الأنماط الموجودة في الملف [/FONT]_acad.pat _[FONT=&quot]المرفق مع برنامج الأوتوكاد ويكون محملاً أصلاً مع البرنامج .[/FONT]
[FONT=&quot]- [/FONT]acHatchPatternTypeUserDefined[FONT=&quot] : وهي اختيار نمط التهشير بحيث يكون على شكل خطوط محددة التباعد وتكون إما مستمرة أو منقطة حسب نمط الخط [/FONT]LineType[FONT=&quot] الحالي المستخدم وتميل بزاوية محددة يمكن تغييرها .[/FONT]
[FONT=&quot]- [/FONT]acHatchPatternTypeCustomDefined[FONT=&quot] : وهي اختيار نمط التهشير من الأنماط الموجودة في ملف بصيغة [/FONT]PAT[FONT=&quot] مختلف عن الملف [/FONT]_acad.pat _[FONT=&quot]المرفق مع برنامج الأوتوكاد .[/FONT]
[FONT=&quot]- [/FONT]acPreDefinedGradient[FONT=&quot] : وهي اختيار نمط التهشير بحيث يكون مصمت بلون متدرج أو لونين متدرجين وسنشرح هذا النمط مفصلاً لاحقاً .[/FONT]
2[FONT=&quot]- [/FONT]PatternName[FONT=&quot] : إسم نقش التهشير ويختلف من نمط إلى آخر فمثلاً في النمط [/FONT]acHatchPatternTypePredefined[FONT=&quot] يمكن اختيار النقوش بالأسماء التالية مثلاً: [/FONT]
ANSI31[FONT=&quot] - [/FONT]ANSI32[FONT=&quot] .... [/FONT]ANSI38[FONT=&quot] – [/FONT]BOX[FONT=&quot] – [/FONT]BRASS[FONT=&quot] .... إلخ [/FONT]
[FONT=&quot]وفي النط [/FONT]acPreDefinedGradient[FONT=&quot] يمكن اختيار النقوش بالأسماء التالية :[/FONT]

```
LINEAR , CYLINDER , INVCYLINDER , SPHERICAL HEMISPHERICAL , CURVED , INVSPHERICAL , INVHEMISPHERICAL , or INVCURVED.
```
[FONT=&quot][/FONT]
3[FONT=&quot]- [/FONT]Associativity[FONT=&quot] : اختيار ما إذا كان نقش التهشير مترابطا مع حدود منطقة التهشير أم لا وهو يأخذ قيمتين [/FONT]TRUE[FONT=&quot] أو [/FONT]FALSE[FONT=&quot] فإذا كانت قيمته [/FONT]True[FONT=&quot] معنى ذلك أن أي تعديل على حد منطقة التهشير سيتبعه تعديل النقش بشكل يتناسب مع شكل حد المنطقة الجديد .[/FONT]
[FONT=&quot]4- [/FONT]HatchObjectType[FONT=&quot] : هذا العامل اختياري ويحدد ما إذا كان نمط التهشير كلاسيكي [/FONT]AcHatchObject [FONT=&quot]أو متدرج اللون [/FONT]AcGradientObject [FONT=&quot]وسنقوم بشرحها مفصلاً في مثال مستقل .[/FONT]
[FONT=&quot]بعد تعريف عنصر التهشير يجب تعريف حدود المناطق التي سيطبق عليها التهشير وهنا يجب أن نعرف حدود المنطقة الخارجية [/FONT]OuterLoop[FONT=&quot] وحدود المنطقة الداخلية [/FONT]InnerLoop[FONT=&quot] ويتم ذلك من خلال الخاصيتين [/FONT]AppendOuterLoop[FONT=&quot] و [/FONT]AppendInnerLoop[FONT=&quot] اللتان سنشرحهما في موضعهما .[/FONT]
*[FONT=&quot]الآن لننتقل إلى التطبيق :[/FONT]*
[FONT=&quot]لنفرض لدينا خمسة خطوط تشكل مضلعاً مغلقاً وهي [/FONT]Line1[FONT=&quot] و [/FONT]Line2[FONT=&quot] و [/FONT]Line3[FONT=&quot] و [/FONT] Line4[FONT=&quot] و [/FONT] Line5[FONT=&quot] وهذا المضلع المغلق يمثل الحد الخارجي لمنطقة التهشير . كما نفترض وجود دائرتين [/FONT]Circle1[FONT=&quot] و [/FONT]Circle2[FONT=&quot] تقعان داخل هذا المضلع تمثلان الحد الداخلي لمنطقة التهشير . والمطلوب تهشير المنطقة الواقعة بين المضلع والدائرتين .[/FONT]
[FONT=&quot]الآن قم بعمل زر [/FONT]Command17[FONT=&quot] وأضفه للفورم وقم بتغيير خاصية [/FONT]caption[FONT=&quot] ليصبح [/FONT](AddHatch)[FONT=&quot] .[/FONT]
[FONT=&quot]- في حدث النقر على الزر [/FONT]Command17[FONT=&quot] نكتب الكود التالي :[/FONT]

```
Private Sub Command17_Click()
      On Error Resume Next
          Set Acadapp = GetObject(, "AutoCAD.Application.17")
          Acadapp.Documents.Add
          Acadapp.Visible = True
          Acadapp.WindowState = acMax
      If Err.Number <> 0 Then
          Set Acadapp = CreateObject("AutoCAD.Application.17")
          Acadapp.Documents.Add
          Acadapp.Visible = True
          Acadapp.WindowState = acMax
          Err.Clear
      End If
      '---------------------------------------------------------
      '---------------------------------------------------------
      'رسم الخطوط
      Dim Line1 As acadLine: Dim Line2 As acadLine: Dim Line3 As acadLine
      Dim Line4 As acadLine: Dim Line5 As acadLine
      Dim StartPt(2) As Double
      Dim EndPt(2) As Double
      StartPt(0) = 2: StartPt(1) = 2: StartPt(2) = 0
      EndPt(0) = 1: EndPt(1) = 5: EndPt(2) = 0
      Set Line1 = Acadapp.ActiveDocument.ModelSpace.AddLine(StartPt, EndPt)
      StartPt(0) = 1: StartPt(1) = 5: StartPt(2) = 0
      EndPt(0) = 3: EndPt(1) = 8: EndPt(2) = 0
      Set Line2 = Acadapp.ActiveDocument.ModelSpace.AddLine(StartPt, EndPt)
      StartPt(0) = 3: StartPt(1) = 8: StartPt(2) = 0
      EndPt(0) = 7: EndPt(1) = 8: EndPt(2) = 0
      Set Line3 = Acadapp.ActiveDocument.ModelSpace.AddLine(StartPt, EndPt)
      StartPt(0) = 7: StartPt(1) = 8: StartPt(2) = 0
      EndPt(0) = 8: EndPt(1) = 4: EndPt(2) = 0
      Set Line4 = Acadapp.ActiveDocument.ModelSpace.AddLine(StartPt, EndPt)
      StartPt(0) = 8: StartPt(1) = 4: StartPt(2) = 0
      EndPt(0) = 2: EndPt(1) = 2: EndPt(2) = 0
      Set Line5 = Acadapp.ActiveDocument.ModelSpace.AddLine(StartPt, EndPt)
      '-----------------------------------------------------------------------
      '-----------------------------------------------------------------------
      'رسم الدوائر
      Dim Circle1 As AcadCircle
      Dim Circle2 As AcadCircle
      Dim CircleCenter(2) As Double
      Dim CircleRadius As Double
      CircleCenter(0) = 5
      CircleCenter(1) = 6
      CircleCenter(2) = 0
      CircleRadius = 1.5
      Set Circle1 = Acadapp.ActiveDocument.ModelSpace.AddCircle(CircleCenter, CircleRadius)
      CircleCenter(0) = 3
      CircleCenter(1) = 4
      CircleCenter(2) = 0
      CircleRadius = 1
      Set Circle2 = Acadapp.ActiveDocument.ModelSpace.AddCircle(CircleCenter, CircleRadius)
      '-----------------------------------------------------------------------
      '-----------------------------------------------------------------------
      'تعريف عنصر التهشير
      Dim HatchObj As AcadHatch
      Dim PatternType As Long
      Dim patternName As String
      Dim bAssociativity As Boolean
      PatternType = acHatchPatternTypePreDefined
      patternName = "ANSI31"
      bAssociativity = True
      Set HatchObj = Acadapp.ActiveDocument.ModelSpace.AddHatch(PatternType, patternName, bAssociativity, acHatchObject)
      '-----------------------------------------------------
      '-----------------------------------------------------
      ' تعريف حدود منطقة التهشير
      Dim outerLoop(0 To 4) As AcadEntity
      Dim InerLoop1(0 To 0) As AcadEntity
      Dim InerLoop2(0 To 0) As AcadEntity
      Set outerLoop(0) = Line1
      Set outerLoop(1) = Line2
      Set outerLoop(2) = Line3
      Set outerLoop(3) = Line4
      Set outerLoop(4) = Line5
      Set InerLoop1(0) = Circle1
      Set InerLoop2(0) = Circle2
      HatchObj.AppendOuterLoop (outerLoop)
      HatchObj.AppendInnerLoop (InerLoop1)
      HatchObj.AppendInnerLoop (InerLoop2)
      HatchObj.PatternScale = 0.1
      HatchObj.Evaluate
      '-----------------------------------------------------
      '-----------------------------------------------------
      Acadapp.ZoomExtents
      Acadapp.ActiveDocument.Regen acAllViewports
  End Sub
```


----------



## Hossam-am (26 ديسمبر 2011)

*تابع التعامل مع التهشير*

*[FONT=&quot]الشرح :[/FONT]*
[FONT=&quot]1- نقوم في القسم الأول من الكود برسم مجموعة من الخطوط التي تشكل مضلعاً مغلقاً وهي [/FONT]Line1[FONT=&quot] و [/FONT]Line2[FONT=&quot] و [/FONT]Line3[FONT=&quot] و [/FONT] Line4[FONT=&quot] وقد تم شرح طريقة رسم الخط في أتوكاد سابقاً .[/FONT]
[FONT=&quot]2- نقوم في القسم الثاني من الكود برسم دائرتين [/FONT]Circle1[FONT=&quot] و [/FONT]Circle2[FONT=&quot] تقعان داخل هذا المضلع تمثلان الحد الداخلي لمنطقة التهشير وقد تم شرح طريقة رسم الدائرة في أتوكاد سابقاً.[/FONT]
[FONT=&quot]3- في القسم الثالث من الكود نقوم بتعريف عنصر [/FONT]HatchObj[FONT=&quot] على أنه كائن تهشير في أتوكاد ونعرف متحول نسميه [/FONT]PatternType[FONT=&quot] ونعطيه القيمة [/FONT]acHatchPatternTypePreDefined [FONT=&quot] أي أننا اخترنا نمط التهشير من الأنماط المرفقة مع أتوكاد في الملف [/FONT]_acad.pat _[FONT=&quot]. ثم نعرف متحولاً نسميه [/FONT]patternName[FONT=&quot] لنخزن فيه إسم نقش التهشير وليكن [/FONT]"ANSI31"[FONT=&quot] . ثم نعرف متحولاً نسميه [/FONT]bAssociativity[FONT=&quot] ونجعل قيمته تساوي [/FONT]True[FONT=&quot] لكي يرتبط نقش التهشير بحد المنطقة . نقوم بعد ذلك بإسناد هذه القيم إلى عنصر التهشير [/FONT]HatchObj[FONT=&quot] باستخدام الوظيفة [/FONT]Set[FONT=&quot] مع ملاحظة أننا أخترنا أن يكون التهشير من النوع الكلاسيكي [/FONT]acHatchObject[FONT=&quot] وليس متدرج اللون [/FONT]AcGradientObject[FONT=&quot] .[/FONT]
[FONT=&quot]4- نقوم في القسم الرابع من الكود بتعريف حدود منطقة التهشير كما يلي :[/FONT]
[FONT=&quot]- نعرف متحولاً اسمه [/FONT]outerLoop[FONT=&quot] على شكل مصفوفة أبعادها تساوي عدد الخطوط التي تمثل الحدود الخارجية لمنطقة التهشير ونقوم بإسناد هذه الخطوط إلى المصفوفة من خلال وظيفة [/FONT]Set[FONT=&quot] .[/FONT]
[FONT=&quot]- باعتبار لدينا دائرتين تمثلان منطقتين داخليتين منفصلتين لذلك نعرف متحولاً اسمه [/FONT]InerLoop1[FONT=&quot] نخزن فيه الدائرة الأولى [/FONT]Circle1[FONT=&quot] ونعرف متحولاً اسمه [/FONT] InerLoop2[FONT=&quot] نخزن فيه الدائرة الثانية [/FONT]Circle2[FONT=&quot] ويتم ذلك باستخدام الوظيفة [/FONT]Set[FONT=&quot] .[/FONT]
[FONT=&quot]- بقي أن نقوم بإضافة هذه الحدود إلى عنصر التهشير [/FONT]HatchObj[FONT=&quot] باستخدام الوظيفتين [/FONT]AppendOuterLoop[FONT=&quot] لإضافة الحدود الخارجية و [/FONT]AppendInnerLoop[FONT=&quot] لإضافة الحدود الداخلية .[/FONT]
[FONT=&quot]- نقوم بتعديل مقياس التهشير من خلال الخاصية [/FONT]PatternScale[FONT=&quot] لتصبح المعاينة أفضل .[/FONT]
[FONT=&quot]- في النهاية نقوم بتوليد التهشير بشكله النهائي باستخدام الوظيفة [/FONT]Evaluate[FONT=&quot] التي تعني (تطبيق) أو [/FONT]Apply[FONT=&quot] لتزويد عنصر التهشير بجميع القيم وإظهاره بشكله النهائي .[/FONT]
[FONT=&quot] [/FONT]
[FONT=&quot]الآن يمكنك تجريب الكود السابق ولاحظ النتيجة .[/FONT]


----------



## Hossam-am (27 ديسمبر 2011)

*ملفات الدروس pdf*

إليكم رابط لملف الدروس السابقة مجتمعة من 1 إلى 12 حيث أنها بصيغة PDF

http://www.4shared.com/rar/WxWdjW_Y/__PDF_2.html



وإليكم روابط الدروس السابقة بشكل منفصل

الدرس الأول :

http://www.4shared.com/office/TcUl6Xbp/__online.html

الدرس الثاني :

http://www.4shared.com/office/Gaao9zYp/__online.html

الدرس الثالث:

http://www.4shared.com/office/dA5boup0/__online.html

الدرس الرابع :

http://www.4shared.com/office/XHxQ-FjW/__online.html

الدرس الخامس :

http://www.4shared.com/office/2ChS67jV/__online.html

الدرس السادس :

http://www.4shared.com/office/OMY80gUD/__online.html

الدرس السابع :

http://www.4shared.com/office/lOlcbz_a/__online.html

الدرس الثامن:

http://www.4shared.com/office/j2OohGsY/__online.html

الدرس التاسع :

http://www.4shared.com/office/HrHcjI_s/__online.html

الدرس العاشر :

http://www.4shared.com/office/L85hT0W7/__online.html

الدرس الحادي عشر:

http://www.4shared.com/office/thnTrj6e/___online.html

الدرس الثاني عشر:

http://www.4shared.com/office/S61iChHN/___online.html





وإليكم رابط مشروع المثال بلغة فجوال بيزك :

http://www.4shared.com/rar/NMAUOAQA/__online.html


دمتم بخير


----------



## المهندس ابوعمر (27 ديسمبر 2011)

بارك الله فيك


----------



## Hossam-am (27 ديسمبر 2011)

سبحان الله


----------



## Hossam-am (29 ديسمبر 2011)

*إضافة تهشير متدرج اللون*

*[FONT=&quot]إضافة تهشير متدرج اللون[/FONT]*​ [FONT=&quot]سبق وأن ذكرنا سابقاً أنه يمكن إضافة تهشير متدرج اللون من خلال اختيار النمط [/FONT]acPreDefinedGradient [FONT=&quot] وقلنا أن في هذا النمط يمكن اختيار النقوش بالأسماء التالية :[/FONT]
LINEAR , CYLINDER , INVCYLINDER , SPHERICAL HEMISPHERICAL , CURVED , INVSPHERICAL , INVHEMISPHERICAL , or INVCURVED.[FONT=&quot][/FONT]
[FONT=&quot]كما أن الخيار [/FONT]HatchObjectType[FONT=&quot] في جملة إضافة التهشير يجب أن يكون مساوياً [/FONT]AcGradientObject[FONT=&quot] الذي يعبر عن النمط المتدرج .[/FONT]
[FONT=&quot]ولكن قبل الانتقال إلى التطبيق لنشرح بعض الخواص والوظائف ذات الصلة بهذا الموضوع وسنشرحها الآن بالتفصيل .[/FONT]
[FONT=&quot] [/FONT]
*[FONT=&quot]عنصر الألوان [/FONT]**AcCmColor**[FONT=&quot][/FONT]*​ [FONT=&quot]يعبر هذا العنصر عن الألوان في أوتوكاد . نستطيع استخدام هذا العنصر في تعريف الألوان وإنجاز بعض العمليات المتعلقة باللون على العناصر .[/FONT]
[FONT=&quot]فمثلاً يمكن تعريف عنصر وليكن أسمه مثلاً [/FONT]Col1[FONT=&quot] لكي يمثل عنصر الألوان السابق من خلال تعريفه أولاً على أنه عنصر ألوان في أتوكاد [/FONT]AcadAcCmColor[FONT=&quot] من خلال الجملة التالية :[/FONT]
[FONT=&quot] [/FONT]

```
Dim col1 As AcadAcCmColor
```
 
[FONT=&quot]ثم يتم إسناد العنصر [/FONT]*AcCmColor*[FONT=&quot] إلى العنصر السابق [/FONT]Col1[FONT=&quot] من خلال الوظيفة [/FONT]GetInterfaceObject[FONT=&quot] على الشكل التالي :[/FONT]
[FONT=&quot] [/FONT]

```
Set Col1 =AcadApplication.GetInterfaceObject("AutoCAD.AcCmColor.17")
```
 ​ [FONT=&quot]حيث [/FONT]AcadApplication[FONT=&quot] يعبر عن تطبيق الأوتوكاد ورقم 17 يعبر عن رقم الإصدار.[/FONT]
[FONT=&quot]ولعنصر الألوان السابق مجموعة من الخصائص من أهمها خاصية [/FONT]SetRGB[FONT=&quot] التي تحدد قيم الألوان الأحمر والأخضر والأزرق وشكلها العام :[/FONT]

```
object.SetRGB (Red, Green, Blue)
```
[FONT=&quot][/FONT]​ [FONT=&quot]أي لاستخدام هذه الخاصية لعنصر الألوان الذي عرفناه سابقاً [/FONT]Col1[FONT=&quot] نكتب :[/FONT]
[FONT=&quot] [/FONT]

```
[CENTER][CENTER]Call col1.SetRGB(255, 0, 0)[/CENTER][/CENTER]
```
[FONT=&quot] [/FONT]
[FONT=&quot] [/FONT]
[FONT=&quot] [/FONT]
*[FONT=&quot]الآن لنعود إلى إضافة التهشير المتدرج اللون والتطبيق العملي لهذه الطريقة [/FONT]*
[FONT=&quot]سنقوم بتعديل جزء من الكود السابق نفسه الذي استخدمنا فيه خمسة خطوط ودائرتين لإضافة تهشير متدرج اللون ولكن سيتم إنشاء زر منفصل لهذا الأمر وإعادة كتابة الكود السابق نفسه مع التعديل المطلوب :[/FONT]
[FONT=&quot]الآن قم بعمل زر [/FONT]Command18[FONT=&quot] وأضفه للفورم وقم بتغيير خاصية [/FONT]caption[FONT=&quot] ليصبح [/FONT](AddGradientHatch)[FONT=&quot] .[/FONT]
[FONT=&quot]- في حدث النقر على الزر [/FONT]Command18[FONT=&quot] نكتب الكود التالي :[/FONT]

```
Private Sub Command17_Click()
      On Error Resume Next
          Set Acadapp = GetObject(, "AutoCAD.Application.17")
          Acadapp.Documents.Add
          Acadapp.Visible = True
          Acadapp.WindowState = acMax
      If Err.Number <> 0 Then
          Set Acadapp = CreateObject("AutoCAD.Application.17")
          Acadapp.Documents.Add
          Acadapp.Visible = True
          Acadapp.WindowState = acMax
          Err.Clear
      End If
      '---------------------------------------------------------
      '---------------------------------------------------------
      'رسم الخطوط
      Dim Line1 As acadLine: Dim Line2 As acadLine: Dim Line3 As acadLine
      Dim Line4 As acadLine: Dim Line5 As acadLine
      Dim StartPt(2) As Double
      Dim EndPt(2) As Double
      StartPt(0) = 2: StartPt(1) = 2: StartPt(2) = 0
      EndPt(0) = 1: EndPt(1) = 5: EndPt(2) = 0
      Set Line1 = Acadapp.ActiveDocument.ModelSpace.AddLine(StartPt, EndPt)
      StartPt(0) = 1: StartPt(1) = 5: StartPt(2) = 0
      EndPt(0) = 3: EndPt(1) = 8: EndPt(2) = 0
      Set Line2 = Acadapp.ActiveDocument.ModelSpace.AddLine(StartPt, EndPt)
      StartPt(0) = 3: StartPt(1) = 8: StartPt(2) = 0
      EndPt(0) = 7: EndPt(1) = 8: EndPt(2) = 0
      Set Line3 = Acadapp.ActiveDocument.ModelSpace.AddLine(StartPt, EndPt)
      StartPt(0) = 7: StartPt(1) = 8: StartPt(2) = 0
      EndPt(0) = 8: EndPt(1) = 4: EndPt(2) = 0
      Set Line4 = Acadapp.ActiveDocument.ModelSpace.AddLine(StartPt, EndPt)
      StartPt(0) = 8: StartPt(1) = 4: StartPt(2) = 0
      EndPt(0) = 2: EndPt(1) = 2: EndPt(2) = 0
      Set Line5 = Acadapp.ActiveDocument.ModelSpace.AddLine(StartPt, EndPt)
      '-----------------------------------------------------------------------
      '-----------------------------------------------------------------------
      'رسم الدوائر
      Dim Circle1 As AcadCircle
      Dim Circle2 As AcadCircle
      Dim CircleCenter(2) As Double
      Dim CircleRadius As Double
      CircleCenter(0) = 5
      CircleCenter(1) = 6
      CircleCenter(2) = 0
      CircleRadius = 1.5
      Set Circle1 = Acadapp.ActiveDocument.ModelSpace.AddCircle(CircleCenter, CircleRadius)
      CircleCenter(0) = 3
      CircleCenter(1) = 4
      CircleCenter(2) = 0
      CircleRadius = 1
      Set Circle2 = Acadapp.ActiveDocument.ModelSpace.AddCircle(CircleCenter, CircleRadius)
      '-----------------------------------------------------------------------
      '-----------------------------------------------------------------------
      'تعريف عنصر التهشير
      Dim HatchObj As AcadHatch
      Dim PatternType As Long
      Dim patternName As String
      Dim bAssociativity As Boolean
      PatternType = acPreDefinedGradient '0
      patternName = "CYLINDER"
      bAssociativity = True
      Set HatchObj = Acadapp.ActiveDocument.ModelSpace.AddHatch(PatternType, patternName, bAssociativity, acGradientObject)
      Dim col1 As AcadAcCmColor
      Dim col2 As AcadAcCmColor
      Set col1 = AcadApplication.GetInterfaceObject("AutoCAD.AcCmColor.17")
      Set col2 = AcadApplication.GetInterfaceObject("AutoCAD.AcCmColor.17")
      Call col1.SetRGB(255, 0, 0)
      Call col2.SetRGB(0, 255, 0)
      HatchObj.GradientColor1 = col1
      HatchObj.GradientColor2 = col2
      '-----------------------------------------------------
      '-----------------------------------------------------
      ' تعريف حدود منطقة التهشير
      Dim outerLoop(0 To 4) As AcadEntity
      Dim InerLoop1(0 To 0) As AcadEntity
      Dim InerLoop2(0 To 0) As AcadEntity
      Set outerLoop(0) = Line1
      Set outerLoop(1) = Line2
      Set outerLoop(2) = Line3
      Set outerLoop(3) = Line4
      Set outerLoop(4) = Line5
      Set InerLoop1(0) = Circle1
      Set InerLoop2(0) = Circle2
      HatchObj.AppendOuterLoop (outerLoop)
      HatchObj.AppendInnerLoop (InerLoop1)
      HatchObj.AppendInnerLoop (InerLoop2)
      HatchObj.PatternScale = 0.1
      HatchObj.Evaluate
      '-----------------------------------------------------
      '-----------------------------------------------------
      Acadapp.ZoomExtents
      Acadapp.ActiveDocument.Regen acAllViewports
  End Sub
```
[FONT=&quot] [/FONT]
*[FONT=&quot]الشرح :[/FONT]*
[FONT=&quot]1- نقوم في القسم الأول من الكود برسم مجموعة من الخطوط التي تشكل مضلعاً مغلقاً وهي [/FONT]Line1[FONT=&quot] و [/FONT]Line2[FONT=&quot] و [/FONT]Line3[FONT=&quot] و [/FONT] Line4[FONT=&quot] وقد تم شرح طريقة رسم الخط في أتوكاد سابقاً .[/FONT]
[FONT=&quot]2- نقوم في القسم الثاني من الكود برسم دائرتين [/FONT]Circle1[FONT=&quot] و [/FONT]Circle2[FONT=&quot] تقعان داخل هذا المضلع تمثلان الحد الداخلي لمنطقة التهشير وقد تم شرح طريقة رسم الدائرة في أتوكاد سابقاً.[/FONT]
[FONT=&quot]3- في القسم الثالث من الكود نقوم بتعريف عنصر [/FONT]HatchObj[FONT=&quot] على أنه كائن تهشير في أوتوكاد ونعرف متحول نسميه [/FONT]PatternType[FONT=&quot] ونعطيه القيمة [/FONT]acPreDefinedGradient [FONT=&quot] أي أننا اخترنا نمط التهشير متدرج اللون[/FONT] [FONT=&quot]. ثم نعرف متحولاً نسميه [/FONT]patternName[FONT=&quot] لنخزن فيه إسم نقش التهشير من النقوش الخاصة بهذا النمط وليكن [/FONT]"CYLINDER"[FONT=&quot] . ثم نعرف متحولاً نسميه [/FONT]bAssociativity[FONT=&quot] ونجعل قيمته تساوي [/FONT]True[FONT=&quot] لكي يرتبط نقش التهشير بحد المنطقة .[/FONT]
[FONT=&quot]نقوم بعد ذلك بإسناد هذه القيم إلى عنصر التهشير [/FONT]HatchObj[FONT=&quot] باستخدام الوظيفة [/FONT]Set[FONT=&quot] مع ملاحظة أننا أخترنا أن يكون التهشير من النوع المتدرج اللون [/FONT]AcGradientObject[FONT=&quot] وليس كلاسيكي [/FONT] acHatchObject[FONT=&quot].[/FONT]
[FONT=&quot]نقوم بعد ذلك بتعريف عنصرين [/FONT]col1[FONT=&quot] و [/FONT] col2[FONT=&quot] على أنهما يعبران عن اللون كما في السطور التالية :[/FONT]

```
Dim col1 As AcadAcCmColor
  Dim col2 As AcadAcCmColor
```
[FONT=&quot] [/FONT]
[FONT=&quot]ثم نقوم إسناد العنصر [/FONT]*AcCmColor*[FONT=&quot] إلى كل من العنصرين السابقين [/FONT]Col1[FONT=&quot] و [/FONT]Col2[FONT=&quot] من خلال الوظيفة [/FONT]GetInterfaceObject[FONT=&quot] على الشكل التالي :[/FONT]

```
Set col1 = AcadApplication.GetInterfaceObject("AutoCAD.AcCmColor.17")
  Set col2 = AcadApplication.GetInterfaceObject("AutoCAD.AcCmColor.17")
```
[FONT=&quot]نقوم بعد ذلك بتحديد قيم الألوان لكل من العنصرين [/FONT]col1[FONT=&quot] و [/FONT]col2[FONT=&quot] من خلال خاصية [/FONT]SetRGB[FONT=&quot] على الشكل التالي :
[/FONT]

```
Call col1.SetRGB(255, 0, 0)
  Call col2.SetRGB(0, 255, 0)
```
[FONT=&quot]نقوم بعد ذلك باستخدام إحدى خواص عنصر التهشير وهي [/FONT]GradientColor1[FONT=&quot] و [/FONT]GradientColor2[FONT=&quot] حيث نسند عنصري الألوان السابقين [/FONT]col1[FONT=&quot] و [/FONT]col2[FONT=&quot] إلى عنصر التهشير من خلال هاتين الخاصيتين على الشكل التالي :[/FONT]

```
HatchObj.GradientColor1 = col1
  HatchObj.GradientColor2 = col2
```
[FONT=&quot]4- نقوم في القسم الرابع من الكود بتعريف حدود منطقة التهشير كما يلي :[/FONT]
[FONT=&quot]- نعرف متحولاً اسمه [/FONT]outerLoop[FONT=&quot] على شكل مصفوفة أبعادها تساوي عدد الخطوط التي تمثل الحدود الخارجية لمنطقة التهشير ونقوم بإسناد هذه الخطوط إلى المصفوفة من خلال وظيفة [/FONT]Set[FONT=&quot] .[/FONT]
[FONT=&quot]- باعتبار لدينا دائرتين تمثلان منطقتين داخليتين منفصلتين لذلك نعرف متحولاً اسمه [/FONT]InerLoop1[FONT=&quot] نخزن فيه الدائرة الأولى [/FONT]Circle1[FONT=&quot] ونعرف متحولاً اسمه [/FONT] InerLoop2[FONT=&quot] نخزن فيه الدائرة الثانية [/FONT]Circle2[FONT=&quot] ويتم ذلك باستخدام الوظيفة [/FONT]Set[FONT=&quot] .[/FONT]
[FONT=&quot]- بقي أن نقوم بإضافة هذه الحدود إلى عنصر التهشير [/FONT]HatchObj[FONT=&quot] باستخدام الوظيفتين [/FONT]AppendOuterLoop[FONT=&quot] لإضافة الحدود الخارجية و [/FONT]AppendInnerLoop[FONT=&quot] لإضافة الحدود الداخلية .[/FONT]
[FONT=&quot]- نقوم بتعديل مقياس التهشير من خلال الخاصية [/FONT]PatternScale[FONT=&quot] لتصبح المعاينة أفضل .[/FONT]
[FONT=&quot]- في النهاية نقوم بتوليد التهشير بشكله النهائي باستخدام الوظيفة [/FONT]Evaluate[FONT=&quot] التي تعني (تطبيق) أو [/FONT]Apply[FONT=&quot] لتزويد عنصر التهشير بجميع القيم وإظهاره بشكله النهائي .[/FONT]
[FONT=&quot]الآن يمكنك تجريب الكود السابق ولاحظ النتيجة .[/FONT]

[FONT=&quot][/FONT]
[FONT=&quot]وإليكم الدرس الثالث عشر بصيغة PDF :[/FONT]
http://www.4shared.com/office/MDXAkDpd/___online.html
[FONT=&quot] [/FONT]
​


----------



## Hossam-am (30 ديسمبر 2011)

*خصائص عنصر التهشير*

*[FONT=&quot]خصائص عنصر التهشير :[/FONT]*​ [FONT=&quot]للعنصر الرسومي السابق مجموعة من الخصائص يمكن التحكم بها أو معرفتها من خلال الكود على الشكل التالي :[/FONT]
[FONT=&quot]1- الخاصية [/FONT] Area[FONT=&quot] وهي تعيد مساحة السطح المهشر . للحصول عليها نكتب :[/FONT]
[FONT=&quot] [/FONT]

```
Dim HatchArea As Double
  HatchArea = HatchObj.Area
```
 [FONT=&quot]وهذه الخاصية للقراءة فقط أي يمكن المساحة لكن لا يمكن تغييرها بإسناد قيمة لهذه الخاصية .[/FONT]
[FONT=&quot]2- الخاصية[/FONT]  AssociativeHatch [FONT=&quot] وهذه الخاصية تحدد فيما إذا كان التهشير مرتبطاً مع حد منطقة التهشير أو لا . وهي للقراءة والكتابة أي يمكن معرفة ما إذا كان التهشير مترابطاً من خلال السطور التالية :[/FONT]
[FONT=&quot] [/FONT]

```
Dim Ass As Boolean
  Ass = HatchObj.AssociativeHatch
```
 [FONT=&quot]كما يمكن تغيير هذه الخاصية مباشرة لعنصر التهشير السابق من خلال كتابة السطر التالي :[/FONT]
[FONT=&quot] [/FONT]

```
HatchObj.AssociativeHatch = False
```
 
3[FONT=&quot]- الخاصية[/FONT] GradientAngle [FONT=&quot] وهي تحدد درجة الميل أو انحدار اللون المتدرج في حال استخدام التهشير متدرج اللون (مقدرة بالراديان) . وهذه الخاصية للقراءة والكتابة . فمثلاً لمعرفة درجة الميل للون المتدرج في المثال السابق ذكره الذي تم به استخدام تهشير متدرج اللون فإننا نضيف للكود السطور التالية :[/FONT]
[FONT=&quot] [/FONT]

```
Dim Angle As Double
  Angle = HatchObj.GradientAngle
```
 [FONT=&quot]وهنا نستطيع اختبار قيمة [/FONT]Angle[FONT=&quot] من خلال تتبع الكود فنجد أنها تساوي 0 . لتغيير هذه القيمة نضيف السطر التالي :[/FONT]
[FONT=&quot] [/FONT]

```
HatchObj.GradientAngle = 3.14 / 2
```
 
[FONT=&quot]قم بتجريب الكود ولاحظ النتيجة .[/FONT]
[FONT=&quot]4- الخاصية[/FONT] GradientCentered [FONT=&quot] وهي تحدد فيما إذا كان التهشير المتدرج اللون يبدأ بالتدرج انطلاقاً من المركز أو لا وهي تأخذ قيمتين [/FONT]True[FONT=&quot] أو [/FONT]False[FONT=&quot] . وهذه الخاصية للقراءة والكتابة . فمثلاً لمعرفة فيما إذا كان التهشير المتدرج اللون في المثال السابق يبدأ من المركز فإننا نضيف للكود السطور التالية :[/FONT]
[FONT=&quot] [/FONT]

```
Dim IsCentered As Boolean
  IsCentered = HatchObj.GradientCentered
```
 [FONT=&quot]وهنا نستطيع اختبار قيمة المتحول [/FONT]IsCentered [FONT=&quot] من خلال تتبع الكود فنجد أنها تساوي [/FONT]True[FONT=&quot] . لتغيير هذه القيمة نضيف السطر التالي :[/FONT]
[FONT=&quot] [/FONT]

```
HatchObj.GradientCentered = False
```
 
[FONT=&quot]قم بتجريب الكود ولاحظ النتيجة .[/FONT]
[FONT=&quot] [/FONT]
[FONT=&quot]5- الخاصيتان[/FONT] GradientColor1 [FONT=&quot]و [/FONT]GradientColor2[FONT=&quot] وقد تم شرحهما سابقاً من خلال إسنادهما لعنصر التهشير [/FONT]HatchObj[FONT=&quot] وجعلهما مساويتان للعنصرين [/FONT]Col1[FONT=&quot] و [/FONT]Col2[FONT=&quot] في المثال السابق . [/FONT]
[FONT=&quot]هاتين الخاصيتين أيضاً لهما مجموعة من الخصائص ، فمثلاً لإعادة قيم الألوان الأساسية المستخدمة في تدرج اللون الأول فإننا نضيف للكود السطور التالية :[/FONT]
[FONT=&quot] [/FONT]

```
Dim R, G, B As Double
  R = HatchObj.GradientColor1.Red
  G = HatchObj.GradientColor1.Green
  B = HatchObj.GradientColor1.Blue
```
 [FONT=&quot]وهنا نستطيع اختبار قيمة المتحولات [/FONT]R[FONT=&quot] و [/FONT]G[FONT=&quot] و [/FONT]B[FONT=&quot] من خلال تتبع الكود فنجد أنها تساوي القيم التي تم إدخالها في بداية المثال عندما استخدمنا العبارة[/FONT]

```
Call col1.SetRGB(255, 0, 0)
```
[FONT=&quot][/FONT]​​ 
6[FONT=&quot]- الخاصية [/FONT] GradientName[FONT=&quot] وهي تعيد إسم نمط التهشير متدرج اللون ويمكن أن يكون إحدى القيم التالية التي تم ذكرها سابقاً :[/FONT]

```
LINEAR , CYLINDER , INVCYLINDER , SPHERICAL HEMISPHERICAL , CURVED , INVSPHERICAL , INVHEMISPHERICAL , or INVCURVED.
```
[FONT=&quot][/FONT]
[FONT=&quot] [/FONT]
[FONT=&quot]وهذه الخاصية للقراءة والكتابة . فمثلاً لمعرفة إسم نمط التهشير متدرج اللون في المثال السابق فإننا نضيف للكود السطور التالية :[/FONT]
[FONT=&quot] [/FONT]

```
Dim Gradname As String
  Gradname = HatchObj.GradientName
```
 [FONT=&quot]وهنا نستطيع اختبار قيمة المتحول [/FONT]Gradname [FONT=&quot] من خلال تتبع الكود فنجد أنها تساوي [/FONT] "CYLINDER"[FONT=&quot]وهو الاسم الذي تم إعطاؤه لعنصر التهشير المتدرج في المثال السابق . لتغيير هذه القيمة نضيف السطر التالي :[/FONT]
[FONT=&quot] [/FONT]

```
HatchObj.GradientName = "HEMISPHERICAL"
```
 [FONT=&quot]قم بتجريب الكود ولاحظ النتيجة .[/FONT]
[FONT=&quot] [/FONT]
[FONT=&quot]هناك مجموعة من الخصائص المتعلقة بالتشهير العادي وليس المتدرج نذكر منها :[/FONT]
1- [FONT=&quot]الخاصية [/FONT]PatternAngle[FONT=&quot] وهي للقراءة والكتابة وهي تعيد قيمة زاوية ميل خطوط التهشير مقدرة بالراديان ويمكن تغييرها من خلال الكود .[/FONT]
2- [FONT=&quot]الخاصية [/FONT]PatternName[FONT=&quot] وهي للقراءة والكتابة وهي تعيد إسم نمط التهشير مثلاً "[/FONT]ANSI31[FONT=&quot]" ويمكن تغييرها من خلال الكود .[/FONT]
3- [FONT=&quot]الخاصية [/FONT]PatternScale[FONT=&quot] وهي للقراءة والكتابة وهي تعيد قيمة مقياس التهشير ويمكن تغييرها من خلال الكود .[/FONT]
4- [FONT=&quot]الخاصية [/FONT]PatternSpace[FONT=&quot] وهي للقراءة والكتابة وهي تعيد قيمة التباعد بين خطوط التهشير ويمكن تغييرها من خلال الكود .[/FONT]
5- [FONT=&quot]الخاصية [/FONT]PatternType[FONT=&quot] وهي للقراءة فقط وهي تعيد نمط نقش التهشير المستخدم وهي تأخذ إحدى القيم التالية كما ذكرنا سابقاً:[/FONT]
[FONT=&quot] - [/FONT]acHatchPatternTypePredefined[FONT=&quot] [/FONT]
[FONT=&quot]- [/FONT]acHatchPatternTypeUserDefined[FONT=&quot] [/FONT]
[FONT=&quot]- [/FONT]acHatchPatternTypeCustomDefined


وإليكم الدرس الرابع عشر بصيغة PDF على الرابط
http://www.4shared.com/office/JUBbjn3c/___online.html​


----------



## Al Mohager (30 ديسمبر 2011)

بارك الله فيك و جزاك الله كل خير


----------



## Hossam-am (30 ديسمبر 2011)

ارجو ممن يتابعون الموضوع وضع اسئلتهم واستفساراتهم هنا في المنتدى لكي يستفيد منها كل الاعضاء 
ولكم الشكر


----------



## sameh_majeed (30 ديسمبر 2011)

غريب و عجيب و رهيب .... 
فله شمعه منوره 

​AfrikaansAlbanianArabicArmenianAzerbaijaniBasqueBelarusianBulgarianCatalanChinese (Simplified)Chinese (Traditional)CroatianCzechDanishDetect languageDutchEnglishEstonianFilipinoFinnishFrenchGalicianGeorgianGermanGreekHaitian CreoleHebrewHindiHungarianIcelandicIndonesianIrishItalianJapaneseKoreanLatinLatvianLithuanianMacedonianMalayMalteseNorwegianPersianPolishPortugueseRomanianRussianSerbianSlovakSlovenianSpanishSwahiliSwedishThaiTurkishUkrainianUrduVietnameseWelshYiddish*⇄*AfrikaansAlbanianArabicArmenianAzerbaijaniBasqueBelarusianBulgarianCatalanChinese (Simplified)Chinese (Traditional)CroatianCzechDanishDutchEnglishEstonianFilipinoFinnishFrenchGalicianGeorgianGermanGreekHaitian CreoleHebrewHindiHungarianIcelandicIndonesianIrishItalianJapaneseKoreanLatinLatvianLithuanianMacedonianMalayMalteseNorwegianPersianPolishPortugueseRomanianRussianSerbianSlovakSlovenianSpanishSwahiliSwedishThaiTurkishUkrainianUrduVietnameseWelshYiddishDetect language » Arabic​
​


----------



## Hossam-am (31 ديسمبر 2011)

*التعامل مع المناطق Region*

*[FONT=&quot]التعامل مع المناطق[/FONT]*​ *Region*​ [FONT=&quot]سنتحدث في هذا الدرس عن العنصر الرسومي [/FONT]Region[FONT=&quot] وهو عبارة عن منطقة في أتوكاد وسنشرح أهم الخصائص والطرق للتحكم في هذا العنصر .[/FONT]
[FONT=&quot]الصيغة العامة لإضافة منطقة في أتوكاد هي على الشكل التالي :[/FONT]
[FONT=&quot] [/FONT]

```
RetVal = Acadapp.ActiveDocument.ModelSpace..AddRegion(ObjectList)
```
[FONT=&quot][/FONT]
[FONT=&quot]حيث :[/FONT]
ObjectList[FONT=&quot] مصفوفة من العناصر التي تشكل حدود المنطقة .[/FONT]
RetVal[FONT=&quot] الناتج وهو عبارة عن عنصر منطقة في أتوكاد .[/FONT]
[FONT=&quot] [/FONT]
[FONT=&quot]لشرح هذا العنصر بشكل مبسط مع أهم خصائصه وطرق التحكم به سنقوم بشرح مثال عملي على كيفية إنشاء هذا العنصر وسنقوم باتباع أسلوب شرح مختلف حيث سنكتب جزء من الكود ونشرحه وهكذا ....[/FONT]
*[FONT=&quot]لننتقل إلى التطبيق :[/FONT]*
[FONT=&quot]أولاً[/FONT][FONT=&quot] - قم بعمل زر [/FONT]Command19[FONT=&quot] وأضفه للفورم وقم بتغيير خاصية [/FONT]caption[FONT=&quot] ليصبح [/FONT](AddRegion)[FONT=&quot] . ثم في حدث النقر على الزر [/FONT]Command19[FONT=&quot] نكتب الجزء الأول من الكود والخاص بتشغيل برنامج أتوكاد كما ذكرنا سابقاً على الشكل :[/FONT]
[FONT=&quot] [/FONT]

```
On Error Resume Next
          Set Acadapp = GetObject(, "AutoCAD.Application.17")
          Acadapp.Documents.Add
          Acadapp.Visible = True
          Acadapp.WindowState = acMax
      If Err.Number <> 0 Then
          Set Acadapp = CreateObject("AutoCAD.Application.17")
          Acadapp.Documents.Add
          Acadapp.Visible = True
          Acadapp.WindowState = acMax
          Err.Clear
      End If
```
 
[FONT=&quot]ثانياً[/FONT][FONT=&quot] – في القسم الثاني من الكود سنقوم برسم مجموعة من العناصر التي سنستخدمها لاحقاً في تشكيل المناطق حيث سنفترض أننا سنرسم ثلاثة مناطق وذلك على الشكل التالي :[/FONT]
[FONT=&quot]- نقوم أولاً برسم العناصر التي ستشكل حدود المنطقة الأولى وهي عبارة عن خطين [/FONT]line1[FONT=&quot] و[/FONT]Line2 [FONT=&quot] ومجمع خطوط [/FONT]plineObj1[FONT=&quot] *ودائرة *[/FONT]*Circle1* [FONT=&quot] ويتم ذلك بإضافة الكود التالي :[/FONT]

```
Dim Line1 As acadLine: Dim Line2 As acadLine
      Dim StartPt(2) As Double: Dim EndPt(2) As Double
      StartPt(0) = 160: StartPt(1) = 177: StartPt(2) = 0
      EndPt(0) = 216: EndPt(1) = 196: EndPt(2) = 0
      Set Line1 = Acadapp.ActiveDocument.ModelSpace.AddLine(StartPt, EndPt)
      StartPt(0) = 216: StartPt(1) = 196: StartPt(2) = 0
      EndPt(0) = 270: EndPt(1) = 146: EndPt(2) = 0
      Set Line2 = Acadapp.ActiveDocument.ModelSpace.AddLine(StartPt, EndPt)
      '-------------
      Dim plineObj1 As AcadLWPolyline
      Dim PLPoints1(0 To 7) As Double
      PLPoints1(0) = 270: PLPoints1(1) = 146
      PLPoints1(2) = 232: PLPoints1(3) = 124
      PLPoints1(4) = 190: PLPoints1(5) = 134
      PLPoints1(6) = 160: PLPoints1(7) = 177
      Set plineObj1 = Acadapp.ActiveDocument.ModelSpace.AddLightWeightPolyline(PLPoints1)
      '-------------
      Dim Circle1 As AcadCircle
      Dim CircleCenter1(2) As Double
      Dim CircleRadius1 As Double
      CircleCenter1(0) = 224
      CircleCenter1(1) = 157
      CircleCenter1(2) = 0
      CircleRadius1 = 15
      Set Circle1 = Acadapp.ActiveDocument.ModelSpace.AddCircle(CircleCenter1, CircleRadius1)
      '-------------
```
 
[FONT=&quot]- نقوم بعد ذلك برسم العناصر التي ستشكل حدود المنطقة الثانية وهي عبارة عن مجمع خطوط [/FONT]plineObj2[FONT=&quot] ويتم ذلك بإضافة الكود التالي :[/FONT]

```
Dim plineObj2 As AcadLWPolyline
      Dim PLPoints2(0 To 7) As Double
      PLPoints2(0) = 143: PLPoints2(1) = 201
      PLPoints2(2) = 203: PLPoints2(3) = 169
      PLPoints2(4) = 191: PLPoints2(5) = 95
      PLPoints2(6) = 127: PLPoints2(7) = 130
      Set plineObj2 = Acadapp.ActiveDocument.ModelSpace.AddLightWeightPolyline(PLPoints2)
      plineObj2.Closed = True
      '-------------
```
[FONT=&quot]- نقوم بعد ذلك برسم العناصر التي ستشكل حدود المنطقة الثالثة وهي عبارة عن دائرة [/FONT]Circle2[FONT=&quot] ويتم ذلك بإضافة الكود التالي :[/FONT]

```
Dim Circle2 As AcadCircle
      Dim CircleCenter2(2) As Double
      Dim CircleRadius2 As Double
      CircleCenter2(0) = 109
      CircleCenter2(1) = 128
      CircleCenter2(2) = 0
      CircleRadius2 = 51
      Set Circle2 = Acadapp.ActiveDocument.ModelSpace.AddCircle(CircleCenter2, CircleRadius2)
      '---------------------------------------------------------
```
[FONT=&quot]ثالثاً[/FONT][FONT=&quot] – في القسم الثالث من الكود سنقوم بتجميع العناصر الخاصة بكل منطقة ضمن مصفوفة تمثل هذه العناصر وذلك على الشكل التالي :[/FONT]
[FONT=&quot]- نعرف متحولاً اسمه [/FONT]Curves1[FONT=&quot] على أنه مصفوفة عناصر ونضيف له الخطين [/FONT]line1[FONT=&quot] و [/FONT]Line2[FONT=&quot] ومجمع الخطوط [/FONT]plineObj1[FONT=&quot] *والدائرة *[/FONT]*Circle1*[FONT=&quot] وذلك بإضافة السطور التالية :[/FONT]

```
Dim Curves1(0 To 3) As AcadEntity
      Set Curves1(0) = Line1
      Set Curves1(1) = Line2
      Set Curves1(2) = plineObj1
      Set Curves1(3) = Circle1
```
 [FONT=&quot]ثم نقوم بتعريف عنصر [/FONT]Reg1[FONT=&quot] على انه [/FONT]Variant[FONT=&quot] ونسند إليه مصفوفة العناصر السابقة على الشكل التالي :[/FONT]

```
Dim Reg1 As Variant
      Reg1 = Acadapp.ActiveDocument.ModelSpace.AddRegion(Curves1)
```
 [FONT=&quot]- بنفس الطريقة نعرف متحولاً اسمه [/FONT]Curves2[FONT=&quot] على أنه مصفوفة عناصر ونضيف له مجمع الخطوط [/FONT]plineObj2[FONT=&quot] وذلك بإضافة السطور التالية :[/FONT]

```
Dim Curves2(0) As AcadEntity
      Set Curves2(0) = plineObj2
```
[FONT=&quot]ثم نقوم بتعريف عنصر [/FONT]Reg2[FONT=&quot] على انه [/FONT]Variant[FONT=&quot] ونسند إليه مصفوفة العناصر السابقة على الشكل التالي :[/FONT]

```
Dim Reg2 As Variant
      Reg2 = Acadapp.ActiveDocument.ModelSpace.AddRegion(Curves2)
```
[FONT=&quot]- بنفس الطريقة نعرف متحولاً اسمه [/FONT]Curves3[FONT=&quot] على أنه مصفوفة عناصر ونضيف له الدائرة [/FONT]Circle2[FONT=&quot] وذلك بإضافة السطور التالية :[/FONT]

```
Dim Curves3(0) As AcadEntity
      Set Curves3(0) = Circle2
```
[FONT=&quot]ثم نقوم بتعريف عنصر [/FONT]Reg3[FONT=&quot] على انه [/FONT]Variant[FONT=&quot] ونسند إليه مصفوفة العناصر السابقة على الشكل التالي :[/FONT]

```
Dim Reg3 As Variant
      Reg3 = Acadapp.ActiveDocument.ModelSpace.AddRegion(Curves3)
```
[FONT=&quot] [/FONT]
[FONT=&quot]قم بتجريب الكود السابق حتى هذه المرحلة ولاحظ النتيجة .[/FONT]
*[FONT=&quot]نلاحظ أنه قد تم رسم أربعة مناطق في أتوكاد وليس ثلاثة مناطق ؟ والسبب أن مصفوفة العناصر [/FONT]**Curves1**[FONT=&quot] تحتوي على منطقتين مغلقتين تتشكلان من الخطين ومجمع الخطوط كمنطقة والدائرة [/FONT]**Circle1**[FONT=&quot] كمنطقة ثانية لذلك فإن المتحول [/FONT]**Reg1**[FONT=&quot] والذي تم تعريفه على أنه [/FONT]**Variant**[FONT=&quot] وتم إسناد مصفوفة العناصر له قد وجد منطقتين مغلقتين منفصلتين فقام برسمهما وهما مخزنتان ضمنه ونستطيع أن نعرف عدد المناطق المخزنة ضمن المتحول [/FONT]**Reg1**[FONT=&quot] من خلال الوظيفة [/FONT]**UBound**[FONT=&quot] فيكون عدد المناطق مساوياً .[/FONT]*
*UBound(Reg1) + 1*​ [FONT=&quot]الآن لاستخراج المناطق من داخل المتحولات السابقة [/FONT]Reg1[FONT=&quot] و [/FONT]Reg2[FONT=&quot] و[/FONT]Reg3[FONT=&quot] نقوم أولاً في قسم التصريحات العامة للبرنامج في الصفحة [/FONT]Module1[FONT=&quot] بتعريف متحولات ديناميكية متغيرة البعد على أنها مناطق في أتوكاد حيث نضيف السطور التالية :[/FONT]

```
Public regionObj1() As AcadRegion
  Public regionObj2() As AcadRegion
  Public regionObj3() As AcadRegion
```
[FONT=&quot]ثم نعود لنكمل الكود السابق وننتقل إلى القسم الرابع من الكود .[/FONT]
[FONT=&quot]رابعأ[/FONT][FONT=&quot] – في القسم الرابع من الكود سنقوم باستخراج المناطق ونضيف للكود السطور التالية :[/FONT]*[FONT=&quot][/FONT]*

```
ReDim regionObj1(0 To UBound(Reg1)) As AcadRegion
      ReDim regionObj2(0 To UBound(Reg2)) As AcadRegion
      ReDim regionObj3(0 To UBound(Reg3)) As AcadRegion
      For I = 0 To UBound(Reg1)
          Set regionObj1(I) = Reg1(I)
      Next I
      For I = 0 To UBound(Reg2)
          Set regionObj2(I) = Reg2(I)
      Next I
      For I = 0 To UBound(Reg3)
          Set regionObj3(I) = Reg3(I)
      Next I
```
[FONT=&quot]هنا تم التقاط المناطق من المتحولات [/FONT]Reg1[FONT=&quot] و [/FONT]reg2[FONT=&quot] و [/FONT]Reg3[FONT=&quot] وتخزينها في متحولات تشكل مناطق في أتوكاد وهي [/FONT]regionObj1[FONT=&quot] و [/FONT]regionObj2[FONT=&quot] و [/FONT]regionObj3[FONT=&quot] وهي تشكل مصفوات عدد عناصر المصفوفة [/FONT]regionObj1[FONT=&quot] هو إثنان فهي تحوي منطقتين وعدد عناصر المصفوفة [/FONT]regionObj2[FONT=&quot] واحد وتعبر عن منطقة واحدة وعدد عناصر المصفوفة [/FONT]regionObj3[FONT=&quot] واحد وتعبر عن منطقة واحدة .[/FONT]
[FONT=&quot]نستطيع بعد ذلك حذف العناصر الأساسية المشكلة للمناطق لعدم الحاجة لها بعد ذلك بإضافة السطور التالية للكود :[/FONT]

```
Line1.Delete
      Line2.Delete
      plineObj1.Delete
      plineObj2.Delete
      Circle1.Delete
      Circle2.Delete
```
[FONT=&quot]خامساً[/FONT][FONT=&quot] – سنقوم في القسم الخامس من الكود بعرض مجموعة من أهم الخصائص للعنصر الرسومي السابق وذلك على الشكل التالي :[/FONT]
[FONT=&quot]- الخاصية [/FONT]Area[FONT=&quot] وهي تعيد مساحة المنطقة . لتجريب هذه الخاصية قم بإضافة مربع نصوص إلى شاشة الفورم [/FONT]Text1[FONT=&quot] وأضف السطور التالية للكود :[/FONT]

```
Text1.text = regionObj1(0).Area
```
 [FONT=&quot]وهنا تم حساب مساحة المنطقة رقم 0 (الخطين ومجمع الخطوط) للعنصر [/FONT]regionObj1[FONT=&quot] وعرض هذه المساحة في مربع النص [/FONT]Text1[FONT=&quot] .[/FONT]
[FONT=&quot]- الخاصية [/FONT]Centroid[FONT=&quot] وهي تعيد إحداثيات مركز ثقل سطح المنطقة . لتجريب هذه الخاصية قم بإضافة مربعي نصوص إلى شاشة الفورم [/FONT]Text2[FONT=&quot] و [/FONT]Text3[FONT=&quot] وأضف السطور التالية للكود :[/FONT]

```
Dim CentroidObj As 
      CentroidObj = regionObj1(0).Centroid
      Text2.text = CentroidObj(0)
      Text3.text = CentroidObj(1)
```
[FONT=&quot]وهنا تم تعريف متحول [/FONT]CentroidObj[FONT=&quot] على أنه [/FONT]Variant[FONT=&quot] لالتقاط إحداثيات مركز ثقل المنطقة ثم تم إظهار الإحداثي [/FONT]X[FONT=&quot] ويساوي [/FONT]CentroidObj(0)[FONT=&quot] في نربع النص [/FONT]Text2[FONT=&quot] و الإحداثي [/FONT]Y[FONT=&quot] ويساوي [/FONT]CentroidObj(1)[FONT=&quot] في نربع النص [/FONT]Text3[FONT=&quot] .[/FONT]
[FONT=&quot]سادساً[/FONT][FONT=&quot] – سنقوم في القسم السادس من الكود بشرح أهم الطرق للتحكم والتعديل على العنصر الرسومي السابق وهي الطريقة [/FONT]*Boolean*[FONT=&quot] والتي نستخدمها من أجل عمليات دمج منطقتين [/FONT]*acUnion*[FONT=&quot] أو اقتطاع منطقة من أخرى [/FONT]*acSubtraction*[FONT=&quot] أو إيجاد التقاطع بين منطقتين [/FONT]*acIntersection* [FONT=&quot].[/FONT]
[FONT=&quot]فمثلاً لدمج المنطقة رقم 0 للعنصر [/FONT]regionObj1[FONT=&quot] (الخطين ومجمع الخطوط) مع المنطقة رقم 0 للعنصر [/FONT]regionObj2[FONT=&quot] (مجمع الخطوط الثاني) نضيف للكود السطر التالي :[/FONT]

```
regionObj1(0).Boolean acUnion, regionObj2(0)
```
 [FONT=&quot]وهنا تم دمج المنطقتين السابقتين وهان يتم إلغاء المنطقة [/FONT]regionObj2(0)[FONT=&quot] أما المنطقة [/FONT]regionObj1(0)[FONT=&quot] تصبح معبرة عن المنطقتين السابقتين بعد الدمج . [/FONT]
[FONT=&quot]ولاقتطاع المنطقة رقم 0 للعنصر [/FONT]regionObj3[FONT=&quot] (الدائرة الثانية) من المنطقة السابقة بعد الدمج نضيف للكود السطر التالي : [/FONT]

```
regionObj1(0).Boolean acSubtraction, regionObj3(0)
```
 [FONT=&quot] [/FONT]
[FONT=&quot]جرب الكود السابق ولاحظ النتيجة .[/FONT]
[FONT=&quot]وفي النهاية ندرج الكود كاملا بشكله النهائي :[/FONT]

```
Private Sub Command19_Click()
      On Error Resume Next
          Set Acadapp = GetObject(, "AutoCAD.Application.17")
          Acadapp.Documents.Add
          Acadapp.Visible = True
          Acadapp.WindowState = acMax
      If Err.Number <> 0 Then
          Set Acadapp = CreateObject("AutoCAD.Application.17")
          Acadapp.Documents.Add
          Acadapp.Visible = True
          Acadapp.WindowState = acMax
          Err.Clear
      End If
      '---------------------------------------------------------
      Dim Line1 As acadLine: Dim Line2 As acadLine
      Dim StartPt(2) As Double: Dim EndPt(2) As Double
      StartPt(0) = 160: StartPt(1) = 177: StartPt(2) = 0
      EndPt(0) = 216: EndPt(1) = 196: EndPt(2) = 0
      Set Line1 = Acadapp.ActiveDocument.ModelSpace.AddLine(StartPt, EndPt)
      StartPt(0) = 216: StartPt(1) = 196: StartPt(2) = 0
      EndPt(0) = 270: EndPt(1) = 146: EndPt(2) = 0
      Set Line2 = Acadapp.ActiveDocument.ModelSpace.AddLine(StartPt, EndPt)
      '-------------
      Dim plineObj1 As AcadLWPolyline
      Dim PLPoints1(0 To 7) As Double
      PLPoints1(0) = 270: PLPoints1(1) = 146
      PLPoints1(2) = 232: PLPoints1(3) = 124
      PLPoints1(4) = 190: PLPoints1(5) = 134
      PLPoints1(6) = 160: PLPoints1(7) = 177
      Set plineObj1 = Acadapp.ActiveDocument.ModelSpace.AddLightWeightPolyline(PLPoints1)
      '-------------
      Dim Circle1 As AcadCircle
      Dim CircleCenter1(2) As Double
      Dim CircleRadius1 As Double
      CircleCenter1(0) = 224
      CircleCenter1(1) = 157
      CircleCenter1(2) = 0
      CircleRadius1 = 15
      Set Circle1 = Acadapp.ActiveDocument.ModelSpace.AddCircle(CircleCenter1, CircleRadius1)
      '-------------
      Dim plineObj2 As AcadLWPolyline
      Dim PLPoints2(0 To 7) As Double
      PLPoints2(0) = 143: PLPoints2(1) = 201
      PLPoints2(2) = 203: PLPoints2(3) = 169
      PLPoints2(4) = 191: PLPoints2(5) = 95
      PLPoints2(6) = 127: PLPoints2(7) = 130
      Set plineObj2 = Acadapp.ActiveDocument.ModelSpace.AddLightWeightPolyline(PLPoints2)
      plineObj2.Closed = True
      '-------------
      Dim Circle2 As AcadCircle
      Dim CircleCenter2(2) As Double
      Dim CircleRadius2 As Double
      CircleCenter2(0) = 109
      CircleCenter2(1) = 128
      CircleCenter2(2) = 0
      CircleRadius2 = 51
      Set Circle2 = Acadapp.ActiveDocument.ModelSpace.AddCircle(CircleCenter2, CircleRadius2)
      '---------------------------------------------------------
      Dim Curves1(0 To 3) As AcadEntity
      Set Curves1(0) = Line1
      Set Curves1(1) = Line2
      Set Curves1(2) = plineObj1
      Set Curves1(3) = Circle1
      Dim Reg1 As Variant
      Reg1 = Acadapp.ActiveDocument.ModelSpace.AddRegion(Curves1)
      '-------------
      Dim Curves2(0) As AcadEntity
      Set Curves2(0) = plineObj2
      Dim Reg2 As Variant
      Reg2 = Acadapp.ActiveDocument.ModelSpace.AddRegion(Curves2)
      '-------------
      Dim Curves3(0) As AcadEntity
      Set Curves3(0) = Circle2
      Dim Reg3 As Variant
      Reg3 = Acadapp.ActiveDocument.ModelSpace.AddRegion(Curves3)
      '---------------------------------------------------------
      ReDim regionObj1(0 To UBound(Reg1)) As AcadRegion
      ReDim regionObj2(0 To UBound(Reg2)) As AcadRegion
      ReDim regionObj3(0 To UBound(Reg3)) As AcadRegion
      For I = 0 To UBound(Reg1)
          Set regionObj1(I) = Reg1(I)
      Next I
      For I = 0 To UBound(Reg2)
          Set regionObj2(I) = Reg2(I)
      Next I
      For I = 0 To UBound(Reg3)
          Set regionObj3(I) = Reg3(I)
      Next I
      '---------------------------------------------------------
      Line1.Delete
      Line2.Delete
      plineObj1.Delete
      plineObj2.Delete
      Circle1.Delete
      Circle2.Delete
      '---------------------------------------------------------
      Text1.text = regionObj1(0).Area
      '---------------------------------------------------------
      Dim CentroidObj As Variant
      CentroidObj = regionObj1(0).Centroid
      Text2.text = CentroidObj(0)
      Text3.text = CentroidObj(1)
      '---------------------------------------------------------
      regionObj1(0).Boolean acUnion, regionObj2(0)
      regionObj1(0).Boolean acSubtraction, regionObj3(0)
  End Sub
```
وفيما يلي الدرس بصيغة PDF على الرابط :
http://www.4shared.com/office/umAfImg5/___online.html


----------



## محمدسليمان احمد (1 يناير 2012)

وفقك الله لكل خير


----------



## أدهم7 (5 يناير 2012)

جزاكم الله خيرا ونفع بكم


----------



## Hossam-am (5 يناير 2012)

*التعامل مع الشرائح Spline*

*[FONT=&quot]التعامل مع الشرائح[/FONT]*​ *[FONT=&quot] [/FONT]**Spline*​ [FONT=&quot]سنتحدث في هذا الدرس عن العنصر الرسومي [/FONT]Spline[FONT=&quot] وهو عبارة عن شريحة في أتوكاد وسنشرح أهم الخصائص والطرق للتحكم في هذا العنصر .[/FONT]
[FONT=&quot]الصيغة العامة لإضافة شريحة في أتوكاد هي على الشكل التالي :[/FONT]
[FONT=&quot] [/FONT]

```
RetVal = Acadapp.ActiveDocument.ModelSpace.AddSpline(PointsArray, StartTangent, EndTangent)
```
 [FONT=&quot]حيث :[/FONT]
PointsArray[FONT=&quot] مصفوفة من الإحداثيات تشكل نقاط الشريحة .[/FONT]
StartTangent[FONT=&quot] قيمة ميل المماس للشريحة في نقطة البداية .[/FONT]
EndTangent[FONT=&quot] قيمة ميل المماس للشريحة في نقطة النهاية .[/FONT]
*[FONT=&quot]لننتقل إلى التطبيق :[/FONT]*
[FONT=&quot]- قم بعمل زر [/FONT]Command20[FONT=&quot] وأضفه للفورم وقم بتغيير خاصية [/FONT]caption[FONT=&quot] ليصبح [/FONT](AddSpline)[FONT=&quot] .[/FONT]
[FONT=&quot]- في حدث النقر على الزر [/FONT]Command20[FONT=&quot] نكتب :[/FONT]

```
Private Sub Command20_Click()
      On Error Resume Next
          Set Acadapp = GetObject(, "AutoCAD.Application.17")
          Acadapp.Documents.Add
          Acadapp.Visible = True
          Acadapp.WindowState = acMax
      If Err.Number <> 0 Then
          Set Acadapp = CreateObject("AutoCAD.Application.17")
          Acadapp.Documents.Add
          Acadapp.Visible = True
          Acadapp.WindowState = acMax
          Err.Clear
      End If
      '--------------------------
      Dim splineObj As AcadSpline
      Dim startTan(0 To 2) As Double
      Dim endTan(0 To 2) As Double
      Dim fitPoints(0 To 8) As Double
      startTan(0) = 0.5: startTan(1) = 0.5: startTan(2) = 0
      endTan(0) = 0.5: endTan(1) = 0.5: endTan(2) = 0
      fitPoints(0) = 1: fitPoints(1) = 1: fitPoints(2) = 0
      fitPoints(3) = 5: fitPoints(4) = 5: fitPoints(5) = 0
      fitPoints(6) = 10: fitPoints(7) = 0: fitPoints(8) = 0
      Set splineObj = Acadapp.ActiveDocument.ModelSpace.AddSpline(fitPoints, startTan, endTan)
      Acadapp.ZoomExtents
      
  End Sub
```
[FONT=&quot]الشرح :[/FONT]
[FONT=&quot]- في القسم الأول من الكود نفتح ملف جديد في برنامج الأوتوكاد .[/FONT]
[FONT=&quot]- في القسم الثاني من الكود :[/FONT]
[FONT=&quot]1- نعرف عنصر اسمه [/FONT]splineObj[FONT=&quot] على أنه شريحة في أوتوكاد . [/FONT]
[FONT=&quot]2- ثم نعرف متحولا [/FONT]startTan[FONT=&quot] لتخزين قيمة ميل المماس المار من نقطة البداية . ويتم احتساب هذا الميل من قبل البرنامج حيث يقوم برسم مستقيم وهمي مار من نقطتين هما نقطة البداية وإحداثياتها [/FONT](1,1,0)[FONT=&quot] ونقطة ثانية قمنا بإدخال إحداثياتها من خلال المتحول [/FONT]startTan[FONT=&quot] وكانت تساوي [/FONT](0.5,0.5,0)[FONT=&quot] (مقاسة من نقطة البداية كمركز للإحداثيات) وهنا بتمعن بسيط في القيم نلاحظ أن المماس يميل عن الأفق بزاوية 45 درجة وميله يساوي 1.[/FONT]
[FONT=&quot]3 - ثم نعرف متحولا [/FONT]endTan[FONT=&quot] لتخزين قيمة ميل المماس المار من نقطة النهاية . ويتم احتساب هذا الميل من قبل البرنامج حيث يقوم برسم مستقيم وهمي مار من نقطتين هما نقطة النهاية وإحداثياتها [/FONT](10,0,0)[FONT=&quot] ونقطة ثانية قمنا بإدخال إحداثياتها من خلال المتحول [/FONT]endTan[FONT=&quot] وكانت تساوي [/FONT](0.5,0.5,0)[FONT=&quot] (مقاسة من نقطة النهاية كمركز للإحداثيات) وهنا يظهر أن المماس يميل عن الأفق بزاوية 45 درجة وميله يساوي 1.[/FONT]
[FONT=&quot]4- نعرف بعد ذلك متحول اسمه [/FONT]fitPoints[FONT=&quot] لتخزين إحداثيات النقاط التي تمر من خلالها الشريحة وفي مثالنا عدد النقاط ثلاثة .[/FONT]
[FONT=&quot]5- نقوم بعد ذلك بإسناد القيم التالية إلى المتحول [/FONT]splineObj[FONT=&quot] من خلال تعليمة [/FONT]Set[FONT=&quot] وباستخدام الوظيفة [/FONT]AddSpline[FONT=&quot] .[/FONT]
[FONT=&quot]من أهم خصائص العنصر [/FONT]Spline
[FONT=&quot]للعنصر السابق مجموعة من الخصائص نذكر منها :[/FONT]
[FONT=&quot]1 – الخاصية [/FONT]Area[FONT=&quot] وهي تعيد مساحة السطح الذي تحدده الشريحة في حال كانت مغلقة . والسطح المحدد بالشريحة والمستقيم الواصل بين نقطتي البداية والنهاية في حال كانت مفتوحة وهي للقراءة فقط ويمكن الحصول عليها من خلال السطر :[/FONT]

```
Dim SplArea As Double
  SplArea = splineObj.Area
```
[FONT=&quot]2 – الخاصية [/FONT]Closed[FONT=&quot] وهي في هذا العنصر للقراءة فقط أي يمكن من خلال هذه الخاصية فقط معرفة فيما إذا كانت الشريحة مغلقة أم مفتوحة . في مثالنا نكتب :[/FONT]

```
Dim IsClosed As Boolean
  IsClosed = splineObj.Closed
```
[FONT=&quot]وهنا نستطيع اختبار قيمة [/FONT]IsClosed[FONT=&quot] من خلال تتبع الكود فنلاحظ أنه يساوي [/FONT]False[FONT=&quot] أي أن الشريحة ليست مغلقة . [/FONT]
[FONT=&quot]وتوجد مجموعة من الخصائص الأخرى التي سنذكرها في دروس قادمة بحول الله .[/FONT]
[FONT=&quot]وإليكم الدرس بصيغة PDF :[/FONT]
http://www.facebook.com/groups/267612119966249/doc/274607822600012/
[FONT=&quot][/FONT]
[FONT=&quot]دمتم بخير.[/FONT]
[FONT=&quot]
[/FONT]​


----------



## خالد الأزهري (6 يناير 2012)

السلام عليكم
الحمد لله على السلامة اخي حسام ....

للفائدة قام الاخ علاء شيخ محمود بتجميع الدروس السابقة (حتى الصفحة 6) في ملف ويرد واحد تجدونه هنا...
http://www.arab-eng.org/vb/showpost.php?p=1594166&postcount=46

تسجيل متابعة


----------



## نجانجا (6 يناير 2012)

انا مش فاهم اى حاجة  
ممكن حضرتك تعمل حلقات فيديو ؟؟


----------



## nabil-ahmed (6 يناير 2012)

موضوع رائع ..أشكرك جزيلا عشان أنا بحثت كتير على تعليم برمجة للأوتوكاد و لم أجد شرح مبسط
بارك الله فيك


----------



## mostafammy (6 يناير 2012)

شكرا جزيلا وبارك الله فيك وجزاك الله خيرا


----------



## Hossam-am (6 يناير 2012)

*ملفات الدروس من 1 إلى 16 pdf*

*إخواني الافاضل .... السلام عليكم
لقد اوردت في مشاركة سابقة ملفات الدروس من 1-14 بصسغة pdf ولمن لم يلاحظ فتفضلوا ملفات الدروس كاملة من 1 إلى 16 بصيغة PDF على الرابط :
http://www.4shared.com/rar/yYXpdcnr/_1-16_PDF_2.html

وكذلك ملف المثال الذي قمنا بإنشائه وكتابة الأكواد ضمنه كاملاً حتى الدرس 16 على الرابط :

http://www.4shared.com/rar/rVttV1nm/VBcad_2.html
وتقبلوا بقبول فائق الاحترام

دمتم بخير
م.حسام
*


----------



## Hossam-am (7 يناير 2012)

رفع للأهمية


----------



## Hossam-am (14 يناير 2012)

إخواني الافاضل السلام عليكم ورحمة الله 
[FONT=&quot]الآن وبعد جولة طويلة من التعرف على الكائنات الرسومية والتعرف على أهم خصائصها وطرق التحكم بهاوقبل إكمال شرح بقية العناصر ....[/FONT]
[FONT=&quot]نتوقف لنطلع عن كثب على بيئة أوتوكاد وأهم الكائنات في هذه البيئة وطرق التحكم بها ولتكن نظرة في العمق على[/FONT][FONT=&quot]الكائن الأساسي في بيئة أوتوكاد [/FONT]AutoCAD application[FONT=&quot] ونتعرف على خصائصه وأهم الوظائف للتحكم بهذا العنصر الذي يعتبر المستوى الأعلى الذي يتفرع عنه مجموعة من الكائنات الأخرى التي سنتعرف عليها بالتفصيل في الدروس القادمة .[/FONT]
[FONT=&quot]أرجو من الأخوة الكرام المشاركة والنقاش حول المادة العلمية للموضوع بهدف إغناء الموضوع أولاً وتشجيعي ثانياً وبحول الله نبدأ.[/FONT]

​


----------



## Hossam-am (14 يناير 2012)

*الدرس الأول في بيئة أوتوكاد (العرف على الكائن أوتوكاد)*

*[FONT=&quot]التعامل مع الكائن (أوتوكاد)[/FONT]*​ *AutoCAD application*​ *[FONT=&quot]
[/FONT]*
*[FONT=&quot]1- مقدمة :[/FONT]*
[FONT=&quot]الآن وبعد جولة طويلة من التعرف على الكائنات الرسومية والتعرف على أهم خصائصها وطرق التحكم بها نعود للتعرف على الكائن الأساسي في بيئة أوتوكاد [/FONT]AutoCAD application[FONT=&quot] ونتعرف على خصائصه وأهم الوظائف للتحكم بهذا العنصر الذي يعتبر المستوى الأعلى الذي يتفرع عنه مجموعة من الكائنات الأخرى التي سنتعرف عليها بالتفصيل في سياق هذا الشرح . [/FONT]

*[FONT=&quot]سنقوم بإنشاء مشروع فجوال بيزك جديد لنعتمد عليه في دروسنا القادمة لشرح بيئة أوتوكاد على الشكل التالي :[/FONT]*
· [FONT=&quot]افتح مشروع فجوال بيزك جديد يحوي إطاراً واحداً [/FONT]Form1[FONT=&quot] وموديول واحد [/FONT]Module1[FONT=&quot] وخزنه في أي مكان تختاره وسمه [/FONT]VB2cad[FONT=&quot].[/FONT]
· [FONT=&quot]قم بتحميل مكتبة كائن الأوتوكاد ضمن المشروع من قائمة [/FONT]Project[FONT=&quot] نختار [/FONT]References[FONT=&quot] ونبحث عن مكتبة الأوتوكاد ذات الإصدار المرتبط بالنسخة المحملة على الجهاز (2000-2004-2007-2009....) ونفعل الخيار [/FONT]Autocad 2009 Type Library[FONT=&quot] ثم موافق .[/FONT]
· [FONT=&quot]قم بعمل زر [/FONT]Command[FONT=&quot] وأضفه للفورم وقم بتغيير خاصية [/FONT]Name[FONT=&quot] له ليصبح [/FONT]Exit[FONT=&quot] وقم بتغيير خاصية [/FONT]caption[FONT=&quot] ليصبح ([/FONT]Exit[FONT=&quot]) . [/FONT]
· [FONT=&quot]في حدث النقر على الزر [/FONT]Exit[FONT=&quot] قم بكتابة الكود التالي :[/FONT]


```
Private Sub Exit_Click()
      End
  End Sub
```
 · [FONT=&quot]قم بعد ذلك بحفظ التغييرات وإغلاق المشروع .[/FONT]
[FONT=&quot]أصبح الآن المشروع [/FONT]VB2cad[FONT=&quot] هو المثال الذي سنقوم بإضافة الأوامر والأكراد عليه مع تقدم الشرح في بيئة أوتوكاد خطوة بخطوة في جميع دروسنا القادمة .[/FONT]
*[FONT=&quot]
[/FONT]*
*[FONT=&quot]2- مكونات الكائن أوتوكاد :[/FONT]*
[FONT=&quot]يتكون الكائن أوتوكاد من عدة كائنات رئيسية، تتفرع عنها مجموعة من[/FONT] [FONT=&quot]الكائنات الفرعية بشكل هرمي[/FONT].[FONT=&quot] ويكفي[/FONT] [FONT=&quot]معرفة أن الكائن الرئيسي هو[/FONT] Application [FONT=&quot]ويتفرع عنه الكائنات الموضحة بالشكل :[/FONT]
[FONT=&quot]




[/FONT]​ 

[FONT=&quot]الكائن[/FONT] Prefrences : [FONT=&quot]يمثل إعدادات بيئة أوتوكاد الحالية[/FONT].
[FONT=&quot]الكائن[/FONT] Documents : [FONT=&quot]ويمثل اللوحات المفتوحة في جلسة أوتوكاد الحالية[/FONT].
[FONT=&quot]الكائن[/FONT] MenuBar : [FONT=&quot]ويمثل شريط القائمة الحالي في أوتوكاد[/FONT].
[FONT=&quot]الكائن[/FONT] MenuGroups : [FONT=&quot]يمثل كافة القوائم المحملة في جلسة أوتوكاد الحالية[/FONT].
 [FONT=&quot]فإذا أردنا استدعاء كائن ما نكتب اسم الكائن الرئيسي ثم اسم[/FONT] [FONT=&quot]الكائن الفرعي ، فلاستدعاء الكائن[/FONT] Prefrences [FONT=&quot] مثلاً نكتب[/FONT]:

```
Application.Prefrences
```
 *[FONT=&quot]لإنشاء كائن[/FONT]*[FONT=&quot] الأوتوكاد من خلال لغة الفجوال بيزك فإننا نستخدم إحدى الوظيفتين :[/FONT]
- [FONT=&quot]الوظيفة [/FONT]CreateObject[FONT=&quot] حيث الصيغة العامة لهذه الوظيفة هي :[/FONT]


```
CreateObject("AutoCAD.Application.17")
```
 - [FONT=&quot]الوظيفة [/FONT]GetObject [FONT=&quot] حيث الصيغة العامة لهذه الوظيفة هي :[/FONT]


```
GetObject("AutoCAD.Application.17")
```
 *[FONT=&quot]لإضافة لوحة جديدة [/FONT]*[FONT=&quot]فإننا نستدعي الكائن الفرعي [/FONT]Documents[FONT=&quot] ونضيف لوحة جديدة باستخدام الوظيفة [/FONT]Add[FONT=&quot] وفق الصيغة :[/FONT]

```
Application.Documents.Add
```
 [FONT=&quot]وسنتحدث عن الكائن الفرعي [/FONT]Documents[FONT=&quot] بالتفصيل في الدروس القادمة .[/FONT]
*[FONT=&quot]لإضافة العناصر الرسومية[/FONT]*[FONT=&quot] فإننا نستخدم الكائن الفرعي [/FONT]ActiveDocument[FONT=&quot] والذي يعبر عن اللوحة النشطة أو الحالية (وقد استخدمنا هذا الكائن في جميع دروسنا السابقة عند إنشاء العناصر الرسومية ) . [/FONT]
*[FONT=&quot]لإنهاء جلسة[/FONT]*[FONT=&quot] الأوتوكاد فإننا نستخدم الوظيفة [/FONT]Quit[FONT=&quot] وفق الصيغة :[/FONT]

```
Application.Quit
```
 
*[FONT=&quot]
[/FONT]*
*[FONT=&quot]خصائص الكائن أوتوكاد :[/FONT]*
[FONT=&quot]يمتلك كائن أوتوكاد [/FONT]Application [FONT=&quot] مجموعة من الخصائص المرفقة مع هذا العنصر ومجموعة من الوظائف للتحكم بهذا العنصر من أهمها :[/FONT]
[FONT=&quot]1- الخاصية [/FONT]Visible[FONT=&quot]وهي تتحكم في إظهار أو إخفاء نافذة تطبيق الأوتوكاد وتأخذ إحدى القيمتين [/FONT]True[FONT=&quot] للإظهار و [/FONT]False[FONT=&quot] لإخفاء النافذة . [/FONT]
[FONT=&quot]2- الخاصية [/FONT]Caption[FONT=&quot] وهي للقراءة فقط وتعيد عنوان جلسة الأوتوكاد الحالية وهذه التسمية تظهر في شريط العنوان العلوي لبرنامج أوتوكاد . [/FONT]
[FONT=&quot]3- الخاصية [/FONT]Name[FONT=&quot] وهي للقراءة فقط وتعيد في حالتنا هذه إسم تطبيق الأوتوكاد .[/FONT]
[FONT=&quot]4- الخاصية [/FONT]FullName[FONT=&quot] وهي للقراءة فقط وتعيد في حالتنا هذه المسار الكامل للملف التنفيذي للبرنامج . ويختلف هذا المسار من حاسوب إلى آخر وحسب نسخة الأوتوكاد المحملة على الحاسوب .[/FONT]
[FONT=&quot]5- الخاصية [/FONT]Path[FONT=&quot]وهي للقراءة فقط وتعيد في حالتنا هذه مسار الدليل الذي يحوي الملف التنفيذي للبرنامج . ويختلف هذا المسار من حاسوب إلى آخر وحسب نسخة الأوتوكاد المحملة على الحاسوب .[/FONT]
[FONT=&quot]6- الخاصية [/FONT]Version[FONT=&quot]تعيد رقم الإصدار الحالي لتطبيق الأوتوكاد .[/FONT]
[FONT=&quot]7- خواص أبعاد نافذة برنامج الأوتوكاد الرئيسية وهي على الشكل :[/FONT]
[FONT=&quot]- الخاصيتان [/FONT]Height[FONT=&quot]و [/FONT]Width [FONT=&quot]وهما للقراءة والكتابة وتمثلان ارتفاع وعرض نافذة برنامج الأوتوكاد الرئيسية مقدرة بالنقاط ([/FONT]Pixels[FONT=&quot]) . [/FONT]
[FONT=&quot]- الخاصية [/FONT]WindowLeft[FONT=&quot] وهي للقراءة والكتابة وتمثل المسافة بين الحافة اليسرى لنافذة برنامج الأوتوكاد الرئيسية والحافة اليسرى للشاشة . [/FONT]
[FONT=&quot]- الخاصية [/FONT]WindowTop[FONT=&quot] وهي للقراءة والكتابة وتمثل المسافة بين الحافة العلوية لنافذة برنامج الأوتوكاد الرئيسية والحافة العلوية للشاشة . [/FONT]
[FONT=&quot]- الخاصية [/FONT]WindowState [FONT=&quot] وهي للقراءة والكتابة وهي تمثل وضع شاشة التطبيق الرئيسية فإما أن تكون ملأ الشاشة [/FONT]acMax[FONT=&quot] أو مصغرة [/FONT]acMin[FONT=&quot] أو بوضعها الطبيعي [/FONT]acNorm[FONT=&quot] .[/FONT]
*[FONT=&quot]وظائف التحكم بالكائن أوتوكاد :[/FONT]*
[FONT=&quot]1- الوظيفة [/FONT]Quit[FONT=&quot] لإنهاء جلسة الأوتوكاد الحالية .[/FONT]
[FONT=&quot]2- وظائف التحكم بمعاينة الرسومات [/FONT]Zoom[FONT=&quot] وهي على الشكل :[/FONT]
[FONT=&quot] - [/FONT]ZoomAll 
[FONT=&quot] - [/FONT]ZoomCenter
[FONT=&quot] - [/FONT]ZoomExtents
[FONT=&quot] - [/FONT]ZoomPickWindow
[FONT=&quot] - [/FONT]ZoomPrevious
[FONT=&quot] - [/FONT]ZoomScaled
[FONT=&quot] - [/FONT]ZoomWindow
[FONT=&quot]وسنقوم بتجريب وشرح هذه الوظائف ضمن التطبيقات العملية القادمة .[/FONT]
*[FONT=&quot]تطبيق عملي :[/FONT]*
[FONT=&quot]في مثالنا التالي سنقوم بما يلي :[/FONT]
- [FONT=&quot]تشغيل برنامج الأوتوكاد .[/FONT]
- [FONT=&quot]إضافة لوحة جديدة .[/FONT]
- [FONT=&quot]جعل نافذة تطبيق الأوتوكاد مرئية .[/FONT]
- [FONT=&quot]إضافة بعض الرسومات إلى اللوحة الحالية .[/FONT]
- [FONT=&quot]عرض خصائص تطبيق الأوتوكاد (الخصائص من 2 إلى 6)[/FONT]
- [FONT=&quot]تغيير خواص أبعاد نافذة برنامج الأوتوكاد الرئيسية .[/FONT]
- [FONT=&quot]استخدام بعض وظائف التحكم بمعاينة الرسومات [/FONT]Zoom[FONT=&quot] .[/FONT]
[FONT=&quot]لتنفيذ ذلك نقوم بالخطوات التالية :[/FONT]
- [FONT=&quot]أفتح المشروع [/FONT]VB2cad[FONT=&quot] .[/FONT]
- [FONT=&quot]أضف إلى الإطار [/FONT]Form1[FONT=&quot] زر أمر [/FONT]command[FONT=&quot] واجعل خاصية [/FONT]Name[FONT=&quot] له تساوي [/FONT]AppPropCmd[FONT=&quot] واجعل خاصية [/FONT]Caption[FONT=&quot] تساوي [/FONT]AppProp[FONT=&quot] .[/FONT]
- [FONT=&quot]أضف إطاراً جديدة [/FONT]Form2[FONT=&quot] واجعل خاصية [/FONT]Caption[FONT=&quot] له تساوي " خصائص كائن أوتوكاد " .[/FONT]
- [FONT=&quot]أضف إلى الإطار [/FONT]Form2[FONT=&quot] خمسة أدوات [/FONT]Label[FONT=&quot] واجعل خاصية [/FONT]Caption[FONT=&quot] لها تساوي بالترتيب :[/FONT]

```
Caption – Name – FullName – Path - Version
```
 - [FONT=&quot]أضف إلى الإطار [/FONT]Form2[FONT=&quot] خمسة مربعات نص [/FONT]Text[FONT=&quot] واجعل خاصية [/FONT]Name[FONT=&quot] لها تساوي بالترتيب :[/FONT]

```
CaptionTXT – NameTXT – FullNameTXT – PathTXT – VersionTXT
```
 - [FONT=&quot]أضف إلى الإطار [/FONT]Form2[FONT=&quot] أربعة أدوات [/FONT]Label[FONT=&quot] واجعل خاصية [/FONT]Caption[FONT=&quot] لها تساوي بالترتيب :[/FONT]

```
Height  – Width – Left – Top
```
 - [FONT=&quot]أضف إلى الإطار [/FONT]Form2[FONT=&quot] أربعة مربعات نص [/FONT]Text[FONT=&quot] واجعل خاصية [/FONT]Name[FONT=&quot] لها تساوي بالترتيب :[/FONT]

```
HeightTXT – WidthTXT – LeftTXT – TopTXT
```
 - [FONT=&quot]أضف إلى الإطار [/FONT]Form2[FONT=&quot] زر أمر [/FONT]command[FONT=&quot] واجعل خاصية [/FONT]Name[FONT=&quot] له تساوي [/FONT]ApllyCmd[FONT=&quot] واجعل خاصية [/FONT]Caption[FONT=&quot] تساوي "[/FONT] [FONT=&quot]اعتماد الأبعاد السابقة" .[/FONT]
- [FONT=&quot]أضف إلى الإطار [/FONT]Form2[FONT=&quot] ثلاثة أزرار [/FONT]command[FONT=&quot] واجعل خاصية [/FONT]Name[FONT=&quot] لها تساوي بالترتيب :[/FONT]

```
MaxCmd – MinCmd – NormCmd
```
 [FONT=&quot] واجعل خاصية [/FONT]Caption[FONT=&quot] لها تساوي بالترتيب :[/FONT]

```
acmax – acMin  – acNorm
```
 - [FONT=&quot]أضف إلى الإطار [/FONT]Form2[FONT=&quot] ستة أزرار [/FONT]command[FONT=&quot] واجعل خاصية [/FONT]Name[FONT=&quot] لها تساوي بالترتيب :[/FONT]

```
ZoomExtentsCmd – ZoomAllCmd – ZoomCenterCmd –
   ZoomWindowCmd – ZoomScaledCmd - ZoomPreviousCmd
```
[FONT=&quot] واجعل خاصية [/FONT]Caption[FONT=&quot] لها تساوي بالترتيب :[/FONT]

```
ZoomExtents – ZoomAll – ZoomCenter –
   ZoomWindow – ZoomScaled - ZoomPrevious
```
 - [FONT=&quot]أضف إلى الإطار [/FONT]Form2[FONT=&quot] زر أمر [/FONT]command[FONT=&quot] واجعل خاصية [/FONT]Name[FONT=&quot] له تساوي [/FONT]OKcmd[FONT=&quot] واجعل خاصية [/FONT]Caption[FONT=&quot] تساوي "[/FONT] [FONT=&quot]رجوع" .[/FONT]
[FONT=&quot]في النهاية سيظهر الإطار [/FONT]Form2[FONT=&quot] كما في الصورة :[/FONT]



​


----------



## Hossam-am (14 يناير 2012)

*[FONT=&quot]نبدأ بكتابة الأكواد اللازمة على الشكل التالي :[/FONT]*
[FONT=&quot]1 -[/FONT][FONT=&quot] نفتح صفحة الموديول [/FONT]Module1[FONT=&quot] ونكتب السطر التالي :[/FONT]

```
Public Acadapp As AcadApplication
```
 [FONT=&quot]حيث تم تعريف عنصر اسمه [/FONT]Acadapp[FONT=&quot] على أنه كائن أوتوكاد . وتم التعريف في صفحة الموديول ليكون هذا المتحول عام ويمكن استدعاؤه من أي مكان في البرنامج .[/FONT]
[FONT=&quot]2 -[/FONT][FONT=&quot] في حدث النقر على الزر [/FONT]AppPropCmd[FONT=&quot] في الإطار [/FONT]Form1[FONT=&quot] نكتب الكود التالي :[/FONT]


```
Private Sub AppPropCmd_Click()
      On Error Resume Next
          Set Acadapp = GetObject(, "AutoCAD.Application.17")
          Acadapp.Documents.Add
          Acadapp.Visible = True
      If Err.Number <> 0 Then
          Set Acadapp = CreateObject("AutoCAD.Application.17")
          Acadapp.Documents.Add
          Acadapp.Visible = True
          Err.Clear
      End If
      '---------------------------------------------------------
      'Draw Line
      Dim Line1 As AcadLine
      Dim StartPt(2) As Double
      Dim EndPt(2) As Double
      StartPt(0) = 2
      StartPt(1) = 2
      StartPt(2) = 0
      EndPt(0) = 1
      EndPt(1) = 5
      EndPt(2) = 0
      Set Line1 = Acadapp.ActiveDocument.ModelSpace.AddLine(StartPt, EndPt)
      '-----------------------------------------------------------------------
      'Draw Circle
      Dim Circle1 As AcadCircle
      Dim CircleCenter(2) As Double
      Dim CircleRadius As Double
      CircleCenter(0) = 5
      CircleCenter(1) = 6
      CircleCenter(2) = 0
      CircleRadius = 1.5
      Set Circle1 = Acadapp.ActiveDocument.ModelSpace.AddCircle(CircleCenter, CircleRadius)
      '-----------------------------------------------------------------------
      Form2.CaptionTXT = Acadapp.Caption
      Form2.NameTXT = Acadapp.Name
      Form2.FullNameTXT = Acadapp.FullName
      Form2.PathTXT = Acadapp.Path
      Form2.VersionTXT = Acadapp.Version
      '-----------------------------------------------------------------------
      Form1.Hide
      Form2.Show
  End Sub
```
 [FONT=&quot]الشرح :[/FONT]
[FONT=&quot]- في الجزء الأول من الكود نقوم باختبار كون برنامج أوتوكاد مفتوحاً أو لا من خلال وظيفة [/FONT]GetObject[FONT=&quot] وإسناد التطبيق المفتوح إلى المتحول [/FONT]Acadapp[FONT=&quot] ولو كان أتوكاد غير مفتوحأ سنحصل على خطأ [/FONT]Error[FONT=&quot] . نختبر قيمة الخطأ فإذا كانت مختلفة عن الصفر معنى ذلك وقوع خطأ وهو كون التطبيق مغلق عندها نستخدم وظيفة [/FONT]CreateObject[FONT=&quot] لفتح التطبيق وإسناده للمتحول [/FONT]acadapp[FONT=&quot] . [/FONT]
[FONT=&quot]- لاحظ أننا قمنا بإضافة لوحة جديدة من خلال استدعاء الكائن الفرعي [/FONT]Documents[FONT=&quot] من خلال السطر :[/FONT]

```
Acadapp.Documents.Add
```
 [FONT=&quot]- ثم قمنا بجعل نافذة تطبيق الأوتوكاد مرئية من خلال خاصية [/FONT]Visible[FONT=&quot] كما في السطر :[/FONT]

```
Acadapp.Visible = True
```
 [FONT=&quot]- في القسم الثاني من الكود قمنا برسم خط [/FONT]Line1[FONT=&quot] باستخدام الوظيفة [/FONT]AddLine[FONT=&quot] .[/FONT]
[FONT=&quot]- في القسم الثالث من الكود قمنا برسم دائرة [/FONT]Circle1[FONT=&quot] باستخدام الوظيفة [/FONT]AddCircle[FONT=&quot].[/FONT]
[FONT=&quot]- في القسم الأخير من الكود قمنا بإظهار قيم خصائص الكائن أوتوكاد في مربعات النصوص في الإطار [/FONT]form2[FONT=&quot] وهذه الخصائص هي : [/FONT]

```
Caption – Name – FullName – Path – Version
```
 [FONT=&quot]لاحظ أنه في السطر الأخير من الكود قمنا بإخفاء الإطار [/FONT]Form1[FONT=&quot] من خلال وظيفة [/FONT]Hide[FONT=&quot] ثم قمنا بإظهار الإطار [/FONT]Form2[FONT=&quot] وجعله مرئياً من خلال وظيفة [/FONT]Show[FONT=&quot] .[/FONT]
[FONT=&quot]3 -[/FONT][FONT=&quot] في حدث النقر على الزر [/FONT]ApllyCmd[FONT=&quot] في الإطار [/FONT]Form2[FONT=&quot] نكتب الكود التالي :[/FONT]

```
Private Sub ApllyCmd_Click()
      Acadapp.Height = Val(HeightTXT.Text)
      Acadapp.Width = Val(WidthTXT.Text)
      Acadapp.WindowLeft = Val(LeftTXT.Text)
      Acadapp.WindowTop = Val(TopTXT.Text)
  End Sub
```
 [FONT=&quot]في هذا الكود نقوم بتغيير أبعاد نافذة تطبيق الأوتوكاد الرئيسية من خلال إعطاء قيم لهذه الخواص حيث ندخل هذه القيم في مربعات النصوص الخاصة بالأبعاد في الإطار [/FONT]Form2[FONT=&quot] . فمثلاً قم بإدخال القيم التالية في مربعات النصوص :[/FONT]

```
HeightTXT = "500"
  WidthTXT = "900"
  LeftTXT = "50"
  TopTXT = "60"
```
[FONT=&quot]ثم قم بالنقر على الزر [/FONT]ApllyCmd[FONT=&quot] والمسمى "[/FONT] [FONT=&quot]اعتماد الأبعاد السابقة" ولاحظ النتيجة.[/FONT]
[FONT=&quot]4 -[/FONT][FONT=&quot] في حدث النقر على الزر [/FONT]MaxCmd[FONT=&quot] في الإطار [/FONT]Form2[FONT=&quot] نكتب الكود التالي :[/FONT]

```
Private Sub MaxCmd_Click()
      Acadapp.WindowState = acMax
  End Sub
```
 [FONT=&quot]النقر على هذا الزر يجعل نافذة الأوتوكاد تملأ الشاشة .[/FONT]
[FONT=&quot]5 -[/FONT][FONT=&quot] في حدث النقر على الزر [/FONT]MinCmd[FONT=&quot] في الإطار [/FONT]Form2[FONT=&quot] نكتب الكود التالي :[/FONT]

```
Private Sub MinCmd_Click()
      Acadapp.WindowState = acMin
  End Sub
```
 [FONT=&quot]النقر على هذا الزر يجعل نافذة الأوتوكاد في الوضع المصغر .[/FONT]
[FONT=&quot]6 -[/FONT][FONT=&quot] في حدث النقر على الزر [/FONT]NormCmd[FONT=&quot] في الإطار [/FONT]Form2[FONT=&quot] نكتب الكود التالي :[/FONT]

```
Private Sub NormCmd_Click()
      Acadapp.WindowState = acNorm
  End Sub
```
 [FONT=&quot]النقر على هذا الزر يجعل نافذة الأوتوكاد تعود إلى الوضع الطبيعي .[/FONT]
[FONT=&quot]7 -[/FONT][FONT=&quot] في حدث النقر على الزر [/FONT]ZoomAllCmd[FONT=&quot] في الإطار [/FONT]Form2[FONT=&quot] نكتب الكود التالي :[/FONT]

```
Private Sub ZoomAllCmd_Click()
      Acadapp.ZoomAll
  End Sub
```
 [FONT=&quot]النقر على هذا الزر ينفذ الأمر [/FONT]ZoomAll[FONT=&quot]للوحة الحالية[/FONT][FONT=&quot].[/FONT]
[FONT=&quot]8 -[/FONT][FONT=&quot] في حدث النقر على الزر [/FONT]ZoomExtentsCmd[FONT=&quot] في الإطار [/FONT]Form2[FONT=&quot] نكتب الكود التالي :[/FONT]

```
Private Sub ZoomAllCmd_Click()
      Acadapp. ZoomExtents
  End Sub
```
 [FONT=&quot]النقر على هذا الزر ينفذ الأمر [/FONT]ZoomExtents[FONT=&quot] للوحة الحالية.[/FONT]
[FONT=&quot]9 -[/FONT][FONT=&quot] في حدث النقر على الزر [/FONT]ZoomCenterCmd[FONT=&quot] في الإطار [/FONT]Form2[FONT=&quot] نكتب الكود التالي :[/FONT]

```
Private Sub ZoomCenterCmd_Click()
      Dim  Center(0 To 2) As Double
      Dim Magnify  As Double
      Center(0) = 3
      Center(1) = 3
      Center(2) = 0
      Magnify = 10
      Acadapp.ZoomCenter  Center, Magnify
  End Sub
```
 [FONT=&quot]النقر على هذا الزر ينفذ الأمر [/FONT]ZoomCenter[FONT=&quot] للوحة الحالية[/FONT][FONT=&quot] حيث الصيغة العامة لهذه الوظيفة تكتب على الشكل التالي :[/FONT]

```
Application.ZoomCenter Center, Magnify
```
 [FONT=&quot]حيث : [/FONT]Center[FONT=&quot] متحول [/FONT][FONT=&quot]نخزن به إحداثيات مركز المعاينة .[/FONT]
Magnify [FONT=&quot]متحول[/FONT][FONT=&quot] نخزن به عدد مرات التكبير.[/FONT]
[FONT=&quot]10 –[/FONT][FONT=&quot] في حدث النقر على الزر [/FONT]ZoomWindowCmd[FONT=&quot] في الإطار [/FONT]Form2[FONT=&quot] نكتب الكود :[/FONT]


```
Private Sub ZoomWindowCmd_Click()
      Dim LowerLeft(0 To 2) As Double
      Dim UpperRight(0 To 2) As Double
      LowerLeft(0) = 0.5: LowerLeft(1) = 3.2: LowerLeft(2) = 0
      UpperRight(0) = 4.6: UpperRight(1) = 6.7: UpperRight(2) = 0
      Acadapp.ZoomWindow LowerLeft, UpperRight
  End Sub
```
 [FONT=&quot]النقر على هذا الزر ينفذ الأمر [/FONT]ZoomWindow[FONT=&quot] للوحة الحالية[/FONT][FONT=&quot] حيث الصيغة العامة لهذه الوظيفة تكتب على الشكل التالي :[/FONT]

```
Application. ZoomWindow LowerLeft, UpperRight
```
 [FONT=&quot]حيث : [/FONT]LowerLeft[FONT=&quot] متحول [/FONT][FONT=&quot]نخزن به إحداثيات الزاوية اليسارية السفلية .[/FONT]
UpperRight [FONT=&quot]متحول [/FONT][FONT=&quot]نخزن به إحداثيات الزاوية اليمينية العلوية .[/FONT]
[FONT=&quot]11 –[/FONT][FONT=&quot] في حدث النقر على الزر [/FONT]ZoomScaledCmd[FONT=&quot] في الإطار [/FONT]Form2[FONT=&quot] نكتب الكود :[/FONT]

```
Private Sub ZoomScaledCmd_Click()
      Dim scalefactor As Double
      Dim scaletype As Integer
      scalefactor = 2
      scaletype = acZoomScaledRelative
      Acadapp.ZoomScaled scalefactor, scaletype
  End Sub
```
 [FONT=&quot]النقر على هذا الزر ينفذ الأمر [/FONT]ZoomScale[FONT=&quot] للوحة الحالية حيث الصيغة العامة لهذه الوظيفة تكتب على الشكل التالي :[/FONT]

```
Application. ZoomScaled Scale, ScaleType
```
 [FONT=&quot]حيث : [/FONT]Scale[FONT=&quot] متحول [/FONT][FONT=&quot]نخزن به قيمة مقياس التصغير أو التكبير .[/FONT]
ScaleType [FONT=&quot]متحول [/FONT][FONT=&quot]نخزن به نمط الوحدات المطبق على المقياس السابق ويأخذ إحدى القيم التالية :[/FONT]
- acZoomScaledAbsolute[FONT=&quot]لاعتماد وحدات الرسم الأساسية في تقدير قيمة المقياس .[/FONT]
- acZoomScaledRelative[FONT=&quot] لاعتماد الوحدات كنسبة من المعاينة الحالية في تقدير قيمة المقياس .[/FONT]
- acZoomScaledRelativePSpace[FONT=&quot] لاعتماد وحدات حيز الورقة [/FONT]paper space[FONT=&quot] في تقدير قيمة المقياس .[/FONT]
[FONT=&quot]في مثالنا لاحظ أننا قمنا بتعريف متحول اسمه [/FONT]scalefactor[FONT=&quot] ليعبر عن المقياس [/FONT]Scale[FONT=&quot] وجعلنا القيمة تساوي 2 وقمنا بتعريف متحول اسمه ليعبر [/FONT]scaletype[FONT=&quot] عن نمط الوحدات المطبق على المقياس وجعلنا قيمته تساوي [/FONT]acZoomScaledRelative[FONT=&quot] لاعتماد الوحدات كنسبة من المعاينة الحالية[/FONT][FONT=&quot] .[/FONT]
[FONT=&quot]12 -[/FONT][FONT=&quot] في حدث النقر على الزر [/FONT]ZoomPreviousCmd[FONT=&quot] في الإطار [/FONT]Form2[FONT=&quot] نكتب الكود التالي :[/FONT]

```
Private Sub ZoomPreviousCmd_Click()
      Acadapp.ZoomPrevious
  End Sub
```
 [FONT=&quot]النقر على هذا الزر ينفذ الأمر [/FONT]ZoomPrevious[FONT=&quot] للوحة الحالية.[/FONT]
[FONT=&quot]13 –[/FONT][FONT=&quot] أخيراً في حدث النقر على الزر [/FONT]OKcmd[FONT=&quot] والمسمى "رجوع" في الإطار [/FONT]Form2[FONT=&quot] نكتب الكود التالي :[/FONT]

```
Private Sub OKcmd_Click()
      Form1.Show
      Form2.Hide 
  End Sub
```
 [FONT=&quot]حيث نقوم بإظهار الإطار [/FONT]Form1[FONT=&quot] وإخفاء الإطار [/FONT]Form2[FONT=&quot] .[/FONT]

*[FONT=&quot]قم بتشغيل البرنامج بالضغط على مفتاح [/FONT]**F5**[FONT=&quot] وقم بتجريب عمل الأكواد السابقة ولاحظ النتيجة .[/FONT]*
*[FONT=&quot]الدرس بصيغة PDF والكود للمثال VB2cad تجدونه على الرابط :[/FONT]*
http://www.facebook.com/groups/267612119966249/doc/280244068703054/*[FONT=&quot]

أو على الروابط مباشرة :
[/FONT]*http://www.mediafire.com/download.php?mam151d7qjz1dd9
http://www.mediafire.com/download.php?f7wau1fri3kt3ob


----------



## المهندس ابوعمر (15 يناير 2012)

متابعين باهتمام 

بارك الله فيك


----------



## Hossam-am (15 يناير 2012)

سبحان الله


----------



## خالد الأزهري (16 يناير 2012)

تسجيل متابعة


----------



## Hossam-am (20 يناير 2012)

*الدرس الثاني في بيئة أوتوكاد (الكائنات Documents و Document )*

*[FONT=&quot]2- 1 الكائن [/FONT]** Documents**[FONT=&quot]:[/FONT]*
[FONT=&quot]أهم الكائنات في تطبيق أوتوكاد على الإطلاق هو كائن[/FONT] Documents [FONT=&quot]وهو الذي يحوي مرجعاً لكافة اللوحات المفتوحة في جلسة[/FONT] [FONT=&quot]أوتوكاد الحالية . ويمكن إضافة عدد غير محدد من اللوحات إلى جلسة العمل وكل لوحة من هذه اللوحات تمثل بـ [/FONT]Document[FONT=&quot] وتأخذ رقماً محدداً بحيث تأخذ اللوحة الأولى الرقم [/FONT](0)[FONT=&quot] ثم [/FONT](1)[FONT=&quot] وهكذا.[/FONT]
*[FONT=&quot]استدعاء الكائن [/FONT]**Documents**[FONT=&quot] :[/FONT]*
[FONT=&quot]يتم استدعاء الكائن [/FONT]_Documents_[FONT=&quot] مباشرة من خلال الكائن الأب وفق الصيغة :[/FONT]

```
Application.Documents
```
 [FONT=&quot]أو يمكن تعريف عنصر على أنه كائن [/FONT]_Documents_[FONT=&quot] كأن نكتب مثلاً :[/FONT]

```
Dim DocS As AcadDocuments
  Set DocS = Acadapp.Documents
```
 [FONT=&quot]في السطر الأول تم تعريف عنصر اسمه [/FONT]DocS[FONT=&quot] مثلاً على أنه يمثل الكائن [/FONT]_Documents_[FONT=&quot] بعد ذلك في السطر الثاني تم إسناد جميع اللوحات في جلسة العمل إلى هذا العنصر باستخدام وظيفة [/FONT]Set[FONT=&quot] وذلك على فرض أن العنصر [/FONT]Acadapp[FONT=&quot] يمثل كائن أوتوكاد. [/FONT]
[FONT=&quot]وبذلك أصبح بإمكاننا الاستعاضة عن العبارة [/FONT]Application. Documents[FONT=&quot]بالعنصر [/FONT]DocS[FONT=&quot] .[/FONT]

*[FONT=&quot]وظائف التحكم بالكائن [/FONT]**Documents**[FONT=&quot]:[/FONT]*
*[FONT=&quot]1-[/FONT]*[FONT=&quot] الوظيفة [/FONT]Add[FONT=&quot] تستخدم لإضافة لوحة جديدة [/FONT]Document[FONT=&quot] إلى جلسة العمل الحالية وتكتب على الشكل :[/FONT]

```
Application.Documents.Add (Name)
```
 [FONT=&quot]حيث [/FONT]Name[FONT=&quot] يمثل إسم القالب [/FONT]template[FONT=&quot] المستخدم في لوحة الأوتوكاد الجديدة مثل "[/FONT]acadiso.dwt[FONT=&quot]" وهو إسم القالب الافتراضي في برنامج أوتوكاد وفي حال عدم كتابة إسم القالب فسيتم اعتماد القالب الافتراضي . ويمكن اختيار أي قالب آخر حسب الحاجة مثل "[/FONT] ANSI A (portrait) -Color Dependent Plot Styles[FONT=&quot]" .[/FONT]
[FONT=&quot]نشير إلى أنه كان من الممكن أن نكتب :[/FONT]

```
DocS.Add (Name)
```
 [FONT=&quot]على اعتبار أن العنصر [/FONT]DocS[FONT=&quot] يمثل الكائن [/FONT]_Documents_[FONT=&quot] .[/FONT]

*[FONT=&quot]2-[/FONT]*[FONT=&quot] الوظيفة [/FONT]Open[FONT=&quot] تستخدم لفتح لوحة مخزنة (ملف رسومي) وذلك على الشكل :[/FONT]

```
Application.Documents.Open (Name)
```
 [FONT=&quot]حيث [/FONT]Name[FONT=&quot] هو المسار الكامل للملف الرسومي المراد فتحه مثل : [/FONT]
"C:\AutoCAD\Sample\city map.dwg"

[FONT=&quot]كما يمكن أن نكتب :[/FONT]

```
DocS. Open (Name)
```
 [FONT=&quot]على اعتبار أن العنصر [/FONT]DocS[FONT=&quot] يمثل الكائن [/FONT]_Documents_[FONT=&quot] .[/FONT]

*[FONT=&quot]3-[/FONT]*[FONT=&quot] الوظيفة [/FONT]Item[FONT=&quot] تستخدم لاختيار لوحة من اللوحات المفتوحة في الجلسة الحالية للتعامل معها . فكل لوحة من اللوحات السابقة والتي تم إضافتها باستخدام إحدى الوظيفتين [/FONT]Add[FONT=&quot] أو [/FONT]Open[FONT=&quot] تأخذ رقماً محدداً في جلسة العمل بحيث تأخذ اللوحة الأولى الرقم [/FONT](0)[FONT=&quot] واللوحة الثانية الرقم [/FONT](1)[FONT=&quot] وهكذا . لنفرض مثلاً أننا نريد التعامل مع اللوحة المفتوحة الأولى (بفرض وجود عدة لوحات مفتوحة) فإننا يمكن الوصول إليها عن طريق العبارة [/FONT]:


```
Application.Documents.Item(0)
```
 [FONT=&quot]أو يمكن كتابة العبارة السابقة مباشرة بالشكل :[/FONT]


```
Application.Documents(0)
```
 [FONT=&quot]كما يمكن أن نكتب :[/FONT]

```
DocS.Item(0)
```
 [FONT=&quot]على اعتبار أن العنصر [/FONT]DocS[FONT=&quot] يمثل الكائن [/FONT]_Documents_[FONT=&quot] أو نعبر عن اللوحة الأولى مباشرة بكونها [/FONT]DocS(0)[FONT=&quot] .[/FONT]
*[FONT=&quot]4-[/FONT]*[FONT=&quot] الوظيفة [/FONT]Close[FONT=&quot] التابعة للكائن [/FONT]_Documents_[FONT=&quot] تستخدم لإغلاق جميع اللوحات في الجلسة الحالية دفعة واحدة . وتكتب على الشكل :[/FONT]


```
Application.Documents.Close
```
 [FONT=&quot]كما يمكن أن نكتب :[/FONT]

```
DocS.Close
```
 [FONT=&quot]على اعتبار أن العنصر [/FONT]DocS[FONT=&quot] يمثل الكائن [/FONT]_Documents_[FONT=&quot] .[/FONT]
*[FONT=&quot]وهنا نشير إلى ملاحظة مهمة جداً :[/FONT]*
*[FONT=&quot]عند استخدام الوظيفة [/FONT]**Close**[FONT=&quot] للكائن [/FONT]**Documents**[FONT=&quot] فإن جميع اللوحات المضافة إلى جلسة العمل باستخدام الوظيفة [/FONT]**Add**[FONT=&quot] والتي لم يتم تخزينها بعد سيتم إغلاقها دفعة واحدة بدون السؤال عن حفظ التغييرات أم لا وبدون حفظ الملفات الرسومية مهما كانت تحوي من الرسومات . أما بخصوص اللوحات المفتوحة والمخزنة (تم فتحها باستخدام الوظيفة [/FONT]**Open**[FONT=&quot] أو تم فتحها باستخدام الوظيفة [/FONT]**Add**[FONT=&quot] وتم تخزينها باستخدام الوظيفة [/FONT]**Save**[FONT=&quot] التي سنشرحها لاحقاً ) فسيتم حفظ التغييرات عليها تلقائياً قبل إغلاقها باستخدام هذه الوظيفة .[/FONT]*
*[FONT=&quot]وتجدر الإشارة أيضاً أن الوظيفة [/FONT]**Close**[FONT=&quot] التابعة للكائن [/FONT]**Documents**[FONT=&quot] تختلف عن الوظيفة [/FONT]**Close**[FONT=&quot] التابعة للكائن [/FONT]**Document**[FONT=&quot] والتي سنشرحها لاحقاً .[/FONT]*
*[FONT=&quot]خصائص الكائن [/FONT]**Documents**[FONT=&quot]:[/FONT]*
[FONT=&quot]1- الخاصية [/FONT]Count [FONT=&quot]وهي للقراءة فقط وهي تعيد عدد اللوحات المفتوحة في جلسة العمل الحالية ويتم استخدامها من خلال العبارة :[/FONT]

```
Number = Application.Documents.Count
```
 [FONT=&quot]و يمكن أن نكتب :[/FONT]

```
Number = DocS.Count
```
 [FONT=&quot]2- الخاصية [/FONT]Application[FONT=&quot] وهي بمثابة استدعاء للكائن الأب وخصائصه من خلال الكائن الابن ويتم ذلك من خلال العبارة :[/FONT]

```
Object.Application
```
 [FONT=&quot]حيث [/FONT]_Object_[FONT=&quot] يعبر عن الكائن [/FONT]_Documents_[FONT=&quot]فمثلاً (وعلى فرض وجود عدة لوحات مفتوحة في جلسة العمل) يمكن أن نكتب السطور التالية :[/FONT]

```
Dim DocS As AcadDocuments
  Set DocS = Acadapp.Documents
  DocS(0).Application.ZoomExtents
```
 [FONT=&quot]في المثال السابق تم تعريف عنصر اسمه [/FONT]DocS[FONT=&quot] على أنه يمثل الكائن [/FONT]_Documents_[FONT=&quot] بعد ذلك تم إسناد جميع اللوحات في جلسة العمل إلى هذا العنصر باستخدام وظيفة [/FONT]Set[FONT=&quot] وذلك على فرض أن العنصر [/FONT]Acadapp[FONT=&quot] يمثل كائن أوتوكاد . بعد ذلك في السطر الأخير من الكود تم استدعاء الكائن الأب [/FONT]Application[FONT=&quot] من قبل الكائن الابن [/FONT]DocS[FONT=&quot] لتطبيق إحدى خصائص الأب وهي خاصية [/FONT]ZoomExtents[FONT=&quot] على اللوحة رقم (0) .[/FONT]


----------



## Hossam-am (20 يناير 2012)

*[FONT=&quot]2- 1-1 الكائن [/FONT]** Document**[FONT=&quot]:[/FONT]*
[FONT=&quot]يمتلك الكائن [/FONT]*Documents*[FONT=&quot] كائن فرعي وحيد هو [/FONT]*Document*[FONT=&quot] وهو أهم كائن في أوتوكاد على الإطلاق ويمثل لوحة الرسم التي سنتعامل معها لإضافة الرسومات المختلفة والتعديل والطباعة . ولفهم بنية هذا الكائن أنظر الشكل التالي :[/FONT]




[FONT=&quot]




[/FONT]​ [FONT=&quot] 
[/FONT]

*[FONT=&quot]إنشاء الكائن [/FONT]**Document**[FONT=&quot] :[/FONT]*
[FONT=&quot]لاحظ من الشكل السابق أن الكائن الرئيسي [/FONT]_Application_[FONT=&quot] يتفرع عنه الكائن الفرعي [/FONT]_Documents_[FONT=&quot] يتفرع عنه الكائن الفرعي [/FONT]*Document*[FONT=&quot] الذي يمثل لوحة الرسم .[/FONT]
[FONT=&quot]لإنشاء الكائن [/FONT]*Document*[FONT=&quot] نستخدم الوظيفة [/FONT]Add[FONT=&quot] الخاصة بالكائن الأب [/FONT]_Documents_[FONT=&quot] لإضافة لوحة جديدة كما شرحنا سابقاً وفق الصيغة :[/FONT]

```
Application.Documents.Add (Name)
```
 
[FONT=&quot]أو باستخدام الوظيفة [/FONT]Open[FONT=&quot] الخاصة بالكائن الأب [/FONT]_Documents_[FONT=&quot] لفتح لوحة مخزنة كما شرحنا سابقاً وفق الصيغة :[/FONT]

```
Application.Documents.Open (Name)
```
 
[FONT=&quot]وبمجرد إضافة هذه اللوحة فإنها تأخذ رقماً خاصاً يبدأ من [/FONT](0)[FONT=&quot] ثم [/FONT](1)[FONT=&quot] وهكذا...[/FONT]
[FONT=&quot]وبالتالي يتم استدعاء الكائن [/FONT]*Document*[FONT=&quot] وفق الصيغة :[/FONT]

```
Application.Documents(n)
```
 
[FONT=&quot]وكذلك وفق الصيغة :[/FONT]

```
Application.Documents.Item (n)
```
 
[FONT=&quot]حيث [/FONT]_n_[FONT=&quot] يعبر عن رقم اللوحة .[/FONT]
[FONT=&quot]أو يمكن تعريف عنصر على أنه كائن [/FONT]*Document*[FONT=&quot] كأن نكتب مثلاً :[/FONT]

```
Dim Doc1 As AcadDocument
  Set Doc1 = Acadapp.Documents(1)
```
 
[FONT=&quot]هنا تم تعريف عنصر اسمه [/FONT]Doc1[FONT=&quot] مثلاً على أنه يمثل كائن [/FONT]*Document*[FONT=&quot] ثم تم إسناد اللوحة رقم (1) في جلسة العمل الحالية إلى هذا العنصر باستخدام وظيفة [/FONT]Set[FONT=&quot] وذلك على فرض وجود عدة لوحات مفتوحة وعلى فرض أن العنصر [/FONT]Acadapp[FONT=&quot] يمثل كائن أوتوكاد. [/FONT]
[FONT=&quot]وبذلك أصبح بإمكاننا الاستعاضة عن العبارة [/FONT]Application.Documents(1)[FONT=&quot] [/FONT][FONT=&quot]بالعنصر [/FONT]Doc1[FONT=&quot] .[/FONT]
[FONT=&quot] [/FONT]
[FONT=&quot]وكان من الممكن أن نكتب أيضا :[/FONT]

```
Dim Docs As AcadDocuments
  Set Docs = Acadapp.Documents
  Dim Doc1 As AcadDocument
  Set Doc1 = Docs(1)
```
 
[FONT=&quot]في المثال السابق تم تعريف عنصر اسمه [/FONT]DocS[FONT=&quot] على أنه يمثل الكائن [/FONT]_Documents_[FONT=&quot] بعد ذلك تم إسناد جميع اللوحات في جلسة العمل إلى هذا العنصر باستخدام وظيفة [/FONT]Set[FONT=&quot] وذلك على فرض أن العنصر [/FONT]Acadapp[FONT=&quot] يمثل كائن أوتوكاد . بعد ذلك تم تعريف عنصر اسمه [/FONT]Doc1[FONT=&quot] على أنه يمثل كائن [/FONT]*Document*[FONT=&quot] ثم تم إسناد اللوحة رقم (1) في جلسة العمل الحالية إلى هذا العنصر باستخدام وظيفة [/FONT]Set[FONT=&quot] على فرض وجود عدة لوحات مفتوحة في جلسة العمل .[/FONT]
[FONT=&quot]تتفرع عن الكائن [/FONT]*Document*[FONT=&quot] مجموعة من الكائنات الفرعية الأدنى كما هو مبين في الشكل أعلاه وهي :[/FONT]
Blocks – ModelSpace – PaperSpace – Dictionaries – DimStyles –
FileDependencies – Groups – Layers - Layouts - LineTypes -
PlotConfigurations - SelectionSets – RegisteredApplications –
AcadSortentsTable – TableStyle – TextStyles - UCSs - Views – 
Viewports – DatabasePreferences - Plot - SummaryInfo – Utility
[FONT=&quot]وسنتحدث عن أهم هذه الكائنات الفرعية في سياق هذا الشرح .[/FONT]
[FONT=&quot]ولعل أهم هذه الكائنات الفرعية على الإطلاق هو الكائن [/FONT]*ModelSpace*[FONT=&quot] الذي مر معنا سابقاً عند إضافة العناصر الرسومية في جميع دروسنا السابقة .[/FONT]
[FONT=&quot] [/FONT]
*[FONT=&quot]ملاحظات هامة :[/FONT]*
*[FONT=&quot]1- إن آخر لوحة [/FONT]**Document**[FONT=&quot] تتم إضافتها إلى جلسة العمل تصبح هي اللوحة النشطة . ويتيح برنامج أوتوكاد الوصول المباشر إلى هذه اللوحة من خلال الكائن الفرعي [/FONT]**ActiveDocument**[FONT=&quot] والذي يعبر عن اللوحة النشطة أو الحالية (وقد استخدمنا هذا الكائن في جميع دروسنا السابقة عند إنشاء العناصر الرسومية ) . [/FONT]*
*2**[FONT=&quot]- عند إضافة عدة لوحات إلى جلسة العمل نستطيع اختيار أي لوحة من اللوحات وجعلها هي اللوحة النشطة باستخدام الوظيفة [/FONT]**Activate* *[FONT=&quot] وذلك وفق الصيغة :[/FONT]*

```
Application.Documents(n). Activate
```
 
*[FONT=&quot]حيث [/FONT]**n**[FONT=&quot] يعبر عن رقم اللوحة .[/FONT]*
*[FONT=&quot]فمثلاً على فرض وجود عدة لوحات ونريد أن نجعل اللوحة رقم [/FONT]**(0)**[FONT=&quot] هي اللوحة النشطة نكتب السطر التالي :[/FONT]*

```
Application.Documents(0). Activate
```
 
*[FONT=&quot]ولإضافة خط إلى اللوحة النشطة نستطيع أن نكتب :[/FONT]*

```
Application. Documents(0).ModelSpace.AddLine(startPoint, endPoint)
```
 
*[FONT=&quot]أو نعبر عن اللوحة النشطة مباشرة باستخدام الكائن [/FONT]**ActiveDocument**[FONT=&quot] ونكتب :[/FONT]*

```
Application.ActiveDocument.ModelSpace.AddLine(startPoint, endPoint)
```
 
[FONT=&quot] [/FONT]
[FONT=&quot][/FONT]


----------



## Hossam-am (20 يناير 2012)

*[FONT=&quot]تطبيق عملي 1 :[/FONT]*
[FONT=&quot]سنقوم في هذا المثال بشرح بعض الخصائص والوظائف التي تناولناها سابقاً للكائن [/FONT]*Documents*[FONT=&quot] والكائن [/FONT]*Document*[FONT=&quot] حيث سنقوم بما يلي :[/FONT]
1- [FONT=&quot]فتح ملف رسومي موجود على الحاسوب .[/FONT]
2- [FONT=&quot]إضافة لوحة جديدة عدد 2 إلى جلسة العمل .[/FONT]
3- [FONT=&quot]نختبر خاصية [/FONT]Count[FONT=&quot] التي تعيد عدد اللوحات المفتوحة .[/FONT]
4- [FONT=&quot]نقوم بإضافة عناصر رسومية إلى اللوحات السابقة .[/FONT]
5- [FONT=&quot]نتنقل بين اللوحات بجعل كل لوحة من اللوحات نشطة .[/FONT]
6- [FONT=&quot]نقوم بإغلاق جميع اللوحات دفعة واحدة .[/FONT]
*[FONT=&quot]لننتقل إلى التطبيق :[/FONT]*
[FONT=&quot]1- قم أولا بتشغيل برنامج أوتوكاد واحفظ الملف يدوياً وهو فارغ بدون رسم أي عنصر ضمنه باسم [/FONT]Documents_test.dwg[FONT=&quot] في السواقة [/FONT]D [FONT=&quot] بحيث يصبح المسار الكامل للملف "[/FONT]D:/Documents_test.dwg[FONT=&quot]"[/FONT] [FONT=&quot] .[/FONT]
[FONT=&quot]2 - الآن قم بفتح مشروع [/FONT]VB2cad[FONT=&quot] وأضف إلى الإطار [/FONT]Form1[FONT=&quot] زر أمر [/FONT]command[FONT=&quot] واجعل خاصية [/FONT]Name[FONT=&quot] له تساوي [/FONT] Documents1[FONT=&quot]واجعل خاصية [/FONT]Caption[FONT=&quot] تساوي [/FONT]Documents1[FONT=&quot].[/FONT]
[FONT=&quot]3 - في حدث النقر على الزر [/FONT]Documents1[FONT=&quot] في الإطار [/FONT]Form1[FONT=&quot] نكتب الكود التالي :[/FONT]
[FONT=&quot] [/FONT]

```
Private Sub Documents1_Click()
      '-----------------------
      ' 1) Open AutoCAD
      On Error Resume Next
          Set Acadapp = GetObject(, "AutoCAD.Application.17")
          Acadapp.Visible = True
          Acadapp.WindowState = acMax
      If Err.Number <> 0 Then
          Set Acadapp = CreateObject("AutoCAD.Application.17")
          Acadapp.Visible = True
          Acadapp.WindowState = acMax
          Err.Clear
      End If
      '-------------------------
      ' 2) Add Documents
      Acadapp.Documents.Open "D:/Documents_test.dwg"
      Acadapp.Documents.Add ("acadiso.dwt")
      Acadapp.Documents.Add ("acad -Named Plot Styles.dwt")
      '------------------------
      ' 3) Count
      Dim N As Integer
      N = Acadapp.Documents.Count
      Me.Show
      MsgBox "the Number of Documents = " & N
      '------------------------
      ' 4) add Ellipse to Documents(0)
      Dim EllipseObj As AcadEllipse
      Dim majAxis(0 To 2) As Double
      Dim ECenter(0 To 2) As Double
      Dim radRatio As Double
      ECenter(0) = 50: ECenter(1) = 50: ECenter(2) = 0
      majAxis(0) = 10: majAxis(1) = 20: majAxis(2) = 0
      radRatio = 0.3
      Set EllipseObj = Acadapp.Documents(0).ModelSpace.AddEllipse(ECenter, majAxis, radRatio)
      '------------------------
      ' 5) add Polyline to Documents(1)
      Dim plineObj As AcadLWPolyline
      Dim PlinePoints(1 To 10) As Double
      PlinePoints(1) = 75: PlinePoints(2) = 65
      PlinePoints(3) = 135: PlinePoints(4) = 125
      PlinePoints(5) = 230: PlinePoints(6) = 160
      PlinePoints(7) = 330: PlinePoints(8) = 100
      PlinePoints(9) = 255: PlinePoints(10) = -10
      Set plineObj = Acadapp.Documents(1).ModelSpace.AddLightWeightPolyline(PlinePoints)
      '------------------------
      ' 6) add circle to Documents(2)
      Dim CircleObj As AcadCircle
      Dim  Center(2) As Double
      Dim Radius As Double
      Center(0) = 20
      Center(1) = 20
      Center(2) = 0
      Radius = 10
      Acadapp.Documents(2).Activate
      Set CircleObj = Acadapp.ActiveDocument.ModelSpace.AddCircle(Center, Radius)
      '------------------------
      '7) Zoom Documents(0)
      Acadapp.Documents(0).Activate
      Acadapp.ZoomExtents
      Me.Show
      MsgBox "ZoomExtents to Documents(0)"
      '------------------------
      '8) Zoom Documents(1)
      Acadapp.Documents(1).Activate
      Acadapp.ZoomExtents
      Me.Show
      MsgBox "ZoomExtents to Documents(1)"
      '------------------------
      '9) Zoom Documents(2)
      Acadapp.Documents(2).Activate
      Acadapp.ZoomExtents
      Me.Show
      MsgBox "ZoomExtents to Documents(2)"
      '------------------------
      '10) Close All Documents
      Acadapp.Documents.Close
  End Sub
```
 

*[FONT=&quot]الشرح :[/FONT]*
[FONT=&quot]- في الجزء *الأول* من الكود نقوم باختبار كون برنامج أوتوكاد مفتوحاً أو لا من خلال وظيفة [/FONT]GetObject[FONT=&quot] وإسناد التطبيق المفتوح إلى المتحول [/FONT]Acadapp[FONT=&quot] وإلا فنستخدم وظيفة [/FONT]CreateObject[FONT=&quot] لفتح التطبيق وإسناده للمتحول [/FONT]Acadapp[FONT=&quot] . [/FONT]
[FONT=&quot]- في الجزء *الثاني* من الكود نقوم في السطر الأول بفتح الملف الفارغ الذي قمنا بإنشائه سابقا على المسار [/FONT]"D:/Documents_test.dwg"[FONT=&quot] باستخدام الوظيفة [/FONT]Open[FONT=&quot] وتلقائياً تأخذ هذه اللوحة الرقم [/FONT](0)[FONT=&quot] , ثم نقوم باستخدام الوظيفة [/FONT]Add[FONT=&quot] لإضافة لوحة جديدة إلى جلسة العمل بحيث نختار إسم القالب [/FONT][FONT=&quot] [/FONT]"acadiso.dwt"[FONT=&quot] وتلقائياً تأخذ هذه اللوحة الرقم [/FONT](1)[FONT=&quot] , ثم نقوم باستخدام الوظيفة [/FONT]Add[FONT=&quot] لإضافة لوحة جديدة إلى جلسة العمل بحيث نختار إسم القالب [/FONT][FONT=&quot] [/FONT]"acad -Named Plot Styles.dwt"[FONT=&quot] وتلقائياً تأخذ هذه اللوحة الرقم [/FONT](2)[FONT=&quot].[/FONT]
[FONT=&quot]- في الجزء *الثالث* من الكود الموضح في الأسطر التالية :[/FONT]

```
Dim N As Integer
  N = Acadapp.Documents.Count
  Me.Show
  MsgBox "the Number of Documents = " & N
```
[FONT=&quot][/FONT]

[FONT=&quot]قمنا أولاً بتعريف متحول [/FONT]N[FONT=&quot] لتخزين عدد اللوحات المفتوحة في جلسة العمل باستخدام الخاصية [/FONT]Count[FONT=&quot] ثم نقوم بإظهار قيمة هذا المتحول في رسالة [/FONT]MsgBox[FONT=&quot] وهي تساوي 3 .[/FONT]
[FONT=&quot]لاحظ قبل إظهار الرسالة استخدام العبارة [/FONT]Me.Show[FONT=&quot] وهي تجعل الإطار ونص الرسالة تظهر أمام شاشة الأوتوكاد لتسهل رؤيتها .[/FONT]
[FONT=&quot]- في الجزء *الرابع* من الكود قمنا بإنشاء قطع ناقص (تعلمنا طريقة رسم القطع الناقص بشكل مفصل في الدرس السابع من هذه السلسلة ) ورسم القطع الناقص السابق على اللوحة رقم [/FONT](0)[FONT=&quot] وهي تمثل اللوحة الأولى التي قمنا بفتحها من المسار [/FONT]"D:/Documents_test.dwg"[FONT=&quot] وذلك وفق السطر :[/FONT]

```
Set EllipseObj = Acadapp.Documents(0).ModelSpace.AddEllipse(ECenter, majAxis, radRatio)
```
[FONT=&quot][/FONT]

[FONT=&quot]لاحظ هنا كيف اخترنا اللوحة الأولى باستخدام التعبير [/FONT]Acadapp.Documents(0)[FONT=&quot] ثم استدعينا إحدى وظائف الكائن الفرعي [/FONT]*ModelSpace*[FONT=&quot] لإضافة القطع الناقص وهي [/FONT]AddEllipse[FONT=&quot] .[/FONT]
[FONT=&quot] [/FONT]
[FONT=&quot]- في الجزء *الخامس* من الكود قمنا بإنشاء مجمع خطوط [/FONT]Polyline[FONT=&quot] (تعلمنا طريقة رسم مجمع الخطوط [/FONT]Polyline [FONT=&quot] [/FONT][FONT=&quot]بشكل مفصل في الدرس السادس من هذه السلسلة ) ورسم مجمع الخطوط السابق على اللوحة رقم [/FONT](1)[FONT=&quot] وهي تمثل اللوحة الثانية التي قمنا بإضافتها وذلك وفق السطر :[/FONT]

```
Set plineObj = Acadapp.Documents(1).ModelSpace.AddLightWeightPolyline(PlinePoints)
```
 
[FONT=&quot]لاحظ هنا كيف اخترنا اللوحة الثانية باستخدام التعبير [/FONT]Acadapp.Documents(1)[FONT=&quot] ثم استدعينا إحدى وظائف الكائن الفرعي [/FONT]*ModelSpace*[FONT=&quot] لإضافة مجمع الخطوط وهي [/FONT]AddLightWeightPolyline [FONT=&quot].[/FONT]
[FONT=&quot]- في الجزء *السادس* من الكود قمنا بإنشاء دائرة (تعلمنا طريقة رسم الدائرة[/FONT][FONT=&quot] [/FONT][FONT=&quot]بشكل مفصل في الدرس الرابع من هذه السلسلة ) ورسم الدائرة السابقة على اللوحة رقم [/FONT](2)[FONT=&quot] وهي تمثل اللوحة الثالثة التي قمنا بإضافتها وذلك وفق الأسطر :[/FONT]

```
Acadapp.Documents(2).Activate
  Set CircleObj = Acadapp.ActiveDocument.ModelSpace.AddCircle(Center, Radius)
```
 
[FONT=&quot]لاحظ هنا كيف اخترنا اللوحة الثالثة باستخدام التعبير [/FONT]Acadapp.Documents(2)[FONT=&quot] ثم جعلنا هذه اللوحة هي اللوحة النشطة باستخدام الوظيفة [/FONT]*Activate*[FONT=&quot] ثم استدعينا إحدى وظائف الكائن الفرعي [/FONT]*ModelSpace*[FONT=&quot] لإضافة الدائرة وهي [/FONT]AddCircle[FONT=&quot] والتي تم إضافتها إلى اللوحة النشطة مباشرة من خلال استدعاء الكائن [/FONT]*ActiveDocument*[FONT=&quot] [/FONT][FONT=&quot]الذي يعبر عن اللوحة النشطة .[/FONT]
[FONT=&quot]أي أننا جعلنا أولاً اللوحة رقم [/FONT](2)[FONT=&quot] هي اللوحة النشطة ثم استعضنا عن التعبير [/FONT]Acadapp.Documents(2)[FONT=&quot] بالتعبير [/FONT]Acadapp.ActiveDocument[FONT=&quot] وهما يؤديان نفس النتيجة .[/FONT]
[FONT=&quot] [/FONT]
[FONT=&quot]- في الأجزاء 7 و 8 و 9 من الكود قمنا بتصفح اللوحات السابقة بجعل كل لوحة من هذه اللوحات نشطة باستخدام وظيفة [/FONT]*Activate*[FONT=&quot] ثم استخدمنا وظيفة [/FONT]ZoomExtents[FONT=&quot] الملحقة بكائن الأوتوكاد [/FONT]Acadapp[FONT=&quot] لتكبير المعاينة مع إظهار رسالة [/FONT]MsgBox[FONT=&quot] تخبرنا بإتمام تنفيذ العملية .[/FONT]
[FONT=&quot]- في الجزء *العاشر* والأخير من الكود قمنا باستخدام الوظيفة [/FONT]*Close*[FONT=&quot] الملحقة بالكائن [/FONT]*Documents*[FONT=&quot] لإغلاق جميع اللوحات دفعة واحدة . ونلاحظ عند تطبيق هذه الوظيفة أن النتائج ستكون على الشكل التالي :[/FONT]
- [FONT=&quot]سيتم إغلاق اللوحة الأولى (المخزنة على المسار[/FONT][FONT=&quot] [/FONT]D:/Documents_test.dwg[FONT=&quot]) وسيتم حفظ جميع الرسومات والتغييرات الحاصلة على هذه اللوحة تلقائياً .[/FONT]
- [FONT=&quot]سيتم إغلاق اللوحتين الثانية والثالثة واللتين تم إضافتهما باستخدام الوظيفة [/FONT]Add[FONT=&quot] بدون حفظ أي شيء وبدون المطالبة بحفظ هذين الملفين .[/FONT]
*[FONT=&quot]يمكنك الآن تجريب ما قمنا به بالضغط على مفتاح [/FONT]**F5**[FONT=&quot] والضغط على الزر المسمى [/FONT]**Documents1**[FONT=&quot] ولاحظ النتائج .[/FONT]*
*[FONT=&quot]قم بفتح الملف [/FONT]**"D:/Documents_test.dwg"**[FONT=&quot] ولاحظ كيف تم حفظ القطع الناقص السابق ضمن الملف بدون تنفيذ أمر حفظ .[/FONT]*


----------



## Hossam-am (20 يناير 2012)

*[FONT=&quot]تطبيق عملي 2 :[/FONT]*
[FONT=&quot]سنقوم في هذا المثال بتنفيذ نفس الكود السابق تماماً وبدون أي اختلاف سوى بطريقة تعريف الكائنات ضمن الكود . لتنفيذ ذلك نقوم بما يلي :[/FONT]
[FONT=&quot]1 - الآن قم بفتح مشروع [/FONT]VB2cad[FONT=&quot] وأضف إلى الإطار [/FONT]Form1[FONT=&quot] زر أمر [/FONT]command[FONT=&quot] واجعل خاصية [/FONT]Name[FONT=&quot] له تساوي [/FONT] Documents2[FONT=&quot]واجعل خاصية [/FONT]Caption[FONT=&quot] له تساوي [/FONT]Documents2[FONT=&quot].[/FONT]
2[FONT=&quot] - في حدث النقر على الزر [/FONT]Documents2[FONT=&quot] في الإطار [/FONT]Form1[FONT=&quot] نكتب الكود التالي :[/FONT]

```
Private Sub Documents2_Click()
      '-----------------------
      ' 1) Open AutoCAD
      On Error Resume Next
          Set Acadapp = GetObject(, "AutoCAD.Application.17")
          Acadapp.Visible = True
          Acadapp.WindowState = acMax
      If Err.Number <> 0 Then
          Set Acadapp = CreateObject("AutoCAD.Application.17")
          Acadapp.Visible = True
          Acadapp.WindowState = acMax
          Err.Clear
      End If
      '-------------------------
      ' 2) Add Documents
      Dim Docs As AcadDocuments
      Set Docs = Acadapp.Documents
      Docs.Open "D:/Documents_test.dwg"
      Docs.Add ("acadiso.dwt")
      Docs.Add ("acad -Named Plot Styles.dwt")
      Dim Doc0 As AcadDocument
      Set Doc0 = Docs(0)
      Dim Doc1 As AcadDocument
      Set Doc1 = Docs(1)
      Dim Doc2 As AcadDocument
      Set Doc2 = Docs(2)
      '------------------------
      ' 3) Count
      Dim N As Integer
      N = Docs.Count
      Me.Show
      MsgBox "the Number of Documents = " & N
      '------------------------
      ' 4) add Ellipse to Documents(0)
      Dim EllipseObj As AcadEllipse
      Dim majAxis(0 To 2) As Double
      Dim ECenter(0 To 2) As Double
      Dim radRatio As Double
      ECenter(0) = 50: ECenter(1) = 50: ECenter(2) = 0
      majAxis(0) = 10: majAxis(1) = 20: majAxis(2) = 0
      radRatio = 0.3
      Set EllipseObj = Doc0.ModelSpace.AddEllipse(ECenter, majAxis, radRatio)
      '------------------------
      ' 5) add Polyline to Documents(1)
      Dim plineObj As AcadLWPolyline
      Dim PlinePoints(1 To 10) As Double
      PlinePoints(1) = 75: PlinePoints(2) = 65
      PlinePoints(3) = 135: PlinePoints(4) = 125
      PlinePoints(5) = 230: PlinePoints(6) = 160
      PlinePoints(7) = 330: PlinePoints(8) = 100
      PlinePoints(9) = 255: PlinePoints(10) = -10
      Set plineObj = Doc1.ModelSpace.AddLightWeightPolyline(PlinePoints)
      '------------------------
      ' 6) add circle to Documents(2)
      Dim CircleObj As AcadCircle
      Dim  Center(2) As Double
      Dim Radius As Double
      Center(0) = 20
      Center(1) = 20
      Center(2) = 0
      Radius = 10
      Doc2.Activate
      Set CircleObj = Acadapp.ActiveDocument.ModelSpace.AddCircle(Center, Radius)
      '------------------------
      '7) Zoom Documents(0)
      Doc0.Activate
      Acadapp.ZoomExtents
      Me.Show
      MsgBox "ZoomExtents to Documents(0)"
      '------------------------
      '8) Zoom Documents(1)
      Doc1.Activate
      Acadapp.ZoomExtents
      Me.Show
      MsgBox "ZoomExtents to Documents(1)"
      '------------------------
      '9) Zoom Documents(2)
      Doc2.Activate
      Acadapp.ZoomExtents
      Me.Show
      MsgBox "ZoomExtents to Documents(2)"
      '------------------------
      '10) Close All Documents
      Docs.Close
  End Sub
```
 
[FONT=&quot] [/FONT]
*[FONT=&quot]الشرح :[/FONT]*
[FONT=&quot]إن نتيجة الكود السابق تعطي نفس النتيجة للكود المستخدم في التطبيق 1 بدون أي تغيير والهدف من هذا الكود هو عرض طريقة مختلفة في تعريف الكائنات والتعامل معها . أما التعديلات التي أجريناها على هذا الكود فقد تم تغيير القسم الثاني من الكود المستخدم في التطبيق 1 وتم كتابته وفق الآتي :[/FONT]

```
Dim Docs As AcadDocuments
  Set Docs = Acadapp.Documents
  Docs.Open "D:/Documents_test.dwg"
  Docs.Add ("acadiso.dwt")
  Docs.Add ("acad -Named Plot Styles.dwt")
  Dim Doc0 As AcadDocument
  Set Doc0 = Docs(0)
  Dim Doc1 As AcadDocument
  Set Doc1 = Docs(1)
  Dim Doc2 As AcadDocument
  Set Doc2 = Docs(2)
```
 
[FONT=&quot]1- تم تعريف عنصر اسمه [/FONT]DocS[FONT=&quot] على أنه يمثل الكائن [/FONT]_Documents_[FONT=&quot] بعد ذلك تم إسناد جميع اللوحات في جلسة العمل إلى هذا العنصر باستخدام وظيفة [/FONT]Set[FONT=&quot] ثم فتح الملف [/FONT]"Documents_test.dwg"[FONT=&quot] [/FONT][FONT=&quot]وإضافة لوحتين جديدتين[/FONT][FONT=&quot] [/FONT][FONT=&quot]. [/FONT]
[FONT=&quot]2 - بعد ذلك تم تعريف عنصر اسمه [/FONT]Doc0[FONT=&quot] على أنه يمثل كائن [/FONT]*Document*[FONT=&quot] ثم تم إسناد اللوحة رقم ([/FONT]0[FONT=&quot]) في جلسة العمل الحالية إلى هذا العنصر باستخدام وظيفة [/FONT]Set[FONT=&quot] . [/FONT]
[FONT=&quot]3 - وبنفس الطريقة تم تعريف عنصرين [/FONT]Doc1[FONT=&quot] و [/FONT]Doc2[FONT=&quot] ثم تم إسناد اللوحتين رقم ([/FONT]1[FONT=&quot]) ورقم [/FONT](2)[FONT=&quot] في جلسة العمل الحالية إلى هذين العنصرين باستخدام وظيفة [/FONT]Set[FONT=&quot] .[/FONT]
[FONT=&quot]4 - في بقية أقسام الكود تم الاستعاضة عن العبارة [/FONT]Acadapp.Documents[FONT=&quot] بالعبارة [/FONT]DocS[FONT=&quot] . كما تم الاستعاضة عن العبارة [/FONT]Acadapp.Documents(0)[FONT=&quot] بالعبارة [/FONT]Doc0[FONT=&quot] وعن العبارة [/FONT]Acadapp.Documents(1)[FONT=&quot] بالعبارة [/FONT]Doc1[FONT=&quot] وعن العبارة [/FONT]Acadapp.Documents(2)[FONT=&quot] بالعبارة [/FONT]Doc2[FONT=&quot] .[/FONT]
*[FONT=&quot]قم بتجريب ما قمنا به بالضغط على مفتاح [/FONT]**F5**[FONT=&quot] والضغط على الزر المسمى [/FONT]**Documents2**[FONT=&quot] ولاحظ النتائج .[/FONT]*

*[FONT=&quot][/FONT]*
*[FONT=&quot]الدرس الثاني في بيئة أوتوكتد كاملاً بصيغة PDF ومثال المشروع VB2cad تجدونها على الرابط :[/FONT]*
http://www.facebook.com/groups/267612119966249/doc/283570558370405/


*[FONT=&quot]أو على الروابط :
[/FONT]*http://www.mediafire.com/download.php?b63lm699qmlo5xa

http://www.mediafire.com/download.php?4tms08u6fbn281i


----------



## ماجد شرف (20 يناير 2012)

بارك الله فيك وجزاك خيرا عن وقتك ومجهودك
لا يسعنا القول الا ان نشكرك شكرا جزيلاا


----------



## خالد الأزهري (20 يناير 2012)

جزاك الله خيرا مرة اخرى اخي حسام...
الموضوع للتثبيت


----------



## Hossam-am (20 يناير 2012)

*شكراً يا استاذ خالد على التثبيت ... ومتابع معكم حتى النهاية بحول الله*
*الدرس الثالث قيد التجهيز ....أنتظر اسئلتكم واسفساراتكم*​


----------



## المهندس ابوعمر (21 يناير 2012)

نشكر اخونا خالد الازهري علي تثبيت هذا الموضوع الهام جدا 

ونشكر الاخ حسام علي مجهوده الرائع 

جعله الله في ميزان حسناتك


----------



## خالد الأزهري (21 يناير 2012)

hossam-am قال:


> *شكراً يا استاذ خالد على التثبيت ... ومتابع معكم حتى النهاية بحول الله*
> *الدرس الثالث قيد التجهيز ....أنتظر اسئلتكم واسفساراتكم*​



لا شكر على واجب اخي الكريم ...
ياريت لو عملت موضوع به رابط لهذه الدورة القيمة في قسم الهندسة المعمارية وفي قسم هندسة الطرق والمساحة لان الموضوع مهم لهم ايضا...

بالتوفيق


----------



## Hossam-am (21 يناير 2012)

تم وضع رابط للموضوع في قسم المساحة والطرق ورابط ايضاً للموضوع في قسم الهندسة المعمارية

مع جزيل الشكر​


----------



## Hossam-am (21 يناير 2012)

*الدرس الثالث في بيئة اوتوكاد (وظائف التحكم بالكائن Document )*


*[FONT=&quot]وظائف التحكم بالكائن [/FONT]**Document**[FONT=&quot] :[/FONT]*

[FONT=&quot]1 – الوظيفة [/FONT]*Activate* [FONT=&quot] وهي لجعل لوحة ما في جلسة العمل هي اللوحة النشطة . حيث الصيغة العامة لاستخدام هذه الوظيفة على الشكل التالي :[/FONT]


```
Application.Documents(n).Activate
```
 
[FONT=&quot]حيث [/FONT]*n*[FONT=&quot] يعبر عن رقم اللوحة .[/FONT]

[FONT=&quot]وإذا فرضنا أن العنصر [/FONT]*Doc*[FONT=&quot] (كما شرحنا في المثال سابقاً) يمثل كائن [/FONT]*Document*[FONT=&quot] فيمكن كتابة الصيغة السابقة مباشرة على الشكل :[/FONT]


```
Doc.Activate
```
 
[FONT=&quot]والصيغتان تعطيان نفس النتيجة .[/FONT]

[FONT=&quot]2 – الوظيفة [/FONT]*SaveAs*[FONT=&quot] وهي لحفظ لوحة الرسم بمسار محدد وتنسيق محدد أو لعمل نسخة عن الملف الرسومي بمسار محدد وتنسيق محدد . حيث الصيغة العامة لاستخدام هذه الوظيفة على الشكل التالي :[/FONT]


```
Application.Documents(n).SaveAs FileName, FileType
```
 
[FONT=&quot]حيث [/FONT]*n*[FONT=&quot] يعبر عن رقم اللوحة .[/FONT]

[FONT=&quot]وإذا فرضنا أن العنصر [/FONT]*Doc*[FONT=&quot] يمثل كائن [/FONT]*Document*[FONT=&quot] فيمكن كتابة الصيغة السابقة مباشرة على الشكل :[/FONT]


```
Doc.SaveAs FileName, FileType
```
 [FONT=&quot][/FONT]

[FONT=&quot]حيث :[/FONT]

FileName[FONT=&quot] : يعبر عن الاسم والمسار الكامل للموقع المراد حفظ الملف به كأن يكون مثلاً :[/FONT]

[FONT=&quot] [/FONT]

```
"D:/VB2cad/Test"
```
[FONT=&quot] [/FONT]

FileType[FONT=&quot] : يعبر عن التنسيق المراد حفظ الملف به ويأخذ إحدى القيم الموضحة في الجدول التالي :[/FONT]

acR14_dwg[FONT=&quot] : وتعبر عن [/FONT]AutoCAD R14 DWG (*.dwg)[FONT=&quot][/FONT]

ac2000_dwg[FONT=&quot] : وتعبر عن [/FONT]AutoCAD 2000 DWG (*.dwg)[FONT=&quot][/FONT]

ac2000_dxf[FONT=&quot] : : وتعبر عن [/FONT]AutoCAD 2000 DXF (*.dxf)[FONT=&quot][/FONT]

ac2000_Template[FONT=&quot] : وتعبر عن [/FONT]AutoCAD 2000 Drawing Template File (*.dwt)[FONT=&quot][/FONT]

ac2004_dwg[FONT=&quot] : وتعبر عن [/FONT]AutoCAD 2004 DWG (*.dwg)[FONT=&quot] [/FONT]

ac2004_dxf[FONT=&quot] : وتعبر عن [/FONT]AutoCAD 2004 DXF (*.dxf)[FONT=&quot][/FONT]

ac2004_Template[FONT=&quot] : وتعبر عن [/FONT]AutoCAD 2004 Drawing Template File (*.dwt)[FONT=&quot][/FONT]

ac2007_dwg[FONT=&quot] : وتعبر عن [/FONT]AutoCAD 2007 DWG (*.dwg)[FONT=&quot][/FONT]

ac2007_dxf[FONT=&quot] : وتعبر عن [/FONT]AutoCAD 2007 DXF (*.dxf)[FONT=&quot][/FONT]

ac2007_Template[FONT=&quot] : وتعبر عن [/FONT]AutoCAD 2007 Drawing Template File (*.dwt)[FONT=&quot][/FONT]

*[FONT=&quot]مثال :[/FONT]*

[FONT=&quot]بفرض لدينا عدة لوحات مفتوحة في جلسة العمل الحالية ونريد حفظ اللوحة رقم [/FONT](1)[FONT=&quot] بتنسيق [/FONT]ac2004_dxf[FONT=&quot] فإننا نكتب :[/FONT]


```
Acadapp.Documents(1).SaveAs "D:/TestDrw", ac2004_dxf
```
 
[FONT=&quot]لاحظ أن الملف الناتج هو [/FONT]TestDrw.dxf[FONT=&quot] .[/FONT]

*[FONT=&quot]وهنا لا بد من الإشارة إلى بعض الملاحظات :[/FONT]*

*[FONT=&quot]إن استخدام الوظيفة [/FONT]**SaveAs**[FONT=&quot] لملف مخزن مسبقاً سيؤدي إلى إنشاء نسخة عن هذه الملف .[/FONT]*

*[FONT=&quot]إسم الملف [/FONT]**FileName**[FONT=&quot] يكتب بدون لاحقة كأن نكتب مثلاً [/FONT]**"D:/Draw1"**[FONT=&quot] وهنا الملف [/FONT]**Draw1**[FONT=&quot] ستتحدد لاحقته من خلال خاصية [/FONT]**FileType**[FONT=&quot] . فإذا لم نعطي قيمة لهذه الخاصية معنى ذلك انه سيتم الحفظ افتراضياً بتنسيق [/FONT]**ac2007_dwg* *[FONT=&quot]باعتبار أننا نستخدم برنامج أوتوكاد [/FONT]**2007**[FONT=&quot] وسنجد أن إسم الملف يصبح [/FONT]**Draw1.dwg**[FONT=&quot] .[/FONT]*

*[FONT=&quot]خاصية [/FONT]**FileType**[FONT=&quot] اختيارية فعند عدم تحديد تنسيق الملف سيتم الحفظ افتراضياً بتنسيق [/FONT]**ac2007_dwg* *[FONT=&quot] باعتبار أننا نستخدم برنامج أوتوكاد [/FONT]**2007**[FONT=&quot] أو بتنسيق [/FONT]**ac2009_dwg**[FONT=&quot] إذا كنا نستخدم برنامج أوتوكاد [/FONT]**2009**[FONT=&quot] وهكذا .[/FONT]*

*[FONT=&quot] [/FONT]*

[FONT=&quot]3 – الوظيفة [/FONT]*Save*[FONT=&quot] وهي لحفظ التغييرات على ملف محدد مخزن مسبقاً . حيث الصيغة العامة لاستخدام هذه الوظيفة على الشكل التالي :[/FONT]


```
Application.Documents(n).Save
```
 
[FONT=&quot]حيث [/FONT]*n*[FONT=&quot] يعبر عن رقم اللوحة .[/FONT]

[FONT=&quot]وإذا فرضنا أن العنصر [/FONT]*Doc*[FONT=&quot] يمثل كائن [/FONT]*Document*[FONT=&quot] فيمكن كتابة الصيغة السابقة مباشرة على الشكل :[/FONT]


```
Doc.Save
```
[FONT=&quot][/FONT]

[FONT=&quot] [/FONT]

[FONT=&quot]تستخدم هذه الخاصية لحفظ التغييرات الحاصلة على لوحة الرسم المخزنة مسبقاً . فمثلاً إذا تم إضافة لوحة جديدة إلى جلسة العمل باستخدام الوظيفة [/FONT]Add[FONT=&quot] عندها يتم تخزين اللوحة باستخدام الوظيفة [/FONT]SaveAs[FONT=&quot] ثم يتم حفظ أية تغييرات مستقبلية على اللوحة خلال العمل باستخدام الوظيفة [/FONT]Save[FONT=&quot] . أما إذا قمنا بفتح لوحة مخزنة مسبقاً باستخدام الوظيفة [/FONT]Open[FONT=&quot] فعندها يتم حفظ أية تغييرات مستقبلية على هذه اللوحة باستخدام الوظيفة [/FONT]Save[FONT=&quot] مباشرة . أما استخدام الوظيفة [/FONT]SaveAs[FONT=&quot] على هذه اللوحة سيؤدي لإنشاء نسخة عنها .[/FONT]

[FONT=&quot]4 – الوظيفة [/FONT]*Export*[FONT=&quot] وتستخدم هذه الوظيفة لحفظ الملفات الرسومية بتنسيق مختلف عن التنسيقات التي تتيحها وظيفة [/FONT]_SaveAs_[FONT=&quot] . كما تستخدم لتصدير بيانات عن بعض العناصر الرسومية أو جميعها الموجودة في لوحة محددة وبتنسيق محدد . حيث الصيغة العامة لاستخدام هذه الوظيفة على الشكل التالي :[/FONT]


```
Application.Documents(n).Export FileName, Extension, SelectionSet
```
 
[FONT=&quot]حيث [/FONT]*n*[FONT=&quot] يعبر عن رقم اللوحة .[/FONT]

[FONT=&quot]وإذا فرضنا أن العنصر [/FONT]*Doc*[FONT=&quot] يمثل كائن [/FONT]*Document*[FONT=&quot] فيمكن كتابة الصيغة السابقة مباشرة على الشكل :[/FONT]


```
Doc.Export FileName, Extension, SelectionSet
```
 
*[FONT=&quot]حيث :[/FONT]*

*FileName*[FONT=&quot] : الاسم والمسار الكاملين للملف الناتج عن التصدير (الاسم يكتب بدون لاحقة) مثلاً :[/FONT]

[FONT=&quot] [/FONT]

```
"C:\AutoCAD\DXFExprt"
```
 
*Extension*[FONT=&quot] : يعبر عن الامتداد أو التنسيق الذي سيحفظ به الملف الناتج عن التصدير وهو يأخذ إحدى القيم التالية :[/FONT]


```
Wmf – sat – bmp -  eps – dxf
```
[FONT=&quot] [/FONT]

SelectionSet[FONT=&quot] : مجموعة مؤلفة من عنصر واحد أو عدد من العناصر يتم التعامل معها كوحدة واحدة في الملف الرسومي . وهذه المجموعة تحدد العناصر المراد تصدير بياناتها باستخدام الوظيفة [/FONT]Export[FONT=&quot] وهنا نميز حالتين :[/FONT]

[FONT=&quot]في حال تم اختيار امتداد الملف الناتج عن التصدير بإحدى القيم [/FONT]Wmf – sat – bmp[FONT=&quot] فهنا لا بد من تحديد العناصر المراد تصدير بياناتها ويتم ذلك بإنشاء مجموعة تحوي هذه العناصر ونضمنها للصيغة الخاصة بوظيفة [/FONT]Export

[FONT=&quot]في حال تم اختيار امتداد الملف الناتج عن التصدير بإحدى القيم [/FONT]eps – dxf [FONT=&quot] [/FONT] [FONT=&quot]فهنا نكتفي بإنشاء مجموعة فارغة ونضمنها للصيغة الخاصة بوظيفة [/FONT]Export[FONT=&quot] وفي هذه الحالة سيتم تجاهل هذه المجموعة وسيتم تصدير الملف بالكامل بالتنسيق المحدد .[/FONT]

*[FONT=&quot]نشير إلى أن [/FONT]**SelectionSet**[FONT=&quot] عبارة عن كائن فرعي تابع للكائن [/FONT]**Document**[FONT=&quot] وسيتم الحديث عنه مفصلاً في سياق هذا الشرح مع ذكر طريقة إنشاؤه والتحكم به وأهم خصائصه .[/FONT]*

[FONT=&quot] [/FONT]

[FONT=&quot]يتبع..................[/FONT]
​


----------



## نور الحمداني (22 يناير 2012)

بارك الله فيك يااخي على هذا المجهود.


----------



## Hossam-am (23 يناير 2012)

*[FONT=&quot]مثال :[/FONT]*

[FONT=&quot]بفرض لدينا عدة لوحات مفتوحة في جلسة العمل الحالية فلتصدير بيانات اللوحة النشطة بتنسيق [/FONT]Dxf[FONT=&quot] مثلاً فإننا نكتب السطور التالية :[/FONT]
​

```
Dim sset As AcadSelectionSet
  Set sset = Acadapp.ActiveDocument.SelectionSets.Add("TEST")
  Acadapp.ActiveDocument.Export "D:/DXFExprt", "DXF", sset
```


[FONT=&quot]ونلاحظ من المثال السابق :[/FONT]

[FONT=&quot]1- تم تعريف عنصر اسمه [/FONT]sset[FONT=&quot] على أنه كائن [/FONT]*SelectionSet*[FONT=&quot] ثم تم إسناد مجموعة جديدة اسمها [/FONT]"TEST"[FONT=&quot] إلى العنصر السابق باستخدام الوظيفة [/FONT]set[FONT=&quot] . [/FONT]

[FONT=&quot]2- لم يتم تضمين أي عنصر رسومي إلى المجموعة السابقة (مجموعة فارغة) نظراً لاختيار التنسيق [/FONT]DXF[FONT=&quot] . [/FONT]

[FONT=&quot]3- بعد ذلك تم استخدام الوظيفة [/FONT]Export[FONT=&quot] لتصدير بيانات اللوحة النشطة إلى ملف خارجي باسم [/FONT]"D:/DXFExprt"[FONT=&quot] وبتنسيق [/FONT]DXF[FONT=&quot] . [/FONT]



[FONT=&quot]4 – الوظيفة [/FONT]*Close*[FONT=&quot] وتستخدم هذه الوظيفة لإغلاق لوحة الرسم المحددة . حيث الصيغة العامة لاستخدام هذه الوظيفة على الشكل التالي :[/FONT]​

```
Application.Documents(n).Close ([SaveChanges][, FileName])
```
 
[FONT=&quot]حيث [/FONT]*n*[FONT=&quot] يعبر عن رقم اللوحة .[/FONT]

[FONT=&quot]وإذا فرضنا أن العنصر [/FONT]*Doc*[FONT=&quot] يمثل كائن [/FONT]*Document*[FONT=&quot] فيمكن كتابة الصيغة السابقة مباشرة على الشكل :[/FONT]​

```
Doc.Close ([SaveChanges][, FileName])
```
 
*[FONT=&quot]حيث :[/FONT]*

SaveChanges[FONT=&quot] : متغير يحدد فيما إذا سيتم حفظ التغييرات الحاصلة على الملف الرسومي أم لا ويأخذ إحدى قيمتين [/FONT]False[FONT=&quot] أو [/FONT]True[FONT=&quot] . وهو اختياري وفي حال عدم إدخال قيمة له فالقيمة الافتراضية له تساوي [/FONT]True[FONT=&quot] .[/FONT]

FileName[FONT=&quot] : متغير اختياري أيضاً لتخزين إسم الملف الرسومي المراد حفظه .[/FONT]



*[FONT=&quot]ملاحظات :[/FONT]*

[FONT=&quot]1[/FONT][FONT=&quot]- إذا لم يتم إجراء أية تغييرات على لوحة الرسم فسيتم تطبيق الوظيفة [/FONT]*Close*[FONT=&quot] وإغلاق لوحة الرسم *وتجاهل* المتغيرين [/FONT]SaveChanges[FONT=&quot] و [/FONT]FileName[FONT=&quot] بشكل كامل .[/FONT]

[FONT=&quot]مثال: [/FONT][FONT=&quot] بفرض تم إضافة لوحة رسومية جديدة [/FONT]_Doc_[FONT=&quot] إلى جلسة العمل ولم نقم بإجراء أية تغييرات على هذه اللوحة ثم أردنا إغلاق هذه اللوحة فإننا نكتب الكود التالي :[/FONT]​

```
Doc.Close
```
 
[FONT=&quot]الكود السابق سيؤدي إلى إغلاق اللوحة [/FONT]Doc[FONT=&quot] . وهنا نلاحظ أنه لم نقم بإدخال قيم للمتغيرين [/FONT]SaveChanges[FONT=&quot] و [/FONT]FileName[FONT=&quot] نظراً لعدم حصول أية تغييرات في لوحة الرسم .[/FONT]

[FONT=&quot]وحتى ولو قمنا بإعطاء قيم للمتغيرين السابقين *فسوف يتم تجاهلهما تماماً* نظراً لعدم حصول أية تغييرات على لوحة الرسم .[/FONT]

[FONT=&quot]2[/FONT][FONT=&quot]- في حال قمنا بإجراء تغييرات على لوحة الرسم (رسم خط مثلاً) ثم أردنا إغلاق هذه اللوحة باستخدام الوظيفة [/FONT]*Close*[FONT=&quot] فهنا لا بد من تحديد هل سيتم حفظ التغييرات التي تم إجراؤها على اللوحة السابقة أم لا أي لابد من تحديد قيمة للمتغير [/FONT]SaveChanges[FONT=&quot] .[/FONT]

*[FONT=&quot]-[/FONT]*[FONT=&quot] فإذا تم تحديد قيمته [/FONT]False[FONT=&quot] للمتحول [/FONT]SaveChanges[FONT=&quot] فمعنى ذلك أننا نريد إغلاق اللوحة بدون حفظ التغييرات الحاصلة عليها وسيتم تجاهل المتغير [/FONT]FileName

[FONT=&quot]- أما إذا تم تحديد قيمة [/FONT]True[FONT=&quot] للمتحول [/FONT]SaveChanges[FONT=&quot] (أو لم يتم تحديد قيمة له باعتبار أن قيمته الافتراضية تساوي [/FONT]True[FONT=&quot] ) فمعنى ذلك أننا نريد إغلاق اللوحة مع حفظ التغييرات الحاصلة عليها وهنا يجب الأخذ بعين الاعتبار المتغير [/FONT]FileName[FONT=&quot] . وهنا نميز الحالات التالية :[/FONT]

[FONT=&quot] أ) – في حال كانت اللوحة الرسومية المراد إغلاقها والتي تم إجراء تغييرات عليها مخزنة مسبقاً باستخدام إحدى الوظيفتين [/FONT]_SaveAs_[FONT=&quot] أو [/FONT]_Save_[FONT=&quot] أو تم فتحها باستخدام الوظيفة [/FONT]Open[FONT=&quot] فهنا سيتم تجاهل المتغير [/FONT]FileName[FONT=&quot] .[/FONT]

[FONT=&quot] ب) – فيما عدا ذلك لا بد من تحديد قيمة للمتغير [/FONT]FileName[FONT=&quot] لتحديد إسم ومسار اللوحة ليتم حفظ التغييرات عليها قبل إغلاقها .[/FONT]

*[FONT=&quot]وسيتم شرح طريقة [/FONT]**Close**[FONT=&quot] بالتفصيل في التطبيقات العملية القادمة .[/FONT]*





[FONT=&quot]5 – الوظيفة[/FONT].*Regen* [FONT=&quot] لعمل إعادة توليد للعناصر الرسومية في المعاينة الحالية . الصيغة العامة لهذه الوظيفة على الشكل :[/FONT]​

```
Application.Documents(n).Regen WhichViewports
```
 
[FONT=&quot]حيث [/FONT]*n*[FONT=&quot] يعبر عن رقم اللوحة .[/FONT]

[FONT=&quot]وإذا فرضنا أن العنصر [/FONT]*Doc*[FONT=&quot] يمثل كائن [/FONT]*Document*[FONT=&quot] فيمكن كتابة الصيغة السابقة مباشرة على الشكل :[/FONT]​

```
Doc.Regen WhichViewports
```
 
*[FONT=&quot]حيث :[/FONT]*

WhichViewports[FONT=&quot] : متغير يحدد فيما إذا كانت عملية إعادة توليد العناصر ستتم فقط على المعاينة الحالية وعندها يأخذ القيمة [/FONT]acActiveViewport[FONT=&quot] , أو إذا كانت عملية إعادة توليد العناصر ستتم على جميع المعاينات في اللوحة وعندها يأخذ القيمة [/FONT]acAllViewports[FONT=&quot] ,[/FONT]



[FONT=&quot]6 – الوظيفة[/FONT] *PurgeAll* [FONT=&quot] لعمل تطهير للوحة الحالية بمعنى إزالة جميع الارتباطات الغير مستعملة في الملف الرسومي كالكتل المحملة والغير مدرجة أو كالطبقات الموجودة والتي لا تحوي أي عناصر ضمنها . الصيغة العامة لهذه الوظيفة على الشكل :[/FONT]​

```
Application.Documents(n).PurgeAll
```
 
[FONT=&quot]حيث [/FONT]*n*[FONT=&quot] يعبر عن رقم اللوحة .[/FONT]

[FONT=&quot]وإذا فرضنا أن العنصر [/FONT]*Doc*[FONT=&quot] يمثل كائن [/FONT]*Document*[FONT=&quot] فيمكن كتابة الصيغة السابقة مباشرة على الشكل :[/FONT]



```
Doc. PurgeAll
```


----------



## Hossam-am (23 يناير 2012)

*[FONT=&quot]تطبيق عملي :[/FONT]*

[FONT=&quot]سنقوم بهذا التطبيق بشرح الوظائف السابقة للكائن [/FONT]*Document*[FONT=&quot] وفق ما يلي :[/FONT]

[FONT=&quot]1- فتح لوحة مخزنة على الجهاز بمسار محدد باستخدام الوظيفة [/FONT]Open[FONT=&quot] وإجراء بعض التغييرات عليها ثم حفظ هذه التغييرات باستخدام الوظيفة [/FONT]Save[FONT=&quot] ثم عمل نسخة عن الملف الرسومي باستخدام الوظيفة [/FONT]SaveAs[FONT=&quot] ثم إغلاق هذه اللوحة باستخدام الوظيفة [/FONT]Close[FONT=&quot].[/FONT]

[FONT=&quot]2- فتح لوحة مخزنة على الجهاز بمسار محدد باستخدام الوظيفة [/FONT]Open[FONT=&quot] وإجراء بعض التغييرات عليها ثم إغلاق هذه اللوحة مباشرة باستخدام الوظيفة [/FONT]Close[FONT=&quot] *مع حفظ* التغييرات الحاصلة .[/FONT]

[FONT=&quot]3- فتح لوحة مخزنة على الجهاز بمسار محدد باستخدام الوظيفة [/FONT]Open[FONT=&quot] وإجراء بعض التغييرات عليها ثم إغلاق هذه اللوحة مباشرة باستخدام الوظيفة [/FONT]Close[FONT=&quot] *بدون حفظ* التغييرات الحاصلة .[/FONT]

[FONT=&quot]4- إضافة لوحة جديدة إلى جلسة العمل باستخدام الوظيفة [/FONT]Add[FONT=&quot] وإجراء بعض التغييرات عليها ثم حفظ هذه اللوحة باستخدام الوظيفة [/FONT]SaveAs[FONT=&quot] ثم إغلاق هذه اللوحة باستخدام الوظيفة [/FONT]Close[FONT=&quot] .[/FONT]

[FONT=&quot]5- إضافة لوحة جديدة إلى جلسة العمل باستخدام الوظيفة [/FONT]Add[FONT=&quot] وإجراء بعض التغييرات عليها ثم إغلاق هذه اللوحة مباشرة باستخدام الوظيفة [/FONT]Close[FONT=&quot] *مع حفظ* التغييرات الحاصلة .[/FONT]

[FONT=&quot]6- إضافة لوحة جديدة إلى جلسة العمل باستخدام الوظيفة [/FONT]Add[FONT=&quot] وإجراء بعض التغييرات عليها ثم إغلاق هذه اللوحة مباشرة باستخدام الوظيفة [/FONT]Close[FONT=&quot] *بدون حفظ* التغييرات الحاصلة .[/FONT]

[FONT=&quot]7 – إضافة لوحة جديدة إلى جلسة العمل باستخدام الوظيفة [/FONT]Add[FONT=&quot] وإضافة بعض العناصر الرسومية لها و تطبيق الوظيفة [/FONT]Export[FONT=&quot] والوظيفتين [/FONT]Regen[FONT=&quot] و[/FONT] PurgeAll[FONT=&quot]. [/FONT]

*[FONT=&quot]لننتقل إلى التطبيق :[/FONT]*

[FONT=&quot]1- قم أولا بتشغيل برنامج أوتوكاد واحفظ الملف يدوياً وهو فارغ بدون رسم أي عنصر ضمنه باسم [/FONT]Doc_test0.dwg[FONT=&quot] في السواقة [/FONT]D[FONT=&quot] أو في أي مكان تختاره بحيث يصبح المسار الكامل للملف :[/FONT]​
```
D:/ Doc_test0.dwg
```


[FONT=&quot]2- كرر الخطوة السابقة مرتين إضافيتين بحيث نحصل على ملفين فارغين وخزنهما على السواقة [/FONT]D[FONT=&quot] أو أي مكان آخر تختاره بحيث تصبح المسارات على الشكل :[/FONT]
​ 
```
D:/ Doc_test1.dwg
```
 
```
D:/ Doc_test2.dwg
```
 
[FONT=&quot]3 - الآن قم بفتح مشروع [/FONT]VB2cad[FONT=&quot] وأضف إلى الإطار [/FONT]Form1[FONT=&quot] زر أمر [/FONT]command[FONT=&quot] واجعل خاصية [/FONT]Name[FONT=&quot] له تساوي [/FONT] DocMethod[FONT=&quot]واجعل خاصية [/FONT]Caption[FONT=&quot] تساوي [/FONT]DocMethod[FONT=&quot] .[/FONT]

[FONT=&quot]4 - في حدث النقر على الزر [/FONT]DocMethod[FONT=&quot] في الإطار [/FONT]Form1[FONT=&quot] نكتب الكود التالي :[/FONT]​


----------



## ابوسند الليبي (23 يناير 2012)

مجهود تشكر علية


----------



## Hossam-am (23 يناير 2012)

```
Private Sub DocMethod_Click()
'-------------------------
      ' 1) Open AutoCAD
      On Error Resume Next
          Set Acadapp = GetObject(, "AutoCAD.Application.17")
          Acadapp.Visible = True
          Acadapp.WindowState = acMax
      If Err.Number <> 0 Then
          Set Acadapp = CreateObject("AutoCAD.Application.17")
          Acadapp.Visible = True
          Acadapp.WindowState = acMax
          Err.Clear
      End If
      Me.Show
      '-------------------------
      ' 2) Add Documents
      Dim Docs As AcadDocuments
      Set Docs = Acadapp.Documents
      '-------------------------
      ' 3) Doc0 add line then save then saveAs then close
      Dim Doc0 As AcadDocument
      Set Doc0 = Docs.Open("D:/Doc_test0.dwg")
      Dim Line1 As AcadLine
      Dim StartPt(2) As Double
      Dim EndPt(2) As Double
      StartPt(0) = 2: StartPt(1) = 2: StartPt(2) = 0
      EndPt(0) = 1: EndPt(1) = 5: EndPt(2) = 0
      Set Line1 = Doc0.ModelSpace.AddLine(StartPt, EndPt)
      Acadapp.ZoomExtents
      MsgBox "Doc0 has been Changed"
      Doc0.Save
      MsgBox "Doc0 has been Saved"
      Doc0.SaveAs "D:/Doc0_Saved", ac2007_dwg
      Doc0.Close
      MsgBox "Doc0 has been SavedAs (D:/Doc0_Saved.dwg) then closed"
      '-----------------------------------------------------------------------
      ' 4) Doc1 add Circle then close with saving
      Dim Doc1 As AcadDocument
      Set Doc1 = Docs.Open("D:/Doc_test1.dwg")
      Dim Circle1 As AcadCircle
      Dim CircleCenter(2) As Double
      Dim CircleRadius As Double
      CircleCenter(0) = 5
      CircleCenter(1) = 6
      CircleCenter(2) = 0
      CircleRadius = 1.5
      Set Circle1 = Doc1.ModelSpace.AddCircle(CircleCenter, CircleRadius)
      Acadapp.ZoomExtents
      MsgBox "Doc1 has been Changed"
      Doc1.Close (True)
      MsgBox "Doc1 has been closed with saving"
      '-----------------------------------------------------------------------
      ' 5) Doc2 add Ellipse then close without saving
      Dim Doc2 As AcadDocument
      Set Doc2 = Docs.Open("D:/Doc_test2.dwg")
      Dim EllipseObj As AcadEllipse
      Dim majAxis(0 To 2) As Double
      Dim ECenter(0 To 2) As Double
      Dim radRatio As Double
      ECenter(0) = 50: ECenter(1) = 50: ECenter(2) = 0
      majAxis(0) = 10: majAxis(1) = 20: majAxis(2) = 0
      radRatio = 0.3
      Set EllipseObj = Doc2.ModelSpace.AddEllipse(ECenter, majAxis, radRatio)
      Acadapp.ZoomExtents
      MsgBox "Doc2 has been Changed"
      Doc2.Close (False)
      MsgBox "Doc2 has been closed without saving"
      '-----------------------------------------------------------------------
      ' 6) Doc3 add plineObj then saveAs then close
      Dim Doc3 As AcadDocument
      Set Doc3 = Docs.Add
      Dim plineObj As AcadLWPolyline
      Dim PlinePoints(1 To 10) As Double
      PlinePoints(1) = 75: PlinePoints(2) = 65
      PlinePoints(3) = 135: PlinePoints(4) = 125
      PlinePoints(5) = 230: PlinePoints(6) = 160
      PlinePoints(7) = 330: PlinePoints(8) = 100
      PlinePoints(9) = 255: PlinePoints(10) = -10
      Set plineObj = Doc3.ModelSpace.AddLightWeightPolyline(PlinePoints)
      Acadapp.ZoomExtents
      MsgBox "Doc3 has been Changed"
      Doc3.SaveAs "D:/Doc3_Saved", ac2007_dxf
      Doc3.Close
      MsgBox "Doc3 has been SavedAs (D:/Doc3_Saved.dxf) then closed"
      '-----------------------------------------------------------------------
      ' 7) Doc4 add Line then close with saving
      Dim Doc4 As AcadDocument
      Set Doc4 = Docs.Add
      Dim Line2 As AcadLine
      StartPt(0) = 5: StartPt(1) = 3: StartPt(2) = 0
      EndPt(0) = 22: EndPt(1) = 15: EndPt(2) = 0
      Set Line2 = Doc4.ModelSpace.AddLine(StartPt, EndPt)
      Acadapp.ZoomExtents
      MsgBox "Doc4 has been Changed"
      Doc4.Close True, "D:/Doc4_Saved.dwg"
      MsgBox "Doc4 has been closed with saving to (D:/Doc4_Saved.dwg)"
      '-----------------------------------------------------------------------
      ' 8) Doc5 add Line then close without saving
      Dim Doc5 As AcadDocument
      Set Doc5 = Docs.Add
      Dim Line3 As AcadLine
      StartPt(0) = 0: StartPt(1) = 0: StartPt(2) = 0
      EndPt(0) = 7: EndPt(1) = 13: EndPt(2) = 0
      Set Line3 = Doc5.ModelSpace.AddLine(StartPt, EndPt)
      Acadapp.ZoomExtents
      MsgBox "Doc5 has been Changed"
      Doc5.Close (False)
      MsgBox "Doc5 has been closed without saving"
      '-----------------------------------------------------------------------
      ' 9) Doc6 add Line and Circle then Regen
      Dim Doc6 As AcadDocument
      Set Doc6 = Docs.Add
      Dim Line4 As AcadLine
      StartPt(0) = 0: StartPt(1) = 0: StartPt(2) = 0
      EndPt(0) = 10: EndPt(1) = 10: EndPt(2) = 0
      Set Line4 = Doc6.ModelSpace.AddLine(StartPt, EndPt)
      Dim Circle2 As AcadCircle
      CircleCenter(0) = 0
      CircleCenter(1) = 0
      CircleCenter(2) = 0
      CircleRadius = 5
      Set Circle2 = Doc6.ModelSpace.AddCircle(CircleCenter, CircleRadius)
      Acadapp.ZoomExtents
      MsgBox "Doc6 has changed"
      Doc6.Regen acAllViewports
      MsgBox "Doc6 has Regened acAllViewports"
      '-----------------------------------------------------------------------
      ' 10) Doc6 add Layer then PurgeAll
      Dim LyerObj As AcadLayer
      Set LayerObj = Doc6.Layers.Add("TestLayer")
      MsgBox "Doc6 has new layer named (TestLayer)"
      Doc6.PurgeAll
      MsgBox "Doc6 PurgeAll and layer (TestLayer) has been deleted"
      '-----------------------------------------------------------------------
      ' 11) Doc6 Export
      Dim sset As AcadSelectionSet
      Set sset = Doc6.SelectionSets.Add("TEST")
      Doc6.Export "D:/Doc6_Exprt", "DXF", sset
      MsgBox "Doc6 has been Exported to (D:/Doc6_Exprt.dxf)"
  End Sub
```


----------



## Hossam-am (23 يناير 2012)

*[FONT=&quot]الشرح :[/FONT]*

[FONT=&quot]1- في القسم الأول من الكود : تم تشغيل برنامج الأوتوكاد وتعريف العنصر [/FONT]Acadapp[FONT=&quot] على أنه كائن أوتوكاد .[/FONT]

[FONT=&quot]2- في القسم الثاني من الكود : تم تعريف العنصر [/FONT]Docs[FONT=&quot] على أنه كائن [/FONT]Documents[FONT=&quot] وتم إسناد جميع المستندات في لوحة العمل على هذا الكائن .[/FONT]

[FONT=&quot]3- في القسم الثالث من الكود : تم تعريف العنصر [/FONT]Doc0[FONT=&quot] على أنه كائن [/FONT]Document[FONT=&quot] وتم إسناد اللوحة على المسار [/FONT]D:/Doc_test0.dwg[FONT=&quot] إلى هذا الكائن باستخدام الوظيفة [/FONT]Open[FONT=&quot] . ثم تم بعد ذلك إضافة خط [/FONT]Line1[FONT=&quot] إلى هذه اللوحة ثم تم حفظ التغييرات باستخدام الوظيفة [/FONT]Save[FONT=&quot] فقط باعتبار أن اللوحة مخزنة مسبقاً ومن ثم تم استخدام الوظيفة [/FONT]SaveAs[FONT=&quot] لعمل نسخة عن الملف السابق وتخزينه على المسار [/FONT]D:/Doc0_Saved.dwg[FONT=&quot] وأخيراً تم إغلاق اللوحة [/FONT]Doc0[FONT=&quot] باستخدام الوظيفة [/FONT]Close[FONT=&quot] بدون إعطاء قيم للمتغيرين [/FONT]SaveChanges [FONT=&quot] و [/FONT]FileName [FONT=&quot] .[/FONT]

[FONT=&quot]4- في القسم الرابع من الكود : تم تعريف العنصر [/FONT]Doc1[FONT=&quot] على أنه كائن [/FONT]Document[FONT=&quot] وتم إسناد اللوحة على المسار [/FONT]D:/Doc_test1.dwg[FONT=&quot] إلى هذا الكائن باستخدام الوظيفة [/FONT]Open[FONT=&quot] . ثم تم بعد ذلك إضافة دائرة [/FONT]Circle1[FONT=&quot] إلى هذه اللوحة ثم تم إغلاق اللوحة [/FONT]Doc1[FONT=&quot] مباشرةً باستخدام الوظيفة [/FONT]Close[FONT=&quot] مع إعطاء قيمة للمتغير [/FONT]SaveChanges [FONT=&quot] تساوي [/FONT]True[FONT=&quot] لحفظ التغييرات على اللوحة (كان من الممكن عدم إعطاء هذه القيمة نظراً لكونها القيمة الافتراضية لهذا المتحول ) ولم يتم إعطاء قيمة للمتغير[/FONT]FileName [FONT=&quot]نظراً لكون اللوحة مخزنة مسبقاً .[/FONT]

[FONT=&quot]5- في القسم الخامس من الكود : تم تعريف العنصر [/FONT]Doc2[FONT=&quot] على أنه كائن [/FONT]Document[FONT=&quot] وتم إسناد اللوحة على المسار [/FONT]D:/Doc_test2.dwg[FONT=&quot] إلى هذا الكائن باستخدام الوظيفة [/FONT]Open[FONT=&quot] . ثم تم بعد ذلك إضافة قطع ناقص [/FONT]EllipseObj[FONT=&quot] إلى هذه اللوحة ثم تم إغلاق اللوحة [/FONT]Doc2[FONT=&quot] مباشرةً باستخدام الوظيفة [/FONT]Close[FONT=&quot] مع إعطاء قيمة للمتغير [/FONT]SaveChanges [FONT=&quot] تساوي [/FONT]False[FONT=&quot] وبالتالي سيتم إغلاق اللوحة بدون حفظ التغييرات السابقة (القطع الناقص) [/FONT][FONT=&quot].[/FONT]

[FONT=&quot]6- في القسم السادس من الكود : تم تعريف العنصر [/FONT]Doc3[FONT=&quot] على أنه كائن [/FONT]Document[FONT=&quot] وتم إسناد لوحة جديدة إلى هذا الكائن باستخدام الوظيفة [/FONT]Add[FONT=&quot] . ثم تم بعد ذلك إضافة مجمع خطوط [/FONT]plineObj[FONT=&quot] إلى هذه اللوحة ثم تم حفظ هذه اللوحة الجديدة لأول مرة باستخدام الوظيفة [/FONT]SaveAs[FONT=&quot] على المسار [/FONT]D:/Doc3_Saved.dwg[FONT=&quot] وأخيراً تم إغلاق اللوحة [/FONT]Doc3[FONT=&quot] باستخدام الوظيفة [/FONT]Close[FONT=&quot] بدون إعطاء قيم للمتغيرين [/FONT]SaveChanges [FONT=&quot] و [/FONT]FileName [FONT=&quot] .[/FONT]

[FONT=&quot]7- في القسم السابع من الكود : تم تعريف العنصر [/FONT]Doc4[FONT=&quot] على أنه كائن [/FONT]Document[FONT=&quot] وتم إسناد لوحة جديدة إلى هذا الكائن باستخدام الوظيفة [/FONT]Add[FONT=&quot] . ثم تم بعد ذلك إضافة خط [/FONT]Line2[FONT=&quot] إلى هذه اللوحة ثم تم إغلاق اللوحة [/FONT]Doc4[FONT=&quot] مباشرةً باستخدام الوظيفة [/FONT]Close[FONT=&quot] مع حفظ التغييرات وحفظ الملف الجديد وذلك بإعطاء قيمة للمتغير [/FONT]SaveChanges [FONT=&quot] تساوي [/FONT]True[FONT=&quot] وقيمة للمتغير [/FONT]FileName [FONT=&quot] تساوي [/FONT](D:/Doc4_Saved.dwg)[FONT=&quot] [/FONT][FONT=&quot].[/FONT]

[FONT=&quot]8- في القسم الثامن من الكود : تم تعريف العنصر [/FONT]Doc5[FONT=&quot] على أنه كائن [/FONT]Document[FONT=&quot] وتم إسناد لوحة جديدة إلى هذا الكائن باستخدام الوظيفة [/FONT]Add[FONT=&quot] . ثم تم بعد ذلك إضافة خط [/FONT]Line3[FONT=&quot] إلى هذه اللوحة ثم تم إغلاق اللوحة [/FONT]Doc5[FONT=&quot] مباشرةً باستخدام الوظيفة [/FONT]Close[FONT=&quot] بدون حفظ التغييرات وذلك بإعطاء قيمة للمتغير [/FONT]SaveChanges [FONT=&quot] تساوي [/FONT]False[FONT=&quot] .[/FONT]

[FONT=&quot]9- في القسم التاسع من الكود : تم تعريف العنصر [/FONT]Doc6[FONT=&quot] على أنه كائن [/FONT]Document[FONT=&quot] وتم إسناد لوحة جديدة إلى هذا الكائن باستخدام الوظيفة [/FONT]Add[FONT=&quot] . ثم تم بعد ذلك إضافة خط [/FONT]Line4[FONT=&quot] ودائرة [/FONT]Circle2[FONT=&quot] ثم تم استخدام الوظيفة [/FONT]Regen[FONT=&quot] لإعادة توليد العناصر الرسومية في جميع المعاينات باستخدام القيمة [/FONT]acAllViewports[FONT=&quot] [/FONT]

[FONT=&quot]10- في القسم العاشر من الكود : تم إضافة طبقة جديدة [/FONT]TestLayer[FONT=&quot] إلى اللوحة [/FONT]Doc6[FONT=&quot] ولم يتم رسم أي عنصر على هذه الطبقة . بعد ذلك تم استخدام الوظيفة [/FONT]PurgeAll[FONT=&quot] لعمل تطهير للوحة الحالية بمعنى إزالة جميع الارتباطات الغير مستعملة في الملف الرسومي وهنا نلاحظ أنه تم حذف الطبقة السابقة [/FONT]TestLayer[FONT=&quot] نظراً لعدم ارتباطها بأية عناصر رسومية في اللوحة .[/FONT]

[FONT=&quot]11- في القسم الحادي عشر من الكود : تم تعريف عنصر [/FONT]sset[FONT=&quot] على أنه عنصر [/FONT]*SelectionSet**[FONT=&quot] [/FONT]*[FONT=&quot] ولم يتم إضافة أي عنصر إلى المجموعة السابقة (مجموعة فارغة) ثم تم تصدير بيانات اللوحة [/FONT]Doc6[FONT=&quot] باستخدام الوظيفة [/FONT]Export[FONT=&quot] إلى المسار [/FONT]D:/Doc6_Exprt.dxf[FONT=&quot] بتنسيق [/FONT]DXF[FONT=&quot] وهنا نشير إلى أن المجموعة [/FONT]sset[FONT=&quot] سيتم تجاهلها .[/FONT]

​*[FONT=&quot]نهاية الدرس الثالث[/FONT]*​​


----------



## Hossam-am (23 يناير 2012)

*وإليكم رابط الدرس الثالث بصيغة PDF وملف المشروع VB2cad حتى هذه المرحلة على الروابط :*
*http://www.mediafire.com/download.php?do4xke3il97x9zp*

*http://www.mediafire.com/download.php?qpbcxbk8b63gong*

*أو هنا :*
*http://www.facebook.com/groups/267612119966249/doc/286191148108346/*​


----------



## فوزي محمد عمر (24 يناير 2012)

جزاك الله خيرا.
مشاركة متميزة جدا، سأتابعها معك أولا بأول إن شاء الله تعالى.
كثـّر الله من أمثالك.


----------



## مصطفى المطني (24 يناير 2012)

*الشكر على جهودكم
عندي سؤال لو سمحتم :
عندما اغير اسم الملف عند التصدير بصيغة DXF و اضغط زر التصدير فانه لا يظهر الملف في مكان حفظه كأن الزر يعمل لمرة واحدة فقط , ما الحل ؟
اريد ان استفيد من وظيفة الزر في حفظ عدد من الملفات بالتعديل على اسم الملف فقط
او ياريت يأخذ اسم الملف من اسم الملف بصيغة dwg و يصدره **DXF *؟


----------



## Hossam-am (24 يناير 2012)

مصطفى المطني قال:


> *الشكر على جهودكم
> عندي سؤال لو سمحتم :
> عندما اغير اسم الملف عند التصدير بصيغة DXF و اضغط زر التصدير فانه لا يظهر الملف في مكان حفظه كأن الزر يعمل لمرة واحدة فقط , ما الحل ؟
> اريد ان استفيد من وظيفة الزر في حفظ عدد من الملفات بالتعديل على اسم الملف فقط
> او ياريت يأخذ اسم الملف من اسم الملف بصيغة dwg و يصدره **DXF *؟



شوف باشا :
رح أعطيك مثال مع الشرح وشوف إذا جاوبت عن سؤالك :

1- قم بتشغيل برنامج أوتوكاد واحفظ الملف فارغاُ بحيث يصبح مساره مثلاً D:/VBcad.dwg 
2- قم باغلاق برنامج أوتوكاد .
3- قم بانشاء مشروع فجوال بيزك جديد واجعل به إطاراً واحدا وزر واحد 
4 - في حدث النقر على هذا الزر أكتب الكود :



```
Private Sub Command1_Click()
    Set Acadapp = CreateObject("AutoCAD.Application.17")
    Acadapp.Visible = True
    Acadapp.WindowState = acMax
    Me.Show
    '-----------------------------
    Dim Doc As AcadDocument
    Set Doc = Acadapp.Documents.Open("d:/VBcad.dwg")
    Dim sset As AcadSelectionSet
    Set sset = Doc.SelectionSets.Add("TEST")
    Doc.Export "D:/Doc_Exprt", "DXF", sset
    MsgBox "Doc has been Exported to (D:/Doc_Exprt.dxf)"
    '-----------------------------
    Dim Line1 As AcadLine
    Dim StartPt(2) As Double
    Dim EndPt(2) As Double
    StartPt(0) = 2: StartPt(1) = 2: StartPt(2) = 0
    EndPt(0) = 1: EndPt(1) = 5: EndPt(2) = 0
    Set Line1 = Doc.ModelSpace.AddLine(StartPt, EndPt)
    Acadapp.ZoomExtents
    Doc.Export "D:/Doc_Exprt", "DXF", sset
    MsgBox "Doc has been Exported Again to (D:/Doc_Exprt.dxf)"
    '-----------------------------
    Dim Circle1 As AcadCircle
    Dim CircleCenter(2) As Double
    Dim CircleRadius As Double
    CircleCenter(0) = 5
    CircleCenter(1) = 6
    CircleCenter(2) = 0
    CircleRadius = 1.5
    Set Circle1 = Doc.ModelSpace.AddCircle(CircleCenter, CircleRadius)
    Acadapp.ZoomExtents
    '-----------------------------
    Dim docName As String
    Dim ExpName As String
    docName = Doc.FullName
    ExpName = Mid(docName, 1, Len(docName) - 4)
    Doc.Export ExpName, "DXF", sset
    MsgBox "Doc has been Exported Again to (D:/Doc_Exprt.dxf)"
End Sub
```


*الشرح :*
1- في القسم الأول قمنا بتشغيل برنامج أوتوكاد.
2- في القسم الثاني نعرف عنصر Doc على أنه عنصر Document ونسند له الملف السابق VBcad.dwg باستخدام الوظيفة Open 
نقوم بعد ذلك بتعريف مجموعة فارغة sset .
نقوم بعد ذلك بتصدير الملف بصيغة DXF بحيث يصبح المسار الكامل له D:/Doc_Exprt.dxf 
3- في القسم الثالث من الكود نقوم بإضافة خط Line1 إلى الرسم ثم نعيد عملية التصدير بصيغة DXF وبنفس الاسم نلاحظ أنه تم استبدال الملف القديم بالملف الجديد وتستطيع تجريب فتح الملف Doc_Exprt.dxf والتحقق من أنه قام بحفظ الخط Line1 
4- في القسم الرابع من الكود نقوم برسم دائرة في الملف VBcad.dwg 
5- في القسم الخامس من الكود (تتعلق بالقسم الاخير من السؤال هو إمكانية استخدام اسم الملف الرسومي بصيغة dwg للتصدير بصيغة dxf ) نقوم بما يلي :
- نعرف متحول اسمه docName لتخزين مسار لوحة الرسم الحالية VBcad.dwg
- نعرف متحول اسمه ExpName لنخزن به إسم ملف التصدير
- نجعل قيمة docName تساوي المسار الكامل للوحة الرسم D:/VBcad.dwg من خلال استخدام الخاصية FullName ( التي لم نشرحها بعد ) وفق السطر التالي :


```
docName = Doc.FullName
```

- الآن نستخدم وظيفين من وظائف برنامج فيجوال بيزك وهما Mid و LEN 
الوظيفة Len تعيد طول السلسلة الحرفية لمتحول نصي والوظيفة Mid تعيد جزء مقتطع من السلسلة السابقة حيث نحدد لها نقطة بدء القطع وطول السلسلة الجديدة وباعتبار أننا نريد الحصول على إسم اللوحة المفتوحة D:/VBcad.dwg بدون اللاحقة dwg وبدون النقطة (.) اي على الشكل D:/VBcad لاستخدامه في عملية التصدير فإننا نكتب :


```
ExpName = Mid(docName, 1, Len(docName) - 4)
```


اي أننا قمنا باقتطاع جزء من السلسلة المخزنة في المتحول docName والتي تساوي D:/VBcad.dwg اعتباراً من بداية السلسلة وبطول يساوي طول المتحول docName مطروح منه العدد (4) لحذف النقطة واللاحقة dwg ومن ثم تخزين الناتج في المتحول ExpName 
5- نقوم أخيراً باستخدام هذا المتحول ليعبر عن إسم ملف التصدير في وظيفة Export كما في السطر :


```
Doc.Export ExpName, "DXF", sset
```


ارجو أخي الكريم ان اكون قد أجبت عن سؤالك ... واعتذر عن التاخر بالرد نظراً لانشغالي الشديد حيث لا أتمكن من الدخول الى المنتدى إلا بعد منتصف الليل .

ارجو الافادة وشكراً


​


----------



## مصطفى المطني (25 يناير 2012)

*جزاكم الله خيرا 
عندي مشكلة بسيطة عند التصدير لصورة mwf فان البرنامج يطلب تحديد العناصر 
و انا اريد التصدير للملف دون عملية الاختيار ما الحل ؟*


----------



## Hossam-am (26 يناير 2012)

مصطفى المطني قال:


> *جزاكم الله خيرا *
> * عندي مشكلة بسيطة عند التصدير لصورة mwf فان البرنامج يطلب تحديد العناصر *
> * و انا اريد التصدير للملف دون عملية الاختيار ما الحل ؟*



أخي الكريم أنت تستبق الأمور قليلاً فلا بد أولا من تعلم الكائن SelectionSet وطريقة التعامل مع هذا الكائن لمعرفة كيفية اختيار العناصر ضمن لوحة الرسم . على كل حال ساجيبك عن سؤالك الآن ببعض التعليمات المختصرة لعللك تحتاجها حالياً على ان نوسع الشرح في حينه . 
ذكرنا سابقاً ان التصدير بتنسيق DXF يحتاج لتعريف مجموعة اختيار فارغة بدون إضافة عناصر 
أما التصدير بتنسيق Wmf فيحتاج لاختيار العناصر المراد تصديرها ... هكذا تم برمجة الأمر ضمن برنامج أوتوكاد وبالتالي هنا لا بد من إنشاء مجموعة وإضافة العناصر المراد تصديرها وفق هذا التنسيق .
وإجابة عن سؤالك إذا كنت تريد تصدير كافة عناصر ومحتويات اللوحة الرسومية Wmf فهنا سنضيف للكود الخاص بالتصدير سطراً واحداً فقط نستخدم فيه إحدى وظائف الكائن SelectionSet وهي الوظيفة select وسنختار بموجبها جميع محتويات اللوحة . كما يلي :


```
Dim sset As AcadSelectionSet
Set sset = Doc.SelectionSets.Add("TEST")
sset.Select acSelectionSetAll
Doc.Export "D:/Doc_Exprt", "Wmf", sset
```
هكذا تكون قد اخترت جميع محتويات اللوحة تلقائياً وسينجح امر التصدير
ارجو أن يكون الجواب واضحاً
دمتم بخير



​


----------



## مصطفى المطني (26 يناير 2012)

*جزاكم الله خيرا نجح الامر
اعتذر ان اثقلت عليكم ...
عندي سؤال في region لو سمحت :
عندي بولي لاين يقطعه خط كيف استطيع تمييز المساحة المحجوزة اعلى الخط 
عن المساحة المحجوزة أسفل الخط ؟
ممكن مساحة او تهشير 
و شكرا جزيلا
*


----------



## كبل (26 يناير 2012)

شكرا لك


----------



## Hossam-am (27 يناير 2012)

مصطفى المطني قال:


> *جزاكم الله خيرا نجح الامر
> اعتذر ان اثقلت عليكم ...
> عندي سؤال في region لو سمحت :
> عندي بولي لاين يقطعه خط كيف استطيع تمييز المساحة المحجوزة اعلى الخط
> ...


أخي الكريم ...
يمكن ذلك بعدة طرق إحداها :
إيجاد نقاط التقاطع بين البولي لاين والخط رياضياً أو باستخدام الوظيفة IntersectWith (التي لم نشرحها بعد ) لايجاد نقطتي التقاطع . ثم نقوم بعد ذلك برسم بولي لاين علوي وسفلي ونحسب مساحة كل منهما أو نقوم بتهشير كل منهما .
فاذا لم تكن مستعجلاً أخي لفعل ذلك انتظر حتى نشرح هذه الطريقة وعدة طرق اخرى مفيدة 
​


----------



## Hossam-am (27 يناير 2012)

*الدرس الرابع في بيئة أوتوكاد (الكائنات الفرعية التابعة للكائن Document )*


*[FONT=&quot]الكائنات الفرعية التابعة للكائن [/FONT]**Document**[FONT=&quot] :[/FONT]*

*[FONT=&quot]2- 1-1-1 الكائن [/FONT]* *Blocks**[FONT=&quot]:[/FONT]*

[FONT=&quot]وهو يمثل مجموعة الكتل المحملة ضمن الملف الرسومي (تجمع [/FONT]collection [FONT=&quot]) . ويمكن إضافة عدد غير محدد من الكتل إلى الملف الرسومي وكل كتلة من هذه الكتل تمثل بـ [/FONT]Block[FONT=&quot] وتأخذ رقماً محدداً بحيث تأخذ الكتلة الأولى الرقم [/FONT](0)[FONT=&quot] ثم [/FONT](1)[FONT=&quot] وهكذا.[/FONT]

[FONT=&quot]- يتم استدعاء الكائن [/FONT]*Blocks*[FONT=&quot] مباشرة من خلال الكائن الأب وفق الصيغة :[/FONT]​

```
Document.Blocks
```
 
[FONT=&quot]- يتم إضافة كتلة جديدة [/FONT]*Block*[FONT=&quot] إلى مجموعة الكتل [/FONT]*Blocks*[FONT=&quot] في اللوحة المحددة باستخدام الوظيفة [/FONT]Add[FONT=&quot] وفق الصيغة :[/FONT]​

```
Document.Blocks.Add(InsertionPoint, Name)
```
 
[FONT=&quot]حيث : [/FONT]

InsertionPoint[FONT=&quot] : متحول نخزن به إحداثيات نقطة إمساك الكتلة عند إنشائها .[/FONT]

Name[FONT=&quot] : إسم الكتلة المراد إنشاؤها .[/FONT]

*[FONT=&quot]مثال :[/FONT]**[FONT=&quot] [/FONT]*[FONT=&quot]بفرض كانت [/FONT]*Doc*[FONT=&quot] تمثل لوحة في جلسة العمل (كائن [/FONT]Document[FONT=&quot] ) وبفرض أننا نريد إضافة كتلة [/FONT]*Block*[FONT=&quot] اسمها [/FONT]Test_Block[FONT=&quot] إلى مجموعة الكتل [/FONT]*Blocks*[FONT=&quot] في اللوحة [/FONT]*Doc*[FONT=&quot] بحيث تكون نقطة الإمساك [/FONT](10,15,0)[FONT=&quot] فإننا نكتب ما يلي :[/FONT]


```
[/RIGHT]
    Dim InsertionPoint(0 To 2) As Double
  InsertionPoint(0) = 10
  InsertionPoint(1) = 15
  InsertionPoint(2) = 0
  Doc.Blocks.Add InsertionPoint, "Test_Block"
```
 
[FONT=&quot] [/FONT]

[FONT=&quot]- كل كتلة [/FONT]*Block*[FONT=&quot] تتم إضافتها إلى مجموعة الكتل [/FONT]*Blocks*[FONT=&quot] الخاصة باللوحة الرسومية تأخذ رقماً محدداً في هذه المجموعة ويمكن استدعاء هذه الكتلة وفق الصيغة التالية :[/FONT]​

```
Document.Blocks.Item(n)
```
 
[FONT=&quot]أو مباشرة وفق الصيغة :[/FONT]​

```
Document.Blocks(n)
```
 
[FONT=&quot]حيث [/FONT]_n_[FONT=&quot] يعبر عن رقم الكتلة .[/FONT]

[FONT=&quot]- يمكن معرفة عدد عناصر مجموعة الكتل [/FONT]*Blocks*[FONT=&quot] في لوحة رسومية محددة من خلال الخاصية [/FONT]Count [FONT=&quot]وفق الصيغة :[/FONT]​

```
Number = Document.Blocks.Count
```
 
[FONT=&quot]حيث [/FONT]_Number_[FONT=&quot] متحول نخزن به عدد الكتل في المجموعة [/FONT]*Blocks*[FONT=&quot] في اللوحة[/FONT]*Document*[FONT=&quot] .[/FONT]

*[FONT=&quot]2-1-1-1-1 الكائن [/FONT]* *Block**[FONT=&quot]:[/FONT]*

[FONT=&quot]يمتلك الكائن [/FONT]*Blocks*[FONT=&quot] كائن فرعي وحيد يعبر عن الكتلة [/FONT]*Block*[FONT=&quot] ونستطيع إضافة عدد غير محدد من العناصر الرسومية إلى هذا الكائن وكل كتلة يتم إنشاؤها تأخذ رقماً محدداً في مجموعة الكتل [/FONT]*Blocks*[FONT=&quot] الخاصة باللوحة الرسومية .[/FONT]

[FONT=&quot]في الواقع توجد لهذا الكائن [/FONT]*Block*[FONT=&quot] أربعة أنواع :[/FONT]


```
Simple block - XRef block - dynamic block - layout block
```
 
*[FONT=&quot]1- النوع الأول [/FONT]**Simple block*[FONT=&quot] وهو النوع من الكتل التي نعرفها جيداً ويعبر عن مجموعة العناصر التي يتم جمعها مع بعضها البعض على شكل كيان واحد . وهذه الكتلة يمكن إدراجها ضمن الملف الرسومي وتغيير مقاييسها وإجراء تدوير لها وأيضا يمكن تفجيرها إلى مكوناتها الأساسية وإجراء تعديلات على هذه المكونات ثم إعادة تشكيل الكتلة السابقة بحيث تشمل العناصر السابقة مع التعديلات . الكتلة البسيطة يمكن إنشاؤها من العناصر الرسومية ضمن لوحة الرسم الحالية أو باستخدام لوحة رسومية أخرى . [/FONT]

[FONT=&quot]يتم *إنشاء* كتلة جديدة من النوع [/FONT]*Simple block*[FONT=&quot] بإضافة كتلة جديدة إلى مجموعة الكتل [/FONT]*Blocks*[FONT=&quot] في اللوحة الرسومية باستخدام الوظيفة [/FONT]Add[FONT=&quot] كما ذكرنا سابقاً وفق الصيغة :[/FONT]​

```
Document.Blocks.Add(InsertionPoint, Name)
```
 
[FONT=&quot]حيث : [/FONT]

InsertionPoint[FONT=&quot] : متحول نخزن به إحداثيات نقطة إمساك الكتلة عند إنشائها .[/FONT]

Name[FONT=&quot] : إسم الكتلة المراد إنشاؤها .[/FONT]

[FONT=&quot]ويمكن *إدراج* الكتلة التي نقوم بإنشائها عدداً غير محدداً من المرات باستخدام الوظيفة [/FONT]*InsertBlock*[FONT=&quot] حيث الصيغة العامة لهذه الوظيفة على الشكل :[/FONT]​

```
RetVal = object.InsertBlock(InsertionPoint, Name, Xscale, Yscale, ZScale, Rotation)
```
 
[FONT=&quot]حيث :[/FONT]

InsertionPoint[FONT=&quot] : متحول نخزن به إحداثيات نقطة إدراج الكتلة .[/FONT]

Name[FONT=&quot] : متحول نخزن به إسم الكتلة المراد إدراجها *( أو المسار الكامل للملف الخارجي المراد إدراجه ضمن الملف الحالي على شكل *[/FONT]*Simple Block**[FONT=&quot] )[/FONT]*[FONT=&quot] .[/FONT]

Xscale[FONT=&quot] و [/FONT]Yscale [FONT=&quot]و [/FONT]ZScale[FONT=&quot] : تعبر عن مقاييس إدراج الكتلة .[/FONT]

Rotation[FONT=&quot] : وتعبر عن زاوية الدوران المعتمدة عند إدراج الكتلة . [/FONT]

Object[FONT=&quot] : العنصر الأب الذي تسند إليه الوظيفة السابقة وهو إما أن يكون [/FONT]ModelSpace أو PaperSpace [FONT=&quot] أو [/FONT]Block .

[FONT=&quot]إن استخدام الوظيفة السابقة [/FONT]*InsertBlock* [FONT=&quot]من خلال الكائن [/FONT]*Block* [FONT=&quot]معناه أننا نريد إدراج كتلة داخل كتلة وهذا ما يسمى بعملية *التعشيش* .[/FONT]

ModelSpace [FONT=&quot]وهو حيز النموذج ويعبر عن شاشة الرسم الرئيسية التي نقوم بإضافة العناصر الرسومية إليها في اللوحة وهو عبارة عن كائن فرعي تابع للكائن الأب [/FONT]*Document*[FONT=&quot] وسنتحدث عنه بالتفصيل في سياق هذا الشرح . بالإضافة على كونه كتلة خاصة من النوع [/FONT]*layout* *block*[FONT=&quot] الذي سنتحدث عنه لاحقاً .[/FONT]

PaperSpace [FONT=&quot] وهو حيز الورقة ويعبر عن أوراق الرسم الملحقة باللوحة الرسومية وهو عبارة عن كائن فرعي تابع للكائن الأب [/FONT]*Document*[FONT=&quot] وسنتحدث عنه بالتفصيل في سياق هذا الشرح . بالإضافة على كونه كتلة خاصة من النوع [/FONT]*layout* *block*[FONT=&quot] .[/FONT]​ *RetVal*[FONT=&quot] : وهو عنصر [/FONT]BlockReference [FONT=&quot]ففي كل مرة نقوم فيها *بإدراج* الكتلة ضمن الملف الرسومي سيتم إنشاء العنصر السابق[/FONT] [FONT=&quot]ليعبر عن *الكتلة المدرجة* ضمن الملف الرسومي وسنقوم بشرحه بالتفصيل لاحقاً .[/FONT]

[FONT=&quot](وقد ذكرنا في الدرس الثامن من هذه السلسلة مثالاً عملياً لطريقة إنشاء الكتلة وإدراجها )[/FONT]

[FONT=&quot] [/FONT]

[FONT=&quot] [/FONT]

*[FONT=&quot]2- النوع الثاني [/FONT]**XRef* *block*[FONT=&quot] : وهو يعبر عن *ارتباط* بين ملف رسومي خارجي بالملف الرسومي الحالي . واستخدام هذا النوع من الكتل في الملف الحالي يعني أن أي تعديل يطرأ على عناصر الملف الخارجي سيظهر في الملف الحالي . [/FONT]

[FONT=&quot]ويمكن إجراء *الارتباط* السابق بين الملف الرسومي الحالي وملف رسومي خارجي باستخدام الوظيفة [/FONT]*AttachExternalReference* [FONT=&quot] حيث الصيغة العامة لهذه الوظيفة على الشكل :[/FONT]​

```
RetVal = object.AttachExternalReference (PathName, Name, InsertionPoint, XScale, YScale, ZScale, Rotation, bOverlay)
```
 
[FONT=&quot]حيث :[/FONT]

PathName[FONT=&quot] : ويعبر عن الاسم والمسار الكامل للملف الرسومي الخارجي .[/FONT]

Name[FONT=&quot] : الاسم المراد إعطاؤه للارتباط المدرج السابق ( الكتلة [/FONT]Xref[FONT=&quot] ) .[/FONT]

InsertionPoint[FONT=&quot]: متحول نخزن به إحداثيات نقطة إدراج الكتلة السابقة .[/FONT]

Xscale[FONT=&quot] و [/FONT]Yscale [FONT=&quot]و [/FONT]ZScale[FONT=&quot] : تعبر عن مقاييس إدراج الكتلة .[/FONT]

Rotation[FONT=&quot] : وتعبر عن زاوية الدوران المعتمدة عند إدراج الكتلة . [/FONT]

bOverlay[FONT=&quot] : وهو يأخذ إحدى قيمتين [/FONT]False [FONT=&quot] أو [/FONT]True[FONT=&quot] . [/FONT]

[FONT=&quot]ولفهم هذا العامل بشكل دقيق لنفرض لدينا ثلاثة ملفات رسومية [/FONT]_A.dwg_[FONT=&quot] و [/FONT]_B.dwg_[FONT=&quot] و [/FONT]_C.dwg_[FONT=&quot] ولنفرض أننا سنقوم بإدراج الملف [/FONT]C[FONT=&quot] ضمن الملف [/FONT]B[FONT=&quot] كارتباط خارجي ثم سنقوم بإدراج الملف [/FONT]B[FONT=&quot] ضمن الملف [/FONT]A[FONT=&quot] كارتباط خارجي . [/FONT]

[FONT=&quot]فإذا كانت قيمة العامل [/FONT]bOverlay[FONT=&quot] تساوي [/FONT]True[FONT=&quot] عند إدراج الملف [/FONT]C[FONT=&quot] ضمن الملف [/FONT]B[FONT=&quot] معنى ذلك أن الملف [/FONT]C[FONT=&quot] *لن يظهر* عند إدراج الملف [/FONT]B[FONT=&quot] ضمن الملف [/FONT]A[FONT=&quot] .[/FONT]

[FONT=&quot]أما إذا كانت قيمة العامل [/FONT]bOverlay[FONT=&quot] تساوي [/FONT]False[FONT=&quot] عند إدراج الملف [/FONT]C[FONT=&quot] ضمن الملف [/FONT]B[FONT=&quot] معنى ذلك أن الملف [/FONT]C[FONT=&quot] *سوف يظهر* عند إدراج الملف [/FONT]B[FONT=&quot] ضمن الملف [/FONT]A[FONT=&quot] .[/FONT]

Object[FONT=&quot] : العنصر الأب الذي تسند إليه الوظيفة السابقة وهو إما أن يكون [/FONT]ModelSpace أو PaperSpace [FONT=&quot] أو [/FONT]Block .​ *RetVal*[FONT=&quot] : وهو عنصر [/FONT]ExternalReference [FONT=&quot]ففي كل مرة نقوم فيها *بإدراج* الكتلة [/FONT]*Xref*[FONT=&quot] ضمن الملف الرسومي سيتم إنشاء العنصر السابق[/FONT] [FONT=&quot]ليعبر عن *الارتباط الخارجي المدرج* ضمن الملف الرسومي وسنقوم بشرحه بالتفصيل لاحقاً .[/FONT]

[FONT=&quot] [/FONT]

[FONT=&quot] [/FONT]

*[FONT=&quot]3- النوع الثالث [/FONT]**dynamic* *block*[FONT=&quot] : وهو نوع أكثر تطوراً من النوع الأول [/FONT]*simple block*[FONT=&quot] ويتميز بالمرونة والفعالية للتكيف مع مختلف الأوامر . وبمجرد إدراج هذا النوع من الكتل ضمن الملف الرسومي الحالي سيتم إنشاء عنصر [/FONT]BlockReference [FONT=&quot]يعبر عن الكتلة المدرجة ضمن الملف الرسومي ومن هذا العنصر يمكن الحصول على عنصر آخر [/FONT]DynamicBlockReferenceProperty[FONT=&quot] سنقوم بشرحه بالتفصيل لاحقاً .[/FONT]

[FONT=&quot] [/FONT]

*[FONT=&quot]4- النوع الرابع [/FONT]**layout* *block*[FONT=&quot] : وهو يعبر عن بنية البيئة الرسومية وإعداداتها وجميع العناصر المتعلقة بها والخاصة بحيز النموذج [/FONT]Model Space[FONT=&quot] وحيز الورقة [/FONT]Paper Space[FONT=&quot] . هذا النوع من الكتل يملك عنصراً مرتبطاً معها يسمى [/FONT]Layout [FONT=&quot]يحوي جميع الإعدادات الخاصة بهذه الكتلة مثل إعدادات الطباعة وغيرها .[/FONT]​ *[FONT=&quot]عند تشغيل برنامج أوتوكاد لاحظ بأنه يضيف ثلاثة علامات تبويب في الشريط السفلي هي [/FONT]**ModeL – Layout1 – Layout2**[FONT=&quot] كما هو موضح في الصورة أدناه . حيث [/FONT]**Model **[FONT=&quot] للعمل في شاشة الرسم الرئيسية أو ما يسمى بحيز النموذج [/FONT]**Model Space**[FONT=&quot] وهو وحيد ولا يمكن حذفه كما لا يمكن إضافة حيز نموذج ثاني إلى الملف الرسومي . [/FONT]*
*[FONT=&quot]أما [/FONT]**Layout1**[FONT=&quot] و [/FONT]**Layout2**[FONT=&quot] فهما للعمل فيما يسمى بحيز الورقة [/FONT]**Paper Space**[FONT=&quot] ويمكن إضافة 255 من أوراق الرسم إلى الملف الرسومي كحد أعظمي ويمكن الحذف على أن تبقى ورقة رسم واحدة لا يمكن حذفها .[/FONT]*
​[FONT=&quot] [/FONT]​​




[FONT=&quot][/FONT]​

[FONT=&quot] [/FONT]

[FONT=&quot]يقوم برنامج أوتوكاد بشكل افتراضي عند فتح ملف رسومي جديد بإنشاء ثلاثة بلوكات خاصة من النوع [/FONT]*layout* *block*[FONT=&quot] أسماؤها على الشكل التالي :[/FONT]

1. MODEL_SPACE[FONT=&quot] وهي تعبر عن شاشة الرسم الرئيسية أو ما يسمى بحيز النموذج [/FONT]Model Space[FONT=&quot] وهو وحيد ولا يمكن حذفه .[/FONT]

2. PAPER_SPACE  [FONT=&quot]وهي تعبر عن ورقة الرسم النشطة من أوراق ما يسمى بحيز الورقة [/FONT]Paper Space[FONT=&quot] في الملف الرسومي . [/FONT]

3. PAPER_SPACE0 [FONT=&quot]وهي تعبر عن ثاني ورقة رسم من أوراق حيز الورقة في الملف الرسومي . [/FONT]



[FONT=&quot]لإضافة *ورقة رسم* [/FONT]*Layout*[FONT=&quot] جديدة إلى الملف الرسومي نستخدم الوظيفة [/FONT]Add[FONT=&quot] التابعة للكائن [/FONT]*Layouts*[FONT=&quot] وهو كائن ابن للكائن [/FONT]_Document_[FONT=&quot] وفق الصيغة التالية :[/FONT]​

```
Document.Layouts.Add Name
```
 
[FONT=&quot]أو وفق الصيغة :[/FONT]​

```
RetVal = Document.Layouts.Add(Name)
```
 
[FONT=&quot]حيث [/FONT]_Name_ [FONT=&quot]الاسم المراد إعطاؤه لورقة الرسم الجديدة .[/FONT]

[FONT=&quot] [/FONT]

*RetVal*[FONT=&quot] : هو كائن من نوع [/FONT]*Layout*[FONT=&quot] وهو كائن ابن للكائن [/FONT]*Layouts*[FONT=&quot] ويمثل ورقة الرسم الجديدة التي تتم إضافتها إلى اللوحة الرسومية . وسيتم شرح هذين الكائنين بالتفصيل في سياق هذه السلسلة .[/FONT]

[FONT=&quot]عند إضافة *ورقة رسم* [/FONT]*Layout*[FONT=&quot] جديدة إلى الملف الرسومي عندها سيتم تلقائياً إنشاء كتلة من النوع [/FONT]*layout* *block*[FONT=&quot] وستعطى إسماً [/FONT]PAPER_SPACE1[FONT=&quot] ثم [/FONT]PAPER_SPACE2[FONT=&quot] وهكذا .[/FONT]

[FONT=&quot]إن برنامج أوتوكاد يعطي دائماً الاسم [/FONT]PAPER_SPACE [FONT=&quot] لورقة الرسم النشطة فعند تفعيل ورقة أخرى يتم تبادل الأسماء بين الورقتين . لشرح ذلك لنفترض وجود أربعة أوراق رسم في الملف الرسومي عناوينها بالترتيب على الشكل :[/FONT]


```
Layout1 – Layout2 – Layout3 – Layout4
```
 
[FONT=&quot]وبفرض كانت الورقة [/FONT]Layout1[FONT=&quot] هي الورقة النشطة فعندها تكون أسماء الكتل بالترتيب على الشكل التالي :[/FONT]


```
PAPER_SPACE - PAPER_SPACE0 - PAPER_SPACE1 - PAPER_SPACE2
```
 
[FONT=&quot]الآن لنفرض أننا جعلنا الورقة [/FONT]Layout3[FONT=&quot] هي الورقة النشطة فعندها تتغير أسماء الكتل بحيث يحصل تبادل في الأسماء بين الورقة التي كانت نشطة [/FONT]Layout1[FONT=&quot] والورقة النشطة [/FONT]Layout3[FONT=&quot] لتصبح أسماء الكتل بالترتيب على الشكل التالي :[/FONT]


```
PAPER_SPACE1 - PAPER_SPACE0 - PAPER_SPACE - PAPER_SPACE2
```
 

يتبع................​


----------



## Hossam-am (29 يناير 2012)

*تابع الدرس الرابع*


[FONT=&quot]لجعل ورقة من أوراق الرسم هي الورقة النشطة نستخدم الوظيفة [/FONT]*ActiveLayout* [FONT=&quot] التابعة للكائن [/FONT]*Document*[FONT=&quot] فمثلاً لجعل الورقة [/FONT]Layout3[FONT=&quot] هي الورقة النشطة نكتب :[/FONT]​

```
Document.ActiveLayout = Document.Layouts("Layout3")
```
 


[FONT=&quot]كل ورقة رسم [/FONT]Layout[FONT=&quot] تمتلك كتلة مرتبطة معها من النوع [/FONT]*layout* *block*[FONT=&quot] كما ذكرنا سابقاً ويمكن الحصول على إسم هذه الكتلة من خلال خاصية [/FONT]Block[FONT=&quot] التابعة للكائن [/FONT]Layout[FONT=&quot] . فمثلاً لمعرفة إسم الكتلة الخاصة بالورقة [/FONT]Layout3[FONT=&quot] نكتب :[/FONT]​

```
Blockname = Document.Layouts("Layout3").Block.Name
```
 
[FONT=&quot]حيث [/FONT]_Blockname_[FONT=&quot] متحول نخزن به إسم الكتلة المرتبطة .[/FONT]



*[FONT=&quot]تطبيق عملي 1 :[/FONT]*

[FONT=&quot]سنشرح في هذا التطبيق النوع الرابع من الكتل والمسمى [/FONT]*layout**block*[FONT=&quot] ولعمل ذلك فإننا نقوم بتنفيذ الخطوات التالية :[/FONT]

[FONT=&quot]1 - قم بفتح مشروع [/FONT]VB2cad[FONT=&quot] وأضف إلى الإطار [/FONT]Form1[FONT=&quot] زر أمر [/FONT]command[FONT=&quot] واجعل خاصية [/FONT]Name[FONT=&quot] له تساوي [/FONT] LayoutTest[FONT=&quot]واجعل خاصية [/FONT]Caption[FONT=&quot] تساوي [/FONT]LayoutTest

[FONT=&quot]3 - في حدث النقر على الزر [/FONT]LayoutTest[FONT=&quot] في الإطار [/FONT]Form1[FONT=&quot] نكتب الكود التالي :[/FONT]​

```
Private Sub LayoutTest_Click()
      '-------------------------
      ' 1) Open AutoCAD
      On Error Resume Next
          Set Acadapp = GetObject(, "AutoCAD.Application.17")
          Acadapp.Visible = True
          Acadapp.WindowState = acMax
      If Err.Number <> 0 Then
          Set Acadapp = CreateObject("AutoCAD.Application.17")
          Acadapp.Visible = True
          Acadapp.WindowState = acMax
          Err.Clear
      End If
      Me.Show
      '-------------------------
      ' 2) Add new Document
      Dim Doc As AcadDocument
      Set Doc = Acadapp.Documents.Add
      MsgBox "There are one ModeL And two Lyouts nemed Layout1 and Layout2"
      '-------------------------
      '3) use Count Property
      Dim N, M As Integer
      N = Doc.Layouts.Count
      M = Doc.Blocks.Count
      MsgBox "The Count number Of Layouts = " & N
      MsgBox "The Count number Of Blocks = " & M
      '-------------------------
      '4)Get Layouts Block names
      Dim Str0, Str1, Str2, Str3, Str4 As String
      Str0 = Doc.Layouts("Model").Block.Name
      Str1 = Doc.Layouts("Layout1").Block.Name
      Str2 = Doc.Layouts("Layout2").Block.Name
      MsgBox "The name of Block For Model = " & Str0 & vbCrLf & _
             "The name of Block For Layout1 = " & Str1 & vbCrLf & _
             "The name of Block For Layout2 = " & Str2
      '-------------------------
      '5)Add 2 Layouts and Get Layouts Block names
      Doc.Layouts.Add "Layout3"
      Doc.Layouts.Add "Layout4"
      Str1 = Doc.Layouts("Layout1").Block.Name
      Str2 = Doc.Layouts("Layout2").Block.Name
      Str3 = Doc.Layouts("Layout3").Block.Name
      Str4 = Doc.Layouts("Layout4").Block.Name
      MsgBox "There are 4 Lyouts nemed Layout1 , Layout2 , Layout3 , Layout4" & vbCrLf & _
             "The name of Block for Layout1 = " & Str1 & vbCrLf & _
             "The name of Block for Layout2 = " & Str2 & vbCrLf & _
             "The name of Block for Layout3 = " & Str3 & vbCrLf & _
             "The name of Block for Layout4 = " & Str4
      '-------------------------
      '6)Make The Active Lyout Is Layout3 and Get Layouts Block names
      Doc.ActiveLayout = Doc.Layouts("layout3")
      MsgBox "The Active Lyout Is Layout3"
      Str1 = Doc.Layouts("Layout1").Block.Name
      Str2 = Doc.Layouts("Layout2").Block.Name
      Str3 = Doc.Layouts("Layout3").Block.Name
      Str4 = Doc.Layouts("Layout4").Block.Name
      MsgBox "There are 4 Lyouts nemed Layout1 , Layout2 , Layout3 , Layout4" & vbCrLf & _
             "The name of Block for Layout1 = " & Str1 & vbCrLf & _
             "The name of Block for Layout2 = " & Str2 & vbCrLf & _
             "The name of Block for Layout3 = " & Str3 & vbCrLf & _
             "The name of Block for Layout4 = " & Str4
  End Sub
```
 


*[FONT=&quot]الشرح :[/FONT]*

[FONT=&quot]1- في القسم الأول من الكود : تم تشغيل برنامج الأوتوكاد وتعريف العنصر [/FONT]Acadapp[FONT=&quot] على أنه كائن أوتوكاد .[/FONT]

[FONT=&quot]2- في القسم الثاني من الكود : تم إضافة لوحة جديدة باستخدام الوظيفة [/FONT]Add[FONT=&quot] وإسنادها إلى العنصر [/FONT]Doc[FONT=&quot] الذي تم تعريفه على أنه كائن [/FONT]Document[FONT=&quot] وهنا نلاحظ أن برنامج أوتوكاد ينشأ تلقائياً ثلاث أوراق الأولى تسمى [/FONT]Model[FONT=&quot] وتعبر عن حيز النموذج [/FONT]Model Space[FONT=&quot] والثانية والثالثة [/FONT]Layout1[FONT=&quot] و [/FONT]Layout2[FONT=&quot] فهما أوراق رسم تعبران عن حيز الورقة [/FONT]Paper Space[FONT=&quot] .[/FONT]

[FONT=&quot]3- في القسم الثالث من الكود : نستخدم الوظيفة [/FONT]Count[FONT=&quot] لمعرفة عدد الكتل [/FONT]Bloks[FONT=&quot] وعدد الأوراق [/FONT]Layouts[FONT=&quot] المدرجة ضمن الملف الرسومي .[/FONT]

[FONT=&quot]4- في القسم الرابع من الكود : نخزن أسماء الكتل المرتبطة مع أوراق الرسم ضمن متحولات ونعرضها في رسالة نصية وهنا نلاحظ ما يلي :[/FONT]

[FONT=&quot]اسم الكتلة المرتبطة مع الورقة [/FONT]Model[FONT=&quot] هي [/FONT]MODEL_SPACE

[FONT=&quot]اسم الكتلة المرتبطة مع الورقة [/FONT]Layout1[FONT=&quot] هي [/FONT]PAPER_SPACE

[FONT=&quot]اسم الكتلة المرتبطة مع الورقة [/FONT]Layout2[FONT=&quot] هي [/FONT]PAPER_SPACE0

[FONT=&quot]5- في القسم الخامس من الكود : نضيف ورقتي رسم إلى الملف الرسومي باستخدام الوظيفة [/FONT]Add[FONT=&quot] التابعة للكائن [/FONT]Layouts[FONT=&quot] ونسميهما [/FONT]Layout3[FONT=&quot] و [/FONT]Layout4[FONT=&quot] ونقوم بعد ذلك بتخزين أسماء الكتل المرتبطة مع أوراق الرسم ضمن متحولات ونعرضها في رسالة نصية وهنا نلاحظ ما يلي :[/FONT]

[FONT=&quot]اسم الكتلة المرتبطة مع الورقة [/FONT]Layout1[FONT=&quot] هي [/FONT]PAPER_SPACE

[FONT=&quot]اسم الكتلة المرتبطة مع الورقة [/FONT]Layout2[FONT=&quot] هي [/FONT]PAPER_SPACE0

[FONT=&quot]اسم الكتلة المرتبطة مع الورقة [/FONT]Layout3[FONT=&quot] هي [/FONT]PAPER_SPACE1

[FONT=&quot]اسم الكتلة المرتبطة مع الورقة [/FONT]Layout4[FONT=&quot] هي [/FONT]PAPER_SPACE2

[FONT=&quot]6- في القسم السادس من الكود : نجعل الورقة [/FONT]Layout3[FONT=&quot] هي الورقة النشطة باستخدام الوظيفة [/FONT]ActiveLayout[FONT=&quot] التابعة للكائن [/FONT]Document[FONT=&quot] من خلال السطر :[/FONT]​

```
Doc.ActiveLayout = Doc.Layouts("layout3")
```
 
[FONT=&quot]ونقوم بعد ذلك بتخزين أسماء الكتل المرتبطة مع أوراق الرسم ضمن متحولات ونعرضها في رسالة نصية وهنا نلاحظ ما يلي :[/FONT]

[FONT=&quot]اسم الكتلة المرتبطة مع الورقة [/FONT]Layout1[FONT=&quot] هي [/FONT]PAPER_SPACE1

[FONT=&quot]اسم الكتلة المرتبطة مع الورقة [/FONT]Layout2[FONT=&quot] هي [/FONT]PAPER_SPACE0

[FONT=&quot]اسم الكتلة المرتبطة مع الورقة [/FONT]Layout3[FONT=&quot] هي [/FONT]PAPER_SPACE

[FONT=&quot]اسم الكتلة المرتبطة مع الورقة [/FONT]Layout4[FONT=&quot] هي [/FONT]PAPER_SPACE2

[FONT=&quot]وهنا لاحظ كيف حصل تبادل في أسماء الكتل المرتبطة بالورقتين [/FONT]Layout1[FONT=&quot] و [/FONT]Layout3[FONT=&quot] فعندما أصبحت [/FONT]Layout3[FONT=&quot] هي الورقة النشطة أصبح إسم الكتلة المرتبطة معها [/FONT]PAPER_SPACE[FONT=&quot] أما الورقة [/FONT]Layout1[FONT=&quot] التي كانت نشطة فأصبح إسم الكتلة المرتبطة معها [/FONT]PAPER_SPACE1


[FONT=&quot]يتبع..........[/FONT]​


----------



## حسين عبد المنعم (29 يناير 2012)

لقد جمعت ملفات المحاضرات معا- أتمنى ان يكون الترتيب صحيح


----------



## Hossam-am (29 يناير 2012)

حسين عبد المنعم قال:


> لقد جمعت ملفات المحاضرات معا- أتمنى ان يكون الترتيب صحيح


شكرأ يا أستاذ حسين ... بارك الله فيك
اشير إلى أنني أقوم حالياً بإنهاء كتابي (برمجة الأوتوكاد) بشكله النهائي وساطرحه قريباً في المنتدى بعد الانتهاء من سرد جميع الدروس
دمتم بخير 
​


----------



## مجدى أبو بكر (30 يناير 2012)

جزاك الله خيرا وجعلها فى ميزان حسناتك

تعلم فليس المرء يولد عالماً=وليس أخو علم كمن هو جاهل 

وإن كبير القوم لا علم عنده=صغير إذا التفت عليه الجحافل 

وإن صغير القوم إن كان عالماً=كبير إذا ردت إليه المحافل


----------



## Hossam-am (31 يناير 2012)

*تابع الدرس الرابع في بيئة أوتوكاد*

*[FONT=&quot]تطبيق عملي 2 :[/FONT]*
[FONT=&quot]سنشرح في هذا التطبيق النوعين الأول والثاني من الكتل والمسميان [/FONT]*Simple block*[FONT=&quot] و [/FONT]* XRef**block*[FONT=&quot] لعمل ذلك فإننا نقوم بتنفيذ الخطوات التالية :[/FONT]
[FONT=&quot]1- قم بتشغيل برنامج أوتوكاد وقم بإنشاء أربعة ملفات رسومية [/FONT]A , B , C , D[FONT=&quot] وحفظها على المسار [/FONT]D:\Test[FONT=&quot] مثلاً أو أي موقع آخر تختاره ( ولكن عليك تذكر تغيير المسار في الكود ) بحيث يكون الملف [/FONT]A[FONT=&quot] فارغاً والملف [/FONT]B[FONT=&quot] فارغاً وقم بإضافة بعض العناصر الرسومية للملفين [/FONT]C[FONT=&quot] و[/FONT]D[FONT=&quot] ثم إحفظ هذه الملفات وأغلق برنامج أوتوكاد .[/FONT]
[FONT=&quot]1 - قم بفتح مشروع [/FONT]VB2cad[FONT=&quot] وأضف إلى الإطار [/FONT]Form1[FONT=&quot] زر أمر [/FONT]command[FONT=&quot] واجعل خاصية [/FONT]Name[FONT=&quot] له تساوي [/FONT] BlockTest[FONT=&quot]واجعل خاصية [/FONT]Caption[FONT=&quot] تساوي [/FONT]BlockTest
[FONT=&quot]3 - في حدث النقر على الزر [/FONT] BlockTest[FONT=&quot]في الإطار [/FONT]Form1[FONT=&quot] نكتب الكود التالي :[/FONT]

```
Private Sub BlockTest_Click()
      '-------------------------
      ' 1) Open AutoCAD
      On Error Resume Next
          Set Acadapp = GetObject(, "AutoCAD.Application.17")
          Acadapp.Visible = True
          Acadapp.WindowState = acMax
      If Err.Number <> 0 Then
          Set Acadapp = CreateObject("AutoCAD.Application.17")
          Acadapp.Visible = True
          Acadapp.WindowState = acMax
          Err.Clear
      End If
      Me.Show
      '-------------------------
      ' 2) Add new Document
      Dim Doc As AcadDocument
      Set Doc = Acadapp.Documents.Add
      '-------------------------
      ' 3)Define one simple block
      Dim InBlock As AcadBlock
      Dim insertionPoint(0 To 2) As Double
      insertionPoint(0) = 0#
      insertionPoint(1) = 0#
      insertionPoint(2) = 0#
      Set InBlock = Doc.Blocks.Add(insertionPoint, "InBlock")
      MsgBox "you have create simple block named  'InBlock'"
      '-----------------------
      ' 4) add Ellipse to Documents(0)
      Dim EllipseObj As AcadEllipse
      Dim majAxis(0 To 2) As Double
      Dim ECenter(0 To 2) As Double
      Dim radRatio As Double
      ECenter(0) = 500: ECenter(1) = 500: ECenter(2) = 0
      majAxis(0) = 100: majAxis(1) = 200: majAxis(2) = 0
      radRatio = 0.3
      Set EllipseObj = InBlock.AddEllipse(ECenter, majAxis, radRatio)
      '------------------------
      ' 5)Define another simple Block
      Dim SimpleBlock As AcadBlock
      insertionPoint(0) = 0#
      insertionPoint(1) = 0#
      insertionPoint(2) = 0#
      Set SimpleBlock = Doc.Blocks.Add(insertionPoint, "SimpleBlock")
      MsgBox "you have create simple block named  'SimpleBlock'"
      '-----------------------
      ' 6)Add Line and Circle To Block
      Dim Line1 As AcadLine
      Dim StartPt(2) As Double
      Dim EndPt(2) As Double
      StartPt(0) = 280: StartPt(1) = 240: StartPt(2) = 0
      EndPt(0) = 380: EndPt(1) = 400: EndPt(2) = 0
      Set Line1 = SimpleBlock.AddLine(StartPt, EndPt)
      Dim Circle1 As AcadCircle
      Dim  Center(2) As Double
      Dim radius As Double
      Center(0) = 250: Center(1) = 180: Center(2) = 0
      radius = 50
      Set Circle1 = SimpleBlock.AddCircle(Center, radius)
      '-----------------------
      ' 7)Insert the Block inside another Block
      Dim InRefObj As AcadBlockReference
      insertionPoint(0) = 300
      insertionPoint(1) = 300
      insertionPoint(2) = 0
      Set InRefObj = SimpleBlock.InsertBlock(insertionPoint, "InBlock", 1#, 1#, 1#, 0)
      Acadapp.ZoomExtents
      MsgBox "you have Insert the block 'InBlock' Inside The Block 'SimpleBlock'"
      '-----------------------
      ' 8)Insert the simple Block in drawing
      Dim blockRefObj1 As AcadBlockReference
      insertionPoint(0) = 100
      insertionPoint(1) = 200
      insertionPoint(2) = 0
      Set blockRefObj1 = Doc.ModelSpace.InsertBlock(insertionPoint, "SimpleBlock", 1#, 1#, 1#, 0)
      Acadapp.ZoomExtents
      MsgBox "you have Insert the block named  'SimpleBlock' to drawing"
      '-----------------------
      ' 9)Insert the simple Block from another file
      Dim blockRefObj2 As AcadBlockReference
      insertionPoint(0) = 100
      insertionPoint(1) = 200
      insertionPoint(2) = 0
      Set blockRefObj2 = Doc.ModelSpace.InsertBlock(insertionPoint, "D:\Test\C.dwg", 1#, 1#, 1#, 0)
      Acadapp.ZoomExtents
      MsgBox "you have Insert the block from File  'C.dwg' to drawing"
      '-----------------------
      ' 10) open Document B.dwg
      Dim DocB As AcadDocument
      Set DocB = Acadapp.Documents.Open("D:\Test\B.dwg")
      MsgBox "you have Open Drawing 'B.dwg'"
      '-----------------------
      ' 11) insert Extirnal Block D to drawing B with bOverlay = true
      Dim XrefD As AcadExternalReference
      Dim bOverlayD As Boolean
      insertionPoint(0) = 200
      insertionPoint(1) = 400
      insertionPoint(2) = 0
      bOverlayD = True
      Set XrefD = DocB.ModelSpace.AttachExternalReference _
      ("D:\Test\D.dwg", "XrefD", insertionPoint, 1#, 1#, 1#, 0, bOverlayD)
      Acadapp.ZoomExtents
      MsgBox "you have Insert xref block 'D.dwg' to Drawing 'B.dwg' with bOverlay = true"
      '-----------------------
      ' 12) insert Extirnal Block C to drawing B with bOverlay = False
      Dim XrefC As AcadExternalReference
      Dim bOverlayC As Boolean
      insertionPoint(0) = 600
      insertionPoint(1) = 400
      insertionPoint(2) = 0
      bOverlayC = False
      Set XrefC = DocB.ModelSpace.AttachExternalReference _
      ("D:\Test\C.dwg", "XrefC", insertionPoint, 1#, 1#, 1#, 0, bOverlayC)
      Acadapp.ZoomExtents
      MsgBox "you have Insert xref block 'C.dwg' to Drawing 'B.dwg' with bOverlay = False"
      DocB.Close
      '-----------------------
      ' 13) Open Document A.dwg
      Dim DocA As AcadDocument
      Set DocA = Acadapp.Documents.Open("D:\Test\A.dwg")
      MsgBox "you have Open Drawing 'A.dwg'"
      '-----------------------
      ' 14) insert Extirnal Block B to drawing A
      Dim XrefB As AcadExternalReference
      Dim bOverlayA As Boolean
      insertionPoint(0) = 200
      insertionPoint(1) = 400
      insertionPoint(2) = 0
      bOverlayA = False
      Set XrefB = DocA.ModelSpace.AttachExternalReference _
      ("D:\Test\B.dwg", "XrefB", insertionPoint, 1#, 1#, 1#, 0, bOverlayA)
      Acadapp.ZoomExtents
      MsgBox "you have Insert xref block 'B.dwg' to Drawing 'A.dwg' "
  End Sub
```


----------



## Hossam-am (31 يناير 2012)

*[FONT=&quot]الشرح :[/FONT]*

[FONT=&quot]1- في القسم الأول من الكود : تم تشغيل برنامج الأوتوكاد وتعريف العنصر [/FONT]Acadapp[FONT=&quot] على أنه كائن أوتوكاد .[/FONT]

[FONT=&quot]2- في القسم الثاني من الكود : تم إضافة لوحة جديدة باستخدام الوظيفة [/FONT]Add[FONT=&quot] وإسنادها إلى العنصر [/FONT]Doc[FONT=&quot] الذي تم تعريفه على أنه كائن [/FONT]Document

[FONT=&quot]3- في القسم الثالث من الكود : تم إنشاء كتلة باسم [/FONT]InBlock[FONT=&quot] في اللوحة [/FONT]Doc[FONT=&quot] وتم تحديد النقطة [/FONT](0,0,0)[FONT=&quot] كنقطة إمساك للكتلة . كما ورد في السطور :[/FONT]
​

```
Dim InBlock As AcadBlock
  Dim insertionPoint(0 To 2) As Double
  insertionPoint(0) = 0#
  insertionPoint(1) = 0#
  insertionPoint(2) = 0#
  Set InBlock = Doc.Blocks.Add(insertionPoint, "InBlock")
```


[FONT=&quot]4- في القسم الرابع من الكود : تم إضافة قطع ناقص [/FONT]Ellipse[FONT=&quot] إلى الكتلة السابقة [/FONT]InBlock[FONT=&quot] باستخدام الوظيفة [/FONT]AddEllipse

[FONT=&quot]5- في القسم الخامس من الكود : تم إنشاء كتلة ثانية باسم [/FONT]SimpleBlock[FONT=&quot] في اللوحة [/FONT]Doc[FONT=&quot] وتم تحديد النقطة [/FONT](0,0,0)[FONT=&quot] كنقطة إمساك للكتلة . [/FONT]

[FONT=&quot]6- في القسم السادس من الكود : تم إضافة خط [/FONT]Line1[FONT=&quot] إلى الكتلة [/FONT]SimpleBlock[FONT=&quot] باستخدام الوظيفة [/FONT]AddLine[FONT=&quot] ثم تم بعد ذلك إضافة دائرة [/FONT]Circle1[FONT=&quot] إلى الكتلة السابقة باستخدام الوظيفة [/FONT]AddCircle

[FONT=&quot]7- في القسم السابع من الكود : نقوم بإدراج الكتلة [/FONT]InBlock[FONT=&quot] داخل الكتلة [/FONT]SimpleBlock[FONT=&quot] وليس ضمن اللوحة الرسومية . لذلك قمنا أولا بتعريف عنصر يعبر عن *الكتلة المدرجة* وليكن [/FONT]InRefObj[FONT=&quot]ثم تم تحديد نقطة الإدراج [/FONT](300,300,0)[FONT=&quot] ثم قمنا بعد ذلك باستخدام الوظيفة [/FONT]InsertBlock[FONT=&quot] التابعة للكتلة [/FONT]SimpleBlock[FONT=&quot] وهنا نشأت لدينا حالة التعشيش (كتلة داخل كتلة) ونشير إلى أن الكتلة [/FONT]InBlock[FONT=&quot] لن تظهر ضمن اللوحة لحين إدراج الكتلة [/FONT]SimpleBlock[FONT=&quot] التي تحويها . وتم ذلك وفق السطور :[/FONT]
​

```
Dim InRefObj As AcadBlockReference
  insertionPoint(0) = 300
  insertionPoint(1) = 300
  insertionPoint(2) = 0
  Set InRefObj = SimpleBlock.InsertBlock(insertionPoint, "InBlock", 1#, 1#, 1#, 0)
  Acadapp.ZoomExtents
  MsgBox "you have Insert the block 'InBlock' Inside The Block 'SimpleBlock'"
```


[FONT=&quot]8- في القسم الثامن من الكود : نقوم بإدراج الكتلة [/FONT]SimpleBlock[FONT=&quot] ضمن اللوحة الرسومية . لذلك قمنا أولا بتعريف عنصر يعبر عن *الكتلة المدرجة* وليكن [/FONT]blockRefObj1[FONT=&quot]ثم تم تحديد نقطة الإدراج [/FONT](100,200,0)[FONT=&quot] ثم قمنا بعد ذلك باستخدام الوظيفة [/FONT]InsertBlock[FONT=&quot] التابعة للكائن [/FONT]ModelSpace[FONT=&quot] وهو كائن فرعي للكائن [/FONT]Document[FONT=&quot] كما شرحنا سابقاً وبمجرد إدراج الكتلة السابقة في اللوحة الرسومية تظهر جميع العناصر المكونة لها بما فيها الكتلة المدرجة ضمنها وهي الكتلة [/FONT]InBlock[FONT=&quot] . وتم ذلك وفق السطور :[/FONT]
​

```
Dim blockRefObj1 As AcadBlockReference
  insertionPoint(0) = 100
  insertionPoint(1) = 200
  insertionPoint(2) = 0
  Set blockRefObj1 = Doc.ModelSpace.InsertBlock(insertionPoint, "SimpleBlock", 1#, 1#, 1#, 0)
  Acadapp.ZoomExtents
  MsgBox "you have Insert the block named  'SimpleBlock' to drawing"
```


[FONT=&quot]9- في القسم التاسع من الكود : في هذا الجزء من الكود قمنا *بإدراج* ملف رسومي خارجي ضمن اللوحة الرسومية مباشرة على شكل [/FONT]*Simple block*[FONT=&quot] وليس على شكل *ارتباط* وذلك باستخدام الوظيفة [/FONT]InsertBlock[FONT=&quot] التابعة للكائن [/FONT]ModelSpace[FONT=&quot] كما في القسم السابق حيث قمنا أولاً بتعريف عنصر يعبر عن الكتلة المدرجة وليكن [/FONT]blockRefObj2[FONT=&quot] ثم تم تحديد نقطة الإدراج [/FONT](100,200,0)[FONT=&quot] . وتم ذلك وفق السطور :[/FONT]
​

```
Dim blockRefObj2 As AcadBlockReference
  insertionPoint(0) = 100
  insertionPoint(1) = 200
  insertionPoint(2) = 0
  Set blockRefObj2 = Doc.ModelSpace.InsertBlock(insertionPoint, "D:\Test\C.dwg", 1#, 1#, 1#, 0)
  Acadapp.ZoomExtents
  MsgBox "you have Insert the block from File  'C.dwg' to drawing"
```


[FONT=&quot]10- في القسم العاشر من الكود : نفتح الملف الرسومي الفارغ الذي قمنا بإنشائه يدوياً والمسمى [/FONT]B.dwg[FONT=&quot] حيث نعرف عنصر جديد [/FONT]DocB[FONT=&quot] على أنه كائن [/FONT]Document[FONT=&quot] ونسند له الملف السابق باستخدام الوظيفة [/FONT]Open

[FONT=&quot]11- في القسم الحادي عشر من الكود : في هذا الجزء من الكود نقوم بربط الملف الرسومي الحالي [/FONT]B.dwg[FONT=&quot] بملف خارجي [/FONT]D.dwg[FONT=&quot] على شكل *ارتباط خارجي* وذلك باستخدام الوظيفة [/FONT]*AttachExternalReference*[FONT=&quot]التابعة للكائن [/FONT]ModelSpace[FONT=&quot] بما معناه أننا سنقوم بإدراج كتلة من النوع [/FONT]*Xref Block*[FONT=&quot] في الملف الحالي . ولعمل ذلك نقوم أولا بتعريف عنصر اسمه [/FONT]XrefD[FONT=&quot] على أنه كائن ارتباط خارجي [/FONT]ExternalReference[FONT=&quot] ثم نقوم بإجراء الارتباط السابق كما في السطور التالية :[/FONT]
​

```
Dim XrefD As AcadExternalReference
  Dim bOverlayD As Boolean
  insertionPoint(0) = 200
  insertionPoint(1) = 400
  insertionPoint(2) = 0
  bOverlayD = True
  Set XrefD = DocB.ModelSpace.AttachExternalReference _
  ("D:\Test\D.dwg", "XrefD", insertionPoint, 1#, 1#, 1#, 0, bOverlayD)
  Acadapp.ZoomExtents
  MsgBox "you have Insert xref block 'D.dwg' to Drawing 'B.dwg' with bOverlay = true"
```


[FONT=&quot]حيث عرفنا متحول اسمه [/FONT]bOverlayD[FONT=&quot] ليعبر عن العامل [/FONT]bOverlay[FONT=&quot] وجعلنا قيمته تساوي [/FONT]True[FONT=&quot] وحددنا نقطة الإدراج بالنقطة [/FONT](200,400,0)[FONT=&quot] . ومن خلال صيغة الإدراج لاحظ أننا أعطينا إسماً [/FONT]XrefD[FONT=&quot] *للارتباط الخارجي المدرج* (من الممكن اختيار أي إسم آخر) .[/FONT]

[FONT=&quot]12- في القسم الثاني عشر من الكود : في هذا الجزء من الكود نقوم بربط الملف الرسومي الحالي [/FONT]B.dwg[FONT=&quot] بملف خارجي [/FONT]C.dwg[FONT=&quot] على شكل *ارتباط خارجي* بنفس الطريقة المتبعة في القسم السابق بتغيير بسيط حيث نجعل قيمة العامل [/FONT]bOverlay[FONT=&quot] تساوي [/FONT]False[FONT=&quot] كما في السطور التالية :[/FONT]
​

```
Dim XrefC As AcadExternalReference
  Dim bOverlayC As Boolean
  insertionPoint(0) = 600
  insertionPoint(1) = 400
  insertionPoint(2) = 0
  bOverlayC = False
  Set XrefC = DocB.ModelSpace.AttachExternalReference _
  ("D:\Test\C.dwg", "XrefC", insertionPoint, 1#, 1#, 1#, 0, bOverlayC)
  Acadapp.ZoomExtents
  MsgBox "you have Insert xref block 'C.dwg' to Drawing 'B.dwg' with bOverlay = False"
  DocB.Close
```


[FONT=&quot]لاحظ في النهاية أننا نقوم بإغلاق الملف [/FONT]B.dwg[FONT=&quot] باستخدام الخاصية [/FONT]Close[FONT=&quot] للكائن [/FONT]DccB[FONT=&quot] وهذا سيؤدي لحفظ التغييرات على الملف نظراً لكون القيمة الافتراضية لعامل الحفظ تساوي [/FONT]True[FONT=&quot] كما شرحنا في دروس سابقة .[/FONT]

[FONT=&quot]13- في القسم الثالث عشر من الكود : نفتح الملف الرسومي الفارغ الذي قمنا بإنشائه يدوياً والمسمى [/FONT]A.dwg[FONT=&quot] حيث نعرف عنصر جديد [/FONT]DocA[FONT=&quot] على أنه كائن [/FONT]Document[FONT=&quot] ونسند له الملف السابق باستخدام الوظيفة [/FONT]Open

[FONT=&quot]11- في القسم الرابع عشر من الكود : في هذا الجزء من الكود نقوم بربط الملف الرسومي الحالي [/FONT]A.dwg[FONT=&quot] بملف خارجي [/FONT]B.dwg[FONT=&quot] على شكل *ارتباط خارجي* بنفس الطريقة المتبعة في سابقاً كما في السطور التالية :[/FONT]
​

```
Dim XrefB As AcadExternalReference
  Dim bOverlayA As Boolean
  insertionPoint(0) = 200
  insertionPoint(1) = 400
  insertionPoint(2) = 0
  bOverlayA = False
  Set XrefB = DocA.ModelSpace.AttachExternalReference _
  ("D:\Test\B.dwg", "XrefB", insertionPoint, 1#, 1#, 1#, 0, bOverlayA)
  Acadapp.ZoomExtents
  MsgBox "you have Insert xref block 'B.dwg' to Drawing 'A.dwg' "
```


*[FONT=&quot]وهنا ننتبه لملاحظة مهمة جداً :[/FONT]*

[FONT=&quot]- في القسم الحادي عشر من الكود قمنا بإدراج الملف [/FONT]D[FONT=&quot] ضمن الملف [/FONT]B[FONT=&quot] كارتباط مع اعتماد قيمة العامل [/FONT]bOverlay[FONT=&quot] تساوي [/FONT]True[FONT=&quot] .[/FONT]

[FONT=&quot]- في القسم الثاني عشر من الكود قمنا بإدراج الملف [/FONT]C[FONT=&quot] ضمن الملف [/FONT]B[FONT=&quot] كارتباط مع اعتماد قيمة العامل [/FONT]bOverlay[FONT=&quot] تساوي [/FONT]False[FONT=&quot] .[/FONT]

[FONT=&quot]- في القسم الرابع عشر من الكود قمنا بإدراج الملف [/FONT]B[FONT=&quot] ضمن الملف [/FONT]A[FONT=&quot] كارتباط ومع المعاينة للملف [/FONT]A[FONT=&quot] نلاحظ ظهور عناصر الملف [/FONT]C[FONT=&quot] وعدم ظهور عناصر الملف [/FONT]D[FONT=&quot] .[/FONT]



[FONT=&quot]انتهى الدرس الرابع في بيئة أوتوكاد [/FONT]

[FONT=&quot]دمتم بخير[/FONT]​


----------



## Hossam-am (31 يناير 2012)

*إليكم ملف الدرس الرابع في بيئة أوتوكاد بصيغة PDF على الرابط :*
*http://www.4shared.com/office/fRIU8DQo/__4.html*
*وكذلك ملف المشروع VB2cad حتى هذه المرحلة على الرابط :*
*http://www.4shared.com/rar/UA8xQWe6/VB2Cad_4.html*
*وكذلك تجدون الملفات على الرابط:*
*http://www.facebook.com/groups/267612119966249/doc/291414150919379/*​


----------



## nouman (31 يناير 2012)

أشكرك من كل قلبي ...
حقاً إنها شروح مفيدة وسهلة الفهم


----------



## Hossam-am (2 فبراير 2012)

الإخوة الأفاضل
سنتوقف قليلاً عند هذه النقطة قبل ان نتعمق اكثر في بقية الكائنات في بيئة اوتوكاد لنتيح فرصة لمتابعي الموضوع للتمكن من قراءة الشروح السابقة بشكل مفصل وطرح الاستفسارات والاسئلة وتطبيق الاكواد البرمجية الموجودة في الامثلة والتطبيقات العملية .
لذلك سنتوقف هنا قليلاً في بيئة أوتوكاد ونعود لنكمل سلسة الدروس الخاصة بإضافة العناصر الرسومية وشرح أهم خصائصها ووظائف التحكم بها
والدرس القادم سيكون الدرس السابع عشر في التعامل مع العناصر الرسومية ويتتناول 
العنصرين ray و Xline 

دمتم بخير

​


----------



## Hossam-am (2 فبراير 2012)

*الدرس السابع عشر في العناصر الرسومية (العنصرين Ray و Xline)*

*[FONT=&quot]العنصرين [/FONT]**Ray**[FONT=&quot] و [/FONT]**Xline**[FONT=&quot] [/FONT]*​ *[FONT=&quot]العنصر [/FONT]**Ray**[FONT=&quot] :[/FONT]*

· [FONT=&quot]لإنشاء العنصر الرسومي [/FONT]*Ray*[FONT=&quot] فإننا نستخدم الوظيفة [/FONT]AddRay [FONT=&quot]حيث الصيغة العامة لهذه الوظيفة على الشكل :[/FONT]​

```
RetVal = object.AddRay(Point1, Point2)
```
 
*[FONT=&quot] [/FONT]*

*Object*[FONT=&quot] : وهو إما أن يكون [/FONT]ModelSpace [FONT=&quot]أو [/FONT]PaperSpace [FONT=&quot] أو [/FONT]Block[FONT=&quot] أي يمكن إضافة الشعاع ضمن حيز النموذج [/FONT]ModelSpace[FONT=&quot] أو ضمن حيز الورقة [/FONT]PaperSpace[FONT=&quot] أو تضمينها لكتلة [/FONT]Block[FONT=&quot] .[/FONT]

*Point1**[FONT=&quot] [/FONT]*[FONT=&quot]: متحول نخزن به إحداثيات النقطة الأولى التي ينطلق منها الشعاع [/FONT]Ray[FONT=&quot] أو ما يسمى بنقطة القاعدة .[/FONT]

*Point2**[FONT=&quot] [/FONT]*[FONT=&quot]: متحول نخزن به إحداثيات نقطة مساعدة سيمر بها الشعاع [/FONT]Ray[FONT=&quot] .[/FONT][FONT=&quot][/FONT]

*RetVal*[FONT=&quot] : عنصر يتم تعريفه على أنه شعاع [/FONT]Ray[FONT=&quot] في أتوكاد .[/FONT]

· [FONT=&quot]الشعاع [/FONT]Ray[FONT=&quot] سينطلق من النقطة الأولى [/FONT]Point1[FONT=&quot] والتي تمثل نقطة القاعدة وسيمر بالنقطة المساعدة [/FONT]Point2[FONT=&quot] ويستمر إلى اللانهاية . [/FONT]

· [FONT=&quot]إن برنامج أوتوكاد يقوم بحفظ إحداثيات نقطة القاعدة [/FONT]Point1[FONT=&quot] من خلال الخاصية [/FONT]BasePoint[FONT=&quot] كما يقوم بحساب الزاوية [/FONT]_Alfa_[FONT=&quot] التي يحصرها الشعاع عن الأفق مقدرةً بالراديان بالاستعانة بالنقطة [/FONT]Point2[FONT=&quot] ويحسب النسب المثلثية لهذه الزاوية [/FONT]_Cos(Alfa)__[FONT=&quot] [/FONT]_[FONT=&quot]و [/FONT]_Sin(Alfa)_[FONT=&quot] ويخزن هذه القيم التي يمكن الحصول عليها من خلال الخاصية [/FONT]DirectionVector[FONT=&quot] التي تحدد اتجاه الشعاع . [/FONT]

· [FONT=&quot]كما يقوم برنامج أوتوكاد باحتساب إحداثيات نقطة مميزة ثانية يمر منها الشعاع (مختلفة عن إحداثيات النقطة المساعدة [/FONT]Point2[FONT=&quot] ) ويتم ذلك بإضافة القيم المثلثية السابقة إلى قيم إحداثيات نقطة القاعدة ويخزن هذه القيم التي يمكن الحصول عليها من خلال الخاصية [/FONT]SecondPoint[FONT=&quot] .[/FONT]

[FONT=&quot]فإذا اعتبرنا مثلاً أن العنصر [/FONT]RayObj[FONT=&quot] يمثل شعاع [/FONT]Ray[FONT=&quot] فإن قيم الخواص السابقة تحتسب على الشكل التالي :[/FONT]


```
[/RIGHT]
    RayObj.DirectionVector(0) = Cos(Alfa)
  RayObj.DirectionVector(1) = Sin(Alfa)
  RayObj.SecondPoint (0) = RayObj.BasePoint (0) + Cos(Alfa)
  RayObj.SecondPoint (1) = RayObj.BasePoint (1) + Sin(Alfa)
```
 
[FONT=&quot]ونشير إلى أن الخواص السابقة هي للقراءة والكتابة حيث يمكن تعديل قيمها من خلال الكود .[/FONT]​


----------



## Hossam-am (2 فبراير 2012)

*نتابع الدرس السابع عشر في العناصر الرسومية*
*[FONT=&quot]تطبيق عملي :[/FONT]*

[FONT=&quot]1 - الآن قم بفتح مشروع [/FONT]VBcad[FONT=&quot] وأضف إلى الإطار [/FONT]Form1[FONT=&quot] زر أمر [/FONT]command[FONT=&quot] واجعل خاصية [/FONT]Name[FONT=&quot] له تساوي [/FONT] AddRay[FONT=&quot]واجعل خاصية [/FONT]Caption[FONT=&quot] تساوي [/FONT]AddRay

[FONT=&quot]2 - في حدث النقر على الزر [/FONT]AddRay[FONT=&quot] في الإطار [/FONT]Form1[FONT=&quot] نكتب الكود التالي :[/FONT]​

```
Private Sub AddRay_Click()
      '-------------------
      '1) Open AutoCAD
      On Error Resume Next
          Set Acadapp = GetObject(, "AutoCAD.Application.17")
          Acadapp.Documents.Add
          Acadapp.Visible = True
          Acadapp.WindowState = acMax
      If Err.Number <> 0 Then
          Set Acadapp = CreateObject("AutoCAD.Application.17")
          Acadapp.Documents.Add
          Acadapp.Visible = True
          Acadapp.WindowState = acMax
          Err.Clear
      End If
      Me.Show
      '---------------------
      '2) Define Ray Object
      Dim RayObj As AcadRay
      Dim Point1(0 To 2) As Double
      Dim Point2(0 To 2) As Double
      Point1(0) = 1: Point1(1) = 1: Point1(2) = 0
      Point2(0) = 4: Point2(1) = 4: Point2(2) = 0
      Set RayObj = Acadapp.ActiveDocument.ModelSpace.AddRay(Point1, Point2)
      Acadapp.ZoomAll
      MsgBox "The BasePoint(0) of Ray = " & RayObj.BasePoint(0) & vbCrLf & _
              "The BasePoint(1) of Ray = " & RayObj.BasePoint(1) & vbCrLf & _
             "The BasePoint(2) of Ray = " & RayObj.BasePoint(2) & vbCrLf & _
             "The DirectionVec(0) of Ray = " & RayObj.DirectionVector(0) & vbCrLf & _
             "The DirectionVec(1) of Ray = " & RayObj.DirectionVector(1) & vbCrLf & _
             "The DirectionVec(2) of Ray = " & RayObj.DirectionVector(2) & vbCrLf & _
             "The SecondPoint(0) of Ray = " & RayObj.SecondPoint(0) & vbCrLf & _
             "The SecondPoint(1) of Ray = " & RayObj.SecondPoint(1) & vbCrLf & _
             "The SecondPoint(2) of Ray = " & RayObj.SecondPoint(2)
      '---------------------
      '3) Change the BasePoint of Ray
      Dim NewPoint1(0 To 2) As Double
      NewPoint1(0) = 50: NewPoint1(1) = 50: NewPoint1(2) = 0
      RayObj.BasePoint = NewPoint1
      RayObj.Update
      MsgBox "You have Change the BasePoint of Ray " & vbCrLf & vbCrLf & _
             "The NewBasePoint(0) of Ray = " & RayObj.BasePoint(0) & vbCrLf & _
             "The NewBasePoint(1) of Ray = " & RayObj.BasePoint(1) & vbCrLf & _
             "The NewBasePoint(2) of Ray = " & RayObj.BasePoint(2) & vbCrLf & _
             "The NewDirectionVec(0) of Ray = " & RayObj.DirectionVector(0) & vbCrLf & _
             "The NewDirectionVec(1) of Ray = " & RayObj.DirectionVector(1) & vbCrLf & _
             "The NewDirectionVec(2) of Ray = " & RayObj.DirectionVector(2) & vbCrLf & _
             "The NewSecondPoint(0) of Ray = " & RayObj.SecondPoint(0) & vbCrLf & _
             "The NewSecondPoint(1) of Ray = " & RayObj.SecondPoint(1) & vbCrLf & _
             "The NewSecondPoint(2) of Ray = " & RayObj.SecondPoint(2)
      '---------------------
      '4) Change the SecondPoint of Ray
      Dim NewPoint2(0 To 2) As Double
      NewPoint2(0) = 77: NewPoint2(1) = 70: NewPoint2(2) = 0
      RayObj.SecondPoint = NewPoint2
      RayObj.Update
      MsgBox "You have Change the SecondPoint of Ray " & vbCrLf & vbCrLf & _
             "The NewBasePoint(0) of Ray = " & RayObj.BasePoint(0) & vbCrLf & _
             "The NewBasePoint(1) of Ray = " & RayObj.BasePoint(1) & vbCrLf & _
             "The NewBasePoint(2) of Ray = " & RayObj.BasePoint(2) & vbCrLf & _
             "The NewDirectionVec(0) of Ray = " & RayObj.DirectionVector(0) & vbCrLf & _
             "The NewDirectionVec(1) of Ray = " & RayObj.DirectionVector(1) & vbCrLf & _
             "The NewDirectionVec(2) of Ray = " & RayObj.DirectionVector(2) & vbCrLf & _
             "The NewSecondPoint(0) of Ray = " & RayObj.SecondPoint(0) & vbCrLf & _
             "The NewSecondPoint(1) of Ray = " & RayObj.SecondPoint(1) & vbCrLf & _
             "The NewSecondPoint(2) of Ray = " & RayObj.SecondPoint(2)
      '---------------------
      '5) Change the DirectionVector of Ray
      Dim NewDirectionVec(0 To 2) As Double
      NewDirectionVec(0) = 40: NewDirectionVec(1) = 10: NewDirectionVec(2) = 0
      RayObj.DirectionVector = NewDirectionVec
      RayObj.Update
      MsgBox "You have Change the DirectionVector of Ray " & vbCrLf & vbCrLf & _
             "The NewBasePoint(0) of Ray = " & RayObj.BasePoint(0) & vbCrLf & _
             "The NewBasePoint(1) of Ray = " & RayObj.BasePoint(1) & vbCrLf & _
             "The NewBasePoint(2) of Ray = " & RayObj.BasePoint(2) & vbCrLf & _
             "The NewDirectionVec(0) of Ray = " & RayObj.DirectionVector(0) & vbCrLf & _
             "The NewDirectionVec(1) of Ray = " & RayObj.DirectionVector(1) & vbCrLf & _
             "The NewDirectionVec(2) of Ray = " & RayObj.DirectionVector(2) & vbCrLf & _
             "The NewSecondPoint(0) of Ray = " & RayObj.SecondPoint(0) & vbCrLf & _
             "The NewSecondPoint(1) of Ray = " & RayObj.SecondPoint(1) & vbCrLf & _
             "The NewSecondPoint(2) of Ray = " & RayObj.SecondPoint(2)
  End Sub
```
 
*[FONT=&quot]الشرح :[/FONT]*

[FONT=&quot]1- في القسم الأول من الكود : تم تشغيل برنامج الأوتوكاد وتعريف العنصر [/FONT]Acadapp[FONT=&quot] على أنه كائن أوتوكاد .[/FONT]

[FONT=&quot]2- في القسم الثاني من الكود : تم تعريف العنصر [/FONT]RayObj[FONT=&quot] على أنه شعاع [/FONT]Ray[FONT=&quot] وتم إعطاء قيم لإحداثيات نقطة القاعدة وتخزينها في المتحول [/FONT]Point1[FONT=&quot] وإعطاء قيم لإحداثيات النقطة المساعدة وتخزينها في المتحول [/FONT]Point2[FONT=&quot] وتم استخدام الوظيفة [/FONT]AddRay[FONT=&quot] لإضافة العنصر السابق إلى حيز النموذج [/FONT]ModelSpace[FONT=&quot] في اللوحة الحالية [/FONT]ActiveDocument[FONT=&quot] .[/FONT]

[FONT=&quot]يتم بعد ذلك في رسالة نصية [/FONT]_MsgBox_[FONT=&quot] إظهار قيم الخصائص [/FONT]RayObj*.*BasePoint[FONT=&quot] و [/FONT]RayObj*.*DirectionVector[FONT=&quot] و [/FONT]RayObj*.*SecondPoint[FONT=&quot] وهنا نلاحظ كيف قام برنامج أوتوكاد باحتساب إحداثيات نقطة مميزة ثانية تظهر من خلال الخاصية [/FONT]SecondPoint[FONT=&quot] وهي مختلفة عن إحداثيات النقطة المساعدة [/FONT]Point2[FONT=&quot] كما قام باحتساب النسب المثلثية لزاوية ميل الشعاع عن الأفق وتظهر من خلال الخاصية [/FONT]DirectionVector[FONT=&quot] .[/FONT]

[FONT=&quot]3- في القسم الثالث من الكود : تم تعريف متحول [/FONT]NewPoint1[FONT=&quot] لتخزين إحداثيات جديدة لنقطة القاعدة وتم إسناد هذه القيم إلى الشعاع السابق مباشرة من خلال العبارة :[/FONT]​

```
RayObj.BasePoint = NewPoint1
```
 
[FONT=&quot]يتم بعد ذلك في رسالة نصية [/FONT]_MsgBox_[FONT=&quot] إظهار قيم الخصائص السابقة للشعاع .[/FONT]

[FONT=&quot]4- في القسم الرابع من الكود : تم تعريف متحول [/FONT]NewPoint2[FONT=&quot] لتخزين إحداثيات جديدة للنقطة المساعدة وتم إسناد هذه القيم إلى الشعاع السابق مباشرة من خلال العبارة :[/FONT]​

```
RayObj.SecondPoint = NewPoint2
```
 
[FONT=&quot]يتم بعد ذلك في رسالة نصية [/FONT]_MsgBox_[FONT=&quot] إظهار قيم الخصائص السابقة للشعاع وهنا نلاحظ أن أوتوكاد يقوم باحتساب إحداثيات نقطة مميزة ثانية تظهر من خلال الخاصية [/FONT]SecondPoint[FONT=&quot] وهي مختلفة عن إحداثيات النقطة المساعدة [/FONT]NewPoint2[FONT=&quot] .[/FONT]

[FONT=&quot]4- في القسم الخامس من الكود : تم تعريف متحول [/FONT]NewDirectionVec[FONT=&quot] يعبر عن نقطة تحدد اتجاه الشعاع وتم إسناد قيم هذا المتحول إلى الشعاع السابق مباشرة من خلال العبارة :[/FONT]​

```
RayObj.DirectionVector = NewDirectionVec
```
 
[FONT=&quot]يتم بعد ذلك في رسالة نصية [/FONT]_MsgBox_[FONT=&quot] إظهار قيم الخصائص السابقة للشعاع وهنا نلاحظ أن أوتوكاد يقوم باحتساب النسب المثلثية لزاوية ميل الشعاع عن الأفق وتظهر من خلال الخاصية [/FONT]DirectionVector[FONT=&quot] وهي مختلفة عن القيم التي تم إعطائها للمتحول [/FONT]NewDirectionVec[FONT=&quot] .[/FONT]​


----------



## Hossam-am (2 فبراير 2012)

*نتابع الدرس السابع عشر في العناصر الرسومية*
*[FONT=&quot]العنصر [/FONT]**Xline**[FONT=&quot] :[/FONT]*

· [FONT=&quot]لإنشاء العنصر الرسومي [/FONT]*Xline*[FONT=&quot] فإننا نستخدم الوظيفة [/FONT]AddXline [FONT=&quot]حيث الصيغة العامة لهذه الوظيفة على الشكل :[/FONT]​

```
RetVal = object.AddXline(Point1, Point2)
```
 
[FONT=&quot]حيث :[/FONT]

*Object*[FONT=&quot] : وهو إما أن يكون [/FONT]ModelSpace [FONT=&quot]أو [/FONT]PaperSpace [FONT=&quot] أو [/FONT]Block[FONT=&quot] .[/FONT]

*Point1*[FONT=&quot]: متحول نخزن به إحداثيات النقطة الأولى التي يمر منها الخط المستمر [/FONT]Xline[FONT=&quot] أو ما يسمى بنقطة القاعدة .[/FONT]

*Point2*[FONT=&quot]: متحول نخزن به إحداثيات نقطة مساعدة سيمر بها الخط المستمر [/FONT]Xline[FONT=&quot] .[/FONT]

*RetVal*[FONT=&quot] : عنصر يتم تعريفه على أنه الخط المستمر [/FONT]Xline[FONT=&quot] في أتوكاد .[/FONT]

​ *[FONT=&quot]العنصر [/FONT]**Xline**[FONT=&quot] مشابه تماماً للعنصر [/FONT]**Ray**[FONT=&quot] ويمتلك نفس الخصائص ووظائف التحكم تماماً عدا عن اختلاف وحيد هو أن العنصر [/FONT]**Xline**[FONT=&quot] ممتد إلى اللانهاية من الطرفين .[/FONT]*

[FONT=&quot]ولشرح هذا العنصر سنقوم بتنفيذ تطبيق عملي مشابه تماماً للتطبيق العملي السابق لملاحظة أن العنصرين [/FONT]Xline[FONT=&quot] و [/FONT]Ray[FONT=&quot] متشابهان تماماً ويمتلكان نفس الخصائص مع إضافة جزأين جديدين إلى الكود لإنشاء عنصر [/FONT]Xline[FONT=&quot] بشكل شاقولي وأفقي .[/FONT]

*[FONT=&quot]تطبيق عملي :[/FONT]*

[FONT=&quot]1 - الآن قم بفتح مشروع [/FONT]VBcad[FONT=&quot] وأضف إلى الإطار [/FONT]Form1[FONT=&quot] زر أمر [/FONT]command[FONT=&quot] واجعل خاصية [/FONT]Name[FONT=&quot] له تساوي [/FONT] AddXline[FONT=&quot]واجعل خاصية [/FONT]Caption[FONT=&quot] تساوي [/FONT]AddXline

[FONT=&quot]2 - في حدث النقر على الزر [/FONT]AddXline[FONT=&quot] في الإطار [/FONT]Form1[FONT=&quot] نكتب الكود التالي :[/FONT]​

```
Private Sub AddXline_Click()
      '-------------------
      '1) Open AutoCAD
      On Error Resume Next
          Set Acadapp = GetObject(, "AutoCAD.Application.17")
          Acadapp.Documents.Add
          Acadapp.Visible = True
          Acadapp.WindowState = acMax
      If Err.Number <> 0 Then
          Set Acadapp = CreateObject("AutoCAD.Application.17")
          Acadapp.Documents.Add
          Acadapp.Visible = True
          Acadapp.WindowState = acMax
          Err.Clear
      End If
      Me.Show
      '---------------------
      '2) Define Xline Object
      Dim XlineObj As AcadXline
      Dim Point1(0 To 2) As Double
      Dim Point2(0 To 2) As Double
      Point1(0) = 1: Point1(1) = 1: Point1(2) = 0
      Point2(0) = 4: Point2(1) = 4: Point2(2) = 0
      Set XlineObj = Acadapp.ActiveDocument.ModelSpace.AddXline(Point1, Point2)
      Acadapp.ZoomAll
      MsgBox "The BasePoint(0) of Xline = " & XlineObj.BasePoint(0) & vbCrLf & _
             "The BasePoint(1) of Xline = " & XlineObj.BasePoint(1) & vbCrLf & _
             "The BasePoint(2) of Xline = " & XlineObj.BasePoint(2) & vbCrLf & _
             "The DirectionVec(0) of Xline = " & XlineObj.DirectionVector(0) & vbCrLf & _
             "The DirectionVec(1) of Xline = " & XlineObj.DirectionVector(1) & vbCrLf & _
             "The DirectionVec(2) of Xline = " & XlineObj.DirectionVector(2) & vbCrLf & _
             "The SecondPoint(0) of Xline = " & XlineObj.SecondPoint(0) & vbCrLf & _
             "The SecondPoint(1) of Xline = " & XlineObj.SecondPoint(1) & vbCrLf & _
             "The SecondPoint(2) of Xline = " & XlineObj.SecondPoint(2)
      '---------------------
      '3) Change the BasePoint of Xline
      Dim NewPoint1(0 To 2) As Double
      NewPoint1(0) = 50: NewPoint1(1) = 50: NewPoint1(2) = 0
      XlineObj.BasePoint = NewPoint1
      XlineObj.Update
      MsgBox "You have Change the BasePoint of Xline " & vbCrLf & vbCrLf & _
             "The NewBasePoint(0) of Xline = " & XlineObj.BasePoint(0) & vbCrLf & _
             "The NewBasePoint(1) of Xline = " & XlineObj.BasePoint(1) & vbCrLf & _
             "The NewBasePoint(2) of Xline = " & XlineObj.BasePoint(2) & vbCrLf & _
             "The NewDirectionVec(0) of Xline = " & XlineObj.DirectionVector(0) & vbCrLf & _
             "The NewDirectionVec(1) of Xline = " & XlineObj.DirectionVector(1) & vbCrLf & _
             "The NewDirectionVec(2) of Xline = " & XlineObj.DirectionVector(2) & vbCrLf & _
             "The NewSecondPoint(0) of Xline = " & XlineObj.SecondPoint(0) & vbCrLf & _
             "The NewSecondPoint(1) of Xline = " & XlineObj.SecondPoint(1) & vbCrLf & _
             "The NewSecondPoint(2) of Xline = " & XlineObj.SecondPoint(2)
      '---------------------
      '4) Change the SecondPoint of Xline
      Dim NewPoint2(0 To 2) As Double
      NewPoint2(0) = 77: NewPoint2(1) = 70: NewPoint2(2) = 0
      XlineObj.SecondPoint = NewPoint2
      XlineObj.Update
      MsgBox "You have Change the SecondPoint of Xline " & vbCrLf & vbCrLf & _
             "The NewBasePoint(0) of Xline = " & XlineObj.BasePoint(0) & vbCrLf & _
             "The NewBasePoint(1) of Xline = " & XlineObj.BasePoint(1) & vbCrLf & _
             "The NewBasePoint(2) of Xline = " & XlineObj.BasePoint(2) & vbCrLf & _
             "The NewDirectionVec(0) of Xline = " & XlineObj.DirectionVector(0) & vbCrLf & _
             "The NewDirectionVec(1) of Xline = " & XlineObj.DirectionVector(1) & vbCrLf & _
             "The NewDirectionVec(2) of Xline = " & XlineObj.DirectionVector(2) & vbCrLf & _
             "The NewSecondPoint(0) of Xline = " & XlineObj.SecondPoint(0) & vbCrLf & _
             "The NewSecondPoint(1) of Xline = " & XlineObj.SecondPoint(1) & vbCrLf & _
             "The NewSecondPoint(2) of Xline = " & XlineObj.SecondPoint(2)
      '---------------------
      '5) Change the DirectionVector of Xline
      Dim NewDirectionVec(0 To 2) As Double
      NewDirectionVec(0) = 40: NewDirectionVec(1) = 10: NewDirectionVec(2) = 0
      XlineObj.DirectionVector = NewDirectionVec
      XlineObj.Update
      MsgBox "You have Change the DirectionVector of Xline " & vbCrLf & vbCrLf & _
             "The NewBasePoint(0) of Xline = " & XlineObj.BasePoint(0) & vbCrLf & _
             "The NewBasePoint(1) of Xline = " & XlineObj.BasePoint(1) & vbCrLf & _
             "The NewBasePoint(2) of Xline = " & XlineObj.BasePoint(2) & vbCrLf & _
             "The NewDirectionVec(0) of Xline = " & XlineObj.DirectionVector(0) & vbCrLf & _
             "The NewDirectionVec(1) of Xline = " & XlineObj.DirectionVector(1) & vbCrLf & _
             "The NewDirectionVec(2) of Xline = " & XlineObj.DirectionVector(2) & vbCrLf & _
             "The NewSecondPoint(0) of Xline = " & XlineObj.SecondPoint(0) & vbCrLf & _
             "The NewSecondPoint(1) of Xline = " & XlineObj.SecondPoint(1) & vbCrLf & _
             "The NewSecondPoint(2) of Xline = " & XlineObj.SecondPoint(2)
      '---------------------
      '6) Make Vertical Xline
      Point1(0) = 100: Point1(1) = 100: Point1(2) = 0
      Point2(0) = 100: Point2(1) = 200: Point2(2) = 0
      XlineObj.BasePoint = Point1
      XlineObj.SecondPoint = Point2
      XlineObj.Update
      MsgBox "You have Make Vertical Xline"
      '---------------------
      '7) Make Horizontal Xline
      Point1(0) = 100: Point1(1) = 100: Point1(2) = 0
      Point2(0) = 200: Point2(1) = 100: Point2(2) = 0
      XlineObj.BasePoint = Point1
      XlineObj.SecondPoint = Point2
      XlineObj.Update
      MsgBox "You have Make Horizontal Xline"
  End Sub
```
 
[FONT=&quot]في الكود السابق تم إضافة القسم 6 الخاص برسم خط مستمر شاقولي كما تم إضافة القسم 7 الخاص برسم خط مستمر أفقي .[/FONT]


[FONT=&quot]نهاية الدرس السابع عشر
[/FONT]​


----------



## Hossam-am (3 فبراير 2012)

إليكم ملف الدرس السابع عشر في العناصر الرسومية (العنصرين Ray و Xline ) بصيغة PDF على الرابط :
http://www.4shared.com/office/91_jhvCb/___online.html
 
وكذلك مشروع المثال VBCAD حتى هذه المرحلة على الرابط :

http://www.4shared.com/rar/Pw2NDXZg/VBCad_17.html
 
كما تجد الملفات السابقة هنا :

*الدرس 17 في العناصر الرسومية*​


----------



## حسين عبد المنعم (5 فبراير 2012)

بالرغم من اننى من غير المؤيدين لكثره رسائل الشكر فى الصفحه إلا أننى اجد نفسى مدفوع بشده لتقديم رساله شكر للمهندس حسام على هذا المجهود الرائع و رساله شكر لكل الجادين أمثال المهندس حسام الذين أثروا صفحات المواقع العربيه بالمعلومه المفيده - جعلها الله فى ميزان حسناتهم يوم القيامه


----------



## Hossam-am (5 فبراير 2012)

*الدرس الثامن عشر في العناصر الرسومية (النقطة Point)*

*[FONT=&quot]النقطة [/FONT]**Point*​ [FONT=&quot]تتعين النقطة في الفراغ بثلاثة بارامترات وهي [/FONT]X , Y , Z [FONT=&quot] حيث يحدد المتغير [/FONT]Z[FONT=&quot] المستوي [/FONT]Level[FONT=&quot] الذي تتبع له النقطة .[/FONT]

· [FONT=&quot]الصيغة العامة لإنشاء نقطة تكون على الشكل التالي :[/FONT]​

```
RetVal = object.AddPoint(Point)
```
 
[FONT=&quot]حيث :[/FONT]

*Object*[FONT=&quot] : وهو إما أن يكون [/FONT]ModelSpace [FONT=&quot]أو [/FONT]PaperSpace [FONT=&quot] أو [/FONT]Block[FONT=&quot] .[/FONT]

*Point**[FONT=&quot] [/FONT]*[FONT=&quot]: متحول نخزن به إحداثيات النقطة .[/FONT]

*RetVal*[FONT=&quot] : متحول يتم تعريفه على أنه نقطة في أوتوكاد .[/FONT]

· [FONT=&quot]يمكن التحكم بمظهر النقطة وحجمها من خلال تعديل قيم المتغيرين [/FONT]PDMODE[FONT=&quot] و [/FONT]PDSIZE[FONT=&quot] وهما من متغيرات النظام في بيئة أوتوكاد [/FONT]*system variables* [FONT=&quot] ويمكن تعديل قيم هذين المتغيرين باستخدام الوظيفة [/FONT]*SetVariable*[FONT=&quot] التي سنشرحها بالتفصيل لاحقاً . [/FONT]

[FONT=&quot]وتبين الصورة التالية الأشكال التي تأخذها النقطة مضافاً إليها قيم المتغير [/FONT]PDMODE[FONT=&quot] الذي يتحكم بمظهر النقطة .[/FONT]​




[FONT=&quot][/FONT]​

· [FONT=&quot]المتغير [/FONT]PDSIZE[FONT=&quot] يتحكم بحجم النقطة ونميز لهذا المتغير الحالات التالية :[/FONT]

1- [FONT=&quot]عندما تكون النقطة بأحد الأشكال 0 أو 1 ( أي أن قيمة المتغير [/FONT]PDMODE[FONT=&quot] تساوي 0 أو 1) فعندها لا يوجد تأثير لقيمة المتغير [/FONT]PDSIZE[FONT=&quot] [/FONT]

2- [FONT=&quot]فيما عدا ذلك إذا كانت قيمة [/FONT]PDSIZE[FONT=&quot] تساوي الصفر 0 فإن حجم النقطة سيشكل [/FONT]5%[FONT=&quot] من ارتفاع منطقة الرسم .[/FONT]

3- [FONT=&quot]إن إعطاء قيمة موجبة للمتغير [/FONT]PDSIZE[FONT=&quot] يجعل حجم النقطة مقدراً بالوحدات القياسية المعتمدة في الرسم .[/FONT]

4- [FONT=&quot]أما إعطاء قيمة سالبة للمتغير [/FONT]PDSIZE[FONT=&quot] معنى ذلك أن حجم النقطة سيشكل نسبة من حجم المعاينة الحالية .[/FONT]

*[FONT=&quot]تطبيق عملي :[/FONT]*

[FONT=&quot]1 - الآن قم بفتح مشروع [/FONT]VBcad[FONT=&quot] وأضف إلى الإطار [/FONT]Form1[FONT=&quot] زر أمر [/FONT]command[FONT=&quot] واجعل خاصية [/FONT]Name[FONT=&quot] له تساوي [/FONT] AddPoint[FONT=&quot]واجعل خاصية [/FONT]Caption[FONT=&quot] تساوي [/FONT]AddPoint[FONT=&quot][/FONT]

[FONT=&quot]2 - في حدث النقر على الزر [/FONT]AddPoint[FONT=&quot] في الإطار [/FONT]Form1[FONT=&quot] نكتب الكود التالي :[/FONT]

[FONT=&quot] [/FONT]​

```
Private Sub AddPoint_Click()
      '-------------------
      '1) Open AutoCAD
      On Error Resume Next
          Set Acadapp = GetObject(, "AutoCAD.Application.17")
          Acadapp.Documents.Add
          Acadapp.Visible = True
          Acadapp.WindowState = acMax
      If Err.Number <> 0 Then
          Set Acadapp = CreateObject("AutoCAD.Application.17")
          Acadapp.Documents.Add
          Acadapp.Visible = True
          Acadapp.WindowState = acMax
          Err.Clear
      End If
      Me.Show
      '---------------------
      '2) create a Point
      Dim PointObj As AcadPoint
      Dim Location(0 To 2) As Double
      Location(0) = 20: Location(1) = 20: Location(2) = 0
      Set PointObj = Acadapp.ActiveDocument.ModelSpace.AddPoint(Location)
      Acadapp.ZoomAll
      MsgBox "you have create a Point(20,20,0)"
      '---------------------
      '3) change PDMODE
      Acadapp.ActiveDocument.SetVariable "PDMODE", 3
      MsgBox "you have Change PDMODE to 3 "
      '---------------------
      '4) change PDSIZE positive+
      Acadapp.ActiveDocument.SetVariable "PDSIZE", 25
      MsgBox "you have Change PDSIZE to 25 "
      '---------------------
      '5) change PDSIZE negative-
      Acadapp.ActiveDocument.SetVariable "PDSIZE", -50
      MsgBox "you have Change PDSIZE to -50 "
  End Sub
```
 
[FONT=&quot]لاحظ في القسم الثاني من الكود استخدام الوظيفة [/FONT]AddPoint[FONT=&quot] لإنشاء نقطة عند الإحداثيات [/FONT](20,20,0)[FONT=&quot] [/FONT][FONT=&quot]كما تم في الأقسام الثالث والرابع والخامس من الكود استخدام الوظيفة [/FONT]SetVariable[FONT=&quot] [/FONT][FONT=&quot]لتعديل قيم المتغيرين [/FONT]PDMODE[FONT=&quot] و[/FONT]PDSIZE[FONT=&quot] [/FONT][FONT=&quot] ففي القسم الثالث جعلنا قيمة [/FONT]PDMODE[FONT=&quot] تساوي 3 وفي القسم الرابع جعلنا قيمة [/FONT]PDSIZE[FONT=&quot] تساوي 25 ثم في القسم الخامس جعلنا قيمة [/FONT]PDSIZE[FONT=&quot] تساوي [/FONT]-50[FONT=&quot] وهي تعني أن حجم النقطة يساوي [/FONT]50%[FONT=&quot] من حجم المعاينة الحالية .[/FONT]

[FONT=&quot][/FONT]
[FONT=&quot]انتهى الدرس
[/FONT]​


----------



## Hossam-am (5 فبراير 2012)

*وإليكم ملف الدرس الثامن عشر في العناصر الرسومية بصيغة PDF على الرابط :
http://www.4shared.com/office/D8Pem1Lc/___online.html

وكذلك مشروع المثال VBCad حتى هذه المرحلة على الرابط :
http://www.4shared.com/rar/7ngNpCEZ/VBCad_18.html

كما يمكن الحصول على الملفات من هنا :
تحميل الملفات



*​


----------



## Hossam-am (6 فبراير 2012)

*الدرس التاسع عشر في العناصر الرسومية (Solid)*

*[FONT=&quot]المضلع المليء [/FONT]**Solid polygon*​ · [FONT=&quot]الصيغة العامة لإضافة مضلع مليء [/FONT]Solid polygon[FONT=&quot] تكون على الشكل التالي :[/FONT]​

```
RetVal = object.AddSolid(Point1, Point2, Point3, Point4)
```
 
[FONT=&quot]حيث :[/FONT]

*Object*[FONT=&quot] : وهو إما أن يكون [/FONT]ModelSpace [FONT=&quot]أو [/FONT]PaperSpace [FONT=&quot] أو [/FONT]Block[FONT=&quot] .[/FONT]

*Point1**[FONT=&quot] و [/FONT]**Point2**[FONT=&quot] و [/FONT]**Point3**[FONT=&quot] و [/FONT]**Point4**[FONT=&quot] [/FONT]*[FONT=&quot]: متحولات نخزن بها إحداثيات النقاط التي تمثل رؤوس المضلع .[/FONT]

*RetVal*[FONT=&quot] : متحول يتم تعريفه على أنه [/FONT]Solid[FONT=&quot] في أوتوكاد .[/FONT]

· [FONT=&quot]النقطتان 1 و 2 تحددان الضلع الأول والنقطتان 3 و 4 تحددان الضلع الثاني ثم يتم الوصل برسم استقامة من النقطة 1 إلى النقطة 3 بشكل قطري ثم الوصل برسم استقامة من النقطة 2 إلى النقطة 4 بشكل قطري . وفي حال كانت النقطة الرابعة بنفس إحداثيات النقطة الثالثة فعندها يتم رسم مثلث مليء .[/FONT]

· [FONT=&quot]يمكن التحكم بكون المضلع مليء أم لا من خلال متغير النظام في بيئة أوتوكاد [/FONT]FILLMODE[FONT=&quot] ويمكن اختبار قيمة هذا المتحول من خلال وظيفة [/FONT]*GetVariable*[FONT=&quot] كما يمكن تعديل قيمة هذا المتغير باستخدام الوظيفة [/FONT]*SetVariable*[FONT=&quot] . [/FONT]

· [FONT=&quot]يمتلك العنصر السابق مجموعة من الخصائص من أهمها خاصية [/FONT]Coordinate [FONT=&quot]التي تعيد إحداثيات نقطة معينة من نقاط المضلع وخاصية [/FONT]Coordinates[FONT=&quot] التي تعيد جميع إحداثيات نقاط المضلع على شكل مصفوفة من النقاط .[/FONT]

[FONT=&quot]ولفهم الخصائص السابقة للعنصر [/FONT]Solid[FONT=&quot] سنقوم بشرح مثال عملي .[/FONT]

*[FONT=&quot]تطبيق عملي :[/FONT]*

[FONT=&quot]1 - الآن قم بفتح مشروع [/FONT]VBcad[FONT=&quot] وأضف إلى الإطار [/FONT]Form1[FONT=&quot] زر أمر [/FONT]command[FONT=&quot] واجعل خاصية [/FONT]Name[FONT=&quot] له تساوي [/FONT] AddSolid[FONT=&quot]واجعل خاصية [/FONT]Caption[FONT=&quot] تساوي [/FONT]AddSolid[FONT=&quot][/FONT]

[FONT=&quot]2 - في حدث النقر على الزر [/FONT]AddSolid[FONT=&quot] في الإطار [/FONT]Form1[FONT=&quot] نكتب الكود التالي :[/FONT]​

```
Private Sub AddSolid_Click()
      '-------------------
      '1) Open AutoCAD
      On Error Resume Next
          Set Acadapp = GetObject(, "AutoCAD.Application.17")
          Acadapp.Documents.Add
          Acadapp.Visible = True
          Acadapp.WindowState = acMax
      If Err.Number <> 0 Then
          Set Acadapp = CreateObject("AutoCAD.Application.17")
          Acadapp.Documents.Add
          Acadapp.Visible = True
          Acadapp.WindowState = acMax
          Err.Clear
      End If
      Me.Show
      '---------------------
      '2) Define the solid Object
      Dim SolidObj As AcadSolid
      Dim point1(0 To 2) As Double
      Dim point2(0 To 2) As Double
      Dim point3(0 To 2) As Double
      Dim point4(0 To 2) As Double
      point1(0) = 0: point1(1) = 1: point1(2) = 0
      point2(0) = 5: point2(1) = 1: point2(2) = 0
      point3(0) = 8: point3(1) = 8: point3(2) = 0
      point4(0) = 4: point4(1) = 6: point4(2) = 0
  [LEFT]    Set SolidObj = Acadapp.ActiveDocument.ModelSpace.AddSolid(point1, point2, point3, point4)[/LEFT]
      Acadapp.ZoomExtents
      MsgBox "you have Create a solid object"
      '---------------------
      '3) change the coordinates of the solid
      Dim NewCoordinates(0 To 11) As Double
      NewCoordinates(0) = 0: NewCoordinates(1) = 1: NewCoordinates(2) = 0
      NewCoordinates(3) = 10: NewCoordinates(4) = 1: NewCoordinates(5) = 0
      NewCoordinates(6) = 8: NewCoordinates(7) = 8: NewCoordinates(8) = 0
      NewCoordinates(9) = 4: NewCoordinates(10) = 6: NewCoordinates(11) = 0
      SolidObj.Coordinates = NewCoordinates
      SolidObj.Update
      MsgBox "you have change the coordinates of the solid object"
      '---------------------
      '4) Find the coordinate in the first index position
      Dim Coord As Variant
      Coord = SolidObj.Coordinate(0)
      MsgBox "The coordinate in the first index of the solid object is : " & vbCrLf & _
                   "X = " & Coord(0) & vbCrLf & _
                   "Y = " & Coord(1) & vbCrLf & _
                   "Z = " & Coord(2)
      '---------------------
      '5) Change the coordinate in the first index position
      Coord(0) = 3: Coord(1) = 2: Coord(2) = 0
      SolidObj.Coordinate(0) = Coord
      SolidObj.Update
      MsgBox "The New coordinate in the first index is Now : " & vbCrLf & _
                   "X = " & Coord(0) & vbCrLf & _
                   "Y = " & Coord(1) & vbCrLf & _
                   "Z = " & Coord(2)
      '---------------------
      '6) find the current setting of the system variable FILLMODE
      Dim VarData As Variant
      VarData = Acadapp.ActiveDocument.GetVariable("FILLMODE")
      MsgBox "The Valeu Of FILLMODE = " & VarData
      '---------------------
      '7) Change the current setting of the system variable FILLMODE
      Acadapp.ActiveDocument.SetVariable "FILLMODE", 0
      SolidObj.Update
      MsgBox "you have Change The Valeu Of FILLMODE to 0 "
  End Sub
```
 
*[FONT=&quot]الشرح :[/FONT]*

[FONT=&quot]1- في القسم الأول من الكود : تم تشغيل برنامج الأوتوكاد وتعريف العنصر [/FONT]Acadapp[FONT=&quot] على أنه كائن أوتوكاد .[/FONT]

[FONT=&quot]2- في القسم الثاني من الكود : تم تعريف العنصر [/FONT]SolidObj[FONT=&quot] على أنه مضلع مليء [/FONT]Solid[FONT=&quot] وتم إعطاء قيم لإحداثيات نقاط رؤوس المضلع وتخزينها في المتحولات [/FONT]Point1[FONT=&quot] و [/FONT]Point2[FONT=&quot] و [/FONT]Point3[FONT=&quot] و [/FONT]Point4[FONT=&quot] وتم استخدام الوظيفة [/FONT]AddSolid[FONT=&quot] لإضافة العنصر السابق إلى حيز النموذج [/FONT]ModelSpace[FONT=&quot] في اللوحة الحالية [/FONT]ActiveDocument[FONT=&quot] .[/FONT]

[FONT=&quot]3- في القسم الثالث من الكود : تم تعريف متحول [/FONT]NewCoordinates[FONT=&quot] على أنه مصفوفة أبعادها تساوي 12 ( 4 نقاط × 3 أبعاد للنقطة ) وتم تخزين قيم جديدة ضمن هذه المصفوفة ومن ثم جعلنا المضلع يعتمد الإحداثيات الجديدة في هذه المصفوفة مباشرة من خلال خاصية [/FONT]Coordinates[FONT=&quot] كما في السطر :[/FONT]​

```
SolidObj.Coordinates = NewCoordinates
```
 
[FONT=&quot]ولاحظ بعد ذلك استخدام وظيفة [/FONT]Update[FONT=&quot] لإظهار التغييرات الحاصلة على المضلع في شاشة الرسم .[/FONT]

[FONT=&quot]4- في القسم الرابع من الكود : تم تعريف متحول [/FONT]Coord[FONT=&quot] بحيث يكون من النوع [/FONT]Variant[FONT=&quot] ومن ثم تم إسناد إحداثيات النقطة رقم [/FONT](0)[FONT=&quot] للمضلع إلى المتحول السابق باستخدام الخاصية [/FONT]Coordinate[FONT=&quot] وهذه الخاصية تختلف عن السابقة بأنها تعيد إحداثيات نقطة محددة كما في السطر :[/FONT]​

```
Coord = SolidObj.Coordinate(0)
```
[FONT=&quot] [/FONT]

[FONT=&quot]ومن ثم تم عرض قيم المتحول [/FONT]Coord[FONT=&quot] الذي يحمل إحداثيات النقطة رقم [/FONT](0)[FONT=&quot] ضمن رسالة نصية [/FONT]_MsgBox_ [FONT=&quot] [/FONT]

[FONT=&quot]5- في القسم الخامس من الكود : تم إعطاء قيم جديدة للمتحول [/FONT]Coord[FONT=&quot] ومن ثم تم إسناد هذه القيم إلى النقطة رقم [/FONT](0)[FONT=&quot] من المضلع كما في السطر :[/FONT]​

```
SolidObj.Coordinate(0) = Coord
```
 
[FONT=&quot]ولاحظ بعد ذلك استخدام وظيفة [/FONT]Update[FONT=&quot] لإظهار التغييرات الحاصلة على المضلع في شاشة الرسم . [/FONT]

[FONT=&quot]6- في القسم السادس من الكود : تم استخدام الوظيفة [/FONT]*GetVariable*[FONT=&quot] لمعرفة قيمة متغير النظام [/FONT]FILLMODE[FONT=&quot] وتخزين القيمة السابقة في متحول كما في السطر :[/FONT]​

```
VarData = Acadapp.ActiveDocument.GetVariable("FILLMODE")
```
 
[FONT=&quot]وهنا نلاحظ أن قيمة [/FONT]FILLMODE[FONT=&quot] تساوي [/FONT](1)[FONT=&quot] بمعنى أن المضلع سيظهر مليئاً .[/FONT]

[FONT=&quot]7- في القسم السابع من الكود : تم استخدام الوظيفة [/FONT]*SetVariable*[FONT=&quot] لتعديل قيمة متغير النظام [/FONT]FILLMODE[FONT=&quot] وجعلها تساوي [/FONT](0)[FONT=&quot] كما في السطر :[/FONT]​

```
Acadapp.ActiveDocument.SetVariable "FILLMODE", 0
```
 
[FONT=&quot]وهنا فإن المضلع السابق سيظهر غير مليء ولكن لا بد من استخدام وظيفة [/FONT]Update[FONT=&quot] لإظهار التغييرات الحاصلة على المضلع في شاشة الرسم .[/FONT]

[FONT=&quot][/FONT]​[FONT=&quot]وإليكم ملف الدرس بصيغة PDF على الرابط :[/FONT]
http://www.4shared.com/office/vSS49OX-/___online.html
[FONT=&quot][/FONT]
[FONT=&quot]وكذلك مشروع المثال VBcad حتى هذه المرحلة على الرابط :[/FONT]
http://www.4shared.com/rar/gmgOtDDe/VBCad_19.html
[FONT=&quot][/FONT]
[FONT=&quot]وكذلك تجد الملفات هنا :[/FONT]
تحميل الملفات
​[FONT=&quot]
[/FONT]​


----------



## Hossam-am (7 فبراير 2012)

*الدرس العشرون في العناصر الرسومية (العنصر 3Dpolyline)*

*[FONT=&quot]مجمع الخطوط الفراغي [/FONT]**3Dpolyline*​ · [FONT=&quot]الصيغة العامة لإضافة مجمع خطوط فراغي [/FONT]3Dpolyline[FONT=&quot] على الشكل التالي :[/FONT]​

```
RetVal = object.Add3Dpoly(PointsArray)
```
 
[FONT=&quot]حيث :[/FONT]

*Object*[FONT=&quot] : وهو إما أن يكون [/FONT]ModelSpace [FONT=&quot]أو [/FONT]PaperSpace [FONT=&quot] أو [/FONT]Block[FONT=&quot] .[/FONT]

*PointsArray*[FONT=&quot] : مصفوفة من الإحداثيات [/FONT]x,y,z[FONT=&quot] تعبّر عن إحداثيات نقاط مجمع الخطوط .[/FONT]

*RetVal*[FONT=&quot] : متحول يتم تعريفه على أنه مجمع خطوط فراغي [/FONT]3Dpolyline[FONT=&quot] في أوتوكاد .[/FONT]

· [FONT=&quot]يمتلك العنصر السابق الخاصية [/FONT]*Closed*[FONT=&quot] التي تأخذ إحدى القيمتين [/FONT]True[FONT=&quot] أو [/FONT]False[FONT=&quot] للتحكم في كون مجمع الخطوط [/FONT]3Dpolyline[FONT=&quot] مغلقاُ أو مفتوحاُ . والشكل التالي يبين تأثير هذه الخاصية :[/FONT]​





· [FONT=&quot]كما يمتلك العنصر السابق خاصية [/FONT]*Coordinate* [FONT=&quot]التي تعيد إحداثيات نقطة معينة من نقاط مجمع الخطوط وخاصية [/FONT]*Coordinates*[FONT=&quot] التي تعيد جميع إحداثيات نقاط مجمع الخطوط الفراغي على شكل مصفوفة من النقاط . بالإضافة إلى الخاصية [/FONT]*Length*[FONT=&quot] التي تعيد طول مجمع الخطوط .[/FONT]

· [FONT=&quot]ويمكن من خلال الوظيفة [/FONT]*AppendVertex*[FONT=&quot] إضافة نقطة جديدة (رأس) إلى نهاية مجمع الخطوط الفراغي [/FONT]3Dpolyline[FONT=&quot] حيث الصيغة العامة لهذه الوظيفة على الشكل :[/FONT]​

```
3DplineObj.AppendVertex Point
```
 
[FONT=&quot]حيث :[/FONT]

*Point*[FONT=&quot] : متحول نخزن به إحداثيات النقطة المراد إضافتها لمجمع الخطوط .[/FONT]

· [FONT=&quot]كما يمكن من خلال الوظيفة [/FONT]*Explode*[FONT=&quot] تفجير مجمع الخطوط إلى العناصر الأساسية التي يتكون منها .[/FONT]



[FONT=&quot]ولفهم الخصائص والوظائف السابقة لمجمع الخطوط [/FONT]3Dpolyline[FONT=&quot] سنقوم بشرح مثال عملي .[/FONT]



*[FONT=&quot]تطبيق عملي :[/FONT]*

[FONT=&quot]1 - الآن قم بفتح مشروع [/FONT]VBcad[FONT=&quot] وأضف إلى الإطار [/FONT]Form1[FONT=&quot] زر أمر [/FONT]command[FONT=&quot] واجعل خاصية [/FONT]Name[FONT=&quot] له تساوي [/FONT] Add3Dpoly[FONT=&quot]واجعل خاصية [/FONT]Caption[FONT=&quot] تساوي [/FONT]Add3Dpoly

[FONT=&quot]2 - في حدث النقر على الزر [/FONT]Add3Dpoly[FONT=&quot] في الإطار [/FONT]Form1[FONT=&quot] نكتب الكود التالي :[/FONT]​

```
Private Sub Add3Dpoly_Click()
      '-------------------
      '1) Open AutoCAD
      On Error Resume Next
          Set Acadapp = GetObject(, "AutoCAD.Application.17")
          Acadapp.Documents.Add
          Acadapp.Visible = True
          Acadapp.WindowState = acMax
      If Err.Number <> 0 Then
          Set Acadapp = CreateObject("AutoCAD.Application.17")
          Acadapp.Documents.Add
          Acadapp.Visible = True
          Acadapp.WindowState = acMax
          Err.Clear
      End If
      Me.Show
      '---------------------
      '2) Create a 3DPolyline object
      Dim PolyObj As Acad3DPolyline
      Dim Points(0 To 20) As Double
      Points(0) = 5: Points(1) = 5: Points(2) = 0
      Points(3) = 10: Points(4) = 5: Points(5) = 2
      Points(6) = 10: Points(7) = 10: Points(8) = 4
      Points(9) = 0: Points(10) = 10: Points(11) = 6
      Points(12) = 0: Points(13) = 0: Points(14) = 8
      Points(15) = 15: Points(16) = 0: Points(17) = 10
      Points(18) = 15: Points(19) = 15: Points(20) = 12
      Set PolyObj = Acadapp.ActiveDocument.ModelSpace.Add3Dpoly(Points)
      Acadapp.ZoomExtents
      Acadapp.ZoomScaled 0.75, acZoomScaledRelative
      MsgBox "you have Create a 3DPolyline object"
      '---------------------
      '3) Length of 3DPolyline object
      Dim LenPoly As Double
      LenPoly = PolyObj.Length
      MsgBox "The Length Of 3DPolyline = " & LenPoly
      '---------------------
      '4) Add new vertex To 3DPolyline object
      Dim NewVertex(0 To 2) As Double
      NewVertex(0) = 0: NewVertex(1) = 15: NewVertex(2) = 14
      PolyObj.AppendVertex NewVertex
      PolyObj.Update
      MsgBox "you have add new Vertex to 3DPolyline = (0,15,14) "
      '---------------------
      '5) Close the 3DPolyline object
      PolyObj.Closed = True
      PolyObj.Update
      MsgBox "you have Closed the 3DPolyline object"
  End Sub
```
 
*[FONT=&quot]الشرح :[/FONT]*

[FONT=&quot]1- في القسم الأول من الكود : تم تشغيل برنامج الأوتوكاد وتعريف العنصر [/FONT]Acadapp[FONT=&quot] على أنه كائن أوتوكاد .[/FONT]

[FONT=&quot]2- في القسم الثاني من الكود : تم تعريف العنصر [/FONT]PolyObj[FONT=&quot] على أنه مجمع خطوط فراغي [/FONT]3DPolyline[FONT=&quot] وتم إعطاء قيم لإحداثيات نقاط رؤوس مجمع الخطوط وتخزينها في المتحول [/FONT]Points[FONT=&quot] وتم استخدام الوظيفة [/FONT]Add3Dpoly[FONT=&quot] لإضافة العنصر السابق إلى حيز النموذج [/FONT]ModelSpace[FONT=&quot] في اللوحة الحالية [/FONT]ActiveDocument[FONT=&quot] .[/FONT]

[FONT=&quot]3- في القسم الثالث من الكود : تم استخدام الخاصية [/FONT]*Length*[FONT=&quot] لمعرفة طول مجمع الخطوط وتم عرض الطول السابق ضمن رسالة نصية .[/FONT]

[FONT=&quot]4- في القسم الرابع من الكود : تم استخدام الوظيفة [/FONT]*AppendVertex*[FONT=&quot]لإضافة نقطة جديدة إلى نهاية مجمع الخطوط السابق إحداثياتها (0,15,14) .[/FONT]

[FONT=&quot]5- في القسم الخامس من الكود : تم استخدام الخاصية [/FONT]*Closed*[FONT=&quot]لإغلاق مجمع الخطوط السابق حيث تم إسناد القيمة [/FONT]True[FONT=&quot] للخاصية السابقة .[/FONT]

[FONT=&quot] انتهى الدرس[/FONT]


[FONT=&quot]
[/FONT]​[FONT=&quot] وإليكم ملف الدرس العشرون بصيغة PDF على الرابط :[/FONT]
http://www.4shared.com/office/BRAoqlMJ/__online.html

[FONT=&quot]وكذلك ملف المثال Vbcad_20 حتى هذه المرحلة على الرابط:[/FONT]
http://www.4shared.com/rar/hl-BwGj1/VBcad_20.html

[FONT=&quot]ويمكن تحميل الملفات من هنا :[/FONT]
تحميل الملفات​[FONT=&quot]
[/FONT]
​


----------



## أبوتقي (7 فبراير 2012)

مجهود رائع يستحق الشكر والتقدير


----------



## عبدالباقى الامين (8 فبراير 2012)

جزاك الله كل خير واحسان


----------



## sandm (11 فبراير 2012)

*مجهود رائع يستحق الشكر والتقدير*

*وجزاك الله خير *
*وجعل هذا العمل في موازين حسناتك*​


----------



## البروفسيير محمود (11 فبراير 2012)

_*جزاكم الله خيرا*_​


----------



## م رشدي حموده (11 فبراير 2012)

ماشاء الله ،،، الله يزيدك من علمه


----------



## فواز العنسي (12 فبراير 2012)

جزاك الله خير موضوع مميز من مهندس مميز 
إستمر نحن معك حتى عمل مشروع متكامل 
سؤالي كيف نتحكم في معلومات عند ادخالها واخراجها الي البرنامج عبر ملفات خارجيه


----------



## eng judy (14 فبراير 2012)

*مشكور جدا على هذا المجهود الرائع
*​


----------



## سميرة عبد الله (17 فبراير 2012)

نسأل الله السلامة للمهندس حسام و كل اهل حمص فهو من هذه المدينة المنكوبة 
نسالكم الدعاء في هذا اليوم الفضيل لكل اهلنا في سوريا الجريحة 
حسبنا الله و نعم الوكيل


----------



## QLQL (18 فبراير 2012)

جزاك الله خيرا


----------



## eng naglaa99 (22 فبراير 2012)

ارجو المساعده ضروري لو سمحتم لقد قمت بتصطيب برنامج اوتوكاد 2007 ومن الواضح اننى صطبطه خطا لانه لم يعمل عندى وعندما اردت مسحه من الجهاز تظهر رساله باننى لابد ان اكون ادمسترتور ومش عارفه اعمل ايه


----------



## eng naglaa99 (22 فبراير 2012)

ارجو المساعده ضروري لو سمحتم لقد قمت بتصطيب برنامج اوتوكاد 2007 ومن الواضح اننى صطبطه خطا لانه لم يعمل عندى وعندما اردت مسحه من الجهاز تظهر رساله باننى لابد ان اكون ادمسترتور ومش عارفه اعمل ايه حيث نسختى وندز 7


----------



## مازن عبد الهادي (27 فبراير 2012)

مشكور يا باش مهندس


----------



## محمود علام (1 مارس 2012)

شكرا و جزاك الله خيرا


----------



## حسين عبد المنعم (2 مارس 2012)

الأخ الفاضل المهندس حسام - نريد أن نطمئن عليك


----------



## رائد الزمر (7 مارس 2012)

مشكور
بارك الله فيك


----------



## م/ رمزى محمد (9 مارس 2012)

جزاك الله خيرا على هذه الكنوز المعلوماتية الثرة التى تجود لنا بها


----------



## Hossam-am (12 مارس 2012)

السلام عليكم
أعتذر إخواني الكرام عن طول الغياب 
نظراً لعدم قدرتي على الاتصال
أدعو لسوريا الحبيبة الأبية بالخير والعطاء والسلام
غداً نكمل الدروس بإذن الله
دمتم بخير

​


----------



## المهندس ابوعمر (13 مارس 2012)

Hossam-am قال:


> السلام عليكم
> أعتذر إخواني الكرام عن طول الغياب
> نظراً لعدم قدرتي على الاتصال
> أدعو لسوريا الحبيبة الأبية بالخير والعطاء والسلام
> ...



الحمد لله يا اخي الكريم انك بخير لقد قلقنا عليك كثيرا 

نسال الله العظيم رب العرش العظيم ان ينصر اهل سوريا ويدمر عدوهم اللهم امين


----------



## kaouha (13 مارس 2012)

merciiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii


----------



## sror12 (20 مارس 2012)

*خير الناس من نفع الناس*


----------



## Hossam-am (23 مارس 2012)

*الدرس الحادي والعشرون في العناصر الرسومية (PolyfaceMesh)*

السلام عليكم ورحمة الله 
لقد حاولت وضع المشاركة الجديدة ولكن :
1- الصور لا تظهر وإنما تظهر روابطها فقط
2- بالرغم من جميع المحاولات فإن الكود يظهر من اليمين إلى اليسار
الرجاء من يعرف حل المشكلة أن يخبرني

لذلك فإن الدرس الجديد يتحدث عن السطوح ثلاثية الابعاد 
وأول العناصر في هذا البحث هو العنصر
*PolyfaceMesh*

وهو متعدد سطوح فراغي حيث كل سطح من هذه السطوح يتحدد بأربعة نقاط
ولإنشاء متعدد السطوح السابق
نحدد الإحداثيات لمجموعة من النقاط تمثل رؤوس متعدد السطوح ثم نحدد
أرقام النقاط التي تحدد كل سطح من هذه السطوح ويجب أن لا تقل عن 
أربعة نقاط 

وإليكم ملف الدرس الحادي والعشرون في العناصر الرسومية بصيغة PDF على الرابط :
http://www.4shared.com/office/EzTHaRlD/file.html

وكذلك ملف المثال VBcad_21 على الرابط:
http://www.4shared.com/rar/eTLJFj8e/file.html

وأيضاً تجدون الملفات هنا :
الملفات هنا

دمتم بخير


​


----------



## alawadhi1987 (31 مارس 2012)

الموضوع ممتاز


----------



## Hossam-am (15 أبريل 2012)

*الدرس 22 في العناصر الرسومية (العنصر PolygonMesh)*

*الدرس الثاني والعشرون في العناصر الرسومية يتحدث 
عن شبكة الأسطح الفراغية التي يعبر عنها العنصر
PolygonMesh
حيث يفيد العنصر الرسومي السابق في تمثيل السطوح المختلفة مثل سطح الأرض الطبيعية وسطوح الحفر والردم في حفريات المباني والطرق وغيرها من الإنشاءات والتي تمكّن المستخدم من حساب الكميات اللازمة للحفر والردم بشكل دقيق . ويتم ذلك عادة من خلال أخذ مجموعة من النقاط في أماكن متفرقة من السطح المراد تمثيله ومن ثم إنشاء شبكة من الأسطح الجزئية بين هذه النقاط بشكل يمثل السطح السابق وهو ما يوفره العنصر السابق .

وإليكم الدرس 22 في العناصر الرسومية ( العنصر PolygonMesh ) بصيغة PDF على الرابط :
*
*http://www.4shared.com/office/GLR8x1Tb/22_online.html
**
وكذلك مشروع المثال حتى هذه المرحلة VBcad_22 على الرابط :*
*http://www.4shared.com/rar/IAE1vxkH/VBCad_22.html

ويمكنك أيضاً إيجاد الملفات السابقة هنا :
الدرس 22

دمتم بخير
*​


----------



## yso (4 مايو 2012)

شكراااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااا


----------



## الجزارررررر (6 مايو 2012)

حررت بواسطة مشرف القسم
جزاكم الله خيرا يابشمهندس حسام، نسال المولي ان يجعل هذا الموضوع في ميزان حسناتك.​


----------



## Hossam-am (6 مايو 2012)

حررت بواسطة مشرف القسم


----------



## sunofnile (13 مايو 2012)

السلام عليكم ورحمة الله وبركاته

حررت بواسطة مشرف القسم


----------



## المهندس ابوعمر (13 مايو 2012)

اعتقد ان المنتدي العام هو المجال لهذا الحديث وليس هنا 

لذا نحن نشكر المهندس حسام علي شرحه وقد استفدنا بالفعل منه كثيرا فجزاه الله خيرا 

حررت بواسطة مشرف القسم


----------



## خالد الأزهري (19 مايو 2012)

تم تحرير المشاركات بواسطتي ....
ليس ميلا الى راي دون اخر لكن ثبت ان نوعية المناقشات هذه وبهذا الاسلوب لن تقدم وبل قد تؤخر ومكانها -كما ذكر اخي ابو عمر- القسم العام ...
ندعوا لسوريا بالخير الدائم وان يجنبها وكل بلاد المسلمين الشرور


----------



## Hossam-am (22 مايو 2012)

*الدرس 23 في العناصر الرسومية (العنصر 3DFace)*

*الدرس الثالث و العشرين في العناصر الرسومية يتحدث عن
العنصر الرسومي
3DFace
وهو عبارة عن سطح ثلاثي الأبعاد يتحدد بأربعة نقاط بحيث يمكن إعطاء كل نقطة من هذه النقاط منسوب مختلف

وإليكم الدرس 23 في العناصر الرسومية ( العنصر 3DFace) بصيغة PDF على الرابط :
http://www.4shared.com/office/i1m-hcAm/23_2.html

وكذلك مشروع المثال حتى هذه المرحلة VBcad_23 على الرابط :
http://www.4shared.com/rar/t3r_kukT/VBCad_23.html

دمتم بخير
م.حسام
*​


----------



## sunofnile (23 مايو 2012)

شكرا للمهندس حسام على ما يقدمه من علم نافع جعله الله فى ميزان حسناتك


----------



## م.وليدحسن (23 مايو 2012)

جزاك الله كل خير


----------



## م.وليدحسن (23 مايو 2012)

الله ينور


----------



## م.وليدحسن (23 مايو 2012)

ما يلفظ من قول الا لدية رقيب عتيد


----------



## م.وليدحسن (23 مايو 2012)

انا عضو جديد


----------



## م.وليدحسن (23 مايو 2012)

اللهم ولي من يصلح


----------



## kjelban (11 يونيو 2012)

موضوع قيم و شرح ممتاز


----------



## م.محمد عبد المجيد (22 يونيو 2012)

موضوع ممتاز جزاك الله خيرا


----------



## eng_elsayed1 (29 يونيو 2012)

بارك الله فيك


----------



## اكبر رايق (9 يوليو 2012)

بارك الله فيك


----------



## عاشق الخرسانه (10 يوليو 2012)

شكرا جزيلا وجزاك الله خير


----------



## ابو مصطفى شامي (26 يوليو 2012)

السلام عليكم أفدنا يرحمك الله


----------



## ابو مصطفى شامي (26 يوليو 2012)

أكرر أنا أعشق ألأوتوكاد وأتمنى معرفة أية معلومه أضافيه


----------



## mhammad949 (30 يوليو 2012)

سلام أستاذنا لما جربت الدرس الأول ظهرت هذه الرسالة شو المشكلة


----------



## Hossam-am (8 أغسطس 2012)

*أخي أرفق لي المثال لأعدللك عليه
م.حسام
*


----------



## eng md (25 أغسطس 2012)

جزاك الله خيرا علي الشرح الرائع ....بس لو تعمله فيديو يبقي احسن وافضل والف شكر علي المجهود الرائع ده


----------



## Basem Rajjoub (3 سبتمبر 2012)

شكرا جزيلا أخي الكريم....ويشار بالذكر وجود كتاب ربط الأوتوكاد بالفيجوال بيسك 6 ...للمهندسة سميرة العبد الله..بإمكانكم إيجاده بالغوغل..


----------



## sammillinum (7 أكتوبر 2012)

جزاكم الله خيرا


----------



## المهندس المبتكر ال (9 أكتوبر 2012)

ماشاء الله جميل بس لو فى فيدجيوهات اكيد كانت هتبقى فعاله اكتر من الكتابه فقط وجزاك الله كل خر


----------



## المهندس المبتكر ال (9 أكتوبر 2012)

بارك الله فيكم ورفع قدركم وزداكم علما وقدرا وخلقا ورفعه


----------



## سلام النداوي (13 أكتوبر 2012)

شكرا جزيلا استاذ على هذا الموضوع الرائع 
بس استاذ اذا اكو طريقة لاستدعاء خلايا من برنامج الاكسل الى الفيجول بيسك والتعامل معها على شكل مصفوفات؟


----------



## المهندس مهران (13 أكتوبر 2012)

موضوع ممتاز بارك الله فيك


----------



## ياسر سالمان (23 أكتوبر 2012)

لا اجد كلمات شكر ... كى اشكرك بها ,,,, ولكن دعوة بظهر الغيب لعلها تكون ساعة اجابه ...


----------



## anass81 (24 أكتوبر 2012)

السلام عليكم

سوف يتم فك التثبيت عن الموضوع مع الشكر والدعاء لصاحبه


----------



## ياسر سالمان (16 نوفمبر 2012)

الاخ العزيز عند تجربة الدرس الاول ظهرت هذه المشكلة ... افيدونا افادكم الله ... ورفع الله قدركم ومعرفتكم ...


----------



## abuyossef (25 ديسمبر 2012)

الاخ الفاضل المهندس حسام ..... جزاك الله عنا خير الجزاء ... ورفع عن بلدنا الحبيب سوريا ما تلاقيه وكف يد الظلم والعدوان عنها ... وأمًن أهلها وحفظ رجالها ونسائها ...... وعجل الله بفرجها .... اللهم آمين
ثم أني بعد إذنك قد جمعت كل الدروس في ملف pdf واحد ليسهل على أخواننا الإستفادة منه.


----------



## اسلام الكبابى (18 سبتمبر 2013)

*ممتاااااااااااااااااااااااااااز
بارك الله فيك *


> أرسم في أتوكاد ما تشاء...وخذ منه ما تشاء ...وصدر البيانات التي تريدها ...وأرسل له التعليمات الني تريدها..
> اصنع برنامجك ...الذي يحسب لك الأطوال ..المساحات...الحجوم...
> إصنع برنامجك...الذي يولد لك ما شئت من العناصر الرسومية...من الخطوط والأقواس ومجمعات الخطوط والشرائح ...والكتل والسمات والتهشير والنصوص ...والأبعاد...وكل ما ترغب


*أستاذنا الكبير
السلام عليكم ورحمة الله وبركاته
 أريد كودآ **بلغة البرمجة vb6 **يتصل ب**الأتوكاد **بحيث يتم عمل الآتى
1-يسألنى عن عدد المحاور الأفقية والموقع الرأسى لكل منها فأدخلها له
2-يسألنى عن عدد المحاور الرأسية والموقع الأفقى لكل منها فأدخلها له
3**-يرسم جميع المحاور فى الأماكن التى حددتها له*
*4-يطلب منى ادخال الأعمدة فأشير فى صفحة الأتوكاد الى كل نقطة تقاطع يوجد عندها عمود فأجده يرسم لى مستطيلآ مهشرآ عند تلك النقطة 
**5-يطلب منى ادخال الكمرات فأشير فى صفحة الأتوكاد** الى نقطتى بداية ونهاية كل كمرة فأجده يرسم لى مستطيلآ بشكل الكمرة بين هتين النقطتين 
 ولكم ألف شكر  *​


----------



## اسلام الكبابى (22 سبتمبر 2013)

*أستا**ذنا الكبير**

هذا البرنامج المرفق هو آخر ما استطعت عمله من خلال شرحك القيم لربط الأوتوكاد بالفيجوال بيسك6
ولكن :-
1- مجموعة الجمل الموجودة لرسم أعمدة عند نقط تقاطعات المحاور لايصح أن تكون داخل كود الضغط على الزر Command7 أوغيره فى فورم الVB 
انما يجب أن يكون داخل حدث الضغط على نقط تقاطعات المحاور فى شاشة الأوتوكاد 
بحيث اذا سألت المستخدم عن أماكن الأعمدة فضغط على احدى هذه النقط يتم رسم عمود عند هذه النقطة
2- من المطلوب أيضآ سؤال المستخدم عن أماكن الكمرات فيضغط على نقطتين من هذه النقط (بداية ونهاية الكمرة) فيتم رسم كمرة بينهما
*
*أرجو مساعدتى فى ذلك 
ولكم ألف شكر*


----------



## سميرة عبد الله (22 سبتمبر 2013)

هل هذا هو المقصود؟


----------



## اسلام الكبابى (22 سبتمبر 2013)

*ليس هذا هو المطلوب
المطلوب تعديل البرنامج المرفق
أو على الأقل كتابة كود الفيجوال بيزك المطلوب سابقآ*


> *ولكن :-
> 1- مجموعة الجمل الموجودة لرسم أعمدة عند نقط تقاطعات المحاور لايصح أن تكون داخل كود الضغط على الزر Command7 أوغيره فى فورم الVB
> انما يجب أن يكون داخل حدث الضغط على نقط تقاطعات المحاور فى شاشة الأوتوكاد
> بحيث اذا سألت المستخدم عن أماكن الأعمدة فضغط على احدى هذه النقط يتم رسم عمود عند هذه النقطة
> ...


----------



## سميرة عبد الله (23 سبتمبر 2013)

*تعديل البرنامج*

رسم عمود في نقطة يختارها المستخدم
الكود :

```
On Error Resume Next
'هل التطبيق موجود مسبقا
Set Acadapp = GetObject(, "autocad.application")
If Err Then
   Err.Clear
   ' autocadانشاء تطبيق
  Set Acadapp = CreateObject("autocad.application")
  If Err Then
    MsgBox Err.Description
    Exit Sub
  End If
  End If
Acadapp.Visible = True
On Error GoTo gg
nn:
Dim returnPnt As Variant
   Acadapp.WindowState = acMin
    ' Return a point using a prompt
    returnPnt = Acadapp.ActiveDocument.Utility.GetPoint(, "Enter a point: ")
    
Dim x As Double
    x = Acadapp.ActiveDocument.Utility.GetDistance(, "Enter x: ")
Dim y As Double
    y = Acadapp.ActiveDocument.Utility.GetDistance(, "Enter y: ")
     Dim plineObj As AcadPolyline
    Dim points(0 To 11) As Double
    
    ' Define the 2D polyline points
    points(0) = returnPnt(0): points(1) = returnPnt(1): points(2) = 0
    points(3) = returnPnt(0) + x: points(4) = returnPnt(1): points(5) = 0
    points(6) = returnPnt(0) + x: points(7) = returnPnt(1) + y: points(8) = 0
    points(9) = returnPnt(0): points(10) = returnPnt(1) + y: points(11) = 0
        
    ' Create a lightweight Polyline object in model space
    Set plineObj = Acadapp.ActiveDocument.ModelSpace.AddPolyline(poin  ts)
plineObj.Closed = True
GoTo nn
'للخروج من التعليمة اضغط اي زر  من لوحة المفاتيح
gg:
```
الشرح


----------



## اسلام الكبابى (27 سبتمبر 2013)

*لم يقم هذا الكود **برسم عمود عند نقطة يختارها المستخدم من نقط تقاطعات المحاور *
*وانما **عند ضغط المستخدم على **عدة** نقط **يقوم برسم مستطيل مختلفآ أبعاده فى كل مرة عن الأخرى
*
ليتك تعدلى نفس المرفق الذى أرسلته وترسلينه كاملآ بعد التعديل
وشكرآ


----------



## سميرة عبد الله (27 سبتمبر 2013)

هل تقصد ان العمود ابعاده ثابتة ؟
البرنامج يطلب منك تحديد موضع العمود ممكن تختار نقطة التقاطع
الاتوكاد عندي 2010 غير الاصدار عندك من اجل ذلك كتبت الكود 
تنسخه و تضعه في الموضع الذي تريد


----------



## اسلام الكبابى (28 سبتمبر 2013)

> البرنامج يطلب منك تحديد موضع العمود ممكن تختار نقطة التقاطع


لست أنا الذى سأختار انما المستخدم هو الذى سيختار
*المفروض أن ي**رسم البرنامج عمود اذا ضغط المستخدم على نقطة من نقط تقاطعات المحاور *



> هل تقصد ان العمود ابعاده ثابتة ؟


نعم أقصد* ان العمود ابعاده ثابتة*(كما فى المرفق الذى أرسلته تمامآ)


----------



## سميرة عبد الله (28 سبتمبر 2013)

من اين سيأخذ البرنامج ابعاد العمود المطلوب رسمه؟


----------



## سميرة عبد الله (28 سبتمبر 2013)

البرنامج المعدل 
لكن يجب تعديل الربط مع نسخة الاتوكاد المنصبة عندك


----------



## اسلام الكبابى (11 أكتوبر 2013)

> الاتوكاد عندي 2010 غير الاصدار عندك من اجل ذلك كتبت الكود
> تنسخه و تضعه في الموضع الذي تريد


ليتك ترسلين لى نسخة من الاتوكاد عندك كى أحملها على جهازى
ولك ألف شكر
أرجو ارسال النسخة على ملف rar أوzip لتحميله على جهازى مباشرة
لأنى حاولت أكثر من يوم كامل مع الروابط الكثيرة الموجودة فى المنتدى فاذا بكل منها يدخلنى من منتدى الى منتدى ومن رابط الى رابط ولم أتمكن من تحميل شئ فى النهاية


----------



## Hossam-am (7 ديسمبر 2013)

قريباً نكمل إن شاء الله


----------



## adel safwat (7 ديسمبر 2013)

مهندس حسام هذا الموضوع لا يقدر بثمن أرجو اللا تبخل علينا بشروحات فيديو للتطبيق جعله الله في ميزان حسناتك


----------



## fazlok (8 ديسمبر 2013)

gaaaaaaaaaaaaaaaaaaaaaamed


----------



## r_iec (12 يونيو 2014)

Hossam-am قال:


> ^




:7::19:


----------



## r_iec (12 يونيو 2014)

الله ينور عليك ياهمدسة بس فين الصور التوضيحية علشان المبتداء اللى زى .. جعلها الله فى ميزان حسناتك
فية حجات كتير غمضة ياريت توضح بالصور


----------



## bassel84 (11 ديسمبر 2014)

مممتاز كتير للانطلاق ببرمجة من أوتوكاد


----------



## علي سعد علي (13 ديسمبر 2014)

ممتاز .. الله ينور عليك


----------



## sifr (26 فبراير 2015)

جزاك الله كل خير مهندس حسام .... الله يزيدك من فضله


----------



## عبدالسلام مصطفى عب (30 يوليو 2015)

السلام عليكم ورحمه الله وبركاته 
كيفكم اخواني الكرام 
أرجوا منكم الأهتمام والمساعده حيث أن الموضوع بالنسبه لب هام جدا ​


----------



## عبدالسلام مصطفى عب (25 أبريل 2016)

[FONT=arial, sans-serif]اين الخطأ فى هذا الكود
[/FONT]

If UCase(LayerObj.Name) = (Combo2.text) Then
LayerObj.LockOF = True
End If


----------



## عبدالسلام مصطفى عب (25 أبريل 2016)

اين الخطأ فى هذا الكود


If UCase(LayerObj.Name) = (Combo2.text) Then
LayerObj.LockOF = True
End If


----------



## سميرة عبد الله (27 أبريل 2016)

If UCase(LayerObj.Name) = UCase(Combo2.text) Then​LayerObj.LockOF = True
End If​
​


----------



## عبدالسلام مصطفى عب (29 أبريل 2016)

قبل كل شي انا شاكر اهتمام حضرتك
انا عندى لوحه قمت بعمل 55 Layer وانا اريد بعد تنفيذ اى امر غلق خصية Lock للحفاظ على اللوحه
ويوجد على اللوحه مجموعه من Block واريد البحث عن رقم Block وعمل Zoom على هذا الرقم من خلال البرنامج


----------



## سميرة عبد الله (2 مايو 2016)

*البحث عن بلوك*

ضع كومبو بوكس على الفورم و زر كوماند و اكتب فيه الكود التالي لتحميل اسماء البلوكات في كومبوبوكس

```
Dim acadapp As AcadApplicationDim anobg As Object
'On Error Resume Next
'هل التطبيق موجود مسبقا
Set acadapp = GetObject(, "autocad.application")
If Err Then
   Err.Clear
   ' autocadانشاء تطبيق
  Set acadapp = CreateObject("autocad.application")
  If Err Then
    MsgBox Err.Description
    Exit Sub
  End If
  End If
  Dim strString As String
   Dim objBlkRef As AcadBlockReference
Dim StrYesNo As String
For Each objBlkRef In acadapp.ActiveDocument.ModelSpace
        Combo1.AddItem objBlkRef.Name
            StrYesNo = objBlkRef.Name
    Next objBlkRef
    If Combo1.ListCount > 0 Then
    Combo1.Text = StrYesNo
    Command2.Enabled = True
    Else
    MsgBox " no any block"
    End If
```
و ضع زر اخر للبحث عن البلوك بعد اختياره كومبوبوكس و اكتب فيه الكود التالي 

```
Dim acadapp As AcadApplicationDim anobg As Object
On Error Resume Next
'هل التطبيق موجود مسبقا
Set acadapp = GetObject(, "autocad.application")
If Err Then
   Err.Clear
   ' autocadانشاء تطبيق
  Set acadapp = CreateObject("autocad.application")
  If Err Then
    MsgBox Err.Description
    Exit Sub
  End If
  End If
  Dim minExt, maxExt
  Dim objBlkRef As AcadBlockReference
Dim StrYesNo As String
For Each objBlkRef In acadapp.ActiveDocument.ModelSpace
 
'Set Blockname to search
If objBlkRef.Name = Combo1.Text Then
 
'If found then Zoom object
objBlkRef.GetBoundingBox minPt, maxPt
ZoomWindow minPt, maxPt
        End If
            
    Next
```
و هذا شرح فيديو للبرنامج


----------



## احمد مناحي (3 مايو 2016)

مشكور جدا اخي على هذا العمل المميز ربي يرحم والديك


----------



## عبدالسلام مصطفى عب (4 مايو 2016)

اعزك الله وانار خطاك بالعلم والايمان 
وجعلك الله مصدر من مصادر العلم 
ولكن يبدو انى لم اعبر عن ما اريد جيدا 
*المقصود يوجد بلوحة 30** default **مدخل 1 مدخل 2 الخ المدخل 30*
*انا اريد البحث عن هذه الارقام* 
*و1000 شكر لهتمام حضرتك
وهذا مثل يوضح *ما ابغى


----------



## سميرة عبد الله (5 مايو 2016)

*البرنامج*

هذا سورس كود البرنامج
شرح استخدام البرنامج


----------



## عبدالسلام مصطفى عب (7 مايو 2016)

السلام عليكم ورحمة الله وبركاته
أرهقت حضرتك باسئلتى
وكنت حضرتك كريم طويل البال
جزاك الله عني خيرا


----------



## كيانك (7 مايو 2016)

مشكور اخي علي المجهود الرائع وبالتوفيق


----------



## مصطفى عبدالسلام مص (11 مايو 2016)

*ما كل هذا الابداع*

ما كل هذا الابداع 
بسم الله ماشاء الله
انا عضو جديد في هذا المنتدى الذى اكل ما يقال عنه انه منتدى شديد الاحترام
اريد ان استنير بعلمكم
واسمحوا لي ان استفيد من خبرتكم فى الفيجوال بيسك وربطه بالاتوكاد
انا اريد عند الضغط على command 2 يختفى Form1 وتظهر لوحة الاوتوكاد
ثم عند اختيار احد ​*البلوكات يظهر فى combo1 اسم layer الخاص بهذا Block
وهذا مثال بسيط للتوضيح*


----------



## اسلام الكبابى (30 مايو 2019)

مشكور ألف شكر*
وأرجو منك أو من أى عضو رابط مباشر لتحميل نسخة أونوكاد تتمشى مع ويندوز xp
وياليتها نسخة أونوكاد معمارى
ولكم ألف شكر*


----------



## اسلام الكبابى (7 يونيو 2019)

*لم يرد على أحد حتى الآن*


----------



## اسلام الكبابى (15 يوليو 2019)

هناك برنامج اسمه AutoCAD Architecture لا يرسم فقط خطوط ودوائر وغير ذلك
ولكن يرسم محاور وأعمدة وحوائط وسلالم رسمآ مباشرآ
فهل يمكن ربط الفيجوال بيسك6 بهذا الرنامج ؟
وان كان ممكنآ فما كود رسم المحاور (مثلآ 4محاور أفقية و6 محاور رأسية)
وكود رسم عمود معين على نقطة تقاطع المحورين (5و2) مثلآ
ولك ألف شكر


----------



## اسلام الكبابى (17 يوليو 2019)

LayerObj.Color = acRed
LayerObj.Lineweight = 0.5
اشتغل معى هذا الكود تمام
ولكن لما حاولت تغيير السمك (لما غيرت الرقم 0.5 الى 1 أو 0.7 مثلآ) لعترض وأظهر رسالة خطأ
فكيف يمكن تغيير سماكة الخطوط التي سترسم على الطبقة
ولكم ألف شكر


----------

