This commit is contained in:
ch197511161
2025-12-11 01:29:41 +08:00
parent 908b4361ed
commit ddce8fce18
473 changed files with 267270 additions and 0 deletions

View File

@@ -0,0 +1,22 @@
# poseidon-engine-core
This is the core of rendering engine. shared by all rendering project.
use can use submodule to reference this project,
or use package created by poseidon-engine-core-wrap project.
## Breaking Changes
1. 2022-12-29. Avoid export classes as default export, user need to change the way of import.
2. 2022-12-29. to run in node, user need to import 'canvas-gl' and invoke init() function to register the font for canvas before create NodeWebGLRenderer.
3. 2022-12-20. import the classes from 'poseidon-engine-core'
4. 2022-12-20. rename file MeshLineExMaterial, rename MeLineColorMapMaterialParameters to LineColorMapMaterialParameters
5. 2023-1-28. move after-projection-matrix from materials into cameras. do not need to update shaders any more.
6. 2023-2-9. support color mapped materials. use ColorMapExMaterials instead. TODO: support filters later.
## Version History
### v0.2.0
1. 修复ScreenHelper.focusCamera连续多次调用的bug
2. 修改Legend拼写错误

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

View File

@@ -0,0 +1 @@
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1656572456155" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="47431" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><defs><style type="text/css"></style></defs><path d="M141.84448 228.97664a25.6 25.6 0 0 0-8.6528 35.15392l330.61376 546.51392a56.32 56.32 0 0 0 19.03616 19.03616c26.61376 16.1024 61.24032 7.5776 77.34272-19.03616l330.61376-546.51392A25.6 25.6 0 0 0 868.8896 225.28H155.09504a25.6 25.6 0 0 0-13.25056 3.69664zM868.8896 174.08c42.4192 0 76.8 34.38592 76.8 76.8a76.8 76.8 0 0 1-11.0848 39.75168l-330.61376 546.51392c-30.73536 50.81088-96.83968 67.08224-147.65056 36.34688a107.52 107.52 0 0 1-36.34176-36.34688L89.38496 290.6368c-21.95456-36.3008-10.33216-83.51232 25.9584-105.472A76.8 76.8 0 0 1 155.09504 174.08h713.79456z" fill="#bfbfbf" p-id="47432"></path></svg>

After

Width:  |  Height:  |  Size: 988 B

View File

@@ -0,0 +1 @@
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1656572420938" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="46589" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><defs><style type="text/css"></style></defs><path d="M795.02336 141.85472a25.6 25.6 0 0 0-35.15392-8.6528L213.35552 463.81568a56.32 56.32 0 0 0-19.03616 19.03616c-16.1024 26.61376-7.5776 61.24032 19.03616 77.34272l546.51392 330.60864a25.6 25.6 0 0 0 38.85056-21.90336V155.10528a25.6 25.6 0 0 0-3.69664-13.25056zM849.92 868.89984c0 42.4192-34.38592 76.8-76.8 76.8a76.8 76.8 0 0 1-39.75168-11.0848L186.8544 604.00128c-50.81088-30.73536-67.08224-96.8448-36.34688-147.65056a107.52 107.52 0 0 1 36.34688-36.34176l546.5088-330.61376c36.3008-21.95456 83.51232-10.33216 105.472 25.9584A76.8 76.8 0 0 1 849.92 155.10528v713.79456z" fill="#bfbfbf" p-id="46590"></path></svg>

After

Width:  |  Height:  |  Size: 989 B

View File

@@ -0,0 +1 @@
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1656572433880" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="46874" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><defs><style type="text/css"></style></defs><path d="M228.97664 141.85472A25.6 25.6 0 0 0 225.28 155.10528v713.79456a25.6 25.6 0 0 0 38.85056 21.90336l546.51392-330.60864c26.61376-16.1024 35.13856-50.72896 19.03616-77.34272a56.32 56.32 0 0 0-19.03616-19.03616L264.13056 133.20192a25.6 25.6 0 0 0-35.15392 8.6528zM174.08 868.89984V155.10528a76.8 76.8 0 0 1 11.08992-39.75168c21.95456-36.29056 69.1712-47.91296 105.46176-25.9584l546.51392 330.61376a107.52 107.52 0 0 1 36.34688 36.34176c30.73536 50.80576 14.464 116.9152-36.34688 147.65056l-546.5088 330.61376A76.8 76.8 0 0 1 250.88 945.69984c-42.41408 0-76.8-34.3808-76.8-76.8z" fill="#bfbfbf" p-id="46875"></path></svg>

After

Width:  |  Height:  |  Size: 994 B

View File

@@ -0,0 +1 @@
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1656572448124" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="47179" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><defs><style type="text/css"></style></defs><path d="M882.12992 795.01824a25.6 25.6 0 0 0 8.6528-35.15392L560.16896 213.34528a56.32 56.32 0 0 0-19.03616-19.03616c-26.61376-16.09728-61.2352-7.5776-77.3376 19.03616L133.18144 759.86432a25.6 25.6 0 0 0 21.90336 38.85056h713.79456a25.6 25.6 0 0 0 13.25056-3.69664zM155.0848 849.91488c-42.41408 0-76.8-34.38592-76.8-76.8a76.8 76.8 0 0 1 11.08992-39.75168L419.98848 186.84416c30.73536-50.80576 96.83968-67.07712 147.64544-36.34176a107.52 107.52 0 0 1 36.34688 36.34176l330.61376 546.51904c21.95456 36.29056 10.32704 83.5072-25.9584 105.46176a76.8 76.8 0 0 1-39.7568 11.08992H155.0848z" fill="#bfbfbf" p-id="47180"></path></svg>

After

Width:  |  Height:  |  Size: 996 B

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1 @@
export * from './src';

View File

@@ -0,0 +1,16 @@
import { BRepBody, IBRepCompObj } from './BRepBody';
export interface IAssemblyProps {
name: string;
}
export interface IAssembly {
subAssemblies: IAssembly[];
bodies: BRepBody[];
props?: IAssemblyProps;
}
export declare class BRepAssembly implements IAssembly {
readonly subAssemblies: IAssembly[];
readonly bodies: BRepBody[];
props?: IAssemblyProps;
name(): string | undefined;
static fromCompound(comObj: IBRepCompObj): BRepAssembly | null;
}

View File

@@ -0,0 +1,127 @@
import { SupBox } from '../types';
import { BRepEdge } from './BRepEdge';
import { BRepFace } from './BRepFace';
import { BRepObject, IBRepProps } from './BRepObject';
import { BRepShell } from './BRepShell';
import { BRepSolid } from './BRepSolid';
import { BodyType, ShapeType } from './BRepType';
import { BRepVertex } from './BRepVertex';
import { BRepWire } from './BRepWire';
/**
* @brief BRep body基类
*
*/
export declare abstract class BRepBody {
/**
* @brief body类型
*
* @return
* -<em>body 类型</em>
*/
abstract bodyType(): BodyType;
/**
* @brief 转换为特定body类型
* @param
*
* @return
* -<em>相应类型body</em>
*/
toSolid(): BRepSolidBody;
toShell(): BRepShellBody;
toWire(): BRepWireBody;
toAcorn(): BRepAcornBody;
toCompound(): BRepCompoundBody;
findVertex(name: string | string[]): BRepVertex | undefined;
findEdge(name: string | string[]): BRepEdge | undefined;
findFace(name: string | string[]): BRepFace | undefined;
findWire(name: string | string[]): BRepWire | undefined;
findShell(name: string | string[]): BRepShell | undefined;
findSolid(name: string | string[]): BRepSolid | undefined;
findBRepObject(name: string | string[]): BRepObject | undefined;
abstract bndBox(): SupBox;
protected static calcuBox(obj: BRepObject): SupBox;
}
/**
* @brief 实体类型body
*
*/
export declare class BRepSolidBody extends BRepBody {
readonly solid: BRepSolid;
constructor(solid: BRepSolid);
bodyType(): BodyType;
toSolid(): BRepSolidBody;
findVertex(name: string | string[]): BRepVertex | undefined;
findEdge(name: string | string[]): BRepEdge | undefined;
findFace(name: string | string[]): BRepFace | undefined;
findSolid(name: string | string[]): BRepSolid | undefined;
bndBox(): SupBox;
}
/**
* @brief 壳类型body
*
*/
export declare class BRepShellBody extends BRepBody {
readonly shell: BRepShell;
constructor(shell: BRepShell);
bodyType(): BodyType;
toShell(): BRepShellBody;
findVertex(name: string | string[]): BRepVertex | undefined;
findEdge(name: string | string[]): BRepEdge | undefined;
findFace(name: string | string[]): BRepFace | undefined;
findShell(name: string | string[]): BRepShell | undefined;
bndBox(): SupBox;
}
/**
* @brief wire 类型body
*
*/
export declare class BRepWireBody extends BRepBody {
readonly wire: BRepWire;
constructor(wire: BRepWire);
toWire(): BRepWireBody;
bodyType(): BodyType;
findVertex(name: string | string[]): BRepVertex | undefined;
findEdge(name: string | string[]): BRepEdge | undefined;
findWire(name: string | string[]): BRepWire | undefined;
bndBox(): SupBox;
}
/**
* @brief acorn类型body
*
*/
export declare class BRepAcornBody extends BRepBody {
readonly point: BRepVertex;
constructor(point: BRepVertex);
bodyType(): BodyType;
toAcorn(): BRepAcornBody;
findVertex(name: string | string[]): BRepVertex | undefined;
bndBox(): SupBox;
}
/**
* @brief compound类型body
*
*/
export declare class BRepCompoundBody extends BRepBody {
readonly solids: BRepSolid[];
readonly shells: BRepShell[];
readonly wires: BRepWire[];
readonly acorns: BRepVertex[];
bodyType(): BodyType;
toCompound(): BRepCompoundBody;
addSubShape(obj: IBRepObj): boolean;
findVertex(name: string | string[]): BRepVertex | undefined;
findEdge(name: string | string[]): BRepEdge | undefined;
findFace(name: string | string[]): BRepFace | undefined;
findSolid(name: string | string[]): BRepSolid | undefined;
findShell(name: string | string[]): BRepShell | undefined;
findWire(name: string | string[]): BRepWire | undefined;
bndBox(): SupBox;
}
export interface IBRepObj {
type: ShapeType;
props?: IBRepProps;
}
export interface IBRepCompObj extends IBRepObj {
subShapes: IBRepObj[];
}
export declare const createBRepBody: (obj: IBRepObj) => BRepBody | null;

View File

@@ -0,0 +1,20 @@
import { CurveType } from '../geom/CurveType';
import { Polygon } from '../geom/Polygon';
import { BRepObject } from './BRepObject';
import { ShapeType } from './BRepType';
import { BRepVertex } from './BRepVertex';
/**
* @brief BRep边对象
*
*/
export declare class BRepEdge extends BRepObject {
readonly geomType: CurveType;
readonly polygon: Polygon;
readonly start: BRepVertex;
readonly end: BRepVertex;
constructor(obj: any, parent: BRepObject);
isGeom(): boolean;
getAllEdges(): BRepEdge[];
getAllVertices(): BRepVertex[];
shapeType(): ShapeType;
}

View File

@@ -0,0 +1,23 @@
import { SurfaceType } from '../geom/SurfaceType';
import { Triangulation } from '../geom/Triangulation';
import { BRepEdge } from './BRepEdge';
import { BRepLoop } from './BRepLoop';
import { BRepObject } from './BRepObject';
import { ShapeType } from './BRepType';
import { BRepVertex } from './BRepVertex';
/**
* @brief 边界面类型
*
*/
export declare class BRepFace extends BRepObject {
readonly geomType: SurfaceType;
readonly triangulation: Triangulation;
readonly loops: BRepLoop[];
constructor(obj: any, parent: BRepObject);
hasInnerLoop(): boolean;
isGeom(): boolean;
getAllFaces(): BRepFace[];
getAllEdges(): BRepEdge[];
getAllVertices(): BRepVertex[];
shapeType(): ShapeType;
}

