ملحق SketchUp (البرنامج المساعد) لتصميم الأثاث بواسطة مبرمج

عند حساب تكلفة المطبخ الجديد ، كان السعر مرتفعًا للغاية لدرجة أنني قررت أن أجعله بنفسي لأنه سيكلف نصف السعر. للتدريب ، قررت أن أجعل سطح المكتب لنفسي. فهم بسرعة كافية: لجعل شيء جيد تحتاج إلى إنشاء نموذج ثلاثي الأبعاد. سيسمح لنا ذلك في مرحلة التصميم برؤية كيف سيبدو الأثاث ويفكر في كيفية حدوث التجميع في المستقبل. نظرًا لأنني لا أقوم بعمل نماذج ثلاثية الأبعاد ، فقد بدأت في البحث عن برنامج أبسط. وأبسط شيء وجدته SketchUp . عند إنشاء نموذج ، اضطررت دائمًا إلى تحرير النموذج بسبب تغيير الأحجام باستمرار. وبعد التغيير الثالث ، ظهرت الفكرة - لإنشاء نموذج معلمات بحيث تم إنشاؤه بنفسه بالأحجام المناسبة. يدعم SketchUp البرامج النصية لـ Ruby وهذه المقالة تدور حول ما فعلته.


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


main.jpg


الأحمر حواف 2 مم ، الأرجواني حواف 0.4 مم. الأرفف السفلية لا تصل إلى النهاية ، حيث توجد بطارية تسخين بالقرب من الحائط. يقع سطح الطاولة على بعد 4 سم خلف الحائط بحيث ترتفع حرارة بطارية التدفئة وتسخن الجدار ( بشكل عام ، من المريح جدًا صنع الأثاث بنفسك - يمكنك جعله بحجمك ).


هنا هو رمز لتوليد ذلك
#   $weght = 16.0 #       $zazor = 5.0 #      $dWidth = 26.0 # $width = 770 $offsetStena = 40 $dStoledhnica = 20 $height = 2500 - 150 - 900 $depthLeft = 600 $depthRight = $depthLeft - 175 $jshikHeight = 200 $heightPlanka = 300 $heightJshik = 190 $heightJshikOffset = 10 #    def object3D_main() #   Shasoft::Object3D::loadLibrary() #    Shasoft::Object3D::LDSP::setWeght($weght) #   stenaLeft = Shasoft::Object3D::LDSP::create($height-$weght,$depthLeft,"2 0 0 1").name(" ").rotateY(-90) stenaRight = Shasoft::Object3D::LDSP::create($height-$weght,$depthLeft,"2 0 0 1").name(" ").rotateY(-90).moveX($width-$weght) stoleshnica = Shasoft::Object3D::LDSP::create($width,$depthLeft+$dStoledhnica-$offsetStena,"2 2 1 2").name("").move(-$weght,-$dStoledhnica,$height-$weght) polka1 = Shasoft::Object3D::LDSP::create($width-$weght*2,$depthRight,"2 0 0 0").name(" 1").moveZ(400) polka2 = Shasoft::Object3D::LDSP::create($width-$weght*2,$depthRight-$weght,"2 0 0 0").name(" 2").moveZ(600) polka3 = Shasoft::Object3D::LDSP::create($width-$weght*2,$depthLeft-$offsetStena,"2 0 0 0").name(" 3").moveZ(800+$heightJshik+$heightJshikOffset+10-$weght-5) pereborka1 = Shasoft::Object3D::LDSP::create($width-$weght*2,$heightPlanka).name("").rotateX(90).moveY($depthRight).moveZ(400+$weght) #   jshik1box = Shasoft::Object3D::LDSP::create_box($width-$weght*2-$dWidth,$depthLeft-$zazor-$offsetStena,$heightJshik," ",1).moveX($dWidth/2).moveZ($height-$heightJshik-$heightJshikOffset-$weght) jshik1Fasad = Shasoft::Object3D::LDSP::create($width,200,"2 2 2 2").rotateX(90).moveX(-$weght).moveZ($height-$heightJshik-$heightJshikOffset-$weght-5).name("  1") jshik1 = Shasoft::Object3D::create(jshik1box,jshik1Fasad) #   jshik2box = Shasoft::Object3D::LDSP::create_box($width-$weght*2-$dWidth,$depthLeft-$zazor-$offsetStena,$heightJshik-$weght-5," ",1).moveX($dWidth/2).moveZ($height-$heightJshik-$heightJshikOffset-$weght) jshik2Fasad = Shasoft::Object3D::LDSP::create($width,200,"2 2 2 2").rotateX(90).moveX(-$weght).moveZ($height-$heightJshik-$heightJshikOffset-$weght-5).name("  2") jshik2 = Shasoft::Object3D::create(jshik2box,jshik2Fasad).moveZ(-$height+800+$heightJshik+$heightJshikOffset+$weght+10) #  widthDver = $width/2-5 dver1 = Shasoft::Object3D::LDSP::create(widthDver,800-5-10,"2 2 2 2").rotateX(90).moveZ(5).moveX(-$weght).name(" 1") dver2 = dver1.copy.moveX($width-widthDver).name(" 2") # for i in 0..5 Shasoft::Object3D::LDSP::create(467,247,"0 2 0 0").name("  ").moveX(-600).moveZ(i*50) end for i in 0..2 Shasoft::Object3D::LDSP::create(467,640,"0 2 0 0").name("   2").moveX(-600-600).moveZ(i*50) end # Shasoft::Object3D::LDSP::write_csv( File.dirname(__FILE__)+"/main.csv" ) #Shasoft::Object3D::LDSP::write_csv_cut( File.dirname(__FILE__)+"/cut.csv" ) #Shasoft::Object3D::show() end 

