diff --git a/src/DatabaseServices/3DSolid/SweepSolid.ts b/src/DatabaseServices/3DSolid/SweepSolid.ts index 479d0b9ff..db16b4245 100644 --- a/src/DatabaseServices/3DSolid/SweepSolid.ts +++ b/src/DatabaseServices/3DSolid/SweepSolid.ts @@ -1,5 +1,7 @@ -import * as THREE from 'three'; -import { Matrix4, Mesh, MeshNormalMaterial, Object3D, Vector3, LineSegments } from "three"; +import { LineSegments, Matrix4, Mesh, Object3D, Vector3 } from "three"; +import { ColorMaterial } from '../../Common/ColorPalette'; +import { DisposeThreeObj } from '../../Common/Dispose'; +import { EdgesGeometry } from '../../Geometry/EdgeGeometry'; import { equalv3, isParallelTo, MoveMatrix } from '../../Geometry/GeUtils'; import { SweepGeometry } from '../../Geometry/SweepGeometry'; import { RenderType } from "../../GraphicsSystem/RenderType"; @@ -10,9 +12,6 @@ import { PhysicalMaterialRecord } from '../PhysicalMaterialRecord'; import { IsPointInPolyLine } from '../PointInPolyline'; import { Polyline } from '../Polyline'; import { Solid3D } from "./Solid3D"; -import { EdgesGeometry } from '../../Geometry/EdgeGeometry'; -import { ColorMaterial } from '../../Common/ColorPalette'; -import { DisposeThreeObj } from '../../Common/Dispose'; @Factory export class SweepSolid extends Solid3D @@ -101,37 +100,68 @@ export class SweepSolid extends Solid3D console.log("提供的轮廓没有和路径垂直"); } - CreateGeomtry() + private _MeshGeometry: SweepGeometry; + private get MeshGeometry() { + if (this._MeshGeometry) + return this._MeshGeometry; + let swpGeo = new SweepGeometry(this.m_Contour, this.m_PathCurve); swpGeo.applyMatrix(this.m_Contour.OCS); - return new SweepGeometry(this.m_Contour, this.m_PathCurve); + this._MeshGeometry = new SweepGeometry(this.m_Contour, this.m_PathCurve); + + return this._MeshGeometry; } - private GetObject3DByRenderType(renderType: RenderType) + + private _EdgeGeometry: EdgesGeometry; + private get EdgeGeometry() { - if (renderType === RenderType.Wireframe) - { - let geo = new EdgesGeometry().fromGeometry(this.CreateGeomtry()); - return new LineSegments(geo, ColorMaterial.GetLineMaterial(this.ColorIndex)); - } - else - { - if (this.materialId && this.materialId.Object) - { - let material = this.materialId.Object as PhysicalMaterialRecord; - return new Mesh(this.CreateGeomtry(), material.Material); - } - else return new THREE.Mesh(this.CreateGeomtry(), new MeshNormalMaterial()); - } + if (this._EdgeGeometry) + return this._EdgeGeometry; + + this._EdgeGeometry = new EdgesGeometry().FromGeometry(this.MeshGeometry); + return this._EdgeGeometry; } + InitDrawObject(renderType: RenderType): Object3D { - return new Object3D().add(this.GetObject3DByRenderType(renderType)); + if (renderType === RenderType.Wireframe) + return new LineSegments(this.EdgeGeometry, ColorMaterial.GetLineMaterial(this.ColorIndex)); + else if (renderType === RenderType.Conceptual) + { + return new Object3D().add( + new Mesh(this.MeshGeometry, ColorMaterial.GetConceptualMaterial(this.ColorIndex)), + new LineSegments(this.EdgeGeometry, ColorMaterial.GetLineMaterial(7)) + ); + } + if (renderType === RenderType.Physical) + return new Mesh(this.MeshGeometry, this.MeshMaterial); } - UpdateDrawObject(type: RenderType, en: Object3D) + UpdateDrawObject(renderType: RenderType, obj: Object3D) { - DisposeThreeObj(en); - en.add(this.GetObject3DByRenderType(type)); + DisposeThreeObj(obj); + this._EdgeGeometry = undefined; + this._MeshGeometry = undefined; + + if (renderType === RenderType.Wireframe) + { + let l = obj as LineSegments; + l.geometry = this.EdgeGeometry; + l.material = ColorMaterial.GetLineMaterial(this.ColorIndex); + } + else if (renderType === RenderType.Conceptual) + { + return obj.add( + new Mesh(this.MeshGeometry, ColorMaterial.GetConceptualMaterial(this.ColorIndex)), + new LineSegments(this.EdgeGeometry, ColorMaterial.GetLineMaterial(7)) + ); + } + else if (renderType === RenderType.Physical) + { + let mesh = obj as Mesh; + mesh.geometry = this.MeshGeometry; + mesh.material = this.MeshMaterial; + } } /** diff --git a/src/DatabaseServices/Entity.ts b/src/DatabaseServices/Entity.ts index 01ab72eb4..790a25da5 100644 --- a/src/DatabaseServices/Entity.ts +++ b/src/DatabaseServices/Entity.ts @@ -161,6 +161,7 @@ export class Entity extends CADObject else { let drawObj = this.InitDrawObject(renderType); + if (drawObj === undefined) return; //矩阵直接使用指针,因为已经关闭自动更新,所以矩阵不会被Object3D修改. drawObj.matrixAutoUpdate = false;