!1132 优化:排钻碰撞提醒

pull/1132/MERGE
ZoeLeeFZ 4 years ago committed by ChenX
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));
};
}

@ -27,6 +27,9 @@ import { Hole } from "../../DatabaseServices/3DSolid/Hole";
import { ExtrudeSolid } from "../../DatabaseServices/Entity/Extrude";
import { Shape } from "../../DatabaseServices/Shape";
import { Contour } from "../../DatabaseServices/Contour";
import { CollsionModal } from "./CollisionModal";
import { ModalPosition } from "../../UI/Components/Modal/ModalInterface";
import { observable } from "mobx";
import { Log } from "../../Common/Log";
export class DrawDrillingTool extends Singleton
@ -41,6 +44,7 @@ export class DrawDrillingTool extends Singleton
//缓存相同碰撞面得初始排钻
private _drillEntsCache: Map<string, CylinderHole[]> = new Map();
private _woodPinsCache: Map<string, CylinderHole[]> = new Map();
@observable private _collsionFaces: Face[] = [];
constructor()
{
super();
@ -653,45 +657,47 @@ export class DrawDrillingTool extends Singleton
d.Position = d.Position.add(offVec.clone().applyMatrix4(ro));
}
}
private CheckCollision(drills: ObjectId[][], refDrillList: ObjectId[][], woodPinss: ObjectId[][])
//排钻是不是通孔
IsTk(ds: ObjectId[])
{
const getDrillsBox = (ids: ObjectId[], OCSInv: Matrix4) =>
return ds.some(d => (d.Object as CylinderHole).Type === GangDrillType.TK);
}
GetDrillsBox(ids: ObjectId[], OCSInv: Matrix4)
{
let box = new Box3();
let boxes: Box3[] = [box];
for (let id of ids)
{
let box = new Box3();
let boxes: Box3[] = [box];
for (let id of ids)
let d = id.Object as CylinderHole;
if (d.Type === GangDrillType.Pxl)
{
let d = id.Object as CylinderHole;
if (d.Type === GangDrillType.Pxl)
{
boxes.push(d.BoundingBox);
}
else
box.union(d.BoundingBox);
boxes.push(d.BoundingBox);
}
boxes.forEach(b => b.applyMatrix4(OCSInv));
return boxes;
};
//排钻是不是通孔
const isTK = (ds: ObjectId[]) =>
{
return ds.some(d => (d.Object as CylinderHole).Type === GangDrillType.TK);
};
else
box.union(d.BoundingBox);
}
boxes.forEach(b => b.applyMatrix4(OCSInv));
return boxes;
}
CheckCollision(drills: ObjectId[][], refDrillList: ObjectId[][], woodPinss: ObjectId[][])
{
let isCollsion = false;
for (let i = 0; i < drills.length; i++)
{
const ds = drills[i];
if (isTK(ds)) continue;
let bs1 = getDrillsBox(ds, this.m_Face.OCSInv);
if (this.IsTk(ds)) continue;
let bs1 = this.GetDrillsBox(ds, this.m_Face.OCSInv);
for (let refDr of refDrillList)
{
if (isTK(refDr)) continue;
let bs2 = getDrillsBox(refDr, this.m_Face.OCSInv);
if (this.IsTk(refDr)) continue;
let bs2 = this.GetDrillsBox(refDr, this.m_Face.OCSInv);
//#I1FFNB
if (bs1.some(b => bs2.some(b2 => b2.intersectsBox(b))))
{
let offsetDist = this.m_Option.collsionDist;
this.MoveDrillEnts(ds, offsetDist);
isCollsion = true;
if (woodPinss.length === 0) continue;
if (i === 0)
{
@ -704,6 +710,9 @@ export class DrawDrillingTool extends Singleton
}
}
}
if (isCollsion)
this._collsionFaces.push(this.m_Face);
}
private InitTool(f: Face, opt: DrillingOption)
{
@ -802,13 +811,16 @@ export class DrawDrillingTool extends Singleton
ClassifyAndDrilling(brList: Board[])
{
if (brList.length < 2) return;
this._collsionFaces.length = 0;
let brMap = this.ClassifyBoardList(brList);
for (let [, bs] of brMap)
{
if (bs.length > 1)
this.StartGangDrill(bs);
}
if (this._collsionFaces.length > 0)
app.Editor.ModalManage.RenderModeless(CollsionModal, { faces: this._collsionFaces }, { position: ModalPosition.Right, canMinimize: false });
}
private GetSpliteBoards(brs: Board[])
{

@ -166,5 +166,6 @@ export enum CommandNames
ChangeColorByMaterial = "CHANGECOLORBYMATERIAL",
RestoreColor = "RESTORECOLOR",
SelectAll = "SELECTALL",
CheckHoles = "CHECKHOLES",
CombinatAttributeBrush = "COMBINATATTRIBUTEBRUSH",//复合实体刷
}

@ -773,7 +773,7 @@ export class Board extends ExtrudeSolid
(obj as Mesh).material = ColorMaterial.GrayTransparentMeshMaterial;
}
}
if (renderType !== RenderType.Print && userConfig.showLines && this.IsChaiDan)
if ((renderType === RenderType.Wireframe || renderType === RenderType.Conceptual) && userConfig.showLines && this.IsChaiDan)
obj.add(...this.GetLinesDir());
}
UpdateDrawObjectMaterial(renderType: RenderType, obj: Object3D)

