mirror of https://gitee.com/cf-fz/WebCAD.git
!1132 优化:排钻碰撞提醒
parent
b34ce62f57
commit
37fea30c38
@ -0,0 +1,70 @@
|
||||
import { Command } from "../Editor/CommandMachine";
|
||||
import { app } from "../ApplicationServices/Application";
|
||||
import { Board } from "../DatabaseServices/Entity/Board";
|
||||
import { PromptStatus } from "../Editor/PromptResult";
|
||||
import { ObjectId } from "../DatabaseServices/ObjectId";
|
||||
import { DrawDrillingTool } from "./DrawDrilling/DrawDrillingTool";
|
||||
import { ICollsionBrs, CollsionModal } from "./DrawDrilling/CollisionModal";
|
||||
import { ModalPosition } from "../UI/Components/Modal/ModalInterface";
|
||||
import { Box3 } from "three";
|
||||
import { Hole } from "../DatabaseServices/3DSolid/Hole";
|
||||
|
||||
export class CheckHoles implements Command
|
||||
{
|
||||
async exec()
|
||||
{
|
||||
let brRes = await app.Editor.GetSelection({
|
||||
Msg: "选择要检查排钻碰撞的板件",
|
||||
Filter: { filterTypes: [Board] }
|
||||
});
|
||||
|
||||
if (brRes.Status === PromptStatus.OK)
|
||||
{
|
||||
const tool = DrawDrillingTool.GetInstance() as DrawDrillingTool;
|
||||
let brs = brRes.SelectSet.SelectEntityList as Board[];
|
||||
|
||||
let res: ICollsionBrs[] = [];
|
||||
|
||||
for (let i = 0; i < brs.length; i++)
|
||||
{
|
||||
let b1 = brs[i];
|
||||
let drills: ObjectId[][] = [];
|
||||
for (let [, ds] of b1.DrillList)
|
||||
drills.push(...ds);
|
||||
const boxlist = drills.map(ds => tool.GetDrillsBox(ds, b1.OCSInv));
|
||||
for (let j = i + 1; j < brs.length; j++)
|
||||
{
|
||||
let b2 = brs[j];
|
||||
let drills2: ObjectId[][] = [];
|
||||
for (let [, ds] of b2.DrillList)
|
||||
drills2.push(...ds.filter(d => (d[0].Object as Hole).MId !== b1.Id && (d[0].Object as Hole).FId !== b1.Id));
|
||||
const boxlist2 = drills2.map(ds => tool.GetDrillsBox(ds, b1.OCSInv));
|
||||
|
||||
if (this.IsCollsion(boxlist, boxlist2))
|
||||
{
|
||||
res.push({
|
||||
InterBoard: b1,
|
||||
LocalBoard: b2,
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
app.Editor.ModalManage.RenderModeless(CollsionModal, { faces: res }, { position: ModalPosition.Right, canMinimize: false });
|
||||
}
|
||||
}
|
||||
private IsCollsion(boxlist: Box3[][], boxlist2: Box3[][])
|
||||
{
|
||||
for (let boxs of boxlist)
|
||||
{
|
||||
for (let boxs2 of boxlist2)
|
||||
{
|
||||
if (boxs.some(bo => boxs2.some(bo2 => bo2.intersectsBox(bo))))
|
||||
{
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
}
|
@ -0,0 +1,58 @@
|
||||
import * as React from 'react';
|
||||
import { CommonModal } from '../../UI/Components/Modal/ModalContainer';
|
||||
import { app } from '../../ApplicationServices/Application';
|
||||
import { Classes } from '@blueprintjs/core';
|
||||
import { Face } from '../../Geometry/DrillParse/Face';
|
||||
import { Box3, Vector3 } from 'three';
|
||||
import { observer } from 'mobx-react';
|
||||
import { Board } from '../../DatabaseServices/Entity/Board';
|
||||
|
||||
export interface ICollsionBrs
|
||||
{
|
||||
LocalBoard: Board;
|
||||
InterBoard: Board;
|
||||
}
|
||||
|
||||
interface ICollsionModalProps
|
||||
{
|
||||
faces: (Face | ICollsionBrs)[];
|
||||
}
|
||||
|
||||
@observer
|
||||
export class CollsionModal extends React.Component<ICollsionModalProps> {
|
||||
public render()
|
||||
{
|
||||
return (
|
||||
<CommonModal
|
||||
title="排钻碰撞检查"
|
||||
hasConfig={false}
|
||||
close={() => app.Editor.ModalManage.Destory()}
|
||||
>
|
||||
<ul className={Classes.LIST_UNSTYLED + " center collsion"}>
|
||||
{
|
||||
this.props.faces.length > 0 ? this.props.faces.map(f =>
|
||||
{
|
||||
return (
|
||||
<li onClick={() => this.click(f)}>
|
||||
<span title={f.LocalBoard.Name}>{f.LocalBoard.Name}</span>-
|
||||
<span title={f.InterBoard.Name}>{f.InterBoard.Name}</span>
|
||||
</li>
|
||||
);
|
||||
}) : "未检测到有排钻碰撞"
|
||||
}
|
||||
</ul>
|
||||
</CommonModal>
|
||||
);
|
||||
}
|
||||
private click = (f: Face | ICollsionBrs) =>
|
||||
{
|
||||
let box = new Box3();
|
||||
app.Viewer.OutlinePass.selectedObjects = [f.InterBoard, f.LocalBoard].map(e =>
|
||||
{
|
||||
box.union(e.BoundingBox);
|
||||
return e.DrawObject;
|
||||
});
|
||||
app.Viewer.CameraCtrl.ZoomExtensBox3(box);
|
||||
app.Viewer.Zoom(1, box.getCenter(new Vector3));
|
||||
};
|
||||
}
|
Loading…
Reference in new issue