View File

@@ -0,0 +1,17 @@
import { BRepEdge } from './BRepEdge';
import { BRepObject } from './BRepObject';
import { ShapeType } from './BRepType';
import { BRepVertex } from './BRepVertex';
/**
* @brief 半边对象
*
*/
export declare class BRepHalfEdge extends BRepObject {
readonly edge: BRepEdge;
readonly reversed: boolean;
constructor(parent: BRepObject, obj: any);
shapeType(): ShapeType;
isGeom(): boolean;
getAllEdges(): BRepEdge[];
getAllVertices(): BRepVertex[];
}

View File

@@ -0,0 +1,18 @@
import { BRepEdge } from './BRepEdge';
import { BRepHalfEdge } from './BRepHalfEdge';
import { BRepObject } from './BRepObject';
import { ShapeType } from './BRepType';
import { BRepVertex } from './BRepVertex';
/**
* @brief BRep环对象用于限定Face的边界
*
*/
export declare class BRepLoop extends BRepObject {
readonly halfEdges: BRepHalfEdge[];
readonly isOut: boolean;
constructor(parent: BRepObject | null, obj: any);
shapeType(): ShapeType;
isGeom(): boolean;
getAllEdges(): BRepEdge[];
getAllVertices(): BRepVertex[];
}

View File

@@ -0,0 +1,29 @@
import { BRepBody } from './BRepBody';
import { BRepEdge } from './BRepEdge';
import { BRepFace } from './BRepFace';
import { ShapeType } from './BRepType';
import { BRepVertex } from './BRepVertex';
export interface IBRepProps {
name: string | string[];
color?: number;
}
/**
* @brief BRep对象接口
*
*/
export declare abstract class BRepObject {
parent: BRepObject | null;
props?: IBRepProps;
constructor(parent: BRepObject | null, obj: any);
name(): string | string[] | undefined;
abstract shapeType(): ShapeType;
abstract isGeom(): boolean;
findEdge(_name: string | string[]): BRepEdge | undefined;
findFace(_name: string | string[]): BRepFace | undefined;
findVertex(_name: string | string[]): BRepVertex | undefined;
getAllFaces(): BRepFace[];
getAllEdges(): BRepEdge[];
getAllVertices(): BRepVertex[];
static findBRep(name: string | string[], array: BRepObject[]): BRepObject | undefined;
body(): BRepBody;
}

View File

@@ -0,0 +1,27 @@
import { BRepBody } from './BRepBody';
import { BRepEdge } from './BRepEdge';
import { BRepFace } from './BRepFace';
import { BRepObject } from './BRepObject';
import { ShapeType } from './BRepType';
import { BRepVertex } from './BRepVertex';
/**
* @brief BRep壳对象壳对象包含面、边和顶点
*
*/
export declare class BRepShell extends BRepObject {
readonly faces: BRepFace[];
readonly edges: BRepEdge[];
readonly vertices: BRepVertex[];
private wrappedBody;
constructor(obj: any, parent?: BRepObject | null);
findVertex(name: string | string[]): BRepVertex | undefined;
findEdge(name: string | string[]): BRepEdge | undefined;
findFace(name: string | string[]): BRepFace | undefined;
shapeType(): ShapeType;
isGeom(): boolean;
getAllFaces(): BRepFace[];
getAllEdges(): BRepEdge[];
getAllVertices(): BRepVertex[];
body(): BRepBody;
setBody(body: BRepBody): void;
}

View File

@@ -0,0 +1,26 @@
import { BRepBody } from './BRepBody';
import { BRepEdge } from './BRepEdge';
import { BRepFace } from './BRepFace';
import { BRepObject } from './BRepObject';
import { BRepShell } from './BRepShell';
import { ShapeType } from './BRepType';
import { BRepVertex } from './BRepVertex';
/**
* @brief BRep实体对象
*
*/
export declare class BRepSolid extends BRepObject {
readonly shells: BRepShell[];
private wrappedBody;
constructor(obj: any);
shapeType(): ShapeType;
isGeom(): boolean;
findVertex(name: string | string[]): BRepVertex | undefined;
findEdge(name: string | string[]): BRepEdge | undefined;
findFace(name: string | string[]): BRepFace | undefined;
getAllFaces(): BRepFace[];
getAllEdges(): BRepEdge[];
getAllVertices(): BRepVertex[];
body(): BRepBody;
setBody(body: BRepBody): void;
}

View File

@@ -0,0 +1,27 @@
/**
* @brief BRep对象类型
* @note 这里定义的BRep对象主要用于显示这里采用Parasolid/ACIS的拓扑表示方式
*
*/
export declare enum ShapeType {
COMPOUND = 0,//! 复合类型
SOLID = 2,//! 实体类型
SHELL = 3,//! 壳类型
FACE = 4,//! 面类型
WIRE = 5,//! 线框类型
EDGE = 6,//! 边类型
VERTEX = 7,//! 顶点类型
LOOP = 9,//! 环类型与a/p对应
HALFEDGE = 10
}
/**
* @brief BRep body类型使用brep对象时应该以此为单位进行使用
*
*/
export declare enum BodyType {
BT_SolidBody = 0,//! 实体对象
BT_ShellBody = 1,//! 壳对象
BT_WireBody = 2,//! 线框对象
BT_AcornBody = 3,//! 点对象
BT_CompoundBody = 4
}

View File

@@ -0,0 +1,18 @@
import { Point } from '../geom/Point';
import { BRepBody } from './BRepBody';
import { BRepObject } from './BRepObject';
import { ShapeType } from './BRepType';
/**
* @brief BRep顶点对象
*
*/
export declare class BRepVertex extends BRepObject {
readonly point: Point;
private wrappedBody;
constructor(obj: any, parent?: BRepObject | null);
isGeom(): boolean;
shapeType(): ShapeType;
getAllVertices(): BRepVertex[];
body(): BRepBody;
setBody(body: BRepBody): void;
}

View File

@@ -0,0 +1,24 @@
import { BRepBody } from './BRepBody';
import { BRepEdge } from './BRepEdge';
import { BRepObject } from './BRepObject';
import { ShapeType } from './BRepType';
import { BRepVertex } from './BRepVertex';
/**
* @brief BRep环对象
*
*/
export declare class BRepWire extends BRepObject {
readonly edges: BRepEdge[];
readonly vertices: BRepVertex[];
private wrappedBody;
constructor();
constructor(obj: any);
findVertex(name: string | string[]): BRepVertex | undefined;
findEdge(name: string | string[]): BRepEdge | undefined;
isGeom(): boolean;
shapeType(): ShapeType;
getAllEdges(): BRepEdge[];
getAllVertices(): BRepVertex[];
body(): BRepBody;
setBody(body: BRepBody): void;
}

View File

@@ -0,0 +1,12 @@
export * from './BRepBody';
export * from './BRepEdge';
export * from './BRepFace';
export * from './BRepHalfEdge';
export * from './BRepLoop';
export * from './BRepObject';
export * from './BRepShell';
export * from './BRepSolid';
export * from './BRepType';
export * from './BRepVertex';
export * from './BRepWire';
export * from './BRepAssembly';

View File

@@ -0,0 +1,43 @@
import { Vector3, Vector2 } from 'three';
export declare class AABB {
readonly lowPoint: Vector3 | Vector2;
readonly highPoint: Vector3 | Vector2;
/**
* @remarks
* If the min is higher than the max, the bounding box calculations will break
*
* @param minX the minimum value in the X axis
* @param minY the minimum value in the Y axis
* @param minZ the minimum value in the Z axis
* @param maxX the maximum value in the X axis
* @param maxY the maximum value in the Y axis
* @param maxZ the maximum value in the Z axis
*/
constructor(minX: number, minY: number, minZ: number | null, maxX: number, maxY: number, maxZ: number | null);
/**
* Merges the two bounding boxes to create a larger one containing the two
*
* @param other - The other bounding box to use for merging
* @returns The new bounding box containing both bounding boxes
*/
merge(other: AABB): AABB;
/**
* Check if the other bounding box is overlapping with this one
*
* @param other - The bounding box to check overlap against
* @returns `true` if the other bounding box is colling, `false` otherwise
*/
overlaps(other: AABB): boolean;
/**
* Check if the point is contained within the bounding box
*
* @param point - The point to check
* @returns `true` if the point is inside the bounding box, `false` otherwise
*/
containsPoint(point: Vector3 | Vector2): boolean;
get is3D(): boolean;
get width(): number;
get height(): number;
get depth(): number;
get space(): number;
}

View File

@@ -0,0 +1,38 @@
import { IAABBShape } from './IAABBShape';
import { AABB } from './AABB';
/**
* Axis Aligned Bouding Box Node
*
* @remark
* The bounding box on this nodes either fully contains the shape or the two child nodes.
*/
interface IAABBNode {
Aabb: AABB;
Shape?: IAABBShape;
ParentNode?: IAABBNode;
LeftNode?: IAABBNode;
RightNode?: IAABBNode;
readonly IsLeaf: boolean;
}
export declare class AABBNode implements IAABBNode {
Aabb: AABB;
Shape?: IAABBShape;
ParentNode?: IAABBNode;
LeftNode?: IAABBNode;
RightNode?: IAABBNode;
/**
* @param aabb - A bounding box containing the shape or the two child nodes
* @param shape - A reference to a shape implementation of IAABBShape
* @param parentNode - The node parenting this node
* @param leftNode - The first child node
* @param rightNode - The second child node
*/
constructor(Aabb: AABB, shape?: IAABBShape, parentNode?: IAABBNode, leftNode?: IAABBNode, rightNode?: IAABBNode);
/**
* @remark
* The node is considered a leaf when is has no reference to any child nodes.
* Only leaf nodes should contain shapes
*/
get IsLeaf(): boolean;
}
export {};

View File

@@ -0,0 +1,61 @@
import { Ray, Vector3, Vector2 } from 'three';
import { IAABBShape } from './IAABBShape';
import { AABBNode } from './AABBNode';
/**
* Axis Aligned Bounding Box Tree
*/
export declare class AABBTree {
private rootNode?;
private shapeToNodeMap;
constructor();
/**
* Adds a new shape to the tree.
* @param shape The shape to add to the tree (Must be an implementation of IAABBShape interface)
*/
addShape(shape: IAABBShape): void;
/**
* Removes the shape and balances the tree
* @remarks The method will gracefully exit if the shape doesn't exist in the tree
* @param shape - The shape to remove from the tree
*/
removeShape(shape: IAABBShape): void;
/**
* Finds all the shape overlapping with the point
* @remarks if the tree is empty this function will always return an empty array
* @param shape - The shape to check overlaps against
* @returns An array containing all the shape overlapping with the point
*/
getShapesOverlappingWith(point: Vector3 | Vector2): IAABBShape[];
/**
* Returns all the node in the tree
*
* @remarks
* The nodes that serves as parent containers are also returned. Do not expect every node to contain a shape
*
* @returns An array containing all the nodes the tree contains
*/
getAllNodes(): AABBNode[];
/**
* Iterates recursivly over the entire three and all the node to the array
*
* @param node - The node to iterate over
* @param array - Reference to the array that will contain all the nodes in the tree
*/
private nodeIterator;
/**
* Remove a node from the tree and balances the tree if needed
*
* @param node - The node to remove from the tree
*/
private removeNode;
/**
* @remarks
* When the parent node intersects the ray, the child node is found separately.
* If a Boundbox for a leaf node intersects a ray, the leaf node is returned
*
* @notion two dimensional ray intersection is not achieved
* @param ray A ray type from threejs
* @returns All shapes that intersect the Ray
*/
ray2Tree(ray: Ray): IAABBShape[] | null;
}

View File

@@ -0,0 +1,7 @@
import { Vector3, Vector2 } from 'three';
import { AABB } from './AABB';
export interface IAABBShape {
getAABB(): AABB;
containsPoint(point: Vector3 | Vector2): boolean;
getTypeName(): string;
}

View File

