تخطَّ إلى المحتوى
CADCAMFUN
الوثائق

الوثائق

شبكة ونواة CSG

يتشابك المثلث المغلق من المواد الصلبة البارامترية، والقيم المنطقية BSP مع مسار سريع محدب، وفحص التنظيف والطوبولوجيا.

مترجم تلقائيًا من الإنجليزية. عرض الأصل بالإنجليزية

ما هي نواة الشبكة

تعمل نواة الشبكة على شبكات مثلثة مغلقة: فهي تبنيها من البدائيات البارامترية (meshOf)، يقيسها (meshVolume, meshBounds, meshTopology)، ويجمعها مع القيم المنطقية (booleanMesh, booleanAll). هذا ما يظهره إطار العرض، وما تكتبه آلة مولدات CAM، وما يكتبه تصدير STL.

إنه ليس تمثيلًا دقيقًا للحدود. تظل الأسطوانة التي تم قطعها أسطوانة متعددة الأوجه، ولا توجد طوبولوجيا وجه يمكن تقطيعها أو قياسها. بالنسبة للوجوه الدقيقة والشرائح وخصائص الكتلة وSTEP، فإن نواة B-rep هو جزء منفصل من التعليمات البرمجية.

ملفخطوطدور
cad/solid.ts659المخططات الصلبة (Box، Cylinder، Sphere، Cone، Torus، Extrude، Revolve)، MeshOf، MeshVolume، MeshBounds
cad/csg.ts459BSP المنطقية، المصنف المحدب، ترجمة/تدوير/دمج
cad/mesh-clean.ts626اللحام، إصلاح الوصلة T، الدمج المستوي، إعادة التثليث
cad/mesh-topology.ts110متعددة، قذائف، جنس، حجم، منطقة
cad/triangulate.ts383تثليث المضلعات ذات الثقوب
لوحة حفر مع رئيس بالملل اسحب إلى المدار · قم بالتمرير للتكبير · اسحب بزر الماوس الأيمن للتحريك
إخراج شبكة منطقية حقيقية: مربع 60 × 40 × 10 ناقص أربعة ثقوب Ø6 (طرح كل منطقي)، متحد مع رئيس Ø20 × 8، ثم مملة Ø10 من خلال. 640 مثلثات؛ تشير شبكة Topology إلى مادة صلبة مغلقة، 1 shell، الجنس 5، V 23981.4 مم³.

نوع الشبكة والأوليات

solid.ts
export interface Mesh {
  readonly positions: Float32Array   // x, y, z per vertex
  readonly indices: Uint32Array      // three per triangle, counter-clockwise seen from outside
}
export const meshOf: (solid: Solid, tolerance?: number /* 0.1 mm */) => Mesh
export const meshVolume: (mesh: Mesh) => number     // signed; positive when outward-facing
export const meshBounds: (mesh: Mesh) => SolidBounds
صلبالحقولحدود
صندوقالأصل والحجم {x، y، z}الأحجام > 0
اسطوانةالأصل، نصف القطر، الارتفاع، القطاعات، المحور؟المقاطع 3–512; المحور ض | س | ذ
جسم كرويالمركز، نصف القطر، الحلقاتحلقات 2–256
مخروطالأصل، baseRadius، topRadius، الارتفاع، القطاعات، المحور؟نصف القطر العلوي ≥ 0; المقاطع 3–512
تورسمركز، نصف قطر رئيسي، نصف قطر صغير، دوران؟، شرائح رئيسية، شرائح ثانوية، محور؟3–512 و 3–256
بثقالملف الشخصي (≥ 3 نقطة، غير مغلقة)، الارتفاع، الأصل؟الملف الشخصي في XY
تدورالملف الشخصي (≥ 2 نقطة في XZ)، الزاوية، المقاطع؟عن ز؛ المقاطع 3–512، الافتراضي 16
segments و rings هي الحد الأدنى: meshOf يرفعهم حتى يصبح خطأ الوتر بالداخل tolerance, using step = 4·asin(√(min(1, tol/r)/2)). Two budgets stop runaway tolerances.
يحميقيمةرسالة خطأ
يجب أن يكون التسامح إيجابيًا ومحدودًا—يجب أن يكون تحمل الشبكة إيجابيًا ومحدودًا
قطاعات لكل منحنى65 536يتجاوز تحمل الشبكة ميزانية التقسيم الفرعي
صفوف الشبكة × الأعمدة (الكرة، الحيد، الدوارة)1 000 000يتجاوز تسامح الشبكة ميزانية الرأس

