|
|
|
@ -1,4 +1,7 @@
|
|
|
|
|
import Flatbush from 'flatbush';
|
|
|
|
|
import { runInAction } from 'mobx';
|
|
|
|
|
import { app } from "../ApplicationServices/Application";
|
|
|
|
|
import { Sleep } from "../Common/Sleep";
|
|
|
|
|
import { Intent } from "../Common/Toaster";
|
|
|
|
|
import { CylinderHole, GangDrillType } from "../DatabaseServices/3DSolid/CylinderHole";
|
|
|
|
|
import { Hole } from "../DatabaseServices/3DSolid/Hole";
|
|
|
|
@ -9,6 +12,7 @@ import { PromptStatus } from "../Editor/PromptResult";
|
|
|
|
|
import { Box3Ext } from "../Geometry/Box";
|
|
|
|
|
import { ModalPosition } from "../UI/Components/Modal/ModalInterface";
|
|
|
|
|
import { AppToaster } from "../UI/Components/Toaster";
|
|
|
|
|
import { DownPanelStore } from "../UI/Store/DownPanelStore";
|
|
|
|
|
import { CollsionModal, ICollsionBrs } from "./DrawDrilling/CollisionModal";
|
|
|
|
|
import { DrawDrillingTool } from "./DrawDrilling/DrawDrillingTool";
|
|
|
|
|
|
|
|
|
@ -24,7 +28,7 @@ export class CheckHoles implements Command
|
|
|
|
|
if (brRes.Status === PromptStatus.OK)
|
|
|
|
|
{
|
|
|
|
|
let brs = brRes.SelectSet.SelectEntityList as Board[];
|
|
|
|
|
let res = InterferenceCheck(brs);
|
|
|
|
|
let res = await InterferenceCheck(brs);
|
|
|
|
|
|
|
|
|
|
if (res.length)
|
|
|
|
|
app.Editor.ModalManage.RenderModeless(CollsionModal, { faces: res }, { position: ModalPosition.Right, canMinimize: false });
|
|
|
|
@ -39,7 +43,7 @@ export class CheckHoles implements Command
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//干涉检查
|
|
|
|
|
export function InterferenceCheck(brs: Board[])
|
|
|
|
|
export async function InterferenceCheck(brs: Board[])
|
|
|
|
|
{
|
|
|
|
|
const drillTool = DrawDrillingTool.GetInstance();
|
|
|
|
|
let b2boxMap = new Map<Board, ObjectId[][]>();
|
|
|
|
@ -110,9 +114,21 @@ export function InterferenceCheck(brs: Board[])
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
let brsBox = brs.map(br => br.BoundingBox);
|
|
|
|
|
let fb = new Flatbush(brsBox.length);
|
|
|
|
|
for (let box of brsBox)
|
|
|
|
|
{
|
|
|
|
|
fb.add(box.min.x, box.min.z, box.max.x, box.max.z);
|
|
|
|
|
}
|
|
|
|
|
fb.finish();
|
|
|
|
|
|
|
|
|
|
let process = DownPanelStore.GetInstance();
|
|
|
|
|
process.StartProgress("检查排钻干涉...");
|
|
|
|
|
|
|
|
|
|
for (let i = 0; i < brs.length; i++)
|
|
|
|
|
{
|
|
|
|
|
let box = brsBox[i];
|
|
|
|
|
|
|
|
|
|
let b1 = brs[i];
|
|
|
|
|
let drills = b2boxMap.get(b1);
|
|
|
|
|
if (!drills || drills.length === 0) continue;
|
|
|
|
@ -128,7 +144,9 @@ export function InterferenceCheck(brs: Board[])
|
|
|
|
|
tkHoleFidSet.add((ds[0].Object as CylinderHole).FId);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
for (let j = i + 1; j < brs.length; j++)
|
|
|
|
|
let ids = fb.search(box.min.x - 500, box.min.z - 500, box.max.x + 500, box.max.z + 500);
|
|
|
|
|
|
|
|
|
|
for (let j of ids)
|
|
|
|
|
{
|
|
|
|
|
let b2 = brs[j];
|
|
|
|
|
let drills2 = b2boxMap.get(b2);
|
|
|
|
@ -153,7 +171,15 @@ export function InterferenceCheck(brs: Board[])
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
runInAction(() =>
|
|
|
|
|
{
|
|
|
|
|
process.progress = (i) / brs.length;
|
|
|
|
|
process.progressName = `排钻干涉检查 ${i}/${brs.length}`;
|
|
|
|
|
});
|
|
|
|
|
await Sleep(0);
|
|
|
|
|
}
|
|
|
|
|
process.EndProgress();
|
|
|
|
|
return res;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|