@@ -0,0 +1,13 @@
import { Vector3, Vector2 } from 'three';
import { IAABBShape } from './IAABBShape';
import { AABB } from './AABB';
export declare class LineAABBShape implements IAABBShape {
private aabb;
private VectorList;
private type;
constructor(A: Vector3 | Vector2, B: Vector3 | Vector2);
getAABB(): AABB;
containsPoint(point: Vector3 | Vector2): boolean;
getTypeName(): string;
points(): (Vector3 | Vector2)[];
}

View File

@@ -0,0 +1,13 @@
import { Vector3, Vector2 } from 'three';
import { IAABBShape } from './IAABBShape';
import { AABB } from './AABB';
export declare class TriAABBShape implements IAABBShape {
private aabb;
private VectorList;
private type;
constructor(A: Vector3 | Vector2, B: Vector3 | Vector2, C: Vector3 | Vector2);
getAABB(): AABB;
containsPoint(point: Vector3 | Vector2): boolean;
getTypeName(): string;
points(): (Vector3 | Vector2)[];
}

View File

@@ -0,0 +1,6 @@
export * from './AABB';
export * from './AABBNode';
export * from './AABBTree';
export * from './IAABBShape';
export * from './LineAABBShape';
export * from './TriAABBShape';

View File

@@ -0,0 +1,17 @@
import { SupVector } from '../types';
/**
* @brief 坐标对象
* @note 坐标对象目前使用threejs的Vector3实现
*
*/
export declare class Coord {
readonly xyz: SupVector;
constructor(x: number, y: number, z: number);
setCoord(x: number, y: number, z: number): void;
x(): number;
y(): number;
z(): number;
static toFloat32Array(coords: Coord[]): Float32Array;
static toArray(coords: Coord[]): number[];
static toArrayVec(coords: SupVector[]): number[];
}

View File

@@ -0,0 +1,10 @@
import { SupMat4, SupVector } from '../types';
export declare class Coordinate {
readonly pos: SupVector;
readonly zDir: SupVector;
readonly xDir: SupVector;
constructor(pos?: SupVector, zDir?: SupVector, xDir?: SupVector);
get yDir(): SupVector;
private normalize;
toMatrix4(): SupMat4;
}

View File

@@ -0,0 +1,15 @@
/**
* @brief 曲线类型枚举
*
*/
export declare enum CurveType {
Line = 0,//! 直线
Circle = 1,//! 圆
Ellipse = 2,//! 椭圆
Parabola = 3,//! 抛物线
Hyperbola = 4,//! 双曲线
OffsetCurve = 5,//! 偏置曲线
BezierCurve = 6,//! 贝塞尔曲线
BSplineCurve = 7,//! Nurbs曲线
Other = 8
}

View File

@@ -0,0 +1,10 @@
import { Coord } from './Coord';
import { SupMat4 } from '../types';
/**
* @brief 方向对象
*
*/
export declare class Direct extends Coord {
constructor(x: number, y: number, z: number);
applayMatrix4(mat: SupMat4): void;
}

View File

@@ -0,0 +1,174 @@
import { Coordinate } from './Coordinate';
import { PolyGeometry } from './PolyGeometry';
import { Triangulation } from './Triangulation';
import { SupBox, SupVector } from '../types';
type NumberArray4 = [number, number, number, number];
export type CRModeType = 'Chamfer' | 'Fillet';
export type CRModeTypeArray4 = [CRModeType, CRModeType, CRModeType, CRModeType];
export declare class GeometryBuilder {
static angleTol: number;
static zeroTol: number;
private static floatEqual;
static cone(r1: number, r2: number, l: number, csys?: Coordinate): Triangulation | null;
static arrow(cylR: number, cylL: number, coneR: number, coneL: number, csys?: Coordinate): Triangulation | null;
static cutPlaneByBox(box: SupBox, csys: Coordinate): PolyGeometry | null;
static box(min: SupVector, max: SupVector, csys?: Coordinate): PolyGeometry | null;
static sphere(radius: number, center: SupVector, csys?: Coordinate, segments?: number): Triangulation;
/**
* 计算一段圆弧上的离散的点
* @param center 圆心
* @param radius 半径
* @param startAngle 开始角度
* @param endAngle 结束角度
* @param segments 线段数量
* @param returnMode 1, 2, 3, 4 返回模式
* @param xy true 在 xy 平面上 false 在 xz平面上
* @returns
* returnMode | length | means
* ------------------------------------------------
* 1 | segments | start + paths
* 2 | segments | paths + end
* 3 | segments + 1 | start + paths + end
* 4 | segments - 1 | paths
*/
private static computeArcNodes;
/**
* geneate line with connecting start index to end index
* for example:
* input: 0, 3
* output: [0,1,1,2,2,3]
* @param startIndex start index
* @param endIndex end index
* @returns line array connect start index to end index
*/
private static generateArcLine;
/**
* 使用多个圆环创建面和圆环线
* loops length | first loop length | result surface
* --------------------------------------------------
* 1 | 1 | point -> error
* 1 | >= 3 | plane -> circle plane
* 2 | 1 | circle plane or cone surface
* 2 | === another | torus plane or cone plane
* >2 | === others | torus surface
* @param loops 圆环数组
* @param poly 添加到的目标PolyGeometry
* @param lineMode
* 0: don't add lines
* 1: add first loop lines
* 2: add last loop lines
* 3. add first and last loop lines
* @param close 是否形成闭环,头尾相接
* @param z true: the surface normal direction is z positive; false: the surface normal direction is z negative
*/
private static addSurfaceByLoops;
/**
* 球或空心球的2D草图
* @param r1 大圆半径
* @param r2 小圆半径 为0时球大于0时空心球 大于等于r1时报错
* @param center 圆心
* @param quarter false: full ; true: 1/4 circle
* @param segments 一个圆的分段数
* @param csys 坐标系
*/
static sphere2D(r1: number, r2: number, center?: SupVector, quarter?: boolean, segments?: number, csys?: Coordinate | undefined): PolyGeometry;
/**
* 构造圆环的草图
* @param radius 截面半径
* @param center 截面圆心
* @param quarter false: full quarter: 半圆
* @param segments 整圆分段数
* @param csys 坐标系
* @returns
*/
static torus2D(radius: number, center: SupVector, quarter?: boolean, segments?: number, csys?: Coordinate | undefined): PolyGeometry;
/**
* 根据点 和 anchors 创建 2D 轮廓图形
* @param poly 目标PolyGeometry
* @param nodes 一些点坐标
* @param anchors 锚点,创建线的起止点
*/
private static create2DShape;
/**
* R1
* |<---> __ ←-
* | r2 / \ r1 p1↑ 点创建顺序
* | | |
* | | |
* | | |
* | r3 \__/ r4
* |<--------->
* pos R2
*
* @param R1 小圆半径
* @param R2 大圆半径
* @param height 高度
* @param position 旋转轴位置
* @param radii 倒角半径 4 个
* @param modes 倒角类型 4个
* @param quarter 是否 1/4
* @param segments 倒圆角的时候圆弧的分辨率
* @returns nodes 和 anchors 和 middle( 上 与 下 的 分界点)
*/
private static cylinder2DNodes;
static cylinder(R1: number, R2: number, height: number, position?: SupVector, radii?: NumberArray4, modes?: CRModeTypeArray4, segments?: number, revolution?: boolean, range?: [number, number], quarter?: boolean, csys?: Coordinate | undefined): PolyGeometry;
/**
* |
* | _________ ——
* | r2 / \ r1 p0 ↑
* | | ·p | y
* | r3 \_________/ r4 ↓
* |pos |<--------->| ——
* | x
* |————————————————————————
* @param x box x direction length
* @param y box y direction length
* @param position box center position
* @param radii r1, r2, r3, r4
* @param modes m1, m2, m3, m4
* @param segments one arc segments( Π / 2)
*/
private static box2DNodes;
/**
* 创建的基本体的顶面或者底面的平面
* @param poly 目标PolyGeometry
* @param nodes 一圈平面点
* @param anchors 锚点,创建线的起止点
* @param z true: 法向z正方形 false: 法向为z的负方向
*/
private static addOneTopOrBottomPlane;
/**
* 添加一个侧面可能是一个平面或者一个圆柱面平面由4个点2个三角形组成圆柱面由2n个点2n个三角形组成
* @param poly 目标PolyGeometry
* @param nodes1 底面的点
* @param nodes2 顶面的点
*/
private static addOneSideSurface;
/**
* 复杂的box, 可对4个角进行倒角
* @param x x方向长度
* @param y y方向长度
* @param z z方向长度
* @param position 底面圆心位置
* @param radii 4个角的倒角半径
* @param modes 4个角的倒角模式
* @param segments Math.PI / 4 的分段数
* @param extrude 是否extrude , false返回2D图形
* @param csys 坐标系
* @returns PolyGeometry
*/
static complexBox(x: number, y: number, z: number, position?: SupVector, radii?: NumberArray4, modes?: CRModeTypeArray4, segments?: number, extrude?: boolean, csys?: Coordinate | undefined): PolyGeometry;
/**
* 构造正多边形棱柱
* @param radius 外接圆半径
* @param height 高度
* @param edgeNumber 边数量
* @param startAngle 起始点位置
* @param bottomCenter 底面圆心位置
* @param extrude true: 拉伸的3D模型 false: 未拉伸的2D轮廓
* @param csys 坐标系
* @returns poly geometry
*/
static regularPolygonalPrism(radius: number, height: number, edgeNumber: number, startAngle?: number, bottomCenter?: SupVector, extrude?: boolean, csys?: Coordinate | undefined): PolyGeometry;
}
export {};

View File

@@ -0,0 +1,9 @@
import { Coord } from './Coord';
import { SupMat4 } from '../types';
/**
* @brief 点对象
*
*/
export declare class Point extends Coord {
applayMatrix4(mat: SupMat4): void;
}

View File

@@ -0,0 +1,49 @@
import { Ray } from 'three';
import { Triangle } from './Triangulation';
import { SupBox, SupVector } from '../types';
import { AABBTree } from './AABB/AABBTree';
export type PolyLine = {
indices: number[];
isSegment: boolean;
props?: object;
};
export type PolySurf = {
triangles: Triangle[];
props?: object;
};
export interface IPolyGeometry {
nodes: Array<[number, number, number]>;
surfs?: Array<{
props?: object;
triangles: Array<[number, number, number]>;
}>;
lines?: Array<{
props?: object;
indices: Array<[number, number]> | number[];
}>;
}
/**
* @brief poly几何可以包含多个多边形面和多边形边
*
*/
export declare class PolyGeometry {
readonly nodes: SupVector[];
readonly lines: PolyLine[];
readonly surfs: PolySurf[];
constructor(nodes?: SupVector[]);
static createIndex(poly: PolyLine): number[];
bndBox(): SupBox;
static createFromIPoly(data: IPolyGeometry): PolyGeometry;
static ray2Tree(ray: Ray, tree: AABBTree): number;
/**
* AABB Tree is used to calculate the distance between two PolyGeometrys
* @param geomFrom PolyGeometry
* @param geomTo PolyGeometry
* @param direction The direction from geomFrom to geomTo
* @returns The distance from geomFrom to geomTo calculated along the direction.
* If the return value is negative, it represents the distance from geomFrom to geomTo in the opposite direction.
* If the return value is positive, it represents the distance from geomFrom to geomTo in the positive direction.
* If the return value is null, it means that geomFrom and geomTo cannot calculate the distance in this direction.
*/
static calDistancewithAABB(geomFrom: PolyGeometry, geomTo: PolyGeometry, direction: SupVector): number | null;
}

View File

@@ -0,0 +1,14 @@
import { Point } from './Point';
import { SupBox } from '../types';
/**
* @brief 多边形对象
*
*/
export declare class Polygon {
protected nodes: Point[];
constructor();
get nodeList(): Point[];
set nodeList(nodes: Point[]);
static createIndex(size: number, offset: number): number[];
bndBox(): SupBox;
}

View File

