|
|
|
@ -25,7 +25,7 @@ import { DisableChangeParName, DoorOpenDir, HandleHorPos, HandleVePos, IDoorConf
|
|
|
|
|
import { BoardProcessOption } from "../../../UI/Store/OptionInterface/BoardProcessOption";
|
|
|
|
|
import { ITemplateParam } from "../../../UI/Store/RightPanelStore/ITemplateParam";
|
|
|
|
|
import { DrillType } from "../../DrawDrilling/DrillType";
|
|
|
|
|
import { IsDoor, IsHandle, IsHinge } from "../../HideSelect/HideSelectUtils";
|
|
|
|
|
import { IsClosingStrip, IsDoor, IsHandle, IsHinge } from "../../HideSelect/HideSelectUtils";
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 铰链碰撞后尝试两个方向(上、下)的
|
|
|
|
@ -602,6 +602,7 @@ export class DrawDoorTool
|
|
|
|
|
|
|
|
|
|
for (let otherEnt of allOtherEntitys)
|
|
|
|
|
{
|
|
|
|
|
const yNormal = new Vector3().setFromMatrixColumn(ironware.OCSNoClone, 1);
|
|
|
|
|
if (otherEnt instanceof Board)
|
|
|
|
|
{
|
|
|
|
|
let br = otherEnt as Board;
|
|
|
|
@ -622,7 +623,7 @@ export class DrawDoorTool
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//门板不增加误差,防止隔壁门板误关联
|
|
|
|
|
if (brBox.clone().intersect(ironBox).isSolid() || !IsDoor(br) && brBox.intersectsBox(ironBox, BoxIntersectFuzz))
|
|
|
|
|
if (IsBoxAndEntitysIntersect(brBox, [ironware], 0, undefined, true) || !isParallelTo(yNormal, br.Normal) && brBox.intersectsBox(ironBox, BoxIntersectFuzz))
|
|
|
|
|
{
|
|
|
|
|
const center = ironBox.getCenter(new Vector3).applyMatrix4(br.OCSInv).setZ(0);
|
|
|
|
|
if (grooveOutlines.some(c => c.PtInCurve(center)))//五金的中心在造型内部
|
|
|
|
@ -652,12 +653,12 @@ export class DrawDoorTool
|
|
|
|
|
if (isUpDownDoor)
|
|
|
|
|
{
|
|
|
|
|
if (RecordHingeTrSizeX(hingeTr2Size_Map, hingeTr, size.x)) continue;
|
|
|
|
|
number = this.GetHingeMoveNum(doorWidth, ironBoxInDoorSpace, ironBox, verticalBoards, this.option.deviation, number, isUpDownDoor);
|
|
|
|
|
number = this.GetHingeMoveNum(doorWidth, ironBoxInDoorSpace, ironBox, verticalBoards, this.option.deviation, number, isUpDownDoor, yNormal);
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
if (RecordHingeTrSizeX(hingeTr2Size_Map, hingeTr, size.z)) continue;
|
|
|
|
|
number = this.GetHingeMoveNum(doorHight, ironBoxInDoorSpace, ironBox, layerBoards, this.option.deviation, number, isUpDownDoor);
|
|
|
|
|
number = this.GetHingeMoveNum(doorHight, ironBoxInDoorSpace, ironBox, layerBoards, this.option.deviation, number, isUpDownDoor, yNormal);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (number === 0)
|
|
|
|
@ -697,13 +698,13 @@ export class DrawDoorTool
|
|
|
|
|
{
|
|
|
|
|
let doorWidth = doorBox.getSize(new Vector3).x;
|
|
|
|
|
if (RecordHingeTrSizeX(hingeTr2Size_Map, hingeTr, ironSize.x)) continue;
|
|
|
|
|
number = this.GetHingeMoveNum(doorWidth, ironBoxInDoorSpace, ironBox, verticalBoards, this.option.deviation, number, isUpDownDoor);
|
|
|
|
|
number = this.GetHingeMoveNum(doorWidth, ironBoxInDoorSpace, ironBox, verticalBoards, this.option.deviation, number, isUpDownDoor, yNormal);
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
let doorHight = doorBox.getSize(new Vector3).z;
|
|
|
|
|
if (RecordHingeTrSizeX(hingeTr2Size_Map, hingeTr, ironSize.z)) continue;
|
|
|
|
|
number = this.GetHingeMoveNum(doorHight, ironBoxInDoorSpace, ironBox, layerBoards, this.option.deviation, number, isUpDownDoor);
|
|
|
|
|
number = this.GetHingeMoveNum(doorHight, ironBoxInDoorSpace, ironBox, layerBoards, this.option.deviation, number, isUpDownDoor, yNormal);
|
|
|
|
|
}
|
|
|
|
|
if (number === 0)
|
|
|
|
|
{
|
|
|
|
@ -888,7 +889,7 @@ export class DrawDoorTool
|
|
|
|
|
* @return {*} {number}
|
|
|
|
|
* @memberof DrawDoorTool
|
|
|
|
|
*/
|
|
|
|
|
private GetHingeMoveNum(doorSpecs: number, inventedBox: Box3, realityBox: Box3, checkEnts: Entity[], distance: number, number: number, isUpDownDoor: boolean): number
|
|
|
|
|
private GetHingeMoveNum(doorSpecs: number, inventedBox: Box3, realityBox: Box3, checkEnts: Entity[], distance: number, number: number, isUpDownDoor: boolean, yNormal: Vector3): number
|
|
|
|
|
{
|
|
|
|
|
let box1 = inventedBox.clone();
|
|
|
|
|
let box1Info: number;
|
|
|
|
@ -908,18 +909,31 @@ export class DrawDoorTool
|
|
|
|
|
box1Info = box1.getCenter(new Vector3).z;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
let intersect = false;
|
|
|
|
|
if (box1Info + (isUpDownDoor ? 10 : 100) < doorSpecs)
|
|
|
|
|
{
|
|
|
|
|
if (!IsBoxAndEntitysIntersect(realityBox1, checkEnts, BoxIntersectFuzz))
|
|
|
|
|
return number;
|
|
|
|
|
else
|
|
|
|
|
return this.MoveAgain(doorSpecs, inventedBox, realityBox, checkEnts, distance, number, isUpDownDoor);
|
|
|
|
|
for (let ent of checkEnts)
|
|
|
|
|
{
|
|
|
|
|
//不考虑收口条情况
|
|
|
|
|
if (isParallelTo(yNormal, ent.Normal) && IsClosingStrip(ent))
|
|
|
|
|
continue;
|
|
|
|
|
if (IsBoxAndEntitysIntersect(realityBox1, [ent], BoxIntersectFuzz))
|
|
|
|
|
{
|
|
|
|
|
intersect = true;
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
return this.MoveAgain(doorSpecs, inventedBox, realityBox, checkEnts, distance, number, isUpDownDoor);
|
|
|
|
|
intersect = true;
|
|
|
|
|
|
|
|
|
|
if (!intersect)
|
|
|
|
|
return number;
|
|
|
|
|
else
|
|
|
|
|
return this.MoveAgain(doorSpecs, inventedBox, realityBox, checkEnts, distance, number, isUpDownDoor, yNormal);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private MoveAgain(doorSpecs: number, inventedBox: Box3, realityBox: Box3, checkEnts: Entity[], distance: number, number: number, isUpDownDoor: boolean): number
|
|
|
|
|
private MoveAgain(doorSpecs: number, inventedBox: Box3, realityBox: Box3, checkEnts: Entity[], distance: number, number: number, isUpDownDoor: boolean, yNormal: Vector3): number
|
|
|
|
|
{
|
|
|
|
|
let box2 = inventedBox.clone();
|
|
|
|
|
let box2Info: number;
|
|
|
|
@ -938,22 +952,27 @@ export class DrawDoorTool
|
|
|
|
|
realityBox2.translate(new Vector3(0, 0, distance * -number));
|
|
|
|
|
box2Info = box2.getCenter(new Vector3).z;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
let intersect = false;
|
|
|
|
|
if (box2Info - (isUpDownDoor ? 10 : 100) > 0)
|
|
|
|
|
{
|
|
|
|
|
if (!IsBoxAndEntitysIntersect(realityBox2, checkEnts, BoxIntersectFuzz))
|
|
|
|
|
return -number;
|
|
|
|
|
else
|
|
|
|
|
for (let ent of checkEnts)
|
|
|
|
|
{
|
|
|
|
|
if (number === MoveNum)
|
|
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
|
else
|
|
|
|
|
//不考虑收口条情况
|
|
|
|
|
if (isParallelTo(yNormal, ent.Normal) && IsClosingStrip(ent))
|
|
|
|
|
continue;
|
|
|
|
|
if (IsBoxAndEntitysIntersect(realityBox2, [ent], BoxIntersectFuzz))
|
|
|
|
|
{
|
|
|
|
|
number++;
|
|
|
|
|
return this.GetHingeMoveNum(doorSpecs, inventedBox, realityBox, checkEnts, distance, number, isUpDownDoor);
|
|
|
|
|
intersect = true;
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
intersect = true;
|
|
|
|
|
|
|
|
|
|
if (!intersect)
|
|
|
|
|
return -number;
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
if (number === MoveNum)
|
|
|
|
@ -961,7 +980,7 @@ export class DrawDoorTool
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
number++;
|
|
|
|
|
return this.GetHingeMoveNum(doorSpecs, inventedBox, realityBox, checkEnts, distance, number, isUpDownDoor);
|
|
|
|
|
return this.GetHingeMoveNum(doorSpecs, inventedBox, realityBox, checkEnts, distance, number, isUpDownDoor, yNormal);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
@ -1032,7 +1051,10 @@ export function IsBoxAndEntitysIntersect(enBox: Box3, checkEnts: Entity[], fuzz?
|
|
|
|
|
if (parentOCS) box.applyMatrix4(parentOCS);
|
|
|
|
|
if (isDoor)
|
|
|
|
|
{
|
|
|
|
|
if (box.clone().intersect(enBox).Volume > 0)
|
|
|
|
|
let newBox = box.clone().intersect(enBox);
|
|
|
|
|
//部分情况 Box3Ext.Volume错误用原生方法求体积
|
|
|
|
|
let size = newBox.getSize(new Vector3);
|
|
|
|
|
if (size.x * size.y * size.z > 1e-6)
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|