सामग्री पर जाएँ
CADCAMFUN
दस्तावेज़

दस्तावेज़

सटीक बी-प्रतिनिधि कर्नेल

सटीक सीमा प्रतिनिधित्व: विश्लेषणात्मक और NURBS ज्यामिति, बूलियन, फ़िललेट्स, छेद पहचान, द्रव्यमान गुण, सत्यापन, टेसेलेशन और STEP।

अंग्रेज़ी से स्वचालित रूप से अनुवादित। अंग्रेज़ी मूल देखें

बी-रेप कर्नेल क्या है

में सटीक कर्नेल packages/core/src/cad/brep (24 स्रोत फ़ाइलें, लगभग 8 660 लाइनें, साथ ही परीक्षण) ठोस को उनकी सटीक सीमा के आधार पर दर्शाता है: विश्लेषणात्मक और एनयूआरबीएस सतहें, सटीक किनारों के लूप द्वारा छंटनी की गई। सब कुछ सादा डेटा और शुद्ध कार्य है, इसलिए एक बी-प्रतिनिधि JSON में क्रमबद्ध होता है, एक कार्यकर्ता सीमा को पार करता है और परियोजना के इतिहास में अपरिवर्तित रहता है। बूलियन, फ़िललेट्स और चैंफ़र, छेद पहचान, द्रव्यमान गुण, सत्यापन, वॉटरटाइट टेस्सेलेशन और एसटीईपी एक्सचेंज सभी इस एक संरचना पर काम करते हैं।

घटाव और फ़िललेट के बाद सटीक प्लेट कक्षा में खींचें · ज़ूम करने के लिए स्क्रॉल करें · पैन करने के लिए दाईं ओर खींचें
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
कोएजलूप द्वारा किनारे का एक उपयोग: किनारा सूचकांक, उलटा, चेहरे में वैकल्पिक पी-वक्र (यू, वी)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 में पाइगल और टिलर एल्गोरिदम)
सटीक आदिम, टेस्सेलेटेड कक्षा में खींचें · ज़ूम करने के लिए स्क्रॉल करें · पैन करने के लिए दाईं ओर खींचें
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 कक्षा में खींचें · ज़ूम करने के लिए स्क्रॉल करें · पैन करने के लिए दाईं ओर खींचें
मेकटोरस(20, 5): एक एकल टोरॉयडल चेहरा जिसमें एक सीवन है और कोई अन्य किनारा नहीं है, जो कॉर्डटोल 1 और 30° पर टेस्सेलेटेड है। सटीक आयतन 2π²Rr² = 9 869.604 mm³ वह है जो MassProperties लौटाता है।

सटीक बूलियन्स

  1. प्रतिच्छेद. प्रत्येक ठोस के किनारों को दूसरे के चेहरों के विपरीत (न्यूटन द्वारा सटीक बिंदु), दूसरे ठोस की सतहों पर स्थित किनारे, और गैर-संयोग चेहरों की प्रत्येक जोड़ी के चौराहे के वक्र, दोनों सतहों पर परिष्कृत होते हैं और रेखाओं और वृत्तों के रूप में पहचाने जाते हैं, अन्यथा फिट सहनशीलता के भीतर क्यूबिक बी-स्प्लिन के रूप में फिट होते हैं।
  2. छाप. प्रत्येक प्रतिच्छेदन बिंदु दोनों ठोस पदार्थों के लिए एक रजिस्ट्री में एक शीर्ष बन जाता है, किनारों को वहां विभाजित किया जाता है, और प्रत्येक चेहरे को उसके (यू, वी) डोमेन में एक समतल व्यवस्था के माध्यम से उस पर वक्र द्वारा काटा जाता है।
  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 आयात, एक बूलियन परिणाम और एक पैरामीट्रिक भाग को समान रूप से पहचाना जाता है।

वॉटरटाइट टेस्सेलेशन

प्रत्येक किनारे का उसके सटीक वक्र पर एक बार नमूना लिया जाता है और इसका उपयोग करने वाला प्रत्येक चेहरा उन नमूनों को साझा करता है, इसलिए वेल्डेड जाल में कोई दरार नहीं होती है। चेहरों को उनके (यू, वी) डोमेन में विवश डेलाउने द्वारा त्रिकोणित किया जाता है।

विकल्पगलती करनाअर्थ
chordTolमॉडल के विकर्ण का 1/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 एपी 203, एपी 214 और एपी 242 ज्यामिति और टोपोलॉजी को पढ़ता है, जिसमें उनके परिवर्तनों और उत्पाद नामों के साथ असेंबली भी शामिल है। अज्ञात संस्थाओं की सूचना दी गई है 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ऑपरेशन में उसके बजट से अधिक समय लगासरल बनाएं, या कॉल करने वाले को बड़ा बजट दें
एक आदिम से रेंज त्रुटिगैर-सकारात्मक आकार, या टोरस माइनर ≥ मेजरजैसे "टोरस लघु त्रिज्या प्रमुख त्रिज्या से छोटी होनी चाहिए"
किनारे को मिलाएँ rejectedत्रिज्या, चाकू की धार या तिरछी दीवार के लिए चेहरा बहुत संकीर्ण हैछोटी त्रिज्या, या एक कक्ष
चरण भाग में चेहरे गायब हैंफ़ाइल में असमर्थित इकाईपढ़ना warnings रीडस्टेपब्रेप्स से
validateBrep मुद्दों की रिपोर्ट करता हैकिसी निर्मित बॉडी में इंडेक्स, ओरिएंटेशन या किनारे-पर-सतह त्रुटिमुद्दा इकाई का नाम देता है; कुछ भी स्वचालित रूप से मरम्मत नहीं किया जाता है