From d1904eaddf3a7fa2a4b373952fbfb9b8e963049a Mon Sep 17 00:00:00 2001 From: ChenX Date: Wed, 10 Jan 2024 18:13:05 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96:=E6=8E=92=E9=92=BB=E5=B9=B2?= =?UTF-8?q?=E6=B6=89=E6=A3=80=E6=9F=A5=E6=80=A7=E8=83=BD=20=E5=A2=9E?= =?UTF-8?q?=E5=8A=A0=E8=BF=9B=E5=BA=A6=E6=9D=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/Add-on/CheckHoles.ts | 32 +++++++++++++++++++++++++++++--- src/Add-on/Erp/ErpCommands.ts | 2 +- 2 files changed, 30 insertions(+), 4 deletions(-) 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({