!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 { BoardProcessOption } from "../../../UI/Store/OptionInterface/BoardProcessOption";
import { ITemplateParam } from "../../../UI/Store/RightPanelStore/ITemplateParam"; import { ITemplateParam } from "../../../UI/Store/RightPanelStore/ITemplateParam";
import { DrillType } from "../../DrawDrilling/DrillType"; 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) for (let otherEnt of allOtherEntitys)
{ {
const yNormal = new Vector3().setFromMatrixColumn(ironware.OCSNoClone, 1);
if (otherEnt instanceof Board) if (otherEnt instanceof Board)
{ {
let br = otherEnt as 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); const center = ironBox.getCenter(new Vector3).applyMatrix4(br.OCSInv).setZ(0);
if (grooveOutlines.some(c => c.PtInCurve(center)))//五金的中心在造型内部 if (grooveOutlines.some(c => c.PtInCurve(center)))//五金的中心在造型内部
@ -652,12 +653,12 @@ export class DrawDoorTool
if (isUpDownDoor) if (isUpDownDoor)
{ {
if (RecordHingeTrSizeX(hingeTr2Size_Map, hingeTr, size.x)) continue; 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 else
{ {
if (RecordHingeTrSizeX(hingeTr2Size_Map, hingeTr, size.z)) continue; 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) if (number === 0)
@ -697,13 +698,13 @@ export class DrawDoorTool
{ {
let doorWidth = doorBox.getSize(new Vector3).x; let doorWidth = doorBox.getSize(new Vector3).x;
if (RecordHingeTrSizeX(hingeTr2Size_Map, hingeTr, ironSize.x)) continue; 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 else
{ {
let doorHight = doorBox.getSize(new Vector3).z; let doorHight = doorBox.getSize(new Vector3).z;
if (RecordHingeTrSizeX(hingeTr2Size_Map, hingeTr, ironSize.z)) continue; 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) if (number === 0)
{ {
@ -888,7 +889,7 @@ export class DrawDoorTool
* @return {*} {number} * @return {*} {number}
* @memberof DrawDoorTool * @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 box1 = inventedBox.clone();
let box1Info: number; let box1Info: number;
@ -908,18 +909,31 @@ export class DrawDoorTool
box1Info = box1.getCenter(new Vector3).z; box1Info = box1.getCenter(new Vector3).z;
} }
let intersect = false;
if (box1Info + (isUpDownDoor ? 10 : 100) < doorSpecs) if (box1Info + (isUpDownDoor ? 10 : 100) < doorSpecs)
{ {
if (!IsBoxAndEntitysIntersect(realityBox1, checkEnts, BoxIntersectFuzz)) for (let ent of checkEnts)
return number; {
else //不考虑收口条情况
return this.MoveAgain(doorSpecs, inventedBox, realityBox, checkEnts, distance, number, isUpDownDoor); if (isParallelTo(yNormal, ent.Normal) && IsClosingStrip(ent))
continue;
if (IsBoxAndEntitysIntersect(realityBox1, [ent], BoxIntersectFuzz))
{
intersect = true;
break;
}
}
} }
else 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 box2 = inventedBox.clone();
let box2Info: number; let box2Info: number;
@ -938,22 +952,27 @@ export class DrawDoorTool
realityBox2.translate(new Vector3(0, 0, distance * -number)); realityBox2.translate(new Vector3(0, 0, distance * -number));
box2Info = box2.getCenter(new Vector3).z; box2Info = box2.getCenter(new Vector3).z;
} }
let intersect = false;
if (box2Info - (isUpDownDoor ? 10 : 100) > 0) if (box2Info - (isUpDownDoor ? 10 : 100) > 0)
{ {
if (!IsBoxAndEntitysIntersect(realityBox2, checkEnts, BoxIntersectFuzz)) for (let ent of checkEnts)
return -number;
else
{ {
if (number === MoveNum) //不考虑收口条情况
if (isParallelTo(yNormal, ent.Normal) && IsClosingStrip(ent))
return 0; continue;
else if (IsBoxAndEntitysIntersect(realityBox2, [ent], BoxIntersectFuzz))
{ {
number++; intersect = true;
return this.GetHingeMoveNum(doorSpecs, inventedBox, realityBox, checkEnts, distance, number, isUpDownDoor); break;
} }
} }
} }
else
intersect = true;
if (!intersect)
return -number;
else else
{ {
if (number === MoveNum) if (number === MoveNum)
@ -961,7 +980,7 @@ export class DrawDoorTool
else else
{ {
number++; 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 (parentOCS) box.applyMatrix4(parentOCS);
if (isDoor) 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; return true;
} }
else else

@ -106,3 +106,19 @@ export function isDingDiBan(b: Board)
} }
return false; 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 { Box3, Vector3 } from "three";
import { BoxIntersectFuzz, IsBoxAndEntitysIntersect, RecordHingeTrSizeX, SetHingeType, SetNoPareTypeHigneName } from "../../../Add-on/DrawBoard/DrawDoorDrawer/DrawDoorTool"; 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 { app } from "../../../ApplicationServices/Application";
import { EBoardKeyList } from "../../../Common/BoardKeyList"; import { EBoardKeyList } from "../../../Common/BoardKeyList";
import { DuplicateRecordCloning } from "../../../Common/Status"; import { DuplicateRecordCloning } from "../../../Common/Status";
@ -353,7 +353,8 @@ export class TemplateDrawHingeTool
doors.push(en); doors.push(en);
} }
let ocs = doors[0].SpaceOCSInv; let ocs = door.SpaceOCSInv;
let doorBox: Box3 = doors[0].GetBoundingBoxInMtx(ocs); let doorBox: Box3 = doors[0].GetBoundingBoxInMtx(ocs);
for (let i = 1; i < doors.length; i++) for (let i = 1; i < doors.length; i++)
@ -383,6 +384,8 @@ export class TemplateDrawHingeTool
for (let otherEnt of allOtherEntitys) for (let otherEnt of allOtherEntitys)
{ {
const yNormal = new Vector3().setFromMatrixColumn(ironware.OCSNoClone, 1);
if (otherEnt instanceof Board) if (otherEnt instanceof Board)
{ {
let br = otherEnt as 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()); grooveOutlines = grooves.map(g => g.ContourCurve.Clone().ApplyMatrix(g.OCS).ApplyMatrix(br.OCSInv).Z0());
outlinesCache.set(br, grooveOutlines); 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); const center = inventedBox.getCenter(new Vector3).applyMatrix4(br.OCSInv).setZ(0);
if (grooveOutlines.some(c => c.PtInCurve(center))) 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; if (RecordHingeTrSizeX(hingeTemplate2Size_Map, hingeTemp, isLROpen ? size.z : size.x)) continue;
let number = 1; 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) if (number === 0)
{ {
moveFail = true; moveFail = true;
@ -459,7 +462,7 @@ export class TemplateDrawHingeTool
continue; continue;
} }
let number = 1; 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) if (number === 0)
{ {
@ -484,7 +487,8 @@ export class TemplateDrawHingeTool
return needUpdate; 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 inventedBox1 = inventedBox.clone();
let realityBox1 = realityBox.clone(); let realityBox1 = realityBox.clone();
@ -509,11 +513,27 @@ export class TemplateDrawHingeTool
{ {
let doorHight = Height; let doorHight = Height;
inventedBox1.translate(new Vector3(0, 0, distance * number)); inventedBox1.translate(new Vector3(0, 0, distance * number));
realityBox1.translate(new Vector3(0, 0, distance * number)); realityBox1.translate(new Vector3(0, 0, distance * number));
let box1Z = inventedBox1.getCenter(new Vector3).z; 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; return number * distance;
else else
{ {
@ -523,8 +543,24 @@ export class TemplateDrawHingeTool
let realityBox2 = realityBox.clone(); let realityBox2 = realityBox.clone();
realityBox2.translate(new Vector3(0, 0, distance * -number)); 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; return -number * distance;
else else
{ {
@ -533,7 +569,7 @@ export class TemplateDrawHingeTool
else else
{ {
number++; 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; let box1Z = inventedBox1.getCenter(new Vector3).x;
realityBox1.translate(new Vector3(distance * number, 0, 0)); 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; return number * distance;
else else
{ {
@ -556,8 +608,23 @@ export class TemplateDrawHingeTool
let realityBox2 = realityBox.clone(); let realityBox2 = realityBox.clone();
realityBox2.translate(new Vector3(distance * -number, 0, 0)); 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; return -number * distance;
else else
{ {
@ -566,7 +633,7 @@ export class TemplateDrawHingeTool
else else
{ {
number++; 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