تركيب


قم بتنزيل ملف Object3D.rbz
إطلاق SketchUp
افتح مدير الامتداد (مدير نافذة / ملحق)
انقر فوق الزر "تثبيت ملحق" وحدد ملف Object3D.rbz الذي تم تنزيله
بعد ذلك ، يطلب البرنامج المساعد دليلًا حيث سيتم تخزين المشروعات. أي يتم عرض نافذة "تحديد الدليل بالمشروعات" وتحتاج إلى تحديد المجلد الذي ستقوم بتخزين مشروعاتك به.


نتيجة لذلك ، لدينا تمديد لدينا


2019-01-25-10_02_19.png


استخدام


انتقل إلى المجلد الذي حددناه لتخزين المشاريع. يمكن تغيير هذا المجلد في قائمة البرنامج المساعد


2019-01-25-10_06_10.png


قم بإنشاء دليل في المجلد باسم مشروعنا. في حالتي ، هذا هو "الخزانة في القاعة". ثم نذهب إلى الدليل الذي تم إنشاؤه وننشئ الملف main.rb الذي ننشئ فيه وظيفة نقطة الدخول


 #    def object3D_main() ... #     end 

نقوم بإعادة تشغيل SketchUp وفي قائمة المكونات الإضافية سترى عنصرًا باسم المجلد الذي قمت بإنشائه. الآن يمكنك تحديد هذا العنصر سيحدث ما يلي:


  • تنظيف وحدة التحكم روبي
  • حذف جميع العناصر في المشروع الحالي
  • تحميل ملف main.rb من الدليل المحدد
  • وظيفة استدعاء object3D_main

في دالة object3D_main ، تحتاج إلى إنشاء توليد النموذج الخاص بك. يمكنك نسخ الكود الذي أعطيته أعلاه إلى ملف main.rb ومن ثم سيتم إنشاء الخزانة الخاصة بي.


API


ملف "core.rb"


تقوم كل دالة بإرجاع كائن Shasoft :: Object3D :: Object3D يحتوي على طرق لتحريك الكائن وتدويره


  • اسم الوظيفة () - تعيين اسم الكائن. لا تهملهم. عند تجميعها يمكن أن تساعد كثيرا :)


  • وظائف الكائن moveX ، moveY ، moveZ تسمح لك بتحريك الكائن على طول المحاور المقابلة.


  • تتيح لك وظيفة النقل (س ، ص ، ض) نقل كائن على طول ثلاثة محاور في وقت واحد


  • وظائف الكائن rotateX ، rotateY ، rotateZ تتيح لك تدوير الكائن حول المحاور المقابلة.


  • هناك وظائف الأسماء المستعارة moveRed ، moveGreen ، moveBlue ، rotateRed ، rotateGreen ، rotateBlue حيث تتم تسمية المحاور X (الأحمر) ، Y (الأخضر) ، Z (الأزرق) بلونها في SketchUp. ربما شخص ما سيكون أكثر راحة.
    تقوم كل دالة بإرجاع مؤشر إلى الكائن نفسه. هذا يسمح لك بإجراء سلسلة اتصال.


     #    90    X     Y  100  obj.rotateX(90).moveY(100) 

  • تتيح لك وظيفة كائن set (dict ، key ، value) ضبط قيمة السمة. dict - اسم القاموس ، اسم السمة الرئيسية ، القيمة - القيمة


  • تتيح لك وظيفة كائن get (dict ، key ، value = nil) الحصول على قيمة السمة. dict - اسم القاموس ، اسم السمة الرئيسية ، القيمة - القيمة


  • تتيح لك طريقة النسخ الحصول على نسخة من الكائن (على الرغم من أنها لا تعمل بشكل ثابت للغاية :))


  • تسمح لك طريقة المجموعة بالحصول على كائن SketchUp :: Group قياسي.



