|
|
|
@ -1,7 +1,7 @@
|
|
|
|
|
import { Box3, Matrix4, Vector3 } from "three";
|
|
|
|
|
import { app } from "../../ApplicationServices/Application";
|
|
|
|
|
import { arrayRemoveIf } from "../../Common/ArrayExt";
|
|
|
|
|
import { GetRectData } from "../../Common/CurveUtils";
|
|
|
|
|
import { IsRect } from "../../Common/CurveUtils";
|
|
|
|
|
import { safeEval } from "../../Common/eval";
|
|
|
|
|
import { Buy2To3 } from "../../Common/HostUrl";
|
|
|
|
|
import { SetMtxVector } from "../../Common/Matrix4Utils";
|
|
|
|
@ -146,14 +146,13 @@ export class Polyline2Board implements Command
|
|
|
|
|
SetMtxVector(ucs, 3, pl0.Position);
|
|
|
|
|
let ucsinv = new Matrix4().getInverse(ucs);
|
|
|
|
|
pls = pls.filter(pl => CurveInOCS(pl, ucs, ucsinv));
|
|
|
|
|
for (let pl of pls)
|
|
|
|
|
pl.Erase();
|
|
|
|
|
|
|
|
|
|
let backPls: Polyline[] = [];//背板 //下面会处理成带孩子们
|
|
|
|
|
let facePls: Polyline[] = [];//条子或者地脚
|
|
|
|
|
let otherPls: Polyline[] = [];//层板立板//下面会过滤掉被背板包含的
|
|
|
|
|
for (let pl of pls)
|
|
|
|
|
{
|
|
|
|
|
pl.Erase();
|
|
|
|
|
pl.ApplyMatrix(ucsinv);
|
|
|
|
|
this.ParsePolyline(pl);
|
|
|
|
|
let size = pl.__CacheSize__;
|
|
|
|
@ -188,7 +187,7 @@ export class Polyline2Board implements Command
|
|
|
|
|
SetMtxVector(this.SpaceOCS, 2, y);
|
|
|
|
|
|
|
|
|
|
let allBoards: Board[] = [];
|
|
|
|
|
let layerVerBoards: Board[] = this.DrawBoard(otherPls);
|
|
|
|
|
let layerVerBoards: Board[] = this.DrawBoard(otherPls, false);
|
|
|
|
|
let tzdj = this.DrawBoard(facePls, false, 4);//条子或地脚板
|
|
|
|
|
allBoards.push(...tzdj);
|
|
|
|
|
|
|
|
|
@ -714,6 +713,13 @@ export class Polyline2Board implements Command
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
*
|
|
|
|
|
* @param pls
|
|
|
|
|
* @param [isBack=false] 背板+背板的子孙们(背板和背板包裹的板) 否则为 层板立板(孤立无援) 收口条
|
|
|
|
|
* @param [color]
|
|
|
|
|
* @returns 板件列表
|
|
|
|
|
*/
|
|
|
|
|
DrawBoard(pls: Polyline[], isBack = false, color?: number): Board[]
|
|
|
|
|
{
|
|
|
|
|
let depth = this.boardDepth;
|
|
|
|
@ -737,12 +743,8 @@ export class Polyline2Board implements Command
|
|
|
|
|
let box = pl.__CacheBox__ as Box3;
|
|
|
|
|
let minp = box.min.clone();
|
|
|
|
|
|
|
|
|
|
let ocs: Matrix4;
|
|
|
|
|
if (pl.TempData)
|
|
|
|
|
{
|
|
|
|
|
ocs = pl.TempData.OCS.clone();
|
|
|
|
|
minp.applyMatrix4(pl.TempData.OCS);
|
|
|
|
|
}
|
|
|
|
|
//是被旋转的矩形
|
|
|
|
|
let ocs: Matrix4 = pl.TempData?.OCS;
|
|
|
|
|
|
|
|
|
|
let br: Board;
|
|
|
|
|
|
|
|
|
@ -760,7 +762,7 @@ export class Polyline2Board implements Command
|
|
|
|
|
br = Board.CreateBoard(y, depth, x, BoardType.Vertical);
|
|
|
|
|
[minp.x, minp.y, minp.z] = [minp.x, minp.z, minp.y];
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
else//背板
|
|
|
|
|
{
|
|
|
|
|
[minp.x, minp.y, minp.z] = [minp.x, minp.z + this.backBoardThick, minp.y];
|
|
|
|
|
|
|
|
|
@ -770,10 +772,10 @@ export class Polyline2Board implements Command
|
|
|
|
|
{
|
|
|
|
|
minp.y += this.boardDepth - this.backBoardThick - this.backBoardMoveDis;//移动到后面
|
|
|
|
|
|
|
|
|
|
if (pl.TempData || GetRectData(pl).isRect)
|
|
|
|
|
if (pl.TempData || IsRect(pl))//如果是矩形 TODO:有个BUG 旋转矩形会错误的进来,会错误的延伸 (一般的用户不会画这样的背板) 例如◇
|
|
|
|
|
{
|
|
|
|
|
minp.x -= this.backLeftExtend;
|
|
|
|
|
minp.z -= this.backDownExtend;
|
|
|
|
|
minp.x -= this.backLeftExtend;//背板左延伸
|
|
|
|
|
minp.z -= this.backDownExtend;//背板下延伸
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
x += this.backLeftExtend + this.backRightExtend;
|
|
|
|
@ -784,7 +786,7 @@ export class Polyline2Board implements Command
|
|
|
|
|
br = Board.CreateBoard(y, x, this.backBoardThick, BoardType.Behind);
|
|
|
|
|
br.Name = this.backBrName;
|
|
|
|
|
|
|
|
|
|
if (!pl.TempData && !GetRectData(pl).isRect)
|
|
|
|
|
if (!pl.TempData && !IsRect(pl))//如果不是矩形(处理延伸) TODO:如上TODO 这也是个隐含的BUG
|
|
|
|
|
{
|
|
|
|
|
pl.Position = pl.Position.sub(box.min);
|
|
|
|
|
let con = pl.Clone();
|
|
|
|
@ -792,7 +794,7 @@ export class Polyline2Board implements Command
|
|
|
|
|
br.ContourCurve = con;
|
|
|
|
|
if (isBack && (this.backTopExtend !== 0 || this.backDownExtend !== 0 || this.backLeftExtend !== 0 || this.backRightExtend !== 0))
|
|
|
|
|
{
|
|
|
|
|
let polyline = this.GetSpecialBoardContour(br);
|
|
|
|
|
let polyline = this.GetSpecialBoardContour(br);//背板:异形的上下左右延伸
|
|
|
|
|
|
|
|
|
|
if (polyline && polyline.IsClose)
|
|
|
|
|
br.ContourCurve = polyline;
|
|
|
|
@ -803,9 +805,11 @@ export class Polyline2Board implements Command
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//被旋转的矩形
|
|
|
|
|
let mtxInv = new Matrix4().getInverse(mtx);
|
|
|
|
|
if (ocs)
|
|
|
|
|
{
|
|
|
|
|
let mtxInv = new Matrix4().getInverse(mtx);
|
|
|
|
|
br.ApplyMatrix(mtx).ApplyMatrix(ocs).ApplyMatrix(mtxInv);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
let m = new Matrix4().setPosition(minp);
|
|
|
|
|
br.ApplyMatrix(m);
|
|
|
|
@ -844,32 +848,40 @@ export class Polyline2Board implements Command
|
|
|
|
|
return size.x >= this.moveBackWidth && size.y >= this.moveBackLen;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//是收口条或者地脚线
|
|
|
|
|
private IsFaceBoard(size: Vector3): boolean
|
|
|
|
|
{
|
|
|
|
|
return size.x > this.maxThickness + 1e-3 && size.y > this.maxThickness + 1e-3;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 解析多段线是不是被旋转了
|
|
|
|
|
* 得到它的盒子和尺寸
|
|
|
|
|
* 如果被旋转了 则有TempData 记录了矩形的信息(或者没有)
|
|
|
|
|
* @param pl
|
|
|
|
|
*/
|
|
|
|
|
private ParsePolyline(pl: Polyline)
|
|
|
|
|
{
|
|
|
|
|
let firstDev = pl.GetFistDeriv(0).normalize();
|
|
|
|
|
let size: Vector3;
|
|
|
|
|
let box: Box3;
|
|
|
|
|
if (isParallelTo(firstDev, XAxis, 1e-3) || isParallelTo(firstDev, YAxis, 1e-3))
|
|
|
|
|
pl.TempData = undefined;//clear(保证这个临时数据是纯粹的)
|
|
|
|
|
if (isParallelTo(firstDev, XAxis, 1e-3) || isParallelTo(firstDev, YAxis, 1e-3))//横平竖直的多段线
|
|
|
|
|
{
|
|
|
|
|
box = pl.BoundingBox;
|
|
|
|
|
size = box.getSize(new Vector3);
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
else//被旋转的
|
|
|
|
|
{
|
|
|
|
|
let reactData = GetRectData(pl);
|
|
|
|
|
if (reactData.isRect)
|
|
|
|
|
let reactData = IsRect(pl);
|
|
|
|
|
if (reactData)
|
|
|
|
|
{
|
|
|
|
|
pl.TempData = reactData;
|
|
|
|
|
pl.TempData = reactData;//进这里了 证明是被旋转的矩形
|
|
|
|
|
box = reactData.box;
|
|
|
|
|
size = reactData.size;
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
pl.TempData = undefined;//clear
|
|
|
|
|
box = pl.BoundingBox;
|
|
|
|
|
size = box.getSize(new Vector3);
|
|
|
|
|
}
|
|
|
|
@ -890,7 +902,7 @@ export class Polyline2Board implements Command
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 获取异形板延伸后轮廓 采用封边轮廓算法
|
|
|
|
|
* 获取异形板延伸后轮廓 采用封边轮廓算法(背板)
|
|
|
|
|
*/
|
|
|
|
|
private GetSpecialBoardContour(br: Board)
|
|
|
|
|
{
|
|
|
|
|