@@ -0,0 +1,17 @@
/**
* @brief 曲面类型
*
*/
export declare enum SurfaceType {
Plane = 0,//! 平面
Cylinder = 1,//! 圆柱面
Cone = 2,//! 圆锥面
Sphere = 3,//! 球面
Torus = 4,//! 圆环面
BezierSurface = 5,//! 贝塞尔曲面
BSplineSurface = 6,//! Nurbs曲面
SurfaceOfRevolution = 7,//! 回转面
SurfaceOfExtrusion = 8,//! 拉伸面
OffsetSurface = 9,//! 偏执面
OtherSurface = 10
}

View File

@@ -0,0 +1,36 @@
import { BufferGeometry } from 'three';
import { Direct } from './Direct';
import { Point } from './Point';
import { SupBox, SupMat4 } from '../types';
/**
* @brief 三角面片对象
*
*/
export declare class Triangle {
node1: number;
node2: number;
node3: number;
constructor(n1: number, n2: number, n3: number);
}
/**
* @brief 面片集合对象
*
*/
export declare class Triangulation {
protected nodes: Point[];
protected normals: Direct[];
protected triangles: Triangle[];
constructor();
get nodeList(): Point[];
set nodeList(nodes: Point[]);
get triangleList(): Triangle[];
set triangleList(triangles: Triangle[]);
get normalList(): Direct[];
set normalList(normals: Direct[]);
static toUint32Array(indices: Triangle[]): Uint32Array;
static toArray(indices: Triangle[], offset?: number): number[];
static createFromBufferGeometry(buffer: BufferGeometry): Triangulation | null;
applayMatrix4(mat: SupMat4): void;
bndBox(): SupBox;
expandSharedPoint(): void;
}

View File

@@ -0,0 +1,10 @@
export * from './Coord';
export * from './Coordinate';
export * from './CurveType';
export * from './Direct';
export * from './GeometryBuilder';
export * from './Point';
export * from './PolyGeometry';
export * from './Polygon';
export * from './SurfaceType';
export * from './Triangulation';

View File

@@ -0,0 +1,5 @@
export * from './brep';
export * from './geom';
export * from './mesh';
export * from './view';
export * from './types';

View File

@@ -0,0 +1,44 @@
import { SupBox } from '../types';
export interface IAABBRange {
xMin: number;
yMin?: number;
zMin?: number;
xMax: number;
yMax?: number;
zMax?: number;
}
export interface ICell {
i: number;
j?: number;
k?: number;
index: number;
}
export interface ILevelMesh {
level: number;
cells: ICell[];
xCoords: number[];
yCoords?: number[];
zCoords?: number[];
}
export interface ICellBasedMesh {
dimension: number;
range: IAABBRange;
meshes: ILevelMesh[];
}
export interface IBoxLibMesh {
dimension: number;
range: number[];
mesh_levels: {
level: number;
resolution: number[];
cell_idx: number[];
}[];
}
export declare class CellBasedMesh implements ICellBasedMesh {
readonly dimension: number;
readonly range: IAABBRange;
readonly meshes: ILevelMesh[];
constructor(data: ICellBasedMesh);
static createFromBoxLib(data: IBoxLibMesh): CellBasedMesh;
bndBox(): SupBox;
}

View File

@@ -0,0 +1,77 @@
import { MeshEdge, MeshElement, MeshFace, MeshNode } from './element/MeshElement';
import { SupBox } from '../types';
export interface IMeshData {
nodes: Array<Array<number>>;
elements: Array<Array<number>>;
faces?: Array<Array<number>>;
}
export type MeshProp = {
forNode: boolean;
name: string;
size: number;
data: Map<number, number[]>;
range: {
min: number[];
max: number[];
};
};
/**
* @brief 基于节点的网格对象
*
*/
export declare class NodeBasedMesh {
readonly nodes: Map<number, MeshNode>;
readonly elements: Map<number, MeshElement>;
readonly props: MeshProp[];
constructor(nodes: MeshNode[], elements: MeshElement[]);
/**
* @brief 获取特征面上的网格节点
* @param node-初始节点
* @param angTol-网格面角度限制(弧度)
*/
getNodesFromFace(node: MeshNode, angTol: number): MeshNode[];
/**
* @brief 获取特征面上的网格面
* @param face-初始网格面
* @param angTol-网格面角度限制(弧度)
*/
getMeshFaces(face: MeshFace, angTol: number): MeshFace[];
private getMeshFacesFromFace;
/**
* @brief 获取特征边上的网格边
* @param edge-初始网格边
* @param angTol-网格边角度限制(弧度)
*/
getMeshEdgesByFeat(angTol: number, edge: MeshEdge): MeshEdge[];
private getEdgeBorders;
static createFromData(data: IMeshData): NodeBasedMesh;
/**
* @brief 添加属性
* @param name-属性名称
* @param size-属性长度
* @param forNode-是否为节点属性
* @param data-属性数据(属性数据的组织按照如下规则: nodeId1 data1 data2 ... dataN nodeId2...)
*
* @return true-成功, false-失败
*/
attachProperty(name: string, size: number, forNode: boolean, data: number[]): boolean;
getProperty(name: string): MeshProp | undefined;
bndBox(): SupBox;
/**
* @brief 2D网格拉伸为3D网格
* @param off1-上偏移
* @param off2-下偏移
*
* @return 转化后的3D网格如果转化失败则返回null
*/
to3DMeshByExtrude(off1: number, off2: number): NodeBasedMesh | null;
/**
* @brief 2D网格旋转为3D网格
* @param start-起始角度(度)
* @param ang-旋转角度(度)
* @param res-分辨率(度)
*
* @return 转化后的3D网格如果转化失败则返回null
*/
to3DMeshByRevolve(start: number, ang: number, res: number): NodeBasedMesh | null;
}

View File

@@ -0,0 +1,12 @@
export type VectorData = {
vectors: number[];
space: number;
};
export type StreamLine = {
lines: Array<Array<number>>;
};
export type StreamLineProp = {
name: string;
size: number;
data: Array<Array<number>>;
};

View File

@@ -0,0 +1,10 @@
import { MeshType } from './MeshType';
import { MeshElement } from './MeshElement';
export declare class FaceBasedEle extends MeshElement {
type(): MeshType;
protected initEdgesAndFaces(): void;
addFace(nodes: number[]): void;
private addEdge;
private addNode;
copy(): MeshElement;
}

View File

@@ -0,0 +1,7 @@
import { MeshType } from './MeshType';
import { HexahedronEle } from './HexahedronEle';
import { MeshElement } from './MeshElement';
export declare class HexOrder2N20Ele extends HexahedronEle {
type(): MeshType;
copy(): MeshElement;
}

View File

@@ -0,0 +1,7 @@
import { MeshType } from './MeshType';
import { HexahedronEle } from './HexahedronEle';
import { MeshElement } from './MeshElement';
export declare class HexOrder2N27Ele extends HexahedronEle {
type(): MeshType;
copy(): MeshElement;
}

View File

@@ -0,0 +1,7 @@
import { MeshType } from './MeshType';
import { MeshElement } from './MeshElement';
export declare class HexahedronEle extends MeshElement {
type(): MeshType;
protected initEdgesAndFaces(): void;
copy(): MeshElement;
}

View File

@@ -0,0 +1,7 @@
import { MeshType } from './MeshType';
import { MeshElement } from './MeshElement';
export declare class Line2Ele extends MeshElement {
type(): MeshType;
protected initEdgesAndFaces(): void;
copy(): MeshElement;
}

View File

@@ -0,0 +1,53 @@
import { Triangle } from '../../geom/Triangulation';
import { MeshType } from './MeshType';
export type MeshNode = {
id: number;
coord: number[];
};
export type MeshEdge = {
node1: number;
node2: number;
};
export type MeshFace = {
nodes: number[];
triangles: Triangle[];
};
/**
* @brief 网格单元抽象类
*
*/
export declare abstract class MeshElement {
id: number;
readonly nodes: number[];
readonly faces: MeshFace[];
readonly edges: MeshEdge[];
constructor(id: number, nodes: number[]);
/**
* @brief
* @param
*
* @return
* -<em>1</em>
*/
setNodes(nodes: number[]): void;
/**
* @brief 单元类型
*
* @return
* -<em>单元类型</em>
*/
abstract type(): MeshType;
/**
* @brief 初始化网格边和网格面
*
* @return
* -<em>无</em>
*/
protected abstract initEdgesAndFaces(): void;
/**
* @brief 拷贝自身
*
* @return 拷贝对象
*/
abstract copy(): MeshElement;
}

View File

@@ -0,0 +1,19 @@
export declare enum MeshType {
Line_2 = 0,//! 2节点线单元
Triangle_3 = 1,//! 3节点三角形单元
Quadrangle_4 = 2,//! 4节点四边形单元
Tetrahedron_4 = 3,//! 4节点四面体单元
Hexahedron_8 = 4,//! 8节点六面体单元
Prism_6 = 5,//! 6节点三棱柱单元
Pyramid_5 = 6,//! 5节点四棱锥单元
Line_3_Order2 = 7,//! 3节点二阶线单元
Triangle_6_Order2 = 8,//! 6节点二阶三角形单元
Quadrangle_9_Order2 = 9,//! 9节点二阶四边形单元
Tetrahedron_10_Order2 = 10,//! 10节点二阶四面体单元
Hexahedron_27_Order2 = 11,//! 27节点二阶六面体单元
Prism_18_Order2 = 12,//! 18节点二阶三棱柱单元
Pyramid_14_Order2 = 13,//! 14节点二阶四棱锥单元
Plane_Polygon = 14,//! 平面多边形网格,通过首尾相连的方式组成
Hexahedron_20_Order2 = 15,//! 27节点二阶六面体单元
FaceBasedEle = 100
}

View File

@@ -0,0 +1,7 @@
import { MeshType } from './MeshType';
import { MeshElement } from './MeshElement';
export declare class PlanePolygonEle extends MeshElement {
type(): MeshType;
protected initEdgesAndFaces(): void;
copy(): MeshElement;
}

View File

@@ -0,0 +1,7 @@
import { MeshType } from './MeshType';
import { MeshElement } from './MeshElement';
export declare class QuadrangleEle extends MeshElement {
type(): MeshType;
protected initEdgesAndFaces(): void;
copy(): MeshElement;
}

View File

@@ -0,0 +1,7 @@
import { MeshElement } from './MeshElement';
import { MeshType } from './MeshType';
import { TetrahedronEle } from './TetrahedronEle';
export declare class TetOrder2Ele extends TetrahedronEle {
type(): MeshType;
copy(): MeshElement;
}

View File

@@ -0,0 +1,7 @@
import { MeshType } from './MeshType';
import { MeshElement } from './MeshElement';
export declare class TetrahedronEle extends MeshElement {
type(): MeshType;
protected initEdgesAndFaces(): void;
copy(): MeshElement;
}

View File

@@ -0,0 +1,7 @@
import { MeshType } from './MeshType';
import { MeshElement } from './MeshElement';
export declare class TriangleEle extends MeshElement {
type(): MeshType;
protected initEdgesAndFaces(): void;
copy(): MeshElement;
}

View File

@@ -0,0 +1,11 @@
export * from './HexahedronEle';
export * from './MeshElement';
export * from './MeshType';
export * from './QuadrangleEle';
export * from './TetrahedronEle';
export * from './TriangleEle';
export * from './Line2Ele';
export * from './HexOrder2N20Ele';
export * from './HexOrder2N27Ele';
export * from './TetOrder2Ele';
export * from './PlanePolygonEle';

View File

@@ -0,0 +1,4 @@
export * from './element';
export * from './NodeBasedMesh';
export * from './CellBasedMesh';
export * from './PostProcessType';

View File

@@ -0,0 +1,13 @@
import { Box3, Color, Matrix4, Vector2, Vector3, Vector4 } from 'three';
export declare class SupVector extends Vector3 {
}
export declare class SupColor extends Color {
}
export declare class SupBox extends Box3 {
}
export declare class SupMat4 extends Matrix4 {
}
export declare class SupVec4 extends Vector4 {
}
export declare class SupVec2 extends Vector2 {
}

