diff --git a/src/Add-on/CheckHoles.ts b/src/Add-on/CheckHoles.ts index a64fd813a..ba05e364d 100644 --- a/src/Add-on/CheckHoles.ts +++ b/src/Add-on/CheckHoles.ts @@ -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(); @@ -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; } diff --git a/src/Add-on/Erp/ErpCommands.ts b/src/Add-on/Erp/ErpCommands.ts index 4f22ebccd..26c533791 100644 --- a/src/Add-on/Erp/ErpCommands.ts +++ b/src/Add-on/Erp/ErpCommands.ts @@ -148,7 +148,7 @@ async function ExecChaiDan(chaiDanRoute: ErpRoutes) let minBoardCount = 0; const boardList = GetSelectionBoards(selction.selectEntityList, selction.selectRelativeHardware); - const interference = InterferenceCheck(boardList); + const interference = await InterferenceCheck(boardList); if (interference.length) { let res = await AppConfirm.show({