يتم تعريف طريقة إنشاء كائن. يمكنك تمرير قائمة بالكائنات Shasoft :: Object3D :: Object3D أو SketchUp :: Group كمعلمات. إذا كانت قائمة المعلمات فارغة ، سيتم إنشاء مجموعة جديدة.


 #       Shasoft::Object3D::create(*args) 

هناك أيضًا وظيفة تتيح لك الحصول على قائمة بالكائنات (Skechup :: Group). يمكنك تحديد اسم القاموس وسيتم إرجاع الكائنات التي تحتوي على مثل هذا القاموس فقط. على وجه الخصوص ، هذه هي الطريقة التي أفصل بها الكائنات عن ورقة اللوح عن الآخرين. عند الإنشاء ، أقوم بتثبيت قاموس LDSP الذي قمت من خلاله بترشيح كل الكائنات الموجودة في المشهد.


 #    # dict -   Shasoft::Object3D::get(dict=nil) 

ملف 2D_weght


 #  3D   # pts -      x,y # weght - () Shasoft::Object3D::create_pushpull(pts,weght) #       # lX -   X # lY -   Y # weght -  Shasoft::Object3D::create_plane(lX,lY,weght) 

ملف "ldsp.rb"


 #    Shasoft::Object3D::LDSP::weght #   Shasoft::Object3D::LDSP::setWeght(weght) 

 #     Shasoft::Object3D::LDSP::material #    Shasoft::Object3D::LDSP::setMaterial(material) #    # width -  ( X) # depth -  ( Y) # kromka -  [X , Y , X , Y ], 0 -  , 1 -  0.4 , 2 -  2  Shasoft::Object3D::LDSP::create(width,depth,kromka="0 0 0 0") 

وظيفة مساعدة لإنشاء الأدراج


 #   # width -  # depth -  # height -  # name -  # is_kromka - 1/0   2   Shasoft::Object3D::LDSP::create_box(width,depth,height,name,is_kromka) 

نتيجة العمل
box.png


 #     CSV Shasoft::Object3D::LDSP::write_csv(filepath) 

نتيجة لذلك ، سيتم إنشاء ملف CSV التالي بالأعمدة التالية


  • أ - العرض
  • ب - العمق
  • C عدد الأجزاء
  • D - حواف في شكل D- الجانب الطويل ، K- الجانب القصير. في هذا يتم تسجيلهم في المكتب الذي أطلب قطعًا منه. ربما هذا هو المعيار.
  • E - حواف في التنسيق الذي قمت بتعيينها عند إنشاء
  • و - اسم جميع الأجزاء. هذا مفيد عند البناء.

2019-01-25-10_39_50.png


في الختام


تصميم وتجميع الأثاث بنفسك يوفر المال حوالي 2 مرات. وكذلك الفرصة للضغط على أثاثك الفردي في أي ثقب غير قياسي في الشقة. أقوم عادةً بجمع الأثاث على التأكيدات 7 × 50 من اللوح 16 مم


1490379431197352996.jpg


إذا كان هناك تدريبات للتأكيدات


1490379603123527575.jpg


(ومهارة صغيرة) التجمع لا يستغرق الكثير من الوقت.


السلبية الوحيدة هي أنه يمكنك المشاركة . بعد سطح المكتب ، قمت بالفعل بتجميع: مطبخ ، عدة أقفاص (لنفس الطائر هو في الصورة) ، أرفف (جدار وأرضية) ، خزائن وطاولات. بشكل عام ، "تشوش" جميع الأماكن غير المستخدمة في الشقة.


تحميل وصلة التمديد


رابط إلى صفحة البرنامج المساعد

Source: https://habr.com/ru/post/ar442190/


All Articles