View File

@@ -0,0 +1,23 @@
import { BRepBody } from '../brep/BRepBody';
import { BRepObject } from '../brep/BRepObject';
import { ViewMode } from './ViewMode';
import { ViewObject } from './ViewObject';
import { ViewObjType } from './ViewObjType';
/**
* @brief BRep 可视化对象
*
*/
export declare class BRepViewObject extends ViewObject {
private wrappedBody;
private wrappedRenders;
constructor(body: BRepBody);
type(): ViewObjType;
protected computeSelects(viewMode: ViewMode): boolean;
protected computeRenders(viewMode: ViewMode): boolean;
get body(): BRepBody;
set body(body: BRepBody);
setBRepColor(brep: BRepObject, color: number): boolean;
setBRepOpacity(brep: BRepObject, opacity: number): boolean;
unSetBRepColor(brep: BRepObject): boolean;
clearData(): void;
}

View File

@@ -0,0 +1,47 @@
import { Color, Float32BufferAttribute } from 'three';
import { CellBasedMesh } from '../mesh/CellBasedMesh';
import { IBindLegendObj, Legend, LegendUpdateArg } from './Legend';
import { ViewMode } from './ViewMode';
import { ViewObject } from './ViewObject';
import { ViewObjType } from './ViewObjType';
interface IPropertyData {
attr: Float32BufferAttribute;
min: number;
max: number;
}
/**
* @brief 基于单元的网格对象显示组件
*
*/
export declare class CellBasedMeshVO extends ViewObject implements IBindLegendObj {
protected wrappedLegend: Legend | null;
protected wrappedMesh: CellBasedMesh;
private wrappedRenders;
protected wrappedProperties: Map<number, Map<string, IPropertyData>>;
protected wrappedCurProp: string;
protected wrappedSolidColor: Color;
protected wrappedLevelStates: Map<number, boolean>;
constructor(mesh: CellBasedMesh);
protected onLegendUpdateCB: (arg?: LegendUpdateArg) => void;
unbindLegend: (legend: Legend) => void;
useLegend: boolean;
bindLegend: (legend: Legend) => void;
type(): ViewObjType;
protected computeSelects(_mode: ViewMode): boolean;
protected computeRenders(mode: ViewMode): boolean;
attachProperty(level: number, name: string, data: number[]): boolean;
activeProperty(name: string): boolean;
setFaceColor(color: number): void;
private updateProperty;
get legend(): Legend | null;
/**
* @brief 获取/设置网格层的显示状态
* @param level 网格层号
*/
levelVisible(level: number): boolean | undefined;
setLevelVisible(level: number, state: boolean): void;
get mesh(): CellBasedMesh;
get props(): Map<number, Map<string, IPropertyData>>;
clearData(): void;
}
export {};

View File

@@ -0,0 +1,39 @@
import { ColorMapLegend, ColorMapLegendType, LiteEvent } from '../../core';
import { SupColor } from '../types';
export declare enum LegendUpdateType {
Colors = 0,
Range = 1,
Type = 2
}
export interface LegendUpdateArg {
type: LegendUpdateType;
arg: unknown;
}
export declare class Legend extends ColorMapLegend {
readonly updateEvent: LiteEvent<LegendUpdateArg>;
protected wrappedColors: SupColor[];
protected wrappedRange: number[];
constructor();
private updateLegend;
setColorMap(colormap: string | SupColor[], numColor?: number | undefined): void;
get colors(): SupColor[];
get range(): {
readonly min: number;
readonly max: number;
};
set range(range: {
readonly min: number;
readonly max: number;
});
get type(): ColorMapLegendType;
set type(value: ColorMapLegendType);
}
export interface IBindLegendObj {
useLegend: boolean;
bindLegend: {
(legend: Legend): void;
};
unbindLegend: {
(legend: Legend): void;
};
}

View File

@@ -0,0 +1,9 @@
import { LegendPanel } from '../../core';
import { IBindLegendObj, Legend } from './Legend';
export declare class LegendManager {
readonly legend: Legend;
readonly legendPanel: LegendPanel;
constructor();
bindObject(obj: IBindLegendObj): void;
unbindObject(obj: IBindLegendObj): void;
}

View File

@@ -0,0 +1,81 @@
import { Color } from 'three';
import { NodeBasedMesh } from '../mesh/NodeBasedMesh';
import { IBindLegendObj, Legend, LegendUpdateArg } from './Legend';
import { SelectElement } from './SelectElement';
import { ViewMode } from './ViewMode';
import { ViewObject } from './ViewObject';
import { ViewObjType } from './ViewObjType';
/**
* @brief 基于节点的网格对象显示组件
*
*/
export declare class NodeBasedMeshVO extends ViewObject implements IBindLegendObj {
protected wrappedLegend: Legend | null;
protected wrappedMesh: NodeBasedMesh;
protected wrappedMeshBak: NodeBasedMesh | null;
private wrappedRenders;
protected wrappedCurProp: string;
protected wrappedDeformFactor: number;
protected wrappedDeformOn: boolean;
protected wrappedDeformAttr: string;
protected wrappedSolidColor: Color;
protected wrappedLineColor: Color;
private wrappedNodeItemMap;
private wrappedFaceItemMap;
private wrappedEdgeItemMap;
private wrappedShowNode;
private wrappedLineContour;
constructor(mesh: NodeBasedMesh);
unbindLegend: (legend: Legend) => void;
useLegend: boolean;
protected onLegendUpdateCB: (arg?: LegendUpdateArg) => void;
bindLegend: (legend: Legend) => void;
setNodesColor(nodes: number[], color: number): void;
type(): ViewObjType;
protected computeSelects(_mode: ViewMode): boolean;
protected computeRenders(mode: ViewMode): boolean;
protected attachProperty(name: string, index: number): boolean;
activeProperty(name: string, index?: number): boolean;
setFaceColor(color: number): void;
setLineColor(color: number): void;
private updateProperty;
get legend(): Legend | null;
private updateNodeVisible;
get showNode(): boolean;
set showNode(show: boolean);
get showLineContour(): boolean;
set showLineContour(show: boolean);
get deformOn(): boolean;
set deformOn(open: boolean);
get deformAttr(): string;
set deformAttr(name: string);
get deformFactor(): number;
set deformFactor(factor: number);
get mesh(): NodeBasedMesh;
set mesh(mesh: NodeBasedMesh);
get visible(): boolean;
set visible(show: boolean);
/**
* @brief 拉伸为3D网格
* @param off1-上偏移
* @param off2-下偏移
*/
extrudeMesh(off1: number, off2: number): void;
/**
* @brief 旋转为3D网格
* @param start-起始角度(度)
* @param ang-旋转角度(度)
* @param res-分辨率(度)
*/
revolveMesh(start: number, ang: number, res: number): void;
/**
* @brief 恢复为2D网格
*/
to2dMesh(): void;
clearData(): void;
}
export declare function getMeshSurfNodesSel(sel: SelectElement, mode: ViewMode, angTol: number): SelectElement[];
export declare function getMeshAllNodesSel(sel: SelectElement, mode: ViewMode): SelectElement[];
export declare function getMeshSurfFacesSel(sel: SelectElement, mode: ViewMode, angTol: number): SelectElement[];
export declare function getMeshAllFacesSel(sel: SelectElement, mode: ViewMode): SelectElement[];
export declare function getMeshCurveEdgesSel(sel: SelectElement, mode: ViewMode, angTol: number): SelectElement[];

View File

@@ -0,0 +1,41 @@
import { BRepObject } from '../brep/BRepObject';
/**
* @brief 拾取对象Owner类型
*
*/
export declare enum OwnerType {
OT_BRepOwner = 0,//! BRep类型owner
OT_SelectOwner = 1,//! 拾取类型owner其owner是SelectElement对象
OT_MeshNode = 2,//! 网格节点类型owner
OT_MeshEdge = 3,//! 网格边类型owner
OT_MeshFace = 4,//! 网格面类型owner
OT_MeshElement = 5,//! 网格单元类型owner
OT_Triangulation = 6,//! 三角化对象owner
OT_PolyGeometry = 7,//! 多边形几何对象owner
OT_Custom = 8
}
/**
* @brief owner类用于表征拾取、显示的目标对象
*
*/
export declare class Owner {
readonly owner: unknown;
readonly type: OwnerType;
constructor(owner: unknown, type: OwnerType);
/**
* @brief 作为brep对象返回
* @param
*
* @return
* -<em>当owner类型为brep时返回brep对象否则返回null</em>
*/
asBRepObject(): BRepObject | null;
/**
* @brief 作为SelectElement返回
* @param
*
* @return
* -<em>select对象或null</em>
*/
asSelectElement(): unknown;
}

View File

@@ -0,0 +1,21 @@
import { ViewMode } from './ViewMode';
import { ViewObject } from './ViewObject';
import { ViewObjType } from './ViewObjType';
import { SupVector } from '../types';
export declare class PlaneViewObject extends ViewObject {
readonly origin: SupVector;
readonly normal: SupVector;
readonly xdir: SupVector;
uMin: number;
uMax: number;
vMin: number;
vMax: number;
private wrappedRenders;
private wrappedRenderTexts;
constructor(origin?: SupVector, normal?: SupVector, xdir?: SupVector);
type(): ViewObjType;
protected computeSelects(mode: ViewMode): boolean;
protected computeRenders(mode: ViewMode): boolean;
appendText(text: string, position: [number, number, number]): void;
clearData(): void;
}

View File

@@ -0,0 +1,25 @@
import { ViewMode } from './ViewMode';
import { ViewObject } from './ViewObject';
import { ViewObjType } from './ViewObjType';
import { PolyGeometry } from '../geom';
export declare class PolyGeom2DVO extends ViewObject {
private wrappedGeom;
private wrappedRenders;
private wrappedPos;
private wrappedShowTriangles;
private wrappedTrianglesCfg;
constructor(geom: PolyGeometry);
setTrianglesLineColor(color: number): void;
setTrianglesLineWidth(width: number): void;
type(): ViewObjType;
protected computeSelects(mode: ViewMode): boolean;
protected computeRenders(mode: ViewMode): boolean;
private updateVisibility;
get geom(): PolyGeometry;
set geom(geom: PolyGeometry);
get showTriangles(): boolean;
set showTriangles(show: boolean);
get visible(): boolean;
set visible(show: boolean);
clearData(): void;
}

View File

@@ -0,0 +1,25 @@
import { ViewMode } from './ViewMode';
import { ViewObject } from './ViewObject';
import { ViewObjType } from './ViewObjType';
import { PolyGeometry } from '../geom';
export declare class PolyGeomVO extends ViewObject {
private wrappedGeom;
private wrappedRenders;
private wrappedPos;
private wrappedShowTriangles;
private wrappedTrianglesCfg;
constructor(geom: PolyGeometry);
setTrianglesLineColor(color: number): void;
setTrianglesLineWidth(width: number): void;
type(): ViewObjType;
protected computeSelects(mode: ViewMode): boolean;
protected computeRenders(mode: ViewMode): boolean;
private updateVisibility;
get geom(): PolyGeometry;
set geom(geom: PolyGeometry);
get showTriangles(): boolean;
set showTriangles(show: boolean);
get visible(): boolean;
set visible(show: boolean);
clearData(): void;
}

View File

