!2567 功能:拆单时检查板编号,提示是否按图纸/房间/柜体自动编号

pull/2870/head
黄诗津 3 months ago
parent dc05a1b579
commit 6732363aa6

@ -57,6 +57,13 @@ const ForbidReactorCmd = new Set([
CommandNames.RemoveLayer,
CommandNames.RemoveLayerFolder,
//拆单
CommandNames.ChaiDan,
CommandNames.ChaiDanJB,
CommandNames.ChaiDanExport,
//自定义生成板号
CommandNames.CustomNumber,
]);
export class DrillingReactor

@ -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<number>();
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 (
<div style={{ width: 180 }}>
<div className={Classes.DIALOG_HEADER} data-id="dragArea">
<h4 className={Classes.HEADING}></h4>
<Button
icon="cross"
aria-label="Close"
minimal={true}
onClick={() => { app.Editor.ModalManage.Destory(); }}
/>
</div>
<div
className={Classes.DIALOG_BODY}
style={{
padding: 20,
borderRadius: "0 0 6px 6px",
display: "flex",
flexDirection: "column"
}}>
{
[["按图纸", "All"], ["按房间名", "Room"], ["按房名柜名", "Cabinet"], ["按柜体块", "Piece"]].map(([name, type]) =>
{
return (
<Button
key={type}
text={name}
intent={Intent.PRIMARY}
style={{ marginBottom: 5 }}
onClick={() => { CustomNumber(type); }}
/>);
})
}
</div>
</div>
);
}

@ -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);

Loading…
Cancel
Save