From 6732363aa610e0c982020d6d1a73c33d5eefec12 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=BB=84=E8=AF=97=E6=B4=A5?= <2723065175@qq.com> Date: Tue, 9 Jul 2024 08:32:28 +0000 Subject: [PATCH] =?UTF-8?q?!2567=20=E5=8A=9F=E8=83=BD:=E6=8B=86=E5=8D=95?= =?UTF-8?q?=E6=97=B6=E6=A3=80=E6=9F=A5=E6=9D=BF=E7=BC=96=E5=8F=B7,?= =?UTF-8?q?=E6=8F=90=E7=A4=BA=E6=98=AF=E5=90=A6=E6=8C=89=E5=9B=BE=E7=BA=B8?= =?UTF-8?q?/=E6=88=BF=E9=97=B4/=E6=9F=9C=E4=BD=93=E8=87=AA=E5=8A=A8?= =?UTF-8?q?=E7=BC=96=E5=8F=B7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/Add-on/DrawDrilling/DrillingReactor.ts | 7 + src/Add-on/Erp/CustomBoardNumber.tsx | 187 +++++++++++++++++++++ src/Add-on/Erp/ErpCommands.ts | 17 ++ 3 files changed, 211 insertions(+) create mode 100644 src/Add-on/Erp/CustomBoardNumber.tsx diff --git a/src/Add-on/DrawDrilling/DrillingReactor.ts b/src/Add-on/DrawDrilling/DrillingReactor.ts index 897ab5c1a..e1d5a87dd 100644 --- a/src/Add-on/DrawDrilling/DrillingReactor.ts +++ b/src/Add-on/DrawDrilling/DrillingReactor.ts @@ -57,6 +57,13 @@ const ForbidReactorCmd = new Set([ CommandNames.RemoveLayer, CommandNames.RemoveLayerFolder, + //拆单 + CommandNames.ChaiDan, + CommandNames.ChaiDanJB, + CommandNames.ChaiDanExport, + + //自定义生成板号 + CommandNames.CustomNumber, ]); export class DrillingReactor diff --git a/src/Add-on/Erp/CustomBoardNumber.tsx b/src/Add-on/Erp/CustomBoardNumber.tsx new file mode 100644 index 000000000..6bf831bc5 --- /dev/null +++ b/src/Add-on/Erp/CustomBoardNumber.tsx @@ -0,0 +1,187 @@ +import { Button, Classes } from "@blueprintjs/core"; +import Flatbush from "flatbush"; +import React from "react"; +import { Box3 } from "three"; +import { app } from "../../ApplicationServices/Application"; +import { Intent } from "../../Common/Toaster"; +import { Board } from "../../DatabaseServices/Entity/Board"; +import { GetBox } from "../../Geometry/GeUtils"; +import { AppConfirm } from "../../UI/Components/Common/Confirm"; +import { AppToaster } from "../../UI/Components/Toaster"; + +export function CustomBoardNumber({ boardList }: { boardList: Board[]; }) +{ + const CustomNumber = async (type: string) => + { + const allBoards: Board[][] = []; + + switch (type) + { + case "All": + allBoards.push(boardList); + break; + case "Room": + { + const brsMap = new Map(); + for (const br of boardList) + { + const roomName = br.BoardProcessOption.roomName; + if (!brsMap.has(roomName)) + { + brsMap.set(roomName, [br]); + } + else + { + brsMap.get(roomName).push(br); + } + } + allBoards.push(...brsMap.values()); + break; + } + case "Cabinet": + { + const brsMap = new Map(); + for (const br of boardList) + { + const { roomName, cabinetName } = br.BoardProcessOption; + const name = roomName + "_" + cabinetName; + if (!brsMap.has(name)) + { + brsMap.set(name, [br]); + } + else + { + brsMap.get(name).push(br); + } + } + allBoards.push(...brsMap.values()); + break; + } + case "Piece": + { + let i1 = 0, i2 = 1, offset = 10; + let ents = boardList.concat();//拷贝,以便我们进行分组 + for (let i = 0; i < ents.length; i++) + { + let en = ents[i]; + en.TempData = { i, b: en.Visible ? GetBox(en.DrawObject) : en.BoundingBox, u: false }; + } + + let fb = new Flatbush(ents.length); + for (let en of ents) + { + let box = en.TempData.b as Box3; + fb.add(box.min.getComponent(i1) - offset, box.min.getComponent(i2) - offset, box.max.getComponent(i1) + offset, box.max.getComponent(i2) + offset); + } + fb.finish(); + + while (ents.length) + { + let ens = [ents.pop()]; + ens[0].TempData.u = true; + let allBox = (ens[0].TempData.b as Box3).clone(); + + for (let i = 0; i < ens.length; i++) + { + let ids = fb.search(allBox.min.getComponent(i1) - offset, allBox.min.getComponent(i2) - offset, allBox.max.getComponent(i1) + offset, allBox.max.getComponent(i2) + offset, id => boardList[id].TempData.u === false); + + for (let id of ids) + { + let e = boardList[id]; + e.TempData.u = true; + ens.push(e); + allBox.union(e.TempData.b); + } + + if (ids.length) + ents = ents.filter(e => e.TempData.u === false); + } + allBoards.push(ens); + } + break; + } + } + + if (boardList.some(br => (br.CustomNumber !== null)) + && await AppConfirm.show({ + intent: Intent.PRIMARY, + message: "选择的实体中含有编号的实体,是否保持原有编号?", + })) + { + for (const brs of allBoards) + { + let numbers = new Set(); + for (let br of brs) + if (br.CustomNumber !== null) + numbers.add(br.CustomNumber); + + let i = 1; + for (let br of brs) + if (br.CustomNumber === null) + { + while (numbers.has(i)) i++; + br.CustomNumber = i; + i++; + } + + brs.sort((ent1, ent2) => + { + return ent1.CustomNumber - ent2.CustomNumber; + }); + } + } + else + { + for (const brs of allBoards) + { + for (let i = 0; i < brs.length; i++) + { + brs[i].CustomNumber = i + 1; + } + } + } + + AppToaster.show({ + message: `板自动编号成功`, + timeout: 3000, + intent: Intent.SUCCESS, + }); + app.Editor.ModalManage.Destory(); + }; + + return ( +
+
+

自动编号板件

+
+
+ { + [["按图纸", "All"], ["按房间名", "Room"], ["按房名柜名", "Cabinet"], ["按柜体块", "Piece"]].map(([name, type]) => + { + return ( +
+
+ ); +} diff --git a/src/Add-on/Erp/ErpCommands.ts b/src/Add-on/Erp/ErpCommands.ts index 118c265da..45aa94915 100644 --- a/src/Add-on/Erp/ErpCommands.ts +++ b/src/Add-on/Erp/ErpCommands.ts @@ -32,6 +32,7 @@ import { InterferenceCheck } from "../CheckHoles"; import { CollsionModal } from "../DrawDrilling/CollisionModal"; import { Purge } from "../Purge"; import { blockBuilder, objectBuilder } from './CheckBuilder'; +import { CustomBoardNumber } from "./CustomBoardNumber"; import { MesCustomizer } from "./Customization"; import { ErpGroupBy } from "./ErpGroupBy"; import { ErpView } from "./ErpView"; @@ -153,6 +154,22 @@ async function ExecChaiDan(chaiDanRoute: ErpRoutes) let minBoardCount = 0; let chaidanCount = 0; let cancelHoleProcessing: boolean = false; + + const boards = selction.selectEntityList.filter(br => br instanceof Board) as Board[]; + if (boards.some(br => br.CustomNumber === null)) + { + let res = await AppConfirm.show({ + intent: Intent.WARNING, + message: "存在未设置编号的板件,是否统一自动编号?" + }); + + if (res) + { + app.Editor.ModalManage.RenderModal(CustomBoardNumber, { boardList: boards }); + await app.Editor.ModalManage.Wait(); + } + } + const boardList = GetSelectionBoards(selction.selectEntityList); const interference = await InterferenceCheck(boardList);