@@ -0,0 +1,27 @@
import { Line2D, Line2DConfig, ICadView, Vec3 } from '../../content';
import { RenderAnnotationEle } from './RenderAnnotationEle';
import { RenderEleType } from './RenderEleType';
import { GroupConfig, RenderGroup } from './RenderGroup';
import { SupMat4 } from '../types';
export declare class RenderAnnoLine extends RenderAnnotationEle {
protected wrappedLine: Line2D;
constructor(points: Vec3[], group: RenderGroup, cfg: Line2DConfig, headArrow?: boolean, tailArrow?: boolean);
get points(): Vec3[];
set points(pnts: Vec3[]);
get headArrow(): boolean;
set headArrow(show: boolean);
get tailArrow(): boolean;
set tailArrow(show: boolean);
get visible(): boolean;
set visible(show: boolean);
get config(): Line2DConfig;
set config(cfg: Line2DConfig);
transform(mat: SupMat4): void;
type(): RenderEleType;
display(engine: ICadView, _config: GroupConfig): boolean;
remove(engine: ICadView): boolean;
removeByOwner(engine: ICadView, owner: unknown, _clearData: boolean): boolean;
copyData(group: RenderGroup): unknown;
isEmpty(): boolean;
hilight(cfg: GroupConfig): void;
}

View File

@@ -0,0 +1,28 @@
import { Text2D, Text3D, TextConfig, ICadView, Vec3 } from '../../content';
import { RenderAnnotationEle } from './RenderAnnotationEle';
import { RenderEleType } from './RenderEleType';
import { GroupConfig, RenderGroup } from './RenderGroup';
import { SupMat4, SupVector } from '../types';
export declare class RenderAnnoText extends RenderAnnotationEle {
protected wrappedText: Text2D | Text3D | null;
constructor(text: string, group: RenderGroup, cfg?: TextConfig | null);
get text(): string;
set text(str: string);
private createText;
get anchorPnt(): SupVector;
set anchorPnt(pnt: SupVector);
get direction(): number | Vec3;
set direction(dir: number | Vec3);
get facing(): Vec3;
set facing(dir: Vec3);
get visible(): boolean;
set visible(show: boolean);
transform(mat: SupMat4): void;
type(): RenderEleType;
display(engine: ICadView, config: GroupConfig): boolean;
remove(engine: ICadView): boolean;
removeByOwner(engine: ICadView, owner: unknown, clearData: boolean): boolean;
isEmpty(): boolean;
copyData(group: RenderGroup): unknown;
hilight(cfg: GroupConfig): void;
}

View File

@@ -0,0 +1,6 @@
import { Owner } from './Owner';
import { RenderElement } from './RenderElement';
export declare abstract class RenderAnnotationEle extends RenderElement {
owner: Owner | null;
isAnnotation(): boolean;
}

View File

@@ -0,0 +1,12 @@
/**
* @brief 渲染对象类型
*
*/
export declare enum RenderEleType {
Invalid = 0,//! 无效
Points = 1,//! 点集合
LineSegments = 2,//! 线段集合(线段可以不连续)
Mesh = 3,//! 面片集合
Text = 4,//! 文本
AnnoLine = 5
}

View File

@@ -0,0 +1,56 @@
import { ICadView } from '../../content';
import { RenderEleType } from './RenderEleType';
import { GroupConfig, RenderGroup } from './RenderGroup';
import { SupMat4 } from '../types';
/**
* @brief 渲染元素对象维护共享的attribute对象与与子对象其子对象引用共同的attribute
*
*/
export declare abstract class RenderElement {
protected wrappedGroup: RenderGroup;
constructor(group: RenderGroup);
abstract get visible(): boolean;
abstract set visible(show: boolean);
isGeomEle(): boolean;
isAnnotation(): boolean;
abstract transform(mat: SupMat4): void;
/**
* @brief 获取渲染对象类型
*
* @return
* -<em>RenderEleType 渲染对象类型</em>
*/
abstract type(): RenderEleType;
/**
* @brief 显示对象
* @param engine 底层显示引擎
*
* @return
* -<em>true 成功</em>
* -<em>true 失败</em>
*/
abstract display(engine: ICadView, config: GroupConfig): boolean;
/**
* @brief 移除显示
* @param engine 底层显示引擎
*
* @return
* -<em>是否成功</em>
*/
abstract remove(engine: ICadView): boolean;
abstract removeByOwner(engine: ICadView, owner: unknown, clearData: boolean): boolean;
abstract isEmpty(): boolean;
/**
* @brief 在group中创建一个拷贝对象同时将element的数据拷贝到该对象中不拷贝items对象
* @param group 拷贝对象的容器
*
* @return
* -<em>是否成功</em>
*/
abstract copyData(group: RenderGroup): unknown;
abstract hilight(cfg: GroupConfig): void;
unHilight(): void;
hilightOwner(cfg: GroupConfig, owner: unknown): void;
unHilightOwner(owner: unknown): void;
get group(): RenderGroup;
}

View File

@@ -0,0 +1,96 @@
import { Float32BufferAttribute } from 'three';
import { ICadView, ShapeConfig, ShapesBase } from '../../content';
import { Owner } from './Owner';
import { RenderElement } from './RenderElement';
import { RenderEleType } from './RenderEleType';
import { GroupConfig, RenderGroup } from './RenderGroup';
import { SupMat4 } from '../types';
/**
* @brief 渲染元素对象子对象,每一个子元素对应于显示对象的最小组成单元
*
*/
export declare class RenderElementItem {
protected wrappedOwner: Owner | null;
protected wrappedEle: RenderGeomEle;
protected wrappedStartIndex: number;
protected wrappedLength: number;
constructor(ele: RenderGeomEle);
get owner(): Owner | null;
set owner(owner: Owner | null);
get element(): RenderGeomEle;
get start(): number;
set start(index: number);
get length(): number;
set length(len: number);
}
/**
* @brief 渲染元素对象维护共享的attribute对象与与子对象其子对象引用共同的attribute
*
*/
export declare abstract class RenderGeomEle extends RenderElement {
readonly items: RenderElementItem[];
protected wrappedShapes: ShapesBase | null;
constructor(group: RenderGroup);
isGeomEle(): boolean;
transform(mat: SupMat4): void;
removeByOwner(engine: ICadView, owner: unknown, clearData: boolean): boolean;
isEmpty(): boolean;
get visible(): boolean;
set visible(show: boolean);
get shapes(): ShapesBase | null;
set shapes(shapes: ShapesBase | null);
abstract posAttr(): Float32BufferAttribute;
/**
* @brief
* @param
*
* @return
* -<em>1</em>
*/
getRenderItem(owner: any): RenderElementItem | undefined;
/**
* @brief 获取渲染对象类型
*
* @return
* -<em>RenderEleType 渲染对象类型</em>
*/
abstract type(): RenderEleType;
/**
* @brief 显示对象
* @param engine 底层显示引擎
*
* @return
* -<em>true 成功</em>
* -<em>true 失败</em>
*/
abstract display(engine: ICadView, config: GroupConfig): boolean;
/**
* @brief 移除显示
* @param engine 底层显示引擎
*
* @return
* -<em>是否成功</em>
*/
remove(engine: ICadView): boolean;
/**
* @brief 创建子对象
* @param
*
* @return
* -<em>创建的对象</em>
*/
createItem(owner: Owner, start: number, length: number): RenderElementItem;
displayItem(config: ShapeConfig, item: RenderElementItem, isHili?: boolean): boolean;
protected displayAllItems(config: ShapeConfig, isHili?: boolean): void;
removeItem(item: RenderElementItem, clearData?: boolean): boolean;
protected removeAllItems(clearData?: boolean): boolean;
/**
* @brief 是否为同一个几何
* @param
*
* @return
* -<em>1</em>
*/
abstract isSameGeom(ele: RenderGeomEle): boolean;
get group(): RenderGroup;
}

View File

@@ -0,0 +1,76 @@
import { Color } from 'three';
import { Line2DConfig, Text2DConfig, ICadView, LineConfig, PointConfig, ShapeConfig, TriangleConfig, ClippingMethod } from '../../content';
import { RenderElement } from './RenderElement';
import { RenderElementItem } from './RenderGeomEle';
import { ViewRenderObject } from './ViewObject';
import { SupMat4 } from '../types';
/**
* @brief group对象渲染设置类包括点、线、面的显示设置
*
*/
export declare class GroupConfig {
protected wrappedTriConfig: TriangleConfig;
protected wrappedLineConfig: LineConfig;
protected wrappedPntConfig: PointConfig;
clippingMethod: ClippingMethod;
clippingColor: Color;
customCfgs: Map<RenderElementItem, ShapeConfig>;
textCfg: Text2DConfig;
line2DCfg: Line2DConfig;
constructor();
get lineConfig(): LineConfig;
get pntConfig(): PointConfig;
get triConfig(): TriangleConfig;
get textConfig(): Text2DConfig;
}
/**
* @brief 渲染对象group用于将一系列相关联的对象组织起来
*
*/
export declare class RenderGroup {
readonly eles: RenderElement[];
readonly config: GroupConfig;
protected wrappedObject: ViewRenderObject | null;
constructor(object?: ViewRenderObject | null);
get visible(): boolean;
set visible(show: boolean);
/**
* @brief 变换对象
* @param matrix 变换矩阵
*
* @return
* -<em>无</em>
*/
transform(matrix: SupMat4): void;
/**
* @brief
* @param
*
* @return
* -<em>1</em>
*/
getRenderItem(owner: any): RenderElementItem | undefined;
/**
* @brief 显示group对象
* @param engine 底层显示引擎
*
* @return
* -<em>是否成功</em>
*/
display(engine: ICadView): boolean;
/**
* @brief 移除group对象
* @param engine 底层显示引擎
* @param clearData 是否清除显示数据
*
* @return
* -<em>是否成功</em>
*/
remove(engine: ICadView, clearData?: boolean): boolean;
removeElement(engine: ICadView, ele: RenderElement, clearData?: boolean): boolean;
removeByOwner(engine: ICadView, owner: unknown, clearData?: boolean): void;
clearData(): void;
protected clearElement(ele: RenderElement): void;
hilight(cfg: GroupConfig): void;
unHilight(): void;
}

View File

@@ -0,0 +1,33 @@
import { BufferAttribute, Float32BufferAttribute } from 'three';
import { ICadView } from '../../content';
import { RenderEleType } from './RenderEleType';
import { RenderGeomEle } from './RenderGeomEle';
import { GroupConfig, RenderGroup } from './RenderGroup';
/**
* @brief 线段链渲染对象
*
*/
export declare class RenderLineSegments extends RenderGeomEle {
display(engine: ICadView, config: GroupConfig): boolean;
posAttr(): Float32BufferAttribute;
type(): RenderEleType;
/**
* @brief 填充数据
* @param nodes 顶点数组3个为一个顶点
* @param index 下标数组2个为一组表示一条线段如果为空时两个点为一条线段
*
* @return
* -<em>无</em>
*/
fillData(nodes: number[] | Float32BufferAttribute, index: number[] | undefined, customAttributes?: {
name: string;
attr: BufferAttribute;
attributeSize?: number;
}[]): void;
copyData(group: RenderGroup): unknown;
isSameGeom(ele: RenderGeomEle): boolean;
hilight(cfg: GroupConfig): void;
unHilight(): void;
hilightOwner(cfg: GroupConfig, owner: unknown): void;
unHilightOwner(owner: unknown): void;
}

View File

@@ -0,0 +1,34 @@
import { BufferAttribute, Float32BufferAttribute } from 'three';
import { ICadView } from '../../content';
import { RenderEleType } from './RenderEleType';
import { RenderGeomEle } from './RenderGeomEle';
import { GroupConfig, RenderGroup } from './RenderGroup';
/**
* @brief 面片渲染数据
*
*/
export declare class RenderMesh extends RenderGeomEle {
display(engine: ICadView, config: GroupConfig): boolean;
posAttr(): Float32BufferAttribute;
type(): RenderEleType;
/**
* @brief 填充数据
* @param nodes 顶点数组,三个为一点
* @param normals 顶点法向数组,三个为一个方向
* @param index 顶点下标数组,三个为一个三角形,当为空时,三个顶点为一个三角形
*
* @return
* -<em>1</em>
*/
fillData(nodes: number[] | Float32BufferAttribute, normals: number[], index: number[] | undefined, customAttributes?: {
name: string;
attr: BufferAttribute;
attributeSize?: number;
}[]): void;
copyData(group: RenderGroup): unknown;
isSameGeom(ele: RenderGeomEle): boolean;
hilight(cfg: GroupConfig): void;
unHilight(): void;
hilightOwner(cfg: GroupConfig, owner: unknown): void;
unHilightOwner(owner: unknown): void;
}

