mirror of https://gitee.com/cf-fz/WebCAD.git
!2567 功能:拆单时检查板编号,提示是否按图纸/房间/柜体自动编号
parent
dc05a1b579
commit
6732363aa6
@ -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>
|
||||
);
|
||||
}
|
Loading…
Reference in new issue