اسطوانة Ø6 مع segments: 24 عند التسامح 0.05 خرج بمثلثات 96 (24 جوانب، غطائين 24)؛ Ø20 واحد مع 128، لأن نصف القطر الأكبر يحتاج إلى 32 شرائح للبقاء ضمن 0.05 ملم.

القيم المنطقية عن طريق تقسيم الفضاء الثنائي

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

  1. If either mesh is empty, or the bounding boxes do not meet (within tolerance), answer directly: union = merge, subtract = a, intersect = empty.
  2. قم ببناء مصنفات A وB (المستويات المحدبة أو BSP).
  3. الاتحاد: احتفظ بـ A خارج B، وB خارج A، وقم بإسقاط وجوه B التي تتزامن مع إشارة A بنفس الطريقة، لذلك يتم الاحتفاظ بالوجه المشترك مرة واحدة.
  4. Subtract and intersect follow the classic a.clipTo(b), b.clipTo(a), b.invert() sequence on polygon lists, without copying trees.
  5. قم بتنظيف حساء المضلع: نقاط اللحام داخل الحد الأقصى (10·eps, 1e-9·size)، وأغلق الوصلات على شكل حرف T، وأغلق الفجوات التي تصل إلى 1e-4·الحجم بين الشظايا، وادمج الأجزاء المستوية وأعد التثليث.
csg.ts
export type BooleanOp = "union" | "subtract" | "intersect"
export interface CsgOptions {
  /** Distance below which a point counts as on a plane, mm. Default 1e-7 × the larger extent. */
  readonly tolerance?: number
  /** Merge coplanar fragments and re-triangulate (default true). */
  readonly mergeCoplanar?: boolean
}
export const booleanMesh: (a: Mesh, b: Mesh, op: BooleanOp, options?: CsgOptions) => Mesh
/** Union reduced as a balanced tree; subtract and intersect fold left to right. */
export const booleanAll: (meshes: ReadonlyArray<Mesh>, op: BooleanOp, options?: CsgOptions) => Mesh
export const translateMesh: (mesh: Mesh, dx: number, dy: number, dz: number) => Mesh
export const rotateMesh: (mesh: Mesh, axis: V3, radians: number, origin?: V3) => Mesh
export const mergeMeshes: (meshes: ReadonlyArray<Mesh>) => Mesh

يزداد عدد المثلثات مع الميزات، وليس مع عدد القيم المنطقية: تعيد خطوة الدمج القطع المستوية إلى الوجوه الكاملة. في اللوحة أعلاه، يحتوي الصندوق على 12 مثلثات، بعد أربع فتحات 412، بعد الرئيس 540، بعد التجويف 640؛ تم تشغيل السلسلة بأكملها في 96 مللي ثانية.

الاتحاد، الطرح، التقاطع على المدخلات المنحنية

A 20 mm cube at the origin against a sphere of radius 12 centred on its far corner (20, 20, 20), meshed at tolerance 0.2 (624 triangles). Real volumes:

نتيجةالحجم، مم³مثلثات
المجال وحده7 063.84 (بالضبط 7 238.23)624
مكعب ∩ كرة882.98112
مكعب ∪ المجال14 180.86—
مكعب - كرة7 117.02—

