|
|
@ -1,6 +1,8 @@
|
|
|
|
import { Matrix4, Vector3 } from "three";
|
|
|
|
import { Matrix4, Vector3 } from "three";
|
|
|
|
import { Board, BoardType } from "../DatabaseServices/Board";
|
|
|
|
import { Board, BoardType } from "../DatabaseServices/Board";
|
|
|
|
import { equal, equaln } from "./GeUtils";
|
|
|
|
import { equal, equaln } from "./GeUtils";
|
|
|
|
|
|
|
|
import { app } from "../ApplicationServices/Application";
|
|
|
|
|
|
|
|
import { PromptStatus } from "../Editor/PromptResult";
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
/**
|
|
|
@ -31,7 +33,7 @@ export class SpaceParse
|
|
|
|
constructor(boards: Board[])
|
|
|
|
constructor(boards: Board[])
|
|
|
|
{
|
|
|
|
{
|
|
|
|
this.m_Boards = boards || [];
|
|
|
|
this.m_Boards = boards || [];
|
|
|
|
this.SpaceParse();
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
SpaceParse()
|
|
|
|
SpaceParse()
|
|
|
|
{
|
|
|
|
{
|
|
|
@ -66,7 +68,10 @@ export class TopAndBottomSpaceParse extends SpaceParse
|
|
|
|
private m_Spacelength: number;
|
|
|
|
private m_Spacelength: number;
|
|
|
|
private m_TotalLength: number;
|
|
|
|
private m_TotalLength: number;
|
|
|
|
private m_SpaceWidth: number;
|
|
|
|
private m_SpaceWidth: number;
|
|
|
|
private m_BasePoint: Vector3;
|
|
|
|
//侧包顶顶板基点
|
|
|
|
|
|
|
|
private m_BaseTopDownPoint: Vector3;
|
|
|
|
|
|
|
|
// 顶包侧顶板基点
|
|
|
|
|
|
|
|
private m_BaseTopUpPoint: Vector3;
|
|
|
|
|
|
|
|
|
|
|
|
constructor(boards: Board[])
|
|
|
|
constructor(boards: Board[])
|
|
|
|
{
|
|
|
|
{
|
|
|
@ -88,15 +93,19 @@ export class TopAndBottomSpaceParse extends SpaceParse
|
|
|
|
{
|
|
|
|
{
|
|
|
|
return this.m_SpaceWidth
|
|
|
|
return this.m_SpaceWidth
|
|
|
|
}
|
|
|
|
}
|
|
|
|
get BasePoint()
|
|
|
|
get BaseTopDownPoint()
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
return this.m_BaseTopDownPoint;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
get BaseTopUpPoint()
|
|
|
|
{
|
|
|
|
{
|
|
|
|
return this.m_BasePoint;
|
|
|
|
return this.m_BaseTopUpPoint;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
get OCS()
|
|
|
|
get OCS()
|
|
|
|
{
|
|
|
|
{
|
|
|
|
return this.m_LeftBoard ? this.m_LeftBoard.BoardOCS : new Matrix4();
|
|
|
|
return this.m_StandardBoard ? this.m_StandardBoard.BoardOCS : new Matrix4();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
SpaceParse()
|
|
|
|
async SpaceParse()
|
|
|
|
{
|
|
|
|
{
|
|
|
|
super.SpaceParse();
|
|
|
|
super.SpaceParse();
|
|
|
|
let lrBoards = this.boardMap.get(BoardType.Vertical);
|
|
|
|
let lrBoards = this.boardMap.get(BoardType.Vertical);
|
|
|
@ -105,70 +114,122 @@ export class TopAndBottomSpaceParse extends SpaceParse
|
|
|
|
let b1 = lrBoards[0].Clone() as Board;
|
|
|
|
let b1 = lrBoards[0].Clone() as Board;
|
|
|
|
let b2 = lrBoards[1].Clone() as Board;
|
|
|
|
let b2 = lrBoards[1].Clone() as Board;
|
|
|
|
|
|
|
|
|
|
|
|
b1.ApplyMatrix(b1.BoardOCSInv);
|
|
|
|
b1.ApplyMatrix(new Matrix4().extractRotation(b1.BoardOCSInv));
|
|
|
|
b2.ApplyMatrix(b1.BoardOCSInv);
|
|
|
|
b2.ApplyMatrix(new Matrix4().extractRotation(b2.BoardOCSInv));
|
|
|
|
|
|
|
|
|
|
|
|
[this.m_LeftBoard, this.m_RightBoard] =
|
|
|
|
[this.m_LeftBoard, this.m_RightBoard] =
|
|
|
|
b1.Position.x < b2.Position.x ? [lrBoards[0], lrBoards[1]] : [lrBoards[1], lrBoards[0]];
|
|
|
|
b1.Position.x < b2.Position.x ? [lrBoards[0], lrBoards[1]] : [lrBoards[1], lrBoards[0]];
|
|
|
|
|
|
|
|
|
|
|
|
if (this.ParseLRBoards())
|
|
|
|
if (this.ParseLRBoards(b1, b2))
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
let res = await this.GetStandardBoard(b1, b2);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//选择基准板错误
|
|
|
|
|
|
|
|
if (res)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
this.m_IsVail = true;
|
|
|
|
this.m_IsVail = true;
|
|
|
|
this.GetStandardBoard();
|
|
|
|
this.ParseGeometry(b1, b2);
|
|
|
|
this.ParseGeometry();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else
|
|
|
|
else
|
|
|
|
this.m_IsVail = false;
|
|
|
|
this.m_IsVail = false;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
ParseLRBoards()
|
|
|
|
ParseLRBoards(b1: Board, b2: Board)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
if (this.m_LeftBoard && this.m_RightBoard)
|
|
|
|
if (b1 && b2)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
// 左右侧板位置相等,无效
|
|
|
|
// 左右侧板位置相等,无效
|
|
|
|
if (equal(this.m_LeftBoard.Position, this.m_RightBoard.Position))
|
|
|
|
if (equal(b1.Position, b2.Position))
|
|
|
|
return false;
|
|
|
|
return false;
|
|
|
|
//左右侧板不平行,无效
|
|
|
|
//左右侧板不平行,无效
|
|
|
|
if (!equaln(Math.abs(this.m_LeftBoard.Normal.dot(this.m_RightBoard.Normal)), 1, 1e-6))
|
|
|
|
if (!equaln(Math.abs(b1.Normal.dot(b2.Normal)), 1, 1e-6))
|
|
|
|
{
|
|
|
|
{
|
|
|
|
return false;
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
let lMinPt = this.m_LeftBoard.MinPoint;
|
|
|
|
let lMinPt = b1.MinPoint;
|
|
|
|
let rMinPt = this.m_RightBoard.MinPoint;
|
|
|
|
let rMinPt = b2.MinPoint;
|
|
|
|
let dist = lMinPt.distanceToSquared(rMinPt);
|
|
|
|
|
|
|
|
let vec = lMinPt.sub(rMinPt).normalize();
|
|
|
|
return Math.abs(lMinPt.x + rMinPt.x) > Math.max(b1.Thickness, b2.Thickness)
|
|
|
|
if (!equaln(Math.abs(this.m_LeftBoard.Normal.dot(vec)), 1, 1e-6))
|
|
|
|
&& Math.abs(lMinPt.y - rMinPt.y) + 1e-6 < Math.max(b1.Width, b2.Width)
|
|
|
|
{
|
|
|
|
&& Math.abs(lMinPt.z - rMinPt.z) + 1e-6 < Math.max(b1.Lenght, b2.Lenght);
|
|
|
|
return false;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//左右侧板不能重合
|
|
|
|
|
|
|
|
return dist - 1e-2 > this.m_LeftBoard.Thickness ** 2
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return false;
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
ParseGeometry()
|
|
|
|
ParseGeometry(b1: Board, b2: Board)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
|
|
|
|
let lMinPt = b1.MinPoint;
|
|
|
|
|
|
|
|
let rMinPt = b2.MinPoint;
|
|
|
|
|
|
|
|
let lMaxPt = b1.MaxPoint;
|
|
|
|
|
|
|
|
let rMaxPt = b2.MaxPoint;
|
|
|
|
|
|
|
|
|
|
|
|
let lB = this.m_LeftBoard;
|
|
|
|
let vec = rMinPt.clone().sub(lMinPt);
|
|
|
|
let rB = this.m_RightBoard;
|
|
|
|
let ang = b1.Normal.angleTo(vec);
|
|
|
|
|
|
|
|
let dist = vec.length() * Math.cos(ang);
|
|
|
|
|
|
|
|
|
|
|
|
let lMinPt = lB.MinPoint;
|
|
|
|
|
|
|
|
let rMinPt = rB.MinPoint;
|
|
|
|
|
|
|
|
let dist = lMinPt.distanceTo(rMinPt);
|
|
|
|
|
|
|
|
//空间净长
|
|
|
|
//空间净长
|
|
|
|
this.m_Spacelength = dist - lB.Thickness;
|
|
|
|
this.m_Spacelength = dist - b1.Thickness;
|
|
|
|
//总宽
|
|
|
|
//总宽
|
|
|
|
this.m_TotalLength = dist + lB.Thickness + rB.Thickness;
|
|
|
|
this.m_TotalLength = dist + b2.Thickness;
|
|
|
|
|
|
|
|
|
|
|
|
//空间宽度
|
|
|
|
//空间宽度
|
|
|
|
this.m_SpaceWidth = this.m_StandardBoard.Width;
|
|
|
|
this.m_SpaceWidth = this.m_StandardBoard.Width;
|
|
|
|
|
|
|
|
|
|
|
|
this.m_BasePoint = new Vector3(this.m_Spacelength, 0, this.m_StandardBoard.Lenght);
|
|
|
|
if (this.m_StandardBoard === this.m_LeftBoard)
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
this.m_BaseTopDownPoint = new Vector3(rMinPt.x, lMinPt.y);
|
|
|
|
|
|
|
|
this.m_BaseTopUpPoint = new Vector3(rMinPt.x + b2.Thickness, lMinPt.y)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
GetStandardBoard()
|
|
|
|
else
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
this.m_BaseTopDownPoint = new Vector3(rMinPt.x, rMinPt.y);
|
|
|
|
|
|
|
|
this.m_BaseTopUpPoint = new Vector3(rMinPt.x + b2.Thickness, rMinPt.y)
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
this.m_BaseTopDownPoint.setZ(lMaxPt.z < rMaxPt.z ? lMaxPt.z : rMaxPt.z);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
this.m_BaseTopUpPoint.setZ(lMaxPt.z > rMaxPt.z ? lMaxPt.z : rMaxPt.z);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//分析背板
|
|
|
|
|
|
|
|
let behindBoards = this.boardMap.get(BoardType.Behind);
|
|
|
|
|
|
|
|
if (behindBoards && behindBoards.length === 1)
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
let behindBoard = behindBoards[0];
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
async GetStandardBoard(b1: Board, b2: Board)
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
let lMinPt = b1.MinPoint;
|
|
|
|
|
|
|
|
let rMinPt = b2.MinPoint;
|
|
|
|
|
|
|
|
if (equaln(lMinPt.y, rMinPt.y)
|
|
|
|
|
|
|
|
&& equaln(lMinPt.z, rMinPt.z)
|
|
|
|
|
|
|
|
&& equaln(b1.Width, b2.Width)
|
|
|
|
|
|
|
|
&& equaln(b1.Lenght, b2.Lenght))
|
|
|
|
{
|
|
|
|
{
|
|
|
|
this.m_StandardBoard = this.m_LeftBoard;
|
|
|
|
this.m_StandardBoard = this.m_LeftBoard;
|
|
|
|
|
|
|
|
return true;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
else
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
while (true)
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
let ssRes = await app.m_Editor.GetEntity({ Msg: "请选择基准板" });
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (ssRes.Status === PromptStatus.Cancel) return false;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
let baseBoard = ssRes.Entity;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (baseBoard instanceof Board)
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
if ([this.m_LeftBoard, this.m_RightBoard].includes(baseBoard))
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
this.m_StandardBoard = baseBoard;
|
|
|
|
|
|
|
|
return true;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|