|
|
|
@ -1,11 +1,23 @@
|
|
|
|
|
import { Ray, Vector3 } from "three";
|
|
|
|
|
import { arrayLast } from "../../Common/ArrayExt";
|
|
|
|
|
import { ConverBoardTypeToSpaceType } from "../../DatabaseServices/Entity/Board";
|
|
|
|
|
import { arrayLast, arrayRemoveIf } from "../../Common/ArrayExt";
|
|
|
|
|
import { PromptDistendResult, PromptStatus } from "../../Editor/PromptResult";
|
|
|
|
|
import { BoardType } from "../../UI/Store/BoardInterface";
|
|
|
|
|
import { Box3Ext, SplitType } from "../Box";
|
|
|
|
|
import { ISpaceParse } from "./ISpaceParse";
|
|
|
|
|
|
|
|
|
|
const BoardType2SplitType = [2, 0, 1];
|
|
|
|
|
const SplitType2BoardType = [1, 2, 0];
|
|
|
|
|
//转换板件类型成为空间类型. 0x 1y 2z
|
|
|
|
|
function ConverBoardTypeToSplitType(type: BoardType): SplitType
|
|
|
|
|
{
|
|
|
|
|
return BoardType2SplitType[type];
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function ConverSplitType2BoardType(type: SplitType): BoardType
|
|
|
|
|
{
|
|
|
|
|
return SplitType2BoardType[type];
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 夹层空间分析
|
|
|
|
|
*/
|
|
|
|
@ -25,7 +37,7 @@ export class ClampSpaceParse extends ISpaceParse
|
|
|
|
|
let spliteBoxs = new Map<SplitType, Box3Ext>();
|
|
|
|
|
for (let [boardType, boards] of this.BoardMap)
|
|
|
|
|
{
|
|
|
|
|
let splitType: SplitType = ConverBoardTypeToSpaceType(boardType);
|
|
|
|
|
let splitType: SplitType = ConverBoardTypeToSplitType(boardType);
|
|
|
|
|
let boardBoxCol = this.ParseBoardBox(boards, splitType);
|
|
|
|
|
|
|
|
|
|
//#IWFYY
|
|
|
|
@ -104,7 +116,7 @@ export class ClampSpaceParse extends ISpaceParse
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
let splitType: SplitType = ConverBoardTypeToSpaceType(type);
|
|
|
|
|
let splitType: SplitType = ConverBoardTypeToSplitType(type);
|
|
|
|
|
|
|
|
|
|
let p1 = box.min.clone().setComponent(splitType, box.min.getComponent(splitType) - dist);
|
|
|
|
|
let p2 = box.max.clone().setComponent(splitType, box.min.getComponent(splitType));
|
|
|
|
@ -114,7 +126,7 @@ export class ClampSpaceParse extends ISpaceParse
|
|
|
|
|
|
|
|
|
|
let boxs = [new Box3Ext().setFromPoints([p1, p2]), new Box3Ext().setFromPoints([p3, p4])];
|
|
|
|
|
|
|
|
|
|
this.SpaceBox = await this.WrapSelectBox(boxs, ConverBoardTypeToSpaceType(br.BoardType));
|
|
|
|
|
this.SpaceBox = await this.WrapSelectBox(boxs, splitType);
|
|
|
|
|
|
|
|
|
|
if (this.SpaceBox)
|
|
|
|
|
this.ParseOK = true;
|
|
|
|
@ -170,6 +182,14 @@ export class ClampSpaceParse extends ISpaceParse
|
|
|
|
|
for (let [splitType, spBox] of spliteBoxes)
|
|
|
|
|
{
|
|
|
|
|
let remBoxs: Box3Ext[] = orgBox.substract(spBox, splitType);
|
|
|
|
|
|
|
|
|
|
if (remBoxs[0] === orgBox)//如果切割失败,证明这个板没办法影响空间分析,所以移除它.
|
|
|
|
|
{
|
|
|
|
|
let brs = new Set(this.BoardMap.get(ConverSplitType2BoardType(splitType)));
|
|
|
|
|
arrayRemoveIf(this.Boards, br => brs.has(br));
|
|
|
|
|
continue;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (remBoxs.length === 0)
|
|
|
|
|
return undefined;
|
|
|
|
|
else if (remBoxs.length === 1)
|
|
|
|
|