diff --git a/docs/blog/authors.yml b/docs/blog/authors.yml index c6a6e87bd..31fcfff21 100644 --- a/docs/blog/authors.yml +++ b/docs/blog/authors.yml @@ -2,7 +2,7 @@ ubarevicius: name: Matas Ubarevičius title: Founder url: https://www.linkedin.com/in/matas-ubarevicius/ - image_url: https://media.licdn.com/dms/image/v2/D4D03AQG-ryTDnp5Gmg/profile-displayphoto-scale_200_200/B4DZj7zQkTGkAY-/0/1756571175899?e=1762387200&v=beta&t=r2guT1tJv3FiumJwYF0-bmiTsKTun5Aw0JCzDM2lY_I + image_url: /img/matas-ubarevicius.jpeg page: # customize the url of the author page at /blog/authors/ permalink: '/all-matas-ubarevicius-articles' diff --git a/docs/learn/3d-bits/for-developers/third-party-app-integrations.md b/docs/learn/3d-bits/for-developers/third-party-app-integrations.md index 192c44b7a..66496045b 100644 --- a/docs/learn/3d-bits/for-developers/third-party-app-integrations.md +++ b/docs/learn/3d-bits/for-developers/third-party-app-integrations.md @@ -114,12 +114,30 @@ While we recommend the schema below for consistency across integrations, we unde ### Event Name -Use the exact namespace: +We suggest using this event name, but you could create your own namespace. We understand that you might not want to have references to a single app in your codebase. ```javascript 3dbits.productOptions.changed ``` +Alternative: + +```javascript +yourApp.productOptions.changed +``` + +**If you use `3dbits.productOptions.changed`:** +- We can detect this automatically +- Users won't need to manually select your app from our Input Collection Mode dropdown +- The integration will work out of the box + +**If you choose your own event name:** +- Please [contact us](#contact-information) with your event name +- We'll add support for your specific event +- Users will need to select your app from the Input Collection Mode dropdown + +This way we'll know which event to listen to when users configure your app for input collection. + ### Event Data Structure (TypeScript) The `detail` property of the event should follow this interface: diff --git a/docs/static/img/matas-ubarevicius.jpeg b/docs/static/img/matas-ubarevicius.jpeg new file mode 100644 index 000000000..f6e685bd6 Binary files /dev/null and b/docs/static/img/matas-ubarevicius.jpeg differ diff --git a/languages/ar.json b/languages/ar.json index 9c36e65fd..625f5b4ed 100644 --- a/languages/ar.json +++ b/languages/ar.json @@ -5530,5 +5530,113 @@ "textFontWeight": "وزن خط النص", "textPosition": "موضع النص", "textBackgroundStrokeThickness": "سمك الحد", - "Inputs.Base.topBottomEnum": "Inputs.Base.topBottomEnum" -} \ No newline at end of file + "Inputs.Base.topBottomEnum": "Inputs.Base.topBottomEnum", + "clear": "مسح", + "recompute": "إعادة حساب", + "clear tooltip": "مسح جميع ذاكرة التخزين المؤقت والمكونات", + "recompute tooltip": "يمسح ذاكرة التخزين المؤقت ويعيد الحساب", + "bitbybit.occt.shapes.wire.createIBeamProfileWire": "سلك ملف I-beam", + "createIBeamProfileWire": "سلك ملف I-beam", + "bitbybit.occt.shapes.wire.createIBeamProfileWire_description": "ينشئ سلك ملف I-beam في OpenCascade", + "beam profiles": "ملفات الكمرات", + "webThickness": "سمك الشبكة", + "flangeThickness": "سمك الحافة", + "alignment": "المحاذاة", + "Base.basicAlignmentEnum": "Base.basicAlignmentEnum", + "bitbybit.occt.shapes.wire.createHBeamProfileWire": "سلك ملف H-beam", + "createHBeamProfileWire": "سلك ملف H-beam", + "bitbybit.occt.shapes.wire.createHBeamProfileWire_description": "ينشئ سلك ملف H-beam في OpenCascade", + "bitbybit.occt.shapes.wire.createTBeamProfileWire": "سلك ملف T-beam", + "createTBeamProfileWire": "سلك ملف T-beam", + "bitbybit.occt.shapes.wire.createTBeamProfileWire_description": "ينشئ سلك ملف T-beam في OpenCascade", + "bitbybit.occt.shapes.wire.createUBeamProfileWire": "سلك ملف U-beam", + "createUBeamProfileWire": "سلك ملف U-beam", + "bitbybit.occt.shapes.wire.createUBeamProfileWire_description": "ينشئ سلك ملف U-beam في OpenCascade", + "flangeWidth": "عرض الحافة", + "bitbybit.occt.shapes.face.createLPolygonFace": "وجه مضلع L", + "createLPolygonFace": "وجه مضلع L", + "bitbybit.occt.shapes.face.createLPolygonFace_description": "ينشئ وجه مضلع L في OpenCascade", + "bitbybit.occt.shapes.face.createStarFace": "وجه نجمة", + "createStarFace": "وجه نجمة", + "bitbybit.occt.shapes.face.createStarFace_description": "ينشئ وجه نجمة في OpenCascade", + "bitbybit.occt.shapes.face.createChristmasTreeFace": "وجه شجرة عيد الميلاد", + "createChristmasTreeFace": "وجه شجرة عيد الميلاد", + "bitbybit.occt.shapes.face.createChristmasTreeFace_description": "ينشئ وجه شجرة عيد الميلاد في OpenCascade", + "bitbybit.occt.shapes.face.createParallelogramFace": "وجه متوازي أضلاع", + "createParallelogramFace": "وجه متوازي أضلاع", + "bitbybit.occt.shapes.face.createParallelogramFace_description": "ينشئ وجه متوازي أضلاع في OpenCascade", + "bitbybit.occt.shapes.face.createHeartFace": "وجه قلب", + "createHeartFace": "وجه قلب", + "bitbybit.occt.shapes.face.createHeartFace_description": "ينشئ وجه قلب في OpenCascade", + "bitbybit.occt.shapes.face.createNGonFace": "وجه مضلع n", + "createNGonFace": "وجه مضلع n", + "bitbybit.occt.shapes.face.createNGonFace_description": "ينشئ وجه مضلع n في OpenCascade", + "bitbybit.occt.shapes.face.createIBeamProfileFace": "وجه ملف I-beam", + "createIBeamProfileFace": "وجه ملف I-beam", + "bitbybit.occt.shapes.face.createIBeamProfileFace_description": "ينشئ وجه ملف I-beam في OpenCascade", + "bitbybit.occt.shapes.face.createHBeamProfileFace": "وجه ملف H-beam", + "createHBeamProfileFace": "وجه ملف H-beam", + "bitbybit.occt.shapes.face.createHBeamProfileFace_description": "ينشئ وجه ملف H-beam في OpenCascade", + "bitbybit.occt.shapes.face.createTBeamProfileFace": "وجه ملف T-beam", + "createTBeamProfileFace": "وجه ملف T-beam", + "bitbybit.occt.shapes.face.createTBeamProfileFace_description": "ينشئ وجه ملف T-beam في OpenCascade", + "bitbybit.occt.shapes.face.createUBeamProfileFace": "وجه ملف U-beam", + "createUBeamProfileFace": "وجه ملف U-beam", + "bitbybit.occt.shapes.face.createUBeamProfileFace_description": "ينشئ وجه ملف U-beam في OpenCascade", + "bitbybit.occt.shapes.solid.createStarSolid": "مجسم نجمة", + "createStarSolid": "مجسم نجمة", + "bitbybit.occt.shapes.solid.createStarSolid_description": "ينشئ مجسم نجمة في OpenCascade", + "extrusionLengthFront": "طول البثق الأمامي", + "extrusionLengthBack": "طول البثق الخلفي", + "bitbybit.occt.shapes.solid.createNGonSolid": "مجسم مضلع n", + "createNGonSolid": "مجسم مضلع n", + "bitbybit.occt.shapes.solid.createNGonSolid_description": "ينشئ مجسم مضلع n في OpenCascade", + "bitbybit.occt.shapes.solid.createParallelogramSolid": "مجسم متوازي أضلاع", + "createParallelogramSolid": "مجسم متوازي أضلاع", + "bitbybit.occt.shapes.solid.createParallelogramSolid_description": "ينشئ مجسم متوازي أضلاع في OpenCascade", + "bitbybit.occt.shapes.solid.createHeartSolid": "مجسم قلب", + "createHeartSolid": "مجسم قلب", + "bitbybit.occt.shapes.solid.createHeartSolid_description": "ينشئ مجسم قلب في OpenCascade", + "bitbybit.occt.shapes.solid.createChristmasTreeSolid": "مجسم شجرة عيد الميلاد", + "createChristmasTreeSolid": "مجسم شجرة عيد الميلاد", + "bitbybit.occt.shapes.solid.createChristmasTreeSolid_description": "ينشئ مجسم شجرة عيد الميلاد في OpenCascade", + "bitbybit.occt.shapes.solid.createLPolygonSolid": "مجسم مضلع L", + "createLPolygonSolid": "مجسم مضلع L", + "bitbybit.occt.shapes.solid.createLPolygonSolid_description": "ينشئ مجسم مضلع L في OpenCascade", + "bitbybit.occt.shapes.solid.createIBeamProfileSolid": "مجسم ملف I-beam", + "createIBeamProfileSolid": "مجسم ملف I-beam", + "bitbybit.occt.shapes.solid.createIBeamProfileSolid_description": "ينشئ مجسم ملف I-beam في OpenCascade", + "beam": "كمرة", + "bitbybit.occt.shapes.solid.createHBeamProfileSolid": "مجسم ملف H-beam", + "createHBeamProfileSolid": "مجسم ملف H-beam", + "bitbybit.occt.shapes.solid.createHBeamProfileSolid_description": "ينشئ مجسم ملف H-beam في OpenCascade", + "bitbybit.occt.shapes.solid.createTBeamProfileSolid": "مجسم ملف T-beam", + "createTBeamProfileSolid": "مجسم ملف T-beam", + "bitbybit.occt.shapes.solid.createTBeamProfileSolid_description": "ينشئ مجسم ملف T-beam في OpenCascade", + "bitbybit.occt.shapes.solid.createUBeamProfileSolid": "مجسم ملف U-beam", + "createUBeamProfileSolid": "مجسم ملف U-beam", + "bitbybit.occt.shapes.solid.createUBeamProfileSolid_description": "ينشئ مجسم ملف U-beam في OpenCascade", + "endType": "نوع النهاية", + "dimensionEndTypeEnum": "dimensionEndTypeEnum", + "arrowAngle": "زاوية السهم", + "arrowsFlipped": "الأسهم مقلوبة", + "colorFormat": "تنسيق اللون", + "dxfColorFormatEnum": "dxfColorFormatEnum", + "acadVersion": "إصدار acad", + "dxfAcadVersionEnum": "dxfAcadVersionEnum", + "bitbybit.advanced.navigation.zoomOn": "تكبير على", + "zoomOn": "تكبير على", + "bitbybit.advanced.navigation.zoomOn_description": "يكبّر الكاميرا لتناسب المجسمات المحددة في المشهد مع رسوم متحركة سلسة. يعمل فقط مع ArcRotateCamera. يمكن مقاطعة الرسوم المتحركة إذا تم استدعاؤها عدة مرات.", + "animationSpeed": "سرعة الرسوم المتحركة", + "doNotUpdateMaxZ": "لا تحدّث الحد الأقصى z", + "bitbybit.advanced.navigation.focusFromAngle": "التركيز من زاوية", + "focusFromAngle": "التركيز من زاوية", + "bitbybit.advanced.navigation.focusFromAngle_description": "يركّز الكاميرا على المجسمات المحددة من زاوية معينة مع رسوم متحركة سلسة. يحسب مركز صندوق الحدود لجميع المجسمات ويضع الكاميرا عند متجه التوجيه المحدد للنظر إلى المركز. يعمل فقط مع ArcRotateCamera. يمكن مقاطعة الرسوم المتحركة إذا تم استدعاؤها عدة مرات.", + "padding": "الحشو", + "shadowRefreshRate": "معدل تحديث الظل", + "labelFlipHorizontal": "قلب التسمية أفقيًا", + "labelFlipVertical": "قلب التسمية عموديًا", + "bitbybit.advanced.navigation.zoomOnAspect": "التكبير على النسبة", + "zoomOnAspect": "التكبير على النسبة", + "bitbybit.advanced.navigation.zoomOnAspect_description": "تكبير الكاميرا لتناسب المجسمات المحددة في المشهد مع رسوم متحركة سلسة، مع مراعاة نسبة العرض إلى الارتفاع الدقيقة للشاشة. على عكس zoomOn، تحسب هذه الطريقة بدقة مسافة الكاميرا بناءً على أبعاد منفذ العرض وصندوق الحدود للمجسم لضمان ملاءمة أفضل عند padding=0. يعمل فقط مع ArcRotateCamera. يمكن مقاطعة الرسوم المتحركة إذا تم استدعاؤها عدة مرات." +} diff --git a/languages/bn.json b/languages/bn.json index e4e035860..4b6e4c5ef 100644 --- a/languages/bn.json +++ b/languages/bn.json @@ -5530,5 +5530,113 @@ "textFontWeight": "টেক্সট ফন্ট ওজন", "textPosition": "টেক্সট অবস্থান", "textBackgroundStrokeThickness": "স্ট্রোক পুরুত্ব", - "Inputs.Base.topBottomEnum": "Inputs.Base.topBottomEnum" -} \ No newline at end of file + "Inputs.Base.topBottomEnum": "Inputs.Base.topBottomEnum", + "clear": "মুছুন", + "recompute": "পুনরায় গণনা করুন", + "clear tooltip": "সমস্ত ক্যাশে এবং উপাদান মুছুন", + "recompute tooltip": "ক্যাশে মুছে ফেলে এবং পুনরায় গণনা করে", + "bitbybit.occt.shapes.wire.createIBeamProfileWire": "I-beam প্রোফাইল তার", + "createIBeamProfileWire": "I-beam প্রোফাইল তার", + "bitbybit.occt.shapes.wire.createIBeamProfileWire_description": "OpenCascade I-beam প্রোফাইল তার তৈরি করে", + "beam profiles": "বিম প্রোফাইল", + "webThickness": "ওয়েব বেধ", + "flangeThickness": "ফ্ল্যাঞ্জ বেধ", + "alignment": "প্রান্তিককরণ", + "Base.basicAlignmentEnum": "Base.basicAlignmentEnum", + "bitbybit.occt.shapes.wire.createHBeamProfileWire": "H-beam প্রোফাইল তার", + "createHBeamProfileWire": "H-beam প্রোফাইল তার", + "bitbybit.occt.shapes.wire.createHBeamProfileWire_description": "OpenCascade H-beam প্রোফাইল তার তৈরি করে", + "bitbybit.occt.shapes.wire.createTBeamProfileWire": "T-beam প্রোফাইল তার", + "createTBeamProfileWire": "T-beam প্রোফাইল তার", + "bitbybit.occt.shapes.wire.createTBeamProfileWire_description": "OpenCascade T-beam প্রোফাইল তার তৈরি করে", + "bitbybit.occt.shapes.wire.createUBeamProfileWire": "U-beam প্রোফাইল তার", + "createUBeamProfileWire": "U-beam প্রোফাইল তার", + "bitbybit.occt.shapes.wire.createUBeamProfileWire_description": "OpenCascade U-beam প্রোফাইল তার তৈরি করে", + "flangeWidth": "ফ্ল্যাঞ্জ প্রশস্ততা", + "bitbybit.occt.shapes.face.createLPolygonFace": "L বহুভুজ মুখ", + "createLPolygonFace": "L বহুভুজ মুখ", + "bitbybit.occt.shapes.face.createLPolygonFace_description": "OpenCascade L-বহুভুজ মুখ তৈরি করে", + "bitbybit.occt.shapes.face.createStarFace": "তারকা মুখ", + "createStarFace": "তারকা মুখ", + "bitbybit.occt.shapes.face.createStarFace_description": "OpenCascade তারকা মুখ তৈরি করে", + "bitbybit.occt.shapes.face.createChristmasTreeFace": "ক্রিসমাস ট্রি মুখ", + "createChristmasTreeFace": "ক্রিসমাস ট্রি মুখ", + "bitbybit.occt.shapes.face.createChristmasTreeFace_description": "OpenCascade ক্রিসমাস ট্রি মুখ তৈরি করে", + "bitbybit.occt.shapes.face.createParallelogramFace": "সমান্তরাল চতুর্ভুজ মুখ", + "createParallelogramFace": "সমান্তরাল চতুর্ভুজ মুখ", + "bitbybit.occt.shapes.face.createParallelogramFace_description": "OpenCascade সমান্তরাল চতুর্ভুজ মুখ তৈরি করে", + "bitbybit.occt.shapes.face.createHeartFace": "হৃদয় মুখ", + "createHeartFace": "হৃদয় মুখ", + "bitbybit.occt.shapes.face.createHeartFace_description": "OpenCascade হৃদয় মুখ তৈরি করে", + "bitbybit.occt.shapes.face.createNGonFace": "n-কোণ মুখ", + "createNGonFace": "n-কোণ মুখ", + "bitbybit.occt.shapes.face.createNGonFace_description": "OpenCascade n-কোণ মুখ তৈরি করে", + "bitbybit.occt.shapes.face.createIBeamProfileFace": "I-beam প্রোফাইল মুখ", + "createIBeamProfileFace": "I-beam প্রোফাইল মুখ", + "bitbybit.occt.shapes.face.createIBeamProfileFace_description": "OpenCascade I-beam প্রোফাইল মুখ তৈরি করে", + "bitbybit.occt.shapes.face.createHBeamProfileFace": "H-beam প্রোফাইল মুখ", + "createHBeamProfileFace": "H-beam প্রোফাইল মুখ", + "bitbybit.occt.shapes.face.createHBeamProfileFace_description": "OpenCascade H-beam প্রোফাইল মুখ তৈরি করে", + "bitbybit.occt.shapes.face.createTBeamProfileFace": "T-beam প্রোফাইল মুখ", + "createTBeamProfileFace": "T-beam প্রোফাইল মুখ", + "bitbybit.occt.shapes.face.createTBeamProfileFace_description": "OpenCascade T-beam প্রোফাইল মুখ তৈরি করে", + "bitbybit.occt.shapes.face.createUBeamProfileFace": "U-beam প্রোফাইল মুখ", + "createUBeamProfileFace": "U-beam প্রোফাইল মুখ", + "bitbybit.occt.shapes.face.createUBeamProfileFace_description": "OpenCascade U-beam প্রোফাইল মুখ তৈরি করে", + "bitbybit.occt.shapes.solid.createStarSolid": "তারকা কঠিন", + "createStarSolid": "তারকা কঠিন", + "bitbybit.occt.shapes.solid.createStarSolid_description": "OpenCascade তারকা কঠিন তৈরি করে", + "extrusionLengthFront": "সম্মুখ এক্সট্রুশন দৈর্ঘ্য", + "extrusionLengthBack": "পশ্চাৎ এক্সট্রুশন দৈর্ঘ্য", + "bitbybit.occt.shapes.solid.createNGonSolid": "n-কোণ কঠিন", + "createNGonSolid": "n-কোণ কঠিন", + "bitbybit.occt.shapes.solid.createNGonSolid_description": "OpenCascade n-কোণ কঠিন তৈরি করে", + "bitbybit.occt.shapes.solid.createParallelogramSolid": "সমান্তরাল চতুর্ভুজ কঠিন", + "createParallelogramSolid": "সমান্তরাল চতুর্ভুজ কঠিন", + "bitbybit.occt.shapes.solid.createParallelogramSolid_description": "OpenCascade সমান্তরাল চতুর্ভুজ কঠিন তৈরি করে", + "bitbybit.occt.shapes.solid.createHeartSolid": "হৃদয় কঠিন", + "createHeartSolid": "হৃদয় কঠিন", + "bitbybit.occt.shapes.solid.createHeartSolid_description": "OpenCascade হৃদয় কঠিন তৈরি করে", + "bitbybit.occt.shapes.solid.createChristmasTreeSolid": "ক্রিসমাস ট্রি কঠিন", + "createChristmasTreeSolid": "ক্রিসমাস ট্রি কঠিন", + "bitbybit.occt.shapes.solid.createChristmasTreeSolid_description": "OpenCascade ক্রিসমাস ট্রি কঠিন তৈরি করে", + "bitbybit.occt.shapes.solid.createLPolygonSolid": "L বহুভুজ কঠিন", + "createLPolygonSolid": "L বহুভুজ কঠিন", + "bitbybit.occt.shapes.solid.createLPolygonSolid_description": "OpenCascade L-বহুভুজ কঠিন তৈরি করে", + "bitbybit.occt.shapes.solid.createIBeamProfileSolid": "I-beam প্রোফাইল কঠিন", + "createIBeamProfileSolid": "I-beam প্রোফাইল কঠিন", + "bitbybit.occt.shapes.solid.createIBeamProfileSolid_description": "OpenCascade I-beam প্রোফাইল কঠিন তৈরি করে", + "beam": "বিম", + "bitbybit.occt.shapes.solid.createHBeamProfileSolid": "H-beam প্রোফাইল কঠিন", + "createHBeamProfileSolid": "H-beam প্রোফাইল কঠিন", + "bitbybit.occt.shapes.solid.createHBeamProfileSolid_description": "OpenCascade H-beam প্রোফাইল কঠিন তৈরি করে", + "bitbybit.occt.shapes.solid.createTBeamProfileSolid": "T-beam প্রোফাইল কঠিন", + "createTBeamProfileSolid": "T-beam প্রোফাইল কঠিন", + "bitbybit.occt.shapes.solid.createTBeamProfileSolid_description": "OpenCascade T-beam প্রোফাইল কঠিন তৈরি করে", + "bitbybit.occt.shapes.solid.createUBeamProfileSolid": "U-beam প্রোফাইল কঠিন", + "createUBeamProfileSolid": "U-beam প্রোফাইল কঠিন", + "bitbybit.occt.shapes.solid.createUBeamProfileSolid_description": "OpenCascade U-beam প্রোফাইল কঠিন তৈরি করে", + "endType": "শেষ প্রকার", + "dimensionEndTypeEnum": "dimensionEndTypeEnum", + "arrowAngle": "তীরের কোণ", + "arrowsFlipped": "তীর উল্টানো", + "colorFormat": "রঙের ফরম্যাট", + "dxfColorFormatEnum": "dxfColorFormatEnum", + "acadVersion": "acad সংস্করণ", + "dxfAcadVersionEnum": "dxfAcadVersionEnum", + "bitbybit.advanced.navigation.zoomOn": "জুম করুন", + "zoomOn": "জুম করুন", + "bitbybit.advanced.navigation.zoomOn_description": "মসৃণ অ্যানিমেশন সহ দৃশ্যে নির্দিষ্ট মেশ ফিট করতে ক্যামেরা জুম করুন। শুধুমাত্র ArcRotateCamera এর সাথে কাজ করে। একাধিকবার কল করলে অ্যানিমেশন বাধাগ্রস্ত হতে পারে।", + "animationSpeed": "অ্যানিমেশন গতি", + "doNotUpdateMaxZ": "সর্বোচ্চ z আপডেট করবেন না", + "bitbybit.advanced.navigation.focusFromAngle": "কোণ থেকে ফোকাস করুন", + "focusFromAngle": "কোণ থেকে ফোকাস করুন", + "bitbybit.advanced.navigation.focusFromAngle_description": "মসৃণ অ্যানিমেশন সহ একটি নির্দিষ্ট কোণ থেকে নির্দিষ্ট মেশে ক্যামেরা ফোকাস করুন। সমস্ত মেশের বাউন্ডিং বক্সের কেন্দ্র গণনা করে এবং কেন্দ্রের দিকে তাকাতে নির্দিষ্ট ওরিয়েন্টেশন ভেক্টরে ক্যামেরা অবস্থান করে। শুধুমাত্র ArcRotateCamera এর সাথে কাজ করে। একাধিকবার কল করলে অ্যানিমেশন বাধাগ্রস্ত হতে পারে।", + "padding": "প্যাডিং", + "shadowRefreshRate": "ছায়া রিফ্রেশ হার", + "labelFlipHorizontal": "লেবেল অনুভূমিকভাবে ফ্লিপ করুন", + "labelFlipVertical": "লেবেল উল্লম্বভাবে ফ্লিপ করুন", + "bitbybit.advanced.navigation.zoomOnAspect": "দৃষ্টিভঙ্গিতে জুম করুন", + "zoomOnAspect": "দৃষ্টিভঙ্গিতে জুম করুন", + "bitbybit.advanced.navigation.zoomOnAspect_description": "মসৃণ অ্যানিমেশন সহ দৃশ্যে নির্দিষ্ট মেশগুলি ফিট করতে ক্যামেরা জুম করুন, সঠিক স্ক্রিন অ্যাসপেক্ট অনুপাত বিবেচনা করে। zoomOn এর বিপরীতে, এই পদ্ধতিটি ভিউপোর্ট মাত্রা এবং মেশ বাউন্ডিং বক্সের উপর ভিত্তি করে ক্যামেরা দূরত্ব সঠিকভাবে গণনা করে যাতে padding=0 এ আরও ভাল ফিট নিশ্চিত করা যায়। শুধুমাত্র ArcRotateCamera-এর সাথে কাজ করে। একাধিকবার কল করা হলে অ্যানিমেশন বাধাগ্রস্ত হতে পারে।" +} diff --git a/languages/de.json b/languages/de.json index 1cfd17a5b..fb6aba985 100644 --- a/languages/de.json +++ b/languages/de.json @@ -5530,5 +5530,113 @@ "textFontWeight": "Textschriftstärke", "textPosition": "Textposition", "textBackgroundStrokeThickness": "Strichstärke", - "Inputs.Base.topBottomEnum": "Inputs.Base.topBottomEnum" -} \ No newline at end of file + "Inputs.Base.topBottomEnum": "Inputs.Base.topBottomEnum", + "clear": "Löschen", + "recompute": "Neu berechnen", + "clear tooltip": "Alle Cache- und Komponenten löschen", + "recompute tooltip": "Löscht den Cache und berechnet neu", + "bitbybit.occt.shapes.wire.createIBeamProfileWire": "I-Träger-Profil-Draht", + "createIBeamProfileWire": "I-Träger-Profil-Draht", + "bitbybit.occt.shapes.wire.createIBeamProfileWire_description": "Erstellt OpenCascade I-Träger-Profil-Draht", + "beam profiles": "Trägerprofile", + "webThickness": "Stegdicke", + "flangeThickness": "Flanschdicke", + "alignment": "Ausrichtung", + "Base.basicAlignmentEnum": "Base.basicAlignmentEnum", + "bitbybit.occt.shapes.wire.createHBeamProfileWire": "H-Träger-Profil-Draht", + "createHBeamProfileWire": "H-Träger-Profil-Draht", + "bitbybit.occt.shapes.wire.createHBeamProfileWire_description": "Erstellt OpenCascade H-Träger-Profil-Draht", + "bitbybit.occt.shapes.wire.createTBeamProfileWire": "T-Träger-Profil-Draht", + "createTBeamProfileWire": "T-Träger-Profil-Draht", + "bitbybit.occt.shapes.wire.createTBeamProfileWire_description": "Erstellt OpenCascade T-Träger-Profil-Draht", + "bitbybit.occt.shapes.wire.createUBeamProfileWire": "U-Träger-Profil-Draht", + "createUBeamProfileWire": "U-Träger-Profil-Draht", + "bitbybit.occt.shapes.wire.createUBeamProfileWire_description": "Erstellt OpenCascade U-Träger-Profil-Draht", + "flangeWidth": "Flanschbreite", + "bitbybit.occt.shapes.face.createLPolygonFace": "L-Polygon-Fläche", + "createLPolygonFace": "L-Polygon-Fläche", + "bitbybit.occt.shapes.face.createLPolygonFace_description": "Erstellt OpenCascade L-Polygon-Fläche", + "bitbybit.occt.shapes.face.createStarFace": "Stern-Fläche", + "createStarFace": "Stern-Fläche", + "bitbybit.occt.shapes.face.createStarFace_description": "Erstellt OpenCascade Stern-Fläche", + "bitbybit.occt.shapes.face.createChristmasTreeFace": "Weihnachtsbaum-Fläche", + "createChristmasTreeFace": "Weihnachtsbaum-Fläche", + "bitbybit.occt.shapes.face.createChristmasTreeFace_description": "Erstellt OpenCascade Weihnachtsbaum-Fläche", + "bitbybit.occt.shapes.face.createParallelogramFace": "Parallelogramm-Fläche", + "createParallelogramFace": "Parallelogramm-Fläche", + "bitbybit.occt.shapes.face.createParallelogramFace_description": "Erstellt OpenCascade Parallelogramm-Fläche", + "bitbybit.occt.shapes.face.createHeartFace": "Herz-Fläche", + "createHeartFace": "Herz-Fläche", + "bitbybit.occt.shapes.face.createHeartFace_description": "Erstellt OpenCascade Herz-Fläche", + "bitbybit.occt.shapes.face.createNGonFace": "N-Eck-Fläche", + "createNGonFace": "N-Eck-Fläche", + "bitbybit.occt.shapes.face.createNGonFace_description": "Erstellt OpenCascade N-Eck-Fläche", + "bitbybit.occt.shapes.face.createIBeamProfileFace": "I-Träger-Profil-Fläche", + "createIBeamProfileFace": "I-Träger-Profil-Fläche", + "bitbybit.occt.shapes.face.createIBeamProfileFace_description": "Erstellt OpenCascade I-Träger-Profil-Fläche", + "bitbybit.occt.shapes.face.createHBeamProfileFace": "H-Träger-Profil-Fläche", + "createHBeamProfileFace": "H-Träger-Profil-Fläche", + "bitbybit.occt.shapes.face.createHBeamProfileFace_description": "Erstellt OpenCascade H-Träger-Profil-Fläche", + "bitbybit.occt.shapes.face.createTBeamProfileFace": "T-Träger-Profil-Fläche", + "createTBeamProfileFace": "T-Träger-Profil-Fläche", + "bitbybit.occt.shapes.face.createTBeamProfileFace_description": "Erstellt OpenCascade T-Träger-Profil-Fläche", + "bitbybit.occt.shapes.face.createUBeamProfileFace": "U-Träger-Profil-Fläche", + "createUBeamProfileFace": "U-Träger-Profil-Fläche", + "bitbybit.occt.shapes.face.createUBeamProfileFace_description": "Erstellt OpenCascade U-Träger-Profil-Fläche", + "bitbybit.occt.shapes.solid.createStarSolid": "Stern-Körper", + "createStarSolid": "Stern-Körper", + "bitbybit.occt.shapes.solid.createStarSolid_description": "Erstellt OpenCascade Stern-Körper", + "extrusionLengthFront": "Extrusionslänge vorne", + "extrusionLengthBack": "Extrusionslänge hinten", + "bitbybit.occt.shapes.solid.createNGonSolid": "N-Eck-Körper", + "createNGonSolid": "N-Eck-Körper", + "bitbybit.occt.shapes.solid.createNGonSolid_description": "Erstellt OpenCascade N-Eck-Körper", + "bitbybit.occt.shapes.solid.createParallelogramSolid": "Parallelogramm-Körper", + "createParallelogramSolid": "Parallelogramm-Körper", + "bitbybit.occt.shapes.solid.createParallelogramSolid_description": "Erstellt OpenCascade Parallelogramm-Körper", + "bitbybit.occt.shapes.solid.createHeartSolid": "Herz-Körper", + "createHeartSolid": "Herz-Körper", + "bitbybit.occt.shapes.solid.createHeartSolid_description": "Erstellt OpenCascade Herz-Körper", + "bitbybit.occt.shapes.solid.createChristmasTreeSolid": "Weihnachtsbaum-Körper", + "createChristmasTreeSolid": "Weihnachtsbaum-Körper", + "bitbybit.occt.shapes.solid.createChristmasTreeSolid_description": "Erstellt OpenCascade Weihnachtsbaum-Körper", + "bitbybit.occt.shapes.solid.createLPolygonSolid": "L-Polygon-Körper", + "createLPolygonSolid": "L-Polygon-Körper", + "bitbybit.occt.shapes.solid.createLPolygonSolid_description": "Erstellt OpenCascade L-Polygon-Körper", + "bitbybit.occt.shapes.solid.createIBeamProfileSolid": "I-Träger-Profil-Körper", + "createIBeamProfileSolid": "I-Träger-Profil-Körper", + "bitbybit.occt.shapes.solid.createIBeamProfileSolid_description": "Erstellt OpenCascade I-Träger-Profil-Körper", + "beam": "Träger", + "bitbybit.occt.shapes.solid.createHBeamProfileSolid": "H-Träger-Profil-Körper", + "createHBeamProfileSolid": "H-Träger-Profil-Körper", + "bitbybit.occt.shapes.solid.createHBeamProfileSolid_description": "Erstellt OpenCascade H-Träger-Profil-Körper", + "bitbybit.occt.shapes.solid.createTBeamProfileSolid": "T-Träger-Profil-Körper", + "createTBeamProfileSolid": "T-Träger-Profil-Körper", + "bitbybit.occt.shapes.solid.createTBeamProfileSolid_description": "Erstellt OpenCascade T-Träger-Profil-Körper", + "bitbybit.occt.shapes.solid.createUBeamProfileSolid": "U-Träger-Profil-Körper", + "createUBeamProfileSolid": "U-Träger-Profil-Körper", + "bitbybit.occt.shapes.solid.createUBeamProfileSolid_description": "Erstellt OpenCascade U-Träger-Profil-Körper", + "endType": "Endtyp", + "dimensionEndTypeEnum": "dimensionEndTypeEnum", + "arrowAngle": "Pfeilwinkel", + "arrowsFlipped": "Pfeile umgedreht", + "colorFormat": "Farbformat", + "dxfColorFormatEnum": "dxfColorFormatEnum", + "acadVersion": "Acad-Version", + "dxfAcadVersionEnum": "dxfAcadVersionEnum", + "bitbybit.advanced.navigation.zoomOn": "Zoomen auf", + "zoomOn": "Zoomen auf", + "bitbybit.advanced.navigation.zoomOn_description": "Kamera zoomen, um angegebene Netze in der Szene mit flüssiger Animation anzupassen. Funktioniert nur mit ArcRotateCamera. Animation kann unterbrochen werden, wenn mehrmals aufgerufen.", + "animationSpeed": "Animationsgeschwindigkeit", + "doNotUpdateMaxZ": "Max Z nicht aktualisieren", + "bitbybit.advanced.navigation.focusFromAngle": "Fokus aus Winkel", + "focusFromAngle": "Fokus aus Winkel", + "bitbybit.advanced.navigation.focusFromAngle_description": "Kamera auf angegebene Netze aus einem bestimmten Winkel mit flüssiger Animation fokussieren. Berechnet das Zentrum der Begrenzungsbox aller Netze und positioniert die Kamera am angegebenen Orientierungsvektor, um auf das Zentrum zu schauen. Funktioniert nur mit ArcRotateCamera. Animation kann unterbrochen werden, wenn mehrmals aufgerufen.", + "padding": "Polsterung", + "shadowRefreshRate": "Schatten-Aktualisierungsrate", + "labelFlipHorizontal": "Beschriftung horizontal spiegeln", + "labelFlipVertical": "Beschriftung vertikal spiegeln", + "bitbybit.advanced.navigation.zoomOnAspect": "Zoom auf Seitenverhältnis", + "zoomOnAspect": "Zoom auf Seitenverhältnis", + "bitbybit.advanced.navigation.zoomOnAspect_description": "Zoomt die Kamera, um die angegebenen Meshes in der Szene mit sanfter Animation anzupassen, unter Berücksichtigung des genauen Bildschirm-Seitenverhältnisses. Im Gegensatz zu zoomOn berechnet diese Methode die Kameraentfernung präzise basierend auf den Viewport-Abmessungen und der Mesh-Begrenzungsbox, um bei padding=0 eine bessere Anpassung zu gewährleisten. Funktioniert nur mit ArcRotateCamera. Animation kann unterbrochen werden, wenn mehrmals aufgerufen." +} diff --git a/languages/en.json b/languages/en.json index 899fcd9ea..3a743775b 100644 --- a/languages/en.json +++ b/languages/en.json @@ -5530,5 +5530,113 @@ "textFontWeight": "text font weight", "textPosition": "text position", "textBackgroundStrokeThickness": "stroke thickness", - "Inputs.Base.topBottomEnum": "Inputs.Base.topBottomEnum" -} \ No newline at end of file + "Inputs.Base.topBottomEnum": "Inputs.Base.topBottomEnum", + "clear": "Clear", + "recompute": "Recompute", + "clear tooltip": "Clear all cache and components", + "recompute tooltip": "Clears cache and recomputes", + "bitbybit.occt.shapes.wire.createIBeamProfileWire": "I beam profile wire", + "createIBeamProfileWire": "I beam profile wire", + "bitbybit.occt.shapes.wire.createIBeamProfileWire_description": "Creates OpenCascade I-beam profile wire", + "beam profiles": "beam profiles", + "webThickness": "web thickness", + "flangeThickness": "flange thickness", + "alignment": "alignment", + "Base.basicAlignmentEnum": "Base.basicAlignmentEnum", + "bitbybit.occt.shapes.wire.createHBeamProfileWire": "H beam profile wire", + "createHBeamProfileWire": "H beam profile wire", + "bitbybit.occt.shapes.wire.createHBeamProfileWire_description": "Creates OpenCascade H-beam profile wire", + "bitbybit.occt.shapes.wire.createTBeamProfileWire": "T beam profile wire", + "createTBeamProfileWire": "T beam profile wire", + "bitbybit.occt.shapes.wire.createTBeamProfileWire_description": "Creates OpenCascade T-beam profile wire", + "bitbybit.occt.shapes.wire.createUBeamProfileWire": "U beam profile wire", + "createUBeamProfileWire": "U beam profile wire", + "bitbybit.occt.shapes.wire.createUBeamProfileWire_description": "Creates OpenCascade U-beam profile wire", + "flangeWidth": "flange width", + "bitbybit.occt.shapes.face.createLPolygonFace": "L polygon face", + "createLPolygonFace": "L polygon face", + "bitbybit.occt.shapes.face.createLPolygonFace_description": "Creates OpenCascade L-polygon face", + "bitbybit.occt.shapes.face.createStarFace": "star face", + "createStarFace": "star face", + "bitbybit.occt.shapes.face.createStarFace_description": "Creates OpenCascade star face", + "bitbybit.occt.shapes.face.createChristmasTreeFace": "christmas tree face", + "createChristmasTreeFace": "christmas tree face", + "bitbybit.occt.shapes.face.createChristmasTreeFace_description": "Creates OpenCascade christmas tree face", + "bitbybit.occt.shapes.face.createParallelogramFace": "parallelogram face", + "createParallelogramFace": "parallelogram face", + "bitbybit.occt.shapes.face.createParallelogramFace_description": "Creates OpenCascade parallelogram face", + "bitbybit.occt.shapes.face.createHeartFace": "heart face", + "createHeartFace": "heart face", + "bitbybit.occt.shapes.face.createHeartFace_description": "Creates OpenCascade heart face", + "bitbybit.occt.shapes.face.createNGonFace": "n-gon face", + "createNGonFace": "n-gon face", + "bitbybit.occt.shapes.face.createNGonFace_description": "Creates OpenCascade n-gon face", + "bitbybit.occt.shapes.face.createIBeamProfileFace": "I beam profile face", + "createIBeamProfileFace": "I beam profile face", + "bitbybit.occt.shapes.face.createIBeamProfileFace_description": "Creates OpenCascade I-beam profile face", + "bitbybit.occt.shapes.face.createHBeamProfileFace": "H beam profile face", + "createHBeamProfileFace": "H beam profile face", + "bitbybit.occt.shapes.face.createHBeamProfileFace_description": "Creates OpenCascade H-beam profile face", + "bitbybit.occt.shapes.face.createTBeamProfileFace": "T beam profile face", + "createTBeamProfileFace": "T beam profile face", + "bitbybit.occt.shapes.face.createTBeamProfileFace_description": "Creates OpenCascade T-beam profile face", + "bitbybit.occt.shapes.face.createUBeamProfileFace": "U beam profile face", + "createUBeamProfileFace": "U beam profile face", + "bitbybit.occt.shapes.face.createUBeamProfileFace_description": "Creates OpenCascade U-beam profile face", + "bitbybit.occt.shapes.solid.createStarSolid": "star solid", + "createStarSolid": "star solid", + "bitbybit.occt.shapes.solid.createStarSolid_description": "Creates OpenCascade star solid", + "extrusionLengthFront": "extrusion length front", + "extrusionLengthBack": "extrusion length back", + "bitbybit.occt.shapes.solid.createNGonSolid": "n-gon solid", + "createNGonSolid": "n-gon solid", + "bitbybit.occt.shapes.solid.createNGonSolid_description": "Creates OpenCascade n-gon solid", + "bitbybit.occt.shapes.solid.createParallelogramSolid": "parallelogram solid", + "createParallelogramSolid": "parallelogram solid", + "bitbybit.occt.shapes.solid.createParallelogramSolid_description": "Creates OpenCascade parallelogram solid", + "bitbybit.occt.shapes.solid.createHeartSolid": "heart solid", + "createHeartSolid": "heart solid", + "bitbybit.occt.shapes.solid.createHeartSolid_description": "Creates OpenCascade heart solid", + "bitbybit.occt.shapes.solid.createChristmasTreeSolid": "christmas tree solid", + "createChristmasTreeSolid": "christmas tree solid", + "bitbybit.occt.shapes.solid.createChristmasTreeSolid_description": "Creates OpenCascade christmas tree solid", + "bitbybit.occt.shapes.solid.createLPolygonSolid": "L polygon solid", + "createLPolygonSolid": "L polygon solid", + "bitbybit.occt.shapes.solid.createLPolygonSolid_description": "Creates OpenCascade L-polygon solid", + "bitbybit.occt.shapes.solid.createIBeamProfileSolid": "I beam profile solid", + "createIBeamProfileSolid": "I beam profile solid", + "bitbybit.occt.shapes.solid.createIBeamProfileSolid_description": "Creates OpenCascade I-beam profile solid", + "beam": "beam", + "bitbybit.occt.shapes.solid.createHBeamProfileSolid": "H beam profile solid", + "createHBeamProfileSolid": "H beam profile solid", + "bitbybit.occt.shapes.solid.createHBeamProfileSolid_description": "Creates OpenCascade H-beam profile solid", + "bitbybit.occt.shapes.solid.createTBeamProfileSolid": "T beam profile solid", + "createTBeamProfileSolid": "T beam profile solid", + "bitbybit.occt.shapes.solid.createTBeamProfileSolid_description": "Creates OpenCascade T-beam profile solid", + "bitbybit.occt.shapes.solid.createUBeamProfileSolid": "U beam profile solid", + "createUBeamProfileSolid": "U beam profile solid", + "bitbybit.occt.shapes.solid.createUBeamProfileSolid_description": "Creates OpenCascade U-beam profile solid", + "endType": "end type", + "dimensionEndTypeEnum": "dimensionEndTypeEnum", + "arrowAngle": "arrow angle", + "arrowsFlipped": "arrows flipped", + "colorFormat": "color format", + "dxfColorFormatEnum": "dxfColorFormatEnum", + "acadVersion": "acad version", + "dxfAcadVersionEnum": "dxfAcadVersionEnum", + "bitbybit.advanced.navigation.zoomOn": "zoom on", + "zoomOn": "zoom on", + "bitbybit.advanced.navigation.zoomOn_description": "Zoom camera to fit specified meshes in the scene with smooth animation. Works only with ArcRotateCamera. Animation can be interrupted if called multiple times.", + "animationSpeed": "animation speed", + "doNotUpdateMaxZ": "do not update max z", + "bitbybit.advanced.navigation.focusFromAngle": "focus from angle", + "focusFromAngle": "focus from angle", + "bitbybit.advanced.navigation.focusFromAngle_description": "Focus camera on specified meshes from a specific angle with smooth animation. Computes the center of the bounding box of all meshes and positions the camera at the specified orientation vector to look at the center. Works only with ArcRotateCamera. Animation can be interrupted if called multiple times.", + "padding": "padding", + "shadowRefreshRate": "shadow refresh rate", + "labelFlipHorizontal": "label flip horizontal", + "labelFlipVertical": "label flip vertical", + "bitbybit.advanced.navigation.zoomOnAspect": "zoom on aspect", + "zoomOnAspect": "zoom on aspect", + "bitbybit.advanced.navigation.zoomOnAspect_description": "Zoom camera to fit specified meshes in the scene with smooth animation, considering exact screen aspect ratio. Unlike zoomOn, this method precisely calculates camera distance based on viewport dimensions and mesh bounding box to ensure better fit at padding=0. Works only with ArcRotateCamera. Animation can be interrupted if called multiple times." +} diff --git a/languages/es.json b/languages/es.json index 49fbafd75..afd070f23 100644 --- a/languages/es.json +++ b/languages/es.json @@ -5530,5 +5530,113 @@ "textFontWeight": "grosor de fuente de texto", "textPosition": "posición del texto", "textBackgroundStrokeThickness": "grosor del trazo", - "Inputs.Base.topBottomEnum": "Inputs.Base.topBottomEnum" -} \ No newline at end of file + "Inputs.Base.topBottomEnum": "Inputs.Base.topBottomEnum", + "clear": "Borrar", + "recompute": "Recalcular", + "clear tooltip": "Borrar toda la caché y los componentes", + "recompute tooltip": "Borra la caché y recalcula", + "bitbybit.occt.shapes.wire.createIBeamProfileWire": "alambre de perfil de viga I", + "createIBeamProfileWire": "alambre de perfil de viga I", + "bitbybit.occt.shapes.wire.createIBeamProfileWire_description": "Crea alambre de perfil de viga I de OpenCascade", + "beam profiles": "perfiles de vigas", + "webThickness": "espesor del alma", + "flangeThickness": "espesor del ala", + "alignment": "alineación", + "Base.basicAlignmentEnum": "Base.basicAlignmentEnum", + "bitbybit.occt.shapes.wire.createHBeamProfileWire": "alambre de perfil de viga H", + "createHBeamProfileWire": "alambre de perfil de viga H", + "bitbybit.occt.shapes.wire.createHBeamProfileWire_description": "Crea alambre de perfil de viga H de OpenCascade", + "bitbybit.occt.shapes.wire.createTBeamProfileWire": "alambre de perfil de viga T", + "createTBeamProfileWire": "alambre de perfil de viga T", + "bitbybit.occt.shapes.wire.createTBeamProfileWire_description": "Crea alambre de perfil de viga T de OpenCascade", + "bitbybit.occt.shapes.wire.createUBeamProfileWire": "alambre de perfil de viga U", + "createUBeamProfileWire": "alambre de perfil de viga U", + "bitbybit.occt.shapes.wire.createUBeamProfileWire_description": "Crea alambre de perfil de viga U de OpenCascade", + "flangeWidth": "ancho del ala", + "bitbybit.occt.shapes.face.createLPolygonFace": "cara de polígono L", + "createLPolygonFace": "cara de polígono L", + "bitbybit.occt.shapes.face.createLPolygonFace_description": "Crea cara de polígono L de OpenCascade", + "bitbybit.occt.shapes.face.createStarFace": "cara de estrella", + "createStarFace": "cara de estrella", + "bitbybit.occt.shapes.face.createStarFace_description": "Crea cara de estrella de OpenCascade", + "bitbybit.occt.shapes.face.createChristmasTreeFace": "cara de árbol de navidad", + "createChristmasTreeFace": "cara de árbol de navidad", + "bitbybit.occt.shapes.face.createChristmasTreeFace_description": "Crea cara de árbol de navidad de OpenCascade", + "bitbybit.occt.shapes.face.createParallelogramFace": "cara de paralelogramo", + "createParallelogramFace": "cara de paralelogramo", + "bitbybit.occt.shapes.face.createParallelogramFace_description": "Crea cara de paralelogramo de OpenCascade", + "bitbybit.occt.shapes.face.createHeartFace": "cara de corazón", + "createHeartFace": "cara de corazón", + "bitbybit.occt.shapes.face.createHeartFace_description": "Crea cara de corazón de OpenCascade", + "bitbybit.occt.shapes.face.createNGonFace": "cara de n-gono", + "createNGonFace": "cara de n-gono", + "bitbybit.occt.shapes.face.createNGonFace_description": "Crea cara de n-gono de OpenCascade", + "bitbybit.occt.shapes.face.createIBeamProfileFace": "cara de perfil de viga I", + "createIBeamProfileFace": "cara de perfil de viga I", + "bitbybit.occt.shapes.face.createIBeamProfileFace_description": "Crea cara de perfil de viga I de OpenCascade", + "bitbybit.occt.shapes.face.createHBeamProfileFace": "cara de perfil de viga H", + "createHBeamProfileFace": "cara de perfil de viga H", + "bitbybit.occt.shapes.face.createHBeamProfileFace_description": "Crea cara de perfil de viga H de OpenCascade", + "bitbybit.occt.shapes.face.createTBeamProfileFace": "cara de perfil de viga T", + "createTBeamProfileFace": "cara de perfil de viga T", + "bitbybit.occt.shapes.face.createTBeamProfileFace_description": "Crea cara de perfil de viga T de OpenCascade", + "bitbybit.occt.shapes.face.createUBeamProfileFace": "cara de perfil de viga U", + "createUBeamProfileFace": "cara de perfil de viga U", + "bitbybit.occt.shapes.face.createUBeamProfileFace_description": "Crea cara de perfil de viga U de OpenCascade", + "bitbybit.occt.shapes.solid.createStarSolid": "sólido de estrella", + "createStarSolid": "sólido de estrella", + "bitbybit.occt.shapes.solid.createStarSolid_description": "Crea sólido de estrella de OpenCascade", + "extrusionLengthFront": "longitud de extrusión frontal", + "extrusionLengthBack": "longitud de extrusión trasera", + "bitbybit.occt.shapes.solid.createNGonSolid": "sólido de n-gono", + "createNGonSolid": "sólido de n-gono", + "bitbybit.occt.shapes.solid.createNGonSolid_description": "Crea sólido de n-gono de OpenCascade", + "bitbybit.occt.shapes.solid.createParallelogramSolid": "sólido de paralelogramo", + "createParallelogramSolid": "sólido de paralelogramo", + "bitbybit.occt.shapes.solid.createParallelogramSolid_description": "Crea sólido de paralelogramo de OpenCascade", + "bitbybit.occt.shapes.solid.createHeartSolid": "sólido de corazón", + "createHeartSolid": "sólido de corazón", + "bitbybit.occt.shapes.solid.createHeartSolid_description": "Crea sólido de corazón de OpenCascade", + "bitbybit.occt.shapes.solid.createChristmasTreeSolid": "sólido de árbol de navidad", + "createChristmasTreeSolid": "sólido de árbol de navidad", + "bitbybit.occt.shapes.solid.createChristmasTreeSolid_description": "Crea sólido de árbol de navidad de OpenCascade", + "bitbybit.occt.shapes.solid.createLPolygonSolid": "sólido de polígono L", + "createLPolygonSolid": "sólido de polígono L", + "bitbybit.occt.shapes.solid.createLPolygonSolid_description": "Crea sólido de polígono L de OpenCascade", + "bitbybit.occt.shapes.solid.createIBeamProfileSolid": "sólido de perfil de viga I", + "createIBeamProfileSolid": "sólido de perfil de viga I", + "bitbybit.occt.shapes.solid.createIBeamProfileSolid_description": "Crea sólido de perfil de viga I de OpenCascade", + "beam": "viga", + "bitbybit.occt.shapes.solid.createHBeamProfileSolid": "sólido de perfil de viga H", + "createHBeamProfileSolid": "sólido de perfil de viga H", + "bitbybit.occt.shapes.solid.createHBeamProfileSolid_description": "Crea sólido de perfil de viga H de OpenCascade", + "bitbybit.occt.shapes.solid.createTBeamProfileSolid": "sólido de perfil de viga T", + "createTBeamProfileSolid": "sólido de perfil de viga T", + "bitbybit.occt.shapes.solid.createTBeamProfileSolid_description": "Crea sólido de perfil de viga T de OpenCascade", + "bitbybit.occt.shapes.solid.createUBeamProfileSolid": "sólido de perfil de viga U", + "createUBeamProfileSolid": "sólido de perfil de viga U", + "bitbybit.occt.shapes.solid.createUBeamProfileSolid_description": "Crea sólido de perfil de viga U de OpenCascade", + "endType": "tipo de extremo", + "dimensionEndTypeEnum": "dimensionEndTypeEnum", + "arrowAngle": "ángulo de flecha", + "arrowsFlipped": "flechas volteadas", + "colorFormat": "formato de color", + "dxfColorFormatEnum": "dxfColorFormatEnum", + "acadVersion": "versión acad", + "dxfAcadVersionEnum": "dxfAcadVersionEnum", + "bitbybit.advanced.navigation.zoomOn": "acercar en", + "zoomOn": "acercar en", + "bitbybit.advanced.navigation.zoomOn_description": "Acerca la cámara para ajustar las mallas especificadas en la escena con animación suave. Solo funciona con ArcRotateCamera. La animación puede interrumpirse si se llama varias veces.", + "animationSpeed": "velocidad de animación", + "doNotUpdateMaxZ": "no actualizar max z", + "bitbybit.advanced.navigation.focusFromAngle": "enfocar desde ángulo", + "focusFromAngle": "enfocar desde ángulo", + "bitbybit.advanced.navigation.focusFromAngle_description": "Enfoca la cámara en las mallas especificadas desde un ángulo específico con animación suave. Calcula el centro del cuadro delimitador de todas las mallas y posiciona la cámara en el vector de orientación especificado para mirar al centro. Solo funciona con ArcRotateCamera. La animación puede interrumpirse si se llama varias veces.", + "padding": "relleno", + "shadowRefreshRate": "Tasa de actualización de sombra", + "labelFlipHorizontal": "Voltear etiqueta horizontalmente", + "labelFlipVertical": "Voltear etiqueta verticalmente", + "bitbybit.advanced.navigation.zoomOnAspect": "Zoom en aspecto", + "zoomOnAspect": "Zoom en aspecto", + "bitbybit.advanced.navigation.zoomOnAspect_description": "Hace zoom en la cámara para ajustar las mallas especificadas en la escena con animación suave, considerando la relación de aspecto exacta de la pantalla. A diferencia de zoomOn, este método calcula con precisión la distancia de la cámara basándose en las dimensiones del viewport y el cuadro delimitador de la malla para garantizar un mejor ajuste con padding=0. Solo funciona con ArcRotateCamera. La animación puede interrumpirse si se llama varias veces." +} diff --git a/languages/fr.json b/languages/fr.json index 07a5f0e3e..f36968055 100644 --- a/languages/fr.json +++ b/languages/fr.json @@ -5530,5 +5530,113 @@ "textFontWeight": "graisse de police de texte", "textPosition": "position du texte", "textBackgroundStrokeThickness": "épaisseur du trait", - "Inputs.Base.topBottomEnum": "Inputs.Base.topBottomEnum" -} \ No newline at end of file + "Inputs.Base.topBottomEnum": "Inputs.Base.topBottomEnum", + "clear": "Effacer", + "recompute": "Recalculer", + "clear tooltip": "Effacer tous les caches et composants", + "recompute tooltip": "Efface le cache et recalcule", + "bitbybit.occt.shapes.wire.createIBeamProfileWire": "fil de profil de poutre I", + "createIBeamProfileWire": "fil de profil de poutre I", + "bitbybit.occt.shapes.wire.createIBeamProfileWire_description": "Crée un fil de profil de poutre I OpenCascade", + "beam profiles": "profils de poutres", + "webThickness": "épaisseur de l'âme", + "flangeThickness": "épaisseur de la semelle", + "alignment": "alignement", + "Base.basicAlignmentEnum": "Base.basicAlignmentEnum", + "bitbybit.occt.shapes.wire.createHBeamProfileWire": "fil de profil de poutre H", + "createHBeamProfileWire": "fil de profil de poutre H", + "bitbybit.occt.shapes.wire.createHBeamProfileWire_description": "Crée un fil de profil de poutre H OpenCascade", + "bitbybit.occt.shapes.wire.createTBeamProfileWire": "fil de profil de poutre T", + "createTBeamProfileWire": "fil de profil de poutre T", + "bitbybit.occt.shapes.wire.createTBeamProfileWire_description": "Crée un fil de profil de poutre T OpenCascade", + "bitbybit.occt.shapes.wire.createUBeamProfileWire": "fil de profil de poutre U", + "createUBeamProfileWire": "fil de profil de poutre U", + "bitbybit.occt.shapes.wire.createUBeamProfileWire_description": "Crée un fil de profil de poutre U OpenCascade", + "flangeWidth": "largeur de la semelle", + "bitbybit.occt.shapes.face.createLPolygonFace": "face de polygone L", + "createLPolygonFace": "face de polygone L", + "bitbybit.occt.shapes.face.createLPolygonFace_description": "Crée une face de polygone L OpenCascade", + "bitbybit.occt.shapes.face.createStarFace": "face d'étoile", + "createStarFace": "face d'étoile", + "bitbybit.occt.shapes.face.createStarFace_description": "Crée une face d'étoile OpenCascade", + "bitbybit.occt.shapes.face.createChristmasTreeFace": "face de sapin de Noël", + "createChristmasTreeFace": "face de sapin de Noël", + "bitbybit.occt.shapes.face.createChristmasTreeFace_description": "Crée une face de sapin de Noël OpenCascade", + "bitbybit.occt.shapes.face.createParallelogramFace": "face de parallélogramme", + "createParallelogramFace": "face de parallélogramme", + "bitbybit.occt.shapes.face.createParallelogramFace_description": "Crée une face de parallélogramme OpenCascade", + "bitbybit.occt.shapes.face.createHeartFace": "face de cœur", + "createHeartFace": "face de cœur", + "bitbybit.occt.shapes.face.createHeartFace_description": "Crée une face de cœur OpenCascade", + "bitbybit.occt.shapes.face.createNGonFace": "face de n-gone", + "createNGonFace": "face de n-gone", + "bitbybit.occt.shapes.face.createNGonFace_description": "Crée une face de n-gone OpenCascade", + "bitbybit.occt.shapes.face.createIBeamProfileFace": "face de profil de poutre I", + "createIBeamProfileFace": "face de profil de poutre I", + "bitbybit.occt.shapes.face.createIBeamProfileFace_description": "Crée une face de profil de poutre I OpenCascade", + "bitbybit.occt.shapes.face.createHBeamProfileFace": "face de profil de poutre H", + "createHBeamProfileFace": "face de profil de poutre H", + "bitbybit.occt.shapes.face.createHBeamProfileFace_description": "Crée une face de profil de poutre H OpenCascade", + "bitbybit.occt.shapes.face.createTBeamProfileFace": "face de profil de poutre T", + "createTBeamProfileFace": "face de profil de poutre T", + "bitbybit.occt.shapes.face.createTBeamProfileFace_description": "Crée une face de profil de poutre T OpenCascade", + "bitbybit.occt.shapes.face.createUBeamProfileFace": "face de profil de poutre U", + "createUBeamProfileFace": "face de profil de poutre U", + "bitbybit.occt.shapes.face.createUBeamProfileFace_description": "Crée une face de profil de poutre U OpenCascade", + "bitbybit.occt.shapes.solid.createStarSolid": "solide d'étoile", + "createStarSolid": "solide d'étoile", + "bitbybit.occt.shapes.solid.createStarSolid_description": "Crée un solide d'étoile OpenCascade", + "extrusionLengthFront": "longueur d'extrusion avant", + "extrusionLengthBack": "longueur d'extrusion arrière", + "bitbybit.occt.shapes.solid.createNGonSolid": "solide de n-gone", + "createNGonSolid": "solide de n-gone", + "bitbybit.occt.shapes.solid.createNGonSolid_description": "Crée un solide de n-gone OpenCascade", + "bitbybit.occt.shapes.solid.createParallelogramSolid": "solide de parallélogramme", + "createParallelogramSolid": "solide de parallélogramme", + "bitbybit.occt.shapes.solid.createParallelogramSolid_description": "Crée un solide de parallélogramme OpenCascade", + "bitbybit.occt.shapes.solid.createHeartSolid": "solide de cœur", + "createHeartSolid": "solide de cœur", + "bitbybit.occt.shapes.solid.createHeartSolid_description": "Crée un solide de cœur OpenCascade", + "bitbybit.occt.shapes.solid.createChristmasTreeSolid": "solide de sapin de Noël", + "createChristmasTreeSolid": "solide de sapin de Noël", + "bitbybit.occt.shapes.solid.createChristmasTreeSolid_description": "Crée un solide de sapin de Noël OpenCascade", + "bitbybit.occt.shapes.solid.createLPolygonSolid": "solide de polygone L", + "createLPolygonSolid": "solide de polygone L", + "bitbybit.occt.shapes.solid.createLPolygonSolid_description": "Crée un solide de polygone L OpenCascade", + "bitbybit.occt.shapes.solid.createIBeamProfileSolid": "solide de profil de poutre I", + "createIBeamProfileSolid": "solide de profil de poutre I", + "bitbybit.occt.shapes.solid.createIBeamProfileSolid_description": "Crée un solide de profil de poutre I OpenCascade", + "beam": "poutre", + "bitbybit.occt.shapes.solid.createHBeamProfileSolid": "solide de profil de poutre H", + "createHBeamProfileSolid": "solide de profil de poutre H", + "bitbybit.occt.shapes.solid.createHBeamProfileSolid_description": "Crée un solide de profil de poutre H OpenCascade", + "bitbybit.occt.shapes.solid.createTBeamProfileSolid": "solide de profil de poutre T", + "createTBeamProfileSolid": "solide de profil de poutre T", + "bitbybit.occt.shapes.solid.createTBeamProfileSolid_description": "Crée un solide de profil de poutre T OpenCascade", + "bitbybit.occt.shapes.solid.createUBeamProfileSolid": "solide de profil de poutre U", + "createUBeamProfileSolid": "solide de profil de poutre U", + "bitbybit.occt.shapes.solid.createUBeamProfileSolid_description": "Crée un solide de profil de poutre U OpenCascade", + "endType": "type d'extrémité", + "dimensionEndTypeEnum": "dimensionEndTypeEnum", + "arrowAngle": "angle de flèche", + "arrowsFlipped": "flèches inversées", + "colorFormat": "format de couleur", + "dxfColorFormatEnum": "dxfColorFormatEnum", + "acadVersion": "version acad", + "dxfAcadVersionEnum": "dxfAcadVersionEnum", + "bitbybit.advanced.navigation.zoomOn": "zoomer sur", + "zoomOn": "zoomer sur", + "bitbybit.advanced.navigation.zoomOn_description": "Zoome la caméra pour ajuster les maillages spécifiés dans la scène avec animation fluide. Fonctionne uniquement avec ArcRotateCamera. L'animation peut être interrompue si appelée plusieurs fois.", + "animationSpeed": "vitesse d'animation", + "doNotUpdateMaxZ": "ne pas mettre à jour max z", + "bitbybit.advanced.navigation.focusFromAngle": "focaliser depuis angle", + "focusFromAngle": "focaliser depuis angle", + "bitbybit.advanced.navigation.focusFromAngle_description": "Focalise la caméra sur les maillages spécifiés depuis un angle spécifique avec animation fluide. Calcule le centre de la boîte englobante de tous les maillages et positionne la caméra au vecteur d'orientation spécifié pour regarder le centre. Fonctionne uniquement avec ArcRotateCamera. L'animation peut être interrompue si appelée plusieurs fois.", + "padding": "espacement", + "shadowRefreshRate": "Taux de rafraîchissement de l'ombre", + "labelFlipHorizontal": "Retourner l'étiquette horizontalement", + "labelFlipVertical": "Retourner l'étiquette verticalement", + "bitbybit.advanced.navigation.zoomOnAspect": "Zoom sur l'aspect", + "zoomOnAspect": "Zoom sur l'aspect", + "bitbybit.advanced.navigation.zoomOnAspect_description": "Zoome la caméra pour ajuster les maillages spécifiés dans la scène avec une animation fluide, en tenant compte du rapport d'aspect exact de l'écran. Contrairement à zoomOn, cette méthode calcule précisément la distance de la caméra en fonction des dimensions de la fenêtre d'affichage et de la boîte englobante du maillage pour assurer un meilleur ajustement à padding=0. Fonctionne uniquement avec ArcRotateCamera. L'animation peut être interrompue si appelée plusieurs fois." +} diff --git a/languages/hi.json b/languages/hi.json index 67c8f1c0c..9b02ba466 100644 --- a/languages/hi.json +++ b/languages/hi.json @@ -5530,5 +5530,113 @@ "textFontWeight": "टेक्स्ट फ़ॉन्ट वेट", "textPosition": "टेक्स्ट स्थिति", "textBackgroundStrokeThickness": "स्ट्रोक मोटाई", - "Inputs.Base.topBottomEnum": "Inputs.Base.topBottomEnum" -} \ No newline at end of file + "Inputs.Base.topBottomEnum": "Inputs.Base.topBottomEnum", + "clear": "साफ़ करें", + "recompute": "फिर से गणना करें", + "clear tooltip": "सभी कैश और घटकों को साफ़ करें", + "recompute tooltip": "कैश को साफ़ करता है और फिर से गणना करता है", + "bitbybit.occt.shapes.wire.createIBeamProfileWire": "I-बीम प्रोफाइल तार", + "createIBeamProfileWire": "I-बीम प्रोफाइल तार", + "bitbybit.occt.shapes.wire.createIBeamProfileWire_description": "OpenCascade I-बीम प्रोफाइल तार बनाता है", + "beam profiles": "बीम प्रोफाइल", + "webThickness": "वेब मोटाई", + "flangeThickness": "फ्लैंज मोटाई", + "alignment": "संरेखण", + "Base.basicAlignmentEnum": "Base.basicAlignmentEnum", + "bitbybit.occt.shapes.wire.createHBeamProfileWire": "H-बीम प्रोफाइल तार", + "createHBeamProfileWire": "H-बीम प्रोफाइल तार", + "bitbybit.occt.shapes.wire.createHBeamProfileWire_description": "OpenCascade H-बीम प्रोफाइल तार बनाता है", + "bitbybit.occt.shapes.wire.createTBeamProfileWire": "T-बीम प्रोफाइल तार", + "createTBeamProfileWire": "T-बीम प्रोफाइल तार", + "bitbybit.occt.shapes.wire.createTBeamProfileWire_description": "OpenCascade T-बीम प्रोफाइल तार बनाता है", + "bitbybit.occt.shapes.wire.createUBeamProfileWire": "U-बीम प्रोफाइल तार", + "createUBeamProfileWire": "U-बीम प्रोफाइल तार", + "bitbybit.occt.shapes.wire.createUBeamProfileWire_description": "OpenCascade U-बीम प्रोफाइल तार बनाता है", + "flangeWidth": "फ्लैंज चौड़ाई", + "bitbybit.occt.shapes.face.createLPolygonFace": "L बहुभुज फलक", + "createLPolygonFace": "L बहुभुज फलक", + "bitbybit.occt.shapes.face.createLPolygonFace_description": "OpenCascade L-बहुभुज फलक बनाता है", + "bitbybit.occt.shapes.face.createStarFace": "तारा फलक", + "createStarFace": "तारा फलक", + "bitbybit.occt.shapes.face.createStarFace_description": "OpenCascade तारा फलक बनाता है", + "bitbybit.occt.shapes.face.createChristmasTreeFace": "क्रिसमस ट्री फलक", + "createChristmasTreeFace": "क्रिसमस ट्री फलक", + "bitbybit.occt.shapes.face.createChristmasTreeFace_description": "OpenCascade क्रिसमस ट्री फलक बनाता है", + "bitbybit.occt.shapes.face.createParallelogramFace": "समांतर चतुर्भुज फलक", + "createParallelogramFace": "समांतर चतुर्भुज फलक", + "bitbybit.occt.shapes.face.createParallelogramFace_description": "OpenCascade समांतर चतुर्भुज फलक बनाता है", + "bitbybit.occt.shapes.face.createHeartFace": "हृदय फलक", + "createHeartFace": "हृदय फलक", + "bitbybit.occt.shapes.face.createHeartFace_description": "OpenCascade हृदय फलक बनाता है", + "bitbybit.occt.shapes.face.createNGonFace": "n-भुज फलक", + "createNGonFace": "n-भुज फलक", + "bitbybit.occt.shapes.face.createNGonFace_description": "OpenCascade n-भुज फलक बनाता है", + "bitbybit.occt.shapes.face.createIBeamProfileFace": "I-बीम प्रोफाइल फलक", + "createIBeamProfileFace": "I-बीम प्रोफाइल फलक", + "bitbybit.occt.shapes.face.createIBeamProfileFace_description": "OpenCascade I-बीम प्रोफाइल फलक बनाता है", + "bitbybit.occt.shapes.face.createHBeamProfileFace": "H-बीम प्रोफाइल फलक", + "createHBeamProfileFace": "H-बीम प्रोफाइल फलक", + "bitbybit.occt.shapes.face.createHBeamProfileFace_description": "OpenCascade H-बीम प्रोफाइल फलक बनाता है", + "bitbybit.occt.shapes.face.createTBeamProfileFace": "T-बीम प्रोफाइल फलक", + "createTBeamProfileFace": "T-बीम प्रोफाइल फलक", + "bitbybit.occt.shapes.face.createTBeamProfileFace_description": "OpenCascade T-बीम प्रोफाइल फलक बनाता है", + "bitbybit.occt.shapes.face.createUBeamProfileFace": "U-बीम प्रोफाइल फलक", + "createUBeamProfileFace": "U-बीम प्रोफाइल फलक", + "bitbybit.occt.shapes.face.createUBeamProfileFace_description": "OpenCascade U-बीम प्रोफाइल फलक बनाता है", + "bitbybit.occt.shapes.solid.createStarSolid": "तारा ठोस", + "createStarSolid": "तारा ठोस", + "bitbybit.occt.shapes.solid.createStarSolid_description": "OpenCascade तारा ठोस बनाता है", + "extrusionLengthFront": "अग्र एक्सट्रूज़न लंबाई", + "extrusionLengthBack": "पश्च एक्सट्रूज़न लंबाई", + "bitbybit.occt.shapes.solid.createNGonSolid": "n-भुज ठोस", + "createNGonSolid": "n-भुज ठोस", + "bitbybit.occt.shapes.solid.createNGonSolid_description": "OpenCascade n-भुज ठोस बनाता है", + "bitbybit.occt.shapes.solid.createParallelogramSolid": "समांतर चतुर्भुज ठोस", + "createParallelogramSolid": "समांतर चतुर्भुज ठोस", + "bitbybit.occt.shapes.solid.createParallelogramSolid_description": "OpenCascade समांतर चतुर्भुज ठोस बनाता है", + "bitbybit.occt.shapes.solid.createHeartSolid": "हृदय ठोस", + "createHeartSolid": "हृदय ठोस", + "bitbybit.occt.shapes.solid.createHeartSolid_description": "OpenCascade हृदय ठोस बनाता है", + "bitbybit.occt.shapes.solid.createChristmasTreeSolid": "क्रिसमस ट्री ठोस", + "createChristmasTreeSolid": "क्रिसमस ट्री ठोस", + "bitbybit.occt.shapes.solid.createChristmasTreeSolid_description": "OpenCascade क्रिसमस ट्री ठोस बनाता है", + "bitbybit.occt.shapes.solid.createLPolygonSolid": "L बहुभुज ठोस", + "createLPolygonSolid": "L बहुभुज ठोस", + "bitbybit.occt.shapes.solid.createLPolygonSolid_description": "OpenCascade L-बहुभुज ठोस बनाता है", + "bitbybit.occt.shapes.solid.createIBeamProfileSolid": "I-बीम प्रोफाइल ठोस", + "createIBeamProfileSolid": "I-बीम प्रोफाइल ठोस", + "bitbybit.occt.shapes.solid.createIBeamProfileSolid_description": "OpenCascade I-बीम प्रोफाइल ठोस बनाता है", + "beam": "बीम", + "bitbybit.occt.shapes.solid.createHBeamProfileSolid": "H-बीम प्रोफाइल ठोस", + "createHBeamProfileSolid": "H-बीम प्रोफाइल ठोस", + "bitbybit.occt.shapes.solid.createHBeamProfileSolid_description": "OpenCascade H-बीम प्रोफाइल ठोस बनाता है", + "bitbybit.occt.shapes.solid.createTBeamProfileSolid": "T-बीम प्रोफाइल ठोस", + "createTBeamProfileSolid": "T-बीम प्रोफाइल ठोस", + "bitbybit.occt.shapes.solid.createTBeamProfileSolid_description": "OpenCascade T-बीम प्रोफाइल ठोस बनाता है", + "bitbybit.occt.shapes.solid.createUBeamProfileSolid": "U-बीम प्रोफाइल ठोस", + "createUBeamProfileSolid": "U-बीम प्रोफाइल ठोस", + "bitbybit.occt.shapes.solid.createUBeamProfileSolid_description": "OpenCascade U-बीम प्रोफाइल ठोस बनाता है", + "endType": "अंत प्रकार", + "dimensionEndTypeEnum": "dimensionEndTypeEnum", + "arrowAngle": "तीर कोण", + "arrowsFlipped": "तीर पलटे गए", + "colorFormat": "रंग प्रारूप", + "dxfColorFormatEnum": "dxfColorFormatEnum", + "acadVersion": "एकेड संस्करण", + "dxfAcadVersionEnum": "dxfAcadVersionEnum", + "bitbybit.advanced.navigation.zoomOn": "ज़ूम ऑन", + "zoomOn": "ज़ूम ऑन", + "bitbybit.advanced.navigation.zoomOn_description": "सुगम एनीमेशन के साथ दृश्य में निर्दिष्ट मेश को फिट करने के लिए कैमरा ज़ूम करें। केवल ArcRotateCamera के साथ काम करता है। यदि कई बार कॉल किया जाए तो एनीमेशन बाधित हो सकता है।", + "animationSpeed": "एनीमेशन गति", + "doNotUpdateMaxZ": "अधिकतम z अपडेट न करें", + "bitbybit.advanced.navigation.focusFromAngle": "कोण से फोकस करें", + "focusFromAngle": "कोण से फोकस करें", + "bitbybit.advanced.navigation.focusFromAngle_description": "सुगम एनीमेशन के साथ एक विशिष्ट कोण से निर्दिष्ट मेश पर कैमरा फोकस करें। सभी मेश के बाउंडिंग बॉक्स के केंद्र की गणना करता है और केंद्र को देखने के लिए निर्दिष्ट अभिविन्यास वेक्टर पर कैमरा स्थित करता है। केवल ArcRotateCamera के साथ काम करता है। यदि कई बार कॉल किया जाए तो एनीमेशन बाधित हो सकता है।", + "padding": "पैडिंग", + "shadowRefreshRate": "छाया रिफ्रेश दर", + "labelFlipHorizontal": "लेबल क्षैतिज रूप से फ्लिप करें", + "labelFlipVertical": "लेबल लंबवत रूप से फ्लिप करें", + "bitbybit.advanced.navigation.zoomOnAspect": "पहलू पर ज़ूम करें", + "zoomOnAspect": "पहलू पर ज़ूम करें", + "bitbybit.advanced.navigation.zoomOnAspect_description": "सटीक स्क्रीन आस्पेक्ट अनुपात को ध्यान में रखते हुए, सुचारू एनिमेशन के साथ दृश्य में निर्दिष्ट मेश को फिट करने के लिए कैमरा ज़ूम करें। zoomOn के विपरीत, यह विधि व्यूपोर्ट आयामों और मेश बाउंडिंग बॉक्स के आधार पर कैमरा दूरी की सटीक गणना करती है ताकि padding=0 पर बेहतर फिट सुनिश्चित हो सके। केवल ArcRotateCamera के साथ काम करता है। यदि कई बार कॉल किया जाता है तो एनिमेशन बाधित हो सकता है।" +} diff --git a/languages/id.json b/languages/id.json index 2e1253b53..89494625f 100644 --- a/languages/id.json +++ b/languages/id.json @@ -5530,5 +5530,113 @@ "textFontWeight": "ketebalan font teks", "textPosition": "posisi teks", "textBackgroundStrokeThickness": "ketebalan garis", - "Inputs.Base.topBottomEnum": "Inputs.Base.topBottomEnum" -} \ No newline at end of file + "Inputs.Base.topBottomEnum": "Inputs.Base.topBottomEnum", + "clear": "Bersihkan", + "recompute": "Hitung Ulang", + "clear tooltip": "Bersihkan semua cache dan komponen", + "recompute tooltip": "Menghapus cache dan menghitung ulang", + "bitbybit.occt.shapes.wire.createIBeamProfileWire": "kawat profil balok I", + "createIBeamProfileWire": "kawat profil balok I", + "bitbybit.occt.shapes.wire.createIBeamProfileWire_description": "Membuat kawat profil balok I OpenCascade", + "beam profiles": "profil balok", + "webThickness": "ketebalan badan", + "flangeThickness": "ketebalan flensa", + "alignment": "perataan", + "Base.basicAlignmentEnum": "Base.basicAlignmentEnum", + "bitbybit.occt.shapes.wire.createHBeamProfileWire": "kawat profil balok H", + "createHBeamProfileWire": "kawat profil balok H", + "bitbybit.occt.shapes.wire.createHBeamProfileWire_description": "Membuat kawat profil balok H OpenCascade", + "bitbybit.occt.shapes.wire.createTBeamProfileWire": "kawat profil balok T", + "createTBeamProfileWire": "kawat profil balok T", + "bitbybit.occt.shapes.wire.createTBeamProfileWire_description": "Membuat kawat profil balok T OpenCascade", + "bitbybit.occt.shapes.wire.createUBeamProfileWire": "kawat profil balok U", + "createUBeamProfileWire": "kawat profil balok U", + "bitbybit.occt.shapes.wire.createUBeamProfileWire_description": "Membuat kawat profil balok U OpenCascade", + "flangeWidth": "lebar flensa", + "bitbybit.occt.shapes.face.createLPolygonFace": "permukaan poligon L", + "createLPolygonFace": "permukaan poligon L", + "bitbybit.occt.shapes.face.createLPolygonFace_description": "Membuat permukaan poligon L OpenCascade", + "bitbybit.occt.shapes.face.createStarFace": "permukaan bintang", + "createStarFace": "permukaan bintang", + "bitbybit.occt.shapes.face.createStarFace_description": "Membuat permukaan bintang OpenCascade", + "bitbybit.occt.shapes.face.createChristmasTreeFace": "permukaan pohon natal", + "createChristmasTreeFace": "permukaan pohon natal", + "bitbybit.occt.shapes.face.createChristmasTreeFace_description": "Membuat permukaan pohon natal OpenCascade", + "bitbybit.occt.shapes.face.createParallelogramFace": "permukaan jajaran genjang", + "createParallelogramFace": "permukaan jajaran genjang", + "bitbybit.occt.shapes.face.createParallelogramFace_description": "Membuat permukaan jajaran genjang OpenCascade", + "bitbybit.occt.shapes.face.createHeartFace": "permukaan hati", + "createHeartFace": "permukaan hati", + "bitbybit.occt.shapes.face.createHeartFace_description": "Membuat permukaan hati OpenCascade", + "bitbybit.occt.shapes.face.createNGonFace": "permukaan n-sudut", + "createNGonFace": "permukaan n-sudut", + "bitbybit.occt.shapes.face.createNGonFace_description": "Membuat permukaan n-sudut OpenCascade", + "bitbybit.occt.shapes.face.createIBeamProfileFace": "permukaan profil balok I", + "createIBeamProfileFace": "permukaan profil balok I", + "bitbybit.occt.shapes.face.createIBeamProfileFace_description": "Membuat permukaan profil balok I OpenCascade", + "bitbybit.occt.shapes.face.createHBeamProfileFace": "permukaan profil balok H", + "createHBeamProfileFace": "permukaan profil balok H", + "bitbybit.occt.shapes.face.createHBeamProfileFace_description": "Membuat permukaan profil balok H OpenCascade", + "bitbybit.occt.shapes.face.createTBeamProfileFace": "permukaan profil balok T", + "createTBeamProfileFace": "permukaan profil balok T", + "bitbybit.occt.shapes.face.createTBeamProfileFace_description": "Membuat permukaan profil balok T OpenCascade", + "bitbybit.occt.shapes.face.createUBeamProfileFace": "permukaan profil balok U", + "createUBeamProfileFace": "permukaan profil balok U", + "bitbybit.occt.shapes.face.createUBeamProfileFace_description": "Membuat permukaan profil balok U OpenCascade", + "bitbybit.occt.shapes.solid.createStarSolid": "padat bintang", + "createStarSolid": "padat bintang", + "bitbybit.occt.shapes.solid.createStarSolid_description": "Membuat padat bintang OpenCascade", + "extrusionLengthFront": "panjang ekstrusi depan", + "extrusionLengthBack": "panjang ekstrusi belakang", + "bitbybit.occt.shapes.solid.createNGonSolid": "padat n-sudut", + "createNGonSolid": "padat n-sudut", + "bitbybit.occt.shapes.solid.createNGonSolid_description": "Membuat padat n-sudut OpenCascade", + "bitbybit.occt.shapes.solid.createParallelogramSolid": "padat jajaran genjang", + "createParallelogramSolid": "padat jajaran genjang", + "bitbybit.occt.shapes.solid.createParallelogramSolid_description": "Membuat padat jajaran genjang OpenCascade", + "bitbybit.occt.shapes.solid.createHeartSolid": "padat hati", + "createHeartSolid": "padat hati", + "bitbybit.occt.shapes.solid.createHeartSolid_description": "Membuat padat hati OpenCascade", + "bitbybit.occt.shapes.solid.createChristmasTreeSolid": "padat pohon natal", + "createChristmasTreeSolid": "padat pohon natal", + "bitbybit.occt.shapes.solid.createChristmasTreeSolid_description": "Membuat padat pohon natal OpenCascade", + "bitbybit.occt.shapes.solid.createLPolygonSolid": "padat poligon L", + "createLPolygonSolid": "padat poligon L", + "bitbybit.occt.shapes.solid.createLPolygonSolid_description": "Membuat padat poligon L OpenCascade", + "bitbybit.occt.shapes.solid.createIBeamProfileSolid": "padat profil balok I", + "createIBeamProfileSolid": "padat profil balok I", + "bitbybit.occt.shapes.solid.createIBeamProfileSolid_description": "Membuat padat profil balok I OpenCascade", + "beam": "balok", + "bitbybit.occt.shapes.solid.createHBeamProfileSolid": "padat profil balok H", + "createHBeamProfileSolid": "padat profil balok H", + "bitbybit.occt.shapes.solid.createHBeamProfileSolid_description": "Membuat padat profil balok H OpenCascade", + "bitbybit.occt.shapes.solid.createTBeamProfileSolid": "padat profil balok T", + "createTBeamProfileSolid": "padat profil balok T", + "bitbybit.occt.shapes.solid.createTBeamProfileSolid_description": "Membuat padat profil balok T OpenCascade", + "bitbybit.occt.shapes.solid.createUBeamProfileSolid": "padat profil balok U", + "createUBeamProfileSolid": "padat profil balok U", + "bitbybit.occt.shapes.solid.createUBeamProfileSolid_description": "Membuat padat profil balok U OpenCascade", + "endType": "tipe ujung", + "dimensionEndTypeEnum": "dimensionEndTypeEnum", + "arrowAngle": "sudut panah", + "arrowsFlipped": "panah dibalik", + "colorFormat": "format warna", + "dxfColorFormatEnum": "dxfColorFormatEnum", + "acadVersion": "versi acad", + "dxfAcadVersionEnum": "dxfAcadVersionEnum", + "bitbybit.advanced.navigation.zoomOn": "perbesar pada", + "zoomOn": "perbesar pada", + "bitbybit.advanced.navigation.zoomOn_description": "Perbesar kamera untuk menyesuaikan mesh yang ditentukan dalam scene dengan animasi halus. Hanya bekerja dengan ArcRotateCamera. Animasi dapat diinterupsi jika dipanggil beberapa kali.", + "animationSpeed": "kecepatan animasi", + "doNotUpdateMaxZ": "jangan perbarui max z", + "bitbybit.advanced.navigation.focusFromAngle": "fokus dari sudut", + "focusFromAngle": "fokus dari sudut", + "bitbybit.advanced.navigation.focusFromAngle_description": "Fokuskan kamera pada mesh yang ditentukan dari sudut tertentu dengan animasi halus. Menghitung pusat kotak pembatas semua mesh dan memposisikan kamera pada vektor orientasi yang ditentukan untuk melihat ke pusat. Hanya bekerja dengan ArcRotateCamera. Animasi dapat diinterupsi jika dipanggil beberapa kali.", + "padding": "padding", + "shadowRefreshRate": "Tingkat penyegaran bayangan", + "labelFlipHorizontal": "Balik label secara horizontal", + "labelFlipVertical": "Balik label secara vertikal", + "bitbybit.advanced.navigation.zoomOnAspect": "Zoom pada aspek", + "zoomOnAspect": "Zoom pada aspek", + "bitbybit.advanced.navigation.zoomOnAspect_description": "Memperbesar kamera untuk menyesuaikan mesh yang ditentukan dalam adegan dengan animasi yang mulus, dengan mempertimbangkan rasio aspek layar yang tepat. Tidak seperti zoomOn, metode ini menghitung jarak kamera secara tepat berdasarkan dimensi viewport dan kotak pembatas mesh untuk memastikan kecocokan yang lebih baik pada padding=0. Hanya berfungsi dengan ArcRotateCamera. Animasi dapat terganggu jika dipanggil beberapa kali." +} diff --git a/languages/lt.json b/languages/lt.json index 7158cf038..3ecf06d93 100644 --- a/languages/lt.json +++ b/languages/lt.json @@ -2506,7 +2506,7 @@ "getShellSurfaceArea": "gauti kevalo paviršiaus plotą", "bitbybit.occt.shapes.shell.getShellSurfaceArea_description": "gauna kevalo paviršiaus plotą", "bitbybit.occt.shapes.solid.fromClosedShell": "iš uždaro kevalo", - "solid": "kietasis kūnas", + "solid": "kūnas", "fromClosedShell": "iš uždaro apvalkalo", "bitbybit.occt.shapes.solid.fromClosedShell_description": "sukuria kietąjį kūną iš uždaro apvalkalo", "bitbybit.occt.shapes.solid.createBox": "dėžė", @@ -5530,5 +5530,113 @@ "textFontWeight": "teksto šrifto storis", "textPosition": "teksto pozicija", "textBackgroundStrokeThickness": "kontūro storis", - "Inputs.Base.topBottomEnum": "Inputs.Base.topBottomEnum" -} \ No newline at end of file + "Inputs.Base.topBottomEnum": "Inputs.Base.topBottomEnum", + "clear": "Išvalyti", + "recompute": "Perskaičiuoti", + "clear tooltip": "Išvalyti visą talpyklą ir komponentus", + "recompute tooltip": "Išvalo talpyklą ir perskaičiuoja", + "bitbybit.occt.shapes.wire.createIBeamProfileWire": "I sijos profilio viela", + "createIBeamProfileWire": "I sijos profilio viela", + "bitbybit.occt.shapes.wire.createIBeamProfileWire_description": "Sukuria OpenCascade I sijos profilio vielą", + "beam profiles": "sijų profiliai", + "webThickness": "sienelės storis", + "flangeThickness": "flanšo storis", + "alignment": "lygiavimas", + "Base.basicAlignmentEnum": "Base.basicAlignmentEnum", + "bitbybit.occt.shapes.wire.createHBeamProfileWire": "H sijos profilio viela", + "createHBeamProfileWire": "H sijos profilio viela", + "bitbybit.occt.shapes.wire.createHBeamProfileWire_description": "Sukuria OpenCascade H sijos profilio vielą", + "bitbybit.occt.shapes.wire.createTBeamProfileWire": "T sijos profilio viela", + "createTBeamProfileWire": "T sijos profilio viela", + "bitbybit.occt.shapes.wire.createTBeamProfileWire_description": "Sukuria OpenCascade T sijos profilio vielą", + "bitbybit.occt.shapes.wire.createUBeamProfileWire": "U sijos profilio viela", + "createUBeamProfileWire": "U sijos profilio viela", + "bitbybit.occt.shapes.wire.createUBeamProfileWire_description": "Sukuria OpenCascade U sijos profilio vielą", + "flangeWidth": "flanšo plotis", + "bitbybit.occt.shapes.face.createLPolygonFace": "L daugiakampio paviršius", + "createLPolygonFace": "L daugiakampio paviršius", + "bitbybit.occt.shapes.face.createLPolygonFace_description": "Sukuria OpenCascade L daugiakampio paviršių", + "bitbybit.occt.shapes.face.createStarFace": "žvaigždės paviršius", + "createStarFace": "žvaigždės paviršius", + "bitbybit.occt.shapes.face.createStarFace_description": "Sukuria OpenCascade žvaigždės paviršių", + "bitbybit.occt.shapes.face.createChristmasTreeFace": "Kalėdų eglutės paviršius", + "createChristmasTreeFace": "Kalėdų eglutės paviršius", + "bitbybit.occt.shapes.face.createChristmasTreeFace_description": "Sukuria OpenCascade Kalėdų eglutės paviršių", + "bitbybit.occt.shapes.face.createParallelogramFace": "lygiagretainio paviršius", + "createParallelogramFace": "lygiagretainio paviršius", + "bitbybit.occt.shapes.face.createParallelogramFace_description": "Sukuria OpenCascade lygiagretainio paviršių", + "bitbybit.occt.shapes.face.createHeartFace": "širdies paviršius", + "createHeartFace": "širdies paviršius", + "bitbybit.occt.shapes.face.createHeartFace_description": "Sukuria OpenCascade širdies paviršių", + "bitbybit.occt.shapes.face.createNGonFace": "n-kampio paviršius", + "createNGonFace": "n-kampio paviršius", + "bitbybit.occt.shapes.face.createNGonFace_description": "Sukuria OpenCascade n-kampio paviršių", + "bitbybit.occt.shapes.face.createIBeamProfileFace": "I sijos profilio paviršius", + "createIBeamProfileFace": "I sijos profilio paviršius", + "bitbybit.occt.shapes.face.createIBeamProfileFace_description": "Sukuria OpenCascade I sijos profilio paviršių", + "bitbybit.occt.shapes.face.createHBeamProfileFace": "H sijos profilio paviršius", + "createHBeamProfileFace": "H sijos profilio paviršius", + "bitbybit.occt.shapes.face.createHBeamProfileFace_description": "Sukuria OpenCascade H sijos profilio paviršių", + "bitbybit.occt.shapes.face.createTBeamProfileFace": "T sijos profilio paviršius", + "createTBeamProfileFace": "T sijos profilio paviršius", + "bitbybit.occt.shapes.face.createTBeamProfileFace_description": "Sukuria OpenCascade T sijos profilio paviršių", + "bitbybit.occt.shapes.face.createUBeamProfileFace": "U sijos profilio paviršius", + "createUBeamProfileFace": "U sijos profilio paviršius", + "bitbybit.occt.shapes.face.createUBeamProfileFace_description": "Sukuria OpenCascade U sijos profilio paviršių", + "bitbybit.occt.shapes.solid.createStarSolid": "žvaigždės kūnas", + "createStarSolid": "žvaigždės kūnas", + "bitbybit.occt.shapes.solid.createStarSolid_description": "Sukuria OpenCascade žvaigždės kūną", + "extrusionLengthFront": "išstūmimo ilgis priekyje", + "extrusionLengthBack": "išstūmimo ilgis gale", + "bitbybit.occt.shapes.solid.createNGonSolid": "n-kampio kūnas", + "createNGonSolid": "n-kampio kūnas", + "bitbybit.occt.shapes.solid.createNGonSolid_description": "Sukuria OpenCascade n-kampio kūną", + "bitbybit.occt.shapes.solid.createParallelogramSolid": "lygiagretainio kūnas", + "createParallelogramSolid": "lygiagretainio kūnas", + "bitbybit.occt.shapes.solid.createParallelogramSolid_description": "Sukuria OpenCascade lygiagretainio kūną", + "bitbybit.occt.shapes.solid.createHeartSolid": "širdies kūnas", + "createHeartSolid": "širdies kūnas", + "bitbybit.occt.shapes.solid.createHeartSolid_description": "Sukuria OpenCascade širdies kūną", + "bitbybit.occt.shapes.solid.createChristmasTreeSolid": "Kalėdų eglutės kūnas", + "createChristmasTreeSolid": "Kalėdų eglutės kūnas", + "bitbybit.occt.shapes.solid.createChristmasTreeSolid_description": "Sukuria OpenCascade Kalėdų eglutės kūną", + "bitbybit.occt.shapes.solid.createLPolygonSolid": "L daugiakampio kūnas", + "createLPolygonSolid": "L daugiakampio kūnas", + "bitbybit.occt.shapes.solid.createLPolygonSolid_description": "Sukuria OpenCascade L daugiakampio kūną", + "bitbybit.occt.shapes.solid.createIBeamProfileSolid": "I sijos profilio kūnas", + "createIBeamProfileSolid": "I sijos profilio kūnas", + "bitbybit.occt.shapes.solid.createIBeamProfileSolid_description": "Sukuria OpenCascade I sijos profilio kūną", + "beam": "sija", + "bitbybit.occt.shapes.solid.createHBeamProfileSolid": "H sijos profilio kūnas", + "createHBeamProfileSolid": "H sijos profilio kūnas", + "bitbybit.occt.shapes.solid.createHBeamProfileSolid_description": "Sukuria OpenCascade H sijos profilio kūną", + "bitbybit.occt.shapes.solid.createTBeamProfileSolid": "T sijos profilio kūnas", + "createTBeamProfileSolid": "T sijos profilio kūnas", + "bitbybit.occt.shapes.solid.createTBeamProfileSolid_description": "Sukuria OpenCascade T sijos profilio kūną", + "bitbybit.occt.shapes.solid.createUBeamProfileSolid": "U sijos profilio kūnas", + "createUBeamProfileSolid": "U sijos profilio kūnas", + "bitbybit.occt.shapes.solid.createUBeamProfileSolid_description": "Sukuria OpenCascade U sijos profilio kūną", + "endType": "galo tipas", + "dimensionEndTypeEnum": "dimensionEndTypeEnum", + "arrowAngle": "rodyklės kampas", + "arrowsFlipped": "rodyklės apverstos", + "colorFormat": "spalvos formatas", + "dxfColorFormatEnum": "dxfColorFormatEnum", + "acadVersion": "acad versija", + "dxfAcadVersionEnum": "dxfAcadVersionEnum", + "bitbybit.advanced.navigation.zoomOn": "priartinti prie", + "zoomOn": "priartinti prie", + "bitbybit.advanced.navigation.zoomOn_description": "Priartina kamerą, kad tilptų nurodyti tinklai scenoje su sklandžia animacija. Veikia tik su ArcRotateCamera. Animacija gali būti nutraukta, jei iškvieičiama kelis kartus.", + "animationSpeed": "animacijos greitis", + "doNotUpdateMaxZ": "neatnaujinti max z", + "bitbybit.advanced.navigation.focusFromAngle": "fokusuoti iš kampo", + "focusFromAngle": "fokusuoti iš kampo", + "bitbybit.advanced.navigation.focusFromAngle_description": "Fokusuoja kamerą į nurodytus tinklus iš specifinio kampo su sklandžia animacija. Apskaičiuoja visų tinklų ribojančios dėžės centrą ir pozicionuoja kamerą nurodytu orientacijos vektoriumi, kad žiūrėtų į centrą. Veikia tik su ArcRotateCamera. Animacija gali būti nutraukta, jei iškvieičiama kelis kartus.", + "padding": "užpildas", + "shadowRefreshRate": "Šešėlio atnaujinimo dažnis", + "labelFlipHorizontal": "Apversti etiketę horizontaliai", + "labelFlipVertical": "Apversti etiketę vertikaliai", + "bitbybit.advanced.navigation.zoomOnAspect": "Priartinti pagal proporcijas", + "zoomOnAspect": "Priartinti pagal proporcijas", + "bitbybit.advanced.navigation.zoomOnAspect_description": "Priartina kamerą, kad tilptų nurodytos tinklinės scenoje su sklandžia animacija, atsižvelgiant į tikslias ekrano proporcijas. Skirtingai nei zoomOn, šis metodas tiksliai apskaičiuoja kameros atstumą pagal peržiūros lango matmenis ir tinklinės ribojančią dėžę, kad užtikrintų geresnį talpinimą esant padding=0. Veikia tik su ArcRotateCamera. Animacija gali būti pertraukta, jei iškviečiama kelis kartus." +} diff --git a/languages/pt.json b/languages/pt.json index d2e49efe0..edce9952e 100644 --- a/languages/pt.json +++ b/languages/pt.json @@ -5530,5 +5530,113 @@ "textFontWeight": "peso da fonte do texto", "textPosition": "posição do texto", "textBackgroundStrokeThickness": "espessura do traço", - "Inputs.Base.topBottomEnum": "Inputs.Base.topBottomEnum" -} \ No newline at end of file + "Inputs.Base.topBottomEnum": "Inputs.Base.topBottomEnum", + "clear": "Limpar", + "recompute": "Recalcular", + "clear tooltip": "Limpar todos os caches e componentes", + "recompute tooltip": "Limpa o cache e recalcula", + "bitbybit.occt.shapes.wire.createIBeamProfileWire": "fio de perfil de viga I", + "createIBeamProfileWire": "fio de perfil de viga I", + "bitbybit.occt.shapes.wire.createIBeamProfileWire_description": "Cria fio de perfil de viga I do OpenCascade", + "beam profiles": "perfis de vigas", + "webThickness": "espessura da alma", + "flangeThickness": "espessura do flange", + "alignment": "alinhamento", + "Base.basicAlignmentEnum": "Base.basicAlignmentEnum", + "bitbybit.occt.shapes.wire.createHBeamProfileWire": "fio de perfil de viga H", + "createHBeamProfileWire": "fio de perfil de viga H", + "bitbybit.occt.shapes.wire.createHBeamProfileWire_description": "Cria fio de perfil de viga H do OpenCascade", + "bitbybit.occt.shapes.wire.createTBeamProfileWire": "fio de perfil de viga T", + "createTBeamProfileWire": "fio de perfil de viga T", + "bitbybit.occt.shapes.wire.createTBeamProfileWire_description": "Cria fio de perfil de viga T do OpenCascade", + "bitbybit.occt.shapes.wire.createUBeamProfileWire": "fio de perfil de viga U", + "createUBeamProfileWire": "fio de perfil de viga U", + "bitbybit.occt.shapes.wire.createUBeamProfileWire_description": "Cria fio de perfil de viga U do OpenCascade", + "flangeWidth": "largura do flange", + "bitbybit.occt.shapes.face.createLPolygonFace": "face de polígono L", + "createLPolygonFace": "face de polígono L", + "bitbybit.occt.shapes.face.createLPolygonFace_description": "Cria face de polígono L do OpenCascade", + "bitbybit.occt.shapes.face.createStarFace": "face de estrela", + "createStarFace": "face de estrela", + "bitbybit.occt.shapes.face.createStarFace_description": "Cria face de estrela do OpenCascade", + "bitbybit.occt.shapes.face.createChristmasTreeFace": "face de árvore de natal", + "createChristmasTreeFace": "face de árvore de natal", + "bitbybit.occt.shapes.face.createChristmasTreeFace_description": "Cria face de árvore de natal do OpenCascade", + "bitbybit.occt.shapes.face.createParallelogramFace": "face de paralelogramo", + "createParallelogramFace": "face de paralelogramo", + "bitbybit.occt.shapes.face.createParallelogramFace_description": "Cria face de paralelogramo do OpenCascade", + "bitbybit.occt.shapes.face.createHeartFace": "face de coração", + "createHeartFace": "face de coração", + "bitbybit.occt.shapes.face.createHeartFace_description": "Cria face de coração do OpenCascade", + "bitbybit.occt.shapes.face.createNGonFace": "face de n-gono", + "createNGonFace": "face de n-gono", + "bitbybit.occt.shapes.face.createNGonFace_description": "Cria face de n-gono do OpenCascade", + "bitbybit.occt.shapes.face.createIBeamProfileFace": "face de perfil de viga I", + "createIBeamProfileFace": "face de perfil de viga I", + "bitbybit.occt.shapes.face.createIBeamProfileFace_description": "Cria face de perfil de viga I do OpenCascade", + "bitbybit.occt.shapes.face.createHBeamProfileFace": "face de perfil de viga H", + "createHBeamProfileFace": "face de perfil de viga H", + "bitbybit.occt.shapes.face.createHBeamProfileFace_description": "Cria face de perfil de viga H do OpenCascade", + "bitbybit.occt.shapes.face.createTBeamProfileFace": "face de perfil de viga T", + "createTBeamProfileFace": "face de perfil de viga T", + "bitbybit.occt.shapes.face.createTBeamProfileFace_description": "Cria face de perfil de viga T do OpenCascade", + "bitbybit.occt.shapes.face.createUBeamProfileFace": "face de perfil de viga U", + "createUBeamProfileFace": "face de perfil de viga U", + "bitbybit.occt.shapes.face.createUBeamProfileFace_description": "Cria face de perfil de viga U do OpenCascade", + "bitbybit.occt.shapes.solid.createStarSolid": "sólido de estrela", + "createStarSolid": "sólido de estrela", + "bitbybit.occt.shapes.solid.createStarSolid_description": "Cria sólido de estrela do OpenCascade", + "extrusionLengthFront": "comprimento de extrusão frontal", + "extrusionLengthBack": "comprimento de extrusão traseira", + "bitbybit.occt.shapes.solid.createNGonSolid": "sólido de n-gono", + "createNGonSolid": "sólido de n-gono", + "bitbybit.occt.shapes.solid.createNGonSolid_description": "Cria sólido de n-gono do OpenCascade", + "bitbybit.occt.shapes.solid.createParallelogramSolid": "sólido de paralelogramo", + "createParallelogramSolid": "sólido de paralelogramo", + "bitbybit.occt.shapes.solid.createParallelogramSolid_description": "Cria sólido de paralelogramo do OpenCascade", + "bitbybit.occt.shapes.solid.createHeartSolid": "sólido de coração", + "createHeartSolid": "sólido de coração", + "bitbybit.occt.shapes.solid.createHeartSolid_description": "Cria sólido de coração do OpenCascade", + "bitbybit.occt.shapes.solid.createChristmasTreeSolid": "sólido de árvore de natal", + "createChristmasTreeSolid": "sólido de árvore de natal", + "bitbybit.occt.shapes.solid.createChristmasTreeSolid_description": "Cria sólido de árvore de natal do OpenCascade", + "bitbybit.occt.shapes.solid.createLPolygonSolid": "sólido de polígono L", + "createLPolygonSolid": "sólido de polígono L", + "bitbybit.occt.shapes.solid.createLPolygonSolid_description": "Cria sólido de polígono L do OpenCascade", + "bitbybit.occt.shapes.solid.createIBeamProfileSolid": "sólido de perfil de viga I", + "createIBeamProfileSolid": "sólido de perfil de viga I", + "bitbybit.occt.shapes.solid.createIBeamProfileSolid_description": "Cria sólido de perfil de viga I do OpenCascade", + "beam": "viga", + "bitbybit.occt.shapes.solid.createHBeamProfileSolid": "sólido de perfil de viga H", + "createHBeamProfileSolid": "sólido de perfil de viga H", + "bitbybit.occt.shapes.solid.createHBeamProfileSolid_description": "Cria sólido de perfil de viga H do OpenCascade", + "bitbybit.occt.shapes.solid.createTBeamProfileSolid": "sólido de perfil de viga T", + "createTBeamProfileSolid": "sólido de perfil de viga T", + "bitbybit.occt.shapes.solid.createTBeamProfileSolid_description": "Cria sólido de perfil de viga T do OpenCascade", + "bitbybit.occt.shapes.solid.createUBeamProfileSolid": "sólido de perfil de viga U", + "createUBeamProfileSolid": "sólido de perfil de viga U", + "bitbybit.occt.shapes.solid.createUBeamProfileSolid_description": "Cria sólido de perfil de viga U do OpenCascade", + "endType": "tipo de extremidade", + "dimensionEndTypeEnum": "dimensionEndTypeEnum", + "arrowAngle": "ângulo da seta", + "arrowsFlipped": "setas invertidas", + "colorFormat": "formato de cor", + "dxfColorFormatEnum": "dxfColorFormatEnum", + "acadVersion": "versão acad", + "dxfAcadVersionEnum": "dxfAcadVersionEnum", + "bitbybit.advanced.navigation.zoomOn": "ampliar em", + "zoomOn": "ampliar em", + "bitbybit.advanced.navigation.zoomOn_description": "Amplia a câmera para ajustar as malhas especificadas na cena com animação suave. Funciona apenas com ArcRotateCamera. A animação pode ser interrompida se chamada várias vezes.", + "animationSpeed": "velocidade de animação", + "doNotUpdateMaxZ": "não atualizar max z", + "bitbybit.advanced.navigation.focusFromAngle": "focar a partir do ângulo", + "focusFromAngle": "focar a partir do ângulo", + "bitbybit.advanced.navigation.focusFromAngle_description": "Foca a câmera nas malhas especificadas a partir de um ângulo específico com animação suave. Calcula o centro da caixa delimitadora de todas as malhas e posiciona a câmera no vetor de orientação especificado para olhar para o centro. Funciona apenas com ArcRotateCamera. A animação pode ser interrompida se chamada várias vezes.", + "padding": "preenchimento", + "shadowRefreshRate": "Taxa de atualização de sombra", + "labelFlipHorizontal": "Inverter rótulo horizontalmente", + "labelFlipVertical": "Inverter rótulo verticalmente", + "bitbybit.advanced.navigation.zoomOnAspect": "Zoom no aspecto", + "zoomOnAspect": "Zoom no aspecto", + "bitbybit.advanced.navigation.zoomOnAspect_description": "Amplia a câmera para ajustar as malhas especificadas na cena com animação suave, considerando a proporção exata da tela. Ao contrário do zoomOn, este método calcula com precisão a distância da câmera com base nas dimensões da janela de visualização e na caixa delimitadora da malha para garantir melhor ajuste em padding=0. Funciona apenas com ArcRotateCamera. A animação pode ser interrompida se chamada várias vezes." +} diff --git a/languages/ru.json b/languages/ru.json index 447e61764..f271c79dd 100644 --- a/languages/ru.json +++ b/languages/ru.json @@ -5530,5 +5530,113 @@ "textFontWeight": "толщина шрифта текста", "textPosition": "позиция текста", "textBackgroundStrokeThickness": "толщина обводки", - "Inputs.Base.topBottomEnum": "Inputs.Base.topBottomEnum" -} \ No newline at end of file + "Inputs.Base.topBottomEnum": "Inputs.Base.topBottomEnum", + "clear": "Очистить", + "recompute": "Пересчитать", + "clear tooltip": "Очистить все кэши и компоненты", + "recompute tooltip": "Очищает кэш и пересчитывает", + "bitbybit.occt.shapes.wire.createIBeamProfileWire": "проволока профиля I-балки", + "createIBeamProfileWire": "проволока профиля I-балки", + "bitbybit.occt.shapes.wire.createIBeamProfileWire_description": "Создает проволоку профиля I-балки OpenCascade", + "beam profiles": "профили балок", + "webThickness": "толщина стенки", + "flangeThickness": "толщина полки", + "alignment": "выравнивание", + "Base.basicAlignmentEnum": "Base.basicAlignmentEnum", + "bitbybit.occt.shapes.wire.createHBeamProfileWire": "проволока профиля H-балки", + "createHBeamProfileWire": "проволока профиля H-балки", + "bitbybit.occt.shapes.wire.createHBeamProfileWire_description": "Создает проволоку профиля H-балки OpenCascade", + "bitbybit.occt.shapes.wire.createTBeamProfileWire": "проволока профиля T-балки", + "createTBeamProfileWire": "проволока профиля T-балки", + "bitbybit.occt.shapes.wire.createTBeamProfileWire_description": "Создает проволоку профиля T-балки OpenCascade", + "bitbybit.occt.shapes.wire.createUBeamProfileWire": "проволока профиля U-балки", + "createUBeamProfileWire": "проволока профиля U-балки", + "bitbybit.occt.shapes.wire.createUBeamProfileWire_description": "Создает проволоку профиля U-балки OpenCascade", + "flangeWidth": "ширина полки", + "bitbybit.occt.shapes.face.createLPolygonFace": "грань L-многоугольника", + "createLPolygonFace": "грань L-многоугольника", + "bitbybit.occt.shapes.face.createLPolygonFace_description": "Создает грань L-многоугольника OpenCascade", + "bitbybit.occt.shapes.face.createStarFace": "грань звезды", + "createStarFace": "грань звезды", + "bitbybit.occt.shapes.face.createStarFace_description": "Создает грань звезды OpenCascade", + "bitbybit.occt.shapes.face.createChristmasTreeFace": "грань рождественской елки", + "createChristmasTreeFace": "грань рождественской елки", + "bitbybit.occt.shapes.face.createChristmasTreeFace_description": "Создает грань рождественской елки OpenCascade", + "bitbybit.occt.shapes.face.createParallelogramFace": "грань параллелограмма", + "createParallelogramFace": "грань параллелограмма", + "bitbybit.occt.shapes.face.createParallelogramFace_description": "Создает грань параллелограмма OpenCascade", + "bitbybit.occt.shapes.face.createHeartFace": "грань сердца", + "createHeartFace": "грань сердца", + "bitbybit.occt.shapes.face.createHeartFace_description": "Создает грань сердца OpenCascade", + "bitbybit.occt.shapes.face.createNGonFace": "грань n-угольника", + "createNGonFace": "грань n-угольника", + "bitbybit.occt.shapes.face.createNGonFace_description": "Создает грань n-угольника OpenCascade", + "bitbybit.occt.shapes.face.createIBeamProfileFace": "грань профиля I-балки", + "createIBeamProfileFace": "грань профиля I-балки", + "bitbybit.occt.shapes.face.createIBeamProfileFace_description": "Создает грань профиля I-балки OpenCascade", + "bitbybit.occt.shapes.face.createHBeamProfileFace": "грань профиля H-балки", + "createHBeamProfileFace": "грань профиля H-балки", + "bitbybit.occt.shapes.face.createHBeamProfileFace_description": "Создает грань профиля H-балки OpenCascade", + "bitbybit.occt.shapes.face.createTBeamProfileFace": "грань профиля T-балки", + "createTBeamProfileFace": "грань профиля T-балки", + "bitbybit.occt.shapes.face.createTBeamProfileFace_description": "Создает грань профиля T-балки OpenCascade", + "bitbybit.occt.shapes.face.createUBeamProfileFace": "грань профиля U-балки", + "createUBeamProfileFace": "грань профиля U-балки", + "bitbybit.occt.shapes.face.createUBeamProfileFace_description": "Создает грань профиля U-балки OpenCascade", + "bitbybit.occt.shapes.solid.createStarSolid": "твердое тело звезды", + "createStarSolid": "твердое тело звезды", + "bitbybit.occt.shapes.solid.createStarSolid_description": "Создает твердое тело звезды OpenCascade", + "extrusionLengthFront": "длина выдавливания спереди", + "extrusionLengthBack": "длина выдавливания сзади", + "bitbybit.occt.shapes.solid.createNGonSolid": "твердое тело n-угольника", + "createNGonSolid": "твердое тело n-угольника", + "bitbybit.occt.shapes.solid.createNGonSolid_description": "Создает твердое тело n-угольника OpenCascade", + "bitbybit.occt.shapes.solid.createParallelogramSolid": "твердое тело параллелограмма", + "createParallelogramSolid": "твердое тело параллелограмма", + "bitbybit.occt.shapes.solid.createParallelogramSolid_description": "Создает твердое тело параллелограмма OpenCascade", + "bitbybit.occt.shapes.solid.createHeartSolid": "твердое тело сердца", + "createHeartSolid": "твердое тело сердца", + "bitbybit.occt.shapes.solid.createHeartSolid_description": "Создает твердое тело сердца OpenCascade", + "bitbybit.occt.shapes.solid.createChristmasTreeSolid": "твердое тело рождественской елки", + "createChristmasTreeSolid": "твердое тело рождественской елки", + "bitbybit.occt.shapes.solid.createChristmasTreeSolid_description": "Создает твердое тело рождественской елки OpenCascade", + "bitbybit.occt.shapes.solid.createLPolygonSolid": "твердое тело L-многоугольника", + "createLPolygonSolid": "твердое тело L-многоугольника", + "bitbybit.occt.shapes.solid.createLPolygonSolid_description": "Создает твердое тело L-многоугольника OpenCascade", + "bitbybit.occt.shapes.solid.createIBeamProfileSolid": "твердое тело профиля I-балки", + "createIBeamProfileSolid": "твердое тело профиля I-балки", + "bitbybit.occt.shapes.solid.createIBeamProfileSolid_description": "Создает твердое тело профиля I-балки OpenCascade", + "beam": "балка", + "bitbybit.occt.shapes.solid.createHBeamProfileSolid": "твердое тело профиля H-балки", + "createHBeamProfileSolid": "твердое тело профиля H-балки", + "bitbybit.occt.shapes.solid.createHBeamProfileSolid_description": "Создает твердое тело профиля H-балки OpenCascade", + "bitbybit.occt.shapes.solid.createTBeamProfileSolid": "твердое тело профиля T-балки", + "createTBeamProfileSolid": "твердое тело профиля T-балки", + "bitbybit.occt.shapes.solid.createTBeamProfileSolid_description": "Создает твердое тело профиля T-балки OpenCascade", + "bitbybit.occt.shapes.solid.createUBeamProfileSolid": "твердое тело профиля U-балки", + "createUBeamProfileSolid": "твердое тело профиля U-балки", + "bitbybit.occt.shapes.solid.createUBeamProfileSolid_description": "Создает твердое тело профиля U-балки OpenCascade", + "endType": "Тип окончания", + "dimensionEndTypeEnum": "dimensionEndTypeEnum", + "arrowAngle": "Угол стрелки", + "arrowsFlipped": "Стрелки перевернуты", + "colorFormat": "Формат цвета", + "dxfColorFormatEnum": "dxfColorFormatEnum", + "acadVersion": "Версия Acad", + "dxfAcadVersionEnum": "dxfAcadVersionEnum", + "bitbybit.advanced.navigation.zoomOn": "Приблизить к", + "zoomOn": "Приблизить к", + "bitbybit.advanced.navigation.zoomOn_description": "Приближает камеру для подгонки указанных мешей в сцене с плавной анимацией. Работает только с ArcRotateCamera. Анимация может быть прервана при многократном вызове.", + "animationSpeed": "Скорость анимации", + "doNotUpdateMaxZ": "Не обновлять max z", + "bitbybit.advanced.navigation.focusFromAngle": "Фокус под углом", + "focusFromAngle": "Фокус под углом", + "bitbybit.advanced.navigation.focusFromAngle_description": "Фокусирует камеру на указанных мешах под определенным углом с плавной анимацией. Вычисляет центр ограничивающего блока всех мешей и позиционирует камеру по указанному вектору ориентации для просмотра центра. Работает только с ArcRotateCamera. Анимация может быть прервана при многократном вызове.", + "padding": "Отступ", + "shadowRefreshRate": "Частота обновления тени", + "labelFlipHorizontal": "Отразить метку по горизонтали", + "labelFlipVertical": "Отразить метку по вертикали", + "bitbybit.advanced.navigation.zoomOnAspect": "Масштабирование по соотношению", + "zoomOnAspect": "Масштабирование по соотношению", + "bitbybit.advanced.navigation.zoomOnAspect_description": "Масштабирует камеру для размещения указанных мешей в сцене с плавной анимацией, учитывая точное соотношение сторон экрана. В отличие от zoomOn, этот метод точно вычисляет расстояние камеры на основе размеров области просмотра и ограничивающей рамки меша для обеспечения лучшего размещения при padding=0. Работает только с ArcRotateCamera. Анимация может быть прервана при многократном вызове." +} diff --git a/languages/uk.json b/languages/uk.json index f782da94b..56e4775c5 100644 --- a/languages/uk.json +++ b/languages/uk.json @@ -5530,5 +5530,113 @@ "textFontWeight": "товщина шрифту тексту", "textPosition": "позиція тексту", "textBackgroundStrokeThickness": "товщина обведення", - "Inputs.Base.topBottomEnum": "Inputs.Base.topBottomEnum" -} \ No newline at end of file + "Inputs.Base.topBottomEnum": "Inputs.Base.topBottomEnum", + "clear": "Очистити", + "recompute": "Пересчитать", + "clear tooltip": "Очистити всі кеші та компоненти", + "recompute tooltip": "Очищает кеш и пересчитывает", + "bitbybit.occt.shapes.wire.createIBeamProfileWire": "дріт профілю I-балки", + "createIBeamProfileWire": "дріт профілю I-балки", + "bitbybit.occt.shapes.wire.createIBeamProfileWire_description": "Створює дріт профілю I-балки OpenCascade", + "beam profiles": "профілі балок", + "webThickness": "товщина стінки", + "flangeThickness": "товщина полиці", + "alignment": "вирівнювання", + "Base.basicAlignmentEnum": "Base.basicAlignmentEnum", + "bitbybit.occt.shapes.wire.createHBeamProfileWire": "дріт профілю H-балки", + "createHBeamProfileWire": "дріт профілю H-балки", + "bitbybit.occt.shapes.wire.createHBeamProfileWire_description": "Створює дріт профілю H-балки OpenCascade", + "bitbybit.occt.shapes.wire.createTBeamProfileWire": "дріт профілю T-балки", + "createTBeamProfileWire": "дріт профілю T-балки", + "bitbybit.occt.shapes.wire.createTBeamProfileWire_description": "Створює дріт профілю T-балки OpenCascade", + "bitbybit.occt.shapes.wire.createUBeamProfileWire": "дріт профілю U-балки", + "createUBeamProfileWire": "дріт профілю U-балки", + "bitbybit.occt.shapes.wire.createUBeamProfileWire_description": "Створює дріт профілю U-балки OpenCascade", + "flangeWidth": "ширина полиці", + "bitbybit.occt.shapes.face.createLPolygonFace": "грань L-багатокутника", + "createLPolygonFace": "грань L-багатокутника", + "bitbybit.occt.shapes.face.createLPolygonFace_description": "Створює грань L-багатокутника OpenCascade", + "bitbybit.occt.shapes.face.createStarFace": "грань зірки", + "createStarFace": "грань зірки", + "bitbybit.occt.shapes.face.createStarFace_description": "Створює грань зірки OpenCascade", + "bitbybit.occt.shapes.face.createChristmasTreeFace": "грань різдвяної ялинки", + "createChristmasTreeFace": "грань різдвяної ялинки", + "bitbybit.occt.shapes.face.createChristmasTreeFace_description": "Створює грань різдвяної ялинки OpenCascade", + "bitbybit.occt.shapes.face.createParallelogramFace": "грань паралелограма", + "createParallelogramFace": "грань паралелограма", + "bitbybit.occt.shapes.face.createParallelogramFace_description": "Створює грань паралелограма OpenCascade", + "bitbybit.occt.shapes.face.createHeartFace": "грань серця", + "createHeartFace": "грань серця", + "bitbybit.occt.shapes.face.createHeartFace_description": "Створює грань серця OpenCascade", + "bitbybit.occt.shapes.face.createNGonFace": "грань n-кутника", + "createNGonFace": "грань n-кутника", + "bitbybit.occt.shapes.face.createNGonFace_description": "Створює грань n-кутника OpenCascade", + "bitbybit.occt.shapes.face.createIBeamProfileFace": "грань профілю I-балки", + "createIBeamProfileFace": "грань профілю I-балки", + "bitbybit.occt.shapes.face.createIBeamProfileFace_description": "Створює грань профілю I-балки OpenCascade", + "bitbybit.occt.shapes.face.createHBeamProfileFace": "грань профілю H-балки", + "createHBeamProfileFace": "грань профілю H-балки", + "bitbybit.occt.shapes.face.createHBeamProfileFace_description": "Створює грань профілю H-балки OpenCascade", + "bitbybit.occt.shapes.face.createTBeamProfileFace": "грань профілю T-балки", + "createTBeamProfileFace": "грань профілю T-балки", + "bitbybit.occt.shapes.face.createTBeamProfileFace_description": "Створює грань профілю T-балки OpenCascade", + "bitbybit.occt.shapes.face.createUBeamProfileFace": "грань профілю U-балки", + "createUBeamProfileFace": "грань профілю U-балки", + "bitbybit.occt.shapes.face.createUBeamProfileFace_description": "Створює грань профілю U-балки OpenCascade", + "bitbybit.occt.shapes.solid.createStarSolid": "тверде тіло зірки", + "createStarSolid": "тверде тіло зірки", + "bitbybit.occt.shapes.solid.createStarSolid_description": "Створює тверде тіло зірки OpenCascade", + "extrusionLengthFront": "довжина видавлювання спереду", + "extrusionLengthBack": "довжина видавлювання ззаду", + "bitbybit.occt.shapes.solid.createNGonSolid": "тверде тіло n-кутника", + "createNGonSolid": "тверде тіло n-кутника", + "bitbybit.occt.shapes.solid.createNGonSolid_description": "Створює тверде тіло n-кутника OpenCascade", + "bitbybit.occt.shapes.solid.createParallelogramSolid": "тверде тіло паралелограма", + "createParallelogramSolid": "тверде тіло паралелограма", + "bitbybit.occt.shapes.solid.createParallelogramSolid_description": "Створює тверде тіло паралелограма OpenCascade", + "bitbybit.occt.shapes.solid.createHeartSolid": "тверде тіло серця", + "createHeartSolid": "тверде тіло серця", + "bitbybit.occt.shapes.solid.createHeartSolid_description": "Створює тверде тіло серця OpenCascade", + "bitbybit.occt.shapes.solid.createChristmasTreeSolid": "тверде тіло різдвяної ялинки", + "createChristmasTreeSolid": "тверде тіло різдвяної ялинки", + "bitbybit.occt.shapes.solid.createChristmasTreeSolid_description": "Створює тверде тіло різдвяної ялинки OpenCascade", + "bitbybit.occt.shapes.solid.createLPolygonSolid": "тверде тіло L-багатокутника", + "createLPolygonSolid": "тверде тіло L-багатокутника", + "bitbybit.occt.shapes.solid.createLPolygonSolid_description": "Створює тверде тіло L-багатокутника OpenCascade", + "bitbybit.occt.shapes.solid.createIBeamProfileSolid": "тверде тіло профілю I-балки", + "createIBeamProfileSolid": "тверде тіло профілю I-балки", + "bitbybit.occt.shapes.solid.createIBeamProfileSolid_description": "Створює тверде тіло профілю I-балки OpenCascade", + "beam": "балка", + "bitbybit.occt.shapes.solid.createHBeamProfileSolid": "тверде тіло профілю H-балки", + "createHBeamProfileSolid": "тверде тіло профілю H-балки", + "bitbybit.occt.shapes.solid.createHBeamProfileSolid_description": "Створює тверде тіло профілю H-балки OpenCascade", + "bitbybit.occt.shapes.solid.createTBeamProfileSolid": "тверде тіло профілю T-балки", + "createTBeamProfileSolid": "тверде тіло профілю T-балки", + "bitbybit.occt.shapes.solid.createTBeamProfileSolid_description": "Створює тверде тіло профілю T-балки OpenCascade", + "bitbybit.occt.shapes.solid.createUBeamProfileSolid": "тверде тіло профілю U-балки", + "createUBeamProfileSolid": "тверде тіло профілю U-балки", + "bitbybit.occt.shapes.solid.createUBeamProfileSolid_description": "Створює тверде тіло профілю U-балки OpenCascade", + "endType": "тип закінчення", + "dimensionEndTypeEnum": "dimensionEndTypeEnum", + "arrowAngle": "кут стрілки", + "arrowsFlipped": "стрілки перевернуті", + "colorFormat": "формат кольору", + "dxfColorFormatEnum": "dxfColorFormatEnum", + "acadVersion": "версія acad", + "dxfAcadVersionEnum": "dxfAcadVersionEnum", + "bitbybit.advanced.navigation.zoomOn": "наблизити на", + "zoomOn": "наблизити на", + "bitbybit.advanced.navigation.zoomOn_description": "Наближує камеру для підгонки вказаних сіток у сцені з плавною анімацією. Працює тільки з ArcRotateCamera. Анімація може бути перервана при багаторазовому виклику.", + "animationSpeed": "швидкість анімації", + "doNotUpdateMaxZ": "не оновлювати max z", + "bitbybit.advanced.navigation.focusFromAngle": "фокус під кутом", + "focusFromAngle": "фокус під кутом", + "bitbybit.advanced.navigation.focusFromAngle_description": "Фокусує камеру на вказаних сітках під певним кутом з плавною анімацією. Обчислює центр обмежувальної коробки всіх сіток і позиціонує камеру за вказаним вектором орієнтації для перегляду центру. Працює тільки з ArcRotateCamera. Анімація може бути перервана при багаторазовому виклику.", + "padding": "відступ", + "shadowRefreshRate": "Частота оновлення тіні", + "labelFlipHorizontal": "Відобразити мітку горизонтально", + "labelFlipVertical": "Відобразити мітку вертикально", + "bitbybit.advanced.navigation.zoomOnAspect": "Масштабування за співвідношенням", + "zoomOnAspect": "Масштабування за співвідношенням", + "bitbybit.advanced.navigation.zoomOnAspect_description": "Масштабує камеру для розміщення вказаних мешів у сцені з плавною анімацією, враховуючи точне співвідношення сторін екрана. На відміну від zoomOn, цей метод точно обчислює відстань камери на основі розмірів області перегляду та обмежувальної рамки меша для забезпечення кращого розміщення при padding=0. Працює лише з ArcRotateCamera. Анімація може бути перервана при багаторазовому виклику." +} diff --git a/languages/zh-hans.json b/languages/zh-hans.json index 1f7861ad1..8e48d5198 100644 --- a/languages/zh-hans.json +++ b/languages/zh-hans.json @@ -5530,5 +5530,113 @@ "textFontWeight": "文本字体粗细", "textPosition": "文本位置", "textBackgroundStrokeThickness": "描边粗细", - "Inputs.Base.topBottomEnum": "Inputs.Base.topBottomEnum" -} \ No newline at end of file + "Inputs.Base.topBottomEnum": "Inputs.Base.topBottomEnum", + "clear": "清除", + "recompute": "重新计算", + "clear tooltip": "清除所有缓存和组件", + "recompute tooltip": "清除缓存并重新计算", + "bitbybit.occt.shapes.wire.createIBeamProfileWire": "I型梁轮廓线", + "createIBeamProfileWire": "I型梁轮廓线", + "bitbybit.occt.shapes.wire.createIBeamProfileWire_description": "创建OpenCascade I型梁轮廓线", + "beam profiles": "梁型材", + "webThickness": "腹板厚度", + "flangeThickness": "翼缘厚度", + "alignment": "对齐", + "Base.basicAlignmentEnum": "Base.basicAlignmentEnum", + "bitbybit.occt.shapes.wire.createHBeamProfileWire": "H型梁轮廓线", + "createHBeamProfileWire": "H型梁轮廓线", + "bitbybit.occt.shapes.wire.createHBeamProfileWire_description": "创建OpenCascade H型梁轮廓线", + "bitbybit.occt.shapes.wire.createTBeamProfileWire": "T型梁轮廓线", + "createTBeamProfileWire": "T型梁轮廓线", + "bitbybit.occt.shapes.wire.createTBeamProfileWire_description": "创建OpenCascade T型梁轮廓线", + "bitbybit.occt.shapes.wire.createUBeamProfileWire": "U型梁轮廓线", + "createUBeamProfileWire": "U型梁轮廓线", + "bitbybit.occt.shapes.wire.createUBeamProfileWire_description": "创建OpenCascade U型梁轮廓线", + "flangeWidth": "翼缘宽度", + "bitbybit.occt.shapes.face.createLPolygonFace": "L型多边形面", + "createLPolygonFace": "L型多边形面", + "bitbybit.occt.shapes.face.createLPolygonFace_description": "创建OpenCascade L型多边形面", + "bitbybit.occt.shapes.face.createStarFace": "星形面", + "createStarFace": "星形面", + "bitbybit.occt.shapes.face.createStarFace_description": "创建OpenCascade 星形面", + "bitbybit.occt.shapes.face.createChristmasTreeFace": "圣诞树面", + "createChristmasTreeFace": "圣诞树面", + "bitbybit.occt.shapes.face.createChristmasTreeFace_description": "创建OpenCascade 圣诞树面", + "bitbybit.occt.shapes.face.createParallelogramFace": "平行四边形面", + "createParallelogramFace": "平行四边形面", + "bitbybit.occt.shapes.face.createParallelogramFace_description": "创建OpenCascade 平行四边形面", + "bitbybit.occt.shapes.face.createHeartFace": "心形面", + "createHeartFace": "心形面", + "bitbybit.occt.shapes.face.createHeartFace_description": "创建OpenCascade 心形面", + "bitbybit.occt.shapes.face.createNGonFace": "n边形面", + "createNGonFace": "n边形面", + "bitbybit.occt.shapes.face.createNGonFace_description": "创建OpenCascade n边形面", + "bitbybit.occt.shapes.face.createIBeamProfileFace": "I型梁轮廓面", + "createIBeamProfileFace": "I型梁轮廓面", + "bitbybit.occt.shapes.face.createIBeamProfileFace_description": "创建OpenCascade I型梁轮廓面", + "bitbybit.occt.shapes.face.createHBeamProfileFace": "H型梁轮廓面", + "createHBeamProfileFace": "H型梁轮廓面", + "bitbybit.occt.shapes.face.createHBeamProfileFace_description": "创建OpenCascade H型梁轮廓面", + "bitbybit.occt.shapes.face.createTBeamProfileFace": "T型梁轮廓面", + "createTBeamProfileFace": "T型梁轮廓面", + "bitbybit.occt.shapes.face.createTBeamProfileFace_description": "创建OpenCascade T型梁轮廓面", + "bitbybit.occt.shapes.face.createUBeamProfileFace": "U型梁轮廓面", + "createUBeamProfileFace": "U型梁轮廓面", + "bitbybit.occt.shapes.face.createUBeamProfileFace_description": "创建OpenCascade U型梁轮廓面", + "bitbybit.occt.shapes.solid.createStarSolid": "星形实体", + "createStarSolid": "星形实体", + "bitbybit.occt.shapes.solid.createStarSolid_description": "创建OpenCascade 星形实体", + "extrusionLengthFront": "前端拉伸长度", + "extrusionLengthBack": "后端拉伸长度", + "bitbybit.occt.shapes.solid.createNGonSolid": "n边形实体", + "createNGonSolid": "n边形实体", + "bitbybit.occt.shapes.solid.createNGonSolid_description": "创建OpenCascade n边形实体", + "bitbybit.occt.shapes.solid.createParallelogramSolid": "平行四边形实体", + "createParallelogramSolid": "平行四边形实体", + "bitbybit.occt.shapes.solid.createParallelogramSolid_description": "创建OpenCascade 平行四边形实体", + "bitbybit.occt.shapes.solid.createHeartSolid": "心形实体", + "createHeartSolid": "心形实体", + "bitbybit.occt.shapes.solid.createHeartSolid_description": "创建OpenCascade 心形实体", + "bitbybit.occt.shapes.solid.createChristmasTreeSolid": "圣诞树实体", + "createChristmasTreeSolid": "圣诞树实体", + "bitbybit.occt.shapes.solid.createChristmasTreeSolid_description": "创建OpenCascade 圣诞树实体", + "bitbybit.occt.shapes.solid.createLPolygonSolid": "L型多边形实体", + "createLPolygonSolid": "L型多边形实体", + "bitbybit.occt.shapes.solid.createLPolygonSolid_description": "创建OpenCascade L型多边形实体", + "bitbybit.occt.shapes.solid.createIBeamProfileSolid": "I型梁轮廓实体", + "createIBeamProfileSolid": "I型梁轮廓实体", + "bitbybit.occt.shapes.solid.createIBeamProfileSolid_description": "创建OpenCascade I型梁轮廓实体", + "beam": "梁", + "bitbybit.occt.shapes.solid.createHBeamProfileSolid": "H型梁轮廓实体", + "createHBeamProfileSolid": "H型梁轮廓实体", + "bitbybit.occt.shapes.solid.createHBeamProfileSolid_description": "创建OpenCascade H型梁轮廓实体", + "bitbybit.occt.shapes.solid.createTBeamProfileSolid": "T型梁轮廓实体", + "createTBeamProfileSolid": "T型梁轮廓实体", + "bitbybit.occt.shapes.solid.createTBeamProfileSolid_description": "创建OpenCascade T型梁轮廓实体", + "bitbybit.occt.shapes.solid.createUBeamProfileSolid": "U型梁轮廓实体", + "createUBeamProfileSolid": "U型梁轮廓实体", + "bitbybit.occt.shapes.solid.createUBeamProfileSolid_description": "创建OpenCascade U型梁轮廓实体", + "endType": "端点类型", + "dimensionEndTypeEnum": "dimensionEndTypeEnum", + "arrowAngle": "箭头角度", + "arrowsFlipped": "箭头翻转", + "colorFormat": "颜色格式", + "dxfColorFormatEnum": "dxfColorFormatEnum", + "acadVersion": "Acad 版本", + "dxfAcadVersionEnum": "dxfAcadVersionEnum", + "bitbybit.advanced.navigation.zoomOn": "缩放至", + "zoomOn": "缩放至", + "bitbybit.advanced.navigation.zoomOn_description": "通过平滑动画缩放相机以适应场景中指定的网格。仅适用于 ArcRotateCamera。如果多次调用,动画可能会被中断。", + "animationSpeed": "动画速度", + "doNotUpdateMaxZ": "不更新最大 z", + "bitbybit.advanced.navigation.focusFromAngle": "从角度聚焦", + "focusFromAngle": "从角度聚焦", + "bitbybit.advanced.navigation.focusFromAngle_description": "通过平滑动画从特定角度将相机聚焦到指定的网格。计算所有网格边界框的中心,并将相机定位在指定的方向向量上以查看中心。仅适用于 ArcRotateCamera。如果多次调用,动画可能会被中断。", + "padding": "填充", + "shadowRefreshRate": "阴影刷新率", + "labelFlipHorizontal": "水平翻转标签", + "labelFlipVertical": "垂直翻转标签", + "bitbybit.advanced.navigation.zoomOnAspect": "按宽高比缩放", + "zoomOnAspect": "按宽高比缩放", + "bitbybit.advanced.navigation.zoomOnAspect_description": "缩放相机以适应场景中指定的网格,并使用平滑动画,考虑精确的屏幕宽高比。与zoomOn不同,此方法基于视口尺寸和网格边界框精确计算相机距离,以确保在padding=0时更好地适配。仅适用于ArcRotateCamera。如果多次调用,动画可能会被中断。" +} diff --git a/packages/dev/babylonjs/lib/api/bitbybit/babylon/scene.ts b/packages/dev/babylonjs/lib/api/bitbybit/babylon/scene.ts index 25a7c7796..5c1751205 100644 --- a/packages/dev/babylonjs/lib/api/bitbybit/babylon/scene.ts +++ b/packages/dev/babylonjs/lib/api/bitbybit/babylon/scene.ts @@ -103,6 +103,7 @@ export class BabylonScene { shadowGenerator.contactHardeningLightSizeUVRatio = inputs.shadowContactHardeningLightSizeUVRatio; shadowGenerator.bias = inputs.shadowBias; shadowGenerator.normalBias = inputs.shadowNormalBias; + shadowGenerator.getShadowMap().refreshRate = inputs.shadowRefreshRate; light.shadowMaxZ = inputs.shadowMaxZ; light.shadowMinZ = inputs.shadowMinZ; this.context.scene.metadata.shadowGenerators.push(shadowGenerator); @@ -169,6 +170,8 @@ export class BabylonScene { shadowGenerator.contactHardeningLightSizeUVRatio = inputs.shadowContactHardeningLightSizeUVRatio; shadowGenerator.bias = inputs.shadowBias; shadowGenerator.normalBias = inputs.shadowNormalBias; + shadowGenerator.getShadowMap().refreshRate = inputs.shadowRefreshRate; + light.shadowMaxZ = inputs.shadowMaxZ; light.shadowMinZ = inputs.shadowMinZ; this.context.scene.metadata.shadowGenerators.push(shadowGenerator); diff --git a/packages/dev/babylonjs/lib/api/bitbybit/draw.ts b/packages/dev/babylonjs/lib/api/bitbybit/draw.ts index 79e5427bc..5ab896c0d 100644 --- a/packages/dev/babylonjs/lib/api/bitbybit/draw.ts +++ b/packages/dev/babylonjs/lib/api/bitbybit/draw.ts @@ -240,7 +240,7 @@ export class Draw extends DrawCore { }, this.context.scene, ); - + ground.isPickable = false; ground.material = groundMaterial; return ground; } catch (e) { diff --git a/packages/dev/babylonjs/lib/api/inputs/scene-inputs.ts b/packages/dev/babylonjs/lib/api/inputs/scene-inputs.ts index 46a57a636..25e4bf3f4 100644 --- a/packages/dev/babylonjs/lib/api/inputs/scene-inputs.ts +++ b/packages/dev/babylonjs/lib/api/inputs/scene-inputs.ts @@ -41,7 +41,7 @@ export namespace BabylonScene { vector: Base.Vector3 = [0, -9.81, 0]; } export class PointLightDto { - constructor(position?: Base.Point3, intensity?: number, diffuse?: Base.Color, specular?: Base.Color, radius?: number, shadowGeneratorMapSize?: number, enableShadows?: boolean, shadowDarkness?: number, shadowUsePercentageCloserFiltering?: boolean, shadowContactHardeningLightSizeUVRatio?: number, shadowBias?: number, shadowNormalBias?: number, shadowMaxZ?: number, shadowMinZ?: number) { + constructor(position?: Base.Point3, intensity?: number, diffuse?: Base.Color, specular?: Base.Color, radius?: number, shadowGeneratorMapSize?: number, enableShadows?: boolean, shadowDarkness?: number, shadowUsePercentageCloserFiltering?: boolean, shadowContactHardeningLightSizeUVRatio?: number, shadowBias?: number, shadowNormalBias?: number, shadowMaxZ?: number, shadowMinZ?: number, shadowRefreshRate?: number) { if (position !== undefined) { this.position = position; } if (intensity !== undefined) { this.intensity = intensity; } if (diffuse !== undefined) { this.diffuse = diffuse; } @@ -56,6 +56,7 @@ export namespace BabylonScene { if (shadowNormalBias !== undefined) { this.shadowNormalBias = shadowNormalBias; } if (shadowMaxZ !== undefined) { this.shadowMaxZ = shadowMaxZ; } if (shadowMinZ !== undefined) { this.shadowMinZ = shadowMinZ; } + if (shadowRefreshRate !== undefined) { this.shadowRefreshRate = shadowRefreshRate; } } /** * Position of the point light @@ -155,6 +156,14 @@ export namespace BabylonScene { * @step 50 */ shadowMinZ = 0.1; + /** + * Shadow refresh rate + * @default 1 + * @minimum 0 + * @maximum Infinity + * @step 1 + */ + shadowRefreshRate = 1; } export class ActiveCameraDto { constructor(camera?: BABYLON.Camera) { @@ -176,7 +185,7 @@ export namespace BabylonScene { use = true; } export class DirectionalLightDto { - constructor(direction?: Base.Vector3, intensity?: number, diffuse?: Base.Color, specular?: Base.Color, shadowGeneratorMapSize?: number, enableShadows?: boolean, shadowDarkness?: number, shadowUsePercentageCloserFiltering?: boolean, shadowContactHardeningLightSizeUVRatio?: number, shadowBias?: number, shadowNormalBias?: number, shadowMaxZ?: number, shadowMinZ?: number) { + constructor(direction?: Base.Vector3, intensity?: number, diffuse?: Base.Color, specular?: Base.Color, shadowGeneratorMapSize?: number, enableShadows?: boolean, shadowDarkness?: number, shadowUsePercentageCloserFiltering?: boolean, shadowContactHardeningLightSizeUVRatio?: number, shadowBias?: number, shadowNormalBias?: number, shadowMaxZ?: number, shadowMinZ?: number, shadowRefreshRate?: number) { if (direction !== undefined) { this.direction = direction; } if (intensity !== undefined) { this.intensity = intensity; } if (diffuse !== undefined) { this.diffuse = diffuse; } @@ -190,6 +199,7 @@ export namespace BabylonScene { if (shadowNormalBias !== undefined) { this.shadowNormalBias = shadowNormalBias; } if (shadowMaxZ !== undefined) { this.shadowMaxZ = shadowMaxZ; } if (shadowMinZ !== undefined) { this.shadowMinZ = shadowMinZ; } + if (shadowRefreshRate !== undefined) { this.shadowRefreshRate = shadowRefreshRate; } } /** * Direction of the directional light @@ -280,6 +290,14 @@ export namespace BabylonScene { * @step 50 */ shadowMinZ = 0; + /** + * Shadow refresh rate + * @default 1 + * @minimum 0 + * @maximum Infinity + * @step 1 + */ + shadowRefreshRate = 1; } export class CameraConfigurationDto { constructor(position?: Base.Point3, lookAt?: Base.Point3, lowerRadiusLimit?: number, upperRadiusLimit?: number, lowerAlphaLimit?: number, upperAlphaLimit?: number, lowerBetaLimit?: number, upperBetaLimit?: number, angularSensibilityX?: number, angularSensibilityY?: number, maxZ?: number, panningSensibility?: number, wheelPrecision?: number) { diff --git a/packages/dev/occt/lib/api/inputs/occ-inputs.ts b/packages/dev/occt/lib/api/inputs/occ-inputs.ts index 214685031..00a7a8b6c 100644 --- a/packages/dev/occt/lib/api/inputs/occ-inputs.ts +++ b/packages/dev/occt/lib/api/inputs/occ-inputs.ts @@ -7041,7 +7041,7 @@ export namespace OCCT { direction: Base.Vector3 = [0, 1, 0]; } export class SimpleLinearLengthDimensionDto { - constructor(start?: Base.Point3, end?: Base.Point3, direction?: Base.Vector3, offsetFromPoints?: number, crossingSize?: number, labelSuffix?: string, labelSize?: number, labelOffset?: number, labelRotation?: number, arrowType?: dimensionEndTypeEnum, arrowSize?: number, arrowAngle?: number, arrowsFlipped?: boolean) { + constructor(start?: Base.Point3, end?: Base.Point3, direction?: Base.Vector3, offsetFromPoints?: number, crossingSize?: number, labelSuffix?: string, labelSize?: number, labelOffset?: number, labelRotation?: number, arrowType?: dimensionEndTypeEnum, arrowSize?: number, arrowAngle?: number, arrowsFlipped?: boolean, labelFlipHorizontal?: boolean, labelFlipVertical?: boolean, labelOverwrite?: string) { if (start !== undefined) { this.start = start; } if (end !== undefined) { this.end = end; } if (direction !== undefined) { this.direction = direction; } @@ -7055,6 +7055,9 @@ export namespace OCCT { if (arrowSize !== undefined) { this.arrowSize = arrowSize; } if (arrowAngle !== undefined) { this.arrowAngle = arrowAngle; } if (arrowsFlipped !== undefined) { this.arrowsFlipped = arrowsFlipped; } + if (labelFlipHorizontal !== undefined) { this.labelFlipHorizontal = labelFlipHorizontal; } + if (labelFlipVertical !== undefined) { this.labelFlipVertical = labelFlipVertical; } + if (labelOverwrite !== undefined) { this.labelOverwrite = labelOverwrite; } } /** * The start point for dimension @@ -7150,9 +7153,25 @@ export namespace OCCT { * @default false */ arrowsFlipped? = false; + /** + * Flip label horizontally + * @default false + */ + labelFlipHorizontal? = false; + /** + * Flip label vertically + * @default false + */ + labelFlipVertical? = false; + /** + * Override label text with custom expression (supports 'val' for computed value, e.g., '100*val', 'Length: val mm') + * @default 1*val + * @optional true + */ + labelOverwrite? = "1*val"; } export class SimpleAngularDimensionDto { - constructor(direction1?: Base.Point3, direction2?: Base.Point3, center?: Base.Point3, radius?: number, offsetFromCenter?: number, crossingSize?: number, radians?: boolean, labelSuffix?: string, labelSize?: number, labelOffset?: number, endType?: dimensionEndTypeEnum, arrowSize?: number, arrowAngle?: number, arrowsFlipped?: boolean) { + constructor(direction1?: Base.Point3, direction2?: Base.Point3, center?: Base.Point3, radius?: number, offsetFromCenter?: number, crossingSize?: number, radians?: boolean, labelSuffix?: string, labelSize?: number, labelOffset?: number, endType?: dimensionEndTypeEnum, arrowSize?: number, arrowAngle?: number, arrowsFlipped?: boolean, labelRotation?: number, labelFlipHorizontal?: boolean, labelFlipVertical?: boolean, labelOverwrite?: string) { if (direction1 !== undefined) { this.direction1 = direction1; } if (direction2 !== undefined) { this.direction2 = direction2; } if (center !== undefined) { this.center = center; } @@ -7167,6 +7186,10 @@ export namespace OCCT { if (arrowSize !== undefined) { this.arrowSize = arrowSize; } if (arrowAngle !== undefined) { this.arrowAngle = arrowAngle; } if (arrowsFlipped !== undefined) { this.arrowsFlipped = arrowsFlipped; } + if (labelRotation !== undefined) { this.labelRotation = labelRotation; } + if (labelFlipHorizontal !== undefined) { this.labelFlipHorizontal = labelFlipHorizontal; } + if (labelFlipVertical !== undefined) { this.labelFlipVertical = labelFlipVertical; } + if (labelOverwrite !== undefined) { this.labelOverwrite = labelOverwrite; } } /** @@ -7268,9 +7291,33 @@ export namespace OCCT { * @default false */ arrowsFlipped? = false; + /** + * Additional rotation angle for the label in degrees + * @default 0 + * @minimum -360 + * @maximum 360 + * @step 1 + */ + labelRotation? = 0; + /** + * Flip label horizontally + * @default false + */ + labelFlipHorizontal? = false; + /** + * Flip label vertically + * @default false + */ + labelFlipVertical? = false; + /** + * Override label text with custom expression (supports 'val' for computed value, e.g., '100*val', 'Angle: val deg') + * @default 1*val + * @optional true + */ + labelOverwrite? = "1*val"; } export class PinWithLabelDto { - constructor(startPoint?: Base.Point3, endPoint?: Base.Point3, direction?: Base.Vector3, offsetFromStart?: number, label?: string, labelOffset?: number, labelSize?: number, endType?: dimensionEndTypeEnum, arrowSize?: number, arrowAngle?: number, arrowsFlipped?: boolean) { + constructor(startPoint?: Base.Point3, endPoint?: Base.Point3, direction?: Base.Vector3, offsetFromStart?: number, label?: string, labelOffset?: number, labelSize?: number, endType?: dimensionEndTypeEnum, arrowSize?: number, arrowAngle?: number, arrowsFlipped?: boolean, labelRotation?: number, labelFlipHorizontal?: boolean, labelFlipVertical?: boolean) { if (startPoint !== undefined) { this.startPoint = startPoint; } if (endPoint !== undefined) { this.endPoint = endPoint; } if (direction !== undefined) { this.direction = direction; } @@ -7282,6 +7329,9 @@ export namespace OCCT { if (arrowSize !== undefined) { this.arrowSize = arrowSize; } if (arrowAngle !== undefined) { this.arrowAngle = arrowAngle; } if (arrowsFlipped !== undefined) { this.arrowsFlipped = arrowsFlipped; } + if (labelRotation !== undefined) { this.labelRotation = labelRotation; } + if (labelFlipHorizontal !== undefined) { this.labelFlipHorizontal = labelFlipHorizontal; } + if (labelFlipVertical !== undefined) { this.labelFlipVertical = labelFlipVertical; } } /** * The start point for dimension @@ -7353,6 +7403,24 @@ export namespace OCCT { * @default false */ arrowsFlipped? = false; + /** + * Additional rotation angle for the label in degrees + * @default 0 + * @minimum -360 + * @maximum 360 + * @step 1 + */ + labelRotation? = 0; + /** + * Flip label horizontally + * @default false + */ + labelFlipHorizontal? = false; + /** + * Flip label vertically + * @default false + */ + labelFlipVertical? = false; } export class StarSolidDto extends StarDto { constructor(outerRadius?: number, innerRadius?: number, numRays?: number, center?: Base.Point3, direction?: Base.Vector3, offsetOuterEdges?: number, half?: boolean, extrusionLengthFront?: number, extrusionLengthBack?: number) { diff --git a/packages/dev/occt/lib/services/base/dimensions.service.ts b/packages/dev/occt/lib/services/base/dimensions.service.ts index b295e63c9..6e6d872e5 100644 --- a/packages/dev/occt/lib/services/base/dimensions.service.ts +++ b/packages/dev/occt/lib/services/base/dimensions.service.ts @@ -22,6 +22,60 @@ export class DimensionsService { private readonly wiresService: WiresService ) { } + /** + * Evaluates a mathematical expression or template string with a given value + * @param expression The expression to evaluate (can contain 'val' placeholder) + * @param value The numeric value to substitute for 'val' + * @param decimalPlaces Number of decimal places to format the result + * @returns The evaluated expression as a formatted string + */ + private evaluateExpression(expression: string, value: number, decimalPlaces: number): string { + try { + // Replace 'val' with the actual value in the expression + const evaluatedExpression = expression.replace(/val/g, value.toString()); + + // Simple math expression evaluation (supports +, -, *, /, parentheses) + // Only allow safe mathematical operations + const safeExpression = evaluatedExpression.replace(/[^0-9+\-*/.() ]/g, ""); + if (safeExpression !== evaluatedExpression) { + // If expression contains non-math characters, treat it as a template + // For template strings, we still want to format numbers with decimal places + const formattedValue = value.toFixed(decimalPlaces); + return expression.replace(/val/g, formattedValue); + } + + // Evaluate mathematical expression and apply decimal places + const result = Function("\"use strict\"; return (" + safeExpression + ")")(); + return result.toFixed(decimalPlaces); + } catch (error) { + // If evaluation fails, return the original value formatted + return value.toFixed(decimalPlaces); + } + } + + /** + * Formats dimension label text with optional expression evaluation + * @param value The numeric value to display + * @param labelOverwrite Optional expression to evaluate instead of raw value + * @param decimalPlaces Number of decimal places for formatting + * @param labelSuffix Suffix to append to the text + * @returns Formatted dimension label text + */ + private formatDimensionLabel( + value: number, + labelOverwrite: string | undefined, + decimalPlaces: number, + labelSuffix: string + ): string { + let result: string; + if (labelOverwrite) { + result = this.evaluateExpression(labelOverwrite, value, decimalPlaces); + } else { + result = value.toFixed(decimalPlaces); + } + return result + " " + labelSuffix; + } + private createArrow(inputs: { tipPoint: Inputs.Base.Point3, direction: Inputs.Base.Vector3, @@ -141,8 +195,15 @@ export class DimensionsService { endPoint: inputs.end, }); + const labelText = this.formatDimensionLabel( + length, + inputs.labelOverwrite, + inputs.decimalPlaces, + inputs.labelSuffix + ); + const txtOpt = new Inputs.OCCT.TextWiresDto(); - txtOpt.text = length.toFixed(inputs.decimalPlaces) + " " + inputs.labelSuffix; + txtOpt.text = labelText; txtOpt.xOffset = 0; txtOpt.yOffset = 0; txtOpt.height = inputs.labelSize; @@ -163,16 +224,39 @@ export class DimensionsService { second: inputs.start, }) as Inputs.Base.Vector3; - const rotated = this.transformsService.rotate({ + let currentShape = this.transformsService.rotate({ shape: txt.compound, angle: -90 + (inputs.labelRotation || 0), axis: [0, 1, 0], }); shapesToDelete.push(...txt.shapes.map((s) => s.shape)); + let previousShape = currentShape; + + // Apply horizontal flip if requested + if (inputs.labelFlipHorizontal) { + currentShape = this.transformsService.scale3d({ + shape: currentShape, + scale: [-1, 1, 1], + center: [0, 0, 0] + }); + shapesToDelete.push(previousShape); + previousShape = currentShape; + } + + // Apply vertical flip if requested + if (inputs.labelFlipVertical) { + currentShape = this.transformsService.scale3d({ + shape: currentShape, + scale: [1, 1, -1], + center: [0, 0, 0] + }); + shapesToDelete.push(previousShape); + previousShape = currentShape; + } const alignedLabelTxtToDir = this.transformsService.alignNormAndAxis({ - shape: rotated, + shape: currentShape, fromOrigin: [0, 0, 0], fromNorm: [0, 1, 0], fromAx: [0, 0, 1], @@ -181,7 +265,7 @@ export class DimensionsService { toAx: dirStartEnd, }); - shapesToDelete.push(rotated); + shapesToDelete.push(previousShape); const normDir = this.base.vector.normalized({ vector: inputs.direction }); const offsetLabelVec = this.base.vector.mul({ vector: normDir, scalar: inputs.labelOffset }); @@ -301,8 +385,15 @@ export class DimensionsService { angle = this.base.math.degToRad({ number: angle }); } + const labelText = this.formatDimensionLabel( + angle, + inputs.labelOverwrite, + inputs.decimalPlaces, + inputs.labelSuffix + ); + const txtOpt = new Inputs.OCCT.TextWiresDto(); - txtOpt.text = angle.toFixed(inputs.decimalPlaces) + " " + inputs.labelSuffix; + txtOpt.text = labelText; txtOpt.xOffset = 0; txtOpt.yOffset = 0; txtOpt.height = inputs.labelSize; @@ -315,8 +406,39 @@ export class DimensionsService { }) as Inputs.Base.Vector3; const normVecToMid = this.base.vector.normalized({ vector: vectorToMid }) as Inputs.Base.Vector3; - const alignedLabelTxtToDir = this.transformsService.alignNormAndAxis({ + let currentShape = this.transformsService.rotate({ shape: txt.compound, + angle: inputs.labelRotation || 0, + axis: [0, 1, 0], + }); + + shapesToDelete.push(...txt.shapes.map((s) => s.shape)); + let previousShape = currentShape; + + // Apply horizontal flip if requested + if (inputs.labelFlipHorizontal) { + currentShape = this.transformsService.scale3d({ + shape: currentShape, + scale: [-1, 1, 1], + center: [0, 0, 0] + }); + shapesToDelete.push(previousShape); + previousShape = currentShape; + } + + // Apply vertical flip if requested + if (inputs.labelFlipVertical) { + currentShape = this.transformsService.scale3d({ + shape: currentShape, + scale: [1, 1, -1], + center: [0, 0, 0] + }); + shapesToDelete.push(previousShape); + previousShape = currentShape; + } + + const alignedLabelTxtToDir = this.transformsService.alignNormAndAxis({ + shape: currentShape, fromOrigin: [0, 0, 0], fromNorm: [0, 1, 0], fromAx: [0, 0, 1], @@ -324,7 +446,7 @@ export class DimensionsService { toNorm: normalThreePoints, toAx: normVecToMid, }); - shapesToDelete.push(...txt.shapes.map((s) => s.shape)); + shapesToDelete.push(previousShape); const offsetLabelVec = this.base.vector.mul({ vector: normVecToMid, scalar: inputs.labelOffset }); const addToDir = this.base.vector.add({ first: midPt, @@ -439,16 +561,39 @@ export class DimensionsService { point3: endPtLabelLine, reverseNormal: false, }); - const rotated = this.transformsService.rotate({ + let currentShape = this.transformsService.rotate({ shape: text.compound, - angle: -90, + angle: -90 + (inputs.labelRotation || 0), axis: [0, 1, 0], }); const shapesToDelete = text.shapes.map((s) => s.shape); + let previousShape = currentShape; + + // Apply horizontal flip if requested + if (inputs.labelFlipHorizontal) { + currentShape = this.transformsService.scale3d({ + shape: currentShape, + scale: [-1, 1, 1], + center: [0, 0, 0] + }); + shapesToDelete.push(previousShape); + previousShape = currentShape; + } + + // Apply vertical flip if requested + if (inputs.labelFlipVertical) { + currentShape = this.transformsService.scale3d({ + shape: currentShape, + scale: [1, 1, -1], + center: [0, 0, 0] + }); + shapesToDelete.push(previousShape); + previousShape = currentShape; + } const alignedLabelTxtToDir = this.transformsService.alignNormAndAxis({ - shape: rotated, + shape: currentShape, fromOrigin: [0, 0, 0], fromNorm: [0, 1, 0], fromAx: [0, 0, 1], @@ -456,8 +601,8 @@ export class DimensionsService { toNorm: normalThreePoints, toAx: dirNorm as Inputs.Base.Vector3, }); - - shapesToDelete.push(rotated); + + shapesToDelete.push(previousShape); const addToDir = this.base.vector.add({ first: endPtLabelLine, diff --git a/packages/dev/occt/lib/services/dimensions.test.ts b/packages/dev/occt/lib/services/dimensions.test.ts new file mode 100644 index 000000000..4a949db89 --- /dev/null +++ b/packages/dev/occt/lib/services/dimensions.test.ts @@ -0,0 +1,957 @@ +import initOpenCascade, { OpenCascadeInstance } from "../../bitbybit-dev-occt/bitbybit-dev-occt"; +import * as Inputs from "../api/inputs/inputs"; +import { ShapesHelperService } from "../api/shapes-helper.service"; +import { VectorHelperService } from "../api/vector-helper.service"; +import { OccHelper } from "../occ-helper"; +import { OCCTDimensions } from "./dimensions"; +import { OCCTCompound, OCCTVertex } from "./shapes"; + +/** + * Comprehensive unit tests for the dimensions service. + * + * These tests verify: + * - Creation of linear, angular, and pin dimensions + * - Arrow rendering (normal and flipped) + * - Label transformations (rotation, flipping, offset) + * - Label expression evaluation (mathematical and template strings) + * - Edge cases (very small/large dimensions, extreme arrow angles) + * + * Tests use vertex coordinate validation to ensure geometric accuracy. + */ +describe("OCCT dimensions unit tests", () => { + let occt: OpenCascadeInstance; + let occHelper: OccHelper; + let compound: OCCTCompound; + let vertex: OCCTVertex; + let dimensions: OCCTDimensions; + + beforeAll(async () => { + occt = await initOpenCascade(); + const vec = new VectorHelperService(); + const s = new ShapesHelperService(); + occHelper = new OccHelper(vec, s, occt); + compound = new OCCTCompound(occt, occHelper); + vertex = new OCCTVertex(occt, occHelper); + dimensions = new OCCTDimensions(occt, occHelper); + }); + + describe("simpleLinearLengthDimension", () => { + it("should create a basic linear dimension between two points", () => { + const inputs = new Inputs.OCCT.SimpleLinearLengthDimensionDto(); + inputs.start = [0, 0, 0]; + inputs.end = [10, 0, 0]; + inputs.direction = [0, 2, 0]; + inputs.labelSuffix = "mm"; + + const result = dimensions.simpleLinearLengthDimension(inputs); + + expect(result).toBeDefined(); + expect(result.IsNull()).toBe(false); + + // Verify the compound contains shapes + const shapes = compound.getShapesOfCompound({ shape: result }); + expect(shapes.length).toBeGreaterThan(0); + + // Extract and verify vertices + const vertices = occHelper.shapeGettersService.getVertices({ shape: result }); + expect(vertices.length).toBeGreaterThan(0); + + const vertexPoints = vertices.map(v => vertex.vertexToPoint({ shape: v })); + + // Check dimension line endpoints and extension lines + // Should include original start/end and their extensions with crossing size + const originalStart = [0, 0, 0]; + const originalEnd = [10, 0, 0]; + + const hasOriginalStart = vertexPoints.some(p => + Math.abs(p[0] - originalStart[0]) < 0.01 && + Math.abs(p[1] - originalStart[1]) < 0.01 && + Math.abs(p[2] - originalStart[2]) < 0.01 + ); + const hasOriginalEnd = vertexPoints.some(p => + Math.abs(p[0] - originalEnd[0]) < 0.01 && + Math.abs(p[1] - originalEnd[1]) < 0.01 && + Math.abs(p[2] - originalEnd[2]) < 0.01 + ); + + expect(hasOriginalStart).toBe(true); + expect(hasOriginalEnd).toBe(true); + }); + + it("should create dimension with custom label overwrite (mathematical expression)", () => { + const inputs = new Inputs.OCCT.SimpleLinearLengthDimensionDto(); + inputs.start = [0, 0, 0]; + inputs.end = [5, 0, 0]; + inputs.direction = [0, 1, 0]; + inputs.labelOverwrite = "val*10"; + inputs.decimalPlaces = 2; + inputs.labelSuffix = "mm"; + + const result = dimensions.simpleLinearLengthDimension(inputs); + const vertexPoints = occHelper.shapeGettersService.getVertices({ shape: result }); + + // These tests are not great, but they fixate on verifying the dimension was created and has expected complexity + // it will break if something changes unexpectedly. + expect(vertexPoints.length).toEqual(194); + expect(result).toBeDefined(); + expect(result.IsNull()).toBe(false); + }); + + it("should create dimension with custom label overwrite (template string)", () => { + const inputs = new Inputs.OCCT.SimpleLinearLengthDimensionDto(); + inputs.start = [0, 0, 0]; + inputs.end = [8, 0, 0]; + inputs.direction = [0, 1.5, 0]; + inputs.labelOverwrite = "Length: val"; + inputs.decimalPlaces = 1; + inputs.labelSuffix = "cm"; + + const result = dimensions.simpleLinearLengthDimension(inputs); + const vertexPoints = occHelper.shapeGettersService.getVertices({ shape: result }); + expect(vertexPoints.length).toEqual(282); + expect(result).toBeDefined(); + expect(result.IsNull()).toBe(false); + }); + + it("should create dimension with arrows", () => { + const inputs = new Inputs.OCCT.SimpleLinearLengthDimensionDto(); + inputs.start = [0, 0, 0]; + inputs.end = [10, 0, 0]; + inputs.direction = [0, 2, 0]; + inputs.endType = Inputs.OCCT.dimensionEndTypeEnum.arrow; + inputs.arrowSize = 0.5; + inputs.arrowAngle = 45; + inputs.arrowsFlipped = false; + + const result = dimensions.simpleLinearLengthDimension(inputs); + + expect(result).toBeDefined(); + expect(result.IsNull()).toBe(false); + + // Verify more shapes are present due to arrows + const shapes = compound.getShapesOfCompound({ shape: result }); + expect(shapes.length).toBeGreaterThan(4); // Should include arrow shapes + + // Extract and verify vertices - arrows should be at translated endpoints + const vertices = occHelper.shapeGettersService.getVertices({ shape: result }); + const vertexPoints = vertices.map(v => vertex.vertexToPoint({ shape: v })); + expect(vertices.length).toEqual(212); // More vertices due to arrows + + // Arrow tips should be at translated start and end points + const arrowTipStart = [0, 2, 0]; + const arrowTipEnd = [10, 2, 0]; + + const hasArrowStart = vertexPoints.some(p => + Math.abs(p[0] - arrowTipStart[0]) < 0.01 && + Math.abs(p[1] - arrowTipStart[1]) < 0.01 && + Math.abs(p[2] - arrowTipStart[2]) < 0.01 + ); + const hasArrowEnd = vertexPoints.some(p => + Math.abs(p[0] - arrowTipEnd[0]) < 0.01 && + Math.abs(p[1] - arrowTipEnd[1]) < 0.01 && + Math.abs(p[2] - arrowTipEnd[2]) < 0.01 + ); + + expect(hasArrowStart).toBe(true); + expect(hasArrowEnd).toBe(true); + }); + + it("should create dimension with flipped arrows", () => { + const inputs = new Inputs.OCCT.SimpleLinearLengthDimensionDto(); + inputs.start = [0, 0, 0]; + inputs.end = [15, 0, 0]; + inputs.direction = [0, 3, 0]; + inputs.endType = Inputs.OCCT.dimensionEndTypeEnum.arrow; + inputs.arrowSize = 0.4; + inputs.arrowAngle = 30; + inputs.arrowsFlipped = true; + + const result = dimensions.simpleLinearLengthDimension(inputs); + + expect(result).toBeDefined(); + expect(result.IsNull()).toBe(false); + }); + + it("should create dimension with custom crossing size", () => { + const inputs = new Inputs.OCCT.SimpleLinearLengthDimensionDto(); + inputs.start = [0, 0, 0]; + inputs.end = [7, 0, 0]; + inputs.direction = [0, 1, 0]; + inputs.crossingSize = 0.5; + inputs.offsetFromPoints = 0.2; + + const result = dimensions.simpleLinearLengthDimension(inputs); + + expect(result).toBeDefined(); + expect(result.IsNull()).toBe(false); + }); + + it("should create dimension with rotated label", () => { + const inputs = new Inputs.OCCT.SimpleLinearLengthDimensionDto(); + inputs.start = [0, 0, 0]; + inputs.end = [10, 0, 0]; + inputs.direction = [0, 2, 0]; + inputs.labelRotation = 45; + inputs.labelSize = 0.2; + + const result = dimensions.simpleLinearLengthDimension(inputs); + const vertexPoints2 = occHelper.shapeGettersService.getVertices({ shape: result }); + expect(vertexPoints2.length).toBe(204); + expect(result).toBeDefined(); + expect(result.IsNull()).toBe(false); + }); + + it("should create dimension with horizontally flipped label", () => { + const inputs = new Inputs.OCCT.SimpleLinearLengthDimensionDto(); + inputs.start = [0, 0, 0]; + inputs.end = [10, 0, 0]; + inputs.direction = [0, 2, 0]; + inputs.labelFlipHorizontal = true; + + const result = dimensions.simpleLinearLengthDimension(inputs); + const vertexPoints2 = occHelper.shapeGettersService.getVertices({ shape: result }).map(v => vertex.vertexToPoint({ shape: v })); + expect(vertexPoints2.length).toBe(204); + expect(result).toBeDefined(); + expect(result.IsNull()).toBe(false); + }); + + it("should create dimension with vertically flipped label", () => { + const inputs = new Inputs.OCCT.SimpleLinearLengthDimensionDto(); + inputs.start = [0, 0, 0]; + inputs.end = [10, 0, 0]; + inputs.direction = [0, 2, 0]; + inputs.labelFlipVertical = true; + + const result = dimensions.simpleLinearLengthDimension(inputs); + const vertexPoints2 = occHelper.shapeGettersService.getVertices({ shape: result }); + expect(vertexPoints2.length).toBe(204); + expect(result).toBeDefined(); + expect(result.IsNull()).toBe(false); + }); + + it("should create dimension with both horizontal and vertical flip", () => { + const inputs = new Inputs.OCCT.SimpleLinearLengthDimensionDto(); + inputs.start = [0, 0, 0]; + inputs.end = [10, 0, 0]; + inputs.direction = [0, 2, 0]; + inputs.labelFlipHorizontal = true; + inputs.labelFlipVertical = true; + + const result = dimensions.simpleLinearLengthDimension(inputs); + const vertexPoints2 = occHelper.shapeGettersService.getVertices({ shape: result }); + expect(vertexPoints2.length).toBe(204); + expect(result).toBeDefined(); + expect(result.IsNull()).toBe(false); + }); + + it("should create dimension with custom label offset", () => { + const inputs = new Inputs.OCCT.SimpleLinearLengthDimensionDto(); + inputs.start = [0, 0, 0]; + inputs.end = [12, 0, 0]; + inputs.direction = [0, 3, 0]; + inputs.labelOffset = 1.0; + + const result = dimensions.simpleLinearLengthDimension(inputs); + const vertexPoints2 = occHelper.shapeGettersService.getVertices({ shape: result }); + expect(vertexPoints2.length).toBe(198); + expect(result).toBeDefined(); + expect(result.IsNull()).toBe(false); + }); + + it("should create dimension with different decimal places", () => { + const inputs = new Inputs.OCCT.SimpleLinearLengthDimensionDto(); + inputs.start = [0, 0, 0]; + inputs.end = [3.14159, 0, 0]; + inputs.direction = [0, 1, 0]; + inputs.decimalPlaces = 4; + + const result = dimensions.simpleLinearLengthDimension(inputs); + const vertexPoints2 = occHelper.shapeGettersService.getVertices({ shape: result }).map(v => vertex.vertexToPoint({ shape: v })); + expect(vertexPoints2.length).toBe(192); + expect(result).toBeDefined(); + expect(result.IsNull()).toBe(false); + }); + + it("should create dimension in 3D space", () => { + const inputs = new Inputs.OCCT.SimpleLinearLengthDimensionDto(); + inputs.start = [1, 2, 3]; + inputs.end = [4, 5, 6]; + inputs.direction = [0, 0, 2]; + inputs.labelSuffix = "units"; + + const result = dimensions.simpleLinearLengthDimension(inputs); + const vertexPoints2 = occHelper.shapeGettersService.getVertices({ shape: result }); + expect(vertexPoints2.length).toBe(184); + expect(result).toBeDefined(); + expect(result.IsNull()).toBe(false); + + // Verify vertices in 3D space + const vertices = occHelper.shapeGettersService.getVertices({ shape: result }); + const vertexPoints = vertices.map(v => vertex.vertexToPoint({ shape: v })); + + // Check original start and end points are in the dimension + const originalStart = [1, 2, 3]; + const originalEnd = [4, 5, 6]; + + const hasStart = vertexPoints.some(p => + Math.abs(p[0] - originalStart[0]) < 0.01 && + Math.abs(p[1] - originalStart[1]) < 0.01 && + Math.abs(p[2] - originalStart[2]) < 0.01 + ); + const hasEnd = vertexPoints.some(p => + Math.abs(p[0] - originalEnd[0]) < 0.01 && + Math.abs(p[1] - originalEnd[1]) < 0.01 && + Math.abs(p[2] - originalEnd[2]) < 0.01 + ); + expect(vertexPoints.length).toBe(184); + expect(hasStart).toBe(true); + expect(hasEnd).toBe(true); + }); + }); + + describe("simpleAngularDimension", () => { + it("should create a basic angular dimension", () => { + const inputs = new Inputs.OCCT.SimpleAngularDimensionDto(); + inputs.center = [0, 0, 0]; + inputs.direction1 = [1, 0, 0]; + inputs.direction2 = [0, 0, 1]; + inputs.radius = 3; + inputs.labelSuffix = "°"; + + const result = dimensions.simpleAngularDimension(inputs); + + expect(result).toBeDefined(); + expect(result.IsNull()).toBe(false); + + const shapes = compound.getShapesOfCompound({ shape: result }); + expect(shapes.length).toBe(4); + + // Extract and verify vertices + const vertices = occHelper.shapeGettersService.getVertices({ shape: result }); + expect(vertices.length).toBe(174); + + const vertexPoints = vertices.map(v => vertex.vertexToPoint({ shape: v })); + + // Verify dimension has arc vertices (arc will have multiple vertices on the curve) + // Just check that we have enough vertices for a proper angular dimension + expect(vertexPoints.length).toBeGreaterThan(4); + + // Check that at least some vertices are at approximately radius 3 from center + const verticesAtRadius = vertexPoints.filter(p => { + const dist = Math.sqrt(p[0] * p[0] + p[1] * p[1] + p[2] * p[2]); + return Math.abs(dist - 3) < 0.1; + }); + + expect(verticesAtRadius.length).toBeGreaterThan(0); + }); + + it("should create angular dimension with radians", () => { + const inputs = new Inputs.OCCT.SimpleAngularDimensionDto(); + inputs.center = [0, 0, 0]; + inputs.direction1 = [1, 0, 0]; + inputs.direction2 = [0, 1, 0]; + inputs.radius = 4; + inputs.radians = true; + inputs.labelSuffix = "rad"; + + const result = dimensions.simpleAngularDimension(inputs); + const vertices = occHelper.shapeGettersService.getVertices({ shape: result }); + + expect(vertices.length).toBe(122); + expect(result).toBeDefined(); + expect(result.IsNull()).toBe(false); + }); + + it("should create angular dimension with arrows", () => { + const inputs = new Inputs.OCCT.SimpleAngularDimensionDto(); + inputs.center = [0, 0, 0]; + inputs.direction1 = [1, 0, 0]; + inputs.direction2 = [1, 0, 1]; + inputs.radius = 5; + inputs.endType = Inputs.OCCT.dimensionEndTypeEnum.arrow; + inputs.arrowSize = 0.4; + inputs.arrowAngle = 35; + + const result = dimensions.simpleAngularDimension(inputs); + + expect(result).toBeDefined(); + expect(result.IsNull()).toBe(false); + + // Verify arrows are included + const shapes = compound.getShapesOfCompound({ shape: result }); + expect(shapes.length).toBeGreaterThan(4); + + // Verify vertices include arc endpoints where arrows should be placed + const vertices = occHelper.shapeGettersService.getVertices({ shape: result }); + expect(vertices.length).toBeGreaterThan(8); // More vertices due to arrows + + const vertexPoints = vertices.map(v => vertex.vertexToPoint({ shape: v })); + expect(vertices.length).toBe(258); + // Normalized direction1 * radius = [1, 0, 0] * 5 = [5, 0, 0] + const dir1End = [5, 0, 0]; + const hasDir1End = vertexPoints.some(p => + Math.abs(p[0] - dir1End[0]) < 0.01 && + Math.abs(p[1] - dir1End[1]) < 0.01 && + Math.abs(p[2] - dir1End[2]) < 0.01 + ); + + expect(hasDir1End).toBe(true); + }); + + it("should create angular dimension with flipped arrows", () => { + const inputs = new Inputs.OCCT.SimpleAngularDimensionDto(); + inputs.center = [0, 0, 0]; + inputs.direction1 = [1, 0, 0]; + inputs.direction2 = [0, 0, 1]; + inputs.radius = 3; + inputs.endType = Inputs.OCCT.dimensionEndTypeEnum.arrow; + inputs.arrowsFlipped = true; + + const result = dimensions.simpleAngularDimension(inputs); + const vertices = occHelper.shapeGettersService.getVertices({ shape: result }); + expect(vertices.length).toBe(296); + expect(result).toBeDefined(); + expect(result.IsNull()).toBe(false); + }); + + it("should create angular dimension with custom offset from center", () => { + const inputs = new Inputs.OCCT.SimpleAngularDimensionDto(); + inputs.center = [0, 0, 0]; + inputs.direction1 = [1, 0, 0]; + inputs.direction2 = [0, 1, 0]; + inputs.radius = 6; + inputs.offsetFromCenter = 1.0; + + const result = dimensions.simpleAngularDimension(inputs); + const vertices = occHelper.shapeGettersService.getVertices({ shape: result }); + expect(vertices.length).toBe(288); + + expect(result).toBeDefined(); + expect(result.IsNull()).toBe(false); + }); + + it("should create angular dimension with custom extra size", () => { + const inputs = new Inputs.OCCT.SimpleAngularDimensionDto(); + inputs.center = [0, 0, 0]; + inputs.direction1 = [1, 0, 0]; + inputs.direction2 = [0, 0, 1]; + inputs.radius = 4; + inputs.extraSize = 0.8; + + const result = dimensions.simpleAngularDimension(inputs); + const vertices = occHelper.shapeGettersService.getVertices({ shape: result }); + expect(vertices.length).toBe(288); + + expect(result).toBeDefined(); + expect(result.IsNull()).toBe(false); + }); + + it("should create angular dimension with rotated label", () => { + const inputs = new Inputs.OCCT.SimpleAngularDimensionDto(); + inputs.center = [0, 0, 0]; + inputs.direction1 = [1, 0, 0]; + inputs.direction2 = [1, 1, 0]; + inputs.radius = 3; + inputs.labelRotation = 30; + + const result = dimensions.simpleAngularDimension(inputs); + const vertices = occHelper.shapeGettersService.getVertices({ shape: result }); + expect(vertices.length).toBe(250); + + expect(result).toBeDefined(); + expect(result.IsNull()).toBe(false); + }); + + it("should create angular dimension with flipped label", () => { + const inputs = new Inputs.OCCT.SimpleAngularDimensionDto(); + inputs.center = [0, 0, 0]; + inputs.direction1 = [1, 0, 0]; + inputs.direction2 = [0, 0, 1]; + inputs.radius = 4; + inputs.labelFlipHorizontal = true; + inputs.labelFlipVertical = true; + + const result = dimensions.simpleAngularDimension(inputs); + const vertices = occHelper.shapeGettersService.getVertices({ shape: result }); + expect(vertices.length).toBe(288); + + expect(result).toBeDefined(); + expect(result.IsNull()).toBe(false); + }); + + it("should create angular dimension with custom label overwrite", () => { + const inputs = new Inputs.OCCT.SimpleAngularDimensionDto(); + inputs.center = [0, 0, 0]; + inputs.direction1 = [1, 0, 0]; + inputs.direction2 = [0, 1, 0]; + inputs.radius = 5; + inputs.labelOverwrite = "Angle: val"; + inputs.decimalPlaces = 1; + + const result = dimensions.simpleAngularDimension(inputs); + const vertices = occHelper.shapeGettersService.getVertices({ shape: result }); + expect(vertices.length).toBe(364); + + expect(result).toBeDefined(); + expect(result.IsNull()).toBe(false); + }); + + it("should create angular dimension with custom label offset", () => { + const inputs = new Inputs.OCCT.SimpleAngularDimensionDto(); + inputs.center = [0, 0, 0]; + inputs.direction1 = [1, 0, 0]; + inputs.direction2 = [0, 0, 1]; + inputs.radius = 4; + inputs.labelOffset = 0.8; + + const result = dimensions.simpleAngularDimension(inputs); + const vertices = occHelper.shapeGettersService.getVertices({ shape: result }); + expect(vertices.length).toBe(288); + expect(result).toBeDefined(); + expect(result.IsNull()).toBe(false); + }); + + it("should create angular dimension in different plane", () => { + const inputs = new Inputs.OCCT.SimpleAngularDimensionDto(); + inputs.center = [5, 5, 5]; + inputs.direction1 = [0, 1, 0]; + inputs.direction2 = [0, 0, 1]; + inputs.radius = 3; + + const result = dimensions.simpleAngularDimension(inputs); + + expect(result).toBeDefined(); + expect(result.IsNull()).toBe(false); + + // Verify vertices with offset center + const vertices = occHelper.shapeGettersService.getVertices({ shape: result }); + expect(vertices.length).toBeGreaterThan(0); + expect(vertices.length).toBe(288); + const vertexPoints = vertices.map(v => vertex.vertexToPoint({ shape: v })); + + // Check that vertices are at approximately radius 3 from center [5, 5, 5] + const center = [5, 5, 5]; + const verticesAtRadius = vertexPoints.filter(p => { + const dx = p[0] - center[0]; + const dy = p[1] - center[1]; + const dz = p[2] - center[2]; + const dist = Math.sqrt(dx * dx + dy * dy + dz * dz); + return Math.abs(dist - 3) < 0.1; + }); + + expect(verticesAtRadius.length).toBeGreaterThan(0); + + // Verify the dimension is in the correct plane (Y-Z plane around center) + // At least some vertices should have X coordinate close to center's X + const verticesNearCenterX = vertexPoints.filter(p => + Math.abs(p[0] - center[0]) < 0.1 + ); + + expect(verticesNearCenterX.length).toBeGreaterThan(0); + }); + + it("should handle small angles correctly", () => { + const inputs = new Inputs.OCCT.SimpleAngularDimensionDto(); + inputs.center = [0, 0, 0]; + inputs.direction1 = [1, 0, 0]; + inputs.direction2 = [0.99, 0, 0.1]; + inputs.radius = 3; + inputs.decimalPlaces = 1; + + const result = dimensions.simpleAngularDimension(inputs); + const vertices = occHelper.shapeGettersService.getVertices({ shape: result }); + expect(vertices.length).toBe(236); + expect(result).toBeDefined(); + expect(result.IsNull()).toBe(false); + }); + }); + + describe("pinWithLabel", () => { + it("should create a basic pin with label", () => { + const inputs = new Inputs.OCCT.PinWithLabelDto(); + inputs.startPoint = [0, 0, 0]; + inputs.endPoint = [0, 5, 0]; + inputs.direction = [2, 0, 0]; + inputs.label = "Point A"; + + const result = dimensions.pinWithLabel(inputs); + + + expect(result).toBeDefined(); + expect(result.IsNull()).toBe(false); + + const shapes = compound.getShapesOfCompound({ shape: result }); + expect(shapes.length).toBeGreaterThan(0); + + // Verify vertices include start and end points + const vertices = occHelper.shapeGettersService.getVertices({ shape: result }); + const vertexPoints = vertices.map(v => vertex.vertexToPoint({ shape: v })); + expect(vertices.length).toBe(96); + + const hasStart = vertexPoints.some(p => + Math.abs(p[0] - 0) < 0.01 && + Math.abs(p[1] - 0) < 0.01 && + Math.abs(p[2] - 0) < 0.01 + ); + const hasEnd = vertexPoints.some(p => + Math.abs(p[0] - 0) < 0.01 && + Math.abs(p[1] - 5) < 0.01 && + Math.abs(p[2] - 0) < 0.01 + ); + + // Label line end at endPoint + direction = [0, 5, 0] + [2, 0, 0] = [2, 5, 0] + const labelLineEnd = [2, 5, 0]; + const hasLabelLineEnd = vertexPoints.some(p => + Math.abs(p[0] - labelLineEnd[0]) < 0.01 && + Math.abs(p[1] - labelLineEnd[1]) < 0.01 && + Math.abs(p[2] - labelLineEnd[2]) < 0.01 + ); + + expect(hasStart).toBe(true); + expect(hasEnd).toBe(true); + expect(hasLabelLineEnd).toBe(true); + }); + + it("should create pin with arrow", () => { + const inputs = new Inputs.OCCT.PinWithLabelDto(); + inputs.startPoint = [0, 0, 0]; + inputs.endPoint = [0, 3, 0]; + inputs.direction = [1, 0, 0]; + inputs.label = "Origin"; + inputs.endType = Inputs.OCCT.dimensionEndTypeEnum.arrow; + inputs.arrowSize = 0.3; + inputs.arrowAngle = 40; + + const result = dimensions.pinWithLabel(inputs); + + expect(result).toBeDefined(); + expect(result.IsNull()).toBe(false); + + // Should include arrow shape + const shapes = compound.getShapesOfCompound({ shape: result }); + expect(shapes.length).toBeGreaterThan(3); + + // Verify arrow is placed at start point + const vertices = occHelper.shapeGettersService.getVertices({ shape: result }); + expect(vertices.length).toBeGreaterThan(6); // More vertices due to arrow + expect(vertices.length).toBe(130); + const vertexPoints = vertices.map(v => vertex.vertexToPoint({ shape: v })); + + // Arrow tip should be at start point [0, 0, 0] + const hasArrowTip = vertexPoints.some(p => + Math.abs(p[0] - 0) < 0.01 && + Math.abs(p[1] - 0) < 0.01 && + Math.abs(p[2] - 0) < 0.01 + ); + + expect(hasArrowTip).toBe(true); + }); + + it("should create pin with flipped arrow", () => { + const inputs = new Inputs.OCCT.PinWithLabelDto(); + inputs.startPoint = [0, 0, 0]; + inputs.endPoint = [0, 4, 0]; + inputs.direction = [1.5, 0, 0]; + inputs.label = "Point"; + inputs.endType = Inputs.OCCT.dimensionEndTypeEnum.arrow; + inputs.arrowsFlipped = true; + + const result = dimensions.pinWithLabel(inputs); + const vertices = occHelper.shapeGettersService.getVertices({ shape: result }); + + expect(vertices.length).toBe(94); + expect(result).toBeDefined(); + expect(result.IsNull()).toBe(false); + }); + + it("should create pin with custom label offset", () => { + const inputs = new Inputs.OCCT.PinWithLabelDto(); + inputs.startPoint = [1, 1, 1]; + inputs.endPoint = [1, 6, 1]; + inputs.direction = [2, 0, 0]; + inputs.label = "Custom"; + inputs.labelOffset = 0.6; + + const result = dimensions.pinWithLabel(inputs); + const vertices = occHelper.shapeGettersService.getVertices({ shape: result }); + + expect(vertices.length).toBe(152); + expect(result).toBeDefined(); + expect(result.IsNull()).toBe(false); + }); + + it("should create pin with custom label size", () => { + const inputs = new Inputs.OCCT.PinWithLabelDto(); + inputs.startPoint = [0, 0, 0]; + inputs.endPoint = [0, 4, 0]; + inputs.direction = [1, 0, 0]; + inputs.label = "Large Text"; + inputs.labelSize = 0.3; + + const result = dimensions.pinWithLabel(inputs); + const vertices = occHelper.shapeGettersService.getVertices({ shape: result }); + + expect(vertices.length).toBe(166); + expect(result).toBeDefined(); + expect(result.IsNull()).toBe(false); + }); + + it("should create pin with offset from start", () => { + const inputs = new Inputs.OCCT.PinWithLabelDto(); + inputs.startPoint = [0, 0, 0]; + inputs.endPoint = [0, 5, 0]; + inputs.direction = [2, 0, 0]; + inputs.label = "Offset"; + inputs.offsetFromStart = 0.5; + + const result = dimensions.pinWithLabel(inputs); + const vertices = occHelper.shapeGettersService.getVertices({ shape: result }); + + expect(vertices.length).toBe(138); + expect(result).toBeDefined(); + expect(result.IsNull()).toBe(false); + }); + + it("should create pin with rotated label", () => { + const inputs = new Inputs.OCCT.PinWithLabelDto(); + inputs.startPoint = [0, 0, 0]; + inputs.endPoint = [0, 4, 0]; + inputs.direction = [1, 0, 0]; + inputs.label = "Rotated"; + inputs.labelRotation = 45; + + const result = dimensions.pinWithLabel(inputs); + const vertices = occHelper.shapeGettersService.getVertices({ shape: result }); + + expect(vertices.length).toBe(166); + expect(result).toBeDefined(); + expect(result.IsNull()).toBe(false); + }); + + it("should create pin with horizontally flipped label", () => { + const inputs = new Inputs.OCCT.PinWithLabelDto(); + inputs.startPoint = [0, 0, 0]; + inputs.endPoint = [0, 5, 0]; + inputs.direction = [2, 0, 0]; + inputs.label = "Flipped H"; + inputs.labelFlipHorizontal = true; + + const result = dimensions.pinWithLabel(inputs); + const vertices = occHelper.shapeGettersService.getVertices({ shape: result }); + + expect(vertices.length).toBe(144); + expect(result).toBeDefined(); + expect(result.IsNull()).toBe(false); + }); + + it("should create pin with vertically flipped label", () => { + const inputs = new Inputs.OCCT.PinWithLabelDto(); + inputs.startPoint = [0, 0, 0]; + inputs.endPoint = [0, 5, 0]; + inputs.direction = [2, 0, 0]; + inputs.label = "Flipped V"; + inputs.labelFlipVertical = true; + + const result = dimensions.pinWithLabel(inputs); + const vertices = occHelper.shapeGettersService.getVertices({ shape: result }); + + expect(vertices.length).toBe(142); + expect(result).toBeDefined(); + expect(result.IsNull()).toBe(false); + }); + + it("should create pin with both flips", () => { + const inputs = new Inputs.OCCT.PinWithLabelDto(); + inputs.startPoint = [0, 0, 0]; + inputs.endPoint = [0, 5, 0]; + inputs.direction = [2, 0, 0]; + inputs.label = "Both Flips"; + inputs.labelFlipHorizontal = true; + inputs.labelFlipVertical = true; + + const result = dimensions.pinWithLabel(inputs); + const vertices = occHelper.shapeGettersService.getVertices({ shape: result }); + + expect(vertices.length).toBe(174); + expect(result).toBeDefined(); + expect(result.IsNull()).toBe(false); + }); + + it("should create pin in 3D space", () => { + const inputs = new Inputs.OCCT.PinWithLabelDto(); + inputs.startPoint = [2, 3, 4]; + inputs.endPoint = [2, 8, 4]; + inputs.direction = [0, 0, 2]; + inputs.label = "3D Pin"; + + const result = dimensions.pinWithLabel(inputs); + + expect(result).toBeDefined(); + expect(result.IsNull()).toBe(false); + + // Verify 3D coordinates + const vertices = occHelper.shapeGettersService.getVertices({ shape: result }); + const vertexPoints = vertices.map(v => vertex.vertexToPoint({ shape: v })); + + expect(vertices.length).toBe(100); + const hasStart = vertexPoints.some(p => + Math.abs(p[0] - 2) < 0.01 && + Math.abs(p[1] - 3) < 0.01 && + Math.abs(p[2] - 4) < 0.01 + ); + const hasEnd = vertexPoints.some(p => + Math.abs(p[0] - 2) < 0.01 && + Math.abs(p[1] - 8) < 0.01 && + Math.abs(p[2] - 4) < 0.01 + ); + + // Label line end: [2, 8, 4] + [0, 0, 2] = [2, 8, 6] + const labelEnd = [2, 8, 6]; + const hasLabelEnd = vertexPoints.some(p => + Math.abs(p[0] - labelEnd[0]) < 0.01 && + Math.abs(p[1] - labelEnd[1]) < 0.01 && + Math.abs(p[2] - labelEnd[2]) < 0.01 + ); + + expect(hasStart).toBe(true); + expect(hasEnd).toBe(true); + expect(hasLabelEnd).toBe(true); + }); + + it("should create pin with all custom parameters", () => { + const inputs = new Inputs.OCCT.PinWithLabelDto(); + inputs.startPoint = [1, 2, 3]; + inputs.endPoint = [1, 7, 3]; + inputs.direction = [2, 0, 1]; + inputs.label = "Complex"; + inputs.offsetFromStart = 0.3; + inputs.labelOffset = 0.5; + inputs.labelSize = 0.15; + inputs.endType = Inputs.OCCT.dimensionEndTypeEnum.arrow; + inputs.arrowSize = 0.4; + inputs.arrowAngle = 35; + inputs.labelRotation = 20; + + const result = dimensions.pinWithLabel(inputs); + + expect(result).toBeDefined(); + expect(result.IsNull()).toBe(false); + }); + }); + + describe("label expression evaluation", () => { + it("should handle mathematical expressions in linear dimension", () => { + const inputs = new Inputs.OCCT.SimpleLinearLengthDimensionDto(); + inputs.start = [0, 0, 0]; + inputs.end = [10, 0, 0]; + inputs.direction = [0, 1, 0]; + inputs.labelOverwrite = "val/10"; + inputs.decimalPlaces = 3; + inputs.labelSuffix = "m"; + + const result = dimensions.simpleLinearLengthDimension(inputs); + const vertices = occHelper.shapeGettersService.getVertices({ shape: result }); + expect(vertices.length).toBe(142); + expect(result).toBeDefined(); + expect(result.IsNull()).toBe(false); + }); + + it("should handle complex mathematical expressions", () => { + const inputs = new Inputs.OCCT.SimpleLinearLengthDimensionDto(); + inputs.start = [0, 0, 0]; + inputs.end = [5, 0, 0]; + inputs.direction = [0, 1, 0]; + inputs.labelOverwrite = "(val*2)+10"; + inputs.decimalPlaces = 1; + inputs.labelSuffix = "units"; + + const result = dimensions.simpleLinearLengthDimension(inputs); + const vertices = occHelper.shapeGettersService.getVertices({ shape: result }); + + expect(vertices.length).toBe(184); + expect(result).toBeDefined(); + expect(result.IsNull()).toBe(false); + }); + + it("should handle invalid expressions gracefully", () => { + const inputs = new Inputs.OCCT.SimpleLinearLengthDimensionDto(); + inputs.start = [0, 0, 0]; + inputs.end = [7, 0, 0]; + inputs.direction = [0, 1, 0]; + inputs.labelOverwrite = "invalid expression $#@"; + inputs.decimalPlaces = 2; + inputs.labelSuffix = "mm"; + + const result = dimensions.simpleLinearLengthDimension(inputs); + const vertices = occHelper.shapeGettersService.getVertices({ shape: result }); + + expect(vertices.length).toBe(568); + // Should still create the dimension, falling back to template or value + expect(result).toBeDefined(); + expect(result.IsNull()).toBe(false); + }); + }); + + describe("edge cases and robustness", () => { + it("should handle very small dimensions", () => { + const inputs = new Inputs.OCCT.SimpleLinearLengthDimensionDto(); + inputs.start = [0, 0, 0]; + inputs.end = [0.001, 0, 0]; + inputs.direction = [0, 0.1, 0]; + inputs.decimalPlaces = 5; + + const result = dimensions.simpleLinearLengthDimension(inputs); + const vertices = occHelper.shapeGettersService.getVertices({ shape: result }); + + expect(vertices.length).toBe(268); + expect(result).toBeDefined(); + expect(result.IsNull()).toBe(false); + }); + + it("should handle very large dimensions", () => { + const inputs = new Inputs.OCCT.SimpleLinearLengthDimensionDto(); + inputs.start = [0, 0, 0]; + inputs.end = [10000, 0, 0]; + inputs.direction = [0, 100, 0]; + + const result = dimensions.simpleLinearLengthDimension(inputs); + const vertices = occHelper.shapeGettersService.getVertices({ shape: result }); + + expect(vertices.length).toBe(300); + expect(result).toBeDefined(); + expect(result.IsNull()).toBe(false); + }); + + it("should handle very small arrow angle", () => { + const inputs = new Inputs.OCCT.SimpleLinearLengthDimensionDto(); + inputs.start = [0, 0, 0]; + inputs.end = [10, 0, 0]; + inputs.direction = [0, 2, 0]; + inputs.endType = Inputs.OCCT.dimensionEndTypeEnum.arrow; + inputs.arrowAngle = 5; + + const result = dimensions.simpleLinearLengthDimension(inputs); + const vertices = occHelper.shapeGettersService.getVertices({ shape: result }); + + expect(vertices.length).toBe(212); + expect(result).toBeDefined(); + expect(result.IsNull()).toBe(false); + }); + + it("should handle maximum arrow angle", () => { + const inputs = new Inputs.OCCT.SimpleLinearLengthDimensionDto(); + inputs.start = [0, 0, 0]; + inputs.end = [10, 0, 0]; + inputs.direction = [0, 2, 0]; + inputs.endType = Inputs.OCCT.dimensionEndTypeEnum.arrow; + inputs.arrowAngle = 90; + + const result = dimensions.simpleLinearLengthDimension(inputs); + const vertices = occHelper.shapeGettersService.getVertices({ shape: result }); + + expect(vertices.length).toBe(212); + expect(result).toBeDefined(); + expect(result.IsNull()).toBe(false); + }); + }); +}); diff --git a/packages/dev/occt/lib/services/operations.test.ts b/packages/dev/occt/lib/services/operations.test.ts index ec71e6600..3b2b8100f 100644 --- a/packages/dev/occt/lib/services/operations.test.ts +++ b/packages/dev/occt/lib/services/operations.test.ts @@ -914,6 +914,259 @@ describe("OCCT operations unit tests", () => { res.delete(); }); + describe("Bounding box operations", () => { + it("should get bounding box properties of a box shape", () => { + const box = occHelper.entitiesService.bRepPrimAPIMakeBox(2, 3, 4, [0, 0, 0]); + const bbox = operations.boundingBoxOfShape({ shape: box }); + + expect(bbox.min[0]).toBeCloseTo(-1, 5); + expect(bbox.min[1]).toBeCloseTo(-2, 5); + expect(bbox.min[2]).toBeCloseTo(-1.5, 5); + expect(bbox.max[0]).toBeCloseTo(1, 5); + expect(bbox.max[1]).toBeCloseTo(2, 5); + expect(bbox.max[2]).toBeCloseTo(1.5, 5); + expect(bbox.center[0]).toBeCloseTo(0, 5); + expect(bbox.center[1]).toBeCloseTo(0, 5); + expect(bbox.center[2]).toBeCloseTo(0, 5); + expect(bbox.size[0]).toBeCloseTo(2, 5); + expect(bbox.size[1]).toBeCloseTo(4, 5); + expect(bbox.size[2]).toBeCloseTo(3, 5); + + box.delete(); + }); + + it("should get bounding box min point of a sphere", () => { + const sphere = occHelper.entitiesService.bRepPrimAPIMakeSphere([0, 0, 0], [0, 1, 0], 2); + const min = operations.boundingBoxMinOfShape({ shape: sphere }); + + expect(min[0]).toBeCloseTo(-2, 5); + expect(min[1]).toBeCloseTo(-2, 5); + expect(min[2]).toBeCloseTo(-2, 5); + + sphere.delete(); + }); + + it("should get bounding box max point of a sphere", () => { + const sphere = occHelper.entitiesService.bRepPrimAPIMakeSphere([5, 10, -3], [0, 1, 0], 1.5); + const max = operations.boundingBoxMaxOfShape({ shape: sphere }); + + expect(max[0]).toBeCloseTo(6.5, 5); + expect(max[1]).toBeCloseTo(11.5, 5); + expect(max[2]).toBeCloseTo(-1.5, 5); + + sphere.delete(); + }); + + it("should get bounding box center of a cylinder", () => { + const cyl = occHelper.entitiesService.bRepPrimAPIMakeCylinder([0, 0, 0], [0, 1, 0], 2, 10, 360); + const center = operations.boundingBoxCenterOfShape({ shape: cyl }); + + expect(center[0]).toBeCloseTo(0, 5); + expect(center[1]).toBeCloseTo(5, 5); + expect(center[2]).toBeCloseTo(0, 5); + + cyl.delete(); + }); + + it("should get bounding box size of a cube", () => { + const box = occHelper.entitiesService.bRepPrimAPIMakeBox(5, 5, 5, [0, 0, 0]); + const size = operations.boundingBoxSizeOfShape({ shape: box }); + + expect(size[0]).toBeCloseTo(5, 5); + expect(size[1]).toBeCloseTo(5, 5); + expect(size[2]).toBeCloseTo(5, 5); + + box.delete(); + }); + + it("should create a bounding box shape from a complex wire", () => { + const points = [ + [0, 0, 0], + [5, 10, 3], + [-2, 5, 8], + [3, -1, 2] + ] as Inputs.Base.Point3[]; + const polyWire = wire.createPolylineWire({ points }); + + const bboxShape = operations.boundingBoxShapeOfShape({ shape: polyWire }); + const volume = solid.getSolidVolume({ shape: bboxShape }); + const bbox = operations.boundingBoxOfShape({ shape: polyWire }); + + // Volume should be width * height * depth + const expectedVolume = bbox.size[0] * bbox.size[1] * bbox.size[2]; + expect(volume).toBeCloseTo(expectedVolume, 5); + + polyWire.delete(); + bboxShape.delete(); + }); + + it("should get bounding box of compound shape with multiple solids", () => { + const box1 = occHelper.entitiesService.bRepPrimAPIMakeBox(1, 1, 1, [0, 0, 0]); + const box2 = occHelper.entitiesService.bRepPrimAPIMakeBox(1, 1, 1, [5, 5, 5]); + const compound = occHelper.converterService.makeCompound({ shapes: [box1, box2] }); + + const bbox = operations.boundingBoxOfShape({ shape: compound }); + + expect(bbox.min[0]).toBeCloseTo(-0.5, 4); + expect(bbox.min[1]).toBeCloseTo(-0.5, 4); + expect(bbox.min[2]).toBeCloseTo(-0.5, 4); + expect(bbox.max[0]).toBeCloseTo(5.5, 4); + expect(bbox.max[1]).toBeCloseTo(5.5, 4); + expect(bbox.max[2]).toBeCloseTo(5.5, 4); + expect(bbox.size[0]).toBeCloseTo(6, 4); + expect(bbox.size[1]).toBeCloseTo(6, 4); + expect(bbox.size[2]).toBeCloseTo(6, 4); + + box1.delete(); + box2.delete(); + compound.delete(); + }); + + it("should get bounding box of extruded wire", () => { + const circleWire = wire.createCircleWire({ center: [3, 0, 0], radius: 1, direction: [0, 1, 0] }); + const extruded = operations.extrude({ shape: circleWire, direction: [0, 5, 0] }); + + const bbox = operations.boundingBoxOfShape({ shape: extruded }); + + expect(bbox.min[0]).toBeCloseTo(2, 5); + expect(bbox.min[1]).toBeCloseTo(0, 5); + expect(bbox.min[2]).toBeCloseTo(-1, 5); + expect(bbox.max[0]).toBeCloseTo(4, 5); + expect(bbox.max[1]).toBeCloseTo(5, 5); + expect(bbox.max[2]).toBeCloseTo(1, 5); + + circleWire.delete(); + extruded.delete(); + }); + + it("should get bounding box of revolved shape", () => { + const squareFace = face.createSquareFace({ center: [5, 0, 0], size: 2, direction: [0, 1, 0] }); + const revolved = operations.revolve({ shape: squareFace, direction: [0, 1, 0], angle: 180, copy: false }); + + const bbox = operations.boundingBoxOfShape({ shape: revolved }); + + expect(bbox.min[0]).toBeCloseTo(-6, 0); + expect(bbox.min[1]).toBeCloseTo(0, 5); + expect(bbox.min[2]).toBeCloseTo(-6, 0); + expect(bbox.max[0]).toBeCloseTo(6, 0); + expect(bbox.max[1]).toBeCloseTo(0, 5); + expect(bbox.max[2]).toBeCloseTo(1, 0); + + squareFace.delete(); + revolved.delete(); + }); + }); + + describe("Bounding sphere operations", () => { + it("should get bounding sphere properties of a box", () => { + const box = occHelper.entitiesService.bRepPrimAPIMakeBox(2, 2, 2, [0, 0, 0]); + const bsphere = operations.boundingSphereOfShape({ shape: box }); + + // Box is centered at [0,0,0], bounding sphere center is at bbox center + expect(bsphere.center[0]).toBeCloseTo(0, 5); + expect(bsphere.center[1]).toBeCloseTo(0, 5); + expect(bsphere.center[2]).toBeCloseTo(0, 5); + expect(bsphere.radius).toBeCloseTo(Math.sqrt(3), 5); + + box.delete(); + }); + + it("should get bounding sphere center of a sphere", () => { + const sphere = occHelper.entitiesService.bRepPrimAPIMakeSphere([3, 4, 5], [0, 1, 0], 2); + const center = operations.boundingSphereCenterOfShape({ shape: sphere }); + + expect(center[0]).toBeCloseTo(3, 5); + expect(center[1]).toBeCloseTo(4, 5); + expect(center[2]).toBeCloseTo(5, 5); + + sphere.delete(); + }); + + it("should get bounding sphere radius of a cylinder", () => { + const cyl = occHelper.entitiesService.bRepPrimAPIMakeCylinder([0, 0, 0], [0, 1, 0], 3, 8, 360); + const radius = operations.boundingSphereRadiusOfShape({ shape: cyl }); + + // For a cylinder with radius 3 and height 8, the bounding sphere radius is + // the distance from center (0, 4, 0) to corner (3, 8, 0) or (3, 0, 0) + // = sqrt(3^2 + 4^2 + 3^2) = sqrt(34) ≈ 5.83 + expect(radius).toBeCloseTo(Math.sqrt(34), 2); + + cyl.delete(); + }); + + it("should create a bounding sphere shape from a torus-like shape", () => { + const circle = face.createCircleFace({ center: [5, 0, 0], radius: 1, direction: [0, 1, 0] }); + const torus = operations.revolve({ shape: circle, direction: [0, 1, 0], angle: 360, copy: false }); + + const bsphereShape = operations.boundingSphereShapeOfShape({ shape: torus }); + const bsphere = operations.boundingSphereOfShape({ shape: torus }); + + // Get the volume of the bounding sphere + const volume = solid.getSolidVolume({ shape: bsphereShape }); + const expectedVolume = (4 / 3) * Math.PI * Math.pow(bsphere.radius, 3); + + expect(volume).toBeCloseTo(expectedVolume, 2); + + circle.delete(); + torus.delete(); + bsphereShape.delete(); + }); + + it("should get bounding sphere of compound with multiple shapes", () => { + const sphere1 = occHelper.entitiesService.bRepPrimAPIMakeSphere([0, 0, 0], [0, 1, 0], 1); + const sphere2 = occHelper.entitiesService.bRepPrimAPIMakeSphere([10, 0, 0], [0, 1, 0], 1); + const compound = occHelper.converterService.makeCompound({ shapes: [sphere1, sphere2] }); + + const bsphere = operations.boundingSphereOfShape({ shape: compound }); + + // Center should be at midpoint of bounding box + expect(bsphere.center[0]).toBeCloseTo(5, 5); + expect(bsphere.center[1]).toBeCloseTo(0, 5); + expect(bsphere.center[2]).toBeCloseTo(0, 5); + + expect(bsphere.radius).toBeCloseTo(Math.sqrt(38), 2); + + sphere1.delete(); + sphere2.delete(); + compound.delete(); + }); + + it("should get bounding sphere for a wire", () => { + const points = [ + [0, 0, 0], + [10, 0, 0], + [10, 10, 0], + [0, 10, 0] + ] as Inputs.Base.Point3[]; + const squareWire = wire.createPolylineWire({ points }); + + const bsphere = operations.boundingSphereOfShape({ shape: squareWire }); + + expect(bsphere.center).toEqual([5, 5, 0]); + expect(bsphere.radius).toBeCloseTo(Math.sqrt(50), 5); + + squareWire.delete(); + }); + + it("should compare bounding box and bounding sphere volumes", () => { + const box = occHelper.entitiesService.bRepPrimAPIMakeBox(4, 4, 4, [-2, -2, -2]); + + const bboxShape = operations.boundingBoxShapeOfShape({ shape: box }); + const bsphereShape = operations.boundingSphereShapeOfShape({ shape: box }); + + const bboxVolume = solid.getSolidVolume({ shape: bboxShape }); + const bsphereVolume = solid.getSolidVolume({ shape: bsphereShape }); + + // Bounding sphere should always have larger volume than bounding box for a cube + expect(bsphereVolume).toBeGreaterThan(bboxVolume); + expect(bboxVolume).toBeCloseTo(64, 4); + + box.delete(); + bboxShape.delete(); + bsphereShape.delete(); + }); + }); + }); diff --git a/packages/dev/occt/lib/services/shapes/face.test.ts b/packages/dev/occt/lib/services/shapes/face.test.ts index 2e23e0162..e42fba597 100644 --- a/packages/dev/occt/lib/services/shapes/face.test.ts +++ b/packages/dev/occt/lib/services/shapes/face.test.ts @@ -5,7 +5,7 @@ import { VectorHelperService } from "../../api/vector-helper.service"; import { ShapesHelperService } from "../../api/shapes-helper.service"; import { OCCTFace } from "./face"; import { OCCTGeom } from "../geom/geom"; -import { OCCT } from "../../api/inputs"; +import { Base, OCCT } from "../../api/inputs"; describe("OCCT face unit tests", () => { let occt: OpenCascadeInstance; @@ -1292,6 +1292,344 @@ describe("OCCT face unit tests", () => { }; }); + describe("Face creation methods", () => { + it("should create L-polygon face with default parameters", () => { + const f = face.createLPolygonFace({ + widthFirst: 2, + lengthFirst: 3, + widthSecond: 1, + lengthSecond: 2, + align: OCCT.directionEnum.outside, + rotation: 0, + center: [0, 0, 0], + direction: [0, 1, 0] + }); + const area = face.getFaceArea({ shape: f }); + expect(f.ShapeType()).toBe(occt.TopAbs_ShapeEnum.TopAbs_FACE); + expect(area).toBeCloseTo(10); + f.delete(); + }); + + it("should create L-polygon face with different alignment", () => { + const f = face.createLPolygonFace({ + widthFirst: 3, + lengthFirst: 4, + widthSecond: 1.5, + lengthSecond: 3, + align: OCCT.directionEnum.inside, + rotation: 0, + center: [0, 0, 0], + direction: [0, 1, 0] + }); + const area = face.getFaceArea({ shape: f }); + expect(f.ShapeType()).toBe(occt.TopAbs_ShapeEnum.TopAbs_FACE); + expect(area).toBeCloseTo(11.9999975); + f.delete(); + }); + + it("should create I-beam profile face with default parameters", () => { + const f = face.createIBeamProfileFace({ + width: 2, + height: 3, + webThickness: 0.2, + flangeThickness: 0.3, + alignment: Base.basicAlignmentEnum.midMid, + rotation: 0, + center: [0, 0, 0], + direction: [0, 1, 0] + }); + const area = face.getFaceArea({ shape: f }); + expect(f.ShapeType()).toBe(occt.TopAbs_ShapeEnum.TopAbs_FACE); + expect(area).toBeCloseTo(1.68); + f.delete(); + }); + + it("should create I-beam profile face with custom dimensions", () => { + const f = face.createIBeamProfileFace({ + width: 4, + height: 5, + webThickness: 0.5, + flangeThickness: 0.8, + alignment: Base.basicAlignmentEnum.midMid, + rotation: 0, + center: [0, 0, 0], + direction: [0, 1, 0] + }); + const area = face.getFaceArea({ shape: f }); + expect(f.ShapeType()).toBe(occt.TopAbs_ShapeEnum.TopAbs_FACE); + expect(area).toBeCloseTo(8.099); + f.delete(); + }); + + it("should create H-beam profile face with default parameters", () => { + const f = face.createHBeamProfileFace({ + width: 2, + height: 3, + webThickness: 0.2, + flangeThickness: 0.3, + alignment: Base.basicAlignmentEnum.midMid, + rotation: 0, + center: [0, 0, 0], + direction: [0, 1, 0] + }); + const area = face.getFaceArea({ shape: f }); + expect(f.ShapeType()).toBe(occt.TopAbs_ShapeEnum.TopAbs_FACE); + expect(area).toBeCloseTo(2.08); + f.delete(); + }); + + it("should create H-beam profile face with larger dimensions", () => { + const f = face.createHBeamProfileFace({ + width: 3, + height: 4, + webThickness: 0.3, + flangeThickness: 0.5, + alignment: Base.basicAlignmentEnum.midMid, + rotation: 0, + center: [0, 0, 0], + direction: [0, 1, 0] + }); + const area = face.getFaceArea({ shape: f }); + expect(f.ShapeType()).toBe(occt.TopAbs_ShapeEnum.TopAbs_FACE); + expect(area).toBeCloseTo(4.60); + f.delete(); + }); + + it("should create T-beam profile face with default parameters", () => { + const f = face.createTBeamProfileFace({ + width: 2, + height: 2, + webThickness: 0.2, + flangeThickness: 0.3, + alignment: Base.basicAlignmentEnum.midMid, + rotation: 0, + center: [0, 0, 0], + direction: [0, 1, 0] + }); + const area = face.getFaceArea({ shape: f }); + expect(f.ShapeType()).toBe(occt.TopAbs_ShapeEnum.TopAbs_FACE); + expect(area).toBeCloseTo(0.94); + f.delete(); + }); + + it("should create T-beam profile face with custom dimensions", () => { + const f = face.createTBeamProfileFace({ + width: 3, + height: 3, + webThickness: 0.4, + flangeThickness: 0.5, + alignment: Base.basicAlignmentEnum.midMid, + rotation: 0, + center: [0, 0, 0], + direction: [0, 1, 0] + }); + const area = face.getFaceArea({ shape: f }); + expect(f.ShapeType()).toBe(occt.TopAbs_ShapeEnum.TopAbs_FACE); + expect(area).toBeCloseTo(2.5); + f.delete(); + }); + + it("should create U-beam profile face with default parameters", () => { + const f = face.createUBeamProfileFace({ + width: 2, + height: 3, + webThickness: 0.2, + flangeThickness: 0.3, + flangeWidth: 0.5, + alignment: Base.basicAlignmentEnum.midMid, + rotation: 0, + center: [0, 0, 0], + direction: [0, 1, 0] + }); + const area = face.getFaceArea({ shape: f }); + expect(f.ShapeType()).toBe(occt.TopAbs_ShapeEnum.TopAbs_FACE); + expect(area).toBeCloseTo(2.25); + f.delete(); + }); + + it("should create U-beam profile face with larger dimensions", () => { + const f = face.createUBeamProfileFace({ + width: 4, + height: 5, + webThickness: 0.4, + flangeThickness: 0.6, + flangeWidth: 1, + alignment: Base.basicAlignmentEnum.midMid, + rotation: 0, + center: [0, 0, 0], + direction: [0, 1, 0] + }); + const area = face.getFaceArea({ shape: f }); + expect(f.ShapeType()).toBe(occt.TopAbs_ShapeEnum.TopAbs_FACE); + expect(area).toBeCloseTo(7.999); + f.delete(); + }); + + it("should create star face with default parameters", () => { + const f = face.createStarFace({ + outerRadius: 2, + innerRadius: 1, + numRays: 5, + center: [0, 0, 0], + direction: [0, 1, 0], + offsetOuterEdges: 0, + half: false + }); + const area = face.getFaceArea({ shape: f }); + expect(f.ShapeType()).toBe(occt.TopAbs_ShapeEnum.TopAbs_FACE); + expect(area).toBeCloseTo(5.877852522924732); + f.delete(); + }); + + it("should create star face with 7 rays", () => { + const f = face.createStarFace({ + outerRadius: 3, + innerRadius: 1.5, + numRays: 7, + center: [0, 0, 0], + direction: [0, 1, 0], + offsetOuterEdges: 0, + half: false + }); + const area = face.getFaceArea({ shape: f }); + expect(f.ShapeType()).toBe(occt.TopAbs_ShapeEnum.TopAbs_FACE); + expect(area).toBeCloseTo(13.667337782203083); + f.delete(); + }); + + it("should create christmas tree face with default parameters", () => { + const f = face.createChristmasTreeFace({ + height: 6, + innerDist: 1.5, + outerDist: 3, + nrSkirts: 5, + trunkHeight: 1, + trunkWidth: 1, + half: false, + rotation: 0, + origin: [0, 0, 0], + direction: [0, 1, 0] + }); + const area = face.getFaceArea({ shape: f }); + expect(f.ShapeType()).toBe(occt.TopAbs_ShapeEnum.TopAbs_FACE); + expect(area).toBeCloseTo(15.688); + f.delete(); + }); + + it("should create christmas tree face with custom dimensions", () => { + const f = face.createChristmasTreeFace({ + height: 10, + innerDist: 2, + outerDist: 5, + nrSkirts: 7, + trunkHeight: 2, + trunkWidth: 1.5, + half: false, + rotation: 0, + origin: [0, 0, 0], + direction: [0, 1, 0] + }); + const area = face.getFaceArea({ shape: f }); + expect(f.ShapeType()).toBe(occt.TopAbs_ShapeEnum.TopAbs_FACE); + expect(area).toBeCloseTo(40.75510204081631); + f.delete(); + }); + + it("should create parallelogram face with default parameters", () => { + const f = face.createParallelogramFace({ + center: [0, 0, 0], + direction: [0, 1, 0], + aroundCenter: true, + width: 2, + height: 1, + angle: 15 + }); + const area = face.getFaceArea({ shape: f }); + expect(f.ShapeType()).toBe(occt.TopAbs_ShapeEnum.TopAbs_FACE); + expect(area).toBeCloseTo(2); + f.delete(); + }); + + it("should create parallelogram face with different angle", () => { + const f = face.createParallelogramFace({ + center: [0, 0, 0], + direction: [0, 1, 0], + aroundCenter: true, + width: 4, + height: 2, + angle: 30 + }); + const area = face.getFaceArea({ shape: f }); + expect(f.ShapeType()).toBe(occt.TopAbs_ShapeEnum.TopAbs_FACE); + expect(area).toBeCloseTo(8); + f.delete(); + }); + + it("should create heart face with default parameters", () => { + const f = face.createHeartFace({ + center: [0, 0, 0], + direction: [0, 1, 0], + rotation: 0, + sizeApprox: 2 + }); + const area = face.getFaceArea({ shape: f }); + expect(f.ShapeType()).toBe(occt.TopAbs_ShapeEnum.TopAbs_FACE); + expect(area).toBeCloseTo(2.7330366007628006); + f.delete(); + }); + + it("should create heart face with larger size", () => { + const f = face.createHeartFace({ + center: [0, 0, 0], + direction: [0, 1, 0], + rotation: 0, + sizeApprox: 4 + }); + const area = face.getFaceArea({ shape: f }); + expect(f.ShapeType()).toBe(occt.TopAbs_ShapeEnum.TopAbs_FACE); + expect(area).toBeCloseTo(10.932146403051203); + f.delete(); + }); + + it("should create n-gon face with 6 corners (hexagon)", () => { + const f = face.createNGonFace({ + center: [0, 0, 0], + direction: [0, 1, 0], + nrCorners: 6, + radius: 1 + }); + const area = face.getFaceArea({ shape: f }); + expect(f.ShapeType()).toBe(occt.TopAbs_ShapeEnum.TopAbs_FACE); + expect(area).toBeCloseTo(2.598076211353316); + f.delete(); + }); + + it("should create n-gon face with 8 corners (octagon)", () => { + const f = face.createNGonFace({ + center: [0, 0, 0], + direction: [0, 1, 0], + nrCorners: 8, + radius: 2 + }); + const area = face.getFaceArea({ shape: f }); + expect(f.ShapeType()).toBe(occt.TopAbs_ShapeEnum.TopAbs_FACE); + expect(area).toBeCloseTo(11.31370849898476); + f.delete(); + }); + + it("should create n-gon face with 3 corners (triangle)", () => { + const f = face.createNGonFace({ + center: [0, 0, 0], + direction: [0, 1, 0], + nrCorners: 3, + radius: 1.5 + }); + const area = face.getFaceArea({ shape: f }); + expect(f.ShapeType()).toBe(occt.TopAbs_ShapeEnum.TopAbs_FACE); + expect(area).toBeCloseTo(2.9276442447299863); + f.delete(); + }); + }); }); diff --git a/packages/dev/occt/lib/services/shapes/index.ts b/packages/dev/occt/lib/services/shapes/index.ts index 9b662b965..f1f151ab4 100644 --- a/packages/dev/occt/lib/services/shapes/index.ts +++ b/packages/dev/occt/lib/services/shapes/index.ts @@ -4,5 +4,6 @@ export * from "./face"; export * from "./shapes"; export * from "./shell"; export * from "./solid"; +export * from "./vertex"; export * from "./wire"; export * from "./shapes"; \ No newline at end of file