@bitbybit-dev/core
Version:
Bit By Bit Developers Core CAD API to Program Geometry
168 lines (167 loc) • 6.43 kB
JavaScript
/**
* Base class for Draw implementations across all game engines.
* Contains entity detection methods and shared validation utilities.
*/
export class DrawCore {
// ============== Entity Detection Methods ==============
detectPoint(entity) {
return (Array.isArray(entity) && entity.length === 3 && this.checkIfElementsInArrayAreNumbers(entity));
}
detectPoints(entity) {
return Array.isArray(entity) &&
this.checkIfElementsInArrayAreArrays(entity) &&
this.arraysInChildrenArraysContainNumbers(entity) &&
this.arraysInChildrenArraysAreOfLength3(entity);
}
detectLine(entity) {
if (!entity || typeof entity !== "object")
return false;
const obj = entity;
return (obj.start && obj.end && Array.isArray(obj.start) && Array.isArray(obj.end)) ||
(Array.isArray(entity) && entity.length === 2 &&
Array.isArray(entity[0]) && Array.isArray(entity[1]) &&
this.checkIfElementsInArrayAreNumbers(entity[0]) && entity[0].length === 3 &&
this.checkIfElementsInArrayAreNumbers(entity[1]) && entity[1].length === 3);
}
detectLines(entity) {
return Array.isArray(entity) && !entity.some(el => !this.detectLine(el));
}
detectPolyline(entity) {
if (!entity || typeof entity !== "object")
return false;
const obj = entity;
return obj.points !== undefined && Array.isArray(obj.points);
}
detectPolylines(entity) {
return Array.isArray(entity) && !entity.some(el => !this.detectPolyline(el));
}
detectNode(entity) {
if (!entity || typeof entity !== "object" || Array.isArray(entity))
return false;
const obj = entity;
return typeof obj.id === "string" && obj.id.includes("node");
}
detectNodes(entity) {
return Array.isArray(entity) && !entity.some(el => !this.detectNode(el));
}
detectVerbCurve(entity) {
if (!entity || typeof entity !== "object" || Array.isArray(entity))
return false;
const obj = entity;
const data = obj._data;
return data !== undefined && data.controlPoints !== undefined && data.knots !== undefined && data.degree !== undefined;
}
detectVerbSurface(entity) {
if (!entity || typeof entity !== "object" || Array.isArray(entity))
return false;
const obj = entity;
const data = obj._data;
return data !== undefined && data.controlPoints !== undefined &&
data.degreeU !== undefined && data.degreeV !== undefined &&
data.knotsU !== undefined && data.knotsV !== undefined;
}
detectVerbCurves(entity) {
return Array.isArray(entity) && !entity.some(el => !this.detectVerbCurve(el));
}
detectVerbSurfaces(entity) {
return Array.isArray(entity) && !entity.some(el => !this.detectVerbSurface(el));
}
detectJscadMesh(entity) {
if (!entity || typeof entity !== "object" || Array.isArray(entity))
return false;
const obj = entity;
return obj.sides !== undefined || obj.polygons !== undefined;
}
detectJscadMeshes(entity) {
return Array.isArray(entity) && !entity.some(el => !this.detectJscadMesh(el));
}
detectOcctShape(entity) {
if (!entity || typeof entity !== "object")
return false;
const obj = entity;
return obj.type === "occ-shape";
}
detectOcctShapes(entity) {
return Array.isArray(entity) && !entity.some(el => !this.detectOcctShape(el));
}
detectManifoldShape(entity) {
if (!entity || typeof entity !== "object")
return false;
const obj = entity;
return obj.type === "manifold-shape";
}
detectManifoldShapes(entity) {
return Array.isArray(entity) && !entity.some(el => !this.detectManifoldShape(el));
}
detectDecomposedMesh(entity) {
if (!entity || typeof entity !== "object" || Array.isArray(entity))
return false;
const obj = entity;
if (obj.type === "occ-shape" || obj.type === "manifold-shape")
return false;
return Array.isArray(obj.faceList) || Array.isArray(obj.edgeList) || Array.isArray(obj.pointsList);
}
detectDecomposedMeshes(entity) {
return Array.isArray(entity) && entity.length > 0 && !entity.some(el => !this.detectDecomposedMesh(el));
}
detectTag(entity) {
if (!entity || typeof entity !== "object" || Array.isArray(entity))
return false;
const obj = entity;
return obj.text !== undefined;
}
detectTags(entity) {
return Array.isArray(entity) && !entity.some(el => !this.detectTag(el));
}
// ============== Array Validation Helpers ==============
checkIfElementsInArrayAreNumbers(array) {
return !array.some(el => typeof el !== "number" || isNaN(el));
}
checkIfElementsInArrayAreArrays(array) {
return !array.some(el => !Array.isArray(el));
}
arraysInChildrenArraysContainNumbers(array) {
return !array.some(el => !this.checkIfElementsInArrayAreNumbers(el));
}
arraysInChildrenArraysAreOfLength3(array) {
return !array.some(el => el.length !== 3);
}
// ============== Input Validation Methods ==============
/**
* Validate if draw input contains valid entity data
* @param entity - Entity to validate
* @returns True if valid, false otherwise
*/
isValidDrawInput(entity) {
// Null or undefined
if (entity === null || entity === undefined) {
return false;
}
// Empty array
if (Array.isArray(entity) && entity.length === 0) {
return false;
}
return true;
}
/**
* Type guard for Tag DTO
* @param value - Value to check
* @returns True if value has text property (TagDto)
*/
isTagDto(value) {
return value !== null &&
value !== undefined &&
typeof value === "object" &&
"text" in value;
}
/**
* Type guard for Tag DTO array
* @param value - Value to check
* @returns True if value is array of TagDtos
*/
isTagDtoArray(value) {
return Array.isArray(value) &&
value.length > 0 &&
this.isTagDto(value[0]);
}
}