تحقق: 8 000 + 7 063.84 − 882.98 = 14 180.86 و 8 000 − 882.98 = 7 117.02، وبالتالي فإن النتائج الثلاثة متوافقة مع بعضها البعض حتى المائة. الشبكة الكروية نفسها هي 2.4 % تحت المجال الدقيق، وهو وجه التسامح التقريبي، وليس خطأ منطقي.

مكعب - كرة اسحب إلى المدار · قم بالتمرير للتكبير · اسحب بزر الماوس الأيمن للتحريك
نتيجة الطرح: المكعب ذو الكرة الثامنة المستخرجة من زاويته.
مكعب ∩ كرة اسحب إلى المدار · قم بالتمرير للتكبير · اسحب بزر الماوس الأيمن للتحريك
نتيجة التقاطع: ثمن الكرة التي تقع داخل المكعب.

فحص الطوبولوجيا

meshTopology يحسب القمم والحواف والمثلثات، ويجد الحواف الحدودية وغير المتعددة والموجهة بشكل خاطئ، والمثلثات والأصداف المتدهورة، ويشتق خاصية أويلر والجنس. describeTopology يطبع ملخصًا من سطر واحد يستخدمه المساعد وإطار العرض.
meshTopology (بالملل) - الإخراج الحقيقي
{"vertices":312,"triangles":640,"edges":960,"boundaryEdges":0,"nonManifoldEdges":0,
 "misorientedEdges":0,"degenerateTriangles":0,"shells":1,"eulerCharacteristic":-8,"genus":5,
 "closed":true,"solid":true,"volume":23981.43509870267,"area":8238.640705862534}
// describeTopology → "closed solid, 1 shell, genus 5, 640 triangles, V 23981.4 mm³, A 8238.6 mm²"

V − E + F = 312 − 960 + 640 = −8 = 2 − 2g, so g = 5: the four drilled holes plus the bore, which runs through the boss and the plate.

التثليث المضلع

triangulatePolygon(outer, holes) يُرجع الفهرس ثلاث مرات إلى سلسلة الحلقة الخارجية والثقوب. مربع 4 × 4 به فتحة 2 × 2 يعطي ثمانية مثلثات:
الناتج الحقيقي
triangulatePolygon(
  [{x:0,y:0},{x:4,y:0},{x:4,y:4},{x:0,y:4}],
  [[{x:1,y:1},{x:1,y:3},{x:3,y:3},{x:3,y:1}]])
// [[0,4,5],[7,4,0],[3,0,5],[7,0,1],[2,3,5],[6,7,1],[2,5,6],[6,1,2]]
triangulatePolygonChecked يعود undefined بدلاً من النتيجة الجزئية عندما لا يمكن تثليث المدخلات (حلقات متقاطعة ذاتيًا، ثقوب خارج الحلقة الخارجية).

استكشاف الأخطاء وإصلاحها

أعراضسببيصلح
تحتوي النتيجة المنطقية على ثقوب أو وجوه مقلوبةالمدخلات مفتوحة أو ملفوفة في اتجاه عقارب الساعةتحقق من كلا المدخلات باستخدام MeshTopology: يجب أن تكون الحدود الحدودية والحواف الخاطئة 0
الوجه المشترك بين كلا المعاملين مفقود أو مضاعفالوجوه تقريبًا ولكن ليست متطابقة تمامًا (أبعد عن التسامح)انطباق المعاملات على نفس المستوى، أو قم برفع CsgOptions.tolerance
RangeError: تجاوز تسامح الشبكة ميزانية التقسيم الفرعيالتسامح جيد جدًا بالنسبة لنصف القطراستخدم إعدادات التفاوت المسبقة (0.1 إلى 0.0005 مم)
الحجم يختلف عن الصيغةمواجهة في التسامح الخشنةشبكة أكثر دقة، أو استخدم نواة B-rep للحصول على خصائص الكتلة الدقيقة
بطء منطقي في العديد من الأدواتتم بناء اتحاد الأدوات أولاًأدوات الطرح واحدة تلو الأخرى (booleanAll تقوم بهذا): كل أداة محدبة عبارة عن مجموعة من المستويات