增加余料归方算法
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的方法,为了对象的序列化和反序列化
|
//对象应该实现dataIn和DataOut的方法,为了对象的序列化和反序列化
|
||||||
//对象从文件中读取数据,初始化自身
|
//对象从文件中读取数据,初始化自身
|
||||||
ReadFile(file) {
|
ReadFile(file) {
|
||||||
file.Read();
|
let ver = file.Read();
|
||||||
this.undoData = file.ReadObject();
|
this.undoData = file.ReadObject();
|
||||||
this.redoData = file.ReadObject();
|
this.redoData = file.ReadObject();
|
||||||
this.userData = file.ReadObject();
|
if (ver === 1)
|
||||||
|
file.ReadObject();
|
||||||
}
|
}
|
||||||
//对象将自身数据写入到文件.
|
//对象将自身数据写入到文件.
|
||||||
WriteFile(file) {
|
WriteFile(file) {
|
||||||
file.Write(1);
|
file.Write(2);
|
||||||
file.WriteObject(this.undoData);
|
file.WriteObject(this.undoData);
|
||||||
file.WriteObject(this.redoData);
|
file.WriteObject(this.redoData);
|
||||||
file.WriteObject(this.userData);
|
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
HistorycRecord = __decorate([
|
HistorycRecord = __decorate([
|
||||||
@ -2780,8 +2780,8 @@ function arrayLast(arr) {
|
|||||||
* @param {Array<T>} arr
|
* @param {Array<T>} arr
|
||||||
* @returns {Array<T>} 返回自身
|
* @returns {Array<T>} 返回自身
|
||||||
*/
|
*/
|
||||||
function arraySortByNumber(arr) {
|
function arraySortByNumber$1(arr) {
|
||||||
arr.sort(sortNumberCompart);
|
arr.sort(sortNumberCompart$1);
|
||||||
return arr;
|
return arr;
|
||||||
}
|
}
|
||||||
/**
|
/**
|
||||||
@ -2799,7 +2799,7 @@ function arrayRemoveDuplicateBySort(arr, checkFuction = checkEqual) {
|
|||||||
arr.length = j;
|
arr.length = j;
|
||||||
return arr;
|
return arr;
|
||||||
}
|
}
|
||||||
function sortNumberCompart(e1, e2) {
|
function sortNumberCompart$1(e1, e2) {
|
||||||
return e1 - e2;
|
return e1 - e2;
|
||||||
}
|
}
|
||||||
function checkEqual(e1, e2) {
|
function checkEqual(e1, e2) {
|
||||||
@ -2828,7 +2828,7 @@ function arrayClone(arr) {
|
|||||||
return arr.slice();
|
return arr.slice();
|
||||||
}
|
}
|
||||||
//https://jsperf.com/merge-array-implementations/30
|
//https://jsperf.com/merge-array-implementations/30
|
||||||
function arrayPushArray(arr1, arr2) {
|
function arrayPushArray$1(arr1, arr2) {
|
||||||
let arr1Length = arr1.length;
|
let arr1Length = arr1.length;
|
||||||
let arr2Length = arr2.length;
|
let arr2Length = arr2.length;
|
||||||
arr1.length = arr1Length + arr2Length;
|
arr1.length = arr1Length + arr2Length;
|
||||||
@ -3548,7 +3548,7 @@ let Curve = class Curve extends Entity {
|
|||||||
if (param.length === 0)
|
if (param.length === 0)
|
||||||
return [];
|
return [];
|
||||||
param.push(0, this.EndParam);
|
param.push(0, this.EndParam);
|
||||||
arraySortByNumber(param);
|
arraySortByNumber$1(param);
|
||||||
arrayRemoveDuplicateBySort(param, (e1, e2) => equaln$1(e1, e2, 1e-7));
|
arrayRemoveDuplicateBySort(param, (e1, e2) => equaln$1(e1, e2, 1e-7));
|
||||||
return param;
|
return param;
|
||||||
}
|
}
|
||||||
@ -4891,7 +4891,7 @@ function SplitCurveParams(cu) {
|
|||||||
if (arc.ParamOnCurve(param))
|
if (arc.ParamOnCurve(param))
|
||||||
params.push(param);
|
params.push(param);
|
||||||
}
|
}
|
||||||
arraySortByNumber(params);
|
arraySortByNumber$1(params);
|
||||||
if (params.length === 0)
|
if (params.length === 0)
|
||||||
continue;
|
continue;
|
||||||
for (let p of params) {
|
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/
|
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).
|
// To find orientation of ordered triplet (p, q, r).
|
||||||
// The function returns following values
|
// The function returns following values
|
||||||
// 0 --> p, q and r are colinear
|
// 0 --> p, q and r are colinear
|
||||||
@ -5034,6 +5042,34 @@ function orientation(p, q, r) {
|
|||||||
return 0; // colinear
|
return 0; // colinear
|
||||||
return (val > 0) ? 1 : 2; // clock or counterclock wise
|
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) {
|
function SplineConver2Polyline(spl, tolerance = 0.1) {
|
||||||
let cu = spl.Shape;
|
let cu = spl.Shape;
|
||||||
@ -5576,7 +5612,7 @@ class CurveIntersection {
|
|||||||
arr = [];
|
arr = [];
|
||||||
this.intersect2.set(curve, arr);
|
this.intersect2.set(curve, arr);
|
||||||
}
|
}
|
||||||
arrayPushArray(arr, params);
|
arrayPushArray$1(arr, params);
|
||||||
}
|
}
|
||||||
GenBox(cus) {
|
GenBox(cus) {
|
||||||
for (let c of cus)
|
for (let c of cus)
|
||||||
@ -5989,7 +6025,7 @@ function CreateContours(curves, fuzz = 1e-4) {
|
|||||||
if (cu instanceof exports.Circle)
|
if (cu instanceof exports.Circle)
|
||||||
contours.push(Contour.CreateContour(cu.Clone())); //避免将原始曲线传递给板,导致撤销这个圆失败
|
contours.push(Contour.CreateContour(cu.Clone())); //避免将原始曲线传递给板,导致撤销这个圆失败
|
||||||
else if (cu instanceof exports.Polyline)
|
else if (cu instanceof exports.Polyline)
|
||||||
arrayPushArray(newCurves, cu.Explode());
|
arrayPushArray$1(newCurves, cu.Explode());
|
||||||
else if (cu instanceof Spline) {
|
else if (cu instanceof Spline) {
|
||||||
let pl = cu.Convert2Polyline();
|
let pl = cu.Convert2Polyline();
|
||||||
if (pl.IsClose)
|
if (pl.IsClose)
|
||||||
@ -6015,7 +6051,7 @@ function CreateContours(curves, fuzz = 1e-4) {
|
|||||||
let isClose = cu.IsClose;
|
let isClose = cu.IsClose;
|
||||||
let ipts = [];
|
let ipts = [];
|
||||||
for (let [, pts] of pmap) {
|
for (let [, pts] of pmap) {
|
||||||
arrayPushArray(ipts, pts);
|
arrayPushArray$1(ipts, pts);
|
||||||
if (!isClose)
|
if (!isClose)
|
||||||
for (let p of pts) {
|
for (let p of pts) {
|
||||||
let d = p.distanceToSquared(ep);
|
let d = p.distanceToSquared(ep);
|
||||||
@ -6052,11 +6088,11 @@ function CreateContours(curves, fuzz = 1e-4) {
|
|||||||
let tempCus = [];
|
let tempCus = [];
|
||||||
for (let c of curves) {
|
for (let c of curves) {
|
||||||
if (c instanceof exports.Polyline)
|
if (c instanceof exports.Polyline)
|
||||||
arrayPushArray(tempCus, c.Explode());
|
arrayPushArray$1(tempCus, c.Explode());
|
||||||
else
|
else
|
||||||
tempCus.push(c);
|
tempCus.push(c);
|
||||||
}
|
}
|
||||||
arrayPushArray(curves2, tempCus);
|
arrayPushArray$1(curves2, tempCus);
|
||||||
}
|
}
|
||||||
let parse = new RegionParse(curves2);
|
let parse = new RegionParse(curves2);
|
||||||
for (let rs of parse.RegionsOutline) {
|
for (let rs of parse.RegionsOutline) {
|
||||||
@ -11988,12 +12024,6 @@ function CyHoleInBoard(cys, br, ocs, checkAll = false) {
|
|||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
const TempRectHoleOption = {
|
|
||||||
up: "",
|
|
||||||
down: "",
|
|
||||||
left: "",
|
|
||||||
right: "",
|
|
||||||
};
|
|
||||||
/**分析上下左右排钻 */
|
/**分析上下左右排钻 */
|
||||||
function ParseBoardRectHoleType(br, outBrRectHoleType = {}) {
|
function ParseBoardRectHoleType(br, outBrRectHoleType = {}) {
|
||||||
let dir = Math.sign(br.ContourCurve.Area2);
|
let dir = Math.sign(br.ContourCurve.Area2);
|
||||||
@ -12824,7 +12854,7 @@ const DefaultClosingStripOption = {
|
|||||||
};
|
};
|
||||||
Object.freeze(DefaultClosingStripOption);
|
Object.freeze(DefaultClosingStripOption);
|
||||||
const DefaultBoardFindOption = {
|
const DefaultBoardFindOption = {
|
||||||
version: 7,
|
version: 8,
|
||||||
condition: {
|
condition: {
|
||||||
layer: false,
|
layer: false,
|
||||||
height: false,
|
height: false,
|
||||||
@ -12848,6 +12878,7 @@ const DefaultBoardFindOption = {
|
|||||||
useKeyWord: false,
|
useKeyWord: false,
|
||||||
addRemarks: false,
|
addRemarks: false,
|
||||||
composingFace: false,
|
composingFace: false,
|
||||||
|
openDir: false,
|
||||||
sealedUp: false,
|
sealedUp: false,
|
||||||
sealedDown: false,
|
sealedDown: false,
|
||||||
sealedLeft: false,
|
sealedLeft: false,
|
||||||
@ -12875,6 +12906,7 @@ const DefaultBoardFindOption = {
|
|||||||
bigHoleDir: ECompareType.Equal,
|
bigHoleDir: ECompareType.Equal,
|
||||||
drillType: ECompareType.Equal,
|
drillType: ECompareType.Equal,
|
||||||
composingFace: ECompareType.Equal,
|
composingFace: ECompareType.Equal,
|
||||||
|
openDir: ECompareType.Equal,
|
||||||
[EBoardKeyList.KnifeRad]: ECompareType.Equal,
|
[EBoardKeyList.KnifeRad]: ECompareType.Equal,
|
||||||
},
|
},
|
||||||
tolerance: {
|
tolerance: {
|
||||||
@ -12898,6 +12930,8 @@ const DefaultBoardFindOption = {
|
|||||||
bigHoleDir: FaceDirection.Front,
|
bigHoleDir: FaceDirection.Front,
|
||||||
drillType: "",
|
drillType: "",
|
||||||
composingFace: ComposingType.Positive,
|
composingFace: ComposingType.Positive,
|
||||||
|
openDir: BoardOpenDir.None,
|
||||||
|
hardwareDoorName: "",
|
||||||
sealedUp: "",
|
sealedUp: "",
|
||||||
sealedDown: "",
|
sealedDown: "",
|
||||||
sealedLeft: "",
|
sealedLeft: "",
|
||||||
@ -12989,9 +13023,9 @@ const DefaultDoorOption = {
|
|||||||
lbSealedLeft: 1,
|
lbSealedLeft: 1,
|
||||||
lbSealedRight: 1,
|
lbSealedRight: 1,
|
||||||
lbHightDrillOption: { up: "", down: "", left: "", right: "" },
|
lbHightDrillOption: { up: "", down: "", left: "", right: "" },
|
||||||
deviation: 100,
|
|
||||||
useBoardProcessOption: true,
|
useBoardProcessOption: true,
|
||||||
isModifyHardwareMaterial: false,
|
isModifyHardwareMaterial: false,
|
||||||
|
deviation: 100 //偏移量
|
||||||
};
|
};
|
||||||
Object.freeze(DefaultDoorOption);
|
Object.freeze(DefaultDoorOption);
|
||||||
const DefaultHingeOption = {
|
const DefaultHingeOption = {
|
||||||
@ -15242,7 +15276,7 @@ class ContourTreeNode {
|
|||||||
let holes = this.children.map(h => {
|
let holes = this.children.map(h => {
|
||||||
// TestDraw(h.contour.Curve, depth + 1);
|
// TestDraw(h.contour.Curve, depth + 1);
|
||||||
let pts = h.contour.Curve.GetStretchPoints();
|
let pts = h.contour.Curve.GetStretchPoints();
|
||||||
arrayPushArray(vertices, pts);
|
arrayPushArray$1(vertices, pts);
|
||||||
return pts;
|
return pts;
|
||||||
});
|
});
|
||||||
let faces = three.ShapeUtils.triangulateShape(pts, holes);
|
let faces = three.ShapeUtils.triangulateShape(pts, holes);
|
||||||
@ -15519,7 +15553,7 @@ class CurveTape {
|
|||||||
let xparams = SplitCurveParams(this.contour.Curve);
|
let xparams = SplitCurveParams(this.contour.Curve);
|
||||||
if (this.splitParams.length > 0) {
|
if (this.splitParams.length > 0) {
|
||||||
xparams.push(...this.splitParams);
|
xparams.push(...this.splitParams);
|
||||||
arraySortByNumber(xparams);
|
arraySortByNumber$1(xparams);
|
||||||
arrayRemoveDuplicateBySort(xparams, (p1, p2) => equaln$1(p1, p2));
|
arrayRemoveDuplicateBySort(xparams, (p1, p2) => equaln$1(p1, p2));
|
||||||
}
|
}
|
||||||
let polylines = [];
|
let polylines = [];
|
||||||
@ -15896,7 +15930,7 @@ function SubtractRange(orgStart, orgEnd, clipStart, clipEnd, end) {
|
|||||||
let arr = SubtractRange(orgStart, orgEnd, clipStart, end, end);
|
let arr = SubtractRange(orgStart, orgEnd, clipStart, end, end);
|
||||||
let rem = [];
|
let rem = [];
|
||||||
for (let s of arr)
|
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;
|
return rem;
|
||||||
}
|
}
|
||||||
if (clipStart >= orgEnd || clipEnd <= orgStart)
|
if (clipStart >= orgEnd || clipEnd <= orgStart)
|
||||||
@ -15919,7 +15953,7 @@ function SubtractRanges(ranges, subRanges, end) {
|
|||||||
for (let sr of subRanges) {
|
for (let sr of subRanges) {
|
||||||
let temps = [];
|
let temps = [];
|
||||||
for (let r of rets)
|
for (let r of rets)
|
||||||
arrayPushArray(temps, SubtractRange2(r, sr, end));
|
arrayPushArray$1(temps, SubtractRange2(r, sr, end));
|
||||||
rets = temps;
|
rets = temps;
|
||||||
}
|
}
|
||||||
return rets;
|
return rets;
|
||||||
@ -16077,7 +16111,7 @@ function GetIntersection(cu1, cu2) {
|
|||||||
else
|
else
|
||||||
m = new Map();
|
m = new Map();
|
||||||
intCache.set(cu1, m);
|
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 cu1EndParam = cu1.EndParam;
|
||||||
let cu2EndParam = cu2.EndParam;
|
let cu2EndParam = cu2.EndParam;
|
||||||
for (let d of r) {
|
for (let d of r) {
|
||||||
@ -16582,7 +16616,7 @@ let ExtrudeSolid = ExtrudeSolid_1 = class ExtrudeSolid extends Entity {
|
|||||||
let isEqualNorm = equalv3(n, tn);
|
let isEqualNorm = equalv3(n, tn);
|
||||||
let targetZMin = target.Position.applyMatrix4(this.OCSInv).z;
|
let targetZMin = target.Position.applyMatrix4(this.OCSInv).z;
|
||||||
let targetZMax = targetZMin + target.Thickness * (isEqualNorm ? 1 : -1);
|
let targetZMax = targetZMin + target.Thickness * (isEqualNorm ? 1 : -1);
|
||||||
[targetZMin, targetZMax] = arraySortByNumber([targetZMin, targetZMax]);
|
[targetZMin, targetZMax] = arraySortByNumber$1([targetZMin, targetZMax]);
|
||||||
const MergeRelevance = () => {
|
const MergeRelevance = () => {
|
||||||
if (!this.Id || !target.Id)
|
if (!this.Id || !target.Id)
|
||||||
return;
|
return;
|
||||||
@ -16775,7 +16809,7 @@ let ExtrudeSolid = ExtrudeSolid_1 = class ExtrudeSolid extends Entity {
|
|||||||
this.Position = this.Position.add(vec);
|
this.Position = this.Position.add(vec);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
arraySortByNumber(indexList);
|
arraySortByNumber$1(indexList);
|
||||||
let updateBak = this.AutoUpdate;
|
let updateBak = this.AutoUpdate;
|
||||||
this.AutoUpdate = false;
|
this.AutoUpdate = false;
|
||||||
if (this.grooves.length === 0) {
|
if (this.grooves.length === 0) {
|
||||||
@ -17310,6 +17344,9 @@ let ExtrudeSolid = ExtrudeSolid_1 = class ExtrudeSolid extends Entity {
|
|||||||
this._MeshGeometry["IsMesh"] = true;
|
this._MeshGeometry["IsMesh"] = true;
|
||||||
this._EdgeGeometry = BufferGeometryUtils.MergeBufferGeometries(edges);
|
this._EdgeGeometry = BufferGeometryUtils.MergeBufferGeometries(edges);
|
||||||
}
|
}
|
||||||
|
//因为这里更新了mesh geom 所以我们必须更新它.
|
||||||
|
this._MeshGeometry = this.UpdateMeshGeom(this._MeshGeometry);
|
||||||
|
this._MeshGeometry["IsMesh"] = true;
|
||||||
//我们加入一些拓展信息,以便排钻能够使用(或者其他的,比如发送到效果图?,BBS)(布局视口会直接添加实体到场景,所以我们只在这里设置OriginEntity)
|
//我们加入一些拓展信息,以便排钻能够使用(或者其他的,比如发送到效果图?,BBS)(布局视口会直接添加实体到场景,所以我们只在这里设置OriginEntity)
|
||||||
for (let i = 0; i < this.__CacheSplitExtrudes.length; i++) {
|
for (let i = 0; i < this.__CacheSplitExtrudes.length; i++) {
|
||||||
this.__CacheSplitExtrudes[i].objectId = new ObjectId(this.Id.Index * -100 - 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)
|
if (this.thickness <= 0)
|
||||||
return new three.BufferGeometry();
|
return new three.BufferGeometry();
|
||||||
this.CalcRelevanceGroove();
|
this.CalcRelevanceGroove();
|
||||||
if (this._MeshGeometry) {
|
if (this._MeshGeometry)
|
||||||
//修复二维刀路更新(在有关联切割的情况下)
|
|
||||||
this._MeshGeometry = this.UpdateMeshGeom(this._MeshGeometry);
|
|
||||||
this._MeshGeometry["IsMesh"] = true;
|
|
||||||
return this._MeshGeometry;
|
return this._MeshGeometry;
|
||||||
}
|
|
||||||
this._EdgeGeometry = undefined; //清理掉(以便在被csg切割后得到edgegeom)
|
this._EdgeGeometry = undefined; //清理掉(以便在被csg切割后得到edgegeom)
|
||||||
let grooves = this.Grooves;
|
let grooves = this.Grooves;
|
||||||
if (grooves.every(g => equaln$1(g.thickness, this.thickness)) || grooves.length === 0) {
|
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() {
|
get EdgeGeometry() {
|
||||||
if (this._EdgeGeometry)
|
if (this._EdgeGeometry)
|
||||||
return this._EdgeGeometry;
|
return this._EdgeGeometry;
|
||||||
let oldMeshGeom = this._MeshGeometry;
|
this.CalcRelevanceGroove();
|
||||||
{
|
|
||||||
this.CalcRelevanceGroove();
|
|
||||||
//修复二维刀路更新(在有关联切割的情况下)
|
|
||||||
if (this._MeshGeometry && this._MeshGeometry !== oldMeshGeom) {
|
|
||||||
this._MeshGeometry = this.UpdateMeshGeom(this._MeshGeometry);
|
|
||||||
this._MeshGeometry["IsMesh"] = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (this._EdgeGeometry)
|
if (this._EdgeGeometry)
|
||||||
return this._EdgeGeometry;
|
return this._EdgeGeometry;
|
||||||
//这里我们超过100就用这个,为了性能 和MaxDrawGrooveCount不一致
|
//这里我们超过100就用这个,为了性能 和MaxDrawGrooveCount不一致
|
||||||
@ -17819,7 +17844,7 @@ let CompositeEntity = CompositeEntity_1 = class CompositeEntity extends Entity {
|
|||||||
GetObjectSnapPoints(snapMode, pickPoint, lastPoint, viewXform) {
|
GetObjectSnapPoints(snapMode, pickPoint, lastPoint, viewXform) {
|
||||||
let pts = [];
|
let pts = [];
|
||||||
for (let e of this.Entitys)
|
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;
|
return pts;
|
||||||
}
|
}
|
||||||
GetGripPoints() {
|
GetGripPoints() {
|
||||||
@ -17865,7 +17890,7 @@ let CompositeEntity = CompositeEntity_1 = class CompositeEntity extends Entity {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
vec = vec.clone().applyMatrix4(this.OCSInv.setPosition(0, 0, 0));
|
vec = vec.clone().applyMatrix4(this.OCSInv.setPosition(0, 0, 0));
|
||||||
arraySortByNumber(indexList);
|
arraySortByNumber$1(indexList);
|
||||||
let i = 0;
|
let i = 0;
|
||||||
let j = 0;
|
let j = 0;
|
||||||
let icount = indexList.length;
|
let icount = indexList.length;
|
||||||
@ -19945,8 +19970,8 @@ let Board = Board_1 = class Board extends ExtrudeSolid {
|
|||||||
* 异形->矩形
|
* 异形->矩形
|
||||||
*/
|
*/
|
||||||
//上下左右排钻属性(在矩形时生效)
|
//上下左右排钻属性(在矩形时生效)
|
||||||
TempRectHoleOption.up = undefined;
|
let rectHoleOpt = {};
|
||||||
ParseBoardRectHoleType(this, TempRectHoleOption); //分析旧的上下左右排钻
|
ParseBoardRectHoleType(this, rectHoleOpt); //分析旧的上下左右排钻
|
||||||
let oldHightSealCurves = GetBoardSealingCurves(this); //旧的封边轮廓
|
let oldHightSealCurves = GetBoardSealingCurves(this); //旧的封边轮廓
|
||||||
let oldHightSealDatas = GetBoardHighSeal(this, oldHightSealCurves); //旧的封边数据
|
let oldHightSealDatas = GetBoardHighSeal(this, oldHightSealCurves); //旧的封边数据
|
||||||
let oldContour = this.ContourCurve; //旧的轮廓
|
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;
|
defaultDrillType = HostApplicationServices.DrillConfigs.size ? HostApplicationServices.DrillConfigs.entries().next().value[0] : DrillType.None;
|
||||||
super.ContourCurve = newContour; //设置新的轮廓
|
super.ContourCurve = newContour; //设置新的轮廓
|
||||||
//保持排钻边属性
|
//保持排钻边属性
|
||||||
if (this.isRect && TempRectHoleOption.up) //矩形->矩形
|
if (this.isRect && rectHoleOpt.up) //矩形->矩形
|
||||||
SetBrHighHoleTypeFromRectHoleType(this, TempRectHoleOption); //直接应用旧的矩形数据
|
SetBrHighHoleTypeFromRectHoleType(this, rectHoleOpt); //直接应用旧的矩形数据
|
||||||
else //异形->矩形 矩形->异形 异形->异形
|
else //异形->矩形 矩形->异形 异形->异形
|
||||||
{
|
{
|
||||||
let indexMap = [];
|
let indexMap = [];
|
||||||
@ -20510,7 +20535,7 @@ let Board = Board_1 = class Board extends ExtrudeSolid {
|
|||||||
super.MoveStretchPoints(originIndexList, vec);
|
super.MoveStretchPoints(originIndexList, vec);
|
||||||
if (!this.Id)
|
if (!this.Id)
|
||||||
return;
|
return;
|
||||||
arraySortByNumber(mIndexList);
|
arraySortByNumber$1(mIndexList);
|
||||||
let ocsInv = this.OCSInv;
|
let ocsInv = this.OCSInv;
|
||||||
let localVec = TransformVector(vec.clone(), ocsInv);
|
let localVec = TransformVector(vec.clone(), ocsInv);
|
||||||
let offset = 0;
|
let offset = 0;
|
||||||
@ -20866,7 +20891,7 @@ function FastWireframe2(dr, color = 0) {
|
|||||||
function GenerateExtrudeEdgeGeometry(contourPoints, height) {
|
function GenerateExtrudeEdgeGeometry(contourPoints, height) {
|
||||||
let pts = [];
|
let pts = [];
|
||||||
for (let cs of contourPoints)
|
for (let cs of contourPoints)
|
||||||
arrayPushArray(pts, GenerateExtrudeEdgeGeometryPoints(cs, height));
|
arrayPushArray$1(pts, GenerateExtrudeEdgeGeometryPoints(cs, height));
|
||||||
let geo = new three.BufferGeometry().setFromPoints(pts);
|
let geo = new three.BufferGeometry().setFromPoints(pts);
|
||||||
return geo;
|
return geo;
|
||||||
}
|
}
|
||||||
@ -21051,7 +21076,7 @@ let ExtrudeHole = class ExtrudeHole extends Hole {
|
|||||||
this.Position = this.Position.add(vec);
|
this.Position = this.Position.add(vec);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
arraySortByNumber(indexList);
|
arraySortByNumber$1(indexList);
|
||||||
this.MoveGripOrStretchPointsOnly(indexList, vec, dragType);
|
this.MoveGripOrStretchPointsOnly(indexList, vec, dragType);
|
||||||
this.CheckContourCurve();
|
this.CheckContourCurve();
|
||||||
this.Update();
|
this.Update();
|
||||||
@ -22874,6 +22899,473 @@ function ParseRegionTextPos(contour, holes) {
|
|||||||
return p;
|
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) {
|
function Circle2Points(circle, knifRadius, splitSize = 10, outside = false) {
|
||||||
let radius = circle.Radius;
|
let radius = circle.Radius;
|
||||||
@ -23050,6 +23542,7 @@ class CurveWrap {
|
|||||||
this.IsOutside = IsOutside;
|
this.IsOutside = IsOutside;
|
||||||
this.Used = false;
|
this.Used = false;
|
||||||
this.Holes = [];
|
this.Holes = [];
|
||||||
|
this._OrgCurve = Curve;
|
||||||
this.BoundingBox = Curve.BoundingBox;
|
this.BoundingBox = Curve.BoundingBox;
|
||||||
if (Curve instanceof exports.Polyline) {
|
if (Curve instanceof exports.Polyline) {
|
||||||
let pts = Polyline2Points(Curve, IsOutside, 0)[1];
|
let pts = Polyline2Points(Curve, IsOutside, 0)[1];
|
||||||
@ -23129,6 +23622,7 @@ exports.Curves2Points = Curves2Points;
|
|||||||
exports.FeedingToolPath = FeedingToolPath;
|
exports.FeedingToolPath = FeedingToolPath;
|
||||||
exports.IsPtsAllOutOrOnReg = IsPtsAllOutOrOnReg;
|
exports.IsPtsAllOutOrOnReg = IsPtsAllOutOrOnReg;
|
||||||
exports.IsRect = IsRect;
|
exports.IsRect = IsRect;
|
||||||
|
exports.LargestInteriorRectangle = LargestInteriorRectangle;
|
||||||
exports.ParseRegionTextPos = ParseRegionTextPos;
|
exports.ParseRegionTextPos = ParseRegionTextPos;
|
||||||
exports.PointsSimplify2PolylineAndParseArc = PointsSimplify2PolylineAndParseArc;
|
exports.PointsSimplify2PolylineAndParseArc = PointsSimplify2PolylineAndParseArc;
|
||||||
exports.Polyline2Points = Polyline2Points;
|
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的方法,为了对象的序列化和反序列化
|
//对象应该实现dataIn和DataOut的方法,为了对象的序列化和反序列化
|
||||||
//对象从文件中读取数据,初始化自身
|
//对象从文件中读取数据,初始化自身
|
||||||
ReadFile(file) {
|
ReadFile(file) {
|
||||||
file.Read();
|
let ver = file.Read();
|
||||||
this.undoData = file.ReadObject();
|
this.undoData = file.ReadObject();
|
||||||
this.redoData = file.ReadObject();
|
this.redoData = file.ReadObject();
|
||||||
this.userData = file.ReadObject();
|
if (ver === 1)
|
||||||
|
file.ReadObject();
|
||||||
}
|
}
|
||||||
//对象将自身数据写入到文件.
|
//对象将自身数据写入到文件.
|
||||||
WriteFile(file) {
|
WriteFile(file) {
|
||||||
file.Write(1);
|
file.Write(2);
|
||||||
file.WriteObject(this.undoData);
|
file.WriteObject(this.undoData);
|
||||||
file.WriteObject(this.redoData);
|
file.WriteObject(this.redoData);
|
||||||
file.WriteObject(this.userData);
|
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
HistorycRecord = __decorate([
|
HistorycRecord = __decorate([
|
||||||
@ -2771,8 +2771,8 @@ function arrayLast(arr) {
|
|||||||
* @param {Array<T>} arr
|
* @param {Array<T>} arr
|
||||||
* @returns {Array<T>} 返回自身
|
* @returns {Array<T>} 返回自身
|
||||||
*/
|
*/
|
||||||
function arraySortByNumber(arr) {
|
function arraySortByNumber$1(arr) {
|
||||||
arr.sort(sortNumberCompart);
|
arr.sort(sortNumberCompart$1);
|
||||||
return arr;
|
return arr;
|
||||||
}
|
}
|
||||||
/**
|
/**
|
||||||
@ -2790,7 +2790,7 @@ function arrayRemoveDuplicateBySort(arr, checkFuction = checkEqual) {
|
|||||||
arr.length = j;
|
arr.length = j;
|
||||||
return arr;
|
return arr;
|
||||||
}
|
}
|
||||||
function sortNumberCompart(e1, e2) {
|
function sortNumberCompart$1(e1, e2) {
|
||||||
return e1 - e2;
|
return e1 - e2;
|
||||||
}
|
}
|
||||||
function checkEqual(e1, e2) {
|
function checkEqual(e1, e2) {
|
||||||
@ -2819,7 +2819,7 @@ function arrayClone(arr) {
|
|||||||
return arr.slice();
|
return arr.slice();
|
||||||
}
|
}
|
||||||
//https://jsperf.com/merge-array-implementations/30
|
//https://jsperf.com/merge-array-implementations/30
|
||||||
function arrayPushArray(arr1, arr2) {
|
function arrayPushArray$1(arr1, arr2) {
|
||||||
let arr1Length = arr1.length;
|
let arr1Length = arr1.length;
|
||||||
let arr2Length = arr2.length;
|
let arr2Length = arr2.length;
|
||||||
arr1.length = arr1Length + arr2Length;
|
arr1.length = arr1Length + arr2Length;
|
||||||
@ -3539,7 +3539,7 @@ let Curve = class Curve extends Entity {
|
|||||||
if (param.length === 0)
|
if (param.length === 0)
|
||||||
return [];
|
return [];
|
||||||
param.push(0, this.EndParam);
|
param.push(0, this.EndParam);
|
||||||
arraySortByNumber(param);
|
arraySortByNumber$1(param);
|
||||||
arrayRemoveDuplicateBySort(param, (e1, e2) => equaln$1(e1, e2, 1e-7));
|
arrayRemoveDuplicateBySort(param, (e1, e2) => equaln$1(e1, e2, 1e-7));
|
||||||
return param;
|
return param;
|
||||||
}
|
}
|
||||||
@ -4882,7 +4882,7 @@ function SplitCurveParams(cu) {
|
|||||||
if (arc.ParamOnCurve(param))
|
if (arc.ParamOnCurve(param))
|
||||||
params.push(param);
|
params.push(param);
|
||||||
}
|
}
|
||||||
arraySortByNumber(params);
|
arraySortByNumber$1(params);
|
||||||
if (params.length === 0)
|
if (params.length === 0)
|
||||||
continue;
|
continue;
|
||||||
for (let p of params) {
|
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/
|
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).
|
// To find orientation of ordered triplet (p, q, r).
|
||||||
// The function returns following values
|
// The function returns following values
|
||||||
// 0 --> p, q and r are colinear
|
// 0 --> p, q and r are colinear
|
||||||
@ -5025,6 +5033,34 @@ function orientation(p, q, r) {
|
|||||||
return 0; // colinear
|
return 0; // colinear
|
||||||
return (val > 0) ? 1 : 2; // clock or counterclock wise
|
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) {
|
function SplineConver2Polyline(spl, tolerance = 0.1) {
|
||||||
let cu = spl.Shape;
|
let cu = spl.Shape;
|
||||||
@ -5567,7 +5603,7 @@ class CurveIntersection {
|
|||||||
arr = [];
|
arr = [];
|
||||||
this.intersect2.set(curve, arr);
|
this.intersect2.set(curve, arr);
|
||||||
}
|
}
|
||||||
arrayPushArray(arr, params);
|
arrayPushArray$1(arr, params);
|
||||||
}
|
}
|
||||||
GenBox(cus) {
|
GenBox(cus) {
|
||||||
for (let c of cus)
|
for (let c of cus)
|
||||||
@ -5980,7 +6016,7 @@ function CreateContours(curves, fuzz = 1e-4) {
|
|||||||
if (cu instanceof Circle)
|
if (cu instanceof Circle)
|
||||||
contours.push(Contour.CreateContour(cu.Clone())); //避免将原始曲线传递给板,导致撤销这个圆失败
|
contours.push(Contour.CreateContour(cu.Clone())); //避免将原始曲线传递给板,导致撤销这个圆失败
|
||||||
else if (cu instanceof Polyline)
|
else if (cu instanceof Polyline)
|
||||||
arrayPushArray(newCurves, cu.Explode());
|
arrayPushArray$1(newCurves, cu.Explode());
|
||||||
else if (cu instanceof Spline) {
|
else if (cu instanceof Spline) {
|
||||||
let pl = cu.Convert2Polyline();
|
let pl = cu.Convert2Polyline();
|
||||||
if (pl.IsClose)
|
if (pl.IsClose)
|
||||||
@ -6006,7 +6042,7 @@ function CreateContours(curves, fuzz = 1e-4) {
|
|||||||
let isClose = cu.IsClose;
|
let isClose = cu.IsClose;
|
||||||
let ipts = [];
|
let ipts = [];
|
||||||
for (let [, pts] of pmap) {
|
for (let [, pts] of pmap) {
|
||||||
arrayPushArray(ipts, pts);
|
arrayPushArray$1(ipts, pts);
|
||||||
if (!isClose)
|
if (!isClose)
|
||||||
for (let p of pts) {
|
for (let p of pts) {
|
||||||
let d = p.distanceToSquared(ep);
|
let d = p.distanceToSquared(ep);
|
||||||
@ -6043,11 +6079,11 @@ function CreateContours(curves, fuzz = 1e-4) {
|
|||||||
let tempCus = [];
|
let tempCus = [];
|
||||||
for (let c of curves) {
|
for (let c of curves) {
|
||||||
if (c instanceof Polyline)
|
if (c instanceof Polyline)
|
||||||
arrayPushArray(tempCus, c.Explode());
|
arrayPushArray$1(tempCus, c.Explode());
|
||||||
else
|
else
|
||||||
tempCus.push(c);
|
tempCus.push(c);
|
||||||
}
|
}
|
||||||
arrayPushArray(curves2, tempCus);
|
arrayPushArray$1(curves2, tempCus);
|
||||||
}
|
}
|
||||||
let parse = new RegionParse(curves2);
|
let parse = new RegionParse(curves2);
|
||||||
for (let rs of parse.RegionsOutline) {
|
for (let rs of parse.RegionsOutline) {
|
||||||
@ -11979,12 +12015,6 @@ function CyHoleInBoard(cys, br, ocs, checkAll = false) {
|
|||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
const TempRectHoleOption = {
|
|
||||||
up: "",
|
|
||||||
down: "",
|
|
||||||
left: "",
|
|
||||||
right: "",
|
|
||||||
};
|
|
||||||
/**分析上下左右排钻 */
|
/**分析上下左右排钻 */
|
||||||
function ParseBoardRectHoleType(br, outBrRectHoleType = {}) {
|
function ParseBoardRectHoleType(br, outBrRectHoleType = {}) {
|
||||||
let dir = Math.sign(br.ContourCurve.Area2);
|
let dir = Math.sign(br.ContourCurve.Area2);
|
||||||
@ -12815,7 +12845,7 @@ const DefaultClosingStripOption = {
|
|||||||
};
|
};
|
||||||
Object.freeze(DefaultClosingStripOption);
|
Object.freeze(DefaultClosingStripOption);
|
||||||
const DefaultBoardFindOption = {
|
const DefaultBoardFindOption = {
|
||||||
version: 7,
|
version: 8,
|
||||||
condition: {
|
condition: {
|
||||||
layer: false,
|
layer: false,
|
||||||
height: false,
|
height: false,
|
||||||
@ -12839,6 +12869,7 @@ const DefaultBoardFindOption = {
|
|||||||
useKeyWord: false,
|
useKeyWord: false,
|
||||||
addRemarks: false,
|
addRemarks: false,
|
||||||
composingFace: false,
|
composingFace: false,
|
||||||
|
openDir: false,
|
||||||
sealedUp: false,
|
sealedUp: false,
|
||||||
sealedDown: false,
|
sealedDown: false,
|
||||||
sealedLeft: false,
|
sealedLeft: false,
|
||||||
@ -12866,6 +12897,7 @@ const DefaultBoardFindOption = {
|
|||||||
bigHoleDir: ECompareType.Equal,
|
bigHoleDir: ECompareType.Equal,
|
||||||
drillType: ECompareType.Equal,
|
drillType: ECompareType.Equal,
|
||||||
composingFace: ECompareType.Equal,
|
composingFace: ECompareType.Equal,
|
||||||
|
openDir: ECompareType.Equal,
|
||||||
[EBoardKeyList.KnifeRad]: ECompareType.Equal,
|
[EBoardKeyList.KnifeRad]: ECompareType.Equal,
|
||||||
},
|
},
|
||||||
tolerance: {
|
tolerance: {
|
||||||
@ -12889,6 +12921,8 @@ const DefaultBoardFindOption = {
|
|||||||
bigHoleDir: FaceDirection.Front,
|
bigHoleDir: FaceDirection.Front,
|
||||||
drillType: "",
|
drillType: "",
|
||||||
composingFace: ComposingType.Positive,
|
composingFace: ComposingType.Positive,
|
||||||
|
openDir: BoardOpenDir.None,
|
||||||
|
hardwareDoorName: "",
|
||||||
sealedUp: "",
|
sealedUp: "",
|
||||||
sealedDown: "",
|
sealedDown: "",
|
||||||
sealedLeft: "",
|
sealedLeft: "",
|
||||||
@ -12980,9 +13014,9 @@ const DefaultDoorOption = {
|
|||||||
lbSealedLeft: 1,
|
lbSealedLeft: 1,
|
||||||
lbSealedRight: 1,
|
lbSealedRight: 1,
|
||||||
lbHightDrillOption: { up: "", down: "", left: "", right: "" },
|
lbHightDrillOption: { up: "", down: "", left: "", right: "" },
|
||||||
deviation: 100,
|
|
||||||
useBoardProcessOption: true,
|
useBoardProcessOption: true,
|
||||||
isModifyHardwareMaterial: false,
|
isModifyHardwareMaterial: false,
|
||||||
|
deviation: 100 //偏移量
|
||||||
};
|
};
|
||||||
Object.freeze(DefaultDoorOption);
|
Object.freeze(DefaultDoorOption);
|
||||||
const DefaultHingeOption = {
|
const DefaultHingeOption = {
|
||||||
@ -15233,7 +15267,7 @@ class ContourTreeNode {
|
|||||||
let holes = this.children.map(h => {
|
let holes = this.children.map(h => {
|
||||||
// TestDraw(h.contour.Curve, depth + 1);
|
// TestDraw(h.contour.Curve, depth + 1);
|
||||||
let pts = h.contour.Curve.GetStretchPoints();
|
let pts = h.contour.Curve.GetStretchPoints();
|
||||||
arrayPushArray(vertices, pts);
|
arrayPushArray$1(vertices, pts);
|
||||||
return pts;
|
return pts;
|
||||||
});
|
});
|
||||||
let faces = ShapeUtils.triangulateShape(pts, holes);
|
let faces = ShapeUtils.triangulateShape(pts, holes);
|
||||||
@ -15510,7 +15544,7 @@ class CurveTape {
|
|||||||
let xparams = SplitCurveParams(this.contour.Curve);
|
let xparams = SplitCurveParams(this.contour.Curve);
|
||||||
if (this.splitParams.length > 0) {
|
if (this.splitParams.length > 0) {
|
||||||
xparams.push(...this.splitParams);
|
xparams.push(...this.splitParams);
|
||||||
arraySortByNumber(xparams);
|
arraySortByNumber$1(xparams);
|
||||||
arrayRemoveDuplicateBySort(xparams, (p1, p2) => equaln$1(p1, p2));
|
arrayRemoveDuplicateBySort(xparams, (p1, p2) => equaln$1(p1, p2));
|
||||||
}
|
}
|
||||||
let polylines = [];
|
let polylines = [];
|
||||||
@ -15887,7 +15921,7 @@ function SubtractRange(orgStart, orgEnd, clipStart, clipEnd, end) {
|
|||||||
let arr = SubtractRange(orgStart, orgEnd, clipStart, end, end);
|
let arr = SubtractRange(orgStart, orgEnd, clipStart, end, end);
|
||||||
let rem = [];
|
let rem = [];
|
||||||
for (let s of arr)
|
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;
|
return rem;
|
||||||
}
|
}
|
||||||
if (clipStart >= orgEnd || clipEnd <= orgStart)
|
if (clipStart >= orgEnd || clipEnd <= orgStart)
|
||||||
@ -15910,7 +15944,7 @@ function SubtractRanges(ranges, subRanges, end) {
|
|||||||
for (let sr of subRanges) {
|
for (let sr of subRanges) {
|
||||||
let temps = [];
|
let temps = [];
|
||||||
for (let r of rets)
|
for (let r of rets)
|
||||||
arrayPushArray(temps, SubtractRange2(r, sr, end));
|
arrayPushArray$1(temps, SubtractRange2(r, sr, end));
|
||||||
rets = temps;
|
rets = temps;
|
||||||
}
|
}
|
||||||
return rets;
|
return rets;
|
||||||
@ -16068,7 +16102,7 @@ function GetIntersection(cu1, cu2) {
|
|||||||
else
|
else
|
||||||
m = new Map();
|
m = new Map();
|
||||||
intCache.set(cu1, m);
|
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 cu1EndParam = cu1.EndParam;
|
||||||
let cu2EndParam = cu2.EndParam;
|
let cu2EndParam = cu2.EndParam;
|
||||||
for (let d of r) {
|
for (let d of r) {
|
||||||
@ -16573,7 +16607,7 @@ let ExtrudeSolid = ExtrudeSolid_1 = class ExtrudeSolid extends Entity {
|
|||||||
let isEqualNorm = equalv3(n, tn);
|
let isEqualNorm = equalv3(n, tn);
|
||||||
let targetZMin = target.Position.applyMatrix4(this.OCSInv).z;
|
let targetZMin = target.Position.applyMatrix4(this.OCSInv).z;
|
||||||
let targetZMax = targetZMin + target.Thickness * (isEqualNorm ? 1 : -1);
|
let targetZMax = targetZMin + target.Thickness * (isEqualNorm ? 1 : -1);
|
||||||
[targetZMin, targetZMax] = arraySortByNumber([targetZMin, targetZMax]);
|
[targetZMin, targetZMax] = arraySortByNumber$1([targetZMin, targetZMax]);
|
||||||
const MergeRelevance = () => {
|
const MergeRelevance = () => {
|
||||||
if (!this.Id || !target.Id)
|
if (!this.Id || !target.Id)
|
||||||
return;
|
return;
|
||||||
@ -16766,7 +16800,7 @@ let ExtrudeSolid = ExtrudeSolid_1 = class ExtrudeSolid extends Entity {
|
|||||||
this.Position = this.Position.add(vec);
|
this.Position = this.Position.add(vec);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
arraySortByNumber(indexList);
|
arraySortByNumber$1(indexList);
|
||||||
let updateBak = this.AutoUpdate;
|
let updateBak = this.AutoUpdate;
|
||||||
this.AutoUpdate = false;
|
this.AutoUpdate = false;
|
||||||
if (this.grooves.length === 0) {
|
if (this.grooves.length === 0) {
|
||||||
@ -17301,6 +17335,9 @@ let ExtrudeSolid = ExtrudeSolid_1 = class ExtrudeSolid extends Entity {
|
|||||||
this._MeshGeometry["IsMesh"] = true;
|
this._MeshGeometry["IsMesh"] = true;
|
||||||
this._EdgeGeometry = BufferGeometryUtils.MergeBufferGeometries(edges);
|
this._EdgeGeometry = BufferGeometryUtils.MergeBufferGeometries(edges);
|
||||||
}
|
}
|
||||||
|
//因为这里更新了mesh geom 所以我们必须更新它.
|
||||||
|
this._MeshGeometry = this.UpdateMeshGeom(this._MeshGeometry);
|
||||||
|
this._MeshGeometry["IsMesh"] = true;
|
||||||
//我们加入一些拓展信息,以便排钻能够使用(或者其他的,比如发送到效果图?,BBS)(布局视口会直接添加实体到场景,所以我们只在这里设置OriginEntity)
|
//我们加入一些拓展信息,以便排钻能够使用(或者其他的,比如发送到效果图?,BBS)(布局视口会直接添加实体到场景,所以我们只在这里设置OriginEntity)
|
||||||
for (let i = 0; i < this.__CacheSplitExtrudes.length; i++) {
|
for (let i = 0; i < this.__CacheSplitExtrudes.length; i++) {
|
||||||
this.__CacheSplitExtrudes[i].objectId = new ObjectId(this.Id.Index * -100 - 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)
|
if (this.thickness <= 0)
|
||||||
return new BufferGeometry();
|
return new BufferGeometry();
|
||||||
this.CalcRelevanceGroove();
|
this.CalcRelevanceGroove();
|
||||||
if (this._MeshGeometry) {
|
if (this._MeshGeometry)
|
||||||
//修复二维刀路更新(在有关联切割的情况下)
|
|
||||||
this._MeshGeometry = this.UpdateMeshGeom(this._MeshGeometry);
|
|
||||||
this._MeshGeometry["IsMesh"] = true;
|
|
||||||
return this._MeshGeometry;
|
return this._MeshGeometry;
|
||||||
}
|
|
||||||
this._EdgeGeometry = undefined; //清理掉(以便在被csg切割后得到edgegeom)
|
this._EdgeGeometry = undefined; //清理掉(以便在被csg切割后得到edgegeom)
|
||||||
let grooves = this.Grooves;
|
let grooves = this.Grooves;
|
||||||
if (grooves.every(g => equaln$1(g.thickness, this.thickness)) || grooves.length === 0) {
|
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() {
|
get EdgeGeometry() {
|
||||||
if (this._EdgeGeometry)
|
if (this._EdgeGeometry)
|
||||||
return this._EdgeGeometry;
|
return this._EdgeGeometry;
|
||||||
let oldMeshGeom = this._MeshGeometry;
|
this.CalcRelevanceGroove();
|
||||||
{
|
|
||||||
this.CalcRelevanceGroove();
|
|
||||||
//修复二维刀路更新(在有关联切割的情况下)
|
|
||||||
if (this._MeshGeometry && this._MeshGeometry !== oldMeshGeom) {
|
|
||||||
this._MeshGeometry = this.UpdateMeshGeom(this._MeshGeometry);
|
|
||||||
this._MeshGeometry["IsMesh"] = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (this._EdgeGeometry)
|
if (this._EdgeGeometry)
|
||||||
return this._EdgeGeometry;
|
return this._EdgeGeometry;
|
||||||
//这里我们超过100就用这个,为了性能 和MaxDrawGrooveCount不一致
|
//这里我们超过100就用这个,为了性能 和MaxDrawGrooveCount不一致
|
||||||
@ -17810,7 +17835,7 @@ let CompositeEntity = CompositeEntity_1 = class CompositeEntity extends Entity {
|
|||||||
GetObjectSnapPoints(snapMode, pickPoint, lastPoint, viewXform) {
|
GetObjectSnapPoints(snapMode, pickPoint, lastPoint, viewXform) {
|
||||||
let pts = [];
|
let pts = [];
|
||||||
for (let e of this.Entitys)
|
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;
|
return pts;
|
||||||
}
|
}
|
||||||
GetGripPoints() {
|
GetGripPoints() {
|
||||||
@ -17856,7 +17881,7 @@ let CompositeEntity = CompositeEntity_1 = class CompositeEntity extends Entity {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
vec = vec.clone().applyMatrix4(this.OCSInv.setPosition(0, 0, 0));
|
vec = vec.clone().applyMatrix4(this.OCSInv.setPosition(0, 0, 0));
|
||||||
arraySortByNumber(indexList);
|
arraySortByNumber$1(indexList);
|
||||||
let i = 0;
|
let i = 0;
|
||||||
let j = 0;
|
let j = 0;
|
||||||
let icount = indexList.length;
|
let icount = indexList.length;
|
||||||
@ -19936,8 +19961,8 @@ let Board = Board_1 = class Board extends ExtrudeSolid {
|
|||||||
* 异形->矩形
|
* 异形->矩形
|
||||||
*/
|
*/
|
||||||
//上下左右排钻属性(在矩形时生效)
|
//上下左右排钻属性(在矩形时生效)
|
||||||
TempRectHoleOption.up = undefined;
|
let rectHoleOpt = {};
|
||||||
ParseBoardRectHoleType(this, TempRectHoleOption); //分析旧的上下左右排钻
|
ParseBoardRectHoleType(this, rectHoleOpt); //分析旧的上下左右排钻
|
||||||
let oldHightSealCurves = GetBoardSealingCurves(this); //旧的封边轮廓
|
let oldHightSealCurves = GetBoardSealingCurves(this); //旧的封边轮廓
|
||||||
let oldHightSealDatas = GetBoardHighSeal(this, oldHightSealCurves); //旧的封边数据
|
let oldHightSealDatas = GetBoardHighSeal(this, oldHightSealCurves); //旧的封边数据
|
||||||
let oldContour = this.ContourCurve; //旧的轮廓
|
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;
|
defaultDrillType = HostApplicationServices.DrillConfigs.size ? HostApplicationServices.DrillConfigs.entries().next().value[0] : DrillType.None;
|
||||||
super.ContourCurve = newContour; //设置新的轮廓
|
super.ContourCurve = newContour; //设置新的轮廓
|
||||||
//保持排钻边属性
|
//保持排钻边属性
|
||||||
if (this.isRect && TempRectHoleOption.up) //矩形->矩形
|
if (this.isRect && rectHoleOpt.up) //矩形->矩形
|
||||||
SetBrHighHoleTypeFromRectHoleType(this, TempRectHoleOption); //直接应用旧的矩形数据
|
SetBrHighHoleTypeFromRectHoleType(this, rectHoleOpt); //直接应用旧的矩形数据
|
||||||
else //异形->矩形 矩形->异形 异形->异形
|
else //异形->矩形 矩形->异形 异形->异形
|
||||||
{
|
{
|
||||||
let indexMap = [];
|
let indexMap = [];
|
||||||
@ -20501,7 +20526,7 @@ let Board = Board_1 = class Board extends ExtrudeSolid {
|
|||||||
super.MoveStretchPoints(originIndexList, vec);
|
super.MoveStretchPoints(originIndexList, vec);
|
||||||
if (!this.Id)
|
if (!this.Id)
|
||||||
return;
|
return;
|
||||||
arraySortByNumber(mIndexList);
|
arraySortByNumber$1(mIndexList);
|
||||||
let ocsInv = this.OCSInv;
|
let ocsInv = this.OCSInv;
|
||||||
let localVec = TransformVector(vec.clone(), ocsInv);
|
let localVec = TransformVector(vec.clone(), ocsInv);
|
||||||
let offset = 0;
|
let offset = 0;
|
||||||
@ -20857,7 +20882,7 @@ function FastWireframe2(dr, color = 0) {
|
|||||||
function GenerateExtrudeEdgeGeometry(contourPoints, height) {
|
function GenerateExtrudeEdgeGeometry(contourPoints, height) {
|
||||||
let pts = [];
|
let pts = [];
|
||||||
for (let cs of contourPoints)
|
for (let cs of contourPoints)
|
||||||
arrayPushArray(pts, GenerateExtrudeEdgeGeometryPoints(cs, height));
|
arrayPushArray$1(pts, GenerateExtrudeEdgeGeometryPoints(cs, height));
|
||||||
let geo = new BufferGeometry().setFromPoints(pts);
|
let geo = new BufferGeometry().setFromPoints(pts);
|
||||||
return geo;
|
return geo;
|
||||||
}
|
}
|
||||||
@ -21042,7 +21067,7 @@ let ExtrudeHole = class ExtrudeHole extends Hole {
|
|||||||
this.Position = this.Position.add(vec);
|
this.Position = this.Position.add(vec);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
arraySortByNumber(indexList);
|
arraySortByNumber$1(indexList);
|
||||||
this.MoveGripOrStretchPointsOnly(indexList, vec, dragType);
|
this.MoveGripOrStretchPointsOnly(indexList, vec, dragType);
|
||||||
this.CheckContourCurve();
|
this.CheckContourCurve();
|
||||||
this.Update();
|
this.Update();
|
||||||
@ -22865,6 +22890,473 @@ function ParseRegionTextPos(contour, holes) {
|
|||||||
return p;
|
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) {
|
function Circle2Points(circle, knifRadius, splitSize = 10, outside = false) {
|
||||||
let radius = circle.Radius;
|
let radius = circle.Radius;
|
||||||
@ -23041,6 +23533,7 @@ class CurveWrap {
|
|||||||
this.IsOutside = IsOutside;
|
this.IsOutside = IsOutside;
|
||||||
this.Used = false;
|
this.Used = false;
|
||||||
this.Holes = [];
|
this.Holes = [];
|
||||||
|
this._OrgCurve = Curve;
|
||||||
this.BoundingBox = Curve.BoundingBox;
|
this.BoundingBox = Curve.BoundingBox;
|
||||||
if (Curve instanceof Polyline) {
|
if (Curve instanceof Polyline) {
|
||||||
let pts = Polyline2Points(Curve, IsOutside, 0)[1];
|
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
|
//# 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;
|
left: string;
|
||||||
right: string;
|
right: string;
|
||||||
}
|
}
|
||||||
export declare const TempRectHoleOption: IBoardRectHoleType;
|
|
||||||
/**分析上下左右排钻 */
|
/**分析上下左右排钻 */
|
||||||
export declare function ParseBoardRectHoleType(br: Board, outBrRectHoleType?: IBoardRectHoleType): IBoardRectHoleType;
|
export declare function ParseBoardRectHoleType(br: Board, outBrRectHoleType?: IBoardRectHoleType): IBoardRectHoleType;
|
||||||
export declare function ExtureHoleInBoard(holes: ExtrudeHole[], board: Board, ocs: Matrix4): boolean;
|
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 {
|
export declare class HistorycRecord {
|
||||||
undoData: ISerialize;
|
undoData: ISerialize;
|
||||||
redoData: ISerialize;
|
redoData: ISerialize;
|
||||||
userData: ISerialize;
|
|
||||||
ReadFile(file: CADFiler): void;
|
ReadFile(file: CADFiler): void;
|
||||||
WriteFile(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;
|
Used: boolean;
|
||||||
Holes: CurveWrap[];
|
Holes: CurveWrap[];
|
||||||
Points: Point[];
|
Points: Point[];
|
||||||
|
_OrgCurve: Polyline | Circle;
|
||||||
constructor(Curve: Polyline | Circle, KnifRadius?: number, IsOutside?: boolean);
|
constructor(Curve: Polyline | Circle, KnifRadius?: number, IsOutside?: boolean);
|
||||||
ContainsCurve(curve: CurveWrap): boolean;
|
ContainsCurve(curve: CurveWrap): boolean;
|
||||||
GetOutsidePoints(): Point[];
|
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 { FaceDirection } from "../../Add-on/DrawDrilling/DrillType";
|
||||||
import { EBoardKeyList } from "../../Common/BoardKeyList";
|
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";
|
import { IBaseOption } from "./OptionInterface/IOptionInterface";
|
||||||
export declare const DRILL_KEYS: string[];
|
export declare const DRILL_KEYS: string[];
|
||||||
export interface IBoardFindOption extends IBaseOption {
|
export interface IBoardFindOption extends IBaseOption {
|
||||||
@ -22,10 +22,12 @@ export interface IBoardFindOption extends IBaseOption {
|
|||||||
[EBoardKeyList.BigHole]: FaceDirection;
|
[EBoardKeyList.BigHole]: FaceDirection;
|
||||||
[EBoardKeyList.DrillType]: string;
|
[EBoardKeyList.DrillType]: string;
|
||||||
[EBoardKeyList.ComposingFace]: ComposingType;
|
[EBoardKeyList.ComposingFace]: ComposingType;
|
||||||
|
[EBoardKeyList.OpenDir]: BoardOpenDir;
|
||||||
[EBoardKeyList.UpSealed]: string;
|
[EBoardKeyList.UpSealed]: string;
|
||||||
[EBoardKeyList.DownSealed]: string;
|
[EBoardKeyList.DownSealed]: string;
|
||||||
[EBoardKeyList.LeftSealed]: string;
|
[EBoardKeyList.LeftSealed]: string;
|
||||||
[EBoardKeyList.RightSealed]: string;
|
[EBoardKeyList.RightSealed]: string;
|
||||||
|
hardwareDoorName: string;
|
||||||
highDrill: string[];
|
highDrill: string[];
|
||||||
upDownDrill: [boolean, boolean];
|
upDownDrill: [boolean, boolean];
|
||||||
isClose: boolean;
|
isClose: boolean;
|
||||||
@ -57,6 +59,7 @@ export interface IFindCondition {
|
|||||||
useKeyWord: boolean;
|
useKeyWord: boolean;
|
||||||
addRemarks: boolean;
|
addRemarks: boolean;
|
||||||
[EBoardKeyList.ComposingFace]: boolean;
|
[EBoardKeyList.ComposingFace]: boolean;
|
||||||
|
[EBoardKeyList.OpenDir]: boolean;
|
||||||
[EBoardKeyList.UpSealed]: boolean;
|
[EBoardKeyList.UpSealed]: boolean;
|
||||||
[EBoardKeyList.DownSealed]: boolean;
|
[EBoardKeyList.DownSealed]: boolean;
|
||||||
[EBoardKeyList.LeftSealed]: boolean;
|
[EBoardKeyList.LeftSealed]: boolean;
|
||||||
@ -84,6 +87,7 @@ export interface ICompareType {
|
|||||||
[EBoardKeyList.BigHole]: ECompareType;
|
[EBoardKeyList.BigHole]: ECompareType;
|
||||||
[EBoardKeyList.DrillType]: ECompareType;
|
[EBoardKeyList.DrillType]: ECompareType;
|
||||||
[EBoardKeyList.ComposingFace]: ECompareType;
|
[EBoardKeyList.ComposingFace]: ECompareType;
|
||||||
|
[EBoardKeyList.OpenDir]: ECompareType;
|
||||||
[EBoardKeyList.KnifeRad]: ECompareType;
|
[EBoardKeyList.KnifeRad]: ECompareType;
|
||||||
}
|
}
|
||||||
export interface ITolerance {
|
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/Contour";
|
||||||
export * from "./DatabaseServices/Shape";
|
export * from "./DatabaseServices/Shape";
|
||||||
export * from "./DatabaseServices/ShapeManager";
|
export * from "./DatabaseServices/ShapeManager";
|
||||||
|
export * from "./Add-on/testEntity/LargestInteriorRectangle";
|
||||||
export * from "./Nest/Converter/Curves2Points";
|
export * from "./Nest/Converter/Curves2Points";
|
||||||
export * from "./Nest/Converter/CurveWrap";
|
export * from "./Nest/Converter/CurveWrap";
|
||||||
export * from "./Common/Status";
|
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