View File

@@ -0,0 +1,25 @@
import { Float32BufferAttribute } from 'three';
import { ICadView } from '../../content';
import { RenderEleType } from './RenderEleType';
import { GroupConfig, RenderGroup } from './RenderGroup';
import { RenderGeomEle } from './RenderGeomEle';
export declare class RenderPoints extends RenderGeomEle {
display(engine: ICadView, config: GroupConfig): boolean;
posAttr(): Float32BufferAttribute;
type(): RenderEleType;
/**
* @brief 填充数据
* @param nodes 顶点数组,三个为一点
* @param index 顶点下标数组,一个为一个点
*
* @return
* -<em>1</em>
*/
fillData(nodes: number[] | Float32BufferAttribute, index: number[] | undefined): void;
copyData(group: RenderGroup): unknown;
isSameGeom(ele: RenderGeomEle): boolean;
hilight(cfg: GroupConfig): void;
unHilight(): void;
hilightOwner(cfg: GroupConfig, owner: unknown): void;
unHilightOwner(owner: unknown): void;
}

View File

@@ -0,0 +1,50 @@
import { IHitInfo } from '../../content';
import { SelectEleType, SelectMode } from './SelectMode';
import { Owner } from './Owner';
import { ViewSelectObject } from './ViewObject';
import { GroupConfig, RenderGroup } from './RenderGroup';
import { RenderElement } from './RenderElement';
/**
* @brief 拾取对象元素
*
*/
export declare abstract class SelectElement {
readonly selectMode: SelectMode;
readonly object: ViewSelectObject;
readonly owner: Owner;
enable: boolean;
constructor(mode: number, owner: Owner, object: ViewSelectObject);
abstract type(): SelectEleType;
/**
* @brief 相交信息是否为该对象
* @param info 相交信息
*
* @return
* -<em>true 是</em>
* -<em>false 不是</em>
*/
abstract isSelected(info: IHitInfo): boolean;
/**
* @brief 获取拾取对象的显示内容
* @param group 显示内容被填充的对象
* @param owner 创建render的owner
*
* @return
* -<em>是否成功</em>
*/
abstract getSelRender(group: RenderGroup, owner: unknown): boolean;
/**
* @brief 获取关联的显示元素
* @param
*
* @return
* -<em>关联的显示元素数组</em>
*/
abstract getRelatedRenders(): RenderElement[];
/**
* @brief 高亮
* @param cfg-高亮属性
*/
abstract hilight(cfg: GroupConfig): boolean;
abstract unHiligth(): boolean;
}

View File

@@ -0,0 +1,18 @@
import { IHitInfo } from '../../content';
import { RenderElement } from './RenderElement';
import { GroupConfig, RenderGroup } from './RenderGroup';
import { SelectElement } from './SelectElement';
import { SelectEleType } from './SelectMode';
/**
* @brief 拾取组对象,由一些的拾取子对象构成
*
*/
export declare class SelectGroupEle extends SelectElement {
readonly subElements: SelectElement[];
isSelected(info: IHitInfo): boolean;
getSelRender(group: RenderGroup, owner: unknown): boolean;
type(): SelectEleType;
getRelatedRenders(): RenderElement[];
hilight(cfg: GroupConfig): boolean;
unHiligth(): boolean;
}

View File

@@ -0,0 +1,74 @@
import { ICadView, IHitInfo } from '../../content';
import { SelectElement } from './SelectElement';
import { ViewMode } from './ViewMode';
import { ViewSelectObject } from './ViewObject';
export type SelectFilter = {
func: (ele: SelectElement) => boolean;
force: boolean;
};
/**
* @brief 拾取管理器
*
*/
export declare class SelectManager {
readonly filters: SelectFilter[];
private wrappedSelInfos;
private wrappedEngine;
private wrappedShapeSelMap;
private wrappedHitInfos;
/**
* @brief 载入拾取对象
* @param obj 被载入的拾取对象
* @param mode 显示模式
*
* @return
* -<em>是否成功</em>
*/
loadSelectObj(obj: ViewSelectObject, mode: ViewMode): boolean;
/**
* @brief 移除拾取对象
* @param obj 移除的拾取对象
* @param mode 显示模式
*
* @return
* -<em>是否成功</em>
*/
removeSelectObj(obj: ViewSelectObject, mode: ViewMode): boolean;
/**
* @brief 点选拾取对象
* @param x x坐标dom元素坐标
* @param y y坐标dom元素坐标
*
* @return
* -<em>是否成功</em>
*/
select(infos: IHitInfo[]): boolean;
/**
* @brief 框选拾取对象
* @param _min 框选最小点坐标dom元素坐标
* @param _max 框选最大点坐标dom元素坐标
*
* @return
* -<em>是否成功</em>
*/
boxSelect(_min: number[], _max: number[]): boolean;
/**
* @brief 获取拾取对象
*
* @return
* -<em>上次拾取到的所有对象</em>
*/
getSelectEles(): SelectElement[];
/**
* @brief 获取拾取点信息
* @param 拾取对象
*
* @return 拾取点信息
*/
getHitInfo(ele: SelectElement): IHitInfo | undefined;
get selTol(): number;
set selTol(tol: number);
get infos(): IHitInfo[];
get engine(): ICadView | null;
set engine(engine: ICadView | null);
}

View File

@@ -0,0 +1,40 @@
import { ShapeType } from '../brep/BRepType';
/**
* @brief 拾取模式
*
*/
export declare enum SelectMode {
SM_None = 0,//! 无拾取模式
SM_BRepVertex = 1,//! 顶点拾取模式
SM_BRepEdge = 2,//! 边拾取模式
SM_BRepFace = 3,//! 面拾取模式
SM_BRepWire = 4,//! wire拾取模式
SM_BRepShell = 5,//! shell拾取模式
SM_BRepSolid = 6,//! solid拾取模式
SM_BRepCompound = 7,//! compound拾取模式
SM_MeshNode = 8,//! 网格节点拾取模式
SM_MeshEdge = 9,//! 网格边拾取模式
SM_MeshFace = 10,//! 网格面拾取模式
SM_MeshElement = 11
}
/**
* @brief 扩展拾取模式
*
*/
export declare enum ExtendSelMode {
ESM_Undefined = 0,
ESM_MeshSurfNodes = 1,//! 选择特征面网格点
ESM_MeshAllNodes = 2,//! 选择所有网格点
ESM_MeshSurfFaces = 3,//! 选择特征面网格面
ESM_MeshAllFaces = 4,//! 选择所有网格面
ESM_MeshCurveEdges = 5
}
export declare function BRepTypeToSelectType(brepType: ShapeType): number;
/**
* @brief 拾取元素类型
*
*/
export declare enum SelectEleType {
SET_Single = 0,//! 单个元素类型
SET_Group = 1
}

View File

@@ -0,0 +1,21 @@
import { IHitInfo } from '../../content';
import { RenderElement } from './RenderElement';
import { RenderElementItem } from './RenderGeomEle';
import { GroupConfig, RenderGroup } from './RenderGroup';
import { SelectElement } from './SelectElement';
import { SelectEleType } from './SelectMode';
import { ViewSelectObject } from './ViewObject';
/**
* @brief 拾取单元素对象,每个对象与一个显示对象对应
*
*/
export declare class SelectSingleEle extends SelectElement {
readonly target: RenderElementItem;
constructor(target: RenderElementItem, mode: number, object: ViewSelectObject);
isSelected(info: IHitInfo): boolean;
getSelRender(group: RenderGroup, o: unknown): boolean;
type(): SelectEleType;
getRelatedRenders(): RenderElement[];
hilight(cfg: GroupConfig): boolean;
unHiligth(): boolean;
}

View File

@@ -0,0 +1,42 @@
import { Color, Float32BufferAttribute } from 'three';
import { StreamLine, StreamLineProp } from '../mesh';
import { IBindLegendObj, Legend, LegendUpdateArg } from './Legend';
import { ViewMode } from './ViewMode';
import { ViewObject } from './ViewObject';
import { ViewObjType } from './ViewObjType';
interface IPropertyData {
attr: Float32BufferAttribute;
min: number;
max: number;
size: number;
}
/**
* @brief 流线对象显示组件
*
*/
export declare class StreamLineVO extends ViewObject implements IBindLegendObj {
protected wrappedLegend: Legend | null;
protected wrappedGeom: StreamLine;
private wrappedRenders;
protected wrappedProperties: Map<string, IPropertyData>;
protected wrappedCurProp: string;
protected wrappedLineColor: Color;
constructor(geom: StreamLine);
protected onLegendUpdateCB: (arg?: LegendUpdateArg) => void;
unbindLegend: (legend: Legend) => void;
useLegend: boolean;
bindLegend: (legend: Legend) => void;
type(): ViewObjType;
protected computeSelects(_mode: ViewMode): boolean;
protected computeRenders(mode: ViewMode): boolean;
attachProperty(data: StreamLineProp): boolean;
activeProperty(name: string): boolean;
setLineColor(color: number): void;
private updateProperty;
private legendCB;
get legend(): Legend | null;
get geom(): StreamLine;
get props(): Map<string, IPropertyData>;
clearData(): void;
}
export {};

View File

@@ -0,0 +1,16 @@
import { Triangulation } from '../geom';
import { ViewMode } from './ViewMode';
import { ViewObject } from './ViewObject';
import { ViewObjType } from './ViewObjType';
export declare class TriangulationVO extends ViewObject {
protected wrappedTriangles: Triangulation;
private wrappedRenders;
private wrappedPos;
constructor(triangles: Triangulation);
get triangulation(): Triangulation;
set triangulation(triangles: Triangulation);
type(): ViewObjType;
protected computeSelects(mode: ViewMode): boolean;
protected computeRenders(mode: ViewMode): boolean;
clearData(): void;
}

View File

@@ -0,0 +1,57 @@
import { Color, Float32BufferAttribute } from 'three';
import { VectorData } from '../mesh';
import { IBindLegendObj, Legend, LegendUpdateArg } from './Legend';
import { ViewMode } from './ViewMode';
import { ViewObject } from './ViewObject';
import { ViewObjType } from './ViewObjType';
interface IPropertyData {
attr: Float32BufferAttribute;
min: number;
max: number;
}
export interface IArrowCfg {
scale: boolean;
tailLen: number;
tailRad: number;
headLen: number;
headRad: number;
}
/**
* @brief 矢量图对象显示组件
*
*/
export declare class VectorGraphVO extends ViewObject implements IBindLegendObj {
readonly arrowCfg: IArrowCfg;
protected wrappedLegend: Legend | null;
protected wrappedData: VectorData;
private wrappedRenders;
protected wrappedProperty: IPropertyData | null;
protected wrappedUseProp: boolean;
protected wrappedScaled: boolean;
protected wrappedOrigin: number;
protected wrappedFactor: number;
protected wrappedSolidColor: Color;
constructor(data: VectorData);
protected onLegendUpdateCB: (arg?: LegendUpdateArg) => void;
unbindLegend: (legend: Legend) => void;
useLegend: boolean;
bindLegend: (legend: Legend) => void;
type(): ViewObjType;
protected computeSelects(_mode: ViewMode): boolean;
protected computeRenders(mode: ViewMode): boolean;
get useProperty(): boolean;
set useProperty(use: boolean);
setFaceColor(color: number): void;
private updateProperty;
get legend(): Legend | null;
get data(): VectorData;
get factor(): number;
set factor(factor: number);
get origin(): number;
set origin(origin: number);
get scaled(): boolean;
set scaled(scale: boolean);
get prop(): IPropertyData | null;
clearData(): void;
}
export {};

View File

