|
|
|
@ -4,7 +4,7 @@ import { Curve } from "../DatabaseServices/Entity/Curve";
|
|
|
|
|
import { RoomHolePolyline } from "../DatabaseServices/Room/Entity/Wall/Hole/RoomHolePolyline";
|
|
|
|
|
import { RoomWallBase } from "../DatabaseServices/Room/Entity/Wall/RoomWallBase";
|
|
|
|
|
import { CreateGetCurveParam } from "../DatabaseServices/Room/ParseService/GetCurveParam";
|
|
|
|
|
import { ParseWallRange } from "../DatabaseServices/Room/ParseService/Hole/RoomWallPlaceIHoleHelper";
|
|
|
|
|
import { FindBestRange, ParseWallRange } from "../DatabaseServices/Room/ParseService/Hole/RoomWallPlaceIHoleHelper";
|
|
|
|
|
import { RoomWallParse } from "../DatabaseServices/Room/ParseService/RoomWallParse";
|
|
|
|
|
import { CurveMap } from "../Geometry/CurveMap";
|
|
|
|
|
import { equalv2 } from "../Geometry/GeUtils";
|
|
|
|
@ -137,13 +137,36 @@ export function UpdateHoleFakerWallsAndUpdateDraw(hole: RoomHolePolyline)
|
|
|
|
|
let orgWall = hole.RelevancyWalls[0].Object;
|
|
|
|
|
let paramGet = CreateGetCurveParam(orgWall);
|
|
|
|
|
|
|
|
|
|
let ranges = ParseWallRange(orgWall, paramGet);
|
|
|
|
|
|
|
|
|
|
let [p1Param, p1Closeto] = paramGet.GetParamAtPoint2(p1);
|
|
|
|
|
let [p2Param, p2Closeto] = paramGet.GetParamAtPoint2(p2);
|
|
|
|
|
|
|
|
|
|
let range1 = FindBestRange(p1Param, ranges);
|
|
|
|
|
let range2 = FindBestRange(p2Param, ranges);
|
|
|
|
|
|
|
|
|
|
if (p1Closeto && p2Closeto)
|
|
|
|
|
{
|
|
|
|
|
wall.StartPoint = p1;
|
|
|
|
|
wall.EndPoint = p2;
|
|
|
|
|
if (range1 && range1 === range2)
|
|
|
|
|
{
|
|
|
|
|
wall.StartPoint = p1;
|
|
|
|
|
wall.EndPoint = p2;
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
let range = range1 ?? range2 ?? FindBestRange((p1Param + p2Param) * 0.5, ranges);
|
|
|
|
|
if (!range)
|
|
|
|
|
{
|
|
|
|
|
hole.Erase();
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
p1Param = Math.max(p1Param, range[0]);
|
|
|
|
|
p2Param = Math.min(p2Param, range[1]);
|
|
|
|
|
|
|
|
|
|
wall.StartPoint = paramGet.GetPointAtParam(p1Param);
|
|
|
|
|
wall.EndPoint = paramGet.GetPointAtParam(p2Param);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
@ -160,7 +183,16 @@ export function UpdateHoleFakerWallsAndUpdateDraw(hole: RoomHolePolyline)
|
|
|
|
|
let p1Param = holeData.StartParam;
|
|
|
|
|
let p2Param = holeData.EndParam;
|
|
|
|
|
|
|
|
|
|
//TODO:注意 这个实现导致的墙洞的尺寸发生变化! 在墙尺寸变化的时候
|
|
|
|
|
let range = FindBestRange(p1Param, ranges) ?? FindBestRange(p1Param, ranges) ?? FindBestRange((p1Param + p2Param) * 0.5, ranges);
|
|
|
|
|
if (!range)
|
|
|
|
|
{
|
|
|
|
|
hole.Erase();
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
p1Param = Math.max(p1Param, range[0]);
|
|
|
|
|
p2Param = Math.min(p2Param, range[1]);
|
|
|
|
|
|
|
|
|
|
wall.StartPoint = paramGet.GetPointAtParam(p1Param);
|
|
|
|
|
wall.EndPoint = paramGet.GetPointAtParam(p2Param);
|
|
|
|
|
}
|
|
|
|
@ -210,57 +242,31 @@ export function UpdateHoleFakerWallsAndUpdateDraw(hole: RoomHolePolyline)
|
|
|
|
|
}
|
|
|
|
|
else//拐角点仍然对齐
|
|
|
|
|
{
|
|
|
|
|
let p1 = pts[0];
|
|
|
|
|
let p2 = pts[2];
|
|
|
|
|
|
|
|
|
|
let orgWall1 = hole.RelevancyWalls[0].Object;
|
|
|
|
|
let orgWall2 = hole.RelevancyWalls[1].Object;
|
|
|
|
|
|
|
|
|
|
let paramGet1 = CreateGetCurveParam(orgWall1);
|
|
|
|
|
let paramGet2 = CreateGetCurveParam(orgWall2);
|
|
|
|
|
|
|
|
|
|
let [p1Param, p1Closeto] = paramGet1.GetParamAtPoint2(p1);
|
|
|
|
|
let [p2Param, p2Closeto] = paramGet2.GetParamAtPoint2(p2);
|
|
|
|
|
|
|
|
|
|
if (p1Closeto && p2Closeto)//所有的点都在墙上
|
|
|
|
|
{
|
|
|
|
|
fakerWalls[0].StartPoint = p1;
|
|
|
|
|
fakerWalls[1].EndPoint = p2;
|
|
|
|
|
}
|
|
|
|
|
else//有点不在墙上
|
|
|
|
|
{
|
|
|
|
|
if (!p1Closeto || true)//为了保证正确的范围点 所以做成true
|
|
|
|
|
{
|
|
|
|
|
let length1 = pts[0].distanceTo(pts[1]);
|
|
|
|
|
let orgWall = hole.RelevancyWalls[0].Object;
|
|
|
|
|
let ranges = ParseWallRange(orgWall);
|
|
|
|
|
if (!r1.isReverse)
|
|
|
|
|
length1 = Math.min(length1, orgWall.Length * ranges[0][1]);
|
|
|
|
|
else
|
|
|
|
|
length1 = Math.min(length1, orgWall.Length * (1 - arrayLast(ranges)[0]));
|
|
|
|
|
|
|
|
|
|
fakerWalls[0].StartPoint = fakerWalls[0].GetPointAtDistance(fakerWalls[0].Length - length1);
|
|
|
|
|
}
|
|
|
|
|
let length1 = pts[0].distanceTo(pts[1]);
|
|
|
|
|
let orgWall = hole.RelevancyWalls[0].Object;
|
|
|
|
|
let ranges = ParseWallRange(orgWall);
|
|
|
|
|
if (!r1.isReverse)
|
|
|
|
|
length1 = Math.min(length1, orgWall.Length * ranges[0][1]);
|
|
|
|
|
else
|
|
|
|
|
fakerWalls[0].StartPoint = p1;
|
|
|
|
|
length1 = Math.min(length1, orgWall.Length * (1 - arrayLast(ranges)[0]));
|
|
|
|
|
|
|
|
|
|
if (!p2Closeto || true)
|
|
|
|
|
{
|
|
|
|
|
let length2 = pts[1].distanceTo(pts[2]);
|
|
|
|
|
let orgWall = hole.RelevancyWalls[1].Object;
|
|
|
|
|
let ranges = ParseWallRange(orgWall);
|
|
|
|
|
if (r2.isReverse)
|
|
|
|
|
length2 = Math.min(length2, orgWall.Length * (1 - arrayLast(ranges)[0]));
|
|
|
|
|
else
|
|
|
|
|
length2 = Math.min(length2, orgWall.Length * ranges[0][1]);
|
|
|
|
|
|
|
|
|
|
fakerWalls[1].EndPoint = fakerWalls[1].GetPointAtDistance(length2);
|
|
|
|
|
}
|
|
|
|
|
fakerWalls[0].StartPoint = fakerWalls[0].GetPointAtDistance(fakerWalls[0].Length - length1);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
{
|
|
|
|
|
let length2 = pts[1].distanceTo(pts[2]);
|
|
|
|
|
let orgWall = hole.RelevancyWalls[1].Object;
|
|
|
|
|
let ranges = ParseWallRange(orgWall);
|
|
|
|
|
if (r2.isReverse)
|
|
|
|
|
length2 = Math.min(length2, orgWall.Length * (1 - arrayLast(ranges)[0]));
|
|
|
|
|
else
|
|
|
|
|
fakerWalls[1].EndPoint = p2;
|
|
|
|
|
length2 = Math.min(length2, orgWall.Length * ranges[0][1]);
|
|
|
|
|
|
|
|
|
|
updateHole = true;
|
|
|
|
|
fakerWalls[1].EndPoint = fakerWalls[1].GetPointAtDistance(length2);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
updateHole = true;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
else if (pts.length === 4)
|
|
|
|
|