दस्तावेज़
सटीक बी-प्रतिनिधि कर्नेल
सटीक सीमा प्रतिनिधित्व: विश्लेषणात्मक और NURBS ज्यामिति, बूलियन, फ़िललेट्स, छेद पहचान, द्रव्यमान गुण, सत्यापन, टेसेलेशन और STEP।
अंग्रेज़ी से स्वचालित रूप से अनुवादित। अंग्रेज़ी मूल देखें
बी-रेप कर्नेल क्या है
में सटीक कर्नेल packages/core/src/cad/brep (24 स्रोत फ़ाइलें, लगभग 8 660 लाइनें, साथ ही परीक्षण) ठोस को उनकी सटीक सीमा के आधार पर दर्शाता है: विश्लेषणात्मक और एनयूआरबीएस सतहें, सटीक किनारों के लूप द्वारा छंटनी की गई। सब कुछ सादा डेटा और शुद्ध कार्य है, इसलिए एक बी-प्रतिनिधि JSON में क्रमबद्ध होता है, एक कार्यकर्ता सीमा को पार करता है और परियोजना के इतिहास में अपरिवर्तित रहता है। बूलियन, फ़िललेट्स और चैंफ़र, छेद पहचान, द्रव्यमान गुण, सत्यापन, वॉटरटाइट टेस्सेलेशन और एसटीईपी एक्सचेंज सभी इस एक संरचना पर काम करते हैं।
टोपोलॉजी टेबल
A Brep सूचकांक तालिकाओं का एक सेट है। संस्थाएँ एक दूसरे को सूचकांक द्वारा संदर्भित करती हैं, वस्तु संदर्भ द्वारा कभी नहीं।
| इकाई | रखती है | कदम समकक्ष |
|---|---|---|
| शिखर | बिंदु, सहनशीलता | VERTEX_POINT |
| किनारा | exact curve, [t0, t1] with t0 < t1, v0 = C(t0), v1 = C(t1), tolerance | EDGE_CURVE |
| कोएज | लूप द्वारा किनारे का एक उपयोग: किनारा सूचकांक, उलटा, चेहरे में वैकल्पिक पी-वक्र (यू, वी) | ORIENTED_EDGE + PCURVE |
| कुंडली | सह-किनारों का बंद चक्र; बाईं ओर की सामग्री बाहर से देखी गई (बाहरी 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 + r(cos t·x + 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 |
| nurbs के | तर्कसंगत बी-स्पलाइन वक्र या सतह (nurbs.ts में पाइगल और टिलर एल्गोरिदम) |
सटीक बूलियन्स
- प्रतिच्छेद. प्रत्येक ठोस के किनारों को दूसरे के चेहरों के विपरीत (न्यूटन द्वारा सटीक बिंदु), दूसरे ठोस की सतहों पर स्थित किनारे, और गैर-संयोग चेहरों की प्रत्येक जोड़ी के चौराहे के वक्र, दोनों सतहों पर परिष्कृत होते हैं और रेखाओं और वृत्तों के रूप में पहचाने जाते हैं, अन्यथा फिट सहनशीलता के भीतर क्यूबिक बी-स्प्लिन के रूप में फिट होते हैं।
- छाप. प्रत्येक प्रतिच्छेदन बिंदु दोनों ठोस पदार्थों के लिए एक रजिस्ट्री में एक शीर्ष बन जाता है, किनारों को वहां विभाजित किया जाता है, और प्रत्येक चेहरे को उसके (यू, वी) डोमेन में एक समतल व्यवस्था के माध्यम से उस पर वक्र द्वारा काटा जाता है।
- वर्गीकृत करें. प्रत्येक टुकड़े के अंदर एक बिंदु दूसरे ठोस के विपरीत स्थित होता है: अंदर, बाहर, या समान या विपरीत अभिविन्यास के साथ।
- सिलना। टुकड़ों को ऑपरेशन के नियमों के अनुसार रखा जाता है, संयोग वाले टुकड़े एक किनारे बन जाते हैं, समतलीय पड़ोसी विलीन हो जाते हैं, और परिणाम मान्य होता है। एक परिणाम जो एक बंद मैनिफोल्ड ठोस फेंकता नहीं है
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 आयात, एक बूलियन परिणाम और एक पैरामीट्रिक भाग को समान रूप से पहचाना जाता है।
वॉटरटाइट टेस्सेलेशन
प्रत्येक किनारे का उसके सटीक वक्र पर एक बार नमूना लिया जाता है और इसका उपयोग करने वाला प्रत्येक चेहरा उन नमूनों को साझा करता है, इसलिए वेल्डेड जाल में कोई दरार नहीं होती है। चेहरों को उनके (यू, वी) डोमेन में विवश डेलाउने द्वारा त्रिकोणित किया जाता है।
| विकल्प | गलती करना | अर्थ |
|---|---|---|
| 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 एपी 203, एपी 214 और एपी 242 ज्यामिति और टोपोलॉजी को पढ़ता है, जिसमें उनके परिवर्तनों और उत्पाद नामों के साथ असेंबली भी शामिल है। अज्ञात संस्थाओं की सूचना दी गई है 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 | ऑपरेशन में उसके बजट से अधिक समय लगा | सरल बनाएं, या कॉल करने वाले को बड़ा बजट दें |
| एक आदिम से रेंज त्रुटि | गैर-सकारात्मक आकार, या टोरस माइनर ≥ मेजर | जैसे "टोरस लघु त्रिज्या प्रमुख त्रिज्या से छोटी होनी चाहिए" |
किनारे को मिलाएँ rejected | त्रिज्या, चाकू की धार या तिरछी दीवार के लिए चेहरा बहुत संकीर्ण है | छोटी त्रिज्या, या एक कक्ष |
| चरण भाग में चेहरे गायब हैं | फ़ाइल में असमर्थित इकाई | पढ़ना warnings रीडस्टेपब्रेप्स से |
| validateBrep मुद्दों की रिपोर्ट करता है | किसी निर्मित बॉडी में इंडेक्स, ओरिएंटेशन या किनारे-पर-सतह त्रुटि | मुद्दा इकाई का नाम देता है; कुछ भी स्वचालित रूप से मरम्मत नहीं किया जाता है |