@@ -0,0 +1,239 @@
import { Vector3 } from 'three';
import { LiteEvent } from '../../core';
import { ICadView, IHitInfo, IContentManager } from '../../content';
import { GroupConfig, RenderGroup } from './RenderGroup';
import { SelectElement } from './SelectElement';
import { SelectManager } from './SelectManager';
import { ExtendSelMode, SelectMode } from './SelectMode';
import { ViewMode } from './ViewMode';
import { ViewObject } from './ViewObject';
import { LegendManager } from './LegendManager';
import { NodeBasedMeshVO } from './NodeBasedMeshVO';
import { SupColor, SupVec2, SupVector } from '../types';
export declare enum enSelectEvent {
AddSelect = 0,
DelSelect = 1
}
export interface SelectEventArg {
event: enSelectEvent;
arg: SelectElement[];
}
export declare enum ViewOrientation {
Top = 0,
Bottom = 1,
Front = 2,
Back = 3,
Left = 4,
Right = 5,
TopFrontLeft = 6
}
export declare enum RotationMode {
Dynamic = 0,
XAxis = 1,
YAxis = 2,
ZAxis = 3,
Custom = 4
}
export declare enum InteractiveMode {
Normal = 0,
CreateLine = 1
}
export declare enum InterEventType {
SelectStart = 0,
SelectEnd = 1
}
export interface InterEventArg {
type: InterEventType;
args: unknown;
}
export interface CreateLineArgs extends InterEventArg {
args: SupVector;
}
/**
* @brief 三维视图对象
*
*/
export declare class View {
selectMode: SelectMode;
selectEvent: LiteEvent<SelectEventArg>;
interEvent: LiteEvent<InterEventArg>;
readonly legendMgr: LegendManager;
extendSelMode: ExtendSelMode;
extendSelParam: number[];
protected wrappedEngine: (ICadView & IContentManager) | undefined;
protected wrappedObjects: ViewObject[];
protected wrappedViewMode: ViewMode;
protected wrappedSelManager: SelectManager;
protected wrappedSelectGroup: RenderGroup;
protected wrappedDynSelGroup: RenderGroup;
protected wrappedDetectedEle: SelectElement | null;
protected wrappedSelectedEles: SelectElement[];
private wrappedEnableClipping;
private wrappedEnableDynSel;
private wrappedInterMode;
private wrappedCLPS;
private wrappedCLPE;
private wrappedCLRender;
get dynSelCfg(): GroupConfig;
get selConfig(): GroupConfig;
constructor();
bindEngine(engine: ICadView): void;
get enableClipping(): boolean;
set enableClipping(value: boolean);
get enableDynSel(): boolean;
set enableDynSel(enable: boolean);
set selectTol(value: number);
get selectTol(): number;
private fitRange;
/**
* @brief 适应旋转中心
*/
fitRotCenter(objs?: ViewObject[]): void;
/**
* @brief 适合窗口
*/
fitAll(): void;
fitObjects(objs: ViewObject[]): void;
private updateCB;
/**
* @brief 显示对象
* @param obj - 待显示对象
*
* @return
* -<em>是否成功</em>
*/
display(obj: ViewObject): boolean;
reDisplay(obj: ViewObject): boolean;
/**
* @brief 移除对象
* @param
*
* @return
* -<em>移除是否成功</em>
*/
remove(obj: ViewObject): boolean;
/**
* @brief 移除所有对象
*/
removeAll(): void;
/**
* @brief 检测对象
* @param x - dom元素的offsetX
* @param y - dom元素的offsetY
*
*/
detect(infos: IHitInfo[] | undefined): void;
/**
* @brief 清除detected对象
* @param
*
* @return
* -<em>无</em>
*/
clearDetected(): void;
/**
* @brief 拾取对象
* @param ele 被拾取的对象
*/
selectElement(ele: SelectElement): void;
/**
* @brief 拾取多个对象
* @param eles 被拾取的对象数组
*/
selectElements(eles: SelectElement[]): void;
/**
* @brief 选中指定网格对象所有节点
* @param obj-指定网格对象
*/
selectAllNodes(obj: NodeBasedMeshVO): void;
/**
* @brief 获取拾取点坐标
* @param ele 拾取的对象
*/
getHitPoint(ele: SelectElement): Vector3 | undefined;
/**
* @brief 拾取检测到的对象
*
* @return
* -<em>无</em>
*/
selectDetected(): void;
/**
* @brief 移除拾取对象
* @param ele 被移除的拾取对象
*
* @return
* -<em>无</em>
*/
removeSelect(ele: SelectElement): void;
private removeSelectByIndex;
clearSelect(): void;
/**
* @brief 拾取对象
* @param x - dom元素的offsetX
* @param y - dom元素的offsetY
*
* @return
* -<em>是否成功</em>
*/
select(infos: IHitInfo[]): void;
private updateObjViewMode;
private updateObject;
get viewMode(): ViewMode;
set viewMode(mode: ViewMode);
get selects(): SelectElement[];
get selManager(): SelectManager;
viewAt(orient: ViewOrientation): void;
lookAt(eye: SupVector, target: SupVector, up: SupVector): void;
setBgColor(color: SupColor | SupColor[]): void;
activeLegend(): void;
deactiveLegend(): void;
screenToWorld(sPos: SupVec2): {
pos: SupVector;
dir: SupVector;
};
worldToScreen(wPos: SupVector): SupVec2;
get engine(): (ICadView & IContentManager) | undefined;
get detectedElement(): SelectElement | null;
/**
* @brief 设置旋转模式
* @param mode-旋转模式
* @param axis-旋转轴
*/
setRotMode(mode: RotationMode, axis?: {
pos: SupVector;
dir: SupVector;
} | undefined): void;
/**
* @brief 使能标尺
*/
get enableRuler(): boolean;
set enableRuler(enable: boolean);
/**
* @brief 切换2D、3D模式
*/
set2DMode(enable: boolean): void;
/**
* @brief 生成label位置
*/
getLabelTextAnchor(anchor: SupVector, offset?: SupVec2): SupVector;
/**
* @brief 使能交互模式
*/
enableInterMode(mode: InteractiveMode): boolean;
get interMode(): InteractiveMode;
private createLineEvent;
get createLineStart(): SupVector | null;
get createLineEnd(): SupVector | null;
/**
* @brief 高亮viewObject对象
* @param obj-需要高亮的viewObject对象
* @param cfg-高亮配置
*
* @return 高亮成功与否
*/
hilightObject(obj: ViewObject, cfg: GroupConfig): boolean;
unHilight(obj: ViewObject): boolean;
hilightOwner(obj: ViewObject, owner: unknown, cfg: GroupConfig): void;
unHilightOwner(obj: ViewObject, owner: unknown): void;
}

View File

@@ -0,0 +1,9 @@
/**
* @brief 显示模式枚举
*
*/
export declare enum ViewMode {
WireFrame = 0,//! 线框模式
Shaded = 1,//! 面渲染模式
WireShaded = 2
}

View File

@@ -0,0 +1,21 @@
/**
* @brief 视图对象类型
*
*/
export declare enum ViewObjType {
Invalid = 0,//! 无效类型
BRepType = 1,//! BRep对象类型
CellMeshType = 2,//! CellMesh对象类型
NodeMeshType = 3,//! NodeMesh对象类型
VectorGraphType = 4,//! 矢量图对象类型
StreamLineType = 5,//! 流线图对象类型
TriangulationType = 6,//! 三角化对象类型
PlaneType = 7,//! 平面对象
PolyGeomType = 8,//! 多边形几何对象类型
DatumPointType = 9,// datum point
DatumAxisType = 10,// datum axis
LengthDim3DType = 11,// 长度尺寸类型
AnnoPlaneType = 12,// 平面标识对象
AnnoLabelType = 13,// 标签对象
CustomType = 1000
}

View File

@@ -0,0 +1,137 @@
import { LiteEvent } from '../../core';
import { ICadView, PointShape, ShapeConfig } from '../../content';
import { RenderElementItem } from './RenderGeomEle';
import { RenderGroup } from './RenderGroup';
import { SelectElement } from './SelectElement';
import { SelectMode } from './SelectMode';
import { ViewMode } from './ViewMode';
import { ViewObjType } from './ViewObjType';
import { SupBox, SupMat4 } from '../types';
export declare enum UpdateEventType {
Redisplay = 0,// 重新显示
ViewModeChanged = 1,// 视图模式改变
Update = 2
}
export interface UpdateEventArg {
type: UpdateEventType;
arg: unknown;
}
export interface ViewModeChangedArg {
object: ViewObject;
mode: ViewMode | null;
}
/**
* @brief 显示对象
*
*/
export declare abstract class ViewRenderObject {
updateEvent: LiteEvent<UpdateEventArg>;
protected wrappedGroup: RenderGroup;
protected wrappedBox: SupBox;
protected wrappedVisible: boolean;
constructor();
get visible(): boolean;
set visible(show: boolean);
/**
* @brief 设置面、线、点颜色
* @param color 颜色
*
* @return
* -<em>无</em>
*/
setFaceColor(color: number): void;
setLineColor(color: number): void;
setLineWidth(width: number): void;
setPntColor(color: number): void;
setPntSize(size: number): void;
setPntShape(shape: PointShape): void;
setClippingColor(color: number): void;
transform(matrix: SupMat4): void;
get boundingBox(): SupBox;
protected updateBox(): void;
/**
* @brief 设置全部透明度
*/
setAllTransparent(opacity: number): void;
/**
* @brief 设置透明度
*/
setTransparent(opacity: number): void;
setItemCustomCfg(item: RenderElementItem, cfg: ShapeConfig): void;
unSetItemCustomCfg(item: RenderElementItem): void;
unSetAllCustomCfg(): void;
/**
* @brief 计算相应模式下的显示数据
* @param mode 显示模式
*
* @return
* -<em>是否成功</em>
*/
protected abstract computeRenders(mode: ViewMode): boolean;
get group(): RenderGroup;
}
/**
* @brief 拾取对象
*
*/
export declare abstract class ViewSelectObject extends ViewRenderObject {
protected wrappedSelections: Map<ViewMode, SelectElement[]>;
protected wrappedActiveModes: SelectMode[];
constructor();
/**
* @brief 获取拾取对象
* @param mode 显示模式
*
* @return
* -<em>该模式下的拾取对象数组</em>
*/
getSelects(mode: ViewMode): SelectElement[];
get activeModes(): SelectMode[];
set activeModes(modes: SelectMode[]);
/**
* @brief 计算相应模式下的拾取数据
* @param mode 显示模式
*
* @return
* -<em>是否成功</em>
*/
protected abstract computeSelects(mode: ViewMode): boolean;
}
/**
* @brief 视图对象接口
*
*/
export declare abstract class ViewObject extends ViewSelectObject {
isBind: boolean;
protected wrappedViewMode: ViewMode | null;
abstract type(): ViewObjType;
/**
* @brief 显示
* @param engine 底层显示引擎
* @param mode 显示模式
*
* @return
* -<em>1</em>
*/
display(engine: ICadView, mode: ViewMode): boolean;
/**
* @brief 移除显示
* @param engine 底层显示引擎
*
* @return
* -<em>是否成功</em>
*/
remove(engine: ICadView): boolean;
/**
* @brief 切换显示模式
* @param engine 底层显示引擎
* @param mode 显示模式
*
* @return
* -<em>是否成功</em>
*/
onViewModeChanged(engine: ICadView, mode: ViewMode): void;
get viewMode(): ViewMode | null;
set viewMode(mode: ViewMode | null);
clearData(): void;
}

View File

@@ -0,0 +1 @@
export {};

View File

@@ -0,0 +1,10 @@
export declare const MeshData: {
file_type: string;
dimension: number;
range: number[];
mesh_levels: {
level: number;
resolution: number[];
cell_idx: number[];
}[];
};

View File

@@ -0,0 +1 @@
export {};

View File

@@ -0,0 +1,6 @@
export declare const MeshData: {
file_type: string;
description: string;
nodes: number[][];
elements: number[][];
};

View File

@@ -0,0 +1 @@
export {};

View File

@@ -0,0 +1 @@
export {};

Some files were not shown because too many files have changed in this diff Show More