الوثائق
نواة B-rep الدقيقة
التمثيل الدقيق للحدود: الهندسة التحليلية وهندسة NURBS، والقيم المنطقية، والشرائح، والتعرف على الثقب، وخصائص الكتلة، والتحقق من الصحة، والفسيفساء، وSTEP.
مترجم تلقائيًا من الإنجليزية. عرض الأصل بالإنجليزية
ما هي نواة B-rep
النواة الدقيقة في packages/core/src/cad/brep (24 ملفات مصدر، حوالي 8 660 من الخطوط، بالإضافة إلى الاختبارات) تمثل المواد الصلبة بحدودها الدقيقة: الأسطح التحليلية وأسطح NURBS، المشذبة بحلقات ذات حواف دقيقة. كل شيء عبارة عن بيانات بسيطة ووظائف خالصة، لذا فإن B-rep يتسلسل إلى JSON، ويعبر حدود العامل ويختلف في تاريخ المشروع دون تغيير. القيم المنطقية، والشرائح، والحواف، والتعرف على الثقب، وخصائص الكتلة، والتحقق من الصحة، والفسيفساء المانعة لتسرب الماء، وتبادل STEP كلها تعمل على هذا الهيكل الواحد.
جداول الطوبولوجيا
A Brep عبارة عن مجموعة من جداول الفهرس. تشير الكيانات إلى بعضها البعض عن طريق الفهرس، وليس عن طريق مرجع الكائن أبدًا.
| كيان | يحمل | نظير الخطوة |
|---|---|---|
| قمة الرأس | نقطة، التسامح | VERTEX_POINT |
| حافة | exact curve, [t0, t1] with t0 < t1, v0 = C(t0), v1 = C(t1), tolerance | EDGE_CURVE |
| كودج | استخدام واحد للحافة بواسطة حلقة: مؤشر الحافة، معكوس، منحنى p اختياري في الوجه (u، v) | ORIENTED_EDGE + PCURVE |
| حلقة | دورة مغلقة من coedges. المادة الموجودة على اليسار مرئية من الخارج (CCW الخارجي، الثقوب CW) | EDGE_LOOP |
| وجه | منطقة سطح واحد؛ معكوس يعني أن الوضع الطبيعي الخارجي هو -(S_u × S_v) | ADVANCED_FACE |
| صدَفَة | مجموعة متصلة من الوجوه؛ قذيفة مغلقة حدود حجم | CLOSED_SHELL |
Seams (an edge used twice by the same face, such as the generator line of a full cylinder) and poles (a loop through a degenerate point, such as a cone apex) need no special entities. That is why the exact sphere has 2 vertices, 1 edge and 1 face, and the torus 1 vertex, 2 edges and 1 face.
makeBox(60, 40, 15) {"V":8,"E":12,"F":6,"S":1,"surfaces":["plane"]}
makeSphere(10) {"V":2,"E":1,"F":1,"S":1,"surfaces":["sphere"]}
makeTorus(20, 5) {"V":1,"E":2,"F":1,"S":1,"surfaces":["torus"]}
makeCone(10, 4, 20) {"V":2,"E":3,"F":3,"S":1,"surfaces":["cone","plane"]} المنحنيات والأسطح
تستخدم الأنواع التحليلية معلمات STEP (ISO 10303-42)، بحيث تحتفظ الوجوه المقروءة والمكتوبة إلى STEP بمعلماتها.
| يكتب | المعلمة |
|---|---|
| خط | C(t) = O + t·d، وحدة d، طول قوس t |
| دائرة | C(t) = O + r(cos t·x + sin t·y) |
| القطع الناقص | C(t) = O + a cos t·x + b sin t·y |
| طائرة | S(u,v) = O + u·x + v·y |
| اسطوانة | S(u,v) = O + r(cos u·x + sin u·y) + v·z |
| مخروط | S(u,v) = O + (R + v tan α)(cos u·x + sin u·y) + v·z |
| جسم كروي | S(u,v) = O + r cos v(cos u·x + sin u·y) + r sin v·z |
| حيد | S(u,v) = O + (R + r cos v)(cos u·x + sin u·y) + r sin v·z |
| ثورة | S(u,v) = rotate(C(v), axis, u) |
| قذف | S(u,v) = C(u) + v·d |
| نوربس | منحنى أو سطح B-spline العقلاني (خوارزميات Piegl & Tiller في nurbs.ts) |
القيم المنطقية الدقيقة
- تتقاطع. حواف كل مادة صلبة مقابل أوجه المادة الأخرى (النقاط المحددة حسب نيوتن)، والحواف الموجودة على أسطح المادة الصلبة الأخرى، ومنحنيات التقاطع لكل زوج من الوجوه غير المتطابقة، مصقولة على كلا السطحين ومعترف بها كخطوط ودوائر، وإلا يتم تركيبها كخطوط B مكعبة ضمن التسامح المناسب.
- بصمة. تصبح كل نقطة تقاطع قمة في سجل واحد لكلا المجسمين، ويتم تقسيم الحواف هناك، ويتم قطع كل وجه بواسطة المنحنيات الموجودة عليه من خلال ترتيب مستو في مجاله (u، v).
- تصنيف. توجد نقطة داخل كل قطعة مقابل المادة الصلبة الأخرى: للداخل أو للخارج أو للداخل بنفس الاتجاه أو الاتجاه المعاكس.
- خاط. يتم الاحتفاظ بالأجزاء وفقًا لقواعد العملية، وتصبح القطع المتطابقة حافة واحدة، ويتم دمج الجيران المستويين، ويتم التحقق من صحة النتيجة. والنتيجة ليست رميات صلبة متعددة مغلقة
BooleanError; لم يتم إرجاعه أبدًا.
export const booleanBrep: (A: Brep, B: Brep, op: BooleanOp, options?: BooleanOptions) => BooleanResult
export interface BooleanOptions {
tol?: number // coincidence, default 1e-8 × model size, at least 1e-7 mm
fitTol?: number // fitted intersection curves, default 1e-6 × size, at least 1e-6 mm
seedAngleDeg?: number // normal turn per seed-mesh triangle, default 10
debug?: (stage: string, data: unknown) => void
}
export interface BooleanResult {
brep: Brep; warnings: string[]
stats: { intersectionCurves: number; splitPoints: number; fragments: number; keptFaces: number }
} import { brep } from "@cadcamfun/core"
const { makeBox, makeCylinder, frame, booleanBrep, validateBrep, massProperties } = brep
const box = makeBox(60, 40, 15)
const hole = makeCylinder(6, 25, frame({ x: 30, y: 20, z: -5 }))
const r = booleanBrep(box, hole, "subtract") // 141 ms
r.stats // {"intersectionCurves":2,"splitPoints":12,"fragments":13,"keptFaces":7}
r.warnings // []
validateBrep(r.brep)
// {"valid":true,"manifoldSolid":true,"genus":1,"volume":34303.53996706151,"issues":[]}
massProperties(r.brep).volume // 34303.53996706151 = 60·40·15 − π·6²·15 exactly خصائص الكتلة
الحجم والمساحة والنقطه الوسطى وموتر القصور الذاتي (وحدة الكثافة، حول النقطه الوسطى، الصف الرئيسي) تأتي من نظرية التباعد على الوجوه الحدودية. يتم دمج الوجوه المستوية تمامًا بواسطة نظرية جرين على طول منحنيات الحافة الدقيقة؛ يتم دمج الوجوه المنحنية في فسيفساء خطوة المعلمة للسطح الدقيق.
| جسم | massProperties | نموذج مغلق |
|---|---|---|
| صندوق − Ø12 فتحة، حجم | 34303.53996706151 | 34303.539967061515 |
| نفس المنطقة | 8139.292006587684 | 8139.292006587698 |
| نفسه، النقطه الوسطى | (30.000, 20.000, 7.500) | (30, 20, 7.5) |
| المجال r10، الحجم | 4188.790204786379 | 4188.790204786391 |
| الحيد 20/5، المجلد | 9869.60440109475 | 9869.604401089358 |
| لوحة فيليه، الحجم | 34097.52220392302 | 34097.522203923065 |
The filleted-plate closed form is the subtracted plate minus four corner slivers of (r² − πr²/4)·h = (16 − 4π)·15 each.
التعرف على الشرائح والشطب والثقب
export const blendCandidates: (b: Brep, minAngleDegrees?: number /* 0.5 */) => BlendCandidate[]
export const selectBlendEdges: (edges: ReadonlyArray<BlendCandidate>, s?: BlendSelector) => BlendCandidate[]
// BlendSelector: parallel?: "x"|"y"|"z", within?: box, kind?: "convex"|"concave"|"both" (default convex), minLength?, curved?
export const blendBrep: (b: Brep, edges: ReadonlyArray<BlendCandidate>, size: number,
style?: "fillet" | "chamfer", options?: BlendOptions) => BlendResult
// BlendResult: brep, blended, vertices (rolling-ball corners), rejected (edge ids), ...
export const recognizeHoles: (b: Brep, options?: HoleRecognitionOptions) => ReadonlyArray<RecognizedHole> في الصندوق - جسم الأسطوانة كان هناك 14 مرشح للمزج؛ selectBlendEdges(c, { parallel: "z" }) اختار 4 الحواف الخارجية الرأسية، و blendBrep(b, sel, 4) تم تعبئة كل 4 مع عدم رفض أي شيء خلال 94 مللي ثانية. يقرأ الثقب من الوجوه وحدها:
[{"entry":{"x":30,"y":20,"z":15},"direction":{"x":0,"y":0,"z":-1},"depth":15,"diameter":12,
"form":"simple","bottom":"through",
"segments":[{"kind":"cylinder","start":0,"end":15,"diameterStart":12,"diameterEnd":12,"faces":[6]}]}] النماذج هي simple, counterbore و countersink; القيعان هي through, flat و drill-point. يقرأ التعرف الوجوه، وليس التاريخ، لذلك يتم التعرف على استيراد STEP والنتيجة المنطقية والجزء البارامتري على حدٍ سواء.
التغطية بالفسيفساء للماء
يتم أخذ عينات من كل حافة مرة واحدة على منحنىها الدقيق وكل وجه يستخدمها يشترك في تلك العينات، وبالتالي فإن الشبكة الملحومة لا تحتوي على شقوق. يتم تثليث الوجوه بواسطة Delaunay المقيدة في مجالها (u، v).
| خيار | تقصير | معنى |
|---|---|---|
| chordTol | 1/2000 من النموذج القطري، مثبت على [0.001، 0.05] ملم | أقصى مسافة بين الشبكة والسطح الدقيق |
| angleTolDeg | 15 | الحد الأقصى للدوران الطبيعي عبر المثلث (تعطيل 0) |
| maxEdge | 0 (لا شيء) | هدف بطول الحافة |
| maxPointsPerFace | 200 000 | غطاء السلامة |
| paramStep | — | وضع التكامل المستخدم بواسطة MassProperties |
لطبق فيليه defaultChordTol عاد 0.0368 ملم و tessellateBrep أنتجت 652 مثلثات بالإضافة إلى شبكات لكل وجه وخطوط متعددة الحواف وتحذيرات.
تبادل الخطوة
writeStepBreps يكتب ملف AP214 (AUTOMOTIVE_DESIGN) بالملليمتر والراديان، ADVANCED_BREP_SHAPE_REPRESENTATION واحد لكل جزء. readStepBreps يقرأ هندسة وطوبولوجيا AP203 وAP214 وAP242، بما في ذلك التجميعات مع تحويلاتها وأسماء منتجاتها. تم الإبلاغ عن كيانات غير معروفة في warnings وتخطيت وجوههم. لا شيء يخمن.
ISO-10303-21;
HEADER;
FILE_DESCRIPTION(('CADCAMFUN exact B-rep'),'2;1');
FILE_NAME('plate','2026-10-15T04:49:21',(''),(''),'CADCAMFUN B-rep kernel','CADCAMFUN','');
FILE_SCHEMA(('AUTOMOTIVE_DESIGN { 1 0 10303 214 1 1 1 1 }'));
ENDSEC;
DATA;
#1=APPLICATION_CONTEXT('core data for automotive mechanical design processes');
#2=APPLICATION_PROTOCOL_DEFINITION('international standard','automotive_design',2000,#1);
#3=PRODUCT_CONTEXT('',#1,'mechanical');
#4=PRODUCT_DEFINITION_CONTEXT('part definition',#1,'design');
#5=(LENGTH_UNIT()NAMED_UNIT(*)SI_UNIT(.MILLI.,.METRE.)); أعطتنا قراءة هذا الملف جزءًا واحدًا حجمه 34097.52220392303 مم³، يساوي النص المكتوب إلى 11 أرقامًا مهمة.
ميزانية الوقت
النواة متزامنة وتعمل على مؤشر ترابط المتصل. withBudget(ms, f) يحدد الموعد النهائي. حلقات طويلة (أزواج وجه منطقية، تقسيم الوجه، تقاطع السطح، التغطية بالفسيفساء) checkBudget، الذي يرمي BudgetExceeded. تحافظ الميزانيات المتداخلة على الموعد النهائي السابق؛ بدون ميزانية، يكلف الشيك مقارنة واحدة.
withBudget(1, () => booleanBrep(makeSphere(10), makeBox(10, 10, 10), "union"))
// BudgetExceeded: the exact model exceeded its time budget of 1 ms استكشاف الأخطاء وإصلاحها
| أعراض | سبب | يصلح |
|---|---|---|
BooleanError | النتيجة المخيطة ليست مادة صلبة متعددة مغلقة (أوجه مماسة أو شبه متطابقة) | تحريك المعامل بعيدًا قليلاً عن الظل؛ تحقق من كلاهما باستخدام validateBrep أولاً |
BudgetExceeded | استغرقت العملية وقتًا أطول من ميزانيتها | تبسيط، أو إعطاء المتصل ميزانية أكبر |
| RangeError من بدائية | حجم غير موجب، أو الحيد الصغير ≥ الكبير | على سبيل المثال "يجب أن يكون نصف قطر الحيد الأصغر أصغر من نصف القطر الأكبر" |
مزيج الحافة في rejected | الوجه ضيق جدًا بالنسبة لنصف القطر أو حافة السكين أو الجدار المائل | نصف قطر أصغر، أو الشطب |
| جزء STEP يفتقد الوجوه | كيان غير معتمد في الملف | يقرأ warnings من readStepBreps |
| مشكلات تقارير validateBrep | الفهرس أو الاتجاه أو خطأ الحافة على السطح في الجسم المبني | العدد يسمي الكيان؛ لا يتم إصلاح أي شيء تلقائيًا |