!2265 修复:PM0之后R2B出错 fix #I7FZ6V

polyine_comp
ChenX 1 year ago
parent 411be28244
commit 2c47c66d4b

@ -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)
{

@ -2,16 +2,16 @@ import { toJS } from "mobx";
import { Box3, Matrix4, Object3D, Vector3 } from "three";
import { app } from "../../ApplicationServices/Application";
import { EBoardKeyList } from "../../Common/BoardKeyList";
import { GetRectData } from "../../Common/CurveUtils";
import { IsRect } from "../../Common/CurveUtils";
import { safeEval } from "../../Common/eval";
import { Buy2To3 } from "../../Common/HostUrl";
import { Log, LogType } from "../../Common/Log";
import { FixDigits } from "../../Common/Utils";
import { safeEval } from "../../Common/eval";
import { Board } from "../../DatabaseServices/Entity/Board";
import { Polyline } from "../../DatabaseServices/Entity/Polyline";
import { Command } from "../../Editor/CommandMachine";
import { PromptStatus } from "../../Editor/PromptResult";
import { XAxis, YAxis, ZAxis, isParallelTo } from "../../Geometry/GeUtils";
import { isParallelTo, XAxis, YAxis, ZAxis } from "../../Geometry/GeUtils";
import { ClampSpaceParseRay } from "../../Geometry/SpaceParse/ClampSpaceParseRay";
import { ISpaceParse } from "../../Geometry/SpaceParse/ISpaceParse";
import { PointSelectBoards } from "../../Geometry/SpaceParse/PointSelectBoards";
@ -116,24 +116,32 @@ class Rect2BoardTool2
totalBrs.forEach(b => app.Database.ModelSpace.Append(b));
}
/**
* 线
*
* TempData ()
* @param pl
*/
private ParsePolyline(pl: Polyline)
{
let firstDev = pl.GetFistDeriv(0);
let firstDev = pl.GetFistDeriv(0).normalize();
let size: Vector3;
let box: Box3;
if (isParallelTo(firstDev, XAxis) || isParallelTo(firstDev, YAxis))
pl.TempData = undefined;//清理数据 保证这个数据纯粹(RectInfo)
if (isParallelTo(firstDev, XAxis, 1e-3) || isParallelTo(firstDev, YAxis, 1e-3))//横平竖直的多段线
{
box = pl.BoundingBox;
size = box.getSize(new Vector3);
}
else
{
let rd = GetRectData(pl);
if (rd.isRect)
let rectInfo = IsRect(pl);
if (rectInfo)
{
pl.TempData = rd;
box = rd.box;
size = rd.size;
pl.TempData = rectInfo;
box = rectInfo.box;
size = rectInfo.size;
}
else
{
@ -198,12 +206,8 @@ class Rect2BoardTool2
let box = pl.__CacheBox__;
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;
@ -232,9 +236,11 @@ class Rect2BoardTool2
PlCache.get(pl)?.Erase();
//被旋转的矩形
let mtxInv = new Matrix4().getInverse(mtx);
if (ocs)
{
let mtxInv = new Matrix4().getInverse(mtx);
br.ApplyMatrix(mtx).ApplyMatrix(ocs).ApplyMatrix(mtxInv);
}
minp.y = min.y + shrink;

@ -9,7 +9,7 @@ import { IsPointInBowArc } from '../DatabaseServices/PointInPolyline';
import { Spline } from '../DatabaseServices/Spline';
import { Count } from '../Geometry/Count';
import { CurveMap, Vertice } from '../Geometry/CurveMap';
import { AsVector2, AsVector3, equaln, equalv2, equalv3, isIntersect, isParallelTo, isPerpendicularityTo, XAxis, YAxis, ZAxis, ZeroVec } from '../Geometry/GeUtils';
import { AsVector2, AsVector3, equaln, equalv2, equalv3, isIntersect, isParallelTo, XAxis, YAxis, ZAxis, ZeroVec } from '../Geometry/GeUtils';
import { Vec3 } from '../Geometry/IVec3';
import { Matrix2 } from '../Geometry/Matrix2';
import { Orbit } from '../Geometry/Orbit';
@ -790,119 +790,6 @@ export function Pts2Polyline(pts: (Vec3 | Vec2)[], isClose: boolean): Polyline
return pl;
}
/**获取矩形信息 */
export function GetRectData(cu: Curve): { isRect: boolean, size?: Vector3, box?: Box3, OCS?: Matrix4; }
{
if (cu instanceof Polyline)
{
if (!cu.IsClose) return { isRect: false };
let pts = cu.GetStretchPoints();
if (cu.Area2 < 0)
pts.reverse();
if (equalv3(pts[0], arrayLast(pts)))
pts.pop();
if (pts.length < 4) return { isRect: false };
let xVec: Vector3;
let p1 = pts[0];
let originIndex = 0;
for (let i = 1; i < pts.length; i++)
{
if (pts[i].y < p1.y)
{
p1 = pts[i];
originIndex = i;
}
else if (equaln(pts[i].y, p1.y))
{
if (pts[i].x < p1.x)
{
p1 = pts[i];
originIndex = i;
}
}
}
let tempPts = pts.splice(0, originIndex);
pts.push(...tempPts);
p1 = pts[0];
for (let i = 1; i < pts.length; i++)
{
let v = pts[i].clone().sub(p1);
if (equalv3(v, ZeroVec))
continue;
if (!xVec)
xVec = v;
else
{
if (isParallelTo(v, xVec))
xVec.copy(v);
else
break;
}
}
let yVec: Vector3;
for (let i = pts.length - 1; i > 0; i--)
{
let v = pts[i].clone().sub(p1);
if (equalv3(v, ZeroVec))
continue;
if (!yVec)
yVec = v;
else
{
if (isParallelTo(v, yVec))
yVec.copy(v);
else
break;
}
}
if (!xVec || !yVec) return { isRect: false };
//2向量必须垂直
if (!isPerpendicularityTo(xVec.clone().normalize(), yVec.clone().normalize(), 1e-2))
return { isRect: false };
if (yVec.length() > xVec.length())
[xVec, yVec] = [yVec.negate(), xVec];
if (xVec.angleTo(XAxis) > Math.PI / 4)
[xVec, yVec] = [yVec.negate(), xVec];
let rectOCS = new Matrix4().makeBasis(xVec.normalize(), yVec.normalize(), xVec.clone().cross(yVec));
let rectOCSInv = new Matrix4().getInverse(rectOCS);
for (let p of pts)
p.applyMatrix4(rectOCSInv);
let box = new Box3().setFromPoints(pts);
let size = box.getSize(new Vector3);
if (equaln(size.x * size.y, cu.Area, 0.1))
{
return {
isRect: true,
size,
box,
OCS: rectOCS,
};
}
}
return { isRect: false };
}
const PolylineSpliteRectFuzz = 1e-3;
/**封闭多段线 分割成矩形 */
export function PolylineSpliteRect(outline: Polyline): Polyline[]

Loading…
Cancel
Save