From 207a9767a5453c887288aaaa5b0a6c7db86541f5 Mon Sep 17 00:00:00 2001 From: ZoeLeeFZ Date: Wed, 18 Mar 2020 16:12:49 +0800 Subject: [PATCH] =?UTF-8?q?!797=20=E4=BC=98=E5=8C=96=EF=BC=9A=E5=AF=BC?= =?UTF-8?q?=E5=87=BA=E5=A4=8D=E5=90=88=E5=AE=9E=E4=BD=93?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/Add-on/ExportData.tsx | 50 ++++++++++++++++++- .../Entity/CompositeEntity.ts | 23 ++++++++- src/UI/Components/Asset.tsx | 6 +-- src/UI/Components/MaterialExplorer.tsx | 7 +-- .../RightPanel/CompositeMetalsPanel.tsx | 4 +- 5 files changed, 77 insertions(+), 13 deletions(-) diff --git a/src/Add-on/ExportData.tsx b/src/Add-on/ExportData.tsx index 76a1022bd..79d177413 100644 --- a/src/Add-on/ExportData.tsx +++ b/src/Add-on/ExportData.tsx @@ -25,6 +25,13 @@ import { PromptStatus } from "../Editor/PromptResult"; import { ModalFooter, ModalHeader } from '../UI/Components/Modal/ModalContainer'; import { ModalPosition } from '../UI/Components/Modal/ModalInterface'; import { TopPanelStore } from '../UI/Store/TopPanelStore'; +import { CompositeEntity } from './../DatabaseServices/Entity/CompositeEntity'; +import { Hole } from './../DatabaseServices/3DSolid/Hole'; +import { Vector3 } from 'three'; +import { ExtrudeHole } from '../DatabaseServices/3DSolid/ExtrudeHole'; +import { CylinderHole } from '../DatabaseServices/3DSolid/CylinderHole'; +import { HardwareTopline } from '../DatabaseServices/Hardware/HardwareTopline'; +import { HardwareCompositeEntity } from '../DatabaseServices/Hardware/HardwareCompositeEntity'; export class ExportDataModal extends React.Component<{ msg: string; }, {}>{ private removeFuncs: Function[] = []; //移除注入 private Close() @@ -73,11 +80,10 @@ export class Command_ExportData implements Command return; } - let ssRes = await app.Editor.GetSelection({ Filter: { filterTypes: [Board, SweepSolid] } }); + let ssRes = await app.Editor.GetSelection({ Filter: { filterTypes: [Board, SweepSolid, CompositeEntity] } }); if (ssRes.Status !== PromptStatus.OK) return; let ents = ssRes.SelectSet.SelectEntityList; let d = Entitys2Data(ents); - let dstr = JSON.stringify(d); if (await app.WebSocket.Connect()) { @@ -108,6 +114,10 @@ export function Entitys2Data(ents: Entity[]) d.Entitys.push(ConverSweep2Data(e)); else if (e instanceof Region) d.Entitys.push(ConveRegion2Data(e)); + else if (e instanceof Hole) + d.Entitys.push(ConvertHole2Data(e)); + else if (e instanceof CompositeEntity) + d.Entitys.push(...CompositeEntity2Data(e)); else continue; arrayLast(d.Entitys).Visible = e.Visible; @@ -158,6 +168,7 @@ function ConvertBoard2Data(br: ExtrudeSolid): Object ed.Type = "Board"; ed.CabinetName = br.BoardProcessOption.cabinetName; ed.RoomName = br.BoardProcessOption.roomName; + ed.CabinetName = ed.RoomName; ed.UVType = br.BoardProcessOption.lines; ed.MaterialId = br.Material?.Index || 0; } @@ -174,6 +185,10 @@ function ConverSweep2Data(e: SweepSolid) ed.OCS = e.OCS.toArray(); ed.Contour = Curve2Data(e.Contour); ed.Path = Curve2Data(e.Path); + ed.MaterialId = e.Material?.Index || 0; + let roomName = e instanceof HardwareTopline ? e.HardwareOption.roomName : "未命名"; + ed.RoomName = roomName; + ed.CabinetName = ed.RoomName; return ed; } @@ -219,3 +234,34 @@ function ConverMaterial(material: PhysicalMaterialRecord) d.useRoughnessMap = material.useRoughnessMap; return d; } + +function ConvertHole2Data(h: Hole) +{ + let ed: any = {}; + ed.Id = h.Id?.Index ?? 0; + ed.OCS = h.OCS.toArray(); + ed.Thickness = h.Height; + if (h instanceof ExtrudeHole) + ed.Contour = Curve2Data(h.ContourCurve); + else + { + let rad = (h as CylinderHole).Radius; + ed.Contour = Curve2Data(new Circle(new Vector3(rad, rad), rad)); + } + ed.Type = "Extrude"; + ed.MaterialId = h.Material?.Index || 0; + return ed; +} +function CompositeEntity2Data(comp: CompositeEntity) +{ + let data = Entitys2Data(comp.Explode()).Entitys; + let roomName = comp instanceof HardwareCompositeEntity ? comp.HardwareOption.roomName : "未命名"; + if (comp.Id) + for (let i = 0; i < data.length; i++) + { + data[i].Id = comp.Id.Index * -100 - i; + data[i].RoomName = roomName; + data[i].CabinetName = data[i].RoomName; + } + return data; +} diff --git a/src/DatabaseServices/Entity/CompositeEntity.ts b/src/DatabaseServices/Entity/CompositeEntity.ts index f910b814d..d4207a2c1 100644 --- a/src/DatabaseServices/Entity/CompositeEntity.ts +++ b/src/DatabaseServices/Entity/CompositeEntity.ts @@ -30,7 +30,12 @@ export class CompositeEntity extends Entity */ Explode() { - return this.Entitys.map(e => e.Clone().ApplyMatrix(this.OCS)); + return this.Entitys.map(e => + { + let cloneE = e.Clone(); + cloneE.Material = e.Material; + return cloneE.ApplyMatrix(this.OCS); + }); } get BoundingBox() { @@ -54,13 +59,27 @@ export class CompositeEntity extends Entity obj.add(e.DrawObject); } } - + get Material() + { + return super.Material; + } + set Material(id) + { + super.Material = id; + for (let e of this.Entitys) + e.Material = id; + } UpdateRenderType(renderType: RenderType) { for (let e of this.Entitys) e.UpdateRenderType(renderType); this.DrawObject.updateMatrixWorld(true); } + UpdateDrawObjectMaterial(renderType: RenderType, obj: Object3D) + { + for (let e of this.Entitys) + e.UpdateDrawObjectMaterial(renderType, obj); + } //#endregion diff --git a/src/UI/Components/Asset.tsx b/src/UI/Components/Asset.tsx index 9d4fa071c..d27566ea6 100644 --- a/src/UI/Components/Asset.tsx +++ b/src/UI/Components/Asset.tsx @@ -115,15 +115,11 @@ export class Asset extends React.Component<{ material: PhysicalMaterialRecord; } let material = this.props.material as PhysicalMaterialRecord; for (let en of app.Editor.SelectCtrl.SelectSet.SelectEntityList) { + en.Material = material.Id; if (en instanceof Board) { - en.Material = material.Id; ApplyGoodInfo(en, material); } - else if (en instanceof Region) - { - en.Material = material.Id; - } } app.Viewer.UpdateRender(); diff --git a/src/UI/Components/MaterialExplorer.tsx b/src/UI/Components/MaterialExplorer.tsx index f9a9d5b9e..989f67ba2 100644 --- a/src/UI/Components/MaterialExplorer.tsx +++ b/src/UI/Components/MaterialExplorer.tsx @@ -66,10 +66,11 @@ export class MaterialExplorer extends React.Component<{ materialTable: MaterialT if (en instanceof Board) { en.Material = material.Id; - ApplyGoodInfo(en, material); + if (en instanceof Board) + { + ApplyGoodInfo(en, material); + } } - else if (en instanceof Region) - en.Material = material.Id; } }, "拽拖材质应用"); } diff --git a/src/UI/Components/RightPanel/CompositeMetalsPanel.tsx b/src/UI/Components/RightPanel/CompositeMetalsPanel.tsx index 39156b514..d8633d28d 100644 --- a/src/UI/Components/RightPanel/CompositeMetalsPanel.tsx +++ b/src/UI/Components/RightPanel/CompositeMetalsPanel.tsx @@ -86,7 +86,9 @@ export class CompositeMatalPanel extends React.Component