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

الوثائق

نواة B-rep الدقيقة

التمثيل الدقيق للحدود: الهندسة التحليلية وهندسة NURBS، والقيم المنطقية، والشرائح، والتعرف على الثقب، وخصائص الكتلة، والتحقق من الصحة، والفسيفساء، وSTEP.

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

ما هي نواة B-rep

النواة الدقيقة في packages/core/src/cad/brep (24 ملفات مصدر، حوالي 8 660 من الخطوط، بالإضافة إلى الاختبارات) تمثل المواد الصلبة بحدودها الدقيقة: الأسطح التحليلية وأسطح NURBS، المشذبة بحلقات ذات حواف دقيقة. كل شيء عبارة عن بيانات بسيطة ووظائف خالصة، لذا فإن B-rep يتسلسل إلى JSON، ويعبر حدود العامل ويختلف في تاريخ المشروع دون تغيير. القيم المنطقية، والشرائح، والحواف، والتعرف على الثقب، وخصائص الكتلة، والتحقق من الصحة، والفسيفساء المانعة لتسرب الماء، وتبادل STEP كلها تعمل على هذا الهيكل الواحد.

لوحة بالضبط بعد طرح وشرائح اسحب إلى المدار · قم بالتمرير للتكبير · اسحب بزر الماوس الأيمن للتحريك
A 60 × 40 × 15 box minus a Ø12 cylinder (booleanBrep), then the four vertical edges filleted R4 (blendBrep). Mesh from brepToMesh at chordTol 0.05. 18 vertices, 27 edges, 11 faces; exact volume 34 097.522 mm³.

جداول الطوبولوجيا

A Brep عبارة عن مجموعة من جداول الفهرس. تشير الكيانات إلى بعضها البعض عن طريق الفهرس، وليس عن طريق مرجع الكائن أبدًا.

كيانيحملنظير الخطوة
قمة الرأسنقطة، التسامحVERTEX_POINT
حافةexact curve, [t0, t1] with t0 < t1, v0 = C(t0), v1 = C(t1), toleranceEDGE_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)
البدائيات الدقيقة، مرصوفة بالفسيفساء اسحب إلى المدار · قم بالتمرير للتكبير · اسحب بزر الماوس الأيمن للتحريك
makeBox(10,10,10), makeCylinder(5,10), makeCone(5,2,10) and makeSphere(5), each tessellated by brepToMesh at chordTol 0.2 (12, 430, 122 and 1810 triangles) and placed side by side.
توروس ر20 ص5 اسحب إلى المدار · قم بالتمرير للتكبير · اسحب بزر الماوس الأيمن للتحريك
makeTorus(20, 5): وجه حلقي واحد مع خط التماس ولا توجد حواف أخرى، مرصع بالفسيفساء عند chordTol 1 و 30°. الحجم الدقيق 2π²Rr² = 9 869.604 mm³ هو ما تُرجعه MassProperties.

القيم المنطقية الدقيقة

  1. تتقاطع. حواف كل مادة صلبة مقابل أوجه المادة الأخرى (النقاط المحددة حسب نيوتن)، والحواف الموجودة على أسطح المادة الصلبة الأخرى، ومنحنيات التقاطع لكل زوج من الوجوه غير المتطابقة، مصقولة على كلا السطحين ومعترف بها كخطوط ودوائر، وإلا يتم تركيبها كخطوط B مكعبة ضمن التسامح المناسب.
  2. بصمة. تصبح كل نقطة تقاطع قمة في سجل واحد لكلا المجسمين، ويتم تقسيم الحواف هناك، ويتم قطع كل وجه بواسطة المنحنيات الموجودة عليه من خلال ترتيب مستو في مجاله (u، v).
  3. تصنيف. توجد نقطة داخل كل قطعة مقابل المادة الصلبة الأخرى: للداخل أو للخارج أو للداخل بنفس الاتجاه أو الاتجاه المعاكس.
  4. خاط. يتم الاحتفاظ بالأجزاء وفقًا لقواعد العملية، وتصبح القطع المتطابقة حافة واحدة، ويتم دمج الجيران المستويين، ويتم التحقق من صحة النتيجة. والنتيجة ليست رميات صلبة متعددة مغلقة BooleanError; لم يتم إرجاعه أبدًا.
boolean.ts
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.5399670615134303.539967061515
نفس المنطقة8139.2920065876848139.292006587698
نفسه، النقطه الوسطى(30.000, 20.000, 7.500)(30, 20, 7.5)
المجال r10، الحجم4188.7902047863794188.790204786391
الحيد 20/5، المجلد9869.604401094759869.604401089358
لوحة فيليه، الحجم34097.5222039230234097.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).

خيارتقصيرمعنى
chordTol1/2000 من النموذج القطري، مثبت على [0.001، 0.05] ملمأقصى مسافة بين الشبكة والسطح الدقيق
angleTolDeg15الحد الأقصى للدوران الطبيعي عبر المثلث (تعطيل 0)
maxEdge0 (لا شيء)هدف بطول الحافة
maxPointsPerFace200 000غطاء السلامة
paramStep—وضع التكامل المستخدم بواسطة MassProperties

لطبق فيليه defaultChordTol عاد 0.0368 ملم و tessellateBrep أنتجت 652 مثلثات بالإضافة إلى شبكات لكل وجه وخطوط متعددة الحواف وتحذيرات.

تبادل الخطوة

writeStepBreps يكتب ملف AP214 (AUTOMOTIVE_DESIGN) بالملليمتر والراديان، ADVANCED_BREP_SHAPE_REPRESENTATION واحد لكل جزء. readStepBreps يقرأ هندسة وطوبولوجيا AP203 وAP214 وAP242، بما في ذلك التجميعات مع تحويلاتها وأسماء منتجاتها. تم الإبلاغ عن كيانات غير معروفة في warnings وتخطيت وجوههم. لا شيء يخمن.
writeStepBreps([{ name: "plate", brep }]) — first lines of the real 358-line file
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الفهرس أو الاتجاه أو خطأ الحافة على السطح في الجسم المبنيالعدد يسمي الكيان؛ لا يتم إصلاح أي شيء تلقائيًا