增加余料归方算法
This commit is contained in:
parent
063a010609
commit
c558e758d7
600
api.cjs.js
600
api.cjs.js
@ -1021,17 +1021,17 @@ let HistorycRecord = class HistorycRecord {
|
||||
//对象应该实现dataIn和DataOut的方法,为了对象的序列化和反序列化
|
||||
//对象从文件中读取数据,初始化自身
|
||||
ReadFile(file) {
|
||||
file.Read();
|
||||
let ver = file.Read();
|
||||
this.undoData = file.ReadObject();
|
||||
this.redoData = file.ReadObject();
|
||||
this.userData = file.ReadObject();
|
||||
if (ver === 1)
|
||||
file.ReadObject();
|
||||
}
|
||||
//对象将自身数据写入到文件.
|
||||
WriteFile(file) {
|
||||
file.Write(1);
|
||||
file.Write(2);
|
||||
file.WriteObject(this.undoData);
|
||||
file.WriteObject(this.redoData);
|
||||
file.WriteObject(this.userData);
|
||||
}
|
||||
};
|
||||
HistorycRecord = __decorate([
|
||||
@ -2780,8 +2780,8 @@ function arrayLast(arr) {
|
||||
* @param {Array<T>} arr
|
||||
* @returns {Array<T>} 返回自身
|
||||
*/
|
||||
function arraySortByNumber(arr) {
|
||||
arr.sort(sortNumberCompart);
|
||||
function arraySortByNumber$1(arr) {
|
||||
arr.sort(sortNumberCompart$1);
|
||||
return arr;
|
||||
}
|
||||
/**
|
||||
@ -2799,7 +2799,7 @@ function arrayRemoveDuplicateBySort(arr, checkFuction = checkEqual) {
|
||||
arr.length = j;
|
||||
return arr;
|
||||
}
|
||||
function sortNumberCompart(e1, e2) {
|
||||
function sortNumberCompart$1(e1, e2) {
|
||||
return e1 - e2;
|
||||
}
|
||||
function checkEqual(e1, e2) {
|
||||
@ -2828,7 +2828,7 @@ function arrayClone(arr) {
|
||||
return arr.slice();
|
||||
}
|
||||
//https://jsperf.com/merge-array-implementations/30
|
||||
function arrayPushArray(arr1, arr2) {
|
||||
function arrayPushArray$1(arr1, arr2) {
|
||||
let arr1Length = arr1.length;
|
||||
let arr2Length = arr2.length;
|
||||
arr1.length = arr1Length + arr2Length;
|
||||
@ -3548,7 +3548,7 @@ let Curve = class Curve extends Entity {
|
||||
if (param.length === 0)
|
||||
return [];
|
||||
param.push(0, this.EndParam);
|
||||
arraySortByNumber(param);
|
||||
arraySortByNumber$1(param);
|
||||
arrayRemoveDuplicateBySort(param, (e1, e2) => equaln$1(e1, e2, 1e-7));
|
||||
return param;
|
||||
}
|
||||
@ -4891,7 +4891,7 @@ function SplitCurveParams(cu) {
|
||||
if (arc.ParamOnCurve(param))
|
||||
params.push(param);
|
||||
}
|
||||
arraySortByNumber(params);
|
||||
arraySortByNumber$1(params);
|
||||
if (params.length === 0)
|
||||
continue;
|
||||
for (let p of params) {
|
||||
@ -5020,6 +5020,14 @@ function CreatePolylinePath(pts, buls) {
|
||||
功能:判断线段是否存在交点
|
||||
ref:https://www.geeksforgeeks.org/check-if-two-given-line-segments-intersect/
|
||||
*/
|
||||
// Given three colinear points p, q, r, the function checks if
|
||||
// point q lies on line segment 'pr'
|
||||
function onSegment(p, q, r) {
|
||||
if (q.x <= Math.max(p.x, r.x) && q.x >= Math.min(p.x, r.x) &&
|
||||
q.y <= Math.max(p.y, r.y) && q.y >= Math.min(p.y, r.y))
|
||||
return true;
|
||||
return false;
|
||||
}
|
||||
// To find orientation of ordered triplet (p, q, r).
|
||||
// The function returns following values
|
||||
// 0 --> p, q and r are colinear
|
||||
@ -5034,6 +5042,34 @@ function orientation(p, q, r) {
|
||||
return 0; // colinear
|
||||
return (val > 0) ? 1 : 2; // clock or counterclock wise
|
||||
}
|
||||
/**
|
||||
* 判断线段`p1q1`和线段`p2q2`是否相交.
|
||||
*/
|
||||
function doIntersect(p1, q1, p2, q2) {
|
||||
// Find the four orientations needed for general and
|
||||
// special cases
|
||||
let o1 = orientation(p1, q1, p2);
|
||||
let o2 = orientation(p1, q1, q2);
|
||||
let o3 = orientation(p2, q2, p1);
|
||||
let o4 = orientation(p2, q2, q1);
|
||||
// General case
|
||||
if (o1 !== o2 && o3 !== o4)
|
||||
return true;
|
||||
// Special Cases
|
||||
// p1, q1 and p2 are colinear and p2 lies on segment p1q1
|
||||
if (o1 === 0 && onSegment(p1, p2, q1))
|
||||
return true;
|
||||
// p1, q1 and q2 are colinear and q2 lies on segment p1q1
|
||||
if (o2 === 0 && onSegment(p1, q2, q1))
|
||||
return true;
|
||||
// p2, q2 and p1 are colinear and p1 lies on segment p2q2
|
||||
if (o3 === 0 && onSegment(p2, p1, q2))
|
||||
return true;
|
||||
// p2, q2 and q1 are colinear and q1 lies on segment p2q2
|
||||
if (o4 === 0 && onSegment(p2, q1, q2))
|
||||
return true;
|
||||
return false; // Doesn't fall in any of the above cases
|
||||
}
|
||||
|
||||
function SplineConver2Polyline(spl, tolerance = 0.1) {
|
||||
let cu = spl.Shape;
|
||||
@ -5576,7 +5612,7 @@ class CurveIntersection {
|
||||
arr = [];
|
||||
this.intersect2.set(curve, arr);
|
||||
}
|
||||
arrayPushArray(arr, params);
|
||||
arrayPushArray$1(arr, params);
|
||||
}
|
||||
GenBox(cus) {
|
||||
for (let c of cus)
|
||||
@ -5989,7 +6025,7 @@ function CreateContours(curves, fuzz = 1e-4) {
|
||||
if (cu instanceof exports.Circle)
|
||||
contours.push(Contour.CreateContour(cu.Clone())); //避免将原始曲线传递给板,导致撤销这个圆失败
|
||||
else if (cu instanceof exports.Polyline)
|
||||
arrayPushArray(newCurves, cu.Explode());
|
||||
arrayPushArray$1(newCurves, cu.Explode());
|
||||
else if (cu instanceof Spline) {
|
||||
let pl = cu.Convert2Polyline();
|
||||
if (pl.IsClose)
|
||||
@ -6015,7 +6051,7 @@ function CreateContours(curves, fuzz = 1e-4) {
|
||||
let isClose = cu.IsClose;
|
||||
let ipts = [];
|
||||
for (let [, pts] of pmap) {
|
||||
arrayPushArray(ipts, pts);
|
||||
arrayPushArray$1(ipts, pts);
|
||||
if (!isClose)
|
||||
for (let p of pts) {
|
||||
let d = p.distanceToSquared(ep);
|
||||
@ -6052,11 +6088,11 @@ function CreateContours(curves, fuzz = 1e-4) {
|
||||
let tempCus = [];
|
||||
for (let c of curves) {
|
||||
if (c instanceof exports.Polyline)
|
||||
arrayPushArray(tempCus, c.Explode());
|
||||
arrayPushArray$1(tempCus, c.Explode());
|
||||
else
|
||||
tempCus.push(c);
|
||||
}
|
||||
arrayPushArray(curves2, tempCus);
|
||||
arrayPushArray$1(curves2, tempCus);
|
||||
}
|
||||
let parse = new RegionParse(curves2);
|
||||
for (let rs of parse.RegionsOutline) {
|
||||
@ -11988,12 +12024,6 @@ function CyHoleInBoard(cys, br, ocs, checkAll = false) {
|
||||
}
|
||||
return true;
|
||||
}
|
||||
const TempRectHoleOption = {
|
||||
up: "",
|
||||
down: "",
|
||||
left: "",
|
||||
right: "",
|
||||
};
|
||||
/**分析上下左右排钻 */
|
||||
function ParseBoardRectHoleType(br, outBrRectHoleType = {}) {
|
||||
let dir = Math.sign(br.ContourCurve.Area2);
|
||||
@ -12824,7 +12854,7 @@ const DefaultClosingStripOption = {
|
||||
};
|
||||
Object.freeze(DefaultClosingStripOption);
|
||||
const DefaultBoardFindOption = {
|
||||
version: 7,
|
||||
version: 8,
|
||||
condition: {
|
||||
layer: false,
|
||||
height: false,
|
||||
@ -12848,6 +12878,7 @@ const DefaultBoardFindOption = {
|
||||
useKeyWord: false,
|
||||
addRemarks: false,
|
||||
composingFace: false,
|
||||
openDir: false,
|
||||
sealedUp: false,
|
||||
sealedDown: false,
|
||||
sealedLeft: false,
|
||||
@ -12875,6 +12906,7 @@ const DefaultBoardFindOption = {
|
||||
bigHoleDir: ECompareType.Equal,
|
||||
drillType: ECompareType.Equal,
|
||||
composingFace: ECompareType.Equal,
|
||||
openDir: ECompareType.Equal,
|
||||
[EBoardKeyList.KnifeRad]: ECompareType.Equal,
|
||||
},
|
||||
tolerance: {
|
||||
@ -12898,6 +12930,8 @@ const DefaultBoardFindOption = {
|
||||
bigHoleDir: FaceDirection.Front,
|
||||
drillType: "",
|
||||
composingFace: ComposingType.Positive,
|
||||
openDir: BoardOpenDir.None,
|
||||
hardwareDoorName: "",
|
||||
sealedUp: "",
|
||||
sealedDown: "",
|
||||
sealedLeft: "",
|
||||
@ -12989,9 +13023,9 @@ const DefaultDoorOption = {
|
||||
lbSealedLeft: 1,
|
||||
lbSealedRight: 1,
|
||||
lbHightDrillOption: { up: "", down: "", left: "", right: "" },
|
||||
deviation: 100,
|
||||
useBoardProcessOption: true,
|
||||
isModifyHardwareMaterial: false,
|
||||
deviation: 100 //偏移量
|
||||
};
|
||||
Object.freeze(DefaultDoorOption);
|
||||
const DefaultHingeOption = {
|
||||
@ -15242,7 +15276,7 @@ class ContourTreeNode {
|
||||
let holes = this.children.map(h => {
|
||||
// TestDraw(h.contour.Curve, depth + 1);
|
||||
let pts = h.contour.Curve.GetStretchPoints();
|
||||
arrayPushArray(vertices, pts);
|
||||
arrayPushArray$1(vertices, pts);
|
||||
return pts;
|
||||
});
|
||||
let faces = three.ShapeUtils.triangulateShape(pts, holes);
|
||||
@ -15519,7 +15553,7 @@ class CurveTape {
|
||||
let xparams = SplitCurveParams(this.contour.Curve);
|
||||
if (this.splitParams.length > 0) {
|
||||
xparams.push(...this.splitParams);
|
||||
arraySortByNumber(xparams);
|
||||
arraySortByNumber$1(xparams);
|
||||
arrayRemoveDuplicateBySort(xparams, (p1, p2) => equaln$1(p1, p2));
|
||||
}
|
||||
let polylines = [];
|
||||
@ -15896,7 +15930,7 @@ function SubtractRange(orgStart, orgEnd, clipStart, clipEnd, end) {
|
||||
let arr = SubtractRange(orgStart, orgEnd, clipStart, end, end);
|
||||
let rem = [];
|
||||
for (let s of arr)
|
||||
arrayPushArray(rem, SubtractRange(s[0], s[1], 0, clipEnd, end));
|
||||
arrayPushArray$1(rem, SubtractRange(s[0], s[1], 0, clipEnd, end));
|
||||
return rem;
|
||||
}
|
||||
if (clipStart >= orgEnd || clipEnd <= orgStart)
|
||||
@ -15919,7 +15953,7 @@ function SubtractRanges(ranges, subRanges, end) {
|
||||
for (let sr of subRanges) {
|
||||
let temps = [];
|
||||
for (let r of rets)
|
||||
arrayPushArray(temps, SubtractRange2(r, sr, end));
|
||||
arrayPushArray$1(temps, SubtractRange2(r, sr, end));
|
||||
rets = temps;
|
||||
}
|
||||
return rets;
|
||||
@ -16077,7 +16111,7 @@ function GetIntersection(cu1, cu2) {
|
||||
else
|
||||
m = new Map();
|
||||
intCache.set(cu1, m);
|
||||
let r = cu1.IntersectWith2(cu2, IntersectOption.ExtendNone);
|
||||
let r = cu1.IntersectWith2(cu2, IntersectOption.ExtendNone, 1e-4);
|
||||
let cu1EndParam = cu1.EndParam;
|
||||
let cu2EndParam = cu2.EndParam;
|
||||
for (let d of r) {
|
||||
@ -16582,7 +16616,7 @@ let ExtrudeSolid = ExtrudeSolid_1 = class ExtrudeSolid extends Entity {
|
||||
let isEqualNorm = equalv3(n, tn);
|
||||
let targetZMin = target.Position.applyMatrix4(this.OCSInv).z;
|
||||
let targetZMax = targetZMin + target.Thickness * (isEqualNorm ? 1 : -1);
|
||||
[targetZMin, targetZMax] = arraySortByNumber([targetZMin, targetZMax]);
|
||||
[targetZMin, targetZMax] = arraySortByNumber$1([targetZMin, targetZMax]);
|
||||
const MergeRelevance = () => {
|
||||
if (!this.Id || !target.Id)
|
||||
return;
|
||||
@ -16775,7 +16809,7 @@ let ExtrudeSolid = ExtrudeSolid_1 = class ExtrudeSolid extends Entity {
|
||||
this.Position = this.Position.add(vec);
|
||||
return;
|
||||
}
|
||||
arraySortByNumber(indexList);
|
||||
arraySortByNumber$1(indexList);
|
||||
let updateBak = this.AutoUpdate;
|
||||
this.AutoUpdate = false;
|
||||
if (this.grooves.length === 0) {
|
||||
@ -17310,6 +17344,9 @@ let ExtrudeSolid = ExtrudeSolid_1 = class ExtrudeSolid extends Entity {
|
||||
this._MeshGeometry["IsMesh"] = true;
|
||||
this._EdgeGeometry = BufferGeometryUtils.MergeBufferGeometries(edges);
|
||||
}
|
||||
//因为这里更新了mesh geom 所以我们必须更新它.
|
||||
this._MeshGeometry = this.UpdateMeshGeom(this._MeshGeometry);
|
||||
this._MeshGeometry["IsMesh"] = true;
|
||||
//我们加入一些拓展信息,以便排钻能够使用(或者其他的,比如发送到效果图?,BBS)(布局视口会直接添加实体到场景,所以我们只在这里设置OriginEntity)
|
||||
for (let i = 0; i < this.__CacheSplitExtrudes.length; i++) {
|
||||
this.__CacheSplitExtrudes[i].objectId = new ObjectId(this.Id.Index * -100 - i);
|
||||
@ -17395,12 +17432,8 @@ let ExtrudeSolid = ExtrudeSolid_1 = class ExtrudeSolid extends Entity {
|
||||
if (this.thickness <= 0)
|
||||
return new three.BufferGeometry();
|
||||
this.CalcRelevanceGroove();
|
||||
if (this._MeshGeometry) {
|
||||
//修复二维刀路更新(在有关联切割的情况下)
|
||||
this._MeshGeometry = this.UpdateMeshGeom(this._MeshGeometry);
|
||||
this._MeshGeometry["IsMesh"] = true;
|
||||
if (this._MeshGeometry)
|
||||
return this._MeshGeometry;
|
||||
}
|
||||
this._EdgeGeometry = undefined; //清理掉(以便在被csg切割后得到edgegeom)
|
||||
let grooves = this.Grooves;
|
||||
if (grooves.every(g => equaln$1(g.thickness, this.thickness)) || grooves.length === 0) {
|
||||
@ -17463,15 +17496,7 @@ let ExtrudeSolid = ExtrudeSolid_1 = class ExtrudeSolid extends Entity {
|
||||
get EdgeGeometry() {
|
||||
if (this._EdgeGeometry)
|
||||
return this._EdgeGeometry;
|
||||
let oldMeshGeom = this._MeshGeometry;
|
||||
{
|
||||
this.CalcRelevanceGroove();
|
||||
//修复二维刀路更新(在有关联切割的情况下)
|
||||
if (this._MeshGeometry && this._MeshGeometry !== oldMeshGeom) {
|
||||
this._MeshGeometry = this.UpdateMeshGeom(this._MeshGeometry);
|
||||
this._MeshGeometry["IsMesh"] = true;
|
||||
}
|
||||
}
|
||||
this.CalcRelevanceGroove();
|
||||
if (this._EdgeGeometry)
|
||||
return this._EdgeGeometry;
|
||||
//这里我们超过100就用这个,为了性能 和MaxDrawGrooveCount不一致
|
||||
@ -17819,7 +17844,7 @@ let CompositeEntity = CompositeEntity_1 = class CompositeEntity extends Entity {
|
||||
GetObjectSnapPoints(snapMode, pickPoint, lastPoint, viewXform) {
|
||||
let pts = [];
|
||||
for (let e of this.Entitys)
|
||||
arrayPushArray(pts, e.Clone().ApplyMatrix(this.OCSNoClone).GetObjectSnapPoints(snapMode, pickPoint, lastPoint, viewXform));
|
||||
arrayPushArray$1(pts, e.Clone().ApplyMatrix(this.OCSNoClone).GetObjectSnapPoints(snapMode, pickPoint, lastPoint, viewXform));
|
||||
return pts;
|
||||
}
|
||||
GetGripPoints() {
|
||||
@ -17865,7 +17890,7 @@ let CompositeEntity = CompositeEntity_1 = class CompositeEntity extends Entity {
|
||||
return;
|
||||
}
|
||||
vec = vec.clone().applyMatrix4(this.OCSInv.setPosition(0, 0, 0));
|
||||
arraySortByNumber(indexList);
|
||||
arraySortByNumber$1(indexList);
|
||||
let i = 0;
|
||||
let j = 0;
|
||||
let icount = indexList.length;
|
||||
@ -19945,8 +19970,8 @@ let Board = Board_1 = class Board extends ExtrudeSolid {
|
||||
* 异形->矩形
|
||||
*/
|
||||
//上下左右排钻属性(在矩形时生效)
|
||||
TempRectHoleOption.up = undefined;
|
||||
ParseBoardRectHoleType(this, TempRectHoleOption); //分析旧的上下左右排钻
|
||||
let rectHoleOpt = {};
|
||||
ParseBoardRectHoleType(this, rectHoleOpt); //分析旧的上下左右排钻
|
||||
let oldHightSealCurves = GetBoardSealingCurves(this); //旧的封边轮廓
|
||||
let oldHightSealDatas = GetBoardHighSeal(this, oldHightSealCurves); //旧的封边数据
|
||||
let oldContour = this.ContourCurve; //旧的轮廓
|
||||
@ -19961,8 +19986,8 @@ let Board = Board_1 = class Board extends ExtrudeSolid {
|
||||
defaultDrillType = HostApplicationServices.DrillConfigs.size ? HostApplicationServices.DrillConfigs.entries().next().value[0] : DrillType.None;
|
||||
super.ContourCurve = newContour; //设置新的轮廓
|
||||
//保持排钻边属性
|
||||
if (this.isRect && TempRectHoleOption.up) //矩形->矩形
|
||||
SetBrHighHoleTypeFromRectHoleType(this, TempRectHoleOption); //直接应用旧的矩形数据
|
||||
if (this.isRect && rectHoleOpt.up) //矩形->矩形
|
||||
SetBrHighHoleTypeFromRectHoleType(this, rectHoleOpt); //直接应用旧的矩形数据
|
||||
else //异形->矩形 矩形->异形 异形->异形
|
||||
{
|
||||
let indexMap = [];
|
||||
@ -20510,7 +20535,7 @@ let Board = Board_1 = class Board extends ExtrudeSolid {
|
||||
super.MoveStretchPoints(originIndexList, vec);
|
||||
if (!this.Id)
|
||||
return;
|
||||
arraySortByNumber(mIndexList);
|
||||
arraySortByNumber$1(mIndexList);
|
||||
let ocsInv = this.OCSInv;
|
||||
let localVec = TransformVector(vec.clone(), ocsInv);
|
||||
let offset = 0;
|
||||
@ -20866,7 +20891,7 @@ function FastWireframe2(dr, color = 0) {
|
||||
function GenerateExtrudeEdgeGeometry(contourPoints, height) {
|
||||
let pts = [];
|
||||
for (let cs of contourPoints)
|
||||
arrayPushArray(pts, GenerateExtrudeEdgeGeometryPoints(cs, height));
|
||||
arrayPushArray$1(pts, GenerateExtrudeEdgeGeometryPoints(cs, height));
|
||||
let geo = new three.BufferGeometry().setFromPoints(pts);
|
||||
return geo;
|
||||
}
|
||||
@ -21051,7 +21076,7 @@ let ExtrudeHole = class ExtrudeHole extends Hole {
|
||||
this.Position = this.Position.add(vec);
|
||||
return;
|
||||
}
|
||||
arraySortByNumber(indexList);
|
||||
arraySortByNumber$1(indexList);
|
||||
this.MoveGripOrStretchPointsOnly(indexList, vec, dragType);
|
||||
this.CheckContourCurve();
|
||||
this.Update();
|
||||
@ -22874,6 +22899,473 @@ function ParseRegionTextPos(contour, holes) {
|
||||
return p;
|
||||
}
|
||||
|
||||
//返回可以插入的位置
|
||||
function InsertSortedIndex(array, element, comparefunc) {
|
||||
let leftbound = 0;
|
||||
let rightbound = array.length;
|
||||
while (rightbound > leftbound) {
|
||||
let testindex = Math.floor((leftbound + rightbound) / 2);
|
||||
let testelement = array[testindex];
|
||||
let compareresult = comparefunc(element, testelement);
|
||||
if (compareresult > 0) // element > testelement
|
||||
leftbound = testindex + 1;
|
||||
else if (compareresult === 0) //因为函数 FindBestRange 会取index-1 来取范围
|
||||
leftbound = testindex + 1;
|
||||
else
|
||||
rightbound = testindex;
|
||||
}
|
||||
return leftbound;
|
||||
}
|
||||
//范围并集
|
||||
function RangeUnion(ranges) {
|
||||
arrayRemoveDuplicateBySort(ranges, (r1, r2) => {
|
||||
if (r1[1] >= r2[1])
|
||||
return true;
|
||||
if (r1[1] >= r2[0]) {
|
||||
r1[1] = r2[1];
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
});
|
||||
return ranges;
|
||||
}
|
||||
|
||||
const LEFT = 1, RIGHT = 2, DOWN = 4, TOP = 8;
|
||||
// Compute the bit code for a point (x, y) using the clip rectangle
|
||||
// bounded diagonally by (xmin, ymin), and (xmax, ymax)
|
||||
// ASSUME THAT xmax, xmin, ymax and ymin are global constants.
|
||||
function ComputeOutCode(x, y, box) {
|
||||
let code = 0;
|
||||
if (x < box.min.x) // to the left of clip window
|
||||
code |= LEFT;
|
||||
else if (x > box.max.x) // to the right of clip window
|
||||
code |= RIGHT;
|
||||
if (y < box.min.y) // below the clip window
|
||||
code |= DOWN;
|
||||
else if (y > box.max.y) // above the clip window
|
||||
code |= TOP;
|
||||
return code;
|
||||
}
|
||||
/**
|
||||
* 盒子相交测试,快速判断盒子和直线或者圆是否有相交
|
||||
*/
|
||||
class BoxCheckIntersect {
|
||||
constructor(box) {
|
||||
this.p1 = box.min;
|
||||
this.p3 = box.max;
|
||||
this.p2 = new three.Vector2(this.p3.x, this.p1.y);
|
||||
this.p4 = new three.Vector2(this.p1.x, this.p3.y);
|
||||
this.box = box;
|
||||
}
|
||||
//直线与盒子相交,或者被盒子包含. Cohen–Sutherland裁剪算法
|
||||
IsIntersectLine(p1, p2) {
|
||||
let code1 = ComputeOutCode(p1.x, p1.y, this.box);
|
||||
let code2 = ComputeOutCode(p2.x, p2.y, this.box);
|
||||
//按位AND不为0:两个点共享一个外部区域(LEFT,RIGHT,TOP或BOTTOM),因此两个点都必须在窗口外部
|
||||
if (code1 & code2)
|
||||
return false;
|
||||
let code = code1 | code2;
|
||||
if (code1 === 0 || code2 === 0 || code === 3 || code === 12) //点1点2在矩形内,或者竖直贯穿,水平贯穿
|
||||
return true;
|
||||
if ((code & TOP) && doIntersect(p1, p2, this.p3, this.p4))
|
||||
return true;
|
||||
if ((code & LEFT) && doIntersect(p1, p2, this.p1, this.p4))
|
||||
return true;
|
||||
if ((code & RIGHT) && doIntersect(p1, p2, this.p2, this.p3))
|
||||
return true;
|
||||
if ((code & DOWN) && doIntersect(p1, p2, this.p3, this.p1))
|
||||
return true;
|
||||
return false;
|
||||
}
|
||||
//ref https://yal.cc/rectangle-circle-intersection-test/
|
||||
IsIntersectCircle(cen, radius) {
|
||||
let nearestX = three.MathUtils.clamp(cen.x, this.box.min.x, this.box.max.x);
|
||||
let nearestY = three.MathUtils.clamp(cen.y, this.box.min.y, this.box.max.y);
|
||||
return ((nearestX - cen.x) ** 2 + (nearestY - cen.y) ** 2) <= radius ** 2;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 删除数组中指定的元素,返回数组本身
|
||||
* @param {Array<any>} arr 需要操作的数组
|
||||
* @param {*} el 需要移除的元素
|
||||
*/
|
||||
/**
|
||||
* 根据数值从小到大排序数组
|
||||
* @param {Array<T>} arr
|
||||
* @returns {Array<T>} 返回自身
|
||||
*/
|
||||
function arraySortByNumber(arr) {
|
||||
arr.sort(sortNumberCompart);
|
||||
return arr;
|
||||
}
|
||||
function sortNumberCompart(e1, e2) {
|
||||
return e1 - e2;
|
||||
}
|
||||
//https://jsperf.com/merge-array-implementations/30
|
||||
function arrayPushArray(arr1, arr2) {
|
||||
let arr1Length = arr1.length;
|
||||
let arr2Length = arr2.length;
|
||||
arr1.length = arr1Length + arr2Length;
|
||||
for (let i = 0; i < arr2Length; i++)
|
||||
arr1[arr1Length + i] = arr2[i];
|
||||
return arr1;
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取面积最大的矩形
|
||||
* @param rects
|
||||
* @returns
|
||||
*/
|
||||
function GetMaxAreaFn(rects) {
|
||||
return Max(rects, (t1, t2) => t2[0] > t1[0]);
|
||||
}
|
||||
function GetMaxWidthFn(rects) {
|
||||
return Max(rects, (t1, t2) => t2[1] > t1[1]);
|
||||
}
|
||||
function GetMaxHeightFn(rects) {
|
||||
return Max(rects, (t1, t2) => t2[2] > t1[2]);
|
||||
}
|
||||
//最大内接矩形
|
||||
//1.分析盒子
|
||||
// 1.默认我们使用顶点坐标进行一维展开
|
||||
// 2.当存在斜线时, 我们精确展开(当跨度大于(100/50)时,我们精确产开另一条轴)
|
||||
// (1).获取需要精确展开的区间 随后合并区间
|
||||
// (2).对区间进行展开数值,使用二分搜索,如果在已有的顶点附近,则不进行增项
|
||||
//2.标记轮廓内的矩形
|
||||
// (1).我们收集多边形所有的斜线,与矩形盒子求交,如果相交,则矩形盒子无效化
|
||||
// (2).矩形终点在轮廓内(使用单条射线检测,因为我们始终在端点增加锚点的关系 我们似乎不会在顶点位置得到(交点? 稳妥起见 实现标准的射线检测算法)
|
||||
//3.获取最大内接矩形
|
||||
// 迭代开始
|
||||
// 动态规划 存储每个方块得到的最大矩形
|
||||
// 获取最大的(根据规则)
|
||||
// 对池子里的结果进行生存选择(如果被占用了方块,则该结果已经不可用)
|
||||
// 取剩下可用的最大的(因为我们已经是在合理的情况下拿最大的了,所以不需要在重新迭代)
|
||||
// 重复迭代
|
||||
/**
|
||||
* @example
|
||||
*
|
||||
* //1. 设置过滤条件(舍弃掉一些无用的矩形)
|
||||
* let lir = new LargestInteriorRectangle;
|
||||
* lir.MinWidth = 200;//设置最小可以接受的矩形宽度
|
||||
* lir.MinHeight = 200;//设置最小可以接受的矩形宽度
|
||||
* lir.MinArea = 200 * 200;//设置最小可以接受的矩形面积
|
||||
*
|
||||
* //除了变量 也可以设置过滤函数
|
||||
* //例如:
|
||||
* lir.FilterRectFn = !(w,h)=> (w>500 || h>500) //这样将对长或者宽不足500的矩形板过滤(舍弃)
|
||||
*
|
||||
* //2. 可以设置优先模式,默认提供了面积优先,你也可以使用宽度优先或者高度优先,或许默认规则可能不好用,可以自定义传入自定义函数.
|
||||
* lir.GetMaxRectIndexFn = LargestInteriorRectangle.GetMaxAreaFn; //或者 LargestInteriorRectangle.GetMaxWidthFn / LargestInteriorRectangle.GetMaxHeightFn
|
||||
*
|
||||
* //3. 你已经设置好解析器,你现在可以进行解析了
|
||||
* let rects = lir.ParseLir([ new Vector3(0,0,0) , new Vector3(100,0,0) , new Vector3(50,100,0)]) //首尾不需要重复,首尾重复可能造成错误,程序不再校验
|
||||
*
|
||||
*/
|
||||
class LargestInteriorRectangle {
|
||||
constructor() {
|
||||
this.MinWidth = 100;
|
||||
this.MinHeight = 100;
|
||||
this.MinArea = 200 * 200;
|
||||
this.GetMaxRectIndexFn = GetMaxAreaFn;
|
||||
}
|
||||
/**
|
||||
* 分析最大内接矩形
|
||||
* @param polygonPts 多边形点表,首尾不要相等
|
||||
*/
|
||||
ParseLIR(polygonPts) {
|
||||
//端点列表
|
||||
let xs = [];
|
||||
let ys = [];
|
||||
let xset = new Set();
|
||||
let yset = new Set();
|
||||
//需要展开的范围
|
||||
let xranges = [];
|
||||
let yranges = [];
|
||||
let polygonBox = new three.Box2().setFromPoints(polygonPts);
|
||||
let vec = new three.Vector2;
|
||||
let klines = []; //所有的斜线
|
||||
// let linesP: [Vector2, Vector2][] = []; //所有的线点
|
||||
// let linesFb = new Flatbush(pts.length);//所有的线的索引
|
||||
let fuzzX = new FuzzyFactory(1, 0.1);
|
||||
let fuzzY = new FuzzyFactory(1, 0.1);
|
||||
for (let i = 0; i < polygonPts.length; i++) {
|
||||
let p = polygonPts[i];
|
||||
let p2 = polygonPts[FixIndex$1(i + 1, polygonPts)];
|
||||
// linesP.push([p, p2]);
|
||||
// let box = new Box2().setFromPoints([p, p2]);
|
||||
// linesFb.add(box.min.x, box.min.y, box.max.x, box.max.y);
|
||||
vec.subVectors(p2, p);
|
||||
//收集端点
|
||||
let x = fuzzX.lookupOrCreate([p.x], p.x);
|
||||
if (!xset.has(x)) {
|
||||
xs.push(x);
|
||||
xset.add(x);
|
||||
}
|
||||
let y = fuzzY.lookupOrCreate([p.y], p.y);
|
||||
if (!yset.has(y)) {
|
||||
ys.push(y);
|
||||
yset.add(y);
|
||||
}
|
||||
//展开斜线 每20分段
|
||||
if (Math.abs(vec.x) > 20 && Math.abs(vec.y) > 20) {
|
||||
if (Math.abs(vec.x) > 20)
|
||||
yranges.push(vec.y > 0 ? [p.y, p2.y] : [p2.y, p.y]);
|
||||
if (Math.abs(vec.y) > 20)
|
||||
xranges.push(vec.x > 0 ? [p.x, p2.x] : [p2.x, p.x]);
|
||||
}
|
||||
//收集所有的斜线
|
||||
if (!equaln$1(vec.x, 0, 0.1) && !equaln$1(vec.y, 0, 0.1))
|
||||
klines.push([p, p2]);
|
||||
}
|
||||
// linesFb.finish();
|
||||
//合并展开区间
|
||||
xranges.sort((a, b) => a[0] - b[0]);
|
||||
yranges.sort((a, b) => a[0] - b[0]);
|
||||
xranges = RangeUnion(xranges);
|
||||
yranges = RangeUnion(yranges);
|
||||
arraySortByNumber(xs);
|
||||
arraySortByNumber(ys);
|
||||
//展开
|
||||
RangesAdd(xranges, xs);
|
||||
RangesAdd(yranges, ys);
|
||||
//最大化
|
||||
xs[0] = polygonBox.min.x;
|
||||
xs[xs.length - 1] = polygonBox.max.x;
|
||||
ys[0] = polygonBox.min.y;
|
||||
ys[ys.length - 1] = polygonBox.max.y;
|
||||
//所有网格的索引
|
||||
let gridFb = new Flatbush__default["default"]((xs.length - 1) * (ys.length - 1));
|
||||
// let pls: Polyline[] = [];
|
||||
for (let i = 0; i < xs.length - 1; i++) {
|
||||
for (let j = 0; j < ys.length - 1; j++) {
|
||||
gridFb.add(xs[i], ys[j], xs[i + 1], ys[j + 1]);
|
||||
// let pl = new Polyline().RectangleFrom2Pt(new Vector3(xs[i], ys[j]), new Vector3(xs[i + 1], ys[j + 1]));
|
||||
// if (false) TestDraw(pl);
|
||||
// pls.push(pl);
|
||||
}
|
||||
}
|
||||
gridFb.finish();
|
||||
const matrix = new Array(xs.length - 1).fill(1).map(() => new Array(ys.length - 1).fill(1));
|
||||
//矩形与斜线相交
|
||||
let checks = [];
|
||||
for (let line of klines) {
|
||||
let box = new three.Box2().setFromPoints(line);
|
||||
let ids = gridFb.search(box.min.x, box.min.y, box.max.x, box.max.y);
|
||||
for (let id of ids) {
|
||||
let check = checks[id];
|
||||
let i = Math.floor((id) / (ys.length - 1));
|
||||
let j = id - (i * (ys.length - 1));
|
||||
if (!check) {
|
||||
check = new BoxCheckIntersect(new three.Box2(new three.Vector2(xs[i] + 0.01, ys[j] + 0.01), new three.Vector2(xs[i + 1] - 0.01, ys[j + 1] - 0.01)));
|
||||
checks[id] = check;
|
||||
// let pl = new Polyline().RectangleFrom2Pt(new Vector3(xs[i], ys[j]), new Vector3(xs[i + 1], ys[j + 1]));
|
||||
// TestDraw(pl, 2);
|
||||
}
|
||||
if (check.IsIntersectLine(line[0], line[1])) {
|
||||
// pls[id].ColorIndex = 1;
|
||||
// pls[id].Erase();
|
||||
matrix[i][j] = 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
//y轴扫描线(矩形在多边形外)
|
||||
// if (xs.length < ys.length)
|
||||
{
|
||||
for (let i = 0; i < xs.length - 1; i++) {
|
||||
let x = (xs[i + 1] + xs[i]) * 0.5;
|
||||
let iPtYs = IsPointInPolygon(polygonPts, new three.Vector3(x, polygonBox.min.y - 0.1, 0));
|
||||
arraySortByNumber(iPtYs);
|
||||
for (let j = 0; j < ys.length - 1; j++) {
|
||||
let y = (ys[j + 1] + ys[j]) * 0.5;
|
||||
while (iPtYs.length && iPtYs[0] < y)
|
||||
iPtYs.shift();
|
||||
if (iPtYs.length % 2 !== 1) {
|
||||
// pls[i * (ys.length - 1) + j].ColorIndex = 3;
|
||||
// pls[i * (ys.length - 1) + j].Erase();
|
||||
matrix[i][j] = 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
// else//x轴扫描线
|
||||
//ref https://leetcode.cn/problems/maximal-rectangle/solutions/535672/zui-da-ju-xing-by-leetcode-solution-bjlu/
|
||||
const maximalRectangle = () => {
|
||||
const m = matrix.length; //m个竖条 xlist
|
||||
if (m === 0)
|
||||
return 0;
|
||||
const n = matrix[0].length; //n个横条 ylist
|
||||
if (n === 0)
|
||||
return;
|
||||
const left = new Array(m).fill(0).map(() => new Array(n).fill(0));
|
||||
for (let i = 0; i < m; i++) {
|
||||
for (let j = 0; j < n; j++) {
|
||||
if (matrix[i][j]) {
|
||||
left[i][j] = (j === 0 ? 0 : left[i][j - 1]) + 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
//area maxXIndex maxYIndex xcount ycount
|
||||
let rects = [];
|
||||
for (let j = 0; j < n; j++) // 对于每一列,使用基于柱状图的方法
|
||||
{
|
||||
const up = new Array(m).fill(0);
|
||||
const down = new Array(m).fill(0);
|
||||
let stack = [];
|
||||
for (let i = 0; i < m; i++) {
|
||||
while (stack.length && left[stack[stack.length - 1]][j] >= left[i][j]) {
|
||||
stack.pop();
|
||||
}
|
||||
up[i] = stack.length === 0 ? -1 : stack[stack.length - 1];
|
||||
stack.push(i);
|
||||
}
|
||||
stack = [];
|
||||
for (let i = m - 1; i >= 0; i--) {
|
||||
while (stack.length && left[stack[stack.length - 1]][j] >= left[i][j]) {
|
||||
stack.pop();
|
||||
}
|
||||
down[i] = stack.length === 0 ? m : stack[stack.length - 1];
|
||||
stack.push(i);
|
||||
}
|
||||
for (let i = 0; i < m; i++) {
|
||||
const xCount = down[i] - up[i] - 1;
|
||||
const yCount = left[i][j];
|
||||
if (!yCount || !xCount)
|
||||
continue;
|
||||
let width = xs[down[i]] - xs[down[i] - xCount];
|
||||
let height = ys[j + 1] - ys[j + 1 - yCount];
|
||||
if (width < this.MinWidth || height < this.MinHeight)
|
||||
continue;
|
||||
//自定义过滤函数
|
||||
if (this.FilterRectFn && this.FilterRectFn(width, height))
|
||||
continue;
|
||||
let area = width * height;
|
||||
//面积小于最小允许面积
|
||||
if (area < this.MinArea)
|
||||
continue;
|
||||
rects.push([area, down[i], j, xCount, yCount]);
|
||||
}
|
||||
}
|
||||
while (rects.length) {
|
||||
let maxIndex = Max(rects, (t1, t2) => t2[0] > t1[0]);
|
||||
let [area, maxXIndex, maxYIndex, xCount, yCount] = rects[maxIndex];
|
||||
let xMax = xs[maxXIndex];
|
||||
let yMax = ys[maxYIndex + 1];
|
||||
let xMin = xs[maxXIndex - xCount];
|
||||
let yMin = ys[maxYIndex + 1 - yCount];
|
||||
maxRects.push(new three.Box2(new three.Vector2(xMin, yMin), new three.Vector2(xMax, yMax)));
|
||||
rects.splice(maxIndex, 1);
|
||||
//对方块进行标记
|
||||
for (let i = 0; i < xCount; i++) {
|
||||
for (let j = 0; j < yCount; j++) {
|
||||
matrix[maxXIndex - 1 - i][maxYIndex - j] = 0;
|
||||
}
|
||||
}
|
||||
//如果有被标记的方块,则删除它
|
||||
arrayRemoveIf(rects, rect => {
|
||||
let [area, maxX, maxY, xCount, yCount] = rect;
|
||||
for (let i = 0; i < xCount; i++) {
|
||||
for (let j = 0; j < yCount; j++) {
|
||||
if (!matrix[maxX - 1 - i][maxY - j])
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
});
|
||||
}
|
||||
};
|
||||
let maxRects = [];
|
||||
while (true) {
|
||||
let count = maxRects.length;
|
||||
maximalRectangle();
|
||||
if (count === maxRects.length)
|
||||
break;
|
||||
}
|
||||
return maxRects;
|
||||
}
|
||||
}
|
||||
LargestInteriorRectangle.GetMaxAreaFn = GetMaxAreaFn;
|
||||
LargestInteriorRectangle.GetMaxWidthFn = GetMaxWidthFn;
|
||||
LargestInteriorRectangle.GetMaxHeightFn = GetMaxHeightFn;
|
||||
function RangesAdd(ranges, vList) {
|
||||
let adds = [];
|
||||
for (let range of ranges) {
|
||||
let dist = range[1] - range[0];
|
||||
let count = Math.floor(dist / 20);
|
||||
let divDist = Math.floor(dist / count);
|
||||
for (let i = 1; i < count - 1; i++) {
|
||||
let d = Math.floor(range[0] + divDist * i);
|
||||
let index = InsertSortedIndex(vList, d, (a, b) => a - b);
|
||||
if (Math.abs(vList[index] - d) < 5)
|
||||
continue;
|
||||
if (index !== vList.length - 1 && Math.abs(vList[index + 1] - d) < 5)
|
||||
continue;
|
||||
adds.push(d);
|
||||
}
|
||||
}
|
||||
if (adds.length) {
|
||||
arrayPushArray(vList, adds);
|
||||
arraySortByNumber(vList);
|
||||
}
|
||||
}
|
||||
/**
|
||||
* 判断点在多段线内外 这是为了LIR实现的优化算法,返回交点的Y轴列表
|
||||
*/
|
||||
function IsPointInPolygon(polyPts, pt) {
|
||||
// let crossings = 0;
|
||||
// let insLine = new Line(pt, p2);
|
||||
let iPtYs = [];
|
||||
for (let i = 0; i < polyPts.length; i++) {
|
||||
let sp = polyPts[i];
|
||||
let ep = polyPts[FixIndex$1(i + 1, polyPts)];
|
||||
// if (equalv2(sp, pt, 1e-5) || equalv2(ep, pt, 1e-5))//在起点或者终点
|
||||
// return false;
|
||||
//点位于线上面
|
||||
if (pt.y > Math.max(sp.y, ep.y))
|
||||
continue;
|
||||
//线垂直Y轴
|
||||
let derX = ep.x - sp.x;
|
||||
if (equaln$1(derX, 0, 5e-6)) {
|
||||
// if (equaln(pt.x, ep.x, 1e-5)
|
||||
// && (pt.y > Math.min(sp.y, ep.y) - 1e-5 && pt.y < Math.max(sp.y, ep.y) + 1e-5))
|
||||
// return false;//点在线上
|
||||
continue;
|
||||
}
|
||||
//起点
|
||||
if (equaln$1(sp.x, pt.x, 5e-6)) {
|
||||
// if (sp.y > pt.y && derX < 0)
|
||||
if (derX < 0) {
|
||||
// crossings++;
|
||||
iPtYs.push(sp.y);
|
||||
}
|
||||
continue;
|
||||
}
|
||||
//终点
|
||||
if (equaln$1(ep.x, pt.x, 5e-6)) {
|
||||
// if (ep.y > pt.y && derX > 0)
|
||||
if (derX > 0) {
|
||||
// crossings++;
|
||||
iPtYs.push(ep.y);
|
||||
}
|
||||
continue;
|
||||
}
|
||||
//快速求交,只验证有没有交点
|
||||
let [x1, x2] = sp.x > ep.x ? [ep.x, sp.x] : [sp.x, ep.x];
|
||||
if (pt.x > x1 && pt.x < x2) {
|
||||
let derY = ep.y - sp.y;
|
||||
let k = derY / derX;
|
||||
let iptY = (pt.x - sp.x) * k + sp.y;
|
||||
// if (equaln(iptY, pt.y, 1e-5))//点在线上 返回false
|
||||
// return false;
|
||||
if (iptY > pt.y) {
|
||||
// crossings++;
|
||||
iPtYs.push(iptY);
|
||||
}
|
||||
}
|
||||
}
|
||||
return iPtYs;
|
||||
}
|
||||
|
||||
/** 内外接多边形 */
|
||||
function Circle2Points(circle, knifRadius, splitSize = 10, outside = false) {
|
||||
let radius = circle.Radius;
|
||||
@ -23050,6 +23542,7 @@ class CurveWrap {
|
||||
this.IsOutside = IsOutside;
|
||||
this.Used = false;
|
||||
this.Holes = [];
|
||||
this._OrgCurve = Curve;
|
||||
this.BoundingBox = Curve.BoundingBox;
|
||||
if (Curve instanceof exports.Polyline) {
|
||||
let pts = Polyline2Points(Curve, IsOutside, 0)[1];
|
||||
@ -23129,6 +23622,7 @@ exports.Curves2Points = Curves2Points;
|
||||
exports.FeedingToolPath = FeedingToolPath;
|
||||
exports.IsPtsAllOutOrOnReg = IsPtsAllOutOrOnReg;
|
||||
exports.IsRect = IsRect;
|
||||
exports.LargestInteriorRectangle = LargestInteriorRectangle;
|
||||
exports.ParseRegionTextPos = ParseRegionTextPos;
|
||||
exports.PointsSimplify2PolylineAndParseArc = PointsSimplify2PolylineAndParseArc;
|
||||
exports.Polyline2Points = Polyline2Points;
|
||||
|
File diff suppressed because one or more lines are too long
601
api.esm.js
601
api.esm.js
@ -1012,17 +1012,17 @@ let HistorycRecord = class HistorycRecord {
|
||||
//对象应该实现dataIn和DataOut的方法,为了对象的序列化和反序列化
|
||||
//对象从文件中读取数据,初始化自身
|
||||
ReadFile(file) {
|
||||
file.Read();
|
||||
let ver = file.Read();
|
||||
this.undoData = file.ReadObject();
|
||||
this.redoData = file.ReadObject();
|
||||
this.userData = file.ReadObject();
|
||||
if (ver === 1)
|
||||
file.ReadObject();
|
||||
}
|
||||
//对象将自身数据写入到文件.
|
||||
WriteFile(file) {
|
||||
file.Write(1);
|
||||
file.Write(2);
|
||||
file.WriteObject(this.undoData);
|
||||
file.WriteObject(this.redoData);
|
||||
file.WriteObject(this.userData);
|
||||
}
|
||||
};
|
||||
HistorycRecord = __decorate([
|
||||
@ -2771,8 +2771,8 @@ function arrayLast(arr) {
|
||||
* @param {Array<T>} arr
|
||||
* @returns {Array<T>} 返回自身
|
||||
*/
|
||||
function arraySortByNumber(arr) {
|
||||
arr.sort(sortNumberCompart);
|
||||
function arraySortByNumber$1(arr) {
|
||||
arr.sort(sortNumberCompart$1);
|
||||
return arr;
|
||||
}
|
||||
/**
|
||||
@ -2790,7 +2790,7 @@ function arrayRemoveDuplicateBySort(arr, checkFuction = checkEqual) {
|
||||
arr.length = j;
|
||||
return arr;
|
||||
}
|
||||
function sortNumberCompart(e1, e2) {
|
||||
function sortNumberCompart$1(e1, e2) {
|
||||
return e1 - e2;
|
||||
}
|
||||
function checkEqual(e1, e2) {
|
||||
@ -2819,7 +2819,7 @@ function arrayClone(arr) {
|
||||
return arr.slice();
|
||||
}
|
||||
//https://jsperf.com/merge-array-implementations/30
|
||||
function arrayPushArray(arr1, arr2) {
|
||||
function arrayPushArray$1(arr1, arr2) {
|
||||
let arr1Length = arr1.length;
|
||||
let arr2Length = arr2.length;
|
||||
arr1.length = arr1Length + arr2Length;
|
||||
@ -3539,7 +3539,7 @@ let Curve = class Curve extends Entity {
|
||||
if (param.length === 0)
|
||||
return [];
|
||||
param.push(0, this.EndParam);
|
||||
arraySortByNumber(param);
|
||||
arraySortByNumber$1(param);
|
||||
arrayRemoveDuplicateBySort(param, (e1, e2) => equaln$1(e1, e2, 1e-7));
|
||||
return param;
|
||||
}
|
||||
@ -4882,7 +4882,7 @@ function SplitCurveParams(cu) {
|
||||
if (arc.ParamOnCurve(param))
|
||||
params.push(param);
|
||||
}
|
||||
arraySortByNumber(params);
|
||||
arraySortByNumber$1(params);
|
||||
if (params.length === 0)
|
||||
continue;
|
||||
for (let p of params) {
|
||||
@ -5011,6 +5011,14 @@ function CreatePolylinePath(pts, buls) {
|
||||
功能:判断线段是否存在交点
|
||||
ref:https://www.geeksforgeeks.org/check-if-two-given-line-segments-intersect/
|
||||
*/
|
||||
// Given three colinear points p, q, r, the function checks if
|
||||
// point q lies on line segment 'pr'
|
||||
function onSegment(p, q, r) {
|
||||
if (q.x <= Math.max(p.x, r.x) && q.x >= Math.min(p.x, r.x) &&
|
||||
q.y <= Math.max(p.y, r.y) && q.y >= Math.min(p.y, r.y))
|
||||
return true;
|
||||
return false;
|
||||
}
|
||||
// To find orientation of ordered triplet (p, q, r).
|
||||
// The function returns following values
|
||||
// 0 --> p, q and r are colinear
|
||||
@ -5025,6 +5033,34 @@ function orientation(p, q, r) {
|
||||
return 0; // colinear
|
||||
return (val > 0) ? 1 : 2; // clock or counterclock wise
|
||||
}
|
||||
/**
|
||||
* 判断线段`p1q1`和线段`p2q2`是否相交.
|
||||
*/
|
||||
function doIntersect(p1, q1, p2, q2) {
|
||||
// Find the four orientations needed for general and
|
||||
// special cases
|
||||
let o1 = orientation(p1, q1, p2);
|
||||
let o2 = orientation(p1, q1, q2);
|
||||
let o3 = orientation(p2, q2, p1);
|
||||
let o4 = orientation(p2, q2, q1);
|
||||
// General case
|
||||
if (o1 !== o2 && o3 !== o4)
|
||||
return true;
|
||||
// Special Cases
|
||||
// p1, q1 and p2 are colinear and p2 lies on segment p1q1
|
||||
if (o1 === 0 && onSegment(p1, p2, q1))
|
||||
return true;
|
||||
// p1, q1 and q2 are colinear and q2 lies on segment p1q1
|
||||
if (o2 === 0 && onSegment(p1, q2, q1))
|
||||
return true;
|
||||
// p2, q2 and p1 are colinear and p1 lies on segment p2q2
|
||||
if (o3 === 0 && onSegment(p2, p1, q2))
|
||||
return true;
|
||||
// p2, q2 and q1 are colinear and q1 lies on segment p2q2
|
||||
if (o4 === 0 && onSegment(p2, q1, q2))
|
||||
return true;
|
||||
return false; // Doesn't fall in any of the above cases
|
||||
}
|
||||
|
||||
function SplineConver2Polyline(spl, tolerance = 0.1) {
|
||||
let cu = spl.Shape;
|
||||
@ -5567,7 +5603,7 @@ class CurveIntersection {
|
||||
arr = [];
|
||||
this.intersect2.set(curve, arr);
|
||||
}
|
||||
arrayPushArray(arr, params);
|
||||
arrayPushArray$1(arr, params);
|
||||
}
|
||||
GenBox(cus) {
|
||||
for (let c of cus)
|
||||
@ -5980,7 +6016,7 @@ function CreateContours(curves, fuzz = 1e-4) {
|
||||
if (cu instanceof Circle)
|
||||
contours.push(Contour.CreateContour(cu.Clone())); //避免将原始曲线传递给板,导致撤销这个圆失败
|
||||
else if (cu instanceof Polyline)
|
||||
arrayPushArray(newCurves, cu.Explode());
|
||||
arrayPushArray$1(newCurves, cu.Explode());
|
||||
else if (cu instanceof Spline) {
|
||||
let pl = cu.Convert2Polyline();
|
||||
if (pl.IsClose)
|
||||
@ -6006,7 +6042,7 @@ function CreateContours(curves, fuzz = 1e-4) {
|
||||
let isClose = cu.IsClose;
|
||||
let ipts = [];
|
||||
for (let [, pts] of pmap) {
|
||||
arrayPushArray(ipts, pts);
|
||||
arrayPushArray$1(ipts, pts);
|
||||
if (!isClose)
|
||||
for (let p of pts) {
|
||||
let d = p.distanceToSquared(ep);
|
||||
@ -6043,11 +6079,11 @@ function CreateContours(curves, fuzz = 1e-4) {
|
||||
let tempCus = [];
|
||||
for (let c of curves) {
|
||||
if (c instanceof Polyline)
|
||||
arrayPushArray(tempCus, c.Explode());
|
||||
arrayPushArray$1(tempCus, c.Explode());
|
||||
else
|
||||
tempCus.push(c);
|
||||
}
|
||||
arrayPushArray(curves2, tempCus);
|
||||
arrayPushArray$1(curves2, tempCus);
|
||||
}
|
||||
let parse = new RegionParse(curves2);
|
||||
for (let rs of parse.RegionsOutline) {
|
||||
@ -11979,12 +12015,6 @@ function CyHoleInBoard(cys, br, ocs, checkAll = false) {
|
||||
}
|
||||
return true;
|
||||
}
|
||||
const TempRectHoleOption = {
|
||||
up: "",
|
||||
down: "",
|
||||
left: "",
|
||||
right: "",
|
||||
};
|
||||
/**分析上下左右排钻 */
|
||||
function ParseBoardRectHoleType(br, outBrRectHoleType = {}) {
|
||||
let dir = Math.sign(br.ContourCurve.Area2);
|
||||
@ -12815,7 +12845,7 @@ const DefaultClosingStripOption = {
|
||||
};
|
||||
Object.freeze(DefaultClosingStripOption);
|
||||
const DefaultBoardFindOption = {
|
||||
version: 7,
|
||||
version: 8,
|
||||
condition: {
|
||||
layer: false,
|
||||
height: false,
|
||||
@ -12839,6 +12869,7 @@ const DefaultBoardFindOption = {
|
||||
useKeyWord: false,
|
||||
addRemarks: false,
|
||||
composingFace: false,
|
||||
openDir: false,
|
||||
sealedUp: false,
|
||||
sealedDown: false,
|
||||
sealedLeft: false,
|
||||
@ -12866,6 +12897,7 @@ const DefaultBoardFindOption = {
|
||||
bigHoleDir: ECompareType.Equal,
|
||||
drillType: ECompareType.Equal,
|
||||
composingFace: ECompareType.Equal,
|
||||
openDir: ECompareType.Equal,
|
||||
[EBoardKeyList.KnifeRad]: ECompareType.Equal,
|
||||
},
|
||||
tolerance: {
|
||||
@ -12889,6 +12921,8 @@ const DefaultBoardFindOption = {
|
||||
bigHoleDir: FaceDirection.Front,
|
||||
drillType: "",
|
||||
composingFace: ComposingType.Positive,
|
||||
openDir: BoardOpenDir.None,
|
||||
hardwareDoorName: "",
|
||||
sealedUp: "",
|
||||
sealedDown: "",
|
||||
sealedLeft: "",
|
||||
@ -12980,9 +13014,9 @@ const DefaultDoorOption = {
|
||||
lbSealedLeft: 1,
|
||||
lbSealedRight: 1,
|
||||
lbHightDrillOption: { up: "", down: "", left: "", right: "" },
|
||||
deviation: 100,
|
||||
useBoardProcessOption: true,
|
||||
isModifyHardwareMaterial: false,
|
||||
deviation: 100 //偏移量
|
||||
};
|
||||
Object.freeze(DefaultDoorOption);
|
||||
const DefaultHingeOption = {
|
||||
@ -15233,7 +15267,7 @@ class ContourTreeNode {
|
||||
let holes = this.children.map(h => {
|
||||
// TestDraw(h.contour.Curve, depth + 1);
|
||||
let pts = h.contour.Curve.GetStretchPoints();
|
||||
arrayPushArray(vertices, pts);
|
||||
arrayPushArray$1(vertices, pts);
|
||||
return pts;
|
||||
});
|
||||
let faces = ShapeUtils.triangulateShape(pts, holes);
|
||||
@ -15510,7 +15544,7 @@ class CurveTape {
|
||||
let xparams = SplitCurveParams(this.contour.Curve);
|
||||
if (this.splitParams.length > 0) {
|
||||
xparams.push(...this.splitParams);
|
||||
arraySortByNumber(xparams);
|
||||
arraySortByNumber$1(xparams);
|
||||
arrayRemoveDuplicateBySort(xparams, (p1, p2) => equaln$1(p1, p2));
|
||||
}
|
||||
let polylines = [];
|
||||
@ -15887,7 +15921,7 @@ function SubtractRange(orgStart, orgEnd, clipStart, clipEnd, end) {
|
||||
let arr = SubtractRange(orgStart, orgEnd, clipStart, end, end);
|
||||
let rem = [];
|
||||
for (let s of arr)
|
||||
arrayPushArray(rem, SubtractRange(s[0], s[1], 0, clipEnd, end));
|
||||
arrayPushArray$1(rem, SubtractRange(s[0], s[1], 0, clipEnd, end));
|
||||
return rem;
|
||||
}
|
||||
if (clipStart >= orgEnd || clipEnd <= orgStart)
|
||||
@ -15910,7 +15944,7 @@ function SubtractRanges(ranges, subRanges, end) {
|
||||
for (let sr of subRanges) {
|
||||
let temps = [];
|
||||
for (let r of rets)
|
||||
arrayPushArray(temps, SubtractRange2(r, sr, end));
|
||||
arrayPushArray$1(temps, SubtractRange2(r, sr, end));
|
||||
rets = temps;
|
||||
}
|
||||
return rets;
|
||||
@ -16068,7 +16102,7 @@ function GetIntersection(cu1, cu2) {
|
||||
else
|
||||
m = new Map();
|
||||
intCache.set(cu1, m);
|
||||
let r = cu1.IntersectWith2(cu2, IntersectOption.ExtendNone);
|
||||
let r = cu1.IntersectWith2(cu2, IntersectOption.ExtendNone, 1e-4);
|
||||
let cu1EndParam = cu1.EndParam;
|
||||
let cu2EndParam = cu2.EndParam;
|
||||
for (let d of r) {
|
||||
@ -16573,7 +16607,7 @@ let ExtrudeSolid = ExtrudeSolid_1 = class ExtrudeSolid extends Entity {
|
||||
let isEqualNorm = equalv3(n, tn);
|
||||
let targetZMin = target.Position.applyMatrix4(this.OCSInv).z;
|
||||
let targetZMax = targetZMin + target.Thickness * (isEqualNorm ? 1 : -1);
|
||||
[targetZMin, targetZMax] = arraySortByNumber([targetZMin, targetZMax]);
|
||||
[targetZMin, targetZMax] = arraySortByNumber$1([targetZMin, targetZMax]);
|
||||
const MergeRelevance = () => {
|
||||
if (!this.Id || !target.Id)
|
||||
return;
|
||||
@ -16766,7 +16800,7 @@ let ExtrudeSolid = ExtrudeSolid_1 = class ExtrudeSolid extends Entity {
|
||||
this.Position = this.Position.add(vec);
|
||||
return;
|
||||
}
|
||||
arraySortByNumber(indexList);
|
||||
arraySortByNumber$1(indexList);
|
||||
let updateBak = this.AutoUpdate;
|
||||
this.AutoUpdate = false;
|
||||
if (this.grooves.length === 0) {
|
||||
@ -17301,6 +17335,9 @@ let ExtrudeSolid = ExtrudeSolid_1 = class ExtrudeSolid extends Entity {
|
||||
this._MeshGeometry["IsMesh"] = true;
|
||||
this._EdgeGeometry = BufferGeometryUtils.MergeBufferGeometries(edges);
|
||||
}
|
||||
//因为这里更新了mesh geom 所以我们必须更新它.
|
||||
this._MeshGeometry = this.UpdateMeshGeom(this._MeshGeometry);
|
||||
this._MeshGeometry["IsMesh"] = true;
|
||||
//我们加入一些拓展信息,以便排钻能够使用(或者其他的,比如发送到效果图?,BBS)(布局视口会直接添加实体到场景,所以我们只在这里设置OriginEntity)
|
||||
for (let i = 0; i < this.__CacheSplitExtrudes.length; i++) {
|
||||
this.__CacheSplitExtrudes[i].objectId = new ObjectId(this.Id.Index * -100 - i);
|
||||
@ -17386,12 +17423,8 @@ let ExtrudeSolid = ExtrudeSolid_1 = class ExtrudeSolid extends Entity {
|
||||
if (this.thickness <= 0)
|
||||
return new BufferGeometry();
|
||||
this.CalcRelevanceGroove();
|
||||
if (this._MeshGeometry) {
|
||||
//修复二维刀路更新(在有关联切割的情况下)
|
||||
this._MeshGeometry = this.UpdateMeshGeom(this._MeshGeometry);
|
||||
this._MeshGeometry["IsMesh"] = true;
|
||||
if (this._MeshGeometry)
|
||||
return this._MeshGeometry;
|
||||
}
|
||||
this._EdgeGeometry = undefined; //清理掉(以便在被csg切割后得到edgegeom)
|
||||
let grooves = this.Grooves;
|
||||
if (grooves.every(g => equaln$1(g.thickness, this.thickness)) || grooves.length === 0) {
|
||||
@ -17454,15 +17487,7 @@ let ExtrudeSolid = ExtrudeSolid_1 = class ExtrudeSolid extends Entity {
|
||||
get EdgeGeometry() {
|
||||
if (this._EdgeGeometry)
|
||||
return this._EdgeGeometry;
|
||||
let oldMeshGeom = this._MeshGeometry;
|
||||
{
|
||||
this.CalcRelevanceGroove();
|
||||
//修复二维刀路更新(在有关联切割的情况下)
|
||||
if (this._MeshGeometry && this._MeshGeometry !== oldMeshGeom) {
|
||||
this._MeshGeometry = this.UpdateMeshGeom(this._MeshGeometry);
|
||||
this._MeshGeometry["IsMesh"] = true;
|
||||
}
|
||||
}
|
||||
this.CalcRelevanceGroove();
|
||||
if (this._EdgeGeometry)
|
||||
return this._EdgeGeometry;
|
||||
//这里我们超过100就用这个,为了性能 和MaxDrawGrooveCount不一致
|
||||
@ -17810,7 +17835,7 @@ let CompositeEntity = CompositeEntity_1 = class CompositeEntity extends Entity {
|
||||
GetObjectSnapPoints(snapMode, pickPoint, lastPoint, viewXform) {
|
||||
let pts = [];
|
||||
for (let e of this.Entitys)
|
||||
arrayPushArray(pts, e.Clone().ApplyMatrix(this.OCSNoClone).GetObjectSnapPoints(snapMode, pickPoint, lastPoint, viewXform));
|
||||
arrayPushArray$1(pts, e.Clone().ApplyMatrix(this.OCSNoClone).GetObjectSnapPoints(snapMode, pickPoint, lastPoint, viewXform));
|
||||
return pts;
|
||||
}
|
||||
GetGripPoints() {
|
||||
@ -17856,7 +17881,7 @@ let CompositeEntity = CompositeEntity_1 = class CompositeEntity extends Entity {
|
||||
return;
|
||||
}
|
||||
vec = vec.clone().applyMatrix4(this.OCSInv.setPosition(0, 0, 0));
|
||||
arraySortByNumber(indexList);
|
||||
arraySortByNumber$1(indexList);
|
||||
let i = 0;
|
||||
let j = 0;
|
||||
let icount = indexList.length;
|
||||
@ -19936,8 +19961,8 @@ let Board = Board_1 = class Board extends ExtrudeSolid {
|
||||
* 异形->矩形
|
||||
*/
|
||||
//上下左右排钻属性(在矩形时生效)
|
||||
TempRectHoleOption.up = undefined;
|
||||
ParseBoardRectHoleType(this, TempRectHoleOption); //分析旧的上下左右排钻
|
||||
let rectHoleOpt = {};
|
||||
ParseBoardRectHoleType(this, rectHoleOpt); //分析旧的上下左右排钻
|
||||
let oldHightSealCurves = GetBoardSealingCurves(this); //旧的封边轮廓
|
||||
let oldHightSealDatas = GetBoardHighSeal(this, oldHightSealCurves); //旧的封边数据
|
||||
let oldContour = this.ContourCurve; //旧的轮廓
|
||||
@ -19952,8 +19977,8 @@ let Board = Board_1 = class Board extends ExtrudeSolid {
|
||||
defaultDrillType = HostApplicationServices.DrillConfigs.size ? HostApplicationServices.DrillConfigs.entries().next().value[0] : DrillType.None;
|
||||
super.ContourCurve = newContour; //设置新的轮廓
|
||||
//保持排钻边属性
|
||||
if (this.isRect && TempRectHoleOption.up) //矩形->矩形
|
||||
SetBrHighHoleTypeFromRectHoleType(this, TempRectHoleOption); //直接应用旧的矩形数据
|
||||
if (this.isRect && rectHoleOpt.up) //矩形->矩形
|
||||
SetBrHighHoleTypeFromRectHoleType(this, rectHoleOpt); //直接应用旧的矩形数据
|
||||
else //异形->矩形 矩形->异形 异形->异形
|
||||
{
|
||||
let indexMap = [];
|
||||
@ -20501,7 +20526,7 @@ let Board = Board_1 = class Board extends ExtrudeSolid {
|
||||
super.MoveStretchPoints(originIndexList, vec);
|
||||
if (!this.Id)
|
||||
return;
|
||||
arraySortByNumber(mIndexList);
|
||||
arraySortByNumber$1(mIndexList);
|
||||
let ocsInv = this.OCSInv;
|
||||
let localVec = TransformVector(vec.clone(), ocsInv);
|
||||
let offset = 0;
|
||||
@ -20857,7 +20882,7 @@ function FastWireframe2(dr, color = 0) {
|
||||
function GenerateExtrudeEdgeGeometry(contourPoints, height) {
|
||||
let pts = [];
|
||||
for (let cs of contourPoints)
|
||||
arrayPushArray(pts, GenerateExtrudeEdgeGeometryPoints(cs, height));
|
||||
arrayPushArray$1(pts, GenerateExtrudeEdgeGeometryPoints(cs, height));
|
||||
let geo = new BufferGeometry().setFromPoints(pts);
|
||||
return geo;
|
||||
}
|
||||
@ -21042,7 +21067,7 @@ let ExtrudeHole = class ExtrudeHole extends Hole {
|
||||
this.Position = this.Position.add(vec);
|
||||
return;
|
||||
}
|
||||
arraySortByNumber(indexList);
|
||||
arraySortByNumber$1(indexList);
|
||||
this.MoveGripOrStretchPointsOnly(indexList, vec, dragType);
|
||||
this.CheckContourCurve();
|
||||
this.Update();
|
||||
@ -22865,6 +22890,473 @@ function ParseRegionTextPos(contour, holes) {
|
||||
return p;
|
||||
}
|
||||
|
||||
//返回可以插入的位置
|
||||
function InsertSortedIndex(array, element, comparefunc) {
|
||||
let leftbound = 0;
|
||||
let rightbound = array.length;
|
||||
while (rightbound > leftbound) {
|
||||
let testindex = Math.floor((leftbound + rightbound) / 2);
|
||||
let testelement = array[testindex];
|
||||
let compareresult = comparefunc(element, testelement);
|
||||
if (compareresult > 0) // element > testelement
|
||||
leftbound = testindex + 1;
|
||||
else if (compareresult === 0) //因为函数 FindBestRange 会取index-1 来取范围
|
||||
leftbound = testindex + 1;
|
||||
else
|
||||
rightbound = testindex;
|
||||
}
|
||||
return leftbound;
|
||||
}
|
||||
//范围并集
|
||||
function RangeUnion(ranges) {
|
||||
arrayRemoveDuplicateBySort(ranges, (r1, r2) => {
|
||||
if (r1[1] >= r2[1])
|
||||
return true;
|
||||
if (r1[1] >= r2[0]) {
|
||||
r1[1] = r2[1];
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
});
|
||||
return ranges;
|
||||
}
|
||||
|
||||
const LEFT = 1, RIGHT = 2, DOWN = 4, TOP = 8;
|
||||
// Compute the bit code for a point (x, y) using the clip rectangle
|
||||
// bounded diagonally by (xmin, ymin), and (xmax, ymax)
|
||||
// ASSUME THAT xmax, xmin, ymax and ymin are global constants.
|
||||
function ComputeOutCode(x, y, box) {
|
||||
let code = 0;
|
||||
if (x < box.min.x) // to the left of clip window
|
||||
code |= LEFT;
|
||||
else if (x > box.max.x) // to the right of clip window
|
||||
code |= RIGHT;
|
||||
if (y < box.min.y) // below the clip window
|
||||
code |= DOWN;
|
||||
else if (y > box.max.y) // above the clip window
|
||||
code |= TOP;
|
||||
return code;
|
||||
}
|
||||
/**
|
||||
* 盒子相交测试,快速判断盒子和直线或者圆是否有相交
|
||||
*/
|
||||
class BoxCheckIntersect {
|
||||
constructor(box) {
|
||||
this.p1 = box.min;
|
||||
this.p3 = box.max;
|
||||
this.p2 = new Vector2$1(this.p3.x, this.p1.y);
|
||||
this.p4 = new Vector2$1(this.p1.x, this.p3.y);
|
||||
this.box = box;
|
||||
}
|
||||
//直线与盒子相交,或者被盒子包含. Cohen–Sutherland裁剪算法
|
||||
IsIntersectLine(p1, p2) {
|
||||
let code1 = ComputeOutCode(p1.x, p1.y, this.box);
|
||||
let code2 = ComputeOutCode(p2.x, p2.y, this.box);
|
||||
//按位AND不为0:两个点共享一个外部区域(LEFT,RIGHT,TOP或BOTTOM),因此两个点都必须在窗口外部
|
||||
if (code1 & code2)
|
||||
return false;
|
||||
let code = code1 | code2;
|
||||
if (code1 === 0 || code2 === 0 || code === 3 || code === 12) //点1点2在矩形内,或者竖直贯穿,水平贯穿
|
||||
return true;
|
||||
if ((code & TOP) && doIntersect(p1, p2, this.p3, this.p4))
|
||||
return true;
|
||||
if ((code & LEFT) && doIntersect(p1, p2, this.p1, this.p4))
|
||||
return true;
|
||||
if ((code & RIGHT) && doIntersect(p1, p2, this.p2, this.p3))
|
||||
return true;
|
||||
if ((code & DOWN) && doIntersect(p1, p2, this.p3, this.p1))
|
||||
return true;
|
||||
return false;
|
||||
}
|
||||
//ref https://yal.cc/rectangle-circle-intersection-test/
|
||||
IsIntersectCircle(cen, radius) {
|
||||
let nearestX = MathUtils.clamp(cen.x, this.box.min.x, this.box.max.x);
|
||||
let nearestY = MathUtils.clamp(cen.y, this.box.min.y, this.box.max.y);
|
||||
return ((nearestX - cen.x) ** 2 + (nearestY - cen.y) ** 2) <= radius ** 2;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 删除数组中指定的元素,返回数组本身
|
||||
* @param {Array<any>} arr 需要操作的数组
|
||||
* @param {*} el 需要移除的元素
|
||||
*/
|
||||
/**
|
||||
* 根据数值从小到大排序数组
|
||||
* @param {Array<T>} arr
|
||||
* @returns {Array<T>} 返回自身
|
||||
*/
|
||||
function arraySortByNumber(arr) {
|
||||
arr.sort(sortNumberCompart);
|
||||
return arr;
|
||||
}
|
||||
function sortNumberCompart(e1, e2) {
|
||||
return e1 - e2;
|
||||
}
|
||||
//https://jsperf.com/merge-array-implementations/30
|
||||
function arrayPushArray(arr1, arr2) {
|
||||
let arr1Length = arr1.length;
|
||||
let arr2Length = arr2.length;
|
||||
arr1.length = arr1Length + arr2Length;
|
||||
for (let i = 0; i < arr2Length; i++)
|
||||
arr1[arr1Length + i] = arr2[i];
|
||||
return arr1;
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取面积最大的矩形
|
||||
* @param rects
|
||||
* @returns
|
||||
*/
|
||||
function GetMaxAreaFn(rects) {
|
||||
return Max(rects, (t1, t2) => t2[0] > t1[0]);
|
||||
}
|
||||
function GetMaxWidthFn(rects) {
|
||||
return Max(rects, (t1, t2) => t2[1] > t1[1]);
|
||||
}
|
||||
function GetMaxHeightFn(rects) {
|
||||
return Max(rects, (t1, t2) => t2[2] > t1[2]);
|
||||
}
|
||||
//最大内接矩形
|
||||
//1.分析盒子
|
||||
// 1.默认我们使用顶点坐标进行一维展开
|
||||
// 2.当存在斜线时, 我们精确展开(当跨度大于(100/50)时,我们精确产开另一条轴)
|
||||
// (1).获取需要精确展开的区间 随后合并区间
|
||||
// (2).对区间进行展开数值,使用二分搜索,如果在已有的顶点附近,则不进行增项
|
||||
//2.标记轮廓内的矩形
|
||||
// (1).我们收集多边形所有的斜线,与矩形盒子求交,如果相交,则矩形盒子无效化
|
||||
// (2).矩形终点在轮廓内(使用单条射线检测,因为我们始终在端点增加锚点的关系 我们似乎不会在顶点位置得到(交点? 稳妥起见 实现标准的射线检测算法)
|
||||
//3.获取最大内接矩形
|
||||
// 迭代开始
|
||||
// 动态规划 存储每个方块得到的最大矩形
|
||||
// 获取最大的(根据规则)
|
||||
// 对池子里的结果进行生存选择(如果被占用了方块,则该结果已经不可用)
|
||||
// 取剩下可用的最大的(因为我们已经是在合理的情况下拿最大的了,所以不需要在重新迭代)
|
||||
// 重复迭代
|
||||
/**
|
||||
* @example
|
||||
*
|
||||
* //1. 设置过滤条件(舍弃掉一些无用的矩形)
|
||||
* let lir = new LargestInteriorRectangle;
|
||||
* lir.MinWidth = 200;//设置最小可以接受的矩形宽度
|
||||
* lir.MinHeight = 200;//设置最小可以接受的矩形宽度
|
||||
* lir.MinArea = 200 * 200;//设置最小可以接受的矩形面积
|
||||
*
|
||||
* //除了变量 也可以设置过滤函数
|
||||
* //例如:
|
||||
* lir.FilterRectFn = !(w,h)=> (w>500 || h>500) //这样将对长或者宽不足500的矩形板过滤(舍弃)
|
||||
*
|
||||
* //2. 可以设置优先模式,默认提供了面积优先,你也可以使用宽度优先或者高度优先,或许默认规则可能不好用,可以自定义传入自定义函数.
|
||||
* lir.GetMaxRectIndexFn = LargestInteriorRectangle.GetMaxAreaFn; //或者 LargestInteriorRectangle.GetMaxWidthFn / LargestInteriorRectangle.GetMaxHeightFn
|
||||
*
|
||||
* //3. 你已经设置好解析器,你现在可以进行解析了
|
||||
* let rects = lir.ParseLir([ new Vector3(0,0,0) , new Vector3(100,0,0) , new Vector3(50,100,0)]) //首尾不需要重复,首尾重复可能造成错误,程序不再校验
|
||||
*
|
||||
*/
|
||||
class LargestInteriorRectangle {
|
||||
constructor() {
|
||||
this.MinWidth = 100;
|
||||
this.MinHeight = 100;
|
||||
this.MinArea = 200 * 200;
|
||||
this.GetMaxRectIndexFn = GetMaxAreaFn;
|
||||
}
|
||||
/**
|
||||
* 分析最大内接矩形
|
||||
* @param polygonPts 多边形点表,首尾不要相等
|
||||
*/
|
||||
ParseLIR(polygonPts) {
|
||||
//端点列表
|
||||
let xs = [];
|
||||
let ys = [];
|
||||
let xset = new Set();
|
||||
let yset = new Set();
|
||||
//需要展开的范围
|
||||
let xranges = [];
|
||||
let yranges = [];
|
||||
let polygonBox = new Box2$1().setFromPoints(polygonPts);
|
||||
let vec = new Vector2$1;
|
||||
let klines = []; //所有的斜线
|
||||
// let linesP: [Vector2, Vector2][] = []; //所有的线点
|
||||
// let linesFb = new Flatbush(pts.length);//所有的线的索引
|
||||
let fuzzX = new FuzzyFactory(1, 0.1);
|
||||
let fuzzY = new FuzzyFactory(1, 0.1);
|
||||
for (let i = 0; i < polygonPts.length; i++) {
|
||||
let p = polygonPts[i];
|
||||
let p2 = polygonPts[FixIndex$1(i + 1, polygonPts)];
|
||||
// linesP.push([p, p2]);
|
||||
// let box = new Box2().setFromPoints([p, p2]);
|
||||
// linesFb.add(box.min.x, box.min.y, box.max.x, box.max.y);
|
||||
vec.subVectors(p2, p);
|
||||
//收集端点
|
||||
let x = fuzzX.lookupOrCreate([p.x], p.x);
|
||||
if (!xset.has(x)) {
|
||||
xs.push(x);
|
||||
xset.add(x);
|
||||
}
|
||||
let y = fuzzY.lookupOrCreate([p.y], p.y);
|
||||
if (!yset.has(y)) {
|
||||
ys.push(y);
|
||||
yset.add(y);
|
||||
}
|
||||
//展开斜线 每20分段
|
||||
if (Math.abs(vec.x) > 20 && Math.abs(vec.y) > 20) {
|
||||
if (Math.abs(vec.x) > 20)
|
||||
yranges.push(vec.y > 0 ? [p.y, p2.y] : [p2.y, p.y]);
|
||||
if (Math.abs(vec.y) > 20)
|
||||
xranges.push(vec.x > 0 ? [p.x, p2.x] : [p2.x, p.x]);
|
||||
}
|
||||
//收集所有的斜线
|
||||
if (!equaln$1(vec.x, 0, 0.1) && !equaln$1(vec.y, 0, 0.1))
|
||||
klines.push([p, p2]);
|
||||
}
|
||||
// linesFb.finish();
|
||||
//合并展开区间
|
||||
xranges.sort((a, b) => a[0] - b[0]);
|
||||
yranges.sort((a, b) => a[0] - b[0]);
|
||||
xranges = RangeUnion(xranges);
|
||||
yranges = RangeUnion(yranges);
|
||||
arraySortByNumber(xs);
|
||||
arraySortByNumber(ys);
|
||||
//展开
|
||||
RangesAdd(xranges, xs);
|
||||
RangesAdd(yranges, ys);
|
||||
//最大化
|
||||
xs[0] = polygonBox.min.x;
|
||||
xs[xs.length - 1] = polygonBox.max.x;
|
||||
ys[0] = polygonBox.min.y;
|
||||
ys[ys.length - 1] = polygonBox.max.y;
|
||||
//所有网格的索引
|
||||
let gridFb = new Flatbush((xs.length - 1) * (ys.length - 1));
|
||||
// let pls: Polyline[] = [];
|
||||
for (let i = 0; i < xs.length - 1; i++) {
|
||||
for (let j = 0; j < ys.length - 1; j++) {
|
||||
gridFb.add(xs[i], ys[j], xs[i + 1], ys[j + 1]);
|
||||
// let pl = new Polyline().RectangleFrom2Pt(new Vector3(xs[i], ys[j]), new Vector3(xs[i + 1], ys[j + 1]));
|
||||
// if (false) TestDraw(pl);
|
||||
// pls.push(pl);
|
||||
}
|
||||
}
|
||||
gridFb.finish();
|
||||
const matrix = new Array(xs.length - 1).fill(1).map(() => new Array(ys.length - 1).fill(1));
|
||||
//矩形与斜线相交
|
||||
let checks = [];
|
||||
for (let line of klines) {
|
||||
let box = new Box2$1().setFromPoints(line);
|
||||
let ids = gridFb.search(box.min.x, box.min.y, box.max.x, box.max.y);
|
||||
for (let id of ids) {
|
||||
let check = checks[id];
|
||||
let i = Math.floor((id) / (ys.length - 1));
|
||||
let j = id - (i * (ys.length - 1));
|
||||
if (!check) {
|
||||
check = new BoxCheckIntersect(new Box2$1(new Vector2$1(xs[i] + 0.01, ys[j] + 0.01), new Vector2$1(xs[i + 1] - 0.01, ys[j + 1] - 0.01)));
|
||||
checks[id] = check;
|
||||
// let pl = new Polyline().RectangleFrom2Pt(new Vector3(xs[i], ys[j]), new Vector3(xs[i + 1], ys[j + 1]));
|
||||
// TestDraw(pl, 2);
|
||||
}
|
||||
if (check.IsIntersectLine(line[0], line[1])) {
|
||||
// pls[id].ColorIndex = 1;
|
||||
// pls[id].Erase();
|
||||
matrix[i][j] = 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
//y轴扫描线(矩形在多边形外)
|
||||
// if (xs.length < ys.length)
|
||||
{
|
||||
for (let i = 0; i < xs.length - 1; i++) {
|
||||
let x = (xs[i + 1] + xs[i]) * 0.5;
|
||||
let iPtYs = IsPointInPolygon(polygonPts, new Vector3(x, polygonBox.min.y - 0.1, 0));
|
||||
arraySortByNumber(iPtYs);
|
||||
for (let j = 0; j < ys.length - 1; j++) {
|
||||
let y = (ys[j + 1] + ys[j]) * 0.5;
|
||||
while (iPtYs.length && iPtYs[0] < y)
|
||||
iPtYs.shift();
|
||||
if (iPtYs.length % 2 !== 1) {
|
||||
// pls[i * (ys.length - 1) + j].ColorIndex = 3;
|
||||
// pls[i * (ys.length - 1) + j].Erase();
|
||||
matrix[i][j] = 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
// else//x轴扫描线
|
||||
//ref https://leetcode.cn/problems/maximal-rectangle/solutions/535672/zui-da-ju-xing-by-leetcode-solution-bjlu/
|
||||
const maximalRectangle = () => {
|
||||
const m = matrix.length; //m个竖条 xlist
|
||||
if (m === 0)
|
||||
return 0;
|
||||
const n = matrix[0].length; //n个横条 ylist
|
||||
if (n === 0)
|
||||
return;
|
||||
const left = new Array(m).fill(0).map(() => new Array(n).fill(0));
|
||||
for (let i = 0; i < m; i++) {
|
||||
for (let j = 0; j < n; j++) {
|
||||
if (matrix[i][j]) {
|
||||
left[i][j] = (j === 0 ? 0 : left[i][j - 1]) + 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
//area maxXIndex maxYIndex xcount ycount
|
||||
let rects = [];
|
||||
for (let j = 0; j < n; j++) // 对于每一列,使用基于柱状图的方法
|
||||
{
|
||||
const up = new Array(m).fill(0);
|
||||
const down = new Array(m).fill(0);
|
||||
let stack = [];
|
||||
for (let i = 0; i < m; i++) {
|
||||
while (stack.length && left[stack[stack.length - 1]][j] >= left[i][j]) {
|
||||
stack.pop();
|
||||
}
|
||||
up[i] = stack.length === 0 ? -1 : stack[stack.length - 1];
|
||||
stack.push(i);
|
||||
}
|
||||
stack = [];
|
||||
for (let i = m - 1; i >= 0; i--) {
|
||||
while (stack.length && left[stack[stack.length - 1]][j] >= left[i][j]) {
|
||||
stack.pop();
|
||||
}
|
||||
down[i] = stack.length === 0 ? m : stack[stack.length - 1];
|
||||
stack.push(i);
|
||||
}
|
||||
for (let i = 0; i < m; i++) {
|
||||
const xCount = down[i] - up[i] - 1;
|
||||
const yCount = left[i][j];
|
||||
if (!yCount || !xCount)
|
||||
continue;
|
||||
let width = xs[down[i]] - xs[down[i] - xCount];
|
||||
let height = ys[j + 1] - ys[j + 1 - yCount];
|
||||
if (width < this.MinWidth || height < this.MinHeight)
|
||||
continue;
|
||||
//自定义过滤函数
|
||||
if (this.FilterRectFn && this.FilterRectFn(width, height))
|
||||
continue;
|
||||
let area = width * height;
|
||||
//面积小于最小允许面积
|
||||
if (area < this.MinArea)
|
||||
continue;
|
||||
rects.push([area, down[i], j, xCount, yCount]);
|
||||
}
|
||||
}
|
||||
while (rects.length) {
|
||||
let maxIndex = Max(rects, (t1, t2) => t2[0] > t1[0]);
|
||||
let [area, maxXIndex, maxYIndex, xCount, yCount] = rects[maxIndex];
|
||||
let xMax = xs[maxXIndex];
|
||||
let yMax = ys[maxYIndex + 1];
|
||||
let xMin = xs[maxXIndex - xCount];
|
||||
let yMin = ys[maxYIndex + 1 - yCount];
|
||||
maxRects.push(new Box2$1(new Vector2$1(xMin, yMin), new Vector2$1(xMax, yMax)));
|
||||
rects.splice(maxIndex, 1);
|
||||
//对方块进行标记
|
||||
for (let i = 0; i < xCount; i++) {
|
||||
for (let j = 0; j < yCount; j++) {
|
||||
matrix[maxXIndex - 1 - i][maxYIndex - j] = 0;
|
||||
}
|
||||
}
|
||||
//如果有被标记的方块,则删除它
|
||||
arrayRemoveIf(rects, rect => {
|
||||
let [area, maxX, maxY, xCount, yCount] = rect;
|
||||
for (let i = 0; i < xCount; i++) {
|
||||
for (let j = 0; j < yCount; j++) {
|
||||
if (!matrix[maxX - 1 - i][maxY - j])
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
});
|
||||
}
|
||||
};
|
||||
let maxRects = [];
|
||||
while (true) {
|
||||
let count = maxRects.length;
|
||||
maximalRectangle();
|
||||
if (count === maxRects.length)
|
||||
break;
|
||||
}
|
||||
return maxRects;
|
||||
}
|
||||
}
|
||||
LargestInteriorRectangle.GetMaxAreaFn = GetMaxAreaFn;
|
||||
LargestInteriorRectangle.GetMaxWidthFn = GetMaxWidthFn;
|
||||
LargestInteriorRectangle.GetMaxHeightFn = GetMaxHeightFn;
|
||||
function RangesAdd(ranges, vList) {
|
||||
let adds = [];
|
||||
for (let range of ranges) {
|
||||
let dist = range[1] - range[0];
|
||||
let count = Math.floor(dist / 20);
|
||||
let divDist = Math.floor(dist / count);
|
||||
for (let i = 1; i < count - 1; i++) {
|
||||
let d = Math.floor(range[0] + divDist * i);
|
||||
let index = InsertSortedIndex(vList, d, (a, b) => a - b);
|
||||
if (Math.abs(vList[index] - d) < 5)
|
||||
continue;
|
||||
if (index !== vList.length - 1 && Math.abs(vList[index + 1] - d) < 5)
|
||||
continue;
|
||||
adds.push(d);
|
||||
}
|
||||
}
|
||||
if (adds.length) {
|
||||
arrayPushArray(vList, adds);
|
||||
arraySortByNumber(vList);
|
||||
}
|
||||
}
|
||||
/**
|
||||
* 判断点在多段线内外 这是为了LIR实现的优化算法,返回交点的Y轴列表
|
||||
*/
|
||||
function IsPointInPolygon(polyPts, pt) {
|
||||
// let crossings = 0;
|
||||
// let insLine = new Line(pt, p2);
|
||||
let iPtYs = [];
|
||||
for (let i = 0; i < polyPts.length; i++) {
|
||||
let sp = polyPts[i];
|
||||
let ep = polyPts[FixIndex$1(i + 1, polyPts)];
|
||||
// if (equalv2(sp, pt, 1e-5) || equalv2(ep, pt, 1e-5))//在起点或者终点
|
||||
// return false;
|
||||
//点位于线上面
|
||||
if (pt.y > Math.max(sp.y, ep.y))
|
||||
continue;
|
||||
//线垂直Y轴
|
||||
let derX = ep.x - sp.x;
|
||||
if (equaln$1(derX, 0, 5e-6)) {
|
||||
// if (equaln(pt.x, ep.x, 1e-5)
|
||||
// && (pt.y > Math.min(sp.y, ep.y) - 1e-5 && pt.y < Math.max(sp.y, ep.y) + 1e-5))
|
||||
// return false;//点在线上
|
||||
continue;
|
||||
}
|
||||
//起点
|
||||
if (equaln$1(sp.x, pt.x, 5e-6)) {
|
||||
// if (sp.y > pt.y && derX < 0)
|
||||
if (derX < 0) {
|
||||
// crossings++;
|
||||
iPtYs.push(sp.y);
|
||||
}
|
||||
continue;
|
||||
}
|
||||
//终点
|
||||
if (equaln$1(ep.x, pt.x, 5e-6)) {
|
||||
// if (ep.y > pt.y && derX > 0)
|
||||
if (derX > 0) {
|
||||
// crossings++;
|
||||
iPtYs.push(ep.y);
|
||||
}
|
||||
continue;
|
||||
}
|
||||
//快速求交,只验证有没有交点
|
||||
let [x1, x2] = sp.x > ep.x ? [ep.x, sp.x] : [sp.x, ep.x];
|
||||
if (pt.x > x1 && pt.x < x2) {
|
||||
let derY = ep.y - sp.y;
|
||||
let k = derY / derX;
|
||||
let iptY = (pt.x - sp.x) * k + sp.y;
|
||||
// if (equaln(iptY, pt.y, 1e-5))//点在线上 返回false
|
||||
// return false;
|
||||
if (iptY > pt.y) {
|
||||
// crossings++;
|
||||
iPtYs.push(iptY);
|
||||
}
|
||||
}
|
||||
}
|
||||
return iPtYs;
|
||||
}
|
||||
|
||||
/** 内外接多边形 */
|
||||
function Circle2Points(circle, knifRadius, splitSize = 10, outside = false) {
|
||||
let radius = circle.Radius;
|
||||
@ -23041,6 +23533,7 @@ class CurveWrap {
|
||||
this.IsOutside = IsOutside;
|
||||
this.Used = false;
|
||||
this.Holes = [];
|
||||
this._OrgCurve = Curve;
|
||||
this.BoundingBox = Curve.BoundingBox;
|
||||
if (Curve instanceof Polyline) {
|
||||
let pts = Polyline2Points(Curve, IsOutside, 0)[1];
|
||||
@ -23108,5 +23601,5 @@ class CurveWrap {
|
||||
}
|
||||
}
|
||||
|
||||
export { Arc, BUL_IS_LINE_FUZZ, BoolOpeartionType, CADFiler, Circle, Circle2Points, ComputeBiarc, Contour, ConverToPolylineAndSplitArc, CurveContainerCurve, CurveWrap, Curves2Points, DuplicateRecordCloning, FeedingToolPath, IsPtsAllOutOrOnReg, IsRect, Line, ParseRegionTextPos, PointsSimplify2PolylineAndParseArc, Polyline, Polyline2Points, PolylineFilletMinArc, Production, Shape, ShapeManager, SmartPointsSimply2Polyline, SmartPolylineSimply2Polyline, SplineConver2Polyline, Status, TEXT_BOX, TempPolyline, UpdateDraw, VData2Curve, VKnifToolPath, fastCurveInCurve2, isTargetCurInOrOnSourceCur };
|
||||
export { Arc, BUL_IS_LINE_FUZZ, BoolOpeartionType, CADFiler, Circle, Circle2Points, ComputeBiarc, Contour, ConverToPolylineAndSplitArc, CurveContainerCurve, CurveWrap, Curves2Points, DuplicateRecordCloning, FeedingToolPath, IsPtsAllOutOrOnReg, IsRect, LargestInteriorRectangle, Line, ParseRegionTextPos, PointsSimplify2PolylineAndParseArc, Polyline, Polyline2Points, PolylineFilletMinArc, Production, Shape, ShapeManager, SmartPointsSimply2Polyline, SmartPolylineSimply2Polyline, SplineConver2Polyline, Status, TEXT_BOX, TempPolyline, UpdateDraw, VData2Curve, VKnifToolPath, fastCurveInCurve2, isTargetCurInOrOnSourceCur };
|
||||
//# sourceMappingURL=api.esm.js.map
|
||||
|
File diff suppressed because one or more lines are too long
1
types/Add-on/DrawDrilling/HoleUtils.d.ts
vendored
1
types/Add-on/DrawDrilling/HoleUtils.d.ts
vendored
@ -14,7 +14,6 @@ export interface IBoardRectHoleType {
|
||||
left: string;
|
||||
right: string;
|
||||
}
|
||||
export declare const TempRectHoleOption: IBoardRectHoleType;
|
||||
/**分析上下左右排钻 */
|
||||
export declare function ParseBoardRectHoleType(br: Board, outBrRectHoleType?: IBoardRectHoleType): IBoardRectHoleType;
|
||||
export declare function ExtureHoleInBoard(holes: ExtrudeHole[], board: Board, ocs: Matrix4): boolean;
|
||||
|
@ -1 +1 @@
|
||||
{"version":3,"file":"HoleUtils.d.ts","sourceRoot":"","sources":["../../../../src/Add-on/DrawDrilling/HoleUtils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAQ,OAAO,EAAW,MAAM,OAAO,CAAC;AAG/C,OAAO,EAAE,YAAY,EAAiB,MAAM,6CAA6C,CAAC;AAC1F,OAAO,EAAE,WAAW,EAAE,MAAM,4CAA4C,CAAC;AACzE,OAAO,EAAE,IAAI,EAAE,MAAM,qCAAqC,CAAC;AAC3D,OAAO,EAAE,KAAK,EAAE,MAAM,qCAAqC,CAAC;AAQ5D,eAAO,MAAM,MAAM,MAAM,CAAC;AAE1B,wBAAgB,aAAa,CAAC,GAAG,EAAE,YAAY,EAAE,EAAE,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,OAAO,EAAE,QAAQ,UAAQ,WA4H3F;AAED;;GAEG;AACH,MAAM,WAAW,kBAAkB;IAE/B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;CACjB;AAED,eAAO,MAAM,kBAAkB,EAAE,kBAKhC,CAAC;AAEF,cAAc;AACd,wBAAgB,sBAAsB,CAAC,EAAE,EAAE,KAAK,EAAE,iBAAiB,GAAE,kBAA8B,sBA2BlG;AACD,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,WAAW,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,EAAE,OAAO,WAIjF;AAED,wBAAgB,WAAW,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE,EAAE,EAAE,KAAK,EAAE,GAAG,CAAC,EAAE,OAAO,WAYlE;AAED,uBAAuB;AACvB,wBAAgB,iCAAiC,CAAC,EAAE,EAAE,KAAK,EAAE,cAAc,EAAE,kBAAkB,QA+B9F"}
|
||||
{"version":3,"file":"HoleUtils.d.ts","sourceRoot":"","sources":["../../../../src/Add-on/DrawDrilling/HoleUtils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAQ,OAAO,EAAW,MAAM,OAAO,CAAC;AAG/C,OAAO,EAAE,YAAY,EAAiB,MAAM,6CAA6C,CAAC;AAC1F,OAAO,EAAE,WAAW,EAAE,MAAM,4CAA4C,CAAC;AACzE,OAAO,EAAE,IAAI,EAAE,MAAM,qCAAqC,CAAC;AAC3D,OAAO,EAAE,KAAK,EAAE,MAAM,qCAAqC,CAAC;AAQ5D,eAAO,MAAM,MAAM,MAAM,CAAC;AAE1B,wBAAgB,aAAa,CAAC,GAAG,EAAE,YAAY,EAAE,EAAE,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,OAAO,EAAE,QAAQ,UAAQ,WA4H3F;AAED;;GAEG;AACH,MAAM,WAAW,kBAAkB;IAE/B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;CACjB;AAED,cAAc;AACd,wBAAgB,sBAAsB,CAAC,EAAE,EAAE,KAAK,EAAE,iBAAiB,GAAE,kBAA8B,sBA2BlG;AACD,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,WAAW,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,EAAE,OAAO,WAIjF;AAED,wBAAgB,WAAW,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE,EAAE,EAAE,KAAK,EAAE,GAAG,CAAC,EAAE,OAAO,WAYlE;AAED,uBAAuB;AACvB,wBAAgB,iCAAiC,CAAC,EAAE,EAAE,KAAK,EAAE,cAAc,EAAE,kBAAkB,QA+B9F"}
|
48
types/Add-on/testEntity/LargestInteriorRectangle.d.ts
vendored
Normal file
48
types/Add-on/testEntity/LargestInteriorRectangle.d.ts
vendored
Normal file
@ -0,0 +1,48 @@
|
||||
import { Box2, Vector2 } from "three";
|
||||
/**
|
||||
* 获取面积最大的矩形
|
||||
* @param rects
|
||||
* @returns
|
||||
*/
|
||||
declare function GetMaxAreaFn(rects: [number, number, number][]): number;
|
||||
declare function GetMaxWidthFn(rects: [number, number, number][]): number;
|
||||
declare function GetMaxHeightFn(rects: [number, number, number][]): number;
|
||||
/**
|
||||
* @example
|
||||
*
|
||||
* //1. 设置过滤条件(舍弃掉一些无用的矩形)
|
||||
* let lir = new LargestInteriorRectangle;
|
||||
* lir.MinWidth = 200;//设置最小可以接受的矩形宽度
|
||||
* lir.MinHeight = 200;//设置最小可以接受的矩形宽度
|
||||
* lir.MinArea = 200 * 200;//设置最小可以接受的矩形面积
|
||||
*
|
||||
* //除了变量 也可以设置过滤函数
|
||||
* //例如:
|
||||
* lir.FilterRectFn = !(w,h)=> (w>500 || h>500) //这样将对长或者宽不足500的矩形板过滤(舍弃)
|
||||
*
|
||||
* //2. 可以设置优先模式,默认提供了面积优先,你也可以使用宽度优先或者高度优先,或许默认规则可能不好用,可以自定义传入自定义函数.
|
||||
* lir.GetMaxRectIndexFn = LargestInteriorRectangle.GetMaxAreaFn; //或者 LargestInteriorRectangle.GetMaxWidthFn / LargestInteriorRectangle.GetMaxHeightFn
|
||||
*
|
||||
* //3. 你已经设置好解析器,你现在可以进行解析了
|
||||
* let rects = lir.ParseLir([ new Vector3(0,0,0) , new Vector3(100,0,0) , new Vector3(50,100,0)]) //首尾不需要重复,首尾重复可能造成错误,程序不再校验
|
||||
*
|
||||
*/
|
||||
export declare class LargestInteriorRectangle {
|
||||
MinWidth: number;
|
||||
MinHeight: number;
|
||||
MinArea: number;
|
||||
/** 可以自定义过滤函数,以便过滤掉某些不需要的矩形,当返回true时,我们会过滤它 */
|
||||
FilterRectFn: (width: number, height: number) => boolean;
|
||||
GetMaxRectIndexFn: (rects: [number, number, number][]) => number;
|
||||
static GetMaxAreaFn: typeof GetMaxAreaFn;
|
||||
static GetMaxWidthFn: typeof GetMaxWidthFn;
|
||||
static GetMaxHeightFn: typeof GetMaxHeightFn;
|
||||
constructor();
|
||||
/**
|
||||
* 分析最大内接矩形
|
||||
* @param polygonPts 多边形点表,首尾不要相等
|
||||
*/
|
||||
ParseLIR(polygonPts: Vector2[]): Box2[];
|
||||
}
|
||||
export {};
|
||||
//# sourceMappingURL=LargestInteriorRectangle.d.ts.map
|
@ -0,0 +1 @@
|
||||
{"version":3,"file":"LargestInteriorRectangle.d.ts","sourceRoot":"","sources":["../../../../src/Add-on/testEntity/LargestInteriorRectangle.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,IAAI,EAAE,OAAO,EAAW,MAAM,OAAO,CAAC;AAW/C;;;;GAIG;AACH,iBAAS,YAAY,CAAC,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,GAAG,MAAM,CAG/D;AAED,iBAAS,aAAa,CAAC,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,GAAG,MAAM,CAGhE;AAED,iBAAS,cAAc,CAAC,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,GAAG,MAAM,CAGjE;AAuBD;;;;;;;;;;;;;;;;;;;GAmBG;AACH,qBAAa,wBAAwB;IAEjC,QAAQ,SAAO;IACf,SAAS,SAAO;IAChB,OAAO,SAAa;IAEpB,8CAA8C;IAC9C,YAAY,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,KAAK,OAAO,CAAC;IAEzD,iBAAiB,EAAE,CAAC,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,KAAK,MAAM,CAAgB;IAGhF,MAAM,CAAC,YAAY,sBAAgB;IACnC,MAAM,CAAC,aAAa,uBAAiB;IACrC,MAAM,CAAC,cAAc,wBAAkB;;IAMvC;;;OAGG;IACH,QAAQ,CAAC,UAAU,EAAE,OAAO,EAAE,GAAG,IAAI,EAAE;CAqS1C"}
|
File diff suppressed because one or more lines are too long
@ -1 +1 @@
|
||||
{"version":3,"file":"HistoricManage.d.ts","sourceRoot":"","sources":["../../../src/DatabaseServices/HistoricManage.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtC,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAE9D;;;;;GAKG;AACH,qBACa,cAAe,SAAQ,SAAS;IAUtB,aAAa;IARhC,QAAQ,EAAE,MAAM,CAAM;IACtB,SAAS,SAAM;IACf,aAAa,EAAE,oBAAoB,EAAE,CAAM;IAC3C,KAAK,EAAE,OAAO,CAAS;IACvB,MAAM,EAAE,OAAO,CAAQ;IAEvB,qBAAqB,EAAE,cAAc,CAAC;gBAEnB,aAAa,UAAO;IAMvC;;;OAGG;IACH,KAAK,CAAC,QAAQ,SAAI;IAUlB,QAAQ,CAAC,IAAI,EAAE,QAAQ;IAYvB,SAAS,CAAC,IAAI,EAAE,QAAQ;IAYxB,IAAI,KAAK,IAAI,OAAO,CAGnB;IAED,IAAI,QAAQ,IAAI,oBAAoB,CAgCnC;IAGD,SAAS,CAAC,cAAc,SAAK;IAY7B;;;OAGG;IACH,QAAQ,CAAC,OAAO,EAAE,MAAM;IAUxB,iBAAiB,IAAI,OAAO;IAS5B,MAAM,IAAI,OAAO;IA+BjB;;OAEG;IACH,IAAI,aAAa,IAAI,GAAG,CAAC,SAAS,CAAC,CAclC;IACD,oBAAoB,CAAC,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,GAAG,CAAC,SAAS,CAAC;IAS1E;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAiBxB,IAAI,IAAI,OAAO;IA6Bf,IAAI;IA2BJ,SAAS,CAAC,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,oBAAoB;IAI3D,SAAS,CAAC,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,oBAAoB;CAI9D"}
|
||||
{"version":3,"file":"HistoricManage.d.ts","sourceRoot":"","sources":["../../../src/DatabaseServices/HistoricManage.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtC,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAE9D;;;;;GAKG;AACH,qBACa,cAAe,SAAQ,SAAS;IAUtB,aAAa;IARhC,QAAQ,EAAE,MAAM,CAAM;IACtB,SAAS,SAAM;IACf,aAAa,EAAE,oBAAoB,EAAE,CAAM;IAC3C,KAAK,EAAE,OAAO,CAAS;IACvB,MAAM,EAAE,OAAO,CAAQ;IAEvB,qBAAqB,EAAE,cAAc,CAAC;gBAEnB,aAAa,UAAO;IAMvC;;;OAGG;IACH,KAAK,CAAC,QAAQ,SAAI;IAUlB,QAAQ,CAAC,IAAI,EAAE,QAAQ;IAYvB,SAAS,CAAC,IAAI,EAAE,QAAQ;IAYxB,IAAI,KAAK,IAAI,OAAO,CAGnB;IAED,IAAI,QAAQ,IAAI,oBAAoB,CAgCnC;IAGD,SAAS,CAAC,cAAc,SAAK;IAY7B;;;OAGG;IACH,QAAQ,CAAC,OAAO,EAAE,MAAM;IAQxB,iBAAiB,IAAI,OAAO;IAS5B,MAAM,IAAI,OAAO;IA+BjB;;OAEG;IACH,IAAI,aAAa,IAAI,GAAG,CAAC,SAAS,CAAC,CAclC;IACD,oBAAoB,CAAC,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,GAAG,CAAC,SAAS,CAAC;IAS1E;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAiBxB,IAAI,IAAI,OAAO;IA6Bf,IAAI;IA2BJ,SAAS,CAAC,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,oBAAoB;IAI3D,SAAS,CAAC,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,oBAAoB;CAI9D"}
|
1
types/DatabaseServices/HistorycRecord.d.ts
vendored
1
types/DatabaseServices/HistorycRecord.d.ts
vendored
@ -6,7 +6,6 @@ import { ISerialize } from './ISerialize';
|
||||
export declare class HistorycRecord {
|
||||
undoData: ISerialize;
|
||||
redoData: ISerialize;
|
||||
userData: ISerialize;
|
||||
ReadFile(file: CADFiler): void;
|
||||
WriteFile(file: CADFiler): void;
|
||||
}
|
||||
|
@ -1 +1 @@
|
||||
{"version":3,"file":"HistorycRecord.d.ts","sourceRoot":"","sources":["../../../src/DatabaseServices/HistorycRecord.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtC,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAE1C;;GAEG;AACH,qBACa,cAAc;IAGvB,QAAQ,EAAE,UAAU,CAAC;IAErB,QAAQ,EAAE,UAAU,CAAC;IACrB,QAAQ,EAAE,UAAU,CAAC;IAMrB,QAAQ,CAAC,IAAI,EAAE,QAAQ;IAQvB,SAAS,CAAC,IAAI,EAAE,QAAQ;CAQ3B"}
|
||||
{"version":3,"file":"HistorycRecord.d.ts","sourceRoot":"","sources":["../../../src/DatabaseServices/HistorycRecord.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtC,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAE1C;;GAEG;AACH,qBACa,cAAc;IAGvB,QAAQ,EAAE,UAAU,CAAC;IAErB,QAAQ,EAAE,UAAU,CAAC;IAMrB,QAAQ,CAAC,IAAI,EAAE,QAAQ;IASvB,SAAS,CAAC,IAAI,EAAE,QAAQ;CAO3B"}
|
11
types/DatabaseServices/Room/ParseService/RangeUtils.d.ts
vendored
Normal file
11
types/DatabaseServices/Room/ParseService/RangeUtils.d.ts
vendored
Normal file
@ -0,0 +1,11 @@
|
||||
type Range = [number, number];
|
||||
export declare function InsertRangeIndex(ranges: Range[], sparam: number): number;
|
||||
export declare function InsertSortedIndex<T, E>(array: T[], element: E, comparefunc: (a: E, b: T) => number): number;
|
||||
/**
|
||||
* 插入范围,并且合并范围
|
||||
*/
|
||||
export declare function InsertRangeAndUnion(ranges: Range[], sparam: number, eparam: number, insertIndex?: number): Range[];
|
||||
export declare function RangeUnion(ranges: Range[]): Range[];
|
||||
export declare function Intersection(range1: Range, range2: Range): Range | undefined;
|
||||
export {};
|
||||
//# sourceMappingURL=RangeUtils.d.ts.map
|
@ -0,0 +1 @@
|
||||
{"version":3,"file":"RangeUtils.d.ts","sourceRoot":"","sources":["../../../../../src/DatabaseServices/Room/ParseService/RangeUtils.ts"],"names":[],"mappings":"AAEA,KAAK,KAAK,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;AAK9B,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,MAAM,EAAE,MAAM,UAG/D;AAGD,wBAAgB,iBAAiB,CAAC,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE,OAAO,EAAE,CAAC,EAAE,WAAW,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,KAAK,MAAM,UAiBlG;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAC/B,MAAM,EAAE,KAAK,EAAE,EACf,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,MAAM,EACd,WAAW,SAAmC,WA8DjD;AAGD,wBAAgB,UAAU,CAAC,MAAM,EAAE,KAAK,EAAE,WAiBzC;AAGD,wBAAgB,YAAY,CAAC,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,GAAG,KAAK,GAAG,SAAS,CAM5E"}
|
@ -1 +1 @@
|
||||
{"version":3,"file":"DefaultConfig.d.ts","sourceRoot":"","sources":["../../../src/Editor/DefaultConfig.ts"],"names":[],"mappings":"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"}
|
||||
{"version":3,"file":"DefaultConfig.d.ts","sourceRoot":"","sources":["../../../src/Editor/DefaultConfig.ts"],"names":[],"mappings":"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"}
|
44
types/Nest/Common/ArrayExt.d.ts
vendored
Normal file
44
types/Nest/Common/ArrayExt.d.ts
vendored
Normal file
@ -0,0 +1,44 @@
|
||||
/**
|
||||
* 删除数组中指定的元素,返回数组本身
|
||||
* @param {Array<any>} arr 需要操作的数组
|
||||
* @param {*} el 需要移除的元素
|
||||
*/
|
||||
export declare function arrayRemove<T>(arr: Array<T>, el: T): Array<T>;
|
||||
export declare function arrayRemoveOnce<T>(arr: Array<T>, el: T): Array<T>;
|
||||
/**
|
||||
* 删除通过函数校验的元素
|
||||
* @param {(e: T) => boolean} checkFuntion 校验函数
|
||||
*/
|
||||
export declare function arrayRemoveIf<T>(arr: Array<T>, checkFuntion: (e: T) => boolean): Array<T>;
|
||||
export declare function arrayFirst<T>(arr: Array<T>): T;
|
||||
export declare function arrayLast<T>(arr: {
|
||||
[key: number]: T;
|
||||
length: number;
|
||||
}): T;
|
||||
/**
|
||||
* 根据数值从小到大排序数组
|
||||
* @param {Array<T>} arr
|
||||
* @returns {Array<T>} 返回自身
|
||||
*/
|
||||
export declare function arraySortByNumber<T>(arr: Array<T>): Array<T>;
|
||||
/**
|
||||
* 对排序好的数组进行去重操作
|
||||
* @param {(e1, e2) => boolean} [checkFuction] 校验对象相等函数
|
||||
* @returns {Array<T>} 返回自身
|
||||
*/
|
||||
export declare function arrayRemoveDuplicateBySort<T>(arr: Array<T>, checkFuction?: (e1: T, e2: T) => boolean): Array<T>;
|
||||
export declare function arrayMap<T>(arr: Array<T>, mapFunc: (v: T) => T): Array<T>;
|
||||
declare function checkEqual(e1: any, e2: any): boolean;
|
||||
/**
|
||||
* 改变数组的值顺序
|
||||
* @param arr 需要改变初始值位置的数组
|
||||
* @param index //将index位置以后的值放到起始位置
|
||||
*/
|
||||
export declare function changeArrayStartIndex<T>(arr: T[], index: number): T[];
|
||||
export declare function equalArray<T>(a: T[], b: T[], checkF?: typeof checkEqual): boolean;
|
||||
export declare function arrayClone<T>(arr: T[]): T[];
|
||||
export declare function arrayPushArray<T>(arr1: T[], arr2: T[]): T[];
|
||||
export declare function arraySum(arr: number[]): number;
|
||||
export declare function FilterSet<T>(s: Set<T>, fn: (el: T) => boolean): Set<T>;
|
||||
export {};
|
||||
//# sourceMappingURL=ArrayExt.d.ts.map
|
1
types/Nest/Common/ArrayExt.d.ts.map
Normal file
1
types/Nest/Common/ArrayExt.d.ts.map
Normal file
@ -0,0 +1 @@
|
||||
{"version":3,"file":"ArrayExt.d.ts","sourceRoot":"","sources":["../../../../src/Nest/Common/ArrayExt.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,wBAAgB,WAAW,CAAC,CAAC,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,CAa7D;AAGD,wBAAgB,eAAe,CAAC,CAAC,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,CAMjE;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAAC,CAAC,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,CAAC,CAAC,EAAE,CAAC,KAAK,OAAO,GAAG,KAAK,CAAC,CAAC,CAAC,CAazF;AAED,wBAAgB,UAAU,CAAC,CAAC,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAG9C;AAED,wBAAgB,SAAS,CAAC,CAAC,EAAE,GAAG,EAAE;IAAE,CAAC,GAAG,EAAE,MAAM,GAAG,CAAC,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;CAAE,GAAG,CAAC,CAG1E;AAED;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,CAAC,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,CAI5D;AAED;;;;GAIG;AACH,wBAAgB,0BAA0B,CAAC,CAAC,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,YAAY,GAAE,CAAC,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,KAAK,OAAoB,GAAG,KAAK,CAAC,CAAC,CAAC,CAS3H;AAGD,wBAAgB,QAAQ,CAAC,CAAC,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,CAKzE;AAOD,iBAAS,UAAU,CAAC,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,GAAG,OAAO,CAG7C;AAED;;;;GAIG;AACH,wBAAgB,qBAAqB,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,EAAE,KAAK,EAAE,MAAM,GAAG,CAAC,EAAE,CAIrE;AAED,wBAAgB,UAAU,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,oBAAa,WAOhE;AAED,wBAAgB,UAAU,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,CAAC,EAAE,CAG3C;AAGD,wBAAgB,cAAc,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,EAAE,IAAI,EAAE,CAAC,EAAE,GAAG,CAAC,EAAE,CAS3D;AAED,wBAAgB,QAAQ,CAAC,GAAG,EAAE,MAAM,EAAE,UAKrC;AAED,wBAAgB,SAAS,CAAC,CAAC,EAAE,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,KAAK,OAAO,GAAG,GAAG,CAAC,CAAC,CAAC,CAStE"}
|
1
types/Nest/Converter/CurveWrap.d.ts
vendored
1
types/Nest/Converter/CurveWrap.d.ts
vendored
@ -18,6 +18,7 @@ export declare class CurveWrap {
|
||||
Used: boolean;
|
||||
Holes: CurveWrap[];
|
||||
Points: Point[];
|
||||
_OrgCurve: Polyline | Circle;
|
||||
constructor(Curve: Polyline | Circle, KnifRadius?: number, IsOutside?: boolean);
|
||||
ContainsCurve(curve: CurveWrap): boolean;
|
||||
GetOutsidePoints(): Point[];
|
||||
|
@ -1 +1 @@
|
||||
{"version":3,"file":"CurveWrap.d.ts","sourceRoot":"","sources":["../../../../src/Nest/Converter/CurveWrap.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,IAAI,EAAE,MAAM,OAAO,CAAC;AAC7B,OAAO,EAAE,MAAM,EAAE,MAAM,sCAAsC,CAAC;AAC9D,OAAO,EAAE,QAAQ,EAAE,MAAM,wCAAwC,CAAC;AAElE,OAAO,EAAE,KAAK,EAAE,MAAM,iBAAiB,CAAC;AAIxC,OAAO,EAAE,OAAO,EAA0B,MAAM,aAAa,CAAC;AAG9D;;;GAGG;AACH,qBAAa,SAAS;IAaC,KAAK,EAAE,QAAQ,GAAG,MAAM;IAAS,UAAU;IAAa,SAAS,EAAE,OAAO;IAX7F,WAAW,EAAE,IAAI,CAAC;IAElB,IAAI,EAAE,MAAM,CAAC;IAEb,cAAc,EAAE,QAAQ,CAAC;IACzB,YAAY,EAAE,OAAO,CAAC;IACtB,IAAI,UAAS;IACb,KAAK,EAAE,SAAS,EAAE,CAAM;IAExB,MAAM,EAAE,KAAK,EAAE,CAAC;gBAEG,KAAK,EAAE,QAAQ,GAAG,MAAM,EAAS,UAAU,SAAI,EAAS,SAAS,GAAE,OAAc;IAwBpG,aAAa,CAAC,KAAK,EAAE,SAAS,GAAG,OAAO;IAOxC,gBAAgB,IAAI,KAAK,EAAE;IA+B3B,eAAe,IAAI,KAAK,EAAE;CA2B7B"}
|
||||
{"version":3,"file":"CurveWrap.d.ts","sourceRoot":"","sources":["../../../../src/Nest/Converter/CurveWrap.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,IAAI,EAAE,MAAM,OAAO,CAAC;AAC7B,OAAO,EAAE,MAAM,EAAE,MAAM,sCAAsC,CAAC;AAC9D,OAAO,EAAE,QAAQ,EAAE,MAAM,wCAAwC,CAAC;AAElE,OAAO,EAAE,KAAK,EAAE,MAAM,iBAAiB,CAAC;AAIxC,OAAO,EAAE,OAAO,EAA0B,MAAM,aAAa,CAAC;AAG9D;;;GAGG;AACH,qBAAa,SAAS;IAeC,KAAK,EAAE,QAAQ,GAAG,MAAM;IAAS,UAAU;IAAa,SAAS,EAAE,OAAO;IAb7F,WAAW,EAAE,IAAI,CAAC;IAElB,IAAI,EAAE,MAAM,CAAC;IAEb,cAAc,EAAE,QAAQ,CAAC;IACzB,YAAY,EAAE,OAAO,CAAC;IACtB,IAAI,UAAS;IACb,KAAK,EAAE,SAAS,EAAE,CAAM;IAExB,MAAM,EAAE,KAAK,EAAE,CAAC;IAEhB,SAAS,EAAE,QAAQ,GAAG,MAAM,CAAC;gBAEV,KAAK,EAAE,QAAQ,GAAG,MAAM,EAAS,UAAU,SAAI,EAAS,SAAS,GAAE,OAAc;IAyBpG,aAAa,CAAC,KAAK,EAAE,SAAS,GAAG,OAAO;IAOxC,gBAAgB,IAAI,KAAK,EAAE;IA+B3B,eAAe,IAAI,KAAK,EAAE;CA2B7B"}
|
6
types/UI/Store/BoardFindInterface.d.ts
vendored
6
types/UI/Store/BoardFindInterface.d.ts
vendored
@ -1,6 +1,6 @@
|
||||
import { FaceDirection } from "../../Add-on/DrawDrilling/DrillType";
|
||||
import { EBoardKeyList } from "../../Common/BoardKeyList";
|
||||
import { ComposingType, LinesType } from "../../DatabaseServices/Entity/BoardInterface";
|
||||
import { BoardOpenDir, ComposingType, LinesType } from "../../DatabaseServices/Entity/BoardInterface";
|
||||
import { IBaseOption } from "./OptionInterface/IOptionInterface";
|
||||
export declare const DRILL_KEYS: string[];
|
||||
export interface IBoardFindOption extends IBaseOption {
|
||||
@ -22,10 +22,12 @@ export interface IBoardFindOption extends IBaseOption {
|
||||
[EBoardKeyList.BigHole]: FaceDirection;
|
||||
[EBoardKeyList.DrillType]: string;
|
||||
[EBoardKeyList.ComposingFace]: ComposingType;
|
||||
[EBoardKeyList.OpenDir]: BoardOpenDir;
|
||||
[EBoardKeyList.UpSealed]: string;
|
||||
[EBoardKeyList.DownSealed]: string;
|
||||
[EBoardKeyList.LeftSealed]: string;
|
||||
[EBoardKeyList.RightSealed]: string;
|
||||
hardwareDoorName: string;
|
||||
highDrill: string[];
|
||||
upDownDrill: [boolean, boolean];
|
||||
isClose: boolean;
|
||||
@ -57,6 +59,7 @@ export interface IFindCondition {
|
||||
useKeyWord: boolean;
|
||||
addRemarks: boolean;
|
||||
[EBoardKeyList.ComposingFace]: boolean;
|
||||
[EBoardKeyList.OpenDir]: boolean;
|
||||
[EBoardKeyList.UpSealed]: boolean;
|
||||
[EBoardKeyList.DownSealed]: boolean;
|
||||
[EBoardKeyList.LeftSealed]: boolean;
|
||||
@ -84,6 +87,7 @@ export interface ICompareType {
|
||||
[EBoardKeyList.BigHole]: ECompareType;
|
||||
[EBoardKeyList.DrillType]: ECompareType;
|
||||
[EBoardKeyList.ComposingFace]: ECompareType;
|
||||
[EBoardKeyList.OpenDir]: ECompareType;
|
||||
[EBoardKeyList.KnifeRad]: ECompareType;
|
||||
}
|
||||
export interface ITolerance {
|
||||
|
@ -1 +1 @@
|
||||
{"version":3,"file":"BoardFindInterface.d.ts","sourceRoot":"","sources":["../../../../src/UI/Store/BoardFindInterface.ts"],"names":[],"mappings":"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"}
|
||||
{"version":3,"file":"BoardFindInterface.d.ts","sourceRoot":"","sources":["../../../../src/UI/Store/BoardFindInterface.ts"],"names":[],"mappings":"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"}
|
1
types/api.d.ts
vendored
1
types/api.d.ts
vendored
@ -14,6 +14,7 @@ export * from "./DatabaseServices/Room/ParseService/ParseRegionTextPos";
|
||||
export * from "./DatabaseServices/Contour";
|
||||
export * from "./DatabaseServices/Shape";
|
||||
export * from "./DatabaseServices/ShapeManager";
|
||||
export * from "./Add-on/testEntity/LargestInteriorRectangle";
|
||||
export * from "./Nest/Converter/Curves2Points";
|
||||
export * from "./Nest/Converter/CurveWrap";
|
||||
export * from "./Common/Status";
|
||||
|
@ -1 +1 @@
|
||||
{"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../../src/api.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAC7C,cAAc,6BAA6B,CAAC;AAC5C,cAAc,+BAA+B,CAAC;AAC9C,cAAc,kCAAkC,CAAC;AACjD,cAAc,gCAAgC,CAAC;AAC/C,cAAc,oCAAoC,CAAC;AACnD,cAAc,0CAA0C,CAAC;AACzD,cAAc,mCAAmC,CAAC;AAClD,OAAO,EAAE,eAAe,EAAE,MAAM,2CAA2C,CAAC;AAC5E,cAAc,yCAAyC,CAAC;AACxD,cAAc,sBAAsB,CAAC;AACrC,cAAc,wCAAwC,CAAC;AACvD,cAAc,yDAAyD,CAAC;AACxE,cAAc,4BAA4B,CAAC;AAC3C,cAAc,0BAA0B,CAAC;AACzC,cAAc,iCAAiC,CAAC;AAGhD,cAAc,gCAAgC,CAAC;AAC/C,cAAc,4BAA4B,CAAC;AAC3C,cAAc,iBAAiB,CAAC"}
|
||||
{"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../../src/api.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAC7C,cAAc,6BAA6B,CAAC;AAC5C,cAAc,+BAA+B,CAAC;AAC9C,cAAc,kCAAkC,CAAC;AACjD,cAAc,gCAAgC,CAAC;AAC/C,cAAc,oCAAoC,CAAC;AACnD,cAAc,0CAA0C,CAAC;AACzD,cAAc,mCAAmC,CAAC;AAClD,OAAO,EAAE,eAAe,EAAE,MAAM,2CAA2C,CAAC;AAC5E,cAAc,yCAAyC,CAAC;AACxD,cAAc,sBAAsB,CAAC;AACrC,cAAc,wCAAwC,CAAC;AACvD,cAAc,yDAAyD,CAAC;AACxE,cAAc,4BAA4B,CAAC;AAC3C,cAAc,0BAA0B,CAAC;AACzC,cAAc,iCAAiC,CAAC;AAEhD,cAAc,8CAA8C,CAAC;AAG7D,cAAc,gCAAgC,CAAC;AAC/C,cAAc,4BAA4B,CAAC;AAC3C,cAAc,iBAAiB,CAAC"}
|
Loading…
Reference in New Issue
Block a user