UNPKG

@bitbybit-dev/core

Version:

Bit By Bit Developers Core CAD API to Program Geometry

168 lines (167 loc) 6.43 kB
/** * 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]); } }