diff --git a/languages/ar.json b/languages/ar.json index 8620dc5b..25b4cc6b 100644 --- a/languages/ar.json +++ b/languages/ar.json @@ -5079,5 +5079,56 @@ "File Size": "حجم الملف", "Your browser does not support indexDB and you can't upload local asset files.": "متصفحك لا يدعم indexDB ولا يمكنك تحميل ملفات الأصول المحلية.", "Upload": "تحميل", - "elements": "عناصر" + "elements": "عناصر", + "bitbybit.vector.vectorsTheSame": "المتجهات متطابقة", + "vectorsTheSame": "المتجهات متطابقة", + "bitbybit.vector.vectorsTheSame_description": "يتحقق مما إذا كان متجهان متطابقين ضمن تسامح معين", + "vec1": "المتجه 1", + "vec2": "المتجه 2", + "bitbybit.point.boundingBoxOfPoints": "الصندوق المحيط للنقاط", + "boundingBoxOfPoints": "الصندوق المحيط للنقاط", + "bitbybit.point.boundingBoxOfPoints_description": "يحصل على الصندوق المحيط للنقاط", + "bitbybit.point.normalFromThreePoints": "الناظم من ثلاث نقاط", + "normalFromThreePoints": "الناظم من ثلاث نقاط", + "bitbybit.point.normalFromThreePoints_description": "ينشئ متجهًا ناظميًا من 3 نقاط", + "reverseNormal": "عكس الناظم", + "bitbybit.occt.shapes.wire.createLineWireWithExtensions": "محيط خطي مع امتدادات", + "createLineWireWithExtensions": "محيط خطي مع امتدادات", + "bitbybit.occt.shapes.wire.createLineWireWithExtensions_description": "ينشئ محيطًا خطيًا OpenCascade مع امتدادات", + "extensionStart": "بداية الامتداد", + "extensionEnd": "نهاية الامتداد", + "bitbybit.occt.shapes.wire.midPointOnWire": "نقطة المنتصف على المحيط", + "midPointOnWire": "نقطة المنتصف على المحيط", + "bitbybit.occt.shapes.wire.midPointOnWire_description": "يحسب نقطة المنتصف على المحيط عند المعلمة 0.5", + "centerOnOrigin": "التمركز في نقطة الأصل", + "bitbybit.occt.shapes.wire.textWiresWithData": "محيطات نصية مع بيانات", + "textWiresWithData": "محيطات نصية مع بيانات", + "bitbybit.occt.shapes.wire.textWiresWithData_description": "ينشئ مركبًا OpenCascade من محيطات نصية ويعيد معلومات إضافية بناءً على خط simplex الذي أنشأه الدكتور A. V. Hershey", + "bitbybit.occt.transforms.alignNormAndAxis": "محاذاة الناظم والمحور", + "alignNormAndAxis": "محاذاة الناظم والمحور", + "bitbybit.occt.transforms.alignNormAndAxis_description": "يحاذي الشكل مع الناظم والمحور", + "fromNorm": "من الناظم", + "fromAx": "من المحور", + "toNorm": "إلى الناظم", + "toAx": "إلى المحور", + "bitbybit.occt.dimensions.simpleLinearLengthDimension": "بعد طول خطي بسيط", + "simpleLinearLengthDimension": "بعد طول خطي بسيط", + "bitbybit.occt.dimensions.simpleLinearLengthDimension_description": "ينشئ بعد طول خطي بسيط بين نقطتين - وحدات القياس", + "offsetFromPoints": "الإزاحة من النقاط", + "crossingSize": "حجم التقاطع", + "labelSuffix": "لاحقة التسمية", + "labelSize": "حجم التسمية", + "labelOffset": "إزاحة التسمية", + "bitbybit.occt.dimensions.simpleAngularDimension": "بُعد زاوي بسيط", + "simpleAngularDimension": "بُعد زاوي بسيط", + "bitbybit.occt.dimensions.simpleAngularDimension_description": "يُنشئ بُعدًا زاويًا بسيطًا. بشكل افتراضي، يتم عرض الدرجات، ولكن يمكنك اختيار استخدام الراديان.", + "direction1": "اتجاه 1", + "direction2": "اتجاه 2", + "offsetFromCenter": "إزاحة عن المركز", + "extraSize": "حجم إضافي", + "radians": "راديان", + "bitbybit.occt.dimensions.pinWithLabel": "دبوس مع تسمية", + "pinWithLabel": "دبوس مع تسمية", + "bitbybit.occt.dimensions.pinWithLabel_description": "يُنشئ دبوسًا مع تسمية. يمكن استخدامه لشرح أشياء حول النماذج أو تحديد أشياء مهمة في المشهد ثلاثي الأبعاد.", + "offsetFromStart": "إزاحة عن البداية" } \ No newline at end of file diff --git a/languages/bn.json b/languages/bn.json index ec328641..d3ab46f2 100644 --- a/languages/bn.json +++ b/languages/bn.json @@ -5079,5 +5079,56 @@ "File Size": "ফাইলের আকার", "Your browser does not support indexDB and you can't upload local asset files.": "আপনার ব্রাউজার indexDB সমর্থন করে না এবং আপনি স্থানীয় সম্পদ ফাইল আপলোড করতে পারবেন না।", "Upload": "আপলোড", - "elements": "উপাদান" -} + "elements": "উপাদান", + "bitbybit.vector.vectorsTheSame": "ভেক্টর একই", + "vectorsTheSame": "ভেক্টর একই", + "bitbybit.vector.vectorsTheSame_description": "দুটি ভেক্টর নির্দিষ্ট টলারেন্সের মধ্যে একই কিনা তা পরীক্ষা করে", + "vec1": "ভেক্টর ১", + "vec2": "ভেক্টর ২", + "bitbybit.point.boundingBoxOfPoints": "বিন্দুগুলির বাউন্ডিং বক্স", + "boundingBoxOfPoints": "বিন্দুগুলির বাউন্ডিং বক্স", + "bitbybit.point.boundingBoxOfPoints_description": "বিন্দুগুলির একটি বাউন্ডিং বক্স নির্ধারণ করে", + "bitbybit.point.normalFromThreePoints": "তিনটি বিন্দু থেকে নর্মাল", + "normalFromThreePoints": "তিনটি বিন্দু থেকে নর্মাল", + "bitbybit.point.normalFromThreePoints_description": "৩টি বিন্দু থেকে একটি নর্মাল ভেক্টর তৈরি করে", + "reverseNormal": "বিপরীত নর্মাল", + "bitbybit.occt.shapes.wire.createLineWireWithExtensions": "এক্সটেনশন সহ লাইন ওয়্যার", + "createLineWireWithExtensions": "এক্সটেনশন সহ লাইন ওয়্যার", + "bitbybit.occt.shapes.wire.createLineWireWithExtensions_description": "এক্সটেনশন সহ OpenCascade লাইন ওয়্যার তৈরি করে", + "extensionStart": "এক্সটেনশন শুরু", + "extensionEnd": "এক্সটেনশন শেষ", + "bitbybit.occt.shapes.wire.midPointOnWire": "ওয়্যারের মধ্যবিন্দু", + "midPointOnWire": "ওয়্যারের মধ্যবিন্দু", + "bitbybit.occt.shapes.wire.midPointOnWire_description": "প্যারামিটার ০.৫ এ ওয়্যারের মধ্যবিন্দু গণনা করে", + "centerOnOrigin": "মূলবিন্দুতে কেন্দ্রিক করুন", + "bitbybit.occt.shapes.wire.textWiresWithData": "ডেটা সহ টেক্সট ওয়্যার", + "textWiresWithData": "ডেটা সহ টেক্সট ওয়্যার", + "bitbybit.occt.shapes.wire.textWiresWithData_description": "টেক্সট ওয়্যার থেকে OpenCascade কম্পাউন্ড তৈরি করে এবং ডঃ এ. ভি. হার্শে দ্বারা নির্মিত সিমপ্লেক্স ফন্টের উপর ভিত্তি করে অতিরিক্ত তথ্য প্রদান করে", + "bitbybit.occt.transforms.alignNormAndAxis": "নর্মাল এবং অক্ষ সারিবদ্ধ করুন", + "alignNormAndAxis": "নর্মাল এবং অক্ষ সারিবদ্ধ করুন", + "bitbybit.occt.transforms.alignNormAndAxis_description": "আকৃতিটিকে নর্মাল এবং অক্ষের সাথে সারিবদ্ধ করুন", + "fromNorm": "নর্মাল থেকে", + "fromAx": "অক্ষ থেকে", + "toNorm": "নর্মাল-এ", + "toAx": "অক্ষ-এ", + "bitbybit.occt.dimensions.simpleLinearLengthDimension": "সরল রৈখিক দৈর্ঘ্যের মাত্রা", + "simpleLinearLengthDimension": "সরল রৈখিক দৈর্ঘ্যের মাত্রা", + "bitbybit.occt.dimensions.simpleLinearLengthDimension_description": "দুটি বিন্দুর মধ্যে সরল রৈখিক দৈর্ঘ্যের মাত্রা তৈরি করে - পরিমাপের একক", + "offsetFromPoints": "বিন্দু থেকে অফসেট", + "crossingSize": "ক্রসিং সাইজ", + "labelSuffix": "লেবেল সাফিক্স", + "labelSize": "লেবেল সাইজ", + "labelOffset": "লেবেল অফসেট", + "bitbybit.occt.dimensions.simpleAngularDimension": "সরল কৌণিক মাত্রা", + "simpleAngularDimension": "সরল কৌণিক মাত্রা", + "bitbybit.occt.dimensions.simpleAngularDimension_description": "সরল কৌণিক মাত্রা তৈরি করে। ডিফল্টভাবে আমরা ডিগ্রি আউটপুট করি, কিন্তু আপনি রেডিয়ান ব্যবহার করতে পারেন।", + "direction1": "দিক 1", + "direction2": "দিক 2", + "offsetFromCenter": "কেন্দ্র থেকে অফসেট", + "extraSize": "অতিরিক্ত আকার", + "radians": "রেডিয়ান", + "bitbybit.occt.dimensions.pinWithLabel": "লেবেল সহ পিন", + "pinWithLabel": "লেবেল সহ পিন", + "bitbybit.occt.dimensions.pinWithLabel_description": "লেবেল সহ পিন তৈরি করে। এটি মডেল সম্পর্কে জিনিস ব্যাখ্যা করতে বা 3D দৃশ্যে গুরুত্বপূর্ণ জিনিস চিহ্নিত করতে ব্যবহার করা যেতে পারে।", + "offsetFromStart": "শুরু থেকে অফসেট" +} \ No newline at end of file diff --git a/languages/de.json b/languages/de.json index 02341b79..c1847b34 100644 --- a/languages/de.json +++ b/languages/de.json @@ -321,7 +321,7 @@ "BABYLON.TargetCamera": "Babylon-Zielkamera", "bitbybit.babylon.camera.getPosition": "Position abrufen", "bitbybit.babylon.camera.getPosition_description": "ruft die Kameraposition ab", - "bitbybit. babylon.camera.setTarget": "Ziel festlegen", + "bitbybit.babylon.camera.setTarget": "Ziel festlegen", "setTarget": "Ziel festlegen", "bitbybit.babylon.camera.setTarget_description": "ändert das Kameraziel", "target": "Ziel", @@ -3071,7 +3071,7 @@ "bitbybit.advanced.patterns.facePatterns.pyramidSimple.getAllPyramidUCellsOnFace": "alle Pyramiden-U-Zellen auf Fläche abrufen", "getAllPyramidUCellsOnFace": "alle Pyramiden-U-Zellen auf Fläche abrufen", "bitbybit.advanced.patterns.facePatterns.pyramidSimple.getAllPyramidUCellsOnFace_description": "ruft Pyramiden-U-Zellen auf einer Fläche ab", - "bitbybit.advanced.patterns.facePatterns.pyramidSimple.getAllPyramidU tuyển trên mặt tại U": "alle Pyramiden-U-Zellen auf Fläche bei U abrufen", + "bitbybit.advanced.patterns.facePatterns.pyramidSimple.getAllPyramidUCellsOnFaceAtU": "alle Pyramiden-U-Zellen auf Fläche bei U abrufen", "getAllPyramidUCellsOnFaceAtU": "alle Pyramiden-U-Zellen auf Fläche bei U abrufen", "bitbybit.advanced.patterns.facePatterns.pyramidSimple.getAllPyramidUCellsOnFaceAtU_description": "ruft Pyramidenzellen auf einer Fläche bei U ab", "bitbybit.advanced.patterns.facePatterns.pyramidSimple.getAllPyramidUCellsOnFaceAtV": "alle Pyramiden-U-Zellen auf Fläche bei V abrufen", @@ -4343,6 +4343,7 @@ "vectorText": "Vektortext", "bitbybit.text.vectorText_description": "Erstellt Vektortextzeilen für einen gegebenen Text und beinhaltet Breiten- und Höheninformationen.", "dates": "Datum", + "bitbybit.dates.toDateString": "zu Datumszeichenfolge", "toDateString": "zu Datumszeichenfolge", "bitbybit.dates.toDateString_description": "Gibt ein Datum als Zeichenfolgenwert zurück.", "date": "Datum", @@ -5078,5 +5079,56 @@ "File Size": "Dateigröße", "Your browser does not support indexDB and you can't upload local asset files.": "Ihr Browser unterstützt kein IndexDB und Sie können keine lokalen Asset-Dateien hochladen.", "Upload": "Hochladen", - "elements": "Elemente" + "elements": "Elemente", + "bitbybit.vector.vectorsTheSame": "Vektoren gleich", + "vectorsTheSame": "Vektoren gleich", + "bitbybit.vector.vectorsTheSame_description": "Prüft, ob zwei Vektoren innerhalb einer gegebenen Toleranz gleich sind", + "vec1": "Vektor 1", + "vec2": "Vektor 2", + "bitbybit.point.boundingBoxOfPoints": "Begrenzungsrahmen der Punkte", + "boundingBoxOfPoints": "Begrenzungsrahmen der Punkte", + "bitbybit.point.boundingBoxOfPoints_description": "Ermittelt einen Begrenzungsrahmen der Punkte", + "bitbybit.point.normalFromThreePoints": "Normale aus drei Punkten", + "normalFromThreePoints": "Normale aus drei Punkten", + "bitbybit.point.normalFromThreePoints_description": "Erstellt einen Normalenvektor aus 3 Punkten", + "reverseNormal": "umgekehrte Normale", + "bitbybit.occt.shapes.wire.createLineWireWithExtensions": "Linienzug mit Verlängerungen", + "createLineWireWithExtensions": "Linienzug mit Verlängerungen", + "bitbybit.occt.shapes.wire.createLineWireWithExtensions_description": "Erstellt einen OpenCascade Linienzug mit Verlängerungen", + "extensionStart": "Verlängerungsstart", + "extensionEnd": "Verlängerungsende", + "bitbybit.occt.shapes.wire.midPointOnWire": "Mittelpunkt auf Linienzug", + "midPointOnWire": "Mittelpunkt auf Linienzug", + "bitbybit.occt.shapes.wire.midPointOnWire_description": "Berechnet den Mittelpunkt auf dem Linienzug beim Parameter 0.5", + "centerOnOrigin": "Im Ursprung zentrieren", + "bitbybit.occt.shapes.wire.textWiresWithData": "Text-Linienzüge mit Daten", + "textWiresWithData": "Text-Linienzüge mit Daten", + "bitbybit.occt.shapes.wire.textWiresWithData_description": "Erstellt ein OpenCascade Kompositum aus Text-Linienzügen und liefert zusätzliche Informationen basierend auf der von Dr. A. V. Hershey erstellten Simplex-Schriftart", + "bitbybit.occt.transforms.alignNormAndAxis": "Normale und Achse ausrichten", + "alignNormAndAxis": "Normale und Achse ausrichten", + "bitbybit.occt.transforms.alignNormAndAxis_description": "Richtet die Form an Normale und Achse aus", + "fromNorm": "Von Normale", + "fromAx": "Von Achse", + "toNorm": "Zu Normale", + "toAx": "Zu Achse", + "bitbybit.occt.dimensions.simpleLinearLengthDimension": "einfache lineare Längenbemaßung", + "simpleLinearLengthDimension": "einfache lineare Längenbemaßung", + "bitbybit.occt.dimensions.simpleLinearLengthDimension_description": "Erstellt eine einfache lineare Längenbemaßung zwischen zwei Punkten - Maßeinheiten", + "offsetFromPoints": "Versatz von Punkten", + "crossingSize": "Kreuzungsgröße", + "labelSuffix": "Beschriftungssuffix", + "labelSize": "Beschriftungsgröße", + "labelOffset": "Beschriftungsversatz", + "bitbybit.occt.dimensions.simpleAngularDimension": "einfache Winkelbemaßung", + "simpleAngularDimension": "einfache Winkelbemaßung", + "bitbybit.occt.dimensions.simpleAngularDimension_description": "Erstellt eine einfache Winkelbemaßung. Standardmäßig werden Grad ausgegeben, Sie können sich aber auch für die Verwendung von Radiant entscheiden.", + "direction1": "Richtung 1", + "direction2": "Richtung 2", + "offsetFromCenter": "Versatz vom Mittelpunkt", + "extraSize": "Zusätzliche Größe", + "radians": "Radiant", + "bitbybit.occt.dimensions.pinWithLabel": "Pin mit Beschriftung", + "pinWithLabel": "Pin mit Beschriftung", + "bitbybit.occt.dimensions.pinWithLabel_description": "Erstellt einen Pin mit Beschriftung. Dieser kann verwendet werden, um Sachverhalte an den Modellen zu erklären oder wichtige Punkte in der 3D-Szene zu markieren.", + "offsetFromStart": "Versatz vom Startpunkt" } \ No newline at end of file diff --git a/languages/en.json b/languages/en.json index 88545d84..ff27b35d 100644 --- a/languages/en.json +++ b/languages/en.json @@ -5079,5 +5079,56 @@ "File Size": "File Size", "Your browser does not support indexDB and you can't upload local asset files.": "Your browser does not support indexDB and you can't upload local asset files.", "Upload": "Upload", - "elements": "elements" + "elements": "elements", + "bitbybit.vector.vectorsTheSame": "vectors the same", + "vectorsTheSame": "vectors the same", + "bitbybit.vector.vectorsTheSame_description": "Checks if two vectors are the same within a given tolerance", + "vec1": "vector 1", + "vec2": "vector 2", + "bitbybit.point.boundingBoxOfPoints": "bounding box of points", + "boundingBoxOfPoints": "bounding box of points", + "bitbybit.point.boundingBoxOfPoints_description": "Gets a bounding box of the points", + "bitbybit.point.normalFromThreePoints": "normal from three points", + "normalFromThreePoints": "normal from three points", + "bitbybit.point.normalFromThreePoints_description": "Creates a normal vector from 3 points", + "reverseNormal": "reverse normal", + "bitbybit.occt.shapes.wire.createLineWireWithExtensions": "line wire with extensions", + "createLineWireWithExtensions": "line wire with extensions", + "bitbybit.occt.shapes.wire.createLineWireWithExtensions_description": "Creates OpenCascade line wire with extensions", + "extensionStart": "ext start", + "extensionEnd": "ext end", + "bitbybit.occt.shapes.wire.midPointOnWire": "mid point on wire", + "midPointOnWire": "mid point on wire", + "bitbybit.occt.shapes.wire.midPointOnWire_description": "Computes the middle point on the wire at param 0.5", + "centerOnOrigin": "center on origin", + "bitbybit.occt.shapes.wire.textWiresWithData": "text wires with data", + "textWiresWithData": "text wires with data", + "bitbybit.occt.shapes.wire.textWiresWithData_description": "Creates OpenCascade compound out of text wires and returns additional information based on simplex font created by Dr. A. V. Hershey", + "bitbybit.occt.transforms.alignNormAndAxis": "align normal and axis", + "alignNormAndAxis": "align normal and axis", + "bitbybit.occt.transforms.alignNormAndAxis_description": "Align the shape with normal and axis", + "fromNorm": "from normal", + "fromAx": "from axis", + "toNorm": "to normal", + "toAx": "to axis", + "bitbybit.occt.dimensions.simpleLinearLengthDimension": "simple linear length dimension", + "simpleLinearLengthDimension": "simple linear length dimension", + "bitbybit.occt.dimensions.simpleLinearLengthDimension_description": "Creates simple linear length dimension between two points - measuring units", + "offsetFromPoints": "offset from points", + "crossingSize": "crossing size", + "labelSuffix": "label suffix", + "labelSize": "label size", + "labelOffset": "label offset", + "bitbybit.occt.dimensions.simpleAngularDimension": "simple angular dimension", + "simpleAngularDimension": "simple angular dimension", + "bitbybit.occt.dimensions.simpleAngularDimension_description": "Creates simple angular dimension. By default we output degrees, but you can opt to use radians.", + "direction1": "direction 1", + "direction2": "direction 2", + "offsetFromCenter": "offset from center", + "extraSize": "extra size", + "radians": "radians", + "bitbybit.occt.dimensions.pinWithLabel": "pin with label", + "pinWithLabel": "pin with label", + "bitbybit.occt.dimensions.pinWithLabel_description": "Creates pin label. It can be used to explain things about the models or mark important things in the 3D scene.", + "offsetFromStart": "offset from start" } \ No newline at end of file diff --git a/languages/es.json b/languages/es.json index 388de218..c7aec429 100644 --- a/languages/es.json +++ b/languages/es.json @@ -5079,5 +5079,56 @@ "File Size": "Tamaño Archivo", "Your browser does not support indexDB and you can't upload local asset files.": "Su navegador no soporta indexDB y no puede subir archivos de activos locales.", "Upload": "Subir", - "elements": "elementos" + "elements": "elementos", + "bitbybit.vector.vectorsTheSame": "vectores iguales", + "vectorsTheSame": "vectores iguales", + "bitbybit.vector.vectorsTheSame_description": "Comprueba si dos vectores son iguales dentro de una tolerancia dada", + "vec1": "vector 1", + "vec2": "vector 2", + "bitbybit.point.boundingBoxOfPoints": "caja delimitadora de puntos", + "boundingBoxOfPoints": "caja delimitadora de puntos", + "bitbybit.point.boundingBoxOfPoints_description": "Obtiene una caja delimitadora de los puntos", + "bitbybit.point.normalFromThreePoints": "normal a partir de tres puntos", + "normalFromThreePoints": "normal a partir de tres puntos", + "bitbybit.point.normalFromThreePoints_description": "Crea un vector normal a partir de 3 puntos", + "reverseNormal": "normal invertida", + "bitbybit.occt.shapes.wire.createLineWireWithExtensions": "contorno de línea con extensiones", + "createLineWireWithExtensions": "contorno de línea con extensiones", + "bitbybit.occt.shapes.wire.createLineWireWithExtensions_description": "Crea un contorno de línea OpenCascade con extensiones", + "extensionStart": "inicio ext.", + "extensionEnd": "fin ext.", + "bitbybit.occt.shapes.wire.midPointOnWire": "punto medio en contorno", + "midPointOnWire": "punto medio en contorno", + "bitbybit.occt.shapes.wire.midPointOnWire_description": "Calcula el punto medio en el contorno en el parámetro 0.5", + "centerOnOrigin": "centrar en origen", + "bitbybit.occt.shapes.wire.textWiresWithData": "contornos de texto con datos", + "textWiresWithData": "contornos de texto con datos", + "bitbybit.occt.shapes.wire.textWiresWithData_description": "Crea un compuesto OpenCascade a partir de contornos de texto y devuelve información adicional basada en la fuente simplex creada por el Dr. A. V. Hershey", + "bitbybit.occt.transforms.alignNormAndAxis": "alinear normal y eje", + "alignNormAndAxis": "alinear normal y eje", + "bitbybit.occt.transforms.alignNormAndAxis_description": "Alinea la forma con la normal y el eje", + "fromNorm": "desde normal", + "fromAx": "desde eje", + "toNorm": "a normal", + "toAx": "a eje", + "bitbybit.occt.dimensions.simpleLinearLengthDimension": "cota de longitud lineal simple", + "simpleLinearLengthDimension": "cota de longitud lineal simple", + "bitbybit.occt.dimensions.simpleLinearLengthDimension_description": "Crea una cota de longitud lineal simple entre dos puntos - unidades de medida", + "offsetFromPoints": "desplazamiento desde puntos", + "crossingSize": "tamaño de cruce", + "labelSuffix": "sufijo de etiqueta", + "labelSize": "tamaño de etiqueta", + "labelOffset": "desplazamiento de etiqueta", + "bitbybit.occt.dimensions.simpleAngularDimension": "dimensión angular simple", + "simpleAngularDimension": "dimensión angular simple", + "bitbybit.occt.dimensions.simpleAngularDimension_description": "Crea una dimensión angular simple. Por defecto, se muestran grados, pero puedes optar por usar radianes.", + "direction1": "dirección 1", + "direction2": "dirección 2", + "offsetFromCenter": "desplazamiento desde el centro", + "extraSize": "tamaño extra", + "radians": "radianes", + "bitbybit.occt.dimensions.pinWithLabel": "pin con etiqueta", + "pinWithLabel": "pin con etiqueta", + "bitbybit.occt.dimensions.pinWithLabel_description": "Crea un pin con etiqueta. Se puede usar para explicar cosas sobre los modelos o marcar elementos importantes en la escena 3D.", + "offsetFromStart": "desplazamiento desde el inicio" } \ No newline at end of file diff --git a/languages/fr.json b/languages/fr.json index c9e4aad6..c29563d5 100644 --- a/languages/fr.json +++ b/languages/fr.json @@ -5079,5 +5079,56 @@ "File Size": "Taille Fichier", "Your browser does not support indexDB and you can't upload local asset files.": "Votre navigateur ne prend pas en charge indexDB et vous ne pouvez pas téléverser de fichiers actifs locaux.", "Upload": "Téléverser", - "elements": "éléments" + "elements": "éléments", + "bitbybit.vector.vectorsTheSame": "vecteurs identiques", + "vectorsTheSame": "vecteurs identiques", + "bitbybit.vector.vectorsTheSame_description": "Vérifie si deux vecteurs sont identiques dans les limites d'une tolérance donnée", + "vec1": "vecteur 1", + "vec2": "vecteur 2", + "bitbybit.point.boundingBoxOfPoints": "boîte englobante des points", + "boundingBoxOfPoints": "boîte englobante des points", + "bitbybit.point.boundingBoxOfPoints_description": "Obtient une boîte englobante des points", + "bitbybit.point.normalFromThreePoints": "normale à partir de trois points", + "normalFromThreePoints": "normale à partir de trois points", + "bitbybit.point.normalFromThreePoints_description": "Crée un vecteur normal à partir de 3 points", + "reverseNormal": "normale inversée", + "bitbybit.occt.shapes.wire.createLineWireWithExtensions": "polyligne avec extensions", + "createLineWireWithExtensions": "polyligne avec extensions", + "bitbybit.occt.shapes.wire.createLineWireWithExtensions_description": "Crée une polyligne OpenCascade avec extensions", + "extensionStart": "début ext.", + "extensionEnd": "fin ext.", + "bitbybit.occt.shapes.wire.midPointOnWire": "point médian sur polyligne", + "midPointOnWire": "point médian sur polyligne", + "bitbybit.occt.shapes.wire.midPointOnWire_description": "Calcule le point médian sur la polyligne au paramètre 0.5", + "centerOnOrigin": "centrer sur l'origine", + "bitbybit.occt.shapes.wire.textWiresWithData": "polylignes de texte avec données", + "textWiresWithData": "polylignes de texte avec données", + "bitbybit.occt.shapes.wire.textWiresWithData_description": "Crée un composé OpenCascade à partir de polylignes de texte et renvoie des informations supplémentaires basées sur la police simplex créée par le Dr. A. V. Hershey", + "bitbybit.occt.transforms.alignNormAndAxis": "aligner normale et axe", + "alignNormAndAxis": "aligner normale et axe", + "bitbybit.occt.transforms.alignNormAndAxis_description": "Aligne la forme avec la normale et l'axe", + "fromNorm": "depuis normale", + "fromAx": "depuis axe", + "toNorm": "vers normale", + "toAx": "vers axe", + "bitbybit.occt.dimensions.simpleLinearLengthDimension": "cote de longueur linéaire simple", + "simpleLinearLengthDimension": "cote de longueur linéaire simple", + "bitbybit.occt.dimensions.simpleLinearLengthDimension_description": "Crée une cote de longueur linéaire simple entre deux points - unités de mesure", + "offsetFromPoints": "décalage depuis les points", + "crossingSize": "taille de croisement", + "labelSuffix": "suffixe d'étiquette", + "labelSize": "taille d'étiquette", + "labelOffset": "décalage d'étiquette", + "bitbybit.occt.dimensions.simpleAngularDimension": "cote angulaire simple", + "simpleAngularDimension": "cote angulaire simple", + "bitbybit.occt.dimensions.simpleAngularDimension_description": "Crée une cote angulaire simple. Par défaut, affiche les degrés, mais vous pouvez choisir d'utiliser les radians.", + "direction1": "direction 1", + "direction2": "direction 2", + "offsetFromCenter": "décalage par rapport au centre", + "extraSize": "taille supplémentaire", + "radians": "radians", + "bitbybit.occt.dimensions.pinWithLabel": "repère avec étiquette", + "pinWithLabel": "repère avec étiquette", + "bitbybit.occt.dimensions.pinWithLabel_description": "Crée un repère avec étiquette. Il peut être utilisé pour expliquer des choses sur les modèles ou marquer des éléments importants dans la scène 3D.", + "offsetFromStart": "décalage par rapport au début" } diff --git a/languages/hi.json b/languages/hi.json index a5932d85..b733ffbc 100644 --- a/languages/hi.json +++ b/languages/hi.json @@ -5079,5 +5079,56 @@ "File Size": "फ़ाइल का आकार", "Your browser does not support indexDB and you can't upload local asset files.": "आपका ब्राउज़र इंडेक्सडीबी का समर्थन नहीं करता है और आप स्थानीय संपत्ति फ़ाइलें अपलोड नहीं कर सकते।", "Upload": "अपलोड करें", - "elements": "तत्व" + "elements": "तत्व", + "bitbybit.vector.vectorsTheSame": "वेक्टर समान", + "vectorsTheSame": "वेक्टर समान", + "bitbybit.vector.vectorsTheSame_description": "जांचता है कि दो वेक्टर दी गई सहनशीलता के भीतर समान हैं या नहीं", + "vec1": "वेक्टर 1", + "vec2": "वेक्टर 2", + "bitbybit.point.boundingBoxOfPoints": "बिंदुओं का बाउंडिंग बॉक्स", + "boundingBoxOfPoints": "बिंदुओं का बाउंडिंग बॉक्स", + "bitbybit.point.boundingBoxOfPoints_description": "बिंदुओं का बाउंडिंग बॉक्स प्राप्त करता है", + "bitbybit.point.normalFromThreePoints": "तीन बिंदुओं से अभिलंब", + "normalFromThreePoints": "तीन बिंदुओं से अभिलंब", + "bitbybit.point.normalFromThreePoints_description": "3 बिंदुओं से एक अभिलंब वेक्टर बनाता है", + "reverseNormal": "विपरीत अभिलंब", + "bitbybit.occt.shapes.wire.createLineWireWithExtensions": "विस्तार के साथ रेखा कंटूर", + "createLineWireWithExtensions": "विस्तार के साथ रेखा कंटूर", + "bitbybit.occt.shapes.wire.createLineWireWithExtensions_description": "विस्तार के साथ OpenCascade रेखा कंटूर बनाता है", + "extensionStart": "विस्तार प्रारंभ", + "extensionEnd": "विस्तार अंत", + "bitbybit.occt.shapes.wire.midPointOnWire": "कंटूर पर मध्य बिंदु", + "midPointOnWire": "कंटूर पर मध्य बिंदु", + "bitbybit.occt.shapes.wire.midPointOnWire_description": "पैरामीटर 0.5 पर कंटूर पर मध्य बिंदु की गणना करता है", + "centerOnOrigin": "मूल बिंदु पर केंद्रित करें", + "bitbybit.occt.shapes.wire.textWiresWithData": "डेटा के साथ टेक्स्ट कंटूर", + "textWiresWithData": "डेटा के साथ टेक्स्ट कंटूर", + "bitbybit.occt.shapes.wire.textWiresWithData_description": "टेक्स्ट कंटूर से OpenCascade कंपाउंड बनाता है और डॉ. ए. वी. हर्शी द्वारा बनाए गए सिम्प्लेक्स फ़ॉन्ट के आधार पर अतिरिक्त जानकारी देता है", + "bitbybit.occt.transforms.alignNormAndAxis": "अभिलंब और अक्ष संरेखित करें", + "alignNormAndAxis": "अभिलंब और अक्ष संरेखित करें", + "bitbybit.occt.transforms.alignNormAndAxis_description": "आकृति को अभिलंब और अक्ष के साथ संरेखित करें", + "fromNorm": "अभिलंब से", + "fromAx": "अक्ष से", + "toNorm": "अभिलंब तक", + "toAx": "अक्ष तक", + "bitbybit.occt.dimensions.simpleLinearLengthDimension": "सरल रैखिक लंबाई आयाम", + "simpleLinearLengthDimension": "सरल रैखिक लंबाई आयाम", + "bitbybit.occt.dimensions.simpleLinearLengthDimension_description": "दो बिंदुओं के बीच सरल रैखिक लंबाई आयाम बनाता है - मापन इकाइयाँ", + "offsetFromPoints": "बिंदुओं से ऑफसेट", + "crossingSize": "क्रॉसिंग आकार", + "labelSuffix": "लेबल प्रत्यय", + "labelSize": "लेबल आकार", + "labelOffset": "लेबल ऑफसेट", + "bitbybit.occt.dimensions.simpleAngularDimension": "सरल कोणीय आयाम", + "simpleAngularDimension": "सरल कोणीय आयाम", + "bitbybit.occt.dimensions.simpleAngularDimension_description": "सरल कोणीय आयाम बनाता है। डिफ़ॉल्ट रूप से हम डिग्री आउटपुट करते हैं, लेकिन आप रेडियन का उपयोग करने का विकल्प चुन सकते हैं।", + "direction1": "दिशा 1", + "direction2": "दिशा 2", + "offsetFromCenter": "केंद्र से ऑफ़सेट", + "extraSize": "अतिरिक्त आकार", + "radians": "रेडियन", + "bitbybit.occt.dimensions.pinWithLabel": "लेबल वाला पिन", + "pinWithLabel": "लेबल वाला पिन", + "bitbybit.occt.dimensions.pinWithLabel_description": "लेबल वाला पिन बनाता है। इसका उपयोग मॉडल के बारे में चीजों को समझाने या 3D दृश्य में महत्वपूर्ण चीजों को चिह्नित करने के लिए किया जा सकता है।", + "offsetFromStart": "शुरुआत से ऑफ़सेट" } \ No newline at end of file diff --git a/languages/id.json b/languages/id.json index 9e206ed8..2da8cbdf 100644 --- a/languages/id.json +++ b/languages/id.json @@ -5079,5 +5079,56 @@ "File Size": "Ukuran File", "Your browser does not support indexDB and you can't upload local asset files.": "Browser Anda tidak mendukung indexDB dan Anda tidak dapat mengunggah file aset lokal.", "Upload": "Unggah", - "elements": "elemen" + "elements": "elemen", + "bitbybit.vector.vectorsTheSame": "vektor sama", + "vectorsTheSame": "vektor sama", + "bitbybit.vector.vectorsTheSame_description": "Memeriksa apakah dua vektor sama dalam toleransi yang diberikan", + "vec1": "vektor 1", + "vec2": "vektor 2", + "bitbybit.point.boundingBoxOfPoints": "kotak pembatas titik", + "boundingBoxOfPoints": "kotak pembatas titik", + "bitbybit.point.boundingBoxOfPoints_description": "Mendapatkan kotak pembatas dari titik-titik", + "bitbybit.point.normalFromThreePoints": "normal dari tiga titik", + "normalFromThreePoints": "normal dari tiga titik", + "bitbybit.point.normalFromThreePoints_description": "Membuat vektor normal dari 3 titik", + "reverseNormal": "balik normal", + "bitbybit.occt.shapes.wire.createLineWireWithExtensions": "wire garis dengan ekstensi", + "createLineWireWithExtensions": "wire garis dengan ekstensi", + "bitbybit.occt.shapes.wire.createLineWireWithExtensions_description": "Membuat wire garis OpenCascade dengan ekstensi", + "extensionStart": "awal ekstensi", + "extensionEnd": "akhir ekstensi", + "bitbybit.occt.shapes.wire.midPointOnWire": "titik tengah pada wire", + "midPointOnWire": "titik tengah pada wire", + "bitbybit.occt.shapes.wire.midPointOnWire_description": "Menghitung titik tengah pada wire di parameter 0.5", + "centerOnOrigin": "pusatkan di titik asal", + "bitbybit.occt.shapes.wire.textWiresWithData": "wire teks dengan data", + "textWiresWithData": "wire teks dengan data", + "bitbybit.occt.shapes.wire.textWiresWithData_description": "Membuat gabungan OpenCascade dari wire teks dan mengembalikan informasi tambahan berdasarkan font simplex yang dibuat oleh Dr. A. V. Hershey", + "bitbybit.occt.transforms.alignNormAndAxis": "selaraskan normal dan sumbu", + "alignNormAndAxis": "selaraskan normal dan sumbu", + "bitbybit.occt.transforms.alignNormAndAxis_description": "Menyelaraskan bentuk dengan normal dan sumbu", + "fromNorm": "dari normal", + "fromAx": "dari sumbu", + "toNorm": "ke normal", + "toAx": "ke sumbu", + "bitbybit.occt.dimensions.simpleLinearLengthDimension": "dimensi panjang linier sederhana", + "simpleLinearLengthDimension": "dimensi panjang linier sederhana", + "bitbybit.occt.dimensions.simpleLinearLengthDimension_description": "Membuat dimensi panjang linier sederhana antara dua titik - unit pengukuran", + "offsetFromPoints": "offset dari titik", + "crossingSize": "ukuran persilangan", + "labelSuffix": "akhiran label", + "labelSize": "ukuran label", + "labelOffset": "offset label", + "bitbybit.occt.dimensions.simpleAngularDimension": "dimensi sudut sederhana", + "simpleAngularDimension": "dimensi sudut sederhana", + "bitbybit.occt.dimensions.simpleAngularDimension_description": "Membuat dimensi sudut sederhana. Secara default menampilkan derajat, namun Anda bisa memilih menggunakan radian.", + "direction1": "arah 1", + "direction2": "arah 2", + "offsetFromCenter": "pergeseran dari pusat", + "extraSize": "ukuran tambahan", + "radians": "radian", + "bitbybit.occt.dimensions.pinWithLabel": "pin dengan label", + "pinWithLabel": "pin dengan label", + "bitbybit.occt.dimensions.pinWithLabel_description": "Membuat pin dengan label. Ini bisa digunakan untuk menjelaskan hal-hal tentang model atau menandai bagian penting di scene 3D.", + "offsetFromStart": "pergeseran dari awal" } \ No newline at end of file diff --git a/languages/lt.json b/languages/lt.json index b473b99a..94aca8c6 100644 --- a/languages/lt.json +++ b/languages/lt.json @@ -5079,5 +5079,56 @@ "File Size": "Failo dydis", "Your browser does not support indexDB and you can't upload local asset files.": "Jūsų naršyklė nepalaiko indexDB, todėl negalite įkelti vietinių išteklių failų.", "Upload": "Įkelti", - "elements": "elementai" + "elements": "elementai", + "bitbybit.vector.vectorsTheSame": "vektoriai vienodi", + "vectorsTheSame": "vektoriai vienodi", + "bitbybit.vector.vectorsTheSame_description": "Patikrina, ar du vektoriai yra vienodi nurodytos tolerancijos ribose", + "vec1": "vektorius 1", + "vec2": "vektorius 2", + "bitbybit.point.boundingBoxOfPoints": "taškų aprėminimo laukas", + "boundingBoxOfPoints": "taškų aprėminimo laukas", + "bitbybit.point.boundingBoxOfPoints_description": "Nustato taškų aprėminimo lauką", + "bitbybit.point.normalFromThreePoints": "normalė iš trijų taškų", + "normalFromThreePoints": "normalė iš trijų taškų", + "bitbybit.point.normalFromThreePoints_description": "Sukuria normalės vektorių iš 3 taškų", + "reverseNormal": "atvirkštinė normalė", + "bitbybit.occt.shapes.wire.createLineWireWithExtensions": "linijinis kontūras su prailginimais", + "createLineWireWithExtensions": "linijinis kontūras su prailginimais", + "bitbybit.occt.shapes.wire.createLineWireWithExtensions_description": "Sukuria OpenCascade linijinį kontūrą su prailginimais", + "extensionStart": "prailginimo pradžia", + "extensionEnd": "prailginimo pabaiga", + "bitbybit.occt.shapes.wire.midPointOnWire": "vidurio taškas kontūre", + "midPointOnWire": "vidurio taškas kontūre", + "bitbybit.occt.shapes.wire.midPointOnWire_description": "Apskaičiuoja vidurio tašką kontūre ties parametru 0.5", + "centerOnOrigin": "centruoti pradžios taške", + "bitbybit.occt.shapes.wire.textWiresWithData": "teksto kontūrai su duomenimis", + "textWiresWithData": "teksto kontūrai su duomenimis", + "bitbybit.occt.shapes.wire.textWiresWithData_description": "Sukuria OpenCascade junginį iš teksto kontūrų ir grąžina papildomą informaciją, pagrįstą Dr. A. V. Hershey sukurtu simplex šriftu", + "bitbybit.occt.transforms.alignNormAndAxis": "sulygiuoti normalę ir ašį", + "alignNormAndAxis": "sulygiuoti normalę ir ašį", + "bitbybit.occt.transforms.alignNormAndAxis_description": "Sulygiuoja formą su normale ir ašimi", + "fromNorm": "iš normalės", + "fromAx": "iš ašies", + "toNorm": "į normalę", + "toAx": "į ašį", + "bitbybit.occt.dimensions.simpleLinearLengthDimension": "paprastas linijinis ilgio matmuo", + "simpleLinearLengthDimension": "paprastas linijinis ilgio matmuo", + "bitbybit.occt.dimensions.simpleLinearLengthDimension_description": "Sukuria paprastą linijinį ilgio matmenį tarp dviejų taškų - matavimo vienetai", + "offsetFromPoints": "atitraukimas nuo taškų", + "crossingSize": "kirtimo dydis", + "labelSuffix": "žymės priesaga", + "labelSize": "žymės dydis", + "labelOffset": "žymės atitraukimas", + "bitbybit.occt.dimensions.simpleAngularDimension": "paprastas kampinis matmuo", + "simpleAngularDimension": "paprastas kampinis matmuo", + "bitbybit.occt.dimensions.simpleAngularDimension_description": "Sukuria paprastą kampinį matmenį. Pagal nutylėjimą rodomi laipsniai, bet galite pasirinkti naudoti radianus.", + "direction1": "kryptis 1", + "direction2": "kryptis 2", + "offsetFromCenter": "poslinkis nuo centro", + "extraSize": "papildomas dydis", + "radians": "radianai", + "bitbybit.occt.dimensions.pinWithLabel": "smeigtukas su užrašu", + "pinWithLabel": "smeigtukas su užrašu", + "bitbybit.occt.dimensions.pinWithLabel_description": "Sukuria smeigtuką su užrašu. Jį galima naudoti paaiškinti informaciją apie modelius arba pažymėti svarbius dalykus 3D scenoje.", + "offsetFromStart": "poslinkis nuo pradžios" } \ No newline at end of file diff --git a/languages/pt.json b/languages/pt.json index 395109c0..fc849ed5 100644 --- a/languages/pt.json +++ b/languages/pt.json @@ -5079,5 +5079,56 @@ "File Size": "Tamanho do Arquivo", "Your browser does not support indexDB and you can't upload local asset files.": "Seu navegador não suporta indexDB e você não pode carregar arquivos de ativos locais.", "Upload": "Carregar", - "elements": "elementos" + "elements": "elementos", + "bitbybit.vector.vectorsTheSame": "vetores iguais", + "vectorsTheSame": "vetores iguais", + "bitbybit.vector.vectorsTheSame_description": "Verifica se dois vetores são iguais dentro de uma determinada tolerância", + "vec1": "vetor 1", + "vec2": "vetor 2", + "bitbybit.point.boundingBoxOfPoints": "caixa delimitadora de pontos", + "boundingBoxOfPoints": "caixa delimitadora de pontos", + "bitbybit.point.boundingBoxOfPoints_description": "Obtém uma caixa delimitadora dos pontos", + "bitbybit.point.normalFromThreePoints": "normal a partir de três pontos", + "normalFromThreePoints": "normal a partir de três pontos", + "bitbybit.point.normalFromThreePoints_description": "Cria um vetor normal a partir de 3 pontos", + "reverseNormal": "normal invertida", + "bitbybit.occt.shapes.wire.createLineWireWithExtensions": "polilinha com extensões", + "createLineWireWithExtensions": "polilinha com extensões", + "bitbybit.occt.shapes.wire.createLineWireWithExtensions_description": "Cria uma polilinha OpenCascade com extensões", + "extensionStart": "início ext.", + "extensionEnd": "fim ext.", + "bitbybit.occt.shapes.wire.midPointOnWire": "ponto médio na polilinha", + "midPointOnWire": "ponto médio na polilinha", + "bitbybit.occt.shapes.wire.midPointOnWire_description": "Calcula o ponto médio na polilinha no parâmetro 0.5", + "centerOnOrigin": "centrar na origem", + "bitbybit.occt.shapes.wire.textWiresWithData": "polilinhas de texto com dados", + "textWiresWithData": "polilinhas de texto com dados", + "bitbybit.occt.shapes.wire.textWiresWithData_description": "Cria um composto OpenCascade a partir de polilinhas de texto e retorna informações adicionais com base na fonte simplex criada pelo Dr. A. V. Hershey", + "bitbybit.occt.transforms.alignNormAndAxis": "alinhar normal e eixo", + "alignNormAndAxis": "alinhar normal e eixo", + "bitbybit.occt.transforms.alignNormAndAxis_description": "Alinha a forma com a normal e o eixo", + "fromNorm": "da normal", + "fromAx": "do eixo", + "toNorm": "para normal", + "toAx": "para eixo", + "bitbybit.occt.dimensions.simpleLinearLengthDimension": "cota de comprimento linear simples", + "simpleLinearLengthDimension": "cota de comprimento linear simples", + "bitbybit.occt.dimensions.simpleLinearLengthDimension_description": "Cria uma cota de comprimento linear simples entre dois pontos - unidades de medida", + "offsetFromPoints": "deslocamento dos pontos", + "crossingSize": "tamanho do cruzamento", + "labelSuffix": "sufixo do rótulo", + "labelSize": "tamanho do rótulo", + "labelOffset": "deslocamento do rótulo", + "bitbybit.occt.dimensions.simpleAngularDimension": "dimensão angular simples", + "simpleAngularDimension": "dimensão angular simples", + "bitbybit.occt.dimensions.simpleAngularDimension_description": "Cria uma dimensão angular simples. Por padrão, exibimos graus, mas você pode optar por usar radianos.", + "direction1": "direção 1", + "direction2": "direção 2", + "offsetFromCenter": "deslocamento do centro", + "extraSize": "tamanho extra", + "radians": "radianos", + "bitbybit.occt.dimensions.pinWithLabel": "pino com rótulo", + "pinWithLabel": "pino com rótulo", + "bitbybit.occt.dimensions.pinWithLabel_description": "Cria um pino com rótulo. Pode ser usado para explicar coisas sobre os modelos ou marcar itens importantes na cena 3D.", + "offsetFromStart": "deslocamento do início" } \ No newline at end of file diff --git a/languages/ru.json b/languages/ru.json index 4431d02f..ddc91212 100644 --- a/languages/ru.json +++ b/languages/ru.json @@ -5079,5 +5079,56 @@ "File Size": "Размер файла", "Your browser does not support indexDB and you can't upload local asset files.": "Ваш браузер не поддерживает indexDB, и вы не можете загружать локальные файлы ресурсов.", "Upload": "Загрузить", - "elements": "элементы" + "elements": "элементы", + "bitbybit.vector.vectorsTheSame": "векторы одинаковы", + "vectorsTheSame": "векторы одинаковы", + "bitbybit.vector.vectorsTheSame_description": "Проверяет, одинаковы ли два вектора в пределах заданного допуска", + "vec1": "вектор 1", + "vec2": "вектор 2", + "bitbybit.point.boundingBoxOfPoints": "габаритный контейнер точек", + "boundingBoxOfPoints": "габаритный контейнер точек", + "bitbybit.point.boundingBoxOfPoints_description": "Получает габаритный контейнер точек", + "bitbybit.point.normalFromThreePoints": "нормаль из трех точек", + "normalFromThreePoints": "нормаль из трех точек", + "bitbybit.point.normalFromThreePoints_description": "Создает вектор нормали из 3 точек", + "reverseNormal": "обратная нормаль", + "bitbybit.occt.shapes.wire.createLineWireWithExtensions": "линейный контур с удлинениями", + "createLineWireWithExtensions": "линейный контур с удлинениями", + "bitbybit.occt.shapes.wire.createLineWireWithExtensions_description": "Создает линейный контур OpenCascade с удлинениями", + "extensionStart": "нач. удлин.", + "extensionEnd": "кон. удлин.", + "bitbybit.occt.shapes.wire.midPointOnWire": "средняя точка на контуре", + "midPointOnWire": "средняя точка на контуре", + "bitbybit.occt.shapes.wire.midPointOnWire_description": "Вычисляет среднюю точку на контуре при параметре 0.5", + "centerOnOrigin": "центрировать по началу координат", + "bitbybit.occt.shapes.wire.textWiresWithData": "текстовые контуры с данными", + "textWiresWithData": "текстовые контуры с данными", + "bitbybit.occt.shapes.wire.textWiresWithData_description": "Создает составную фигуру OpenCascade из текстовых контуров и возвращает дополнительную информацию на основе шрифта simplex, созданного доктором А. В. Херши", + "bitbybit.occt.transforms.alignNormAndAxis": "выровнять нормаль и ось", + "alignNormAndAxis": "выровнять нормаль и ось", + "bitbybit.occt.transforms.alignNormAndAxis_description": "Выравнивает фигуру по нормали и оси", + "fromNorm": "от нормали", + "fromAx": "от оси", + "toNorm": "к нормали", + "toAx": "к оси", + "bitbybit.occt.dimensions.simpleLinearLengthDimension": "простой линейный размер длины", + "simpleLinearLengthDimension": "простой линейный размер длины", + "bitbybit.occt.dimensions.simpleLinearLengthDimension_description": "Создает простой линейный размер длины между двумя точками - единицы измерения", + "offsetFromPoints": "отступ от точек", + "crossingSize": "размер пересечения", + "labelSuffix": "суффикс метки", + "labelSize": "размер метки", + "labelOffset": "отступ метки", + "bitbybit.occt.dimensions.simpleAngularDimension": "простой угловой размер", + "simpleAngularDimension": "простой угловой размер", + "bitbybit.occt.dimensions.simpleAngularDimension_description": "Создает простой угловой размер. По умолчанию выводятся градусы, но вы можете выбрать использование радианов.", + "direction1": "направление 1", + "direction2": "направление 2", + "offsetFromCenter": "смещение от центра", + "extraSize": "дополнительный размер", + "radians": "радианы", + "bitbybit.occt.dimensions.pinWithLabel": "маркер с меткой", + "pinWithLabel": "маркер с меткой", + "bitbybit.occt.dimensions.pinWithLabel_description": "Создает маркер с меткой. Его можно использовать для пояснения информации о моделях или отметки важных элементов в 3D-сцене.", + "offsetFromStart": "смещение от начала" } \ No newline at end of file diff --git a/languages/uk.json b/languages/uk.json index bc16ed6c..e421de57 100644 --- a/languages/uk.json +++ b/languages/uk.json @@ -5079,5 +5079,56 @@ "File Size": "Розмір файлу", "Your browser does not support indexDB and you can't upload local asset files.": "Ваш браузер не підтримує indexDB, і ви не можете завантажувати локальні файли ресурсів.", "Upload": "Завантажити", - "elements": "елементи" + "elements": "елементи", + "bitbybit.vector.vectorsTheSame": "вектори однакові", + "vectorsTheSame": "вектори однакові", + "bitbybit.vector.vectorsTheSame_description": "Перевіряє, чи два вектори однакові в межах заданої похибки", + "vec1": "вектор 1", + "vec2": "вектор 2", + "bitbybit.point.boundingBoxOfPoints": "габаритний контейнер точок", + "boundingBoxOfPoints": "габаритний контейнер точок", + "bitbybit.point.boundingBoxOfPoints_description": "Отримує габаритний контейнер точок", + "bitbybit.point.normalFromThreePoints": "нормаль з трьох точок", + "normalFromThreePoints": "нормаль з трьох точок", + "bitbybit.point.normalFromThreePoints_description": "Створює вектор нормалі з 3 точок", + "reverseNormal": "зворотна нормаль", + "bitbybit.occt.shapes.wire.createLineWireWithExtensions": "лінійний контур з продовженнями", + "createLineWireWithExtensions": "лінійний контур з продовженнями", + "bitbybit.occt.shapes.wire.createLineWireWithExtensions_description": "Створює лінійний контур OpenCascade з продовженнями", + "extensionStart": "поч. продовж.", + "extensionEnd": "кін. продовж.", + "bitbybit.occt.shapes.wire.midPointOnWire": "середня точка на контурі", + "midPointOnWire": "середня точка на контурі", + "bitbybit.occt.shapes.wire.midPointOnWire_description": "Обчислює середню точку на контурі за параметром 0.5", + "centerOnOrigin": "центрувати за початком координат", + "bitbybit.occt.shapes.wire.textWiresWithData": "текстові контури з даними", + "textWiresWithData": "текстові контури з даними", + "bitbybit.occt.shapes.wire.textWiresWithData_description": "Створює складену фігуру OpenCascade з текстових контурів та повертає додаткову інформацію на основі шрифту simplex, створеного доктором А. В. Херші", + "bitbybit.occt.transforms.alignNormAndAxis": "вирівняти нормаль та вісь", + "alignNormAndAxis": "вирівняти нормаль та вісь", + "bitbybit.occt.transforms.alignNormAndAxis_description": "Вирівнює фігуру за нормаллю та віссю", + "fromNorm": "від нормалі", + "fromAx": "від осі", + "toNorm": "до нормалі", + "toAx": "до осі", + "bitbybit.occt.dimensions.simpleLinearLengthDimension": "простий лінійний розмір довжини", + "simpleLinearLengthDimension": "простий лінійний розмір довжини", + "bitbybit.occt.dimensions.simpleLinearLengthDimension_description": "Створює простий лінійний розмір довжини між двома точками - одиниці вимірювання", + "offsetFromPoints": "відступ від точок", + "crossingSize": "розмір перетину", + "labelSuffix": "суфікс мітки", + "labelSize": "розмір мітки", + "labelOffset": "відступ мітки", + "bitbybit.occt.dimensions.simpleAngularDimension": "простий кутовий розмір", + "simpleAngularDimension": "простий кутовий розмір", + "bitbybit.occt.dimensions.simpleAngularDimension_description": "Створює простий кутовий розмір. За замовчуванням виводяться градуси, але ви можете вибрати використання радіанів.", + "direction1": "напрямок 1", + "direction2": "напрямок 2", + "offsetFromCenter": "зсув від центру", + "extraSize": "додатковий розмір", + "radians": "радіани", + "bitbybit.occt.dimensions.pinWithLabel": "шпилька з міткою", + "pinWithLabel": "шпилька з міткою", + "bitbybit.occt.dimensions.pinWithLabel_description": "Створює шпильку з міткою. Її можна використовувати для пояснення елементів моделей або позначення важливих об'єктів у 3D-сцені.", + "offsetFromStart": "зсув від початку" } \ No newline at end of file diff --git a/languages/zh-hans.json b/languages/zh-hans.json index a1cbf9d8..b7b221fa 100644 --- a/languages/zh-hans.json +++ b/languages/zh-hans.json @@ -5079,5 +5079,56 @@ "File Size": "文件大小", "Your browser does not support indexDB and you can't upload local asset files.": "您的浏览器不支持IndexDB,无法上传本地资产文件。", "Upload": "上传", - "elements": "元素" + "elements": "元素", + "bitbybit.vector.vectorsTheSame": "向量相同", + "vectorsTheSame": "向量相同", + "bitbybit.vector.vectorsTheSame_description": "检查两个向量在给定公差内是否相同", + "vec1": "向量 1", + "vec2": "向量 2", + "bitbybit.point.boundingBoxOfPoints": "点的边界框", + "boundingBoxOfPoints": "点的边界框", + "bitbybit.point.boundingBoxOfPoints_description": "获取点的边界框", + "bitbybit.point.normalFromThreePoints": "由三点确定的法线", + "normalFromThreePoints": "由三点确定的法线", + "bitbybit.point.normalFromThreePoints_description": "从 3 个点创建法向量", + "reverseNormal": "反转法线", + "bitbybit.occt.shapes.wire.createLineWireWithExtensions": "带延伸的线框", + "createLineWireWithExtensions": "带延伸的线框", + "bitbybit.occt.shapes.wire.createLineWireWithExtensions_description": "创建带延伸的 OpenCascade 线框", + "extensionStart": "延伸起点", + "extensionEnd": "延伸终点", + "bitbybit.occt.shapes.wire.midPointOnWire": "线框中点", + "midPointOnWire": "线框中点", + "bitbybit.occt.shapes.wire.midPointOnWire_description": "计算参数为 0.5 时线框上的中点", + "centerOnOrigin": "在原点居中", + "bitbybit.occt.shapes.wire.textWiresWithData": "带数据的文本线框", + "textWiresWithData": "带数据的文本线框", + "bitbybit.occt.shapes.wire.textWiresWithData_description": "从文本线框创建 OpenCascade 复合体,并根据 A. V. Hershey 博士创建的 simplex 字体返回附加信息", + "bitbybit.occt.transforms.alignNormAndAxis": "对齐法线和轴", + "alignNormAndAxis": "对齐法线和轴", + "bitbybit.occt.transforms.alignNormAndAxis_description": "将形状与法线和轴对齐", + "fromNorm": "从法线", + "fromAx": "从轴", + "toNorm": "到法线", + "toAx": "到轴", + "bitbybit.occt.dimensions.simpleLinearLengthDimension": "简单线性长度标注", + "simpleLinearLengthDimension": "简单线性长度标注", + "bitbybit.occt.dimensions.simpleLinearLengthDimension_description": "在两点之间创建简单线性长度标注 - 测量单位", + "offsetFromPoints": "距点的偏移量", + "crossingSize": "交叉大小", + "labelSuffix": "标签后缀", + "labelSize": "标签大小", + "labelOffset": "标签偏移量", + "bitbybit.occt.dimensions.simpleAngularDimension": "简单角度尺寸", + "simpleAngularDimension": "简单角度尺寸", + "bitbybit.occt.dimensions.simpleAngularDimension_description": "创建简单角度尺寸。默认输出度数,但您可以选择使用弧度。", + "direction1": "方向 1", + "direction2": "方向 2", + "offsetFromCenter": "距中心偏移", + "extraSize": "额外尺寸", + "radians": "弧度", + "bitbybit.occt.dimensions.pinWithLabel": "带标签的图钉", + "pinWithLabel": "带标签的图钉", + "bitbybit.occt.dimensions.pinWithLabel_description": "创建带标签的图钉。可用于解释模型相关信息或在 3D 场景中标记重要内容。", + "offsetFromStart": "距起点偏移" } \ No newline at end of file diff --git a/package.json b/package.json index 878279ed..c02ecab3 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "bitbybit", - "version": "0.20.0", + "version": "0.20.2", "description": "Monorepo for browser CAD which holds bitbybit.dev npm packages", "main": "index.js", "scripts": { diff --git a/packages/dev/babylonjs/lib/api/bitbybit-base.ts b/packages/dev/babylonjs/lib/api/bitbybit-base.ts index bb8ef23c..ea7b7864 100644 --- a/packages/dev/babylonjs/lib/api/bitbybit-base.ts +++ b/packages/dev/babylonjs/lib/api/bitbybit-base.ts @@ -87,7 +87,7 @@ export class BitByBitBase { this.color = new Color(this.math); this.line = new Line(this.context, geometryHelper); this.transforms = new Transforms(this.vector, this.math); - this.point = new Point(geometryHelper, this.transforms); + this.point = new Point(geometryHelper, this.transforms, this.vector); this.polyline = new Polyline(this.context, geometryHelper); this.verb = new Verb(this.context, geometryHelper, this.math); this.time = new Time(this.context); diff --git a/packages/dev/babylonjs/lib/api/bitbybit/babylon/io.ts b/packages/dev/babylonjs/lib/api/bitbybit/babylon/io.ts index 3a98b65a..87b30895 100644 --- a/packages/dev/babylonjs/lib/api/bitbybit/babylon/io.ts +++ b/packages/dev/babylonjs/lib/api/bitbybit/babylon/io.ts @@ -129,8 +129,12 @@ export class BabylonIO { } }; } + // we need to handle metadata otherwise gltf files may fail due to circular JSON structures + const metadata = this.context.scene.metadata; + delete this.context.scene.metadata; SERIALIZERS.GLTF2Export.GLBAsync(this.context.scene, inputs.fileName, options).then((glb) => { glb.downloadFiles(); + this.context.scene.metadata = metadata; }); } @@ -167,11 +171,11 @@ export class BabylonIO { childrenMeshes = allChildren.filter(s => !(s instanceof BABYLON.LinesMesh || s instanceof BABYLON.GreasedLineMesh)); } meshes.push(mesh); - if(childrenMeshes.length > 0) { + if (childrenMeshes.length > 0) { meshes.push(...childrenMeshes); } }); - + SERIALIZERS.STLExport.CreateSTL(meshes as BABYLON.Mesh[], true, inputs.fileName, true, true, true); return Promise.resolve({}); } diff --git a/packages/dev/babylonjs/lib/api/bitbybit/babylon/scene.ts b/packages/dev/babylonjs/lib/api/bitbybit/babylon/scene.ts index 87f8da4e..2c642430 100644 --- a/packages/dev/babylonjs/lib/api/bitbybit/babylon/scene.ts +++ b/packages/dev/babylonjs/lib/api/bitbybit/babylon/scene.ts @@ -335,14 +335,14 @@ export class BabylonScene { enableSkybox(inputs: Inputs.BabylonScene.SkyboxDto): void { let texture: BABYLON.CubeTexture; if (inputs.skybox === Inputs.Base.skyboxEnum.default) { - texture = new BABYLON.CubeTexture("https://cdn.jsdelivr.net/gh/bitbybit-dev/bitbybit-assets@0.20.0/textures/skybox/default_skybox/skybox", this.context.scene); + texture = new BABYLON.CubeTexture("https://cdn.jsdelivr.net/gh/bitbybit-dev/bitbybit-assets@0.20.2/textures/skybox/default_skybox/skybox", this.context.scene); } else if (inputs.skybox === Inputs.Base.skyboxEnum.greyGradient) { - texture = new BABYLON.CubeTexture("https://cdn.jsdelivr.net/gh/bitbybit-dev/bitbybit-assets@0.20.0/textures/skybox/grey_gradient/skybox", this.context.scene); + texture = new BABYLON.CubeTexture("https://cdn.jsdelivr.net/gh/bitbybit-dev/bitbybit-assets@0.20.2/textures/skybox/grey_gradient/skybox", this.context.scene); } else if (inputs.skybox === Inputs.Base.skyboxEnum.clearSky) { - texture = BABYLON.CubeTexture.CreateFromPrefilteredData("https://cdn.jsdelivr.net/gh/bitbybit-dev/bitbybit-assets@0.20.0/textures/skybox/clear_sky/environment.env", + texture = BABYLON.CubeTexture.CreateFromPrefilteredData("https://cdn.jsdelivr.net/gh/bitbybit-dev/bitbybit-assets@0.20.2/textures/skybox/clear_sky/environment.env", this.context.scene, false, false); } else if (inputs.skybox === Inputs.Base.skyboxEnum.city) { - texture = BABYLON.CubeTexture.CreateFromPrefilteredData("https://cdn.jsdelivr.net/gh/bitbybit-dev/bitbybit-assets@0.20.0/textures/skybox/city/environmentSpecular.env", + texture = BABYLON.CubeTexture.CreateFromPrefilteredData("https://cdn.jsdelivr.net/gh/bitbybit-dev/bitbybit-assets@0.20.2/textures/skybox/city/environmentSpecular.env", this.context.scene, false, false); } diff --git a/packages/dev/babylonjs/lib/api/inputs/base-inputs.ts b/packages/dev/babylonjs/lib/api/inputs/base-inputs.ts index d19f73e5..af8a7d05 100644 --- a/packages/dev/babylonjs/lib/api/inputs/base-inputs.ts +++ b/packages/dev/babylonjs/lib/api/inputs/base-inputs.ts @@ -20,6 +20,10 @@ export namespace Base { export type Vector2 = [number, number]; export type Point3 = [number, number, number]; export type Vector3 = [number, number, number]; + export type Axis3 = {origin: Base.Point3, direction: Base.Vector3}; + export type Axis2 = {origin: Base.Point2, direction: Base.Vector2}; + export type Plane3 = { origin: Base.Point3, normal: Base.Vector3, direction: Base.Vector3 }; + export type BoundingBox = { min: Base.Point3, max: Base.Point3, center?: Base.Point3, width?: number, height?: number, length?: number }; export type Line2 = { start: Base.Point2, end: Base.Point2 }; export type Line3 = { start: Base.Point3, end: Base.Point3 }; export type Polyline3 = { points: Base.Point3[], isClosed?: boolean }; diff --git a/packages/dev/babylonjs/lib/api/models/index.ts b/packages/dev/babylonjs/lib/api/models/index.ts new file mode 100644 index 00000000..c5676c6b --- /dev/null +++ b/packages/dev/babylonjs/lib/api/models/index.ts @@ -0,0 +1,2 @@ + +export * from "@bitbybit-dev/core/lib/api/models"; \ No newline at end of file diff --git a/packages/dev/babylonjs/package-lock.json b/packages/dev/babylonjs/package-lock.json index 106f9b29..1b87a4c8 100644 --- a/packages/dev/babylonjs/package-lock.json +++ b/packages/dev/babylonjs/package-lock.json @@ -1,21 +1,21 @@ { "name": "@bitbybit-dev/babylonjs", - "version": "0.20.0", + "version": "0.20.2", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "@bitbybit-dev/babylonjs", - "version": "0.20.0", + "version": "0.20.2", "license": "MIT", "dependencies": { - "@babylonjs/core": "8.1.1", - "@babylonjs/gui": "8.1.1", + "@babylonjs/core": "8.4.0", + "@babylonjs/gui": "8.4.0", "@babylonjs/havok": "1.3.10", - "@babylonjs/loaders": "8.1.1", - "@babylonjs/materials": "8.1.1", - "@babylonjs/serializers": "8.1.1", - "@bitbybit-dev/core": "0.20.0", + "@babylonjs/loaders": "8.4.0", + "@babylonjs/materials": "8.4.0", + "@babylonjs/serializers": "8.4.0", + "@bitbybit-dev/core": "0.20.2", "earcut": "2.2.3" }, "devDependencies": { @@ -1702,14 +1702,14 @@ } }, "node_modules/@babylonjs/core": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/@babylonjs/core/-/core-8.1.1.tgz", - "integrity": "sha512-kU2miL3As/4V7HFF0YTFMA/VWjC9s6PWB9re+oTOeP1WAfFAH6jqlUmijUlY9hAH36MOMVb1hhon1GQ9tja0tw==" + "version": "8.4.0", + "resolved": "https://registry.npmjs.org/@babylonjs/core/-/core-8.4.0.tgz", + "integrity": "sha512-N/uuM0uGu1GLororCVBn68FSGoiCn96xfDKhwfMlwaxYBF8k2905so092yQUQrscFAiM5EAp76gZpqNtQg9AFg==" }, "node_modules/@babylonjs/gui": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/@babylonjs/gui/-/gui-8.1.1.tgz", - "integrity": "sha512-+/7WETW1u6zyIivs6Z6RjF6jI6mC7tfXan40mi4qcRKrVdyat6neU9kmO/qdectNXVo0Qs7lvW/8/PCGY5q0bw==", + "version": "8.4.0", + "resolved": "https://registry.npmjs.org/@babylonjs/gui/-/gui-8.4.0.tgz", + "integrity": "sha512-tFG/rpN2Wf9Y7/EXEOqz1EBtFOVkWI9Ui78ezDy0T0fcXFQ8ALp/lfcDpG4+hx2Qa1fOEZPlfCEUxMYWt+Q2Gw==", "peerDependencies": { "@babylonjs/core": "^8.0.0" } @@ -1723,26 +1723,26 @@ } }, "node_modules/@babylonjs/loaders": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/@babylonjs/loaders/-/loaders-8.1.1.tgz", - "integrity": "sha512-WyhVKxbI/Cr3DDCEUaQi4wae+ws0kBMJ5ukiW6DsARcEKPFYaK+cOiU+GkiJSNL+zwoQ+TgnLW+Gjb2opXU+6Q==", + "version": "8.4.0", + "resolved": "https://registry.npmjs.org/@babylonjs/loaders/-/loaders-8.4.0.tgz", + "integrity": "sha512-YeOUuFdjpXqBb0X2UcPXIChkHyppkywKKCanh9WAy6Xpk1f9OEMvg9xHLpMs3P2cPI+xYhHtqoht6LPHj6EIIg==", "peerDependencies": { "@babylonjs/core": "^8.0.0", "babylonjs-gltf2interface": "^8.0.0" } }, "node_modules/@babylonjs/materials": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/@babylonjs/materials/-/materials-8.1.1.tgz", - "integrity": "sha512-EtwIOxuaKpzMqe1fjYcLO/zUJmxdi40hoIlUDd5BGExhmXdqnJuD0meTnMi7TUZ1WnpVu6fqeRpmQb6s4UlClA==", + "version": "8.4.0", + "resolved": "https://registry.npmjs.org/@babylonjs/materials/-/materials-8.4.0.tgz", + "integrity": "sha512-b8Rj2TQ6UABu5SmEOz2im+MfIonc877LG2sOrqwobE6765a1kwp54P9VsQ5PJflUeP7mZCP7EBbaPivP1t+DkQ==", "peerDependencies": { "@babylonjs/core": "^8.0.0" } }, "node_modules/@babylonjs/serializers": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/@babylonjs/serializers/-/serializers-8.1.1.tgz", - "integrity": "sha512-BIngBDsYWM1wPnW62TO9JhKuL4/3XFM9i9rxobx7Uahl/at6o0zJJsNIosqNb15Dt+hLoFAQvOlcw/J9ZbhuAg==", + "version": "8.4.0", + "resolved": "https://registry.npmjs.org/@babylonjs/serializers/-/serializers-8.4.0.tgz", + "integrity": "sha512-ZOdwicpdv6lLPUZQOlP1UW54lSAEPazW831FoBupBTfYleXm5/YVQvHWC4IsuJ0qKjqGUg+L8jWc9tNxJSBQLQ==", "peerDependencies": { "@babylonjs/core": "^8.0.0", "babylonjs-gltf2interface": "^8.0.0" @@ -1755,30 +1755,30 @@ "dev": true }, "node_modules/@bitbybit-dev/base": { - "version": "0.20.0", - "resolved": "https://registry.npmjs.org/@bitbybit-dev/base/-/base-0.20.0.tgz", - "integrity": "sha512-9J09Z3qY8JHfkWQe43BjDHPcm6MMec2YEL+Ily0U0dd/5+avcV+0N9zq+AYbTHbU9hczDBQH648L5uDNu7UOVg==" + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@bitbybit-dev/base/-/base-0.20.2.tgz", + "integrity": "sha512-+8jxnr7n7SNnuvh3uBgFQSTFYlOA+UrXUhE5XpeukPtTt3ffRShfTC3eRP9q+m/ummljKpKVLGGwSlCsKbriBQ==" }, "node_modules/@bitbybit-dev/core": { - "version": "0.20.0", - "resolved": "https://registry.npmjs.org/@bitbybit-dev/core/-/core-0.20.0.tgz", - "integrity": "sha512-jHhNI96cGavARDq9J/03E36y2MnjvbsoPB7AvB+E1URxFjdGx9cQYPMCwf6thqGPlG/EJ+egdugGOe1jduvijg==", - "dependencies": { - "@bitbybit-dev/base": "0.20.0", - "@bitbybit-dev/jscad-worker": "0.20.0", - "@bitbybit-dev/manifold-worker": "0.20.0", - "@bitbybit-dev/occt-worker": "0.20.0", + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@bitbybit-dev/core/-/core-0.20.2.tgz", + "integrity": "sha512-IYa7ThvCgOMS9CoRvuwTJ/YhAyCVZ0gamXmtb9dYF33RuhtRDWc6nxgitXQ/WBUQI/Csk7hzXlJS32nChMqCNA==", + "dependencies": { + "@bitbybit-dev/base": "0.20.2", + "@bitbybit-dev/jscad-worker": "0.20.2", + "@bitbybit-dev/manifold-worker": "0.20.2", + "@bitbybit-dev/occt-worker": "0.20.2", "jsonpath-plus": "10.1.0", "rxjs": "7.5.5", "verb-nurbs-web": "2.1.3" } }, "node_modules/@bitbybit-dev/jscad": { - "version": "0.20.0", - "resolved": "https://registry.npmjs.org/@bitbybit-dev/jscad/-/jscad-0.20.0.tgz", - "integrity": "sha512-pvC+XI/fTww6kHi9kOdu/udf94iSeiPAURMGbTSq4knBCY6oa9Cv2ZcsBccmsCU67nyVBthGKuGuD9os45zq0w==", + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@bitbybit-dev/jscad/-/jscad-0.20.2.tgz", + "integrity": "sha512-jRkvkjQM9OwtuB6grNndK4io28woHSiDULfYkEckdK7Ms13esj0qtsi5j1NaAZizd04xdKVuThFhEzIzRkdkkQ==", "dependencies": { - "@bitbybit-dev/base": "0.20.0", + "@bitbybit-dev/base": "0.20.2", "@jscad/3mf-serializer": "2.1.12", "@jscad/dxf-serializer": "2.1.18", "@jscad/io-utils": "2.0.28", @@ -1787,42 +1787,45 @@ } }, "node_modules/@bitbybit-dev/jscad-worker": { - "version": "0.20.0", - "resolved": "https://registry.npmjs.org/@bitbybit-dev/jscad-worker/-/jscad-worker-0.20.0.tgz", - "integrity": "sha512-/Fybz1brNyDvbzyFY2B3EERAfZCWPtVhRdgpruKnJ1Wb1pffQ2QMgQBGLJBB1jdpwQ5lmaByub97Il71KcIYmQ==", + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@bitbybit-dev/jscad-worker/-/jscad-worker-0.20.2.tgz", + "integrity": "sha512-bTnlO3yqvTNFqAx3dGnhrX/O7HPNuXRE5vn68ogK7belWEI8r26XaN5kJEzcN8k9maxAXJQRR04xJQPkbfGTaA==", "dependencies": { - "@bitbybit-dev/jscad": "0.20.0", + "@bitbybit-dev/jscad": "0.20.2", "rxjs": "7.5.5" } }, "node_modules/@bitbybit-dev/manifold": { - "version": "0.20.0", - "resolved": "https://registry.npmjs.org/@bitbybit-dev/manifold/-/manifold-0.20.0.tgz", - "integrity": "sha512-pKsmGFs68hzzPU5Flx6GmIMKql2polMwMw2VLDeQlDkka6fio98ZUpc8niJbqmFqlbe6qmunq1rRCetQ5EW/cA==", + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@bitbybit-dev/manifold/-/manifold-0.20.2.tgz", + "integrity": "sha512-BJtFUzC2Juxm/NYYyOvu/TiXccvzSvb5dOomrTE9uHv04TPCwxy3sw/mMU1QeoJyeQ4F2eIaG0GgXUe8fCsHYA==", "dependencies": { "manifold-3d": "3.0.0" } }, "node_modules/@bitbybit-dev/manifold-worker": { - "version": "0.20.0", - "resolved": "https://registry.npmjs.org/@bitbybit-dev/manifold-worker/-/manifold-worker-0.20.0.tgz", - "integrity": "sha512-pz9kHuk9URfif6yo3hcjQEy7pcG7+9R3FlHMXgkPDmvcFV0BYYYYFglSDqFZ6xcbUNz/9jeCy/zr47hCAuAKgg==", + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@bitbybit-dev/manifold-worker/-/manifold-worker-0.20.2.tgz", + "integrity": "sha512-+Zid8ALBXGTSLn6DlhU8abHduu5HlUpFZ5+RoIshXi4z5xQJbVhEWckDn1PF2Uq9y4qnwHTMQK+etF40Aei2MQ==", "dependencies": { - "@bitbybit-dev/manifold": "0.20.0", + "@bitbybit-dev/manifold": "0.20.2", "rxjs": "7.5.5" } }, "node_modules/@bitbybit-dev/occt": { - "version": "0.20.0", - "resolved": "https://registry.npmjs.org/@bitbybit-dev/occt/-/occt-0.20.0.tgz", - "integrity": "sha512-riqAiZ6fawRDW2AGIV/qBnzM1y1DCckQG+F7ez9pTY/2gBXq2jA+5WDor4FL+8vwhgPZcdZ37R7fBSrcHHR1oQ==" + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@bitbybit-dev/occt/-/occt-0.20.2.tgz", + "integrity": "sha512-jPZyi50Z2BjCSJ+OwlroEG3Neqd8uPDtqp8skhREDSPxG6SAjIHCxxn7SZxl8w7rhhUDR/OCGm/uDdLeLR7Ncg==", + "dependencies": { + "@bitbybit-dev/base": "0.20.2" + } }, "node_modules/@bitbybit-dev/occt-worker": { - "version": "0.20.0", - "resolved": "https://registry.npmjs.org/@bitbybit-dev/occt-worker/-/occt-worker-0.20.0.tgz", - "integrity": "sha512-zbDsXIF+HrxZfi0QwpxlVuPAxnUNyYQZP/aAal+Cf6/zS1IVVDhZMdq8g2Qf0KjyLDd9b7tbsvlfXXj52tEyZA==", + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@bitbybit-dev/occt-worker/-/occt-worker-0.20.2.tgz", + "integrity": "sha512-q6h/PbBAKnp01PshmhGE14x2b7YnW02YvnUrdGkU6FVYErxoQwwASiN10UKgeBbkD+jbc099kpFzJtvamPnMRw==", "dependencies": { - "@bitbybit-dev/occt": "0.20.0", + "@bitbybit-dev/occt": "0.20.2", "rxjs": "7.5.5" } }, @@ -8448,14 +8451,14 @@ } }, "@babylonjs/core": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/@babylonjs/core/-/core-8.1.1.tgz", - "integrity": "sha512-kU2miL3As/4V7HFF0YTFMA/VWjC9s6PWB9re+oTOeP1WAfFAH6jqlUmijUlY9hAH36MOMVb1hhon1GQ9tja0tw==" + "version": "8.4.0", + "resolved": "https://registry.npmjs.org/@babylonjs/core/-/core-8.4.0.tgz", + "integrity": "sha512-N/uuM0uGu1GLororCVBn68FSGoiCn96xfDKhwfMlwaxYBF8k2905so092yQUQrscFAiM5EAp76gZpqNtQg9AFg==" }, "@babylonjs/gui": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/@babylonjs/gui/-/gui-8.1.1.tgz", - "integrity": "sha512-+/7WETW1u6zyIivs6Z6RjF6jI6mC7tfXan40mi4qcRKrVdyat6neU9kmO/qdectNXVo0Qs7lvW/8/PCGY5q0bw==", + "version": "8.4.0", + "resolved": "https://registry.npmjs.org/@babylonjs/gui/-/gui-8.4.0.tgz", + "integrity": "sha512-tFG/rpN2Wf9Y7/EXEOqz1EBtFOVkWI9Ui78ezDy0T0fcXFQ8ALp/lfcDpG4+hx2Qa1fOEZPlfCEUxMYWt+Q2Gw==", "requires": {} }, "@babylonjs/havok": { @@ -8467,21 +8470,21 @@ } }, "@babylonjs/loaders": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/@babylonjs/loaders/-/loaders-8.1.1.tgz", - "integrity": "sha512-WyhVKxbI/Cr3DDCEUaQi4wae+ws0kBMJ5ukiW6DsARcEKPFYaK+cOiU+GkiJSNL+zwoQ+TgnLW+Gjb2opXU+6Q==", + "version": "8.4.0", + "resolved": "https://registry.npmjs.org/@babylonjs/loaders/-/loaders-8.4.0.tgz", + "integrity": "sha512-YeOUuFdjpXqBb0X2UcPXIChkHyppkywKKCanh9WAy6Xpk1f9OEMvg9xHLpMs3P2cPI+xYhHtqoht6LPHj6EIIg==", "requires": {} }, "@babylonjs/materials": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/@babylonjs/materials/-/materials-8.1.1.tgz", - "integrity": "sha512-EtwIOxuaKpzMqe1fjYcLO/zUJmxdi40hoIlUDd5BGExhmXdqnJuD0meTnMi7TUZ1WnpVu6fqeRpmQb6s4UlClA==", + "version": "8.4.0", + "resolved": "https://registry.npmjs.org/@babylonjs/materials/-/materials-8.4.0.tgz", + "integrity": "sha512-b8Rj2TQ6UABu5SmEOz2im+MfIonc877LG2sOrqwobE6765a1kwp54P9VsQ5PJflUeP7mZCP7EBbaPivP1t+DkQ==", "requires": {} }, "@babylonjs/serializers": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/@babylonjs/serializers/-/serializers-8.1.1.tgz", - "integrity": "sha512-BIngBDsYWM1wPnW62TO9JhKuL4/3XFM9i9rxobx7Uahl/at6o0zJJsNIosqNb15Dt+hLoFAQvOlcw/J9ZbhuAg==", + "version": "8.4.0", + "resolved": "https://registry.npmjs.org/@babylonjs/serializers/-/serializers-8.4.0.tgz", + "integrity": "sha512-ZOdwicpdv6lLPUZQOlP1UW54lSAEPazW831FoBupBTfYleXm5/YVQvHWC4IsuJ0qKjqGUg+L8jWc9tNxJSBQLQ==", "requires": {} }, "@bcoe/v8-coverage": { @@ -8491,30 +8494,30 @@ "dev": true }, "@bitbybit-dev/base": { - "version": "0.20.0", - "resolved": "https://registry.npmjs.org/@bitbybit-dev/base/-/base-0.20.0.tgz", - "integrity": "sha512-9J09Z3qY8JHfkWQe43BjDHPcm6MMec2YEL+Ily0U0dd/5+avcV+0N9zq+AYbTHbU9hczDBQH648L5uDNu7UOVg==" + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@bitbybit-dev/base/-/base-0.20.2.tgz", + "integrity": "sha512-+8jxnr7n7SNnuvh3uBgFQSTFYlOA+UrXUhE5XpeukPtTt3ffRShfTC3eRP9q+m/ummljKpKVLGGwSlCsKbriBQ==" }, "@bitbybit-dev/core": { - "version": "0.20.0", - "resolved": "https://registry.npmjs.org/@bitbybit-dev/core/-/core-0.20.0.tgz", - "integrity": "sha512-jHhNI96cGavARDq9J/03E36y2MnjvbsoPB7AvB+E1URxFjdGx9cQYPMCwf6thqGPlG/EJ+egdugGOe1jduvijg==", - "requires": { - "@bitbybit-dev/base": "0.20.0", - "@bitbybit-dev/jscad-worker": "0.20.0", - "@bitbybit-dev/manifold-worker": "0.20.0", - "@bitbybit-dev/occt-worker": "0.20.0", + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@bitbybit-dev/core/-/core-0.20.2.tgz", + "integrity": "sha512-IYa7ThvCgOMS9CoRvuwTJ/YhAyCVZ0gamXmtb9dYF33RuhtRDWc6nxgitXQ/WBUQI/Csk7hzXlJS32nChMqCNA==", + "requires": { + "@bitbybit-dev/base": "0.20.2", + "@bitbybit-dev/jscad-worker": "0.20.2", + "@bitbybit-dev/manifold-worker": "0.20.2", + "@bitbybit-dev/occt-worker": "0.20.2", "jsonpath-plus": "10.1.0", "rxjs": "7.5.5", "verb-nurbs-web": "2.1.3" } }, "@bitbybit-dev/jscad": { - "version": "0.20.0", - "resolved": "https://registry.npmjs.org/@bitbybit-dev/jscad/-/jscad-0.20.0.tgz", - "integrity": "sha512-pvC+XI/fTww6kHi9kOdu/udf94iSeiPAURMGbTSq4knBCY6oa9Cv2ZcsBccmsCU67nyVBthGKuGuD9os45zq0w==", + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@bitbybit-dev/jscad/-/jscad-0.20.2.tgz", + "integrity": "sha512-jRkvkjQM9OwtuB6grNndK4io28woHSiDULfYkEckdK7Ms13esj0qtsi5j1NaAZizd04xdKVuThFhEzIzRkdkkQ==", "requires": { - "@bitbybit-dev/base": "0.20.0", + "@bitbybit-dev/base": "0.20.2", "@jscad/3mf-serializer": "2.1.12", "@jscad/dxf-serializer": "2.1.18", "@jscad/io-utils": "2.0.28", @@ -8523,42 +8526,45 @@ } }, "@bitbybit-dev/jscad-worker": { - "version": "0.20.0", - "resolved": "https://registry.npmjs.org/@bitbybit-dev/jscad-worker/-/jscad-worker-0.20.0.tgz", - "integrity": "sha512-/Fybz1brNyDvbzyFY2B3EERAfZCWPtVhRdgpruKnJ1Wb1pffQ2QMgQBGLJBB1jdpwQ5lmaByub97Il71KcIYmQ==", + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@bitbybit-dev/jscad-worker/-/jscad-worker-0.20.2.tgz", + "integrity": "sha512-bTnlO3yqvTNFqAx3dGnhrX/O7HPNuXRE5vn68ogK7belWEI8r26XaN5kJEzcN8k9maxAXJQRR04xJQPkbfGTaA==", "requires": { - "@bitbybit-dev/jscad": "0.20.0", + "@bitbybit-dev/jscad": "0.20.2", "rxjs": "7.5.5" } }, "@bitbybit-dev/manifold": { - "version": "0.20.0", - "resolved": "https://registry.npmjs.org/@bitbybit-dev/manifold/-/manifold-0.20.0.tgz", - "integrity": "sha512-pKsmGFs68hzzPU5Flx6GmIMKql2polMwMw2VLDeQlDkka6fio98ZUpc8niJbqmFqlbe6qmunq1rRCetQ5EW/cA==", + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@bitbybit-dev/manifold/-/manifold-0.20.2.tgz", + "integrity": "sha512-BJtFUzC2Juxm/NYYyOvu/TiXccvzSvb5dOomrTE9uHv04TPCwxy3sw/mMU1QeoJyeQ4F2eIaG0GgXUe8fCsHYA==", "requires": { "manifold-3d": "3.0.0" } }, "@bitbybit-dev/manifold-worker": { - "version": "0.20.0", - "resolved": "https://registry.npmjs.org/@bitbybit-dev/manifold-worker/-/manifold-worker-0.20.0.tgz", - "integrity": "sha512-pz9kHuk9URfif6yo3hcjQEy7pcG7+9R3FlHMXgkPDmvcFV0BYYYYFglSDqFZ6xcbUNz/9jeCy/zr47hCAuAKgg==", + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@bitbybit-dev/manifold-worker/-/manifold-worker-0.20.2.tgz", + "integrity": "sha512-+Zid8ALBXGTSLn6DlhU8abHduu5HlUpFZ5+RoIshXi4z5xQJbVhEWckDn1PF2Uq9y4qnwHTMQK+etF40Aei2MQ==", "requires": { - "@bitbybit-dev/manifold": "0.20.0", + "@bitbybit-dev/manifold": "0.20.2", "rxjs": "7.5.5" } }, "@bitbybit-dev/occt": { - "version": "0.20.0", - "resolved": "https://registry.npmjs.org/@bitbybit-dev/occt/-/occt-0.20.0.tgz", - "integrity": "sha512-riqAiZ6fawRDW2AGIV/qBnzM1y1DCckQG+F7ez9pTY/2gBXq2jA+5WDor4FL+8vwhgPZcdZ37R7fBSrcHHR1oQ==" + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@bitbybit-dev/occt/-/occt-0.20.2.tgz", + "integrity": "sha512-jPZyi50Z2BjCSJ+OwlroEG3Neqd8uPDtqp8skhREDSPxG6SAjIHCxxn7SZxl8w7rhhUDR/OCGm/uDdLeLR7Ncg==", + "requires": { + "@bitbybit-dev/base": "0.20.2" + } }, "@bitbybit-dev/occt-worker": { - "version": "0.20.0", - "resolved": "https://registry.npmjs.org/@bitbybit-dev/occt-worker/-/occt-worker-0.20.0.tgz", - "integrity": "sha512-zbDsXIF+HrxZfi0QwpxlVuPAxnUNyYQZP/aAal+Cf6/zS1IVVDhZMdq8g2Qf0KjyLDd9b7tbsvlfXXj52tEyZA==", + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@bitbybit-dev/occt-worker/-/occt-worker-0.20.2.tgz", + "integrity": "sha512-q6h/PbBAKnp01PshmhGE14x2b7YnW02YvnUrdGkU6FVYErxoQwwASiN10UKgeBbkD+jbc099kpFzJtvamPnMRw==", "requires": { - "@bitbybit-dev/occt": "0.20.0", + "@bitbybit-dev/occt": "0.20.2", "rxjs": "7.5.5" } }, diff --git a/packages/dev/babylonjs/package.json b/packages/dev/babylonjs/package.json index 81b13c1e..772a05dc 100644 --- a/packages/dev/babylonjs/package.json +++ b/packages/dev/babylonjs/package.json @@ -1,6 +1,6 @@ { "name": "@bitbybit-dev/babylonjs", - "version": "0.20.0", + "version": "0.20.2", "description": "Bit By Bit Developers BABYLONJS CAD Library to Program Geometry", "main": "index.js", "repository": { @@ -54,13 +54,13 @@ "types": "./index.d.ts", "type": "module", "dependencies": { - "@babylonjs/core": "8.1.1", - "@babylonjs/gui": "8.1.1", - "@babylonjs/loaders": "8.1.1", - "@babylonjs/materials": "8.1.1", - "@babylonjs/serializers": "8.1.1", + "@babylonjs/core": "8.4.0", + "@babylonjs/gui": "8.4.0", + "@babylonjs/loaders": "8.4.0", + "@babylonjs/materials": "8.4.0", + "@babylonjs/serializers": "8.4.0", "@babylonjs/havok": "1.3.10", - "@bitbybit-dev/core": "0.20.0", + "@bitbybit-dev/core": "0.20.2", "earcut": "2.2.3" }, "devDependencies": { diff --git a/packages/dev/base/lib/api/inputs/base-inputs.ts b/packages/dev/base/lib/api/inputs/base-inputs.ts index 6a149942..aeda5802 100644 --- a/packages/dev/base/lib/api/inputs/base-inputs.ts +++ b/packages/dev/base/lib/api/inputs/base-inputs.ts @@ -7,6 +7,10 @@ export namespace Base { export type Vector2 = [number, number]; export type Point3 = [number, number, number]; export type Vector3 = [number, number, number]; + export type Axis3 = {origin: Base.Point3, direction: Base.Vector3}; + export type Axis2 = {origin: Base.Point2, direction: Base.Vector2}; + export type Plane3 = { origin: Base.Point3, normal: Base.Vector3, direction: Base.Vector3 }; + export type BoundingBox = { min: Base.Point3, max: Base.Point3, center?: Base.Point3, width?: number, height?: number, length?: number }; export type Line2 = { start: Base.Point2, end: Base.Point2 }; export type Line3 = { start: Base.Point3, end: Base.Point3 }; export type Polyline3 = { points: Base.Point3[], isClosed?: boolean, color?: number[] }; diff --git a/packages/dev/base/lib/api/inputs/point-inputs.ts b/packages/dev/base/lib/api/inputs/point-inputs.ts index 079174cc..69987dff 100644 --- a/packages/dev/base/lib/api/inputs/point-inputs.ts +++ b/packages/dev/base/lib/api/inputs/point-inputs.ts @@ -351,6 +351,34 @@ export namespace Point { */ transformation: Base.TransformMatrixes[]; } + export class ThreePointsNormalDto { + constructor(point1?: Base.Point3, point2?: Base.Point3, point3?: Base.Point3, reverseNormal?: boolean) { + if (point1 !== undefined) { this.point1 = point1; } + if (point2 !== undefined) { this.point2 = point2; } + if (point3 !== undefined) { this.point3 = point3; } + if (reverseNormal !== undefined) { this.reverseNormal = reverseNormal; } + } + /** + * Point 1 + * @default undefined + */ + point1: Base.Point3; + /** + * Point 2 + * @default undefined + */ + point2: Base.Point3; + /** + * Point 3 + * @default undefined + */ + point3: Base.Point3; + /** + * Reverse normal direction + * @default false + */ + reverseNormal = false; + } export class RemoveConsecutiveDuplicatesDto { constructor(points?: Base.Point3[], tolerance?: number, checkFirstAndLast?: boolean) { if (points !== undefined) { this.points = points; } diff --git a/packages/dev/base/lib/api/inputs/text-inputs.ts b/packages/dev/base/lib/api/inputs/text-inputs.ts index beea31bc..6f35f40d 100644 --- a/packages/dev/base/lib/api/inputs/text-inputs.ts +++ b/packages/dev/base/lib/api/inputs/text-inputs.ts @@ -152,53 +152,9 @@ export namespace Text { */ extrudeOffset? = 0; } - export class VectorCharResultDto { - constructor(width?: number, height?: number, paths?: Base.Point3[][]) { - if (width !== undefined) { this.width = width; } - if (height !== undefined) { this.height = height; } - if (paths !== undefined) { this.paths = paths; } - } - /** - * The width of the char - * @default undefined - */ - width?: number; - /** - * The height of the char - * @default undefined - */ - height?: number; - /** - * The segments of the char - * @default undefined - */ - paths?: Base.Point3[][]; - } - - export class VectorTextResultDto { - constructor(width?: number, height?: number, chars?: VectorCharResultDto[]) { - if (width !== undefined) { this.width = width; } - if (height !== undefined) { this.height = height; } - if (chars !== undefined) { this.chars = chars; } - } - /** - * The width of the char - * @default undefined - */ - width?: number; - /** - * The height of the char - * @default undefined - */ - height?: number; - /** - * The segments of the char - * @default undefined - */ - chars?: VectorCharResultDto[]; - } + export class VectorTextDto { - constructor(text?: string, xOffset?: number, yOffset?: number, height?: number, lineSpacing?: number, letterSpacing?: number, align?: Base.horizontalAlignEnum, extrudeOffset?: number) { + constructor(text?: string, xOffset?: number, yOffset?: number, height?: number, lineSpacing?: number, letterSpacing?: number, align?: Base.horizontalAlignEnum, extrudeOffset?: number, centerOnOrigin?: boolean) { if (text !== undefined) { this.text = text; } if (xOffset !== undefined) { this.xOffset = xOffset; } if (yOffset !== undefined) { this.yOffset = yOffset; } @@ -207,6 +163,7 @@ export namespace Text { if (letterSpacing !== undefined) { this.letterSpacing = letterSpacing; } if (align !== undefined) { this.align = align; } if (extrudeOffset !== undefined) { this.extrudeOffset = extrudeOffset; } + if (centerOnOrigin !== undefined) { this.centerOnOrigin = centerOnOrigin; } } /** * The text @@ -266,6 +223,11 @@ export namespace Text { * @step 0.1 */ extrudeOffset? = 0; + /** + * Will center text on 0, 0, 0 + * @default false + */ + centerOnOrigin = false; } } diff --git a/packages/dev/base/lib/api/inputs/vector-inputs.ts b/packages/dev/base/lib/api/inputs/vector-inputs.ts index 85ee0dee..bf2d500c 100644 --- a/packages/dev/base/lib/api/inputs/vector-inputs.ts +++ b/packages/dev/base/lib/api/inputs/vector-inputs.ts @@ -72,6 +72,30 @@ export namespace Vector { */ tolerance = 1e-7; } + export class VectorsTheSameDto { + constructor(vec1?: number[], vec2?: number[], tolerance?: number) { + if (vec1 !== undefined) { this.vec1 = vec1; } + if (vec2 !== undefined) { this.vec2 = vec2; } + if (tolerance !== undefined) { this.tolerance = tolerance; } + } + /** + * First vector + * @default undefined + */ + vec1: number[]; + /** + * Second vector + * @default undefined + */ + vec2: number[]; + /** + * Tolerance value + * @default 1e-7 + * @minimum 0 + * @maximum Infinity + */ + tolerance = 1e-7; + } export class VectorDto { constructor(vector?: number[]) { if (vector !== undefined) { this.vector = vector; } diff --git a/packages/dev/base/lib/api/models/index.ts b/packages/dev/base/lib/api/models/index.ts new file mode 100644 index 00000000..e20cd3f8 --- /dev/null +++ b/packages/dev/base/lib/api/models/index.ts @@ -0,0 +1 @@ +export * from "./text"; diff --git a/packages/dev/base/lib/api/models/simplex.ts b/packages/dev/base/lib/api/models/simplex.ts index e4058d17..f0ff92bf 100644 --- a/packages/dev/base/lib/api/models/simplex.ts +++ b/packages/dev/base/lib/api/models/simplex.ts @@ -4,7 +4,7 @@ // { [ascii code]: [width, x, y, ...] } - undefined value as path separator export const simplex = { - height: 14, + height: 21, 32: [16], 33: [10, 5, 21, 5, 7, undefined, 5, 2, 4, 1, 5, 0, 6, 1, 5, 2], 34: [16, 4, 21, 4, 14, undefined, 12, 21, 12, 14], @@ -108,7 +108,7 @@ export const defaultsVectorParams = { input: "?", align: "left", font: simplex, - height: 14, // == old vector_xxx simplex font height + height: 21, // == old vector_xxx simplex font height lineSpacing: 2.142857142857143, // == 30/14 == old vector_xxx ratio letterSpacing: 1, extrudeOffset: 0 diff --git a/packages/dev/base/lib/api/models/text/bucket.ts b/packages/dev/base/lib/api/models/text/bucket.ts new file mode 100644 index 00000000..3e8b001e --- /dev/null +++ b/packages/dev/base/lib/api/models/text/bucket.ts @@ -0,0 +1,2 @@ +export * from "./vector-char-data"; +export * from "./vector-text-data"; \ No newline at end of file diff --git a/packages/dev/base/lib/api/models/text/index.ts b/packages/dev/base/lib/api/models/text/index.ts new file mode 100644 index 00000000..86cbb3fa --- /dev/null +++ b/packages/dev/base/lib/api/models/text/index.ts @@ -0,0 +1 @@ +export * as Text from "./bucket"; diff --git a/packages/dev/base/lib/api/models/text/vector-char-data.ts b/packages/dev/base/lib/api/models/text/vector-char-data.ts new file mode 100644 index 00000000..1467c111 --- /dev/null +++ b/packages/dev/base/lib/api/models/text/vector-char-data.ts @@ -0,0 +1,24 @@ +import { Base } from "../../inputs/base-inputs"; + +export class VectorCharData { + constructor(width?: number, height?: number, paths?: Base.Point3[][]) { + if (width !== undefined) { this.width = width; } + if (height !== undefined) { this.height = height; } + if (paths !== undefined) { this.paths = paths; } + } + /** + * The width of the char + * @default undefined + */ + width?: number; + /** + * The height of the char + * @default undefined + */ + height?: number; + /** + * The segments of the char + * @default undefined + */ + paths?: Base.Point3[][]; +} \ No newline at end of file diff --git a/packages/dev/base/lib/api/models/text/vector-text-data.ts b/packages/dev/base/lib/api/models/text/vector-text-data.ts new file mode 100644 index 00000000..dd1e6d47 --- /dev/null +++ b/packages/dev/base/lib/api/models/text/vector-text-data.ts @@ -0,0 +1,25 @@ + +import { VectorCharData } from "./vector-char-data"; + +export class VectorTextData { + constructor(width?: number, height?: number, chars?: VectorCharData[]) { + if (width !== undefined) { this.width = width; } + if (height !== undefined) { this.height = height; } + if (chars !== undefined) { this.chars = chars; } + } + /** + * The width of the char + * @default undefined + */ + width?: number; + /** + * The height of the char + * @default undefined + */ + height?: number; + /** + * The segments of the char + * @default undefined + */ + chars?: VectorCharData[]; +} \ No newline at end of file diff --git a/packages/dev/base/lib/api/services/point.ts b/packages/dev/base/lib/api/services/point.ts index eb0c33de..bd295115 100644 --- a/packages/dev/base/lib/api/services/point.ts +++ b/packages/dev/base/lib/api/services/point.ts @@ -1,6 +1,7 @@ import { GeometryHelper } from "./geometry-helper"; import * as Inputs from "../inputs"; import { Transforms } from "./transforms"; +import { Vector } from "./vector"; /** * Contains various methods for points. Point in bitbybit is simply an array containing 3 numbers for [x, y, z]. @@ -10,7 +11,7 @@ import { Transforms } from "./transforms"; export class Point { - constructor(private readonly geometryHelper: GeometryHelper, private readonly transforms: Transforms) { } + constructor(private readonly geometryHelper: GeometryHelper, private readonly transforms: Transforms, private readonly vector: Vector) { } /** * Transforms the single point @@ -126,6 +127,45 @@ export class Point { return this.geometryHelper.transformControlPoints(rotationTransforms, inputs.points); } + /** + * Gets a bounding box of the points + * @param inputs Points + * @returns Bounding box of points + * @group extract + * @shortname bounding box pts + * @drawable true + */ + boundingBoxOfPoints(inputs: Inputs.Point.PointsDto): Inputs.Base.BoundingBox { + const xVals = []; + const yVals = []; + const zVals = []; + + inputs.points.forEach(pt => { + xVals.push(pt[0]); + yVals.push(pt[1]); + zVals.push(pt[2]); + }); + + const min = [Math.min(...xVals), Math.min(...yVals), Math.min(...zVals)] as Inputs.Base.Point3; + const max = [Math.max(...xVals), Math.max(...yVals), Math.max(...zVals)] as Inputs.Base.Point3; + const center = [ + (min[0] + max[0]) / 2, + (min[1] + max[1]) / 2, + (min[2] + max[2]) / 2, + ] as Inputs.Base.Point3; + const width = max[0] - min[0]; + const height = max[1] - min[1]; + const length = max[2] - min[2]; + return { + min, + max, + center, + width, + height, + length, + }; + } + /** * Measures the closest distance between a point and a collection of points * @param inputs Point from which to measure and points to measure the distance against @@ -365,6 +405,55 @@ export class Point { return this.geometryHelper.removeConsecutivePointDuplicates(inputs.points, inputs.checkFirstAndLast, inputs.tolerance); } + /** + * Creates a normal vector from 3 points + * @param inputs Three points and the reverse normal flag + * @returns Normal vector + * @group create + * @shortname normal from 3 points + * @drawable true + */ + normalFromThreePoints(inputs: Inputs.Point.ThreePointsNormalDto): Inputs.Base.Vector3 { + const p1 = inputs.point1; + const p2 = inputs.point2; + const p3 = inputs.point3; + + if (!p1 || !p2 || !p3 || p1.length !== 3 || p2.length !== 3 || p3.length !== 3) { + throw new Error("All points must be arrays of 3 numbers [x, y, z]"); + } + + // Calculate vector A = p2 - p1 + const ax = p2[0] - p1[0]; + const ay = p2[1] - p1[1]; + const az = p2[2] - p1[2]; + + // Calculate vector B = p3 - p1 + const bx = p3[0] - p1[0]; + const by = p3[1] - p1[1]; + const bz = p3[2] - p1[2]; + + // Calculate the cross product N = A x B + let nx = (ay * bz) - (az * by); + let ny = (az * bx) - (ax * bz); + let nz = (ax * by) - (ay * bx); + + // Check for collinear points (resulting in a zero vector) + // A zero vector indicates the points don't form a unique plane. + // You might want to handle this case depending on your application. + if (nx === 0 && ny === 0 && nz === 0) { + console.warn("Points are collinear or coincident; cannot calculate a unique normal."); + return undefined; // Or return [0, 0, 0] if that's acceptable + } + + if (inputs.reverseNormal) { + nx = -nx; + ny = -ny; + nz = -nz; + } + + return this.vector.normalized({ vector: [nx, ny, nz] }) as Inputs.Base.Vector3; + } + private closestPointFromPointData(inputs: Inputs.Point.ClosestPointFromPointsDto): { index: number, point: Inputs.Base.Point3, distance: number } { diff --git a/packages/dev/base/lib/api/services/text.test.ts b/packages/dev/base/lib/api/services/text.test.ts index 0987621c..34239254 100644 --- a/packages/dev/base/lib/api/services/text.test.ts +++ b/packages/dev/base/lib/api/services/text.test.ts @@ -13,7 +13,7 @@ describe("Text unit tests", () => { const math = new MathBitByBit(); const vector = new Vector(math, geometryHelper); const transforms = new Transforms(vector, math); - const points = new Point(geometryHelper, transforms); + const points = new Point(geometryHelper, transforms, vector); text = new TextBitByBit(points); }); diff --git a/packages/dev/base/lib/api/services/text.ts b/packages/dev/base/lib/api/services/text.ts index dbdd998e..2029e4ab 100644 --- a/packages/dev/base/lib/api/services/text.ts +++ b/packages/dev/base/lib/api/services/text.ts @@ -1,4 +1,5 @@ import * as Inputs from "../inputs"; +import * as Models from "../models"; import { defaultsVectorParams } from "../models/simplex"; import { Point } from "./point"; @@ -6,7 +7,7 @@ import { Point } from "./point"; * Contains various text methods. */ export class TextBitByBit { - constructor(private readonly point: Point) { + constructor(private readonly point: Point) { } /** @@ -103,7 +104,7 @@ export class TextBitByBit { * @shortname vector char * @drawable false */ - vectorChar(inputs: Inputs.Text.VectorCharDto): Inputs.Text.VectorCharResultDto { + vectorChar(inputs: Inputs.Text.VectorCharDto): Models.Text.VectorCharData { const { xOffset, yOffset, font, input, height, extrudeOffset } = this.vectorParamsChar(inputs); @@ -142,7 +143,7 @@ export class TextBitByBit { * @shortname vector text * @drawable false */ - vectorText(inputs: Inputs.Text.VectorTextDto): Inputs.Text.VectorTextResultDto[] { + vectorText(inputs: Inputs.Text.VectorTextDto): Models.Text.VectorTextData[] { const { xOffset, yOffset, height, align, extrudeOffset, lineSpacing, letterSpacing } = Object.assign({}, defaultsVectorParams, inputs); @@ -155,8 +156,9 @@ export class TextBitByBit { // manage the list of lines let maxWidth = 0; // keep track of max width for final alignment - let line = { width: 0, height: 0, chars: [] }; - let lines = []; + type Line = { width: number, height: number, chars: Models.Text.VectorCharData[] }; + let line: Line = { width: 0, height: 0, chars: [] }; + let lines: Line[] = []; const pushLine = () => { maxWidth = Math.max(maxWidth, line.width); @@ -206,6 +208,41 @@ export class TextBitByBit { return line; } }); + + if (inputs.centerOnOrigin) { + const pointsFlat: Inputs.Base.Point3[] = []; + + // flatten the lines into a single array of points + lines.forEach((line) => { + line.chars.forEach((vchar) => { + vchar.paths.forEach((path) => { + pointsFlat.push(...path); + }); + }); + }); + + const bbox = this.point.boundingBoxOfPoints({ + points: pointsFlat, + }); + + lines.forEach((line) => { + line.chars.forEach((vchar) => { + vchar.paths = vchar.paths.map((path) => { + const pts = this.point.translatePoints({ + points: path, + translation: [ + -bbox.center[0], + -bbox.center[1], + -bbox.center[2], + ], + }); + return pts; + }); + return vchar; + }); + }); + } + return lines; } diff --git a/packages/dev/base/lib/api/services/vector.ts b/packages/dev/base/lib/api/services/vector.ts index 8c323654..0016711c 100644 --- a/packages/dev/base/lib/api/services/vector.ts +++ b/packages/dev/base/lib/api/services/vector.ts @@ -35,6 +35,19 @@ export class Vector { removeConsecutiveDuplicateVectors(inputs: Inputs.Vector.RemoveConsecutiveDuplicateVectorsDto): number[][] { return this.geometryHelper.removeConsecutiveVectorDuplicates(inputs.vectors, inputs.checkFirstAndLast, inputs.tolerance); } + + /** + * Checks if two vectors are the same within a given tolerance + * @param inputs Contains two vectors and a tolerance value + * @returns Boolean indicating if vectors are the same + * @group validate + * @shortname vectors the same + * @drawable false + */ + vectorsTheSame(inputs: Inputs.Vector.VectorsTheSameDto): boolean { + return this.geometryHelper.vectorsTheSame(inputs.vec1, inputs.vec2, inputs.tolerance); + } + /** * Measures the angle between two vectors in degrees * @param inputs Contains two vectors represented as number arrays diff --git a/packages/dev/base/package-lock.json b/packages/dev/base/package-lock.json index 97f78497..abb18c04 100644 --- a/packages/dev/base/package-lock.json +++ b/packages/dev/base/package-lock.json @@ -1,12 +1,12 @@ { "name": "@bitbybit-dev/base", - "version": "0.20.0", + "version": "0.20.2", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "@bitbybit-dev/base", - "version": "0.20.0", + "version": "0.20.2", "license": "MIT", "devDependencies": { "@babel/core": "7.16.0", diff --git a/packages/dev/base/package.json b/packages/dev/base/package.json index 4e36a19c..6adf1198 100644 --- a/packages/dev/base/package.json +++ b/packages/dev/base/package.json @@ -1,6 +1,6 @@ { "name": "@bitbybit-dev/base", - "version": "0.20.0", + "version": "0.20.2", "description": "Bit By Bit Developers Base CAD Library to Program Geometry", "main": "index.js", "repository": { diff --git a/packages/dev/core/lib/api/inputs/base-inputs.ts b/packages/dev/core/lib/api/inputs/base-inputs.ts index eb7e4b50..431fb88f 100644 --- a/packages/dev/core/lib/api/inputs/base-inputs.ts +++ b/packages/dev/core/lib/api/inputs/base-inputs.ts @@ -19,6 +19,10 @@ export namespace Base { export type Vector2 = [number, number]; export type Point3 = [number, number, number]; export type Vector3 = [number, number, number]; + export type Axis3 = {origin: Base.Point3, direction: Base.Vector3}; + export type Axis2 = {origin: Base.Point2, direction: Base.Vector2}; + export type Plane3 = { origin: Base.Point3, normal: Base.Vector3, direction: Base.Vector3 }; + export type BoundingBox = { min: Base.Point3, max: Base.Point3, center?: Base.Point3, width?: number, height?: number, length?: number }; export type Line2 = { start: Base.Point2, end: Base.Point2 }; export type Line3 = { start: Base.Point3, end: Base.Point3 }; export type Polyline3 = { points: Base.Point3[], isClosed?: boolean }; diff --git a/packages/dev/core/lib/api/models/index.ts b/packages/dev/core/lib/api/models/index.ts new file mode 100644 index 00000000..9fc88c30 --- /dev/null +++ b/packages/dev/core/lib/api/models/index.ts @@ -0,0 +1 @@ +export * from "@bitbybit-dev/occt/lib/api/models"; diff --git a/packages/dev/core/package-lock.json b/packages/dev/core/package-lock.json index 3b21cbea..3e428f20 100644 --- a/packages/dev/core/package-lock.json +++ b/packages/dev/core/package-lock.json @@ -1,18 +1,18 @@ { "name": "@bitbybit-dev/core", - "version": "0.20.0", + "version": "0.20.2", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "@bitbybit-dev/core", - "version": "0.20.0", + "version": "0.20.2", "license": "MIT", "dependencies": { - "@bitbybit-dev/base": "0.20.0", - "@bitbybit-dev/jscad-worker": "0.20.0", - "@bitbybit-dev/manifold-worker": "0.20.0", - "@bitbybit-dev/occt-worker": "0.20.0", + "@bitbybit-dev/base": "0.20.2", + "@bitbybit-dev/jscad-worker": "0.20.2", + "@bitbybit-dev/manifold-worker": "0.20.2", + "@bitbybit-dev/occt-worker": "0.20.2", "jsonpath-plus": "10.1.0", "rxjs": "7.5.5", "verb-nurbs-web": "2.1.3" @@ -1707,16 +1707,16 @@ "dev": true }, "node_modules/@bitbybit-dev/base": { - "version": "0.20.0", - "resolved": "https://registry.npmjs.org/@bitbybit-dev/base/-/base-0.20.0.tgz", - "integrity": "sha512-9J09Z3qY8JHfkWQe43BjDHPcm6MMec2YEL+Ily0U0dd/5+avcV+0N9zq+AYbTHbU9hczDBQH648L5uDNu7UOVg==" + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@bitbybit-dev/base/-/base-0.20.2.tgz", + "integrity": "sha512-+8jxnr7n7SNnuvh3uBgFQSTFYlOA+UrXUhE5XpeukPtTt3ffRShfTC3eRP9q+m/ummljKpKVLGGwSlCsKbriBQ==" }, "node_modules/@bitbybit-dev/jscad": { - "version": "0.20.0", - "resolved": "https://registry.npmjs.org/@bitbybit-dev/jscad/-/jscad-0.20.0.tgz", - "integrity": "sha512-pvC+XI/fTww6kHi9kOdu/udf94iSeiPAURMGbTSq4knBCY6oa9Cv2ZcsBccmsCU67nyVBthGKuGuD9os45zq0w==", + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@bitbybit-dev/jscad/-/jscad-0.20.2.tgz", + "integrity": "sha512-jRkvkjQM9OwtuB6grNndK4io28woHSiDULfYkEckdK7Ms13esj0qtsi5j1NaAZizd04xdKVuThFhEzIzRkdkkQ==", "dependencies": { - "@bitbybit-dev/base": "0.20.0", + "@bitbybit-dev/base": "0.20.2", "@jscad/3mf-serializer": "2.1.12", "@jscad/dxf-serializer": "2.1.18", "@jscad/io-utils": "2.0.28", @@ -1725,42 +1725,45 @@ } }, "node_modules/@bitbybit-dev/jscad-worker": { - "version": "0.20.0", - "resolved": "https://registry.npmjs.org/@bitbybit-dev/jscad-worker/-/jscad-worker-0.20.0.tgz", - "integrity": "sha512-/Fybz1brNyDvbzyFY2B3EERAfZCWPtVhRdgpruKnJ1Wb1pffQ2QMgQBGLJBB1jdpwQ5lmaByub97Il71KcIYmQ==", + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@bitbybit-dev/jscad-worker/-/jscad-worker-0.20.2.tgz", + "integrity": "sha512-bTnlO3yqvTNFqAx3dGnhrX/O7HPNuXRE5vn68ogK7belWEI8r26XaN5kJEzcN8k9maxAXJQRR04xJQPkbfGTaA==", "dependencies": { - "@bitbybit-dev/jscad": "0.20.0", + "@bitbybit-dev/jscad": "0.20.2", "rxjs": "7.5.5" } }, "node_modules/@bitbybit-dev/manifold": { - "version": "0.20.0", - "resolved": "https://registry.npmjs.org/@bitbybit-dev/manifold/-/manifold-0.20.0.tgz", - "integrity": "sha512-pKsmGFs68hzzPU5Flx6GmIMKql2polMwMw2VLDeQlDkka6fio98ZUpc8niJbqmFqlbe6qmunq1rRCetQ5EW/cA==", + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@bitbybit-dev/manifold/-/manifold-0.20.2.tgz", + "integrity": "sha512-BJtFUzC2Juxm/NYYyOvu/TiXccvzSvb5dOomrTE9uHv04TPCwxy3sw/mMU1QeoJyeQ4F2eIaG0GgXUe8fCsHYA==", "dependencies": { "manifold-3d": "3.0.0" } }, "node_modules/@bitbybit-dev/manifold-worker": { - "version": "0.20.0", - "resolved": "https://registry.npmjs.org/@bitbybit-dev/manifold-worker/-/manifold-worker-0.20.0.tgz", - "integrity": "sha512-pz9kHuk9URfif6yo3hcjQEy7pcG7+9R3FlHMXgkPDmvcFV0BYYYYFglSDqFZ6xcbUNz/9jeCy/zr47hCAuAKgg==", + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@bitbybit-dev/manifold-worker/-/manifold-worker-0.20.2.tgz", + "integrity": "sha512-+Zid8ALBXGTSLn6DlhU8abHduu5HlUpFZ5+RoIshXi4z5xQJbVhEWckDn1PF2Uq9y4qnwHTMQK+etF40Aei2MQ==", "dependencies": { - "@bitbybit-dev/manifold": "0.20.0", + "@bitbybit-dev/manifold": "0.20.2", "rxjs": "7.5.5" } }, "node_modules/@bitbybit-dev/occt": { - "version": "0.20.0", - "resolved": "https://registry.npmjs.org/@bitbybit-dev/occt/-/occt-0.20.0.tgz", - "integrity": "sha512-riqAiZ6fawRDW2AGIV/qBnzM1y1DCckQG+F7ez9pTY/2gBXq2jA+5WDor4FL+8vwhgPZcdZ37R7fBSrcHHR1oQ==" + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@bitbybit-dev/occt/-/occt-0.20.2.tgz", + "integrity": "sha512-jPZyi50Z2BjCSJ+OwlroEG3Neqd8uPDtqp8skhREDSPxG6SAjIHCxxn7SZxl8w7rhhUDR/OCGm/uDdLeLR7Ncg==", + "dependencies": { + "@bitbybit-dev/base": "0.20.2" + } }, "node_modules/@bitbybit-dev/occt-worker": { - "version": "0.20.0", - "resolved": "https://registry.npmjs.org/@bitbybit-dev/occt-worker/-/occt-worker-0.20.0.tgz", - "integrity": "sha512-zbDsXIF+HrxZfi0QwpxlVuPAxnUNyYQZP/aAal+Cf6/zS1IVVDhZMdq8g2Qf0KjyLDd9b7tbsvlfXXj52tEyZA==", + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@bitbybit-dev/occt-worker/-/occt-worker-0.20.2.tgz", + "integrity": "sha512-q6h/PbBAKnp01PshmhGE14x2b7YnW02YvnUrdGkU6FVYErxoQwwASiN10UKgeBbkD+jbc099kpFzJtvamPnMRw==", "dependencies": { - "@bitbybit-dev/occt": "0.20.0", + "@bitbybit-dev/occt": "0.20.2", "rxjs": "7.5.5" } }, @@ -8376,16 +8379,16 @@ "dev": true }, "@bitbybit-dev/base": { - "version": "0.20.0", - "resolved": "https://registry.npmjs.org/@bitbybit-dev/base/-/base-0.20.0.tgz", - "integrity": "sha512-9J09Z3qY8JHfkWQe43BjDHPcm6MMec2YEL+Ily0U0dd/5+avcV+0N9zq+AYbTHbU9hczDBQH648L5uDNu7UOVg==" + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@bitbybit-dev/base/-/base-0.20.2.tgz", + "integrity": "sha512-+8jxnr7n7SNnuvh3uBgFQSTFYlOA+UrXUhE5XpeukPtTt3ffRShfTC3eRP9q+m/ummljKpKVLGGwSlCsKbriBQ==" }, "@bitbybit-dev/jscad": { - "version": "0.20.0", - "resolved": "https://registry.npmjs.org/@bitbybit-dev/jscad/-/jscad-0.20.0.tgz", - "integrity": "sha512-pvC+XI/fTww6kHi9kOdu/udf94iSeiPAURMGbTSq4knBCY6oa9Cv2ZcsBccmsCU67nyVBthGKuGuD9os45zq0w==", + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@bitbybit-dev/jscad/-/jscad-0.20.2.tgz", + "integrity": "sha512-jRkvkjQM9OwtuB6grNndK4io28woHSiDULfYkEckdK7Ms13esj0qtsi5j1NaAZizd04xdKVuThFhEzIzRkdkkQ==", "requires": { - "@bitbybit-dev/base": "0.20.0", + "@bitbybit-dev/base": "0.20.2", "@jscad/3mf-serializer": "2.1.12", "@jscad/dxf-serializer": "2.1.18", "@jscad/io-utils": "2.0.28", @@ -8394,42 +8397,45 @@ } }, "@bitbybit-dev/jscad-worker": { - "version": "0.20.0", - "resolved": "https://registry.npmjs.org/@bitbybit-dev/jscad-worker/-/jscad-worker-0.20.0.tgz", - "integrity": "sha512-/Fybz1brNyDvbzyFY2B3EERAfZCWPtVhRdgpruKnJ1Wb1pffQ2QMgQBGLJBB1jdpwQ5lmaByub97Il71KcIYmQ==", + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@bitbybit-dev/jscad-worker/-/jscad-worker-0.20.2.tgz", + "integrity": "sha512-bTnlO3yqvTNFqAx3dGnhrX/O7HPNuXRE5vn68ogK7belWEI8r26XaN5kJEzcN8k9maxAXJQRR04xJQPkbfGTaA==", "requires": { - "@bitbybit-dev/jscad": "0.20.0", + "@bitbybit-dev/jscad": "0.20.2", "rxjs": "7.5.5" } }, "@bitbybit-dev/manifold": { - "version": "0.20.0", - "resolved": "https://registry.npmjs.org/@bitbybit-dev/manifold/-/manifold-0.20.0.tgz", - "integrity": "sha512-pKsmGFs68hzzPU5Flx6GmIMKql2polMwMw2VLDeQlDkka6fio98ZUpc8niJbqmFqlbe6qmunq1rRCetQ5EW/cA==", + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@bitbybit-dev/manifold/-/manifold-0.20.2.tgz", + "integrity": "sha512-BJtFUzC2Juxm/NYYyOvu/TiXccvzSvb5dOomrTE9uHv04TPCwxy3sw/mMU1QeoJyeQ4F2eIaG0GgXUe8fCsHYA==", "requires": { "manifold-3d": "3.0.0" } }, "@bitbybit-dev/manifold-worker": { - "version": "0.20.0", - "resolved": "https://registry.npmjs.org/@bitbybit-dev/manifold-worker/-/manifold-worker-0.20.0.tgz", - "integrity": "sha512-pz9kHuk9URfif6yo3hcjQEy7pcG7+9R3FlHMXgkPDmvcFV0BYYYYFglSDqFZ6xcbUNz/9jeCy/zr47hCAuAKgg==", + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@bitbybit-dev/manifold-worker/-/manifold-worker-0.20.2.tgz", + "integrity": "sha512-+Zid8ALBXGTSLn6DlhU8abHduu5HlUpFZ5+RoIshXi4z5xQJbVhEWckDn1PF2Uq9y4qnwHTMQK+etF40Aei2MQ==", "requires": { - "@bitbybit-dev/manifold": "0.20.0", + "@bitbybit-dev/manifold": "0.20.2", "rxjs": "7.5.5" } }, "@bitbybit-dev/occt": { - "version": "0.20.0", - "resolved": "https://registry.npmjs.org/@bitbybit-dev/occt/-/occt-0.20.0.tgz", - "integrity": "sha512-riqAiZ6fawRDW2AGIV/qBnzM1y1DCckQG+F7ez9pTY/2gBXq2jA+5WDor4FL+8vwhgPZcdZ37R7fBSrcHHR1oQ==" + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@bitbybit-dev/occt/-/occt-0.20.2.tgz", + "integrity": "sha512-jPZyi50Z2BjCSJ+OwlroEG3Neqd8uPDtqp8skhREDSPxG6SAjIHCxxn7SZxl8w7rhhUDR/OCGm/uDdLeLR7Ncg==", + "requires": { + "@bitbybit-dev/base": "0.20.2" + } }, "@bitbybit-dev/occt-worker": { - "version": "0.20.0", - "resolved": "https://registry.npmjs.org/@bitbybit-dev/occt-worker/-/occt-worker-0.20.0.tgz", - "integrity": "sha512-zbDsXIF+HrxZfi0QwpxlVuPAxnUNyYQZP/aAal+Cf6/zS1IVVDhZMdq8g2Qf0KjyLDd9b7tbsvlfXXj52tEyZA==", + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@bitbybit-dev/occt-worker/-/occt-worker-0.20.2.tgz", + "integrity": "sha512-q6h/PbBAKnp01PshmhGE14x2b7YnW02YvnUrdGkU6FVYErxoQwwASiN10UKgeBbkD+jbc099kpFzJtvamPnMRw==", "requires": { - "@bitbybit-dev/occt": "0.20.0", + "@bitbybit-dev/occt": "0.20.2", "rxjs": "7.5.5" } }, diff --git a/packages/dev/core/package.json b/packages/dev/core/package.json index 47349df1..046bee9a 100644 --- a/packages/dev/core/package.json +++ b/packages/dev/core/package.json @@ -1,6 +1,6 @@ { "name": "@bitbybit-dev/core", - "version": "0.20.0", + "version": "0.20.2", "description": "Bit By Bit Developers Core CAD API to Program Geometry", "main": "index.js", "repository": { @@ -54,10 +54,10 @@ "types": "./index.d.ts", "type": "module", "dependencies": { - "@bitbybit-dev/base": "0.20.0", - "@bitbybit-dev/occt-worker": "0.20.0", - "@bitbybit-dev/manifold-worker": "0.20.0", - "@bitbybit-dev/jscad-worker": "0.20.0", + "@bitbybit-dev/base": "0.20.2", + "@bitbybit-dev/occt-worker": "0.20.2", + "@bitbybit-dev/manifold-worker": "0.20.2", + "@bitbybit-dev/jscad-worker": "0.20.2", "jsonpath-plus": "10.1.0", "verb-nurbs-web": "2.1.3", "rxjs": "7.5.5" diff --git a/packages/dev/jscad-worker/package-lock.json b/packages/dev/jscad-worker/package-lock.json index bcbb9610..3cf819e2 100644 --- a/packages/dev/jscad-worker/package-lock.json +++ b/packages/dev/jscad-worker/package-lock.json @@ -1,15 +1,15 @@ { "name": "@bitbybit-dev/jscad-worker", - "version": "0.20.0", + "version": "0.20.2", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "@bitbybit-dev/jscad-worker", - "version": "0.20.0", + "version": "0.20.2", "license": "MIT", "dependencies": { - "@bitbybit-dev/jscad": "0.20.0", + "@bitbybit-dev/jscad": "0.20.2", "rxjs": "7.5.5" }, "devDependencies": { @@ -1702,16 +1702,16 @@ "dev": true }, "node_modules/@bitbybit-dev/base": { - "version": "0.20.0", - "resolved": "https://registry.npmjs.org/@bitbybit-dev/base/-/base-0.20.0.tgz", - "integrity": "sha512-9J09Z3qY8JHfkWQe43BjDHPcm6MMec2YEL+Ily0U0dd/5+avcV+0N9zq+AYbTHbU9hczDBQH648L5uDNu7UOVg==" + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@bitbybit-dev/base/-/base-0.20.2.tgz", + "integrity": "sha512-+8jxnr7n7SNnuvh3uBgFQSTFYlOA+UrXUhE5XpeukPtTt3ffRShfTC3eRP9q+m/ummljKpKVLGGwSlCsKbriBQ==" }, "node_modules/@bitbybit-dev/jscad": { - "version": "0.20.0", - "resolved": "https://registry.npmjs.org/@bitbybit-dev/jscad/-/jscad-0.20.0.tgz", - "integrity": "sha512-pvC+XI/fTww6kHi9kOdu/udf94iSeiPAURMGbTSq4knBCY6oa9Cv2ZcsBccmsCU67nyVBthGKuGuD9os45zq0w==", + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@bitbybit-dev/jscad/-/jscad-0.20.2.tgz", + "integrity": "sha512-jRkvkjQM9OwtuB6grNndK4io28woHSiDULfYkEckdK7Ms13esj0qtsi5j1NaAZizd04xdKVuThFhEzIzRkdkkQ==", "dependencies": { - "@bitbybit-dev/base": "0.20.0", + "@bitbybit-dev/base": "0.20.2", "@jscad/3mf-serializer": "2.1.12", "@jscad/dxf-serializer": "2.1.18", "@jscad/io-utils": "2.0.28", @@ -8236,16 +8236,16 @@ "dev": true }, "@bitbybit-dev/base": { - "version": "0.20.0", - "resolved": "https://registry.npmjs.org/@bitbybit-dev/base/-/base-0.20.0.tgz", - "integrity": "sha512-9J09Z3qY8JHfkWQe43BjDHPcm6MMec2YEL+Ily0U0dd/5+avcV+0N9zq+AYbTHbU9hczDBQH648L5uDNu7UOVg==" + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@bitbybit-dev/base/-/base-0.20.2.tgz", + "integrity": "sha512-+8jxnr7n7SNnuvh3uBgFQSTFYlOA+UrXUhE5XpeukPtTt3ffRShfTC3eRP9q+m/ummljKpKVLGGwSlCsKbriBQ==" }, "@bitbybit-dev/jscad": { - "version": "0.20.0", - "resolved": "https://registry.npmjs.org/@bitbybit-dev/jscad/-/jscad-0.20.0.tgz", - "integrity": "sha512-pvC+XI/fTww6kHi9kOdu/udf94iSeiPAURMGbTSq4knBCY6oa9Cv2ZcsBccmsCU67nyVBthGKuGuD9os45zq0w==", + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@bitbybit-dev/jscad/-/jscad-0.20.2.tgz", + "integrity": "sha512-jRkvkjQM9OwtuB6grNndK4io28woHSiDULfYkEckdK7Ms13esj0qtsi5j1NaAZizd04xdKVuThFhEzIzRkdkkQ==", "requires": { - "@bitbybit-dev/base": "0.20.0", + "@bitbybit-dev/base": "0.20.2", "@jscad/3mf-serializer": "2.1.12", "@jscad/dxf-serializer": "2.1.18", "@jscad/io-utils": "2.0.28", diff --git a/packages/dev/jscad-worker/package.json b/packages/dev/jscad-worker/package.json index c0d2a40f..15d2b2c5 100644 --- a/packages/dev/jscad-worker/package.json +++ b/packages/dev/jscad-worker/package.json @@ -1,6 +1,6 @@ { "name": "@bitbybit-dev/jscad-worker", - "version": "0.20.0", + "version": "0.20.2", "description": "Bit By Bit Developers JSCAD Based CAD Library to Program Geometry Via WebWorker", "main": "index.js", "repository": { @@ -60,7 +60,7 @@ "types": "./index.d.ts", "type": "module", "dependencies": { - "@bitbybit-dev/jscad": "0.20.0", + "@bitbybit-dev/jscad": "0.20.2", "rxjs": "7.5.5" }, "devDependencies": { diff --git a/packages/dev/jscad/lib/api/inputs/base-inputs.ts b/packages/dev/jscad/lib/api/inputs/base-inputs.ts index 8e38c9bb..5f06f5c6 100644 --- a/packages/dev/jscad/lib/api/inputs/base-inputs.ts +++ b/packages/dev/jscad/lib/api/inputs/base-inputs.ts @@ -6,6 +6,10 @@ export namespace Base { export type Vector2 = [number, number]; export type Point3 = [number, number, number]; export type Vector3 = [number, number, number]; + export type Axis3 = {origin: Base.Point3, direction: Base.Vector3}; + export type Axis2 = {origin: Base.Point2, direction: Base.Vector2}; + export type Plane3 = { origin: Base.Point3, normal: Base.Vector3, direction: Base.Vector3 }; + export type BoundingBox = { min: Base.Point3, max: Base.Point3, center?: Base.Point3, width?: number, height?: number, length?: number }; export type Line2 = { start: Base.Point2, end: Base.Point2 }; export type Line3 = { start: Base.Point3, end: Base.Point3 }; export type Polyline3 = { points: Base.Point3[], isClosed?: boolean }; diff --git a/packages/dev/jscad/package-lock.json b/packages/dev/jscad/package-lock.json index d8347a07..1e58a616 100644 --- a/packages/dev/jscad/package-lock.json +++ b/packages/dev/jscad/package-lock.json @@ -1,15 +1,15 @@ { "name": "@bitbybit-dev/jscad", - "version": "0.20.0", + "version": "0.20.2", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "@bitbybit-dev/jscad", - "version": "0.20.0", + "version": "0.20.2", "license": "MIT", "dependencies": { - "@bitbybit-dev/base": "0.20.0", + "@bitbybit-dev/base": "0.20.2", "@jscad/3mf-serializer": "2.1.12", "@jscad/dxf-serializer": "2.1.18", "@jscad/io-utils": "2.0.28", @@ -1706,9 +1706,9 @@ "dev": true }, "node_modules/@bitbybit-dev/base": { - "version": "0.20.0", - "resolved": "https://registry.npmjs.org/@bitbybit-dev/base/-/base-0.20.0.tgz", - "integrity": "sha512-9J09Z3qY8JHfkWQe43BjDHPcm6MMec2YEL+Ily0U0dd/5+avcV+0N9zq+AYbTHbU9hczDBQH648L5uDNu7UOVg==" + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@bitbybit-dev/base/-/base-0.20.2.tgz", + "integrity": "sha512-+8jxnr7n7SNnuvh3uBgFQSTFYlOA+UrXUhE5XpeukPtTt3ffRShfTC3eRP9q+m/ummljKpKVLGGwSlCsKbriBQ==" }, "node_modules/@cspotcode/source-map-support": { "version": "0.8.1", @@ -8214,9 +8214,9 @@ "dev": true }, "@bitbybit-dev/base": { - "version": "0.20.0", - "resolved": "https://registry.npmjs.org/@bitbybit-dev/base/-/base-0.20.0.tgz", - "integrity": "sha512-9J09Z3qY8JHfkWQe43BjDHPcm6MMec2YEL+Ily0U0dd/5+avcV+0N9zq+AYbTHbU9hczDBQH648L5uDNu7UOVg==" + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@bitbybit-dev/base/-/base-0.20.2.tgz", + "integrity": "sha512-+8jxnr7n7SNnuvh3uBgFQSTFYlOA+UrXUhE5XpeukPtTt3ffRShfTC3eRP9q+m/ummljKpKVLGGwSlCsKbriBQ==" }, "@cspotcode/source-map-support": { "version": "0.8.1", diff --git a/packages/dev/jscad/package.json b/packages/dev/jscad/package.json index 82d379bb..373db8f8 100644 --- a/packages/dev/jscad/package.json +++ b/packages/dev/jscad/package.json @@ -1,6 +1,6 @@ { "name": "@bitbybit-dev/jscad", - "version": "0.20.0", + "version": "0.20.2", "description": "Bit By Bit Developers JSCAD based CAD Library to Program Geometry", "main": "index.js", "repository": { @@ -58,7 +58,7 @@ "types": "./index.d.ts", "type": "module", "dependencies": { - "@bitbybit-dev/base": "0.20.0", + "@bitbybit-dev/base": "0.20.2", "@jscad/io-utils": "2.0.28", "@jscad/modeling": "2.12.3", "@jscad/stl-serializer": "2.1.18", diff --git a/packages/dev/manifold-worker/package-lock.json b/packages/dev/manifold-worker/package-lock.json index 9b6161e5..0c87086a 100644 --- a/packages/dev/manifold-worker/package-lock.json +++ b/packages/dev/manifold-worker/package-lock.json @@ -1,15 +1,15 @@ { "name": "@bitbybit-dev/manifold-worker", - "version": "0.20.0", + "version": "0.20.2", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "@bitbybit-dev/manifold-worker", - "version": "0.20.0", + "version": "0.20.2", "license": "MIT", "dependencies": { - "@bitbybit-dev/manifold": "0.20.0", + "@bitbybit-dev/manifold": "0.20.2", "rxjs": "7.5.5" }, "devDependencies": { @@ -1702,9 +1702,9 @@ "dev": true }, "node_modules/@bitbybit-dev/manifold": { - "version": "0.20.0", - "resolved": "https://registry.npmjs.org/@bitbybit-dev/manifold/-/manifold-0.20.0.tgz", - "integrity": "sha512-pKsmGFs68hzzPU5Flx6GmIMKql2polMwMw2VLDeQlDkka6fio98ZUpc8niJbqmFqlbe6qmunq1rRCetQ5EW/cA==", + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@bitbybit-dev/manifold/-/manifold-0.20.2.tgz", + "integrity": "sha512-BJtFUzC2Juxm/NYYyOvu/TiXccvzSvb5dOomrTE9uHv04TPCwxy3sw/mMU1QeoJyeQ4F2eIaG0GgXUe8fCsHYA==", "dependencies": { "manifold-3d": "3.0.0" } @@ -8169,9 +8169,9 @@ "dev": true }, "@bitbybit-dev/manifold": { - "version": "0.20.0", - "resolved": "https://registry.npmjs.org/@bitbybit-dev/manifold/-/manifold-0.20.0.tgz", - "integrity": "sha512-pKsmGFs68hzzPU5Flx6GmIMKql2polMwMw2VLDeQlDkka6fio98ZUpc8niJbqmFqlbe6qmunq1rRCetQ5EW/cA==", + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@bitbybit-dev/manifold/-/manifold-0.20.2.tgz", + "integrity": "sha512-BJtFUzC2Juxm/NYYyOvu/TiXccvzSvb5dOomrTE9uHv04TPCwxy3sw/mMU1QeoJyeQ4F2eIaG0GgXUe8fCsHYA==", "requires": { "manifold-3d": "3.0.0" } diff --git a/packages/dev/manifold-worker/package.json b/packages/dev/manifold-worker/package.json index fbe4cabb..71545227 100644 --- a/packages/dev/manifold-worker/package.json +++ b/packages/dev/manifold-worker/package.json @@ -1,6 +1,6 @@ { "name": "@bitbybit-dev/manifold-worker", - "version": "0.20.0", + "version": "0.20.2", "description": "Bit By Bit Developers Manifold Based CAD Library to Program Geometry Via WebWorker", "main": "index.js", "repository": { @@ -60,7 +60,7 @@ "types": "./index.d.ts", "type": "module", "dependencies": { - "@bitbybit-dev/manifold": "0.20.0", + "@bitbybit-dev/manifold": "0.20.2", "rxjs": "7.5.5" }, "devDependencies": { diff --git a/packages/dev/manifold/lib/api/inputs/base-inputs.ts b/packages/dev/manifold/lib/api/inputs/base-inputs.ts index 8e38c9bb..5f06f5c6 100644 --- a/packages/dev/manifold/lib/api/inputs/base-inputs.ts +++ b/packages/dev/manifold/lib/api/inputs/base-inputs.ts @@ -6,6 +6,10 @@ export namespace Base { export type Vector2 = [number, number]; export type Point3 = [number, number, number]; export type Vector3 = [number, number, number]; + export type Axis3 = {origin: Base.Point3, direction: Base.Vector3}; + export type Axis2 = {origin: Base.Point2, direction: Base.Vector2}; + export type Plane3 = { origin: Base.Point3, normal: Base.Vector3, direction: Base.Vector3 }; + export type BoundingBox = { min: Base.Point3, max: Base.Point3, center?: Base.Point3, width?: number, height?: number, length?: number }; export type Line2 = { start: Base.Point2, end: Base.Point2 }; export type Line3 = { start: Base.Point3, end: Base.Point3 }; export type Polyline3 = { points: Base.Point3[], isClosed?: boolean }; diff --git a/packages/dev/manifold/package-lock.json b/packages/dev/manifold/package-lock.json index 3fe7d65d..e0e1a2eb 100644 --- a/packages/dev/manifold/package-lock.json +++ b/packages/dev/manifold/package-lock.json @@ -1,12 +1,12 @@ { "name": "@bitbybit-dev/manifold", - "version": "0.20.0", + "version": "0.20.2", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "@bitbybit-dev/manifold", - "version": "0.20.0", + "version": "0.20.2", "license": "MIT", "dependencies": { "manifold-3d": "3.0.0" diff --git a/packages/dev/manifold/package.json b/packages/dev/manifold/package.json index b464c467..d49a125c 100644 --- a/packages/dev/manifold/package.json +++ b/packages/dev/manifold/package.json @@ -1,6 +1,6 @@ { "name": "@bitbybit-dev/manifold", - "version": "0.20.0", + "version": "0.20.2", "description": "Bit By Bit Developers Manifold based CAD Library to Program Geometry", "main": "index.js", "repository": { diff --git a/packages/dev/occt-worker/lib/api/occt/dimensions.ts b/packages/dev/occt-worker/lib/api/occt/dimensions.ts new file mode 100644 index 00000000..19465528 --- /dev/null +++ b/packages/dev/occt-worker/lib/api/occt/dimensions.ts @@ -0,0 +1,47 @@ +import { Inputs } from "@bitbybit-dev/occt"; +import { OCCTWorkerManager } from "../../occ-worker/occ-worker-manager"; + + +export class OCCTDimensions { + + constructor( + private readonly occWorkerManager: OCCTWorkerManager + ) { + } + + /** + * Creates simple linear length dimension between two points - measuring units. You decide what kind of units you re using by providing a suffix. + * @param inputs two points, direction, label size, label normal direction, offset, and unit suffix, decimal rounding place + * @returns compound wires representing dimensions + * @group simple + * @shortname linear dimension + * @drawable true + */ + simpleLinearLengthDimension(inputs: Inputs.OCCT.SimpleLinearLengthDimensionDto): Promise { + return this.occWorkerManager.genericCallToWorkerPromise("dimensions.simpleLinearLengthDimension", inputs); + } + + /** + * Creates simple angular dimension. By default we output degrees, but you can opt to use radians. + * @param inputs a center, two directions, radius and various label parameters + * @returns compound wires representing dimension + * @group simple + * @shortname angular dimension + * @drawable true + */ + simpleAngularDimension(inputs: Inputs.OCCT.SimpleAngularDimensionDto): Promise { + return this.occWorkerManager.genericCallToWorkerPromise("dimensions.simpleAngularDimension", inputs); + } + + /** + * Creates pin label. It can be used to explain things about the models or mark important things in the 3D scene. + * @param inputs a start and end point, direction and parameters for the label + * @returns compound wires representing dimension + * @group simple + * @shortname pin with label + * @drawable true + */ + pinWithLabel(inputs: Inputs.OCCT.PinWithLabelDto): Promise { + return this.occWorkerManager.genericCallToWorkerPromise("dimensions.pinWithLabel", inputs); + } +} diff --git a/packages/dev/occt-worker/lib/api/occt/occt.ts b/packages/dev/occt-worker/lib/api/occt/occt.ts index db98c5a1..55685aef 100644 --- a/packages/dev/occt-worker/lib/api/occt/occt.ts +++ b/packages/dev/occt-worker/lib/api/occt/occt.ts @@ -9,6 +9,7 @@ import { OCCTGeom } from "./geom/geom"; import { OCCTFillets } from "./fillets"; import { Inputs } from "@bitbybit-dev/occt"; import { OCCTShapeFix } from "./shape-fix"; +import { OCCTDimensions } from "./dimensions"; /** * Contains various methods for OpenCascade implementation @@ -20,6 +21,7 @@ export class OCCT { public readonly transforms: OCCTTransforms; public readonly operations: OCCTOperations; public readonly booleans: OCCTBooleans; + public readonly dimensions: OCCTDimensions; public readonly shapeFix: OCCTShapeFix; public io: OCCTIO; @@ -33,6 +35,7 @@ export class OCCT { this.booleans = new OCCTBooleans(occWorkerManager); this.fillets = new OCCTFillets(occWorkerManager); this.shapeFix = new OCCTShapeFix(occWorkerManager); + this.dimensions = new OCCTDimensions(occWorkerManager); this.io = new OCCTIO(occWorkerManager); } diff --git a/packages/dev/occt-worker/lib/api/occt/shapes/wire.ts b/packages/dev/occt-worker/lib/api/occt/shapes/wire.ts index e73020af..6d73aab0 100644 --- a/packages/dev/occt-worker/lib/api/occt/shapes/wire.ts +++ b/packages/dev/occt-worker/lib/api/occt/shapes/wire.ts @@ -1,6 +1,6 @@ -import { Inputs } from "@bitbybit-dev/occt"; +import { Inputs, Models } from "@bitbybit-dev/occt"; +import { ShapeParser } from "../../../shape-parser"; import { OCCTWorkerManager } from "../../../occ-worker/occ-worker-manager"; - export class OCCTWire { constructor( @@ -40,10 +40,22 @@ export class OCCTWire { * @shortname line * @drawable true */ - createLineWire(inputs: Inputs.OCCT.LineDto): Promise { + createLineWire(inputs: Inputs.OCCT.LineDto): Promise { return this.occWorkerManager.genericCallToWorkerPromise("shapes.wire.createLineWire", inputs); } + /** + * Creates OpenCascade line wire with extensions + * @param inputs line start and end point and extension lengths for both start and end + * @returns OpenCascade line wire shape + * @group via points + * @shortname line with extensions + * @drawable true + */ + createLineWireWithExtensions(inputs: Inputs.OCCT.LineWithExtensionsDto): Promise { + return this.occWorkerManager.genericCallToWorkerPromise("shapes.wire.createLineWireWithExtensions", inputs); + } + /** * Creates OpenCascade lines * @param inputs lines with start and end points @@ -409,7 +421,7 @@ export class OCCTWire { /** * Computes the start point on the wire at param 0 * @param inputs Wire shape - * @returns The length of the wire + * @returns The start point on wire * @group extract * @shortname start point * @drawable true @@ -418,6 +430,18 @@ export class OCCTWire { return this.occWorkerManager.genericCallToWorkerPromise("shapes.wire.startPointOnWire", inputs); } + /** + * Computes the middle point on the wire at param 0.5 + * @param inputs Wire shape + * @returns The middle point on wire + * @group extract + * @shortname mid point + * @drawable true + */ + midPointOnWire(inputs: Inputs.OCCT.ShapeDto): Promise { + return this.occWorkerManager.genericCallToWorkerPromise("shapes.wire.midPointOnWire", inputs); + } + /** * Computes the end point on the wire at param 1 * @param inputs Wire shape @@ -562,6 +586,27 @@ export class OCCTWire { return this.occWorkerManager.genericCallToWorkerPromise("shapes.wire.textWires", inputs); } + /** + * Creates OpenCascade compound out of text wires and returns additional information based on simplex font created by Dr. A. V. Hershey + * @param inputs Text parameters + * @returns OpenCascade text compound derivative data + * @group primitives + * @shortname text wires deriv + * @drawable true + */ + async textWiresWithData(inputs: Inputs.OCCT.TextWiresDto): Promise> { + const res: Models.OCCT.ObjectDefinition, Inputs.OCCT.TopoDSShapePointer> = await this.occWorkerManager.genericCallToWorkerPromise("shapes.wire.textWiresWithData", inputs); + const mapped = ShapeParser.parse(res.data, res.shapes); + const r: Models.OCCT.TextWiresDataDto = { + ...mapped, + type: res.data.type, + name: res.data.name, + shapes: res.shapes, + compound: res.compound, + }; + return r; + } + /** * Gets the wire by providing an index from the shape * @param inputs Shape diff --git a/packages/dev/occt-worker/lib/api/occt/transforms.ts b/packages/dev/occt-worker/lib/api/occt/transforms.ts index d69176f5..ceb6cf6a 100644 --- a/packages/dev/occt-worker/lib/api/occt/transforms.ts +++ b/packages/dev/occt-worker/lib/api/occt/transforms.ts @@ -57,6 +57,18 @@ export class OCCTTransforms { return this.occWorkerManager.genericCallToWorkerPromise("transforms.align", inputs); } + /** + * Align the shape with normal and axis + * @param inputs Align description + * @returns OpenCascade shape + * @group on single shape + * @shortname align normal and axis + * @drawable true + */ + alignNormAndAxis(inputs: Inputs.OCCT.AlignNormAndAxisDto): Promise { + return this.occWorkerManager.genericCallToWorkerPromise("transforms.alignNormAndAxis", inputs); + } + /** * Align and translates the shape * @param inputs Align description diff --git a/packages/dev/occt-worker/lib/index.ts b/packages/dev/occt-worker/lib/index.ts index b1508625..425ac28b 100644 --- a/packages/dev/occt-worker/lib/index.ts +++ b/packages/dev/occt-worker/lib/index.ts @@ -1,2 +1,3 @@ export * from "./api"; export * from "./occ-worker"; +export * from "./shape-parser"; diff --git a/packages/dev/occt-worker/lib/occ-worker/cache-helper.ts b/packages/dev/occt-worker/lib/occ-worker/cache-helper.ts index b7039908..0b0bca21 100644 --- a/packages/dev/occt-worker/lib/occ-worker/cache-helper.ts +++ b/packages/dev/occt-worker/lib/occ-worker/cache-helper.ts @@ -1,5 +1,5 @@ import { OpenCascadeInstance } from "@bitbybit-dev/occt/bitbybit-dev-occt/bitbybit-dev-occt"; -import { ObjectDefinition } from "@bitbybit-dev/occt"; +import { Models } from "@bitbybit-dev/occt"; export class CacheHelper { @@ -114,7 +114,7 @@ export class CacheHelper { toReturn.hash = curHash; this.addToCache(curHash, toReturn); } else if (toReturn && toReturn.compound && toReturn.data && toReturn.shapes && toReturn.shapes.length > 0) { - const objDef: ObjectDefinition = toReturn; + const objDef: Models.OCCT.ObjectDefinition = toReturn; const compoundHash = this.computeHash({ ...args, index: "compound" }); objDef.compound.hash = compoundHash; this.addToCache(compoundHash, objDef.compound); diff --git a/packages/dev/occt-worker/lib/occ-worker/occ-worker.ts b/packages/dev/occt-worker/lib/occ-worker/occ-worker.ts index 1b3a3b4e..2872a11a 100644 --- a/packages/dev/occt-worker/lib/occ-worker/occ-worker.ts +++ b/packages/dev/occt-worker/lib/occ-worker/occ-worker.ts @@ -1,5 +1,5 @@ import { OpenCascadeInstance } from "@bitbybit-dev/occt/bitbybit-dev-occt/bitbybit-dev-occt"; -import { ShapesHelperService, VectorHelperService, OccHelper, OCCTService, ObjectDefinition } from "@bitbybit-dev/occt"; +import { ShapesHelperService, VectorHelperService, OccHelper, OCCTService, Models } from "@bitbybit-dev/occt"; import { CacheHelper } from "./cache-helper"; let openCascade: OCCTService; @@ -85,7 +85,7 @@ export const onMessageInput = (d: DataInput, postMessage) => { if (!cacheHelper.isOCCTObject(res)) { if (res.compound && res.data && res.shapes && res.shapes.length > 0) { - const r: ObjectDefinition = res; + const r: Models.OCCT.ObjectDefinition = res; r.shapes = r.shapes.map(s => ({ id: s.id, shape: { hash: s.shape.hash, type: "occ-shape" } })); r.compound = { hash: r.compound.hash, type: "occ-shape" }; result = r; diff --git a/packages/dev/occt-worker/lib/shape-parser.ts b/packages/dev/occt-worker/lib/shape-parser.ts new file mode 100644 index 00000000..44033e1b --- /dev/null +++ b/packages/dev/occt-worker/lib/shape-parser.ts @@ -0,0 +1,43 @@ +import { Inputs, Models } from "@bitbybit-dev/occt"; + +export class ShapeParser { + static parse(obj, partShapes: Models.OCCT.ShapeWithId[]) { + const stack = [obj]; + const visited = new Set(); + + while (stack.length > 0) { + const current = stack.pop(); + + if (typeof current !== "object" || current === null || visited.has(current)) { + continue; // Skip non-object values + } + visited.add(current); + if (Array.isArray(current)) { + for (let i = 0; i < current.length; i++) { + stack.push(current[i]); // Push array elements onto the stack + } + } else { + const keys = Object.keys(current); + + if (keys.includes("shapes")) { + const shapes = current.shapes; + + if (typeof shapes === "object" && shapes !== null) { + for (const key in shapes) { + const sh = current.shapes[key]; + if (sh) { + current.shapes[key] = partShapes.find(s => s.id === current.shapes[key])?.shape; + } + } + } + } + + for (const key in current) { + stack.push(current[key]); // Push object properties onto the stack + } + } + } + + return obj; + } +} \ No newline at end of file diff --git a/packages/dev/occt-worker/package-lock.json b/packages/dev/occt-worker/package-lock.json index 89dc54c4..82017d87 100644 --- a/packages/dev/occt-worker/package-lock.json +++ b/packages/dev/occt-worker/package-lock.json @@ -1,15 +1,15 @@ { "name": "@bitbybit-dev/occt-worker", - "version": "0.20.0", + "version": "0.20.2", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "@bitbybit-dev/occt-worker", - "version": "0.20.0", + "version": "0.20.2", "license": "MIT", "dependencies": { - "@bitbybit-dev/occt": "0.20.0", + "@bitbybit-dev/occt": "0.20.2", "rxjs": "7.5.5" }, "devDependencies": { @@ -1701,10 +1701,18 @@ "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", "dev": true }, + "node_modules/@bitbybit-dev/base": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@bitbybit-dev/base/-/base-0.20.2.tgz", + "integrity": "sha512-+8jxnr7n7SNnuvh3uBgFQSTFYlOA+UrXUhE5XpeukPtTt3ffRShfTC3eRP9q+m/ummljKpKVLGGwSlCsKbriBQ==" + }, "node_modules/@bitbybit-dev/occt": { - "version": "0.20.0", - "resolved": "https://registry.npmjs.org/@bitbybit-dev/occt/-/occt-0.20.0.tgz", - "integrity": "sha512-riqAiZ6fawRDW2AGIV/qBnzM1y1DCckQG+F7ez9pTY/2gBXq2jA+5WDor4FL+8vwhgPZcdZ37R7fBSrcHHR1oQ==" + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@bitbybit-dev/occt/-/occt-0.20.2.tgz", + "integrity": "sha512-jPZyi50Z2BjCSJ+OwlroEG3Neqd8uPDtqp8skhREDSPxG6SAjIHCxxn7SZxl8w7rhhUDR/OCGm/uDdLeLR7Ncg==", + "dependencies": { + "@bitbybit-dev/base": "0.20.2" + } }, "node_modules/@cspotcode/source-map-support": { "version": "0.8.1", @@ -8160,10 +8168,18 @@ "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", "dev": true }, + "@bitbybit-dev/base": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@bitbybit-dev/base/-/base-0.20.2.tgz", + "integrity": "sha512-+8jxnr7n7SNnuvh3uBgFQSTFYlOA+UrXUhE5XpeukPtTt3ffRShfTC3eRP9q+m/ummljKpKVLGGwSlCsKbriBQ==" + }, "@bitbybit-dev/occt": { - "version": "0.20.0", - "resolved": "https://registry.npmjs.org/@bitbybit-dev/occt/-/occt-0.20.0.tgz", - "integrity": "sha512-riqAiZ6fawRDW2AGIV/qBnzM1y1DCckQG+F7ez9pTY/2gBXq2jA+5WDor4FL+8vwhgPZcdZ37R7fBSrcHHR1oQ==" + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@bitbybit-dev/occt/-/occt-0.20.2.tgz", + "integrity": "sha512-jPZyi50Z2BjCSJ+OwlroEG3Neqd8uPDtqp8skhREDSPxG6SAjIHCxxn7SZxl8w7rhhUDR/OCGm/uDdLeLR7Ncg==", + "requires": { + "@bitbybit-dev/base": "0.20.2" + } }, "@cspotcode/source-map-support": { "version": "0.8.1", diff --git a/packages/dev/occt-worker/package.json b/packages/dev/occt-worker/package.json index c8e03997..c6dbc305 100644 --- a/packages/dev/occt-worker/package.json +++ b/packages/dev/occt-worker/package.json @@ -1,6 +1,6 @@ { "name": "@bitbybit-dev/occt-worker", - "version": "0.20.0", + "version": "0.20.2", "description": "Bit By Bit Developers CAD algorithms using OpenCascade Technology kernel adapted for WebWorker", "main": "index.js", "repository": { @@ -56,7 +56,7 @@ "types": "./index.d.ts", "type": "module", "dependencies": { - "@bitbybit-dev/occt": "0.20.0", + "@bitbybit-dev/occt": "0.20.2", "rxjs": "7.5.5" }, "devDependencies": { diff --git a/packages/dev/occt/bitbybit-dev-occt/cdn.js b/packages/dev/occt/bitbybit-dev-occt/cdn.js index 77ebd26e..bd376b38 100644 --- a/packages/dev/occt/bitbybit-dev-occt/cdn.js +++ b/packages/dev/occt/bitbybit-dev-occt/cdn.js @@ -2,7 +2,7 @@ import ocFullJS from "./bitbybit-dev-occt.js"; const initOpenCascade = ({ mainJS = ocFullJS, - mainWasm = "https://cdn.jsdelivr.net/gh/bitbybit-dev/bitbybit-assets@0.20.0/wasm/bitbybit-dev-occt.90cf0714.wasm", + mainWasm = "https://cdn.jsdelivr.net/gh/bitbybit-dev/bitbybit-assets@0.20.2/wasm/bitbybit-dev-occt.90cf0714.wasm", worker = undefined, libs = [], module = {}, diff --git a/packages/dev/occt/lib/api/index.ts b/packages/dev/occt/lib/api/index.ts index 090aaf95..94645596 100644 --- a/packages/dev/occt/lib/api/index.ts +++ b/packages/dev/occt/lib/api/index.ts @@ -1,4 +1,4 @@ export * from "./shapes-helper.service"; export * from "./vector-helper.service"; export * as Inputs from "./inputs"; -export * from "./outputs"; +export * as Models from "./models"; diff --git a/packages/dev/occt/lib/api/inputs/occ-inputs.ts b/packages/dev/occt/lib/api/inputs/occ-inputs.ts index 2d40aa06..0bcdd075 100644 --- a/packages/dev/occt/lib/api/inputs/occ-inputs.ts +++ b/packages/dev/occt/lib/api/inputs/occ-inputs.ts @@ -1878,6 +1878,41 @@ export namespace OCCT { */ end: Base.Point3 = [0, 1, 0]; } + + export class LineWithExtensionsDto { + constructor(start?: Base.Point3, end?: Base.Point3, extensionStart?: number, extensionEnd?: number) { + if (start !== undefined) { this.start = start; } + if (end !== undefined) { this.end = end; } + if (extensionStart !== undefined) { this.extensionStart = extensionStart; } + if (extensionEnd !== undefined) { this.extensionEnd = extensionEnd; } + } + /** + * Start of the line + * @default [0, 0, 0] + */ + start: Base.Point3 = [0, 0, 0]; + /** + * End of the line + * @default [0, 1, 0] + */ + end: Base.Point3 = [0, 1, 0]; + /** + * Extension of the line on the start + * @default 0.1 + * @minimum -Infinity + * @maximum Infinity + * @step 0.1 + */ + extensionStart = 0.1; + /** + * Extension of the line on the end + * @default 0.1 + * @minimum -Infinity + * @maximum Infinity + * @step 0.1 + */ + extensionEnd = 0.1; + } export class LinesDto { constructor(lines?: LineDto[], returnCompound?: boolean) { if (lines !== undefined) { this.lines = lines; } @@ -4278,7 +4313,52 @@ export namespace OCCT { */ translations: Base.Vector3[] = [[0, 0, 0]]; } - + export class AlignNormAndAxisDto { + constructor(shape?: T, fromOrigin?: Base.Point3, fromNorm?: Base.Vector3, fromAx?: Base.Vector3, toOrigin?: Base.Point3, toNorm?: Base.Vector3, toAx?: Base.Vector3) { + if (shape !== undefined) { this.shape = shape; } + if (fromOrigin !== undefined) { this.fromOrigin = fromOrigin; } + if (fromNorm !== undefined) { this.fromNorm = fromNorm; } + if (fromAx !== undefined) { this.fromAx = fromAx; } + if (toOrigin !== undefined) { this.toOrigin = toOrigin; } + if (toNorm !== undefined) { this.toNorm = toNorm; } + if (toAx !== undefined) { this.toAx = toAx; } + } + /** + * Shape for translation + * @default undefined + */ + shape: T; + /** + * from origin + * @default [0, 0, 0] + */ + fromOrigin: Base.Point3 = [0, 0, 0]; + /** + * From direction 1 + * @default [0, 0, 1] + */ + fromNorm: Base.Vector3 = [1, 0, 0]; + /** + * From direction 2 + * @default [0, 0, 1] + */ + fromAx: Base.Vector3 = [0, 0, 1]; + /** + * To origin + * @default [0, 1, 0] + */ + toOrigin: Base.Point3 = [0, 1, 0]; + /** + * To direction 1 + * @default [0, 1, 0] + */ + toNorm: Base.Vector3 = [0, 1, 0]; + /** + * To direction 2 + * @default [0, 0, 1] + */ + toAx: Base.Vector3 = [0, 1, 0]; + } export class AlignDto { constructor(shape?: T, fromOrigin?: Base.Point3, fromDirection?: Base.Vector3, toOrigin?: Base.Point3, toDirection?: Base.Vector3) { if (shape !== undefined) { this.shape = shape; } @@ -5669,7 +5749,7 @@ export namespace OCCT { radiusMajor = 2; } export class TextWiresDto { - constructor(text?: string, xOffset?: number, yOffset?: number, height?: number, lineSpacing?: number, letterSpacing?: number, align?: Base.horizontalAlignEnum, extrudeOffset?: number) { + constructor(text?: string, xOffset?: number, yOffset?: number, height?: number, lineSpacing?: number, letterSpacing?: number, align?: Base.horizontalAlignEnum, extrudeOffset?: number, origin?: Base.Point3, rotation?: number, direction?: Base.Vector3, centerOnOrigin?: boolean) { if (text !== undefined) { this.text = text; } if (xOffset !== undefined) { this.xOffset = xOffset; } if (yOffset !== undefined) { this.yOffset = yOffset; } @@ -5678,12 +5758,13 @@ export namespace OCCT { if (letterSpacing !== undefined) { this.letterSpacing = letterSpacing; } if (align !== undefined) { this.align = align; } if (extrudeOffset !== undefined) { this.extrudeOffset = extrudeOffset; } + if (centerOnOrigin !== undefined) { this.centerOnOrigin = centerOnOrigin; } } /** * The text * @default Hello World */ - text?: string; + text? = "Hello World"; /** * The x offset * @default 0 @@ -5737,6 +5818,11 @@ export namespace OCCT { * @step 0.1 */ extrudeOffset? = 0; + /** + * Indicates whether to center text on origin + * @default false + */ + centerOnOrigin = false; } export class GeomCylindricalSurfaceDto { constructor(radius?: number, center?: Base.Point3, direction?: Base.Vector3) { @@ -5872,4 +5958,219 @@ 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) { + if (start !== undefined) { this.start = start; } + if (end !== undefined) { this.end = end; } + if (direction !== undefined) { this.direction = direction; } + if (offsetFromPoints !== undefined) { this.offsetFromPoints = offsetFromPoints; } + if (crossingSize !== undefined) { this.crossingSize = crossingSize; } + if (labelSuffix !== undefined) { this.labelSuffix = labelSuffix; } + if (labelSize !== undefined) { this.labelSize = labelSize; } + if (labelOffset !== undefined) { this.labelOffset = labelOffset; } + } + /** + * The start point for dimension + * @default undefined + */ + start: Base.Point3; + /** + * The end point for dimension + * @default undefined + */ + end?: Base.Point3; + /** + * The dimension direction (must include length) + * @default undefined + */ + direction?: Base.Vector3; + /** + * The dimension label + * @default 0 + * @minimum -Infinity + * @maximum Infinity + * @step 0.1 + */ + offsetFromPoints? = 0; + /** + * The dimension crossing size + * @default 0 + * @minimum 0 + * @maximum Infinity + * @step 0.1 + */ + crossingSize? = 0.2; + /** + * The dimension label decimal places + * @default 2 + * @minimum 0 + * @maximum Infinity + * @step 1 + */ + decimalPlaces? = 2; + /** + * The dimension label suffix + * @default (cm) + */ + labelSuffix? = "(cm)"; + /** + * The dimension label size + * @default 0.1 + * @minimum 0 + * @maximum Infinity + * @step 0.1 + */ + labelSize? = 0.1; + /** + * The dimension label offset + * @default 0.3 + * @minimum -Infinity + * @maximum Infinity + * @step 0.1 + */ + labelOffset? = 0.3; + } + 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) { + if (direction1 !== undefined) { this.direction1 = direction1; } + if (direction2 !== undefined) { this.direction2 = direction2; } + if (center !== undefined) { this.center = center; } + if (radius !== undefined) { this.radius = radius; } + if (offsetFromCenter !== undefined) { this.offsetFromCenter = offsetFromCenter; } + if (crossingSize !== undefined) { this.extraSize = crossingSize; } + if (radians !== undefined) { this.radians = radians; } + if (labelSuffix !== undefined) { this.labelSuffix = labelSuffix; } + if (labelSize !== undefined) { this.labelSize = labelSize; } + if (labelOffset !== undefined) { this.labelOffset = labelOffset; } + } + + /** + * The first direction for dimension + * @default [1, 0, 0] + */ + direction1: Base.Point3 = [1, 0, 0]; + /** + * The second direction for dimension + * @default [0, 0, 1] + */ + direction2: Base.Point3 = [0, 0, 1]; + /** + * The center point for dimension + * @default [0, 0, 0] + */ + center: Base.Point3 = [0, 0, 0]; + /** + * The dimension radius + * @default 4 + * @minimum 0 + * @maximum Infinity + * @step 0.1 + */ + radius = 4; + /** + * Offset from center + * @default 0.5 + * @minimum -Infinity + * @maximum Infinity + * @step 0.1 + */ + offsetFromCenter = 0.5; + /** + * The dimension crossing size + * @default 0 + * @minimum 0 + * @maximum Infinity + * @step 0.1 + */ + extraSize = 0; + /** + * The dimension label decimal places + * @default 2 + * @minimum 0 + * @maximum Infinity + * @step 1 + */ + decimalPlaces = 2; + /** + * The dimension label suffix + * @default (deg) + */ + labelSuffix = "(deg)"; + /** + * The dimension label size + * @default 0.1 + * @minimum 0 + * @maximum Infinity + * @step 0.1 + */ + labelSize = 0.1; + /** + * The dimension label offset + * @default 0.3 + * @minimum -Infinity + * @maximum Infinity + * @step 0.1 + */ + labelOffset = 0.3; + /** + * If true the angle is in radians + * @default false + */ + radians = false; + } + export class PinWithLabelDto { + constructor(startPoint?: Base.Point3, endPoint?: Base.Point3, direction?: Base.Vector3, offsetFromStart?: number, label?: string, labelOffset?: number, labelSize?: number) { + if (startPoint !== undefined) { this.startPoint = startPoint; } + if (endPoint !== undefined) { this.endPoint = endPoint; } + if (direction !== undefined) { this.direction = direction; } + if (offsetFromStart !== undefined) { this.offsetFromStart = offsetFromStart; } + if (label !== undefined) { this.label = label; } + if (labelOffset !== undefined) { this.labelOffset = labelOffset; } + if (labelSize !== undefined) { this.labelSize = labelSize; } + } + /** + * The start point for dimension + * @default [0, 0, 0] + */ + startPoint: Base.Point3 = [0, 0, 0]; + /** + * The end point for dimension + * @default [0, 5, 2] + */ + endPoint?: Base.Point3 = [0, 5, 2]; + /** + * The dimension direction (must include length) + * @default [0, 0, 1] + */ + direction?: Base.Vector3 = [0, 0, 1]; + /** + * Offset from the start point + * @default 0 + * @minimum 0 + * @maximum Infinity + * @step 0.1 + */ + offsetFromStart? = 0; + /** + * The dimension label + * @default Pin + */ + label? = "Pin"; + /** + * The dimension label offset + * @default 0.3 + * @minimum -Infinity + * @maximum Infinity + * @step 0.1 + */ + labelOffset? = 0.3; + /** + * The dimension label size + * @default 0.1 + * @minimum 0 + * @maximum Infinity + * @step 0.1 + */ + labelSize? = 0.1; + } } diff --git a/packages/dev/occt/lib/api/models/bucket.ts b/packages/dev/occt/lib/api/models/bucket.ts new file mode 100644 index 00000000..853964a8 --- /dev/null +++ b/packages/dev/occt/lib/api/models/bucket.ts @@ -0,0 +1,3 @@ +export * from "./occ-models"; +export * from "./text-wires-data"; +export * from "./text-wires-char-shape-part"; \ No newline at end of file diff --git a/packages/dev/occt/lib/api/models/index.ts b/packages/dev/occt/lib/api/models/index.ts new file mode 100644 index 00000000..16ed1341 --- /dev/null +++ b/packages/dev/occt/lib/api/models/index.ts @@ -0,0 +1,2 @@ +export * from "@bitbybit-dev/base/lib/api/models"; +export * as OCCT from "./bucket"; diff --git a/packages/dev/occt/lib/api/outputs/occ-outputs.ts b/packages/dev/occt/lib/api/models/occ-models.ts similarity index 58% rename from packages/dev/occt/lib/api/outputs/occ-outputs.ts rename to packages/dev/occt/lib/api/models/occ-models.ts index 31cfaffc..5f886e4f 100644 --- a/packages/dev/occt/lib/api/outputs/occ-outputs.ts +++ b/packages/dev/occt/lib/api/models/occ-models.ts @@ -1,10 +1,10 @@ -export class ShapeWithId{ +export class ShapeWithId { id: string; shape: U; } -export class ObjectDefinition{ +export class ObjectDefinition { compound?: U; shapes?: ShapeWithId[]; data?: M; -} +} \ No newline at end of file diff --git a/packages/dev/occt/lib/api/models/text-wires-char-shape-part.ts b/packages/dev/occt/lib/api/models/text-wires-char-shape-part.ts new file mode 100644 index 00000000..a1d9ea1d --- /dev/null +++ b/packages/dev/occt/lib/api/models/text-wires-char-shape-part.ts @@ -0,0 +1,6 @@ +export class TextWiresCharShapePart { + id?: string; + shapes?: { + compound?: T, + }; +} diff --git a/packages/dev/occt/lib/api/models/text-wires-data.ts b/packages/dev/occt/lib/api/models/text-wires-data.ts new file mode 100644 index 00000000..b50a8399 --- /dev/null +++ b/packages/dev/occt/lib/api/models/text-wires-data.ts @@ -0,0 +1,12 @@ +import { Base } from "../inputs"; +import { TextWiresCharShapePart } from "./text-wires-char-shape-part"; + +export class TextWiresDataDto { + type = "text"; + name = "text"; + compound?: T; + characters?: TextWiresCharShapePart[]; + width: number; + height: number; + center: Base.Point3; +} diff --git a/packages/dev/occt/lib/api/outputs/index.ts b/packages/dev/occt/lib/api/outputs/index.ts deleted file mode 100644 index 6f4ec85a..00000000 --- a/packages/dev/occt/lib/api/outputs/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from "./occ-outputs"; \ No newline at end of file diff --git a/packages/dev/occt/lib/index.ts b/packages/dev/occt/lib/index.ts index 767bfbd8..051e3f98 100644 --- a/packages/dev/occt/lib/index.ts +++ b/packages/dev/occt/lib/index.ts @@ -2,3 +2,4 @@ export * from "./api"; export * from "./services"; export * from "./occ-helper"; export * from "./occ-service"; +export * from "./shape-parser"; \ No newline at end of file diff --git a/packages/dev/occt/lib/occ-helper.ts b/packages/dev/occt/lib/occ-helper.ts index 194ed79e..fd017d6f 100644 --- a/packages/dev/occt/lib/occ-helper.ts +++ b/packages/dev/occt/lib/occ-helper.ts @@ -20,6 +20,7 @@ import { ShellsService } from "./services/base/shells.service"; import { FilletsService } from "./services/base/fillets.service"; import { SolidsService } from "./services/base/solids.service"; import { TextBitByBit, Point, GeometryHelper, Transforms, Vector, MathBitByBit } from "@bitbybit-dev/base"; +import { DimensionsService } from "./services/base/dimensions.service"; export class OccHelper { @@ -50,6 +51,8 @@ export class OccHelper { public readonly operationsService: OperationsService; public readonly filletsService: FilletsService; + public readonly dimensionsService: DimensionsService; + constructor( public readonly vecHelper: VectorHelperService, @@ -60,7 +63,7 @@ export class OccHelper { this.math = new MathBitByBit(); this.vector = new Vector(this.math, this.geometryHelper); this.transforms = new Transforms(this.vector, this.math); - this.point = new Point(this.geometryHelper, this.transforms); + this.point = new Point(this.geometryHelper, this.transforms, this.vector); this.textService = new TextBitByBit(this.point); this.occRefReturns = new OCCReferencedReturns(occ); @@ -78,8 +81,12 @@ export class OccHelper { this.edgesService = new EdgesService(occ, this.occRefReturns, this.shapeGettersService, this.entitiesService, this.iteratorService, this.converterService, this.enumService, this.geomService, this.transformsService, this.vecHelper); - this.wiresService = new WiresService(occ, this.occRefReturns, this.vecHelper, this.shapesHelperService, this.shapeGettersService, this.transformsService, - this.enumService, this.entitiesService, this.converterService, this.geomService, this.edgesService, this.textService); + this.wiresService = new WiresService(occ, this.occRefReturns, this.vector, this.shapesHelperService, this.shapeGettersService, this.transformsService, + this.enumService, this.entitiesService, this.converterService, this.geomService, this.edgesService, this.textService, this.operationsService); + + this.dimensionsService = new DimensionsService(this.math, this.vector, this.point, this.transformsService, + this.converterService, this.entitiesService, this.edgesService, this.wiresService); + this.verticesService.wiresService = this.wiresService; this.facesService = new FacesService(occ, this.occRefReturns, this.entitiesService, this.enumService, @@ -94,6 +101,8 @@ export class OccHelper { this.booleansService, this.shapeGettersService, this.edgesService, this.transformsService, this.vecHelper, this.wiresService, this.facesService, this.solidsService, this.shellsService); + this.wiresService.operationsService = this.operationsService; + this.filletsService = new FilletsService(occ, this.vecHelper, this.iteratorService, this.converterService, this.entitiesService, this.transformsService, this.shapeGettersService, this.edgesService, this.operationsService, this.facesService); diff --git a/packages/dev/occt/lib/occ-service.ts b/packages/dev/occt/lib/occ-service.ts index e40bdaa1..de0994df 100644 --- a/packages/dev/occt/lib/occ-service.ts +++ b/packages/dev/occt/lib/occ-service.ts @@ -7,6 +7,8 @@ import { OCCTOperations } from "./services/operations"; import { OCCTShapes } from "./services/shapes/shapes"; import { OCCTTransforms } from "./services/transforms"; import { OCCTFillets } from "./services/fillets"; +import { OCCTDimensions } from "./services/dimensions"; + // import { OCCTAssembly } from "./services/assembly"; import { OccHelper } from "./occ-helper"; import { OCCTShapeFix } from "./services/shape-fix"; @@ -18,6 +20,7 @@ export class OCCTService { public readonly operations: OCCTOperations; public readonly booleans: OCCTBooleans; public readonly fillets: OCCTFillets; + public readonly dimensions: OCCTDimensions; // public readonly assembly: OCCTAssembly; public readonly shapeFix: OCCTShapeFix; public readonly io: OCCTIO; @@ -34,6 +37,7 @@ export class OCCTService { this.booleans = new OCCTBooleans(occ, och); this.fillets = new OCCTFillets(occ, och); this.shapeFix = new OCCTShapeFix(occ, och); + this.dimensions = new OCCTDimensions(occ, och); // this.assembly = new OCCTAssembly(occ, och); this.io = new OCCTIO(occ, och); } diff --git a/packages/dev/occt/lib/services/base/dimensions.service.ts b/packages/dev/occt/lib/services/base/dimensions.service.ts new file mode 100644 index 00000000..1d724071 --- /dev/null +++ b/packages/dev/occt/lib/services/base/dimensions.service.ts @@ -0,0 +1,327 @@ +import { + TopoDS_Compound, + TopoDS_Edge, + TopoDS_Shape, +} from "../../../bitbybit-dev-occt/bitbybit-dev-occt"; +import * as Inputs from "../../api/inputs/inputs"; +import { TransformsService } from "./transforms.service"; +import { ConverterService } from "./converter.service"; +import { WiresService } from "./wires.service"; +import { MathBitByBit, Point, Vector } from "@bitbybit-dev/base"; +import { EdgesService } from "./edges.service"; +import { EntitiesService } from "./entities.service"; + +export class DimensionsService { + + constructor( + private readonly math: MathBitByBit, + private readonly vector: Vector, + private readonly point: Point, + private readonly transformsService: TransformsService, + private readonly converterService: ConverterService, + private readonly entitiesService: EntitiesService, + private readonly edgesService: EdgesService, + private readonly wiresService: WiresService + ) { } + + simpleLinearLengthDimension(inputs: Inputs.OCCT.SimpleLinearLengthDimensionDto): TopoDS_Compound { + const shapesToDelete: TopoDS_Shape[] = []; + const lineBetweenPoints = this.wiresService.createLineWireWithExtensions({ + start: inputs.start, + end: inputs.end, + extensionStart: inputs.crossingSize, + extensionEnd: inputs.crossingSize, + }); + shapesToDelete.push(lineBetweenPoints); + + const translatedLine = this.transformsService.translate({ + shape: lineBetweenPoints, + translation: inputs.direction, + }); + + const translatedPts = this.point.translatePoints({ + points: [inputs.start, inputs.end], + translation: inputs.direction, + }); + + const translatedStartPt = translatedPts[0]; + const translatedEndPt = translatedPts[1]; + + const startLineToTranslatedPoint = this.wiresService.createLineWireWithExtensions({ + start: inputs.start, + end: translatedStartPt, + extensionStart: -inputs.offsetFromPoints, + extensionEnd: inputs.crossingSize, + }); + + const endLineToTranslatedPoint = this.wiresService.createLineWireWithExtensions({ + start: inputs.end, + end: translatedEndPt, + extensionStart: -inputs.offsetFromPoints, + extensionEnd: inputs.crossingSize, + }); + + const midPt = this.wiresService.midPointOnWire({ shape: translatedLine }); + const length = this.point.distance({ + startPoint: inputs.start, + endPoint: inputs.end, + }); + + const txtOpt = new Inputs.OCCT.TextWiresDto(); + txtOpt.text = length.toFixed(inputs.decimalPlaces) + " " + inputs.labelSuffix; + txtOpt.xOffset = 0; + txtOpt.yOffset = 0; + txtOpt.height = inputs.labelSize; + txtOpt.centerOnOrigin = true; + + const txt = this.wiresService.textWiresWithData(txtOpt); + + // get the up vector for the dimension plane + const normalThreePoints = this.point.normalFromThreePoints({ + point1: inputs.start, + point2: inputs.end, + point3: midPt, + reverseNormal: true, + }); + + const dirStartEnd = this.vector.sub({ + first: inputs.end, + second: inputs.start, + }) as Inputs.Base.Vector3; + + const rotated = this.transformsService.rotate({ + shape: txt.compound, + angle: -90, + axis: [0, 1, 0], + }); + + shapesToDelete.push(...txt.shapes.map((s) => s.shape)); + + const alignedLabelTxtToDir = this.transformsService.alignNormAndAxis({ + shape: rotated, + fromOrigin: [0, 0, 0], + fromNorm: [0, 1, 0], + fromAx: [0, 0, 1], + toOrigin: [0, 0, 0], + toNorm: normalThreePoints, + toAx: dirStartEnd, + }); + + shapesToDelete.push(rotated); + + const normDir = this.vector.normalized({ vector: inputs.direction }); + const offsetLabelVec = this.vector.mul({ vector: normDir, scalar: inputs.labelOffset }); + + const addToDir = this.vector.add({ + first: midPt, + second: offsetLabelVec, + }) as Inputs.Base.Vector3; + + const labelTransformed = this.transformsService.translate({ + shape: alignedLabelTxtToDir, + translation: addToDir + }); + + shapesToDelete.push(alignedLabelTxtToDir); + + const res = this.converterService.makeCompound({ shapes: [translatedLine, startLineToTranslatedPoint, endLineToTranslatedPoint, labelTransformed] }); + + // delete shapes + shapesToDelete.forEach((shape) => { + shape.delete(); + }); + + return res; + } + + simpleAngularDimension(inputs: Inputs.OCCT.SimpleAngularDimensionDto): TopoDS_Compound { + const shapesToDelete: TopoDS_Shape[] = []; + + const normDir1 = this.vector.normalized({ vector: inputs.direction1 }); + const endVec = this.vector.mul({ vector: normDir1, scalar: inputs.radius }) as Inputs.Base.Point3; + const endPt = this.point.translatePoints({ + points: [endVec], + translation: inputs.center, + })[0]; + + const line1WithExt = this.wiresService.createLineWireWithExtensions({ + start: inputs.center, + end: endPt, + extensionStart: -inputs.offsetFromCenter, + extensionEnd: inputs.extraSize, + }); + + const normDir2 = this.vector.normalized({ vector: inputs.direction2 }); + const endVec2 = this.vector.mul({ vector: normDir2, scalar: inputs.radius }) as Inputs.Base.Point3; + const endPt2 = this.point.translatePoints({ + points: [endVec2], + translation: inputs.center, + })[0]; + const line2WithExt = this.wiresService.createLineWireWithExtensions({ + start: inputs.center, + end: endPt2, + extensionStart: -inputs.offsetFromCenter, + extensionEnd: inputs.extraSize, + }); + + const normalThreePoints = this.point.normalFromThreePoints({ + point1: inputs.center, + point2: endPt, + point3: endPt2, + reverseNormal: true, + }); + + const normalThreePointsRev = this.point.normalFromThreePoints({ + point1: inputs.center, + point2: endPt, + point3: endPt2, + reverseNormal: false, + }); + + const circ = this.entitiesService.createCircle(inputs.radius, inputs.center, normalThreePointsRev, Inputs.OCCT.typeSpecificityEnum.edge) as TopoDS_Edge; + shapesToDelete.push(circ); + const arc = this.edgesService.arcFromCircleAndTwoPoints({ + circle: circ, + start: endPt, + end: endPt2, + sense: false, + }); + shapesToDelete.push(arc); + const wireArc = this.wiresService.createWireFromEdge({ shape: arc }); + + const midPt = this.wiresService.midPointOnWire({ shape: wireArc }); + let angle = this.vector.angleBetween({ + first: inputs.direction1, + second: inputs.direction2, + }) as number; + + if (inputs.radians) { + angle = this.math.degToRad({ number: angle }); + } + + const txtOpt = new Inputs.OCCT.TextWiresDto(); + txtOpt.text = angle.toFixed(inputs.decimalPlaces) + " " + inputs.labelSuffix; + txtOpt.xOffset = 0; + txtOpt.yOffset = 0; + txtOpt.height = inputs.labelSize; + txtOpt.centerOnOrigin = true; + const txt = this.wiresService.textWiresWithData(txtOpt); + + const vectorToMid = this.vector.sub({ + first: midPt, + second: inputs.center, + }) as Inputs.Base.Vector3; + const normVecToMid = this.vector.normalized({ vector: vectorToMid }) as Inputs.Base.Vector3; + + const alignedLabelTxtToDir = this.transformsService.alignNormAndAxis({ + shape: txt.compound, + fromOrigin: [0, 0, 0], + fromNorm: [0, 1, 0], + fromAx: [0, 0, 1], + toOrigin: [0, 0, 0], + toNorm: normalThreePoints, + toAx: normVecToMid, + }); + shapesToDelete.push(...txt.shapes.map((s) => s.shape)); + const offsetLabelVec = this.vector.mul({ vector: normVecToMid, scalar: inputs.labelOffset }); + const addToDir = this.vector.add({ + first: midPt, + second: offsetLabelVec, + }) as Inputs.Base.Vector3; + const labelTransformed = this.transformsService.translate({ + shape: alignedLabelTxtToDir, + translation: addToDir + }); + shapesToDelete.push(alignedLabelTxtToDir); + + const res = this.converterService.makeCompound({ shapes: [line1WithExt, line2WithExt, wireArc, labelTransformed] }); + + // delete shapes + shapesToDelete.forEach((shape) => { + shape.delete(); + }); + + return res; + } + + pinWithLabel(inputs: Inputs.OCCT.PinWithLabelDto): TopoDS_Compound { + const pinLine = this.wiresService.createLineWireWithExtensions({ + start: inputs.startPoint, + end: inputs.endPoint, + extensionStart: -inputs.offsetFromStart, + extensionEnd: 0, + }); + + const txtOpt = new Inputs.OCCT.TextWiresDto(); + txtOpt.text = inputs.label; + txtOpt.xOffset = 0; + txtOpt.yOffset = 0; + txtOpt.height = inputs.labelSize; + txtOpt.centerOnOrigin = true; + + const text = this.wiresService.textWiresWithData(txtOpt); + + const textWidth = text.data.width; + const dirNorm = this.vector.normalized({ vector: inputs.direction }); + const offsetLabelVec = this.vector.mul({ vector: dirNorm, scalar: textWidth / 2 + inputs.labelOffset }); + // const translateTxtVec = this.vector.add({ first: inputs.direction, second: offsetLabelVec }) as Inputs.Base.Vector3; + + const endPtLabelLine = this.point.translatePoints({ + points: [inputs.endPoint], + translation: inputs.direction, + })[0]; + + const lineBeneathLabel = this.wiresService.createLineWireWithExtensions({ + start: inputs.endPoint, + end: endPtLabelLine, + extensionStart: 0, + extensionEnd: 0, + }); + + const normalThreePoints = this.point.normalFromThreePoints({ + point1: inputs.startPoint, + point2: inputs.endPoint, + point3: endPtLabelLine, + reverseNormal: false, + }); + const rotated = this.transformsService.rotate({ + shape: text.compound, + angle: -90, + axis: [0, 1, 0], + }); + + const shapesToDelete = text.shapes.map((s) => s.shape); + + const alignedLabelTxtToDir = this.transformsService.alignNormAndAxis({ + shape: rotated, + fromOrigin: [0, 0, 0], + fromNorm: [0, 1, 0], + fromAx: [0, 0, 1], + toOrigin: [0, 0, 0], + toNorm: normalThreePoints, + toAx: dirNorm as Inputs.Base.Vector3, + }); + + shapesToDelete.push(rotated); + + const addToDir = this.vector.add({ + first: endPtLabelLine, + second: offsetLabelVec, + }) as Inputs.Base.Vector3; + + const labelTransformed = this.transformsService.translate({ + shape: alignedLabelTxtToDir, + translation: addToDir, + }); + shapesToDelete.push(alignedLabelTxtToDir); + + const res = this.converterService.makeCompound({ shapes: [pinLine, labelTransformed, lineBeneathLabel] }); + + // delete shapes + shapesToDelete.forEach((shape) => { + shape.delete(); + }); + return res; + } + +} diff --git a/packages/dev/occt/lib/services/base/entities.service.ts b/packages/dev/occt/lib/services/base/entities.service.ts index 25adf241..d85118bd 100644 --- a/packages/dev/occt/lib/services/base/entities.service.ts +++ b/packages/dev/occt/lib/services/base/entities.service.ts @@ -227,7 +227,15 @@ export class EntitiesService { return sphere; } - gpAx3(point: Base.Point3, direction: Base.Vector3): gp_Ax3 { + gpAx3_3(point: Base.Point3, normal: Base.Vector3, direction: Base.Vector3): gp_Ax3 { + return new this.occ.gp_Ax3_3( + this.gpPnt(point), + this.gpDir(normal), + this.gpDir(direction) + ); + } + + gpAx3_4(point: Base.Point3, direction: Base.Vector3): gp_Ax3 { return new this.occ.gp_Ax3_4( this.gpPnt(point), this.gpDir(direction) diff --git a/packages/dev/occt/lib/services/base/transforms.service.ts b/packages/dev/occt/lib/services/base/transforms.service.ts index 548dcca5..b9f64f99 100644 --- a/packages/dev/occt/lib/services/base/transforms.service.ts +++ b/packages/dev/occt/lib/services/base/transforms.service.ts @@ -135,8 +135,28 @@ export class TransformsService { align(inputs: Inputs.OCCT.AlignDto) { const transformation = new this.occ.gp_Trsf_1(); - const ax1 = this.entitiesService.gpAx3(inputs.fromOrigin, inputs.fromDirection); - const ax2 = this.entitiesService.gpAx3(inputs.toOrigin, inputs.toDirection); + const ax1 = this.entitiesService.gpAx3_4(inputs.fromOrigin, inputs.fromDirection); + const ax2 = this.entitiesService.gpAx3_4(inputs.toOrigin, inputs.toDirection); + + transformation.SetDisplacement( + ax1, + ax2, + ); + const translation = new this.occ.TopLoc_Location_2(transformation); + const moved = inputs.shape.Moved(translation, false); + + transformation.delete(); + ax1.delete(); + ax2.delete(); + const shp = this.converterService.getActualTypeOfShape(moved); + moved.delete(); + return shp; + } + + alignNormAndAxis(inputs: Inputs.OCCT.AlignNormAndAxisDto) { + const transformation = new this.occ.gp_Trsf_1(); + const ax1 = this.entitiesService.gpAx3_3(inputs.fromOrigin, inputs.fromNorm, inputs.fromAx); + const ax2 = this.entitiesService.gpAx3_3(inputs.toOrigin, inputs.toNorm, inputs.toAx); transformation.SetDisplacement( ax1, diff --git a/packages/dev/occt/lib/services/base/wires.service.ts b/packages/dev/occt/lib/services/base/wires.service.ts index b19a62b3..b1901591 100644 --- a/packages/dev/occt/lib/services/base/wires.service.ts +++ b/packages/dev/occt/lib/services/base/wires.service.ts @@ -1,12 +1,11 @@ import { GeomAbs_Shape, Geom_Surface, OpenCascadeInstance, - TopoDS_Compound, TopoDS_Edge, TopoDS_Wire, gp_Pnt, gp_Pnt_3 + TopoDS_Compound, TopoDS_Edge, TopoDS_Shape, TopoDS_Wire, gp_Pnt, gp_Pnt_3 } from "../../../bitbybit-dev-occt/bitbybit-dev-occt"; import * as Inputs from "../../api/inputs/inputs"; import { Base } from "../../api/inputs/inputs"; import { ShapesHelperService } from "../../api/shapes-helper.service"; import { OCCReferencedReturns } from "../../occ-referenced-returns"; -import { VectorHelperService } from "../../api/vector-helper.service"; import { EdgesService } from "./edges.service"; import { ShapeGettersService } from "./shape-getters"; import { EntitiesService } from "./entities.service"; @@ -14,14 +13,17 @@ import { GeomService } from "./geom.service"; import { TransformsService } from "./transforms.service"; import { ConverterService } from "./converter.service"; import { EnumService } from "./enum.service"; -import { TextBitByBit } from "@bitbybit-dev/base"; +import { TextBitByBit, Vector } from "@bitbybit-dev/base"; +import { TextWiresDataDto, ObjectDefinition } from "../../api/models/bucket"; +import { OperationsService } from "./operations.service"; +import { ShapeParser } from "../../shape-parser"; export class WiresService { constructor( private readonly occ: OpenCascadeInstance, private readonly occRefReturns: OCCReferencedReturns, - private readonly vecHelper: VectorHelperService, + private readonly vector: Vector, private readonly shapesHelperService: ShapesHelperService, private readonly shapeGettersService: ShapeGettersService, private readonly transformsService: TransformsService, @@ -31,6 +33,7 @@ export class WiresService { private readonly geomService: GeomService, private readonly edgesService: EdgesService, private readonly textService: TextBitByBit, + public operationsService: OperationsService, ) { } getWireLength(inputs: Inputs.OCCT.ShapeDto): number { @@ -314,6 +317,15 @@ export class WiresService { return wire; } + createLineWireWithExtensions(inputs: Inputs.OCCT.LineWithExtensionsDto): TopoDS_Wire { + const direction = this.vector.normalized({ vector: this.vector.sub({ first: inputs.end, second: inputs.start }) }); + const scaledVecStart = this.vector.mul({ vector: direction, scalar: -inputs.extensionStart }); + const scaledVecEnd = this.vector.mul({ vector: direction, scalar: inputs.extensionEnd }); + const start = this.vector.add({ first: inputs.start, second: scaledVecStart }) as Base.Point3; + const end = this.vector.add({ first: inputs.end, second: scaledVecEnd }) as Base.Point3; + return this.createLineWire({ start, end }); + } + private makeWireBetweenTwoPoints(pt1: gp_Pnt, pt2: gp_Pnt) { const seg = new this.occ.GC_MakeSegment_1(pt1, pt2); const segVal = seg.Value(); @@ -498,7 +510,7 @@ export class WiresService { const endPointOnWire = this.endPointOnWire({ shape: inputs.shape }); // This is needed to make follow up algorithm to work properly on open wires - const wireIsClosed = this.vecHelper.vectorsTheSame(endPointOnWire, startPointOnWire, tolerance); + const wireIsClosed = this.vector.vectorsTheSame({ vec1: endPointOnWire, vec2: startPointOnWire, tolerance }); return wireIsClosed; } @@ -651,144 +663,6 @@ export class WiresService { } return newWires; - - //////// FIRST VAR - // const wire = inputs.shape; - // const splitPoints = inputs.points; - - // // 1. Get the list of edges from the wire - // const edges = this.shapeGettersService.getEdges({ shape: wire }); - // if (edges.length === 0) return []; - - // // 2. Collect split locations as {edgeIndex, parameter} - // const splitLocations: { edgeIndex: number; parameter: number }[] = []; - - // // Add the wire's start point - // const firstEdge = edges[0]; - // let first = { current: 0 }; - // let last = { current: 0 }; - // this.occRefReturns.BRep_Tool_Curve_2(firstEdge, first, last); - // splitLocations.push({ edgeIndex: 0, parameter: first.current }); - - // // Project each split point onto the wire - // splitPoints.forEach((pt) => { - // let minDist = Infinity; - // let bestEdgeIndex = -1; - // let bestParam = 0; - - // edges.forEach((edge, index) => { - // const first = { current: 0 }; - // const last = { current: 0 }; - // const curve = this.occRefReturns.BRep_Tool_Curve_2(edge, first, last); - // const firstVal = first.current; - // const lastVal = last.current; - - // const gpPnt = this.entitiesService.gpPnt(pt); - // const projector = new this.occ.GeomAPI_ProjectPointOnCurve_2(gpPnt, curve); - // if (projector.NbPoints() > 0) { - // const param = projector.LowerDistanceParameter(); - // // Ensure the parameter is within the edge's range - // if (param >= firstVal && param <= lastVal) { - // const dist = projector.LowerDistance(); - // if (dist < minDist) { - // minDist = dist; - // bestEdgeIndex = index; - // bestParam = param; - // } - // } - // } - // }); - - // if (bestEdgeIndex >= 0) { - // splitLocations.push({ edgeIndex: bestEdgeIndex, parameter: bestParam }); - // } - // }); - - // // Add the wire's end point - // const lastEdge = edges[edges.length - 1]; - // first = { current: 0 }; - // last = { current: 0 }; - // const curveLast = this.occRefReturns.BRep_Tool_Curve_2(lastEdge, first, last); - // const lastLastVal = last.current; - // splitLocations.push({ edgeIndex: edges.length - 1, parameter: lastLastVal }); - - // // 3. Sort split locations by edgeIndex, then parameter - // splitLocations.sort((a, b) => { - // if (a.edgeIndex !== b.edgeIndex) return a.edgeIndex - b.edgeIndex; - // return a.parameter - b.parameter; - // }); - - // // 4. Create new wires between consecutive split locations - // const newWires: TopoDS_Wire[] = []; - // for (let i = 0; i < splitLocations.length - 1; i++) { - // const startLoc = splitLocations[i]; - // const endLoc = splitLocations[i + 1]; - // const wireBuilder = new this.occ.BRepBuilderAPI_MakeWire_1(); - - // if (startLoc.edgeIndex === endLoc.edgeIndex) { - // // Same edge: create a single trimmed edge - // const edge = edges[startLoc.edgeIndex]; - // const first = { current: 0 }; - // const last = { current: 0 }; - // const curve = this.occRefReturns.BRep_Tool_Curve_2(edge, first, last); - // const trimmedCurve = new this.occ.Geom_TrimmedCurve( - // curve, - // startLoc.parameter, - // endLoc.parameter, - // true, - // true - // ); - // const handleTrimmedCurve = new this.occ.Handle_Geom_Curve_2(trimmedCurve); - // const newEdge = new this.occ.BRepBuilderAPI_MakeEdge_24(handleTrimmedCurve).Edge(); - // wireBuilder.Add_1(newEdge); - // } else { - // // Spans multiple edges - // // Trim the start edge - // const startEdge = edges[startLoc.edgeIndex]; - // const startFirst = { current: 0 }; - // const startLast = { current: 0 }; - // const startCurve = this.occRefReturns.BRep_Tool_Curve_2(startEdge, startFirst, startLast); - // const startLastVal = startLast.current; - // const trimmedStartCurve = new this.occ.Geom_TrimmedCurve( - // startCurve, - // startLoc.parameter, - // startLastVal, - // true, - // true - // ); - // const handleTrimmedStartCurve = new this.occ.Handle_Geom_Curve_2(trimmedStartCurve); - - // const newStartEdge = new this.occ.BRepBuilderAPI_MakeEdge_24(handleTrimmedStartCurve).Edge(); - // wireBuilder.Add_1(newStartEdge); - - // // Add full edges in between - // for (let j = startLoc.edgeIndex + 1; j < endLoc.edgeIndex; j++) { - // wireBuilder.Add_1(edges[j]); - // } - - // // Trim the end edge - // const endEdge = edges[endLoc.edgeIndex]; - // const endFirst = { current: 0 }; - // const endLast = { current: 0 }; - // const endCurve = this.occRefReturns.BRep_Tool_Curve_2(endEdge, endFirst, endLast); - // const endFirstVal = endFirst.current; - // const trimmedEndCurve = new this.occ.Geom_TrimmedCurve( - // endCurve, - // endFirstVal, - // endLoc.parameter, - // true, - // true, - // ); - // const handleTrimmedEndCurve = new this.occ.Handle_Geom_Curve_2(trimmedEndCurve); - // const newEndEdge = new this.occ.BRepBuilderAPI_MakeEdge_24(handleTrimmedEndCurve).Edge(); - // wireBuilder.Add_1(newEndEdge); - // } - - // const newWire = wireBuilder.Wire(); - // newWires.push(newWire); - // } - - // return newWires; } createLines(inputs: Inputs.OCCT.LinesDto): TopoDS_Wire[] | TopoDS_Compound { @@ -990,14 +864,21 @@ export class WiresService { startPointOnWire(inputs: Inputs.OCCT.ShapeDto): Base.Point3 { const wire = inputs.shape; const curve = new this.occ.BRepAdaptor_CompCurve_2(wire, false); - const res = this.geomService.startPointOnCurve({ ...inputs, shape: curve }); + const res = this.geomService.startPointOnCurve({ shape: curve }); + return res; + } + + midPointOnWire(inputs: Inputs.OCCT.ShapeDto): Base.Point3 { + const wire = inputs.shape; + const curve = new this.occ.BRepAdaptor_CompCurve_2(wire, false); + const res = this.geomService.pointOnCurveAtParam({ shape: curve, param: 0.5 }); return res; } endPointOnWire(inputs: Inputs.OCCT.ShapeDto): Base.Point3 { const wire = inputs.shape; const curve = new this.occ.BRepAdaptor_CompCurve_2(wire, false); - const res = this.geomService.endPointOnCurve({ ...inputs, shape: curve }); + const res = this.geomService.endPointOnCurve({ shape: curve }); return res; } @@ -1005,7 +886,6 @@ export class WiresService { const lines = this.textService.vectorText(inputs); const wires: TopoDS_Wire[] = []; lines.forEach((line) => { - console.log(line); line.chars.forEach((char) => { char.paths.forEach(polyline => { const wire = this.createPolylineWire({ points: polyline }); @@ -1018,6 +898,45 @@ export class WiresService { return wires; } + textWiresWithData(inputs: Inputs.OCCT.TextWiresDto): ObjectDefinition, TopoDS_Shape> { + const lines = this.textService.vectorText(inputs); + const wires: TopoDS_Wire[] = []; + + const characterCompounds: { id: string, shape: TopoDS_Compound }[] = []; + + lines.forEach((line) => { + line.chars.forEach((char, index) => { + const characterWires = []; + char.paths.forEach(polyline => { + const wire = this.createPolylineWire({ points: polyline }); + if (wire) { + wires.push(wire); + characterWires.push(wire); + } + }); + const characterCompound = this.converterService.makeCompound({ shapes: characterWires }); + characterCompounds.push({ id: `char-${index}`, shape: characterCompound }); + }); + }); + + const compound = this.converterService.makeCompound({ shapes: wires }); + const dataRes = new TextWiresDataDto(); + + const box = this.operationsService.boundingBoxOfShape({ shape: compound }); + const width = box.max[0] - box.min[0]; + const height = box.max[1] - box.min[1]; + dataRes.width = width; + dataRes.height = height; + dataRes.compound = "text-compound"; + + const res = new ObjectDefinition, TopoDS_Compound>(); + res.data = dataRes; + res.compound = compound; + res.shapes = [{ id: "text-compound", shape: compound }, ...characterCompounds]; + + return res; + } + placeWire(wire: TopoDS_Wire, surface: Geom_Surface) { const edges = this.shapeGettersService.getEdges({ shape: wire }); const newEdges: TopoDS_Edge[] = []; diff --git a/packages/dev/occt/lib/services/dimensions.ts b/packages/dev/occt/lib/services/dimensions.ts new file mode 100644 index 00000000..0c22f648 --- /dev/null +++ b/packages/dev/occt/lib/services/dimensions.ts @@ -0,0 +1,26 @@ +import { OpenCascadeInstance, TopoDS_Compound } from "../../bitbybit-dev-occt/bitbybit-dev-occt"; +import { OccHelper } from "../occ-helper"; +import * as Inputs from "../api/inputs/inputs"; + +export class OCCTDimensions { + + constructor( + private readonly occ: OpenCascadeInstance, + private readonly och: OccHelper + ) { + } + + simpleLinearLengthDimension(inputs: Inputs.OCCT.SimpleLinearLengthDimensionDto): TopoDS_Compound { + return this.och.dimensionsService.simpleLinearLengthDimension(inputs); + } + + simpleAngularDimension(inputs: Inputs.OCCT.SimpleAngularDimensionDto): TopoDS_Compound { + return this.och.dimensionsService.simpleAngularDimension(inputs); + } + + pinWithLabel(inputs: Inputs.OCCT.PinWithLabelDto): TopoDS_Compound { + return this.och.dimensionsService.pinWithLabel(inputs); + } + + +} diff --git a/packages/dev/occt/lib/services/fillets.test.ts b/packages/dev/occt/lib/services/fillets.test.ts index e072eb22..72733a9b 100644 --- a/packages/dev/occt/lib/services/fillets.test.ts +++ b/packages/dev/occt/lib/services/fillets.test.ts @@ -2,7 +2,7 @@ import initOpenCascade, { OpenCascadeInstance, TopoDS_Wire } from "../../bitbybi import { OccHelper } from "../occ-helper"; import { VectorHelperService } from "../api/vector-helper.service"; import { ShapesHelperService } from "../api/shapes-helper.service"; -import { Inputs } from "../api"; +import * as Inputs from "../api/inputs/inputs"; import { OCCTFillets } from "./fillets"; import { OCCTEdge, OCCTSolid, OCCTWire } from "./shapes"; diff --git a/packages/dev/occt/lib/services/geom/surfaces.ts b/packages/dev/occt/lib/services/geom/surfaces.ts index 2a16a21e..1f53934d 100644 --- a/packages/dev/occt/lib/services/geom/surfaces.ts +++ b/packages/dev/occt/lib/services/geom/surfaces.ts @@ -11,7 +11,7 @@ export class OCCTSurfaces { } cylindricalSurface(inputs: Inputs.OCCT.GeomCylindricalSurfaceDto) { - const ax = this.och.entitiesService.gpAx3(inputs.center, inputs.direction); + const ax = this.och.entitiesService.gpAx3_4(inputs.center, inputs.direction); const res = new this.occ.Geom_CylindricalSurface_1(ax, inputs.radius); ax.delete(); return res; diff --git a/packages/dev/occt/lib/services/operations.test.ts b/packages/dev/occt/lib/services/operations.test.ts index 1f8371ac..04b124d7 100644 --- a/packages/dev/occt/lib/services/operations.test.ts +++ b/packages/dev/occt/lib/services/operations.test.ts @@ -1,6 +1,5 @@ -import { Inputs } from "../api"; import initOpenCascade, { OpenCascadeInstance, TopoDS_Face, TopoDS_Shape, TopoDS_Wire } from "../../bitbybit-dev-occt/bitbybit-dev-occt"; -import { Base } from "../api/inputs/base-inputs"; +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"; @@ -49,7 +48,7 @@ describe("OCCT operations unit tests", () => { [2, -2, 2], [-3, 3, 3], [4, 4, -4], - ] as Base.Point3[]; + ] as Inputs.Base.Point3[]; const sph = occHelper.entitiesService.bRepPrimAPIMakeSphere([0, 0, 0], [0, 1, 0], 1); const res = operations.closestPointsOnShapeFromPoints({ shape: sph, points }); expect(res.length).toBe(5); @@ -69,7 +68,7 @@ describe("OCCT operations unit tests", () => { [2, -2, 2], [-3, 3, 3], [4, 4, -4], - ] as Base.Point3[]; + ] as Inputs.Base.Point3[]; const sph1 = occHelper.entitiesService.bRepPrimAPIMakeSphere([0, 10, 0], [0, 1, 0], 1); const sph2 = occHelper.entitiesService.bRepPrimAPIMakeSphere([0, 0, 10], [0, 1, 0], 2); diff --git a/packages/dev/occt/lib/services/shapes/edge.test.ts b/packages/dev/occt/lib/services/shapes/edge.test.ts index f163fad0..eeee5a75 100644 --- a/packages/dev/occt/lib/services/shapes/edge.test.ts +++ b/packages/dev/occt/lib/services/shapes/edge.test.ts @@ -4,7 +4,7 @@ import { OccHelper } from "../../occ-helper"; import { OCCTGeom } from "../geom/geom"; import { VectorHelperService } from "../../api/vector-helper.service"; import { ShapesHelperService } from "../../api/shapes-helper.service"; -import { Inputs } from "../../api"; +import * as Inputs from "../../api/inputs/inputs"; import { OCCTFace } from "./face"; import { OCCTBooleans } from "../booleans"; import { OCCTWire } from "./wire"; diff --git a/packages/dev/occt/lib/services/shapes/wire.ts b/packages/dev/occt/lib/services/shapes/wire.ts index 3fdabb5e..f6d5023b 100644 --- a/packages/dev/occt/lib/services/shapes/wire.ts +++ b/packages/dev/occt/lib/services/shapes/wire.ts @@ -32,6 +32,10 @@ export class OCCTWire { return this.och.wiresService.createLineWire(inputs); } + createLineWireWithExtensions(inputs: Inputs.OCCT.LineWithExtensionsDto): TopoDS_Wire { + return this.och.wiresService.createLineWireWithExtensions(inputs); + } + createLines(inputs: Inputs.OCCT.LinesDto): TopoDS_Wire[] | TopoDS_Compound { const wires = inputs.lines.map(p => this.createLineWire(p)).filter(s => s !== undefined); return this.och.converterService.makeCompoundIfNeeded(wires, inputs.returnCompound); @@ -181,6 +185,10 @@ export class OCCTWire { return this.och.wiresService.startPointOnWire(inputs); } + midPointOnWire(inputs: Inputs.OCCT.ShapeDto): Inputs.Base.Point3 { + return this.och.wiresService.midPointOnWire(inputs); + } + endPointOnWire(inputs: Inputs.OCCT.ShapeDto): Inputs.Base.Point3 { return this.och.wiresService.endPointOnWire(inputs); } @@ -196,6 +204,11 @@ export class OCCTWire { textWires(inputs: Inputs.OCCT.TextWiresDto) { return this.och.wiresService.textWires(inputs); } + + textWiresWithData(inputs: Inputs.OCCT.TextWiresDto) { + return this.och.wiresService.textWiresWithData(inputs); + } + createSquareWire(inputs: Inputs.OCCT.SquareDto): TopoDS_Wire { return this.och.wiresService.createSquareWire(inputs); } diff --git a/packages/dev/occt/lib/services/transforms.ts b/packages/dev/occt/lib/services/transforms.ts index 9435052b..533038fa 100644 --- a/packages/dev/occt/lib/services/transforms.ts +++ b/packages/dev/occt/lib/services/transforms.ts @@ -20,7 +20,6 @@ export class OCCTTransforms { return translatedShape; } - rotate(inputs: Inputs.OCCT.RotateDto): TopoDS_Shape { return this.och.transformsService.rotate(inputs); } @@ -39,6 +38,10 @@ export class OCCTTransforms { return this.och.transformsService.align(inputs); } + alignNormAndAxis(inputs: Inputs.OCCT.AlignNormAndAxisDto): TopoDS_Shape { + return this.och.transformsService.alignNormAndAxis(inputs); + } + alignAndTranslate(inputs: Inputs.OCCT.AlignAndTranslateDto): TopoDS_Shape { return this.och.transformsService.alignAndTranslate(inputs); } diff --git a/packages/dev/occt/lib/shape-parser.ts b/packages/dev/occt/lib/shape-parser.ts new file mode 100644 index 00000000..d187952a --- /dev/null +++ b/packages/dev/occt/lib/shape-parser.ts @@ -0,0 +1,148 @@ +import { TopoDS_Shape } from "../bitbybit-dev-occt/bitbybit-dev-occt"; +import { Inputs, OCCTTransforms } from "./index"; +import * as Models from "./api/models"; + +export class ShapeParser { + + static parse(obj, partShapes: Models.OCCT.ShapeWithId[], prefix: string) { + const stack = [obj]; + let index = 0; + while (stack.length > 0) { + const current = stack.pop(); + + if (typeof current !== "object" || current === null) { + continue; // Skip non-object values + } + if (Array.isArray(current)) { + for (let i = 0; i < current.length; i++) { + stack.push(current[i]); // Push array elements onto the stack + } + } else { + const keys = Object.keys(current); + + if (keys.includes("shapes")) { + const shapes = current.shapes; + + if (typeof shapes === "object" && shapes !== null) { + for (const key in shapes) { + const sh = shapes[key]; + if (sh) { + if (typeof shapes[key] !== "string") { + let id; + if (current.id) { + id = `${prefix}-${current.id}-${key}-${index}`; + } else { + id = `${prefix}-${key}-${index}`; + } + partShapes.push({ id, shape: sh }); + shapes[key] = id; + } + index++; + } + } + } + } + for (const key in current) { + stack.push(current[key]); // Push object properties onto the stack + } + } + } + return obj; + } + + static alignAndTranslateShapesWithChildren(part: T, transforms: OCCTTransforms, rotation: number, direction: Inputs.Base.Vector3, center: Inputs.Base.Point3, scale: Inputs.Base.Vector3 = [1, 1, 1]): T { + const partCloned = ShapeParser.deepCopy(part); + partCloned.rotation = rotation; + partCloned.direction = direction; + partCloned.center = center; + partCloned.scale = scale; + + if (partCloned.shapes) { + Object.keys(partCloned.shapes).forEach(key => { + const sh = partCloned.shapes[key]; + if (sh) { + const rotated = transforms.rotate({ shape: sh, angle: rotation, axis: [0, 1, 0] }); + const aligned = transforms.alignAndTranslate({ shape: rotated, direction, center }); + if (scale[0] !== 1 || scale[1] !== 1 || scale[2] !== 1) { + partCloned.shapes[key] = transforms.scale3d({ shape: aligned, scale, center }); + aligned.delete(); + } else { + partCloned.shapes[key] = aligned; + } + rotated.delete(); + } + }); + } + + Object.keys(partCloned).forEach(key => { + const sh = partCloned[key]; + if (sh && Array.isArray(sh)) { + partCloned[key] = sh.map((s) => { + if (s && typeof s === "object" && s !== null) { + if (s.shapes) { + const updatedShape = this.alignAndTranslateShapesWithChildren(s, transforms, rotation, direction, center, scale); + return updatedShape; + } + else { + return s; + } + } else { + return s; + } + }); + } else if (sh && typeof sh === "object" && sh !== null) { + if (sh.shapes) { + partCloned[key] = this.alignAndTranslateShapesWithChildren(sh, transforms, rotation, direction, center, scale); + } + } + }); + return partCloned; + } + + static deleteAllShapes(part: T) { + Object.keys(part.shapes).forEach(key => { + part.shapes[key].delete(); + }); + Object.keys(part).forEach(key => { + const sh = part[key]; + if (sh && Array.isArray(sh)) { + sh.forEach((s) => { + if (s && typeof s === "object" && s !== null) { + if (s.shapes) { + this.deleteAllShapes(s); + } + } + }); + } else if (sh && typeof sh === "object" && sh !== null) { + if (sh.shapes) { + this.deleteAllShapes(sh); + } + } + }); + } + + static deepCopy(part: T) { + const clonedPart = { ...part, shapes: { ...part.shapes } }; + Object.keys(part).forEach(key => { + const sh = part[key]; + if (sh && typeof sh === "object" && sh !== null) { + if (sh.shapes) { + clonedPart[key] = this.deepCopy(sh); + } + } else if (sh && Array.isArray(sh)) { + clonedPart[key] = sh.map((s) => { + if (s && typeof s === "object" && s !== null) { + if (s.shapes) { + return this.deepCopy(s); + } + } + return s; + }); + } + }); + return clonedPart; + } + +} \ No newline at end of file diff --git a/packages/dev/occt/package-lock.json b/packages/dev/occt/package-lock.json index 534243f0..9bf30e46 100644 --- a/packages/dev/occt/package-lock.json +++ b/packages/dev/occt/package-lock.json @@ -1,15 +1,15 @@ { "name": "@bitbybit-dev/occt", - "version": "0.20.0", + "version": "0.20.2", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "@bitbybit-dev/occt", - "version": "0.20.0", + "version": "0.20.2", "license": "MIT", "dependencies": { - "@bitbybit-dev/base": "0.20.0" + "@bitbybit-dev/base": "0.20.2" }, "devDependencies": { "@babel/core": "7.16.0", @@ -1713,9 +1713,9 @@ "dev": true }, "node_modules/@bitbybit-dev/base": { - "version": "0.20.0", - "resolved": "https://registry.npmjs.org/@bitbybit-dev/base/-/base-0.20.0.tgz", - "integrity": "sha512-9J09Z3qY8JHfkWQe43BjDHPcm6MMec2YEL+Ily0U0dd/5+avcV+0N9zq+AYbTHbU9hczDBQH648L5uDNu7UOVg==" + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@bitbybit-dev/base/-/base-0.20.2.tgz", + "integrity": "sha512-+8jxnr7n7SNnuvh3uBgFQSTFYlOA+UrXUhE5XpeukPtTt3ffRShfTC3eRP9q+m/ummljKpKVLGGwSlCsKbriBQ==" }, "node_modules/@cspotcode/source-map-support": { "version": "0.8.1", @@ -9489,9 +9489,9 @@ "dev": true }, "@bitbybit-dev/base": { - "version": "0.20.0", - "resolved": "https://registry.npmjs.org/@bitbybit-dev/base/-/base-0.20.0.tgz", - "integrity": "sha512-9J09Z3qY8JHfkWQe43BjDHPcm6MMec2YEL+Ily0U0dd/5+avcV+0N9zq+AYbTHbU9hczDBQH648L5uDNu7UOVg==" + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@bitbybit-dev/base/-/base-0.20.2.tgz", + "integrity": "sha512-+8jxnr7n7SNnuvh3uBgFQSTFYlOA+UrXUhE5XpeukPtTt3ffRShfTC3eRP9q+m/ummljKpKVLGGwSlCsKbriBQ==" }, "@cspotcode/source-map-support": { "version": "0.8.1", diff --git a/packages/dev/occt/package.json b/packages/dev/occt/package.json index 6eef9d61..2cc1afce 100644 --- a/packages/dev/occt/package.json +++ b/packages/dev/occt/package.json @@ -1,6 +1,6 @@ { "name": "@bitbybit-dev/occt", - "version": "0.20.0", + "version": "0.20.2", "description": "Bit By Bit Developers CAD algorithms using OpenCascade Technology kernel. Run in Node and in Browser.", "main": "index.js", "repository": { @@ -35,7 +35,7 @@ "types": "./index.d.ts", "type": "module", "dependencies": { - "@bitbybit-dev/base": "0.20.0" + "@bitbybit-dev/base": "0.20.2" }, "devDependencies": { "sass": "1.57.1", diff --git a/packages/dev/threejs/lib/api/bitbybit-base.ts b/packages/dev/threejs/lib/api/bitbybit-base.ts index 18e0c51c..bf786b81 100644 --- a/packages/dev/threejs/lib/api/bitbybit-base.ts +++ b/packages/dev/threejs/lib/api/bitbybit-base.ts @@ -74,7 +74,7 @@ export class BitByBitBase { this.color = new Color(this.math); this.line = new Line(this.context, geometryHelper); this.transforms = new Transforms(this.vector, this.math); - this.point = new Point(geometryHelper, this.transforms); + this.point = new Point(geometryHelper, this.transforms, this.vector); this.polyline = new Polyline(this.context, geometryHelper); this.verb = new Verb(this.context, geometryHelper, this.math); this.time = new Time(this.context); diff --git a/packages/dev/threejs/lib/api/inputs/base-inputs.ts b/packages/dev/threejs/lib/api/inputs/base-inputs.ts index 995103eb..b53373ab 100644 --- a/packages/dev/threejs/lib/api/inputs/base-inputs.ts +++ b/packages/dev/threejs/lib/api/inputs/base-inputs.ts @@ -7,6 +7,10 @@ export namespace Base { export type Vector2 = [number, number]; export type Point3 = [number, number, number]; export type Vector3 = [number, number, number]; + export type Axis3 = {origin: Base.Point3, direction: Base.Vector3}; + export type Axis2 = {origin: Base.Point2, direction: Base.Vector2}; + export type Plane3 = { origin: Base.Point3, normal: Base.Vector3, direction: Base.Vector3 }; + export type BoundingBox = { min: Base.Point3, max: Base.Point3, center?: Base.Point3, width?: number, height?: number, length?: number }; export type Line2 = { start: Base.Point2, end: Base.Point2 }; export type Line3 = { start: Base.Point3, end: Base.Point3 }; export type Polyline3 = { points: Base.Point3[], isClosed?: boolean, color?: number[] }; diff --git a/packages/dev/threejs/lib/api/inputs/index.ts b/packages/dev/threejs/lib/api/inputs/index.ts index 43f8b0a2..fc133166 100644 --- a/packages/dev/threejs/lib/api/inputs/index.ts +++ b/packages/dev/threejs/lib/api/inputs/index.ts @@ -1,2 +1,3 @@ export * from "./draw-inputs"; +export * from "./base-inputs"; export * from "@bitbybit-dev/core/lib/api/inputs/inputs"; \ No newline at end of file diff --git a/packages/dev/threejs/lib/api/models/index.ts b/packages/dev/threejs/lib/api/models/index.ts new file mode 100644 index 00000000..c5676c6b --- /dev/null +++ b/packages/dev/threejs/lib/api/models/index.ts @@ -0,0 +1,2 @@ + +export * from "@bitbybit-dev/core/lib/api/models"; \ No newline at end of file diff --git a/packages/dev/threejs/package-lock.json b/packages/dev/threejs/package-lock.json index 2d3cce28..cb80228c 100644 --- a/packages/dev/threejs/package-lock.json +++ b/packages/dev/threejs/package-lock.json @@ -1,16 +1,16 @@ { "name": "@bitbybit-dev/threejs", - "version": "0.20.0", + "version": "0.20.2", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "@bitbybit-dev/threejs", - "version": "0.20.0", + "version": "0.20.2", "license": "MIT", "dependencies": { - "@bitbybit-dev/core": "0.20.0", - "three": "0.175.0" + "@bitbybit-dev/core": "0.20.2", + "three": "0.176.0" }, "devDependencies": { "@babel/core": "7.16.0", @@ -18,7 +18,7 @@ "@babel/preset-typescript": "7.16.0", "@testing-library/jest-dom": "5.14.1", "@types/jest": "29.0.0", - "@types/three": "0.175.0", + "@types/three": "0.176.0", "babel-jest": "29.0.0", "jest": "29.4.1", "jest-html-reporters": "3.0.11", @@ -1703,30 +1703,30 @@ "dev": true }, "node_modules/@bitbybit-dev/base": { - "version": "0.20.0", - "resolved": "https://registry.npmjs.org/@bitbybit-dev/base/-/base-0.20.0.tgz", - "integrity": "sha512-9J09Z3qY8JHfkWQe43BjDHPcm6MMec2YEL+Ily0U0dd/5+avcV+0N9zq+AYbTHbU9hczDBQH648L5uDNu7UOVg==" + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@bitbybit-dev/base/-/base-0.20.2.tgz", + "integrity": "sha512-+8jxnr7n7SNnuvh3uBgFQSTFYlOA+UrXUhE5XpeukPtTt3ffRShfTC3eRP9q+m/ummljKpKVLGGwSlCsKbriBQ==" }, "node_modules/@bitbybit-dev/core": { - "version": "0.20.0", - "resolved": "https://registry.npmjs.org/@bitbybit-dev/core/-/core-0.20.0.tgz", - "integrity": "sha512-jHhNI96cGavARDq9J/03E36y2MnjvbsoPB7AvB+E1URxFjdGx9cQYPMCwf6thqGPlG/EJ+egdugGOe1jduvijg==", - "dependencies": { - "@bitbybit-dev/base": "0.20.0", - "@bitbybit-dev/jscad-worker": "0.20.0", - "@bitbybit-dev/manifold-worker": "0.20.0", - "@bitbybit-dev/occt-worker": "0.20.0", + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@bitbybit-dev/core/-/core-0.20.2.tgz", + "integrity": "sha512-IYa7ThvCgOMS9CoRvuwTJ/YhAyCVZ0gamXmtb9dYF33RuhtRDWc6nxgitXQ/WBUQI/Csk7hzXlJS32nChMqCNA==", + "dependencies": { + "@bitbybit-dev/base": "0.20.2", + "@bitbybit-dev/jscad-worker": "0.20.2", + "@bitbybit-dev/manifold-worker": "0.20.2", + "@bitbybit-dev/occt-worker": "0.20.2", "jsonpath-plus": "10.1.0", "rxjs": "7.5.5", "verb-nurbs-web": "2.1.3" } }, "node_modules/@bitbybit-dev/jscad": { - "version": "0.20.0", - "resolved": "https://registry.npmjs.org/@bitbybit-dev/jscad/-/jscad-0.20.0.tgz", - "integrity": "sha512-pvC+XI/fTww6kHi9kOdu/udf94iSeiPAURMGbTSq4knBCY6oa9Cv2ZcsBccmsCU67nyVBthGKuGuD9os45zq0w==", + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@bitbybit-dev/jscad/-/jscad-0.20.2.tgz", + "integrity": "sha512-jRkvkjQM9OwtuB6grNndK4io28woHSiDULfYkEckdK7Ms13esj0qtsi5j1NaAZizd04xdKVuThFhEzIzRkdkkQ==", "dependencies": { - "@bitbybit-dev/base": "0.20.0", + "@bitbybit-dev/base": "0.20.2", "@jscad/3mf-serializer": "2.1.12", "@jscad/dxf-serializer": "2.1.18", "@jscad/io-utils": "2.0.28", @@ -1735,42 +1735,45 @@ } }, "node_modules/@bitbybit-dev/jscad-worker": { - "version": "0.20.0", - "resolved": "https://registry.npmjs.org/@bitbybit-dev/jscad-worker/-/jscad-worker-0.20.0.tgz", - "integrity": "sha512-/Fybz1brNyDvbzyFY2B3EERAfZCWPtVhRdgpruKnJ1Wb1pffQ2QMgQBGLJBB1jdpwQ5lmaByub97Il71KcIYmQ==", + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@bitbybit-dev/jscad-worker/-/jscad-worker-0.20.2.tgz", + "integrity": "sha512-bTnlO3yqvTNFqAx3dGnhrX/O7HPNuXRE5vn68ogK7belWEI8r26XaN5kJEzcN8k9maxAXJQRR04xJQPkbfGTaA==", "dependencies": { - "@bitbybit-dev/jscad": "0.20.0", + "@bitbybit-dev/jscad": "0.20.2", "rxjs": "7.5.5" } }, "node_modules/@bitbybit-dev/manifold": { - "version": "0.20.0", - "resolved": "https://registry.npmjs.org/@bitbybit-dev/manifold/-/manifold-0.20.0.tgz", - "integrity": "sha512-pKsmGFs68hzzPU5Flx6GmIMKql2polMwMw2VLDeQlDkka6fio98ZUpc8niJbqmFqlbe6qmunq1rRCetQ5EW/cA==", + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@bitbybit-dev/manifold/-/manifold-0.20.2.tgz", + "integrity": "sha512-BJtFUzC2Juxm/NYYyOvu/TiXccvzSvb5dOomrTE9uHv04TPCwxy3sw/mMU1QeoJyeQ4F2eIaG0GgXUe8fCsHYA==", "dependencies": { "manifold-3d": "3.0.0" } }, "node_modules/@bitbybit-dev/manifold-worker": { - "version": "0.20.0", - "resolved": "https://registry.npmjs.org/@bitbybit-dev/manifold-worker/-/manifold-worker-0.20.0.tgz", - "integrity": "sha512-pz9kHuk9URfif6yo3hcjQEy7pcG7+9R3FlHMXgkPDmvcFV0BYYYYFglSDqFZ6xcbUNz/9jeCy/zr47hCAuAKgg==", + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@bitbybit-dev/manifold-worker/-/manifold-worker-0.20.2.tgz", + "integrity": "sha512-+Zid8ALBXGTSLn6DlhU8abHduu5HlUpFZ5+RoIshXi4z5xQJbVhEWckDn1PF2Uq9y4qnwHTMQK+etF40Aei2MQ==", "dependencies": { - "@bitbybit-dev/manifold": "0.20.0", + "@bitbybit-dev/manifold": "0.20.2", "rxjs": "7.5.5" } }, "node_modules/@bitbybit-dev/occt": { - "version": "0.20.0", - "resolved": "https://registry.npmjs.org/@bitbybit-dev/occt/-/occt-0.20.0.tgz", - "integrity": "sha512-riqAiZ6fawRDW2AGIV/qBnzM1y1DCckQG+F7ez9pTY/2gBXq2jA+5WDor4FL+8vwhgPZcdZ37R7fBSrcHHR1oQ==" + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@bitbybit-dev/occt/-/occt-0.20.2.tgz", + "integrity": "sha512-jPZyi50Z2BjCSJ+OwlroEG3Neqd8uPDtqp8skhREDSPxG6SAjIHCxxn7SZxl8w7rhhUDR/OCGm/uDdLeLR7Ncg==", + "dependencies": { + "@bitbybit-dev/base": "0.20.2" + } }, "node_modules/@bitbybit-dev/occt-worker": { - "version": "0.20.0", - "resolved": "https://registry.npmjs.org/@bitbybit-dev/occt-worker/-/occt-worker-0.20.0.tgz", - "integrity": "sha512-zbDsXIF+HrxZfi0QwpxlVuPAxnUNyYQZP/aAal+Cf6/zS1IVVDhZMdq8g2Qf0KjyLDd9b7tbsvlfXXj52tEyZA==", + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@bitbybit-dev/occt-worker/-/occt-worker-0.20.2.tgz", + "integrity": "sha512-q6h/PbBAKnp01PshmhGE14x2b7YnW02YvnUrdGkU6FVYErxoQwwASiN10UKgeBbkD+jbc099kpFzJtvamPnMRw==", "dependencies": { - "@bitbybit-dev/occt": "0.20.0", + "@bitbybit-dev/occt": "0.20.2", "rxjs": "7.5.5" } }, @@ -1796,6 +1799,12 @@ "@jridgewell/sourcemap-codec": "^1.4.10" } }, + "node_modules/@dimforge/rapier3d-compat": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/@dimforge/rapier3d-compat/-/rapier3d-compat-0.12.0.tgz", + "integrity": "sha512-uekIGetywIgopfD97oDL5PfeezkFpNhwlzlaEYNOA0N6ghdsOvh/HYjSMek5Q2O1PYvRSDFcqFVJl4r4ZBwOow==", + "dev": true + }, "node_modules/@istanbuljs/load-nyc-config": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", @@ -2830,11 +2839,12 @@ } }, "node_modules/@types/three": { - "version": "0.175.0", - "resolved": "https://registry.npmjs.org/@types/three/-/three-0.175.0.tgz", - "integrity": "sha512-ldMSBgtZOZ3g9kJ3kOZSEtZIEITmJOzu8eKVpkhf036GuNkM4mt0NXecrjCn5tMm1OblOF7dZehlaDypBfNokw==", + "version": "0.176.0", + "resolved": "https://registry.npmjs.org/@types/three/-/three-0.176.0.tgz", + "integrity": "sha512-FwfPXxCqOtP7EdYMagCFePNKoG1AGBDUEVKtluv2BTVRpSt7b+X27xNsirPCTCqY1pGYsPUzaM3jgWP7dXSxlw==", "dev": true, "dependencies": { + "@dimforge/rapier3d-compat": "^0.12.0", "@tweenjs/tween.js": "~23.1.3", "@types/stats.js": "*", "@types/webxr": "*", @@ -6814,9 +6824,9 @@ } }, "node_modules/three": { - "version": "0.175.0", - "resolved": "https://registry.npmjs.org/three/-/three-0.175.0.tgz", - "integrity": "sha512-nNE3pnTHxXN/Phw768u0Grr7W4+rumGg/H6PgeseNJojkJtmeHJfZWi41Gp2mpXl1pg1pf1zjwR4McM1jTqkpg==" + "version": "0.176.0", + "resolved": "https://registry.npmjs.org/three/-/three-0.176.0.tgz", + "integrity": "sha512-PWRKYWQo23ojf9oZSlRGH8K09q7nRSWx6LY/HF/UUrMdYgN9i1e2OwJYHoQjwc6HF/4lvvYLC5YC1X8UJL2ZpA==" }, "node_modules/tmpl": { "version": "1.0.5", @@ -8441,30 +8451,30 @@ "dev": true }, "@bitbybit-dev/base": { - "version": "0.20.0", - "resolved": "https://registry.npmjs.org/@bitbybit-dev/base/-/base-0.20.0.tgz", - "integrity": "sha512-9J09Z3qY8JHfkWQe43BjDHPcm6MMec2YEL+Ily0U0dd/5+avcV+0N9zq+AYbTHbU9hczDBQH648L5uDNu7UOVg==" + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@bitbybit-dev/base/-/base-0.20.2.tgz", + "integrity": "sha512-+8jxnr7n7SNnuvh3uBgFQSTFYlOA+UrXUhE5XpeukPtTt3ffRShfTC3eRP9q+m/ummljKpKVLGGwSlCsKbriBQ==" }, "@bitbybit-dev/core": { - "version": "0.20.0", - "resolved": "https://registry.npmjs.org/@bitbybit-dev/core/-/core-0.20.0.tgz", - "integrity": "sha512-jHhNI96cGavARDq9J/03E36y2MnjvbsoPB7AvB+E1URxFjdGx9cQYPMCwf6thqGPlG/EJ+egdugGOe1jduvijg==", - "requires": { - "@bitbybit-dev/base": "0.20.0", - "@bitbybit-dev/jscad-worker": "0.20.0", - "@bitbybit-dev/manifold-worker": "0.20.0", - "@bitbybit-dev/occt-worker": "0.20.0", + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@bitbybit-dev/core/-/core-0.20.2.tgz", + "integrity": "sha512-IYa7ThvCgOMS9CoRvuwTJ/YhAyCVZ0gamXmtb9dYF33RuhtRDWc6nxgitXQ/WBUQI/Csk7hzXlJS32nChMqCNA==", + "requires": { + "@bitbybit-dev/base": "0.20.2", + "@bitbybit-dev/jscad-worker": "0.20.2", + "@bitbybit-dev/manifold-worker": "0.20.2", + "@bitbybit-dev/occt-worker": "0.20.2", "jsonpath-plus": "10.1.0", "rxjs": "7.5.5", "verb-nurbs-web": "2.1.3" } }, "@bitbybit-dev/jscad": { - "version": "0.20.0", - "resolved": "https://registry.npmjs.org/@bitbybit-dev/jscad/-/jscad-0.20.0.tgz", - "integrity": "sha512-pvC+XI/fTww6kHi9kOdu/udf94iSeiPAURMGbTSq4knBCY6oa9Cv2ZcsBccmsCU67nyVBthGKuGuD9os45zq0w==", + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@bitbybit-dev/jscad/-/jscad-0.20.2.tgz", + "integrity": "sha512-jRkvkjQM9OwtuB6grNndK4io28woHSiDULfYkEckdK7Ms13esj0qtsi5j1NaAZizd04xdKVuThFhEzIzRkdkkQ==", "requires": { - "@bitbybit-dev/base": "0.20.0", + "@bitbybit-dev/base": "0.20.2", "@jscad/3mf-serializer": "2.1.12", "@jscad/dxf-serializer": "2.1.18", "@jscad/io-utils": "2.0.28", @@ -8473,42 +8483,45 @@ } }, "@bitbybit-dev/jscad-worker": { - "version": "0.20.0", - "resolved": "https://registry.npmjs.org/@bitbybit-dev/jscad-worker/-/jscad-worker-0.20.0.tgz", - "integrity": "sha512-/Fybz1brNyDvbzyFY2B3EERAfZCWPtVhRdgpruKnJ1Wb1pffQ2QMgQBGLJBB1jdpwQ5lmaByub97Il71KcIYmQ==", + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@bitbybit-dev/jscad-worker/-/jscad-worker-0.20.2.tgz", + "integrity": "sha512-bTnlO3yqvTNFqAx3dGnhrX/O7HPNuXRE5vn68ogK7belWEI8r26XaN5kJEzcN8k9maxAXJQRR04xJQPkbfGTaA==", "requires": { - "@bitbybit-dev/jscad": "0.20.0", + "@bitbybit-dev/jscad": "0.20.2", "rxjs": "7.5.5" } }, "@bitbybit-dev/manifold": { - "version": "0.20.0", - "resolved": "https://registry.npmjs.org/@bitbybit-dev/manifold/-/manifold-0.20.0.tgz", - "integrity": "sha512-pKsmGFs68hzzPU5Flx6GmIMKql2polMwMw2VLDeQlDkka6fio98ZUpc8niJbqmFqlbe6qmunq1rRCetQ5EW/cA==", + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@bitbybit-dev/manifold/-/manifold-0.20.2.tgz", + "integrity": "sha512-BJtFUzC2Juxm/NYYyOvu/TiXccvzSvb5dOomrTE9uHv04TPCwxy3sw/mMU1QeoJyeQ4F2eIaG0GgXUe8fCsHYA==", "requires": { "manifold-3d": "3.0.0" } }, "@bitbybit-dev/manifold-worker": { - "version": "0.20.0", - "resolved": "https://registry.npmjs.org/@bitbybit-dev/manifold-worker/-/manifold-worker-0.20.0.tgz", - "integrity": "sha512-pz9kHuk9URfif6yo3hcjQEy7pcG7+9R3FlHMXgkPDmvcFV0BYYYYFglSDqFZ6xcbUNz/9jeCy/zr47hCAuAKgg==", + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@bitbybit-dev/manifold-worker/-/manifold-worker-0.20.2.tgz", + "integrity": "sha512-+Zid8ALBXGTSLn6DlhU8abHduu5HlUpFZ5+RoIshXi4z5xQJbVhEWckDn1PF2Uq9y4qnwHTMQK+etF40Aei2MQ==", "requires": { - "@bitbybit-dev/manifold": "0.20.0", + "@bitbybit-dev/manifold": "0.20.2", "rxjs": "7.5.5" } }, "@bitbybit-dev/occt": { - "version": "0.20.0", - "resolved": "https://registry.npmjs.org/@bitbybit-dev/occt/-/occt-0.20.0.tgz", - "integrity": "sha512-riqAiZ6fawRDW2AGIV/qBnzM1y1DCckQG+F7ez9pTY/2gBXq2jA+5WDor4FL+8vwhgPZcdZ37R7fBSrcHHR1oQ==" + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@bitbybit-dev/occt/-/occt-0.20.2.tgz", + "integrity": "sha512-jPZyi50Z2BjCSJ+OwlroEG3Neqd8uPDtqp8skhREDSPxG6SAjIHCxxn7SZxl8w7rhhUDR/OCGm/uDdLeLR7Ncg==", + "requires": { + "@bitbybit-dev/base": "0.20.2" + } }, "@bitbybit-dev/occt-worker": { - "version": "0.20.0", - "resolved": "https://registry.npmjs.org/@bitbybit-dev/occt-worker/-/occt-worker-0.20.0.tgz", - "integrity": "sha512-zbDsXIF+HrxZfi0QwpxlVuPAxnUNyYQZP/aAal+Cf6/zS1IVVDhZMdq8g2Qf0KjyLDd9b7tbsvlfXXj52tEyZA==", + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@bitbybit-dev/occt-worker/-/occt-worker-0.20.2.tgz", + "integrity": "sha512-q6h/PbBAKnp01PshmhGE14x2b7YnW02YvnUrdGkU6FVYErxoQwwASiN10UKgeBbkD+jbc099kpFzJtvamPnMRw==", "requires": { - "@bitbybit-dev/occt": "0.20.0", + "@bitbybit-dev/occt": "0.20.2", "rxjs": "7.5.5" } }, @@ -8533,6 +8546,12 @@ } } }, + "@dimforge/rapier3d-compat": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/@dimforge/rapier3d-compat/-/rapier3d-compat-0.12.0.tgz", + "integrity": "sha512-uekIGetywIgopfD97oDL5PfeezkFpNhwlzlaEYNOA0N6ghdsOvh/HYjSMek5Q2O1PYvRSDFcqFVJl4r4ZBwOow==", + "dev": true + }, "@istanbuljs/load-nyc-config": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", @@ -9368,11 +9387,12 @@ } }, "@types/three": { - "version": "0.175.0", - "resolved": "https://registry.npmjs.org/@types/three/-/three-0.175.0.tgz", - "integrity": "sha512-ldMSBgtZOZ3g9kJ3kOZSEtZIEITmJOzu8eKVpkhf036GuNkM4mt0NXecrjCn5tMm1OblOF7dZehlaDypBfNokw==", + "version": "0.176.0", + "resolved": "https://registry.npmjs.org/@types/three/-/three-0.176.0.tgz", + "integrity": "sha512-FwfPXxCqOtP7EdYMagCFePNKoG1AGBDUEVKtluv2BTVRpSt7b+X27xNsirPCTCqY1pGYsPUzaM3jgWP7dXSxlw==", "dev": true, "requires": { + "@dimforge/rapier3d-compat": "^0.12.0", "@tweenjs/tween.js": "~23.1.3", "@types/stats.js": "*", "@types/webxr": "*", @@ -12353,9 +12373,9 @@ } }, "three": { - "version": "0.175.0", - "resolved": "https://registry.npmjs.org/three/-/three-0.175.0.tgz", - "integrity": "sha512-nNE3pnTHxXN/Phw768u0Grr7W4+rumGg/H6PgeseNJojkJtmeHJfZWi41Gp2mpXl1pg1pf1zjwR4McM1jTqkpg==" + "version": "0.176.0", + "resolved": "https://registry.npmjs.org/three/-/three-0.176.0.tgz", + "integrity": "sha512-PWRKYWQo23ojf9oZSlRGH8K09q7nRSWx6LY/HF/UUrMdYgN9i1e2OwJYHoQjwc6HF/4lvvYLC5YC1X8UJL2ZpA==" }, "tmpl": { "version": "1.0.5", diff --git a/packages/dev/threejs/package.json b/packages/dev/threejs/package.json index 951e9623..44fb2326 100644 --- a/packages/dev/threejs/package.json +++ b/packages/dev/threejs/package.json @@ -1,6 +1,6 @@ { "name": "@bitbybit-dev/threejs", - "version": "0.20.0", + "version": "0.20.2", "description": "Bit By Bit Developers THREEJS CAD Library to Program Geometry", "main": "index.js", "repository": { @@ -54,8 +54,8 @@ "types": "./index.d.ts", "type": "module", "dependencies": { - "three": "0.175.0", - "@bitbybit-dev/core": "0.20.0" + "three": "0.176.0", + "@bitbybit-dev/core": "0.20.2" }, "devDependencies": { "sass": "1.57.1", @@ -66,7 +66,7 @@ "ts-jest": "29.0.0", "typescript": "4.8.2", "@types/jest": "29.0.0", - "@types/three": "0.175.0", + "@types/three": "0.176.0", "babel-jest": "29.0.0", "@babel/core": "7.16.0", "@babel/preset-env": "7.16.0",