UNPKG

@polygonjs/polygonjs

Version:

node-based WebGL 3D engine https://polygonjs.com

112 lines (103 loc) 3.57 kB
// import type {OpenCascadeInstance} from 'opencascade.js'; import { // CadGeometry, // CadGeometry, // Geom2d_Curve, // TopoDS_Edge, // TopoDS_Wire, // TopoDS_Vertex, // TopoDS_Shape, // gp_Pnt2d, CadGeometryType, CadTypeMap, // CadTypeMap, // TesselationParams, // cadGeometryTypeFromShape, // cadDowncast, } from './CadCommon'; import {BaseCoreObject} from '../../entities/object/BaseCoreObject'; import {CadObject} from './CadObject'; import {CoreObjectType, MergeCompactOptions, ObjectContent, objectContentCopyProperties} from '../../ObjectContent'; import {Box3, Matrix4, Sphere, Vector3} from 'three'; import {TransformTargetType} from '../../../Transform'; import {ObjectTransformMode, ObjectTransformSpace} from '../../../TransformSpace'; import {cadMergeCompact} from './utils/CadMerge'; import {objectData} from '../../entities/object/BaseCoreObjectUtils'; import {ObjectData} from '../../Constant'; import {CadPoint} from './CadPoint'; import {CadVertex} from './CadVertex'; import {primitiveClassFactoryNonAbstract} from './CadModule'; const _bbox = new Box3(); const _bboxSize = new Vector3(); export class CadCoreObject<T extends CadGeometryType> extends BaseCoreObject<CoreObjectType.CAD> { constructor(protected override _object: CadObject<T>, index: number) { super(_object, index); // if ((_object as TopoDS_Shape).ShapeType) { // const type = cadObjectTypeFromShape(oc, _object as any); // if (type != null && type != _type) { // console.error('got type', type, 'instead of expected', _type); // } // } } type() { return this._object.type; } static fromGeometry<T extends CadGeometryType>(geometry: CadTypeMap[T], type: T) { const cadObject = new CadObject(geometry, type); return new CadCoreObject(cadObject, 0); } override object() { return this._object; } static override position(object: CadObject<CadGeometryType>, target: Vector3) { object.boundingBox(_bbox); _bbox.getCenter(target); } override boundingBox(target: Box3) { this._object.boundingBox(target); } override boundingSphere(target: Sphere) { this.boundingBox(_bbox); _bbox.getSize(_bboxSize); _bbox.getCenter(target.center); const diameter = Math.max(_bboxSize.x, _bboxSize.y, _bboxSize.z); target.radius = diameter * 0.5; } static override objectData<T extends CoreObjectType>(object: ObjectContent<T>): ObjectData { const data = objectData(object); data.pointsCount = CadPoint.entitiesCount(object); data.verticesCount = CadVertex.entitiesCount(object); const primitiveClass = primitiveClassFactoryNonAbstract(object); data.primitivesCount = primitiveClass?.entitiesCount(object) || 0; data.primitiveName = primitiveClass?.primitiveName() || ''; return data; } static override applyMatrix<T extends CadGeometryType>( object: CadObject<T>, matrix: Matrix4, transformTargetType: TransformTargetType, transformSpace: ObjectTransformSpace, transformMode: ObjectTransformMode ) { object.applyMatrix4(matrix); } static override mergeCompact(options: MergeCompactOptions) { const {objects, material, mergedObjects, onError} = options; try { const firstObject = objects[0]; if (!firstObject) { return; } const newObjects = cadMergeCompact(objects as CadObject<CadGeometryType>[]); for (const newObject of newObjects) { objectContentCopyProperties(firstObject, newObject); if (material) { newObject.material = material; } } mergedObjects.push(...newObjects); } catch (e) { onError((e as Error).message || 'unknown error'); } } }