|
|
@ -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);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|