!2357 修复:铰链与收口条判断碰撞误差导致偏移错误问题

pull/2340/MERGE
林三 1 year ago committed by ChenX
parent ec2e359292
commit d961763ead

@ -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

@ -106,3 +106,19 @@ export function isDingDiBan(b: Board)
}
return false;
}
//收口条
export function IsClosingStrip(ent: Entity): boolean
{
if (ent instanceof Board)
{
if (ent.Name.includes("收口"))
return true;
}
else if (ent instanceof HardwareCompositeEntity)
{
if (ent.HardwareOption.name.includes("收口"))
return true;
}
return false;
}

@ -1,6 +1,6 @@
import { Box3, Vector3 } from "three";
import { BoxIntersectFuzz, IsBoxAndEntitysIntersect, RecordHingeTrSizeX, SetHingeType, SetNoPareTypeHigneName } from "../../../Add-on/DrawBoard/DrawDoorDrawer/DrawDoorTool";
import { IsDoor, IsHandle, IsHinge } from "../../../Add-on/HideSelect/HideSelectUtils";
import { IsClosingStrip, IsDoor, IsHandle, IsHinge } from "../../../Add-on/HideSelect/HideSelectUtils";
import { app } from "../../../ApplicationServices/Application";
import { EBoardKeyList } from "../../../Common/BoardKeyList";
import { DuplicateRecordCloning } from "../../../Common/Status";
@ -353,7 +353,8 @@ export class TemplateDrawHingeTool
doors.push(en);
}
let ocs = doors[0].SpaceOCSInv;
let ocs = door.SpaceOCSInv;
let doorBox: Box3 = doors[0].GetBoundingBoxInMtx(ocs);
for (let i = 1; i < doors.length; i++)
@ -383,6 +384,8 @@ export class TemplateDrawHingeTool
for (let otherEnt of allOtherEntitys)
{
const yNormal = new Vector3().setFromMatrixColumn(ironware.OCSNoClone, 1);
if (otherEnt instanceof Board)
{
let br = otherEnt as Board;
@ -401,9 +404,9 @@ export class TemplateDrawHingeTool
grooveOutlines = grooves.map(g => g.ContourCurve.Clone().ApplyMatrix(g.OCS).ApplyMatrix(br.OCSInv).Z0());
outlinesCache.set(br, grooveOutlines);
}
//门板不增加误差,防止隔壁门板误关联
if (otherEntBox.clone().intersect(inventedBox).isSolid() || !IsDoor(br) && otherEntBox.intersectsBox(inventedBox, BoxIntersectFuzz))
if (IsBoxAndEntitysIntersect(otherEntBox, [ironware], undefined, ocs, true) ||
!isParallelTo(yNormal, br.Normal) && otherEntBox.intersectsBox(inventedBox, BoxIntersectFuzz))
{
const center = inventedBox.getCenter(new Vector3).applyMatrix4(br.OCSInv).setZ(0);
if (grooveOutlines.some(c => c.PtInCurve(center)))
@ -429,7 +432,7 @@ export class TemplateDrawHingeTool
if (RecordHingeTrSizeX(hingeTemplate2Size_Map, hingeTemp, isLROpen ? size.z : size.x)) continue;
let number = 1;
number = this.GetHingeMoveNum(door, inventedBox, realityBox, layers, verticals, number, isLROpen);
number = this.GetHingeMoveNum(door, inventedBox, realityBox, layers, verticals, number, isLROpen, yNormal);
if (number === 0)
{
moveFail = true;
@ -459,7 +462,7 @@ export class TemplateDrawHingeTool
continue;
}
let number = 1;
number = this.GetHingeMoveNum(door, inventedBox, realityBox, layers, verticals, number, isLROpen);
number = this.GetHingeMoveNum(door, inventedBox, realityBox, layers, verticals, number, isLROpen, yNormal);
if (number === 0)
{
@ -484,7 +487,8 @@ export class TemplateDrawHingeTool
return needUpdate;
}
private GetHingeMoveNum(door: Board | HardwareCompositeEntity, inventedBox: Box3, realityBox: Box3, layers: Entity[], verticals: Entity[], number: number, isLROpen: boolean): number
private GetHingeMoveNum(door: Board | HardwareCompositeEntity, inventedBox: Box3, realityBox: Box3, layers: Entity[], verticals: Entity[],
number: number, isLROpen: boolean, yNormal: Vector3): number
{
let inventedBox1 = inventedBox.clone();
let realityBox1 = realityBox.clone();
@ -509,11 +513,27 @@ export class TemplateDrawHingeTool
{
let doorHight = Height;
inventedBox1.translate(new Vector3(0, 0, distance * number));
realityBox1.translate(new Vector3(0, 0, distance * number));
let box1Z = inventedBox1.getCenter(new Vector3).z;
if (box1Z + 100 < doorHight && !IsBoxAndEntitysIntersect(realityBox1, layers, BoxIntersectFuzz))
let intersect = false;
if (box1Z + 100 < doorHight)
{
for (let ent of layers)
{
//不考虑收口条情况
if (isParallelTo(yNormal, ent.Normal) && IsClosingStrip(ent))
continue;
if (IsBoxAndEntitysIntersect(realityBox1, [ent], BoxIntersectFuzz))
{
intersect = true;
break;
}
}
}
else intersect = true;
if (!intersect)
return number * distance;
else
{
@ -523,8 +543,24 @@ export class TemplateDrawHingeTool
let realityBox2 = realityBox.clone();
realityBox2.translate(new Vector3(0, 0, distance * -number));
let intersect = false;
if (box2Z - 100 > 0)
{
for (let ent of layers)
{
//不考虑收口条情况
if (isParallelTo(yNormal, ent.Normal) && IsClosingStrip(ent))
continue;
if (IsBoxAndEntitysIntersect(realityBox2, [ent], BoxIntersectFuzz))
{
intersect = true;
break;
}
}
}
else intersect = true;
if (box2Z - 100 > 0 && !IsBoxAndEntitysIntersect(realityBox2, layers, BoxIntersectFuzz))
if (!intersect)
return -number * distance;
else
{
@ -533,7 +569,7 @@ export class TemplateDrawHingeTool
else
{
number++;
return this.GetHingeMoveNum(door, inventedBox, realityBox, layers, verticals, number, isLROpen);
return this.GetHingeMoveNum(door, inventedBox, realityBox, layers, verticals, number, isLROpen, yNormal);
}
}
}
@ -545,8 +581,24 @@ export class TemplateDrawHingeTool
let box1Z = inventedBox1.getCenter(new Vector3).x;
realityBox1.translate(new Vector3(distance * number, 0, 0));
let intersect = false;
if (box1Z + 100 < doorHight)
{
for (let ent of verticals)
{
//不考虑收口条情况
if (isParallelTo(yNormal, ent.Normal) && IsClosingStrip(ent))
continue;
if (IsBoxAndEntitysIntersect(realityBox1, [ent], BoxIntersectFuzz,))
{
intersect = true;
break;
}
}
}
else intersect = true;
if (box1Z + 100 < doorHight && !IsBoxAndEntitysIntersect(realityBox1, verticals, BoxIntersectFuzz))
if (!intersect)
return number * distance;
else
{
@ -556,8 +608,23 @@ export class TemplateDrawHingeTool
let realityBox2 = realityBox.clone();
realityBox2.translate(new Vector3(distance * -number, 0, 0));
let intersect = false;
if (box2Z - 100 > 0)
{
for (let ent of verticals)
{
//不考虑收口条情况
if (isParallelTo(yNormal, ent.Normal) && IsClosingStrip(ent))
continue;
if (IsBoxAndEntitysIntersect(realityBox2, [ent], BoxIntersectFuzz))
{
intersect = true;
break;
}
}
} else intersect = true;
if (box2Z - 100 > 0 && !IsBoxAndEntitysIntersect(realityBox2, verticals, BoxIntersectFuzz))
if (!intersect)
return -number * distance;
else
{
@ -566,7 +633,7 @@ export class TemplateDrawHingeTool
else
{
number++;
return this.GetHingeMoveNum(door, inventedBox, realityBox, layers, verticals, number, isLROpen);
return this.GetHingeMoveNum(door, inventedBox, realityBox, layers, verticals, number, isLROpen, yNormal);
}
}
}

Loading…
Cancel
Save