@ -185,6 +185,7 @@ import { commandMachine } from './CommandMachine';
import { ShowRecycleBin } from "../Add-on/ShowRecycleBin";
import { Command_EntitytMoveToZ0 } from "../Add-on/EntityMoveToZ0";
import { ChangeColorByMaterial } from "../Add-on/ChangeColorByBoardMaterial";
import { CheckHoles } from "../Add-on/CheckHoles";
import { CombinatAttributeBrush } from "../Add-on/CombinatAttributeBrush";
export function registerCommand()
@ -519,6 +520,8 @@ export function registerCommand()
commandMachine.RegisterCommand(CommandNames.ChangeColorByMaterial, new ChangeColorByMaterial());
commandMachine.RegisterCommand(CommandNames.SelectAll, new SelectAll());
commandMachine.RegisterCommand(CommandNames.CheckHoles, new CheckHoles());
commandMachine.RegisterCommand(CommandNames.CombinatAttributeBrush, new CombinatAttributeBrush());
}

@ -107,6 +107,7 @@ export class DrillModal extends React.Component<{ store?: DrillStore; }, {}> {
close={this.cancel}
store={store}
type={BoardModalType.Dr}
helpUrl="https://cfcad.cn/help/#/DrillingFunction/DrillingInterface"
footerChildren={
<>
<Button

@ -647,6 +647,16 @@ export const CommandList: ICommand[] = [
chName: "删除排钻",
chDes: "删除排钻",
},
{
icon: IconEnum.CheckHole,
typeId: "pz",
link: "#",
defaultCustom: CommandNames.CheckHoles,
command: CommandNames.CheckHoles,
type: "排钻",
chName: "排钻碰撞检查",
chDes: "排钻碰撞检查",
},
// {
// icon: IconEnum.HideDrill,
// typeId: "pz",

@ -248,8 +248,8 @@ export class CADModal
//设置初始位置
if (pos === ModalPosition.Right)
{
container.style.left = window.innerWidth - container.clientWidth - 10 + "px";
container.style.top = "40px";
container.style.left = window.innerWidth - container.clientWidth - 30 + "px";
container.style.top = "140px";
}
else if (pos === ModalPosition.Center)
{
@ -265,13 +265,18 @@ export class CADModal
else if (pos === ModalPosition.Top)
{
container.style.left = `calc( 50% - ${container.clientWidth / 2}px)`;
container.style.top = "40px";
container.style.top = "140px";
}
else if (pos === ModalPosition.Old)
{
container.style.left = CADModal.ModalOldPosition.left;
container.style.top = CADModal.ModalOldPosition.top;
}
else if (pos === ModalPosition.RightMid)
{
container.style.left = window.innerWidth - container.clientWidth - 30 + "px";
container.style.top = `calc( 50% - ${(container.clientHeight) / 2}px)`;
}
CADModal.ModalOldPosition.left = container.style.left;
CADModal.ModalOldPosition.top = container.style.top;
}

@ -2,10 +2,11 @@ export enum ModalPosition
{
Center = "center",
Right = "right",
RightMid = "rightMid",
Left = "left",
Mouse = "mouse",
Top = "top",
Old = "old" // 老位置
Old = "old", // 老位置
}
/**
*

@ -111,3 +111,26 @@
}
}
}
#commonModal .collsion {
max-height: 500px;
overflow: auto;
li {
outline: 1px solid #ccc;
cursor: pointer;
padding: 5px 0;
span {
display: inline-block;
max-width: 100px;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
}
li:hover {
background-color: #1a83ad;
}
}

@ -115,6 +115,7 @@ export class TopToolBar extends React.Component<{}, {}>
{ svg: IconEnum.Drill, title: "排钻", command: CommandNames.Hole },
{ svg: IconEnum.DeleteDrill, title: "删除排钻", command: CommandNames.DeleteHole },
{ svg: IconEnum.DrillConfig, title: "排钻配置", command: CommandNames.DrillConfig },
{ svg: IconEnum.CheckHole, title: "排钻碰撞检查", command: CommandNames.CheckHoles },
// { svg: IconEnum.HideDrill, title: "隐藏排钻", command: "" },
];
store.iconList.view = [

@ -166,6 +166,7 @@ export enum IconEnum
Revolve = "Revolve.svg",
RestoreColor = "RestoreColor.svg",
ChangeColorByMat = "ChangeColorByMat.svg",
Cabrush = "cabrush.svg",
Cabrush = "Cabrush.svg",
Convert2Polyline = "Convert2Polyline.svg",
CheckHole = "CheckHoles.svg",
}

@ -212,7 +212,7 @@ export class DrillStore extends BoardStore
DeleteRule = () =>
{
this.rules.splice(this.m_CurrentRuleIndex, 1);
this.m_CurrentRuleIndex -= 1;
this.m_CurrentRuleIndex = 0;
this.ChangeRules(this.m_CurrentRuleIndex);
};
HasInvailValue()

Loading…
Cancel
Save