feat:提交

This commit is contained in:
2025-07-14 16:04:08 +08:00
parent e8ae91bb2a
commit cf9913469f
15 changed files with 989 additions and 3097 deletions

View File

@@ -1,66 +1,41 @@
import type { Big_bang, xbang } from './bang'
import { RectOptimizeMachine } from './RectOptimizeMachine'
import {Worker} from "worker_threads"
// import {Worker} from "worker_threads"
import { Worker as NodeWorker } from 'worker_threads';
const ctx: NodeWorker | Worker = self as any
if (typeof window !== 'undefined' && 'Worker' in window) {
ctx.addEventListener('message', async (event) => {
let m = new RectOptimizeMachine()
m.CallBack = async (best, fit, arg, info) => {
const ctx: Worker = self as any
ctx.addListener('message', async (event) => {
let m = new RectOptimizeMachine()
m.CallBack = async (best, fit, arg, info) => {
ctx.postMessage([best, fit, arg, info])
}
if (event.data.type == 'start') {
/**
* blockList 小板列表
* boardList 大板(N个元素前N-1个元素表示余料板且余料板须为矩形第N个元素表示大板)
* boardCount 余料板数量(bigBang中前N-1个元素对应的数量如果bigBang中只有一个元素即只有大板没有余料板则为空数组)
* optimizeTimes 新优化次数
* isDoubleFaceBlockFirst 双面加工的小板是否优先排入
* gap 排版缝隙 = 开料刀直径 + 缝隙
* gzpb 规则排版
* isDoubleFaceBlockInRemain 余料板是否排入双面加工的小板
*/
let [blockList, boardList, boardCount, optimizeTimes, isDoubleFaceBlockFirst, gap, gzpb, isDoubleFaceBlockInRemain] = (event.data.data) as [xbang[], Big_bang[], number[], number, boolean, number, boolean, boolean]
m.Start(blockList, boardList, boardCount, optimizeTimes, isDoubleFaceBlockFirst, gap, gzpb, isDoubleFaceBlockInRemain)
} else {
const info = {
type: 'isStop',
ctx.postMessage([best, fit, arg, info])
}
await m.Stop(info)
ctx.postMessage([[], null, null, info])
ctx?.terminate()
}
})
// ctx.addEventListener('message', async (event) => {
// let m = new RectOptimizeMachine()
// m.CallBack = async (best, fit, arg, info) => {
if (event.data.type == 'start') {
/**
* blockList 小板列表
* boardList 大板(N个元素前N-1个元素表示余料板且余料板须为矩形第N个元素表示大板)
* boardCount 余料板数量(bigBang中前N-1个元素对应的数量如果bigBang中只有一个元素即只有大板没有余料板则为空数组)
* optimizeTimes 新优化次数
* isDoubleFaceBlockFirst 双面加工的小板是否优先排入
* gap 排版缝隙 = 开料刀直径 + 缝隙
* gzpb 规则排版
* isDoubleFaceBlockInRemain 余料板是否排入双面加工的小板
*/
let [blockList, boardList, boardCount, optimizeTimes, isDoubleFaceBlockFirst, gap, gzpb, isDoubleFaceBlockInRemain] = (event.data.data) as [xbang[], Big_bang[], number[], number, boolean, number, boolean, boolean]
// ctx.postMessage([best, fit, arg, info])
// }
// if (event.data.type == 'start') {
// /**
// * blockList 小板列表
// * boardList 大板(N个元素前N-1个元素表示余料板且余料板须为矩形第N个元素表示大板)
// * boardCount 余料板数量(bigBang中前N-1个元素对应的数量如果bigBang中只有一个元素即只有大板没有余料板则为空数组)
// * optimizeTimes 新优化次数
// * isDoubleFaceBlockFirst 双面加工的小板是否优先排入
// * gap 排版缝隙 = 开料刀直径 + 缝隙
// * gzpb 规则排版
// * isDoubleFaceBlockInRemain 余料板是否排入双面加工的小板
// */
// let [blockList, boardList, boardCount, optimizeTimes, isDoubleFaceBlockFirst, gap, gzpb, isDoubleFaceBlockInRemain] = (event.data.data) as [xbang[], Big_bang[], number[], number, boolean, number, boolean, boolean]
m.Start(blockList, boardList, boardCount, optimizeTimes, isDoubleFaceBlockFirst, gap, gzpb, isDoubleFaceBlockInRemain)
} else {
const info = {
type: 'isStop',
}
await m.Stop(info)
ctx.postMessage([[], null, null, info])
ctx?.terminate()
}
})
} else {
}
// m.Start(blockList, boardList, boardCount, optimizeTimes, isDoubleFaceBlockFirst, gap, gzpb, isDoubleFaceBlockInRemain)
// } else {
// const info = {
// type: 'isStop',
// }
// await m.Stop(info)
// ctx.postMessage([[], null, null, info])
// ctx?.terminate()
// }
// })
export default {} as typeof Worker & (new () => Worker)

View File

@@ -86,7 +86,7 @@ export interface xbang
}
/** 大板 */
export interface Big_bang //待优化的板
export class Big_bang //待优化的板
{
l: number; //长
w: number; //宽

View File

@@ -0,0 +1,365 @@
"use strict";
var __extends = (this && this.__extends) || (function () {
var extendStatics = function (d, b) {
extendStatics = Object.setPrototypeOf ||
({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };
return extendStatics(d, b);
};
return function (d, b) {
if (typeof b !== "function" && b !== null)
throw new TypeError("Class extends value " + String(b) + " is not a constructor or null");
extendStatics(d, b);
function __() { this.constructor = d; }
d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
};
})();
Object.defineProperty(exports, "__esModule", { value: true });
exports.arrayRemoveDuplicateBySort = exports.GroupItem = exports.ArrayExt = exports.List = void 0;
var List = /** @class */ (function (_super) {
__extends(List, _super);
function List() {
return _super !== null && _super.apply(this, arguments) || this;
}
/** 返回符合条件的第一个元素 */
List.prototype.first = function (fn) {
if (this.length == 0)
return null;
for (var _i = 0, _a = this; _i < _a.length; _i++) {
var item = _a[_i];
if (fn(item))
return item;
}
return null;
};
/** 返回符合条件的最后一元素 */
List.prototype.last = function (fn) {
if (this.length == 0)
return null;
for (var i = this.length - 1; i >= 0; i--) {
if (fn(this[i]))
return this[i];
}
return null;
};
/** 最大值 */
List.prototype.max = function (fn) {
var maxV;
for (var _i = 0, _a = this; _i < _a.length; _i++) {
var i = _a[_i];
var v = fn(i);
if (maxV == null) {
maxV = fn(i);
}
else {
if (v > maxV) {
maxV = v;
}
}
}
return maxV;
};
/** 最小值 */
List.prototype.min = function (fn) {
var minV;
for (var _i = 0, _a = this; _i < _a.length; _i++) {
var i = _a[_i];
var v = fn(i);
if (minV == null) {
minV = fn(i);
}
else {
if (v < minV) {
minV = v;
}
}
}
return minV;
};
/** 累加 */
List.prototype.sum = function (fn) {
var v = 0;
for (var _i = 0, _a = this; _i < _a.length; _i++) {
var t = _a[_i];
v = v + fn(t);
}
return v;
};
/** 平均值 */
List.prototype.avg = function (fn) {
if (this.length == 0)
return 0;
var sum = this.sum(fn);
return sum / this.length;
};
/** 满足条件的元素数量 */
List.prototype.count = function (fn) {
if (this.length == 0)
return 0;
var c = 0;
for (var _i = 0, _a = this; _i < _a.length; _i++) {
var item = _a[_i];
if (fn(item))
c = c + 1;
}
return c;
};
List.prototype.FindMax = function (fn) {
return this.reduce(function (a, b) { return fn(a) > fn(b) ? a : b; });
};
return List;
}(Array));
exports.List = List;
var ArrayExt = /** @class */ (function () {
function ArrayExt() {
}
/** 返回满足条件的元素数量 */
ArrayExt.count = function (list, fn) {
if (list.length == 0)
return 0;
var c = 0;
for (var _i = 0, list_1 = list; _i < list_1.length; _i++) {
var item = list_1[_i];
if (fn(item))
c = c + 1;
}
return c;
};
/** 移除 */
ArrayExt.remove = function (list, obj) {
var index = list.findIndex(function (t) { return t == obj; });
if (index == -1)
return;
list.splice(index, 1);
};
/** 返回符合条件的第一个元素 */
ArrayExt.first = function (list, fn, orderFn1, orderFn2) {
if (orderFn1 === void 0) { orderFn1 = null; }
if (orderFn2 === void 0) { orderFn2 = null; }
if (list.length == 0)
return null;
if (orderFn1 == null) {
for (var _i = 0, list_2 = list; _i < list_2.length; _i++) {
var item = list_2[_i];
if (fn(item))
return item;
}
return null;
}
var minValue1;
var minValue2;
var minItem;
for (var _a = 0, list_3 = list; _a < list_3.length; _a++) {
var item = list_3[_a];
if (fn(item) == false)
continue;
var v1 = orderFn1(item);
var v2 = orderFn2 != null ? orderFn2(item) : 0;
if (minValue1 == null || v1 < minValue1 || (v1 == minValue1 && v2 < minValue2)) {
minValue1 = v1;
minValue2 = v2;
minItem = item;
}
}
return minItem;
};
/** 返回符合条件的最后一元素 */
ArrayExt.last = function (list, fn, orderFn1, orderFn2) {
if (orderFn1 === void 0) { orderFn1 = null; }
if (orderFn2 === void 0) { orderFn2 = null; }
if (list.length == 0)
return null;
if (orderFn1 == null) {
for (var i = list.length - 1; i >= 0; i--) {
if (fn(list[i]))
return list[i];
}
return null;
}
//
var maxValue1;
var maxValue2;
var maxItem;
for (var _i = 0, list_4 = list; _i < list_4.length; _i++) {
var item = list_4[_i];
if (fn(item) == false)
continue;
var v1 = orderFn1(item);
var v2 = orderFn2 ? orderFn2(item) : 0;
if (maxValue1 == null || v1 > maxValue1 || (v1 == maxValue1 && v2 > maxValue2)) {
maxValue1 = v1;
maxValue2 = v2;
maxItem = item;
}
}
return maxItem;
};
/** 取最大值 */
ArrayExt.max = function (list, fn, whereF, defaultV) {
if (whereF === void 0) { whereF = null; }
if (defaultV === void 0) { defaultV = null; }
var maxV;
for (var _i = 0, list_5 = list; _i < list_5.length; _i++) {
var i = list_5[_i];
if (whereF && whereF(i) == false)
continue;
var v = fn(i);
if (maxV == undefined) {
maxV = fn(i);
}
else {
if (v > maxV) {
maxV = v;
}
}
}
if (maxV != undefined)
return maxV;
return defaultV;
};
/** 最小值 */
ArrayExt.min = function (list, fn, whereF, defaultV) {
if (whereF === void 0) { whereF = null; }
if (defaultV === void 0) { defaultV = null; }
var minV;
for (var _i = 0, list_6 = list; _i < list_6.length; _i++) {
var i = list_6[_i];
if (whereF && whereF(i) == false)
continue;
var v = fn(i);
if (minV == undefined) {
minV = v;
}
else {
if (v < minV) {
minV = v;
}
}
}
if (minV != undefined)
return minV;
return defaultV;
};
/** 累加 */
ArrayExt.sum = function (list, fn, wn) {
var v = 0;
for (var _i = 0, list_7 = list; _i < list_7.length; _i++) {
var t = list_7[_i];
if (wn && wn(t) == false)
continue;
v = v + fn(t);
}
return v;
};
/** 平均值 */
ArrayExt.avg = function (list, fn) {
if (this.length == 0)
return 0;
var sum = ArrayExt.sum(list, fn);
return sum / this.length;
};
/** 排序 */
ArrayExt.sortBy = function (list, fn, fn2) {
if (fn2 === void 0) { fn2 = null; }
if (fn2 == null)
return list.sort(function (a, b) { return fn(a) - fn(b); });
else
return list.sort(function (a, b) { return fn(a) == fn(b) ? (fn2(a) - fn2(b)) : fn(a) - fn(b); });
};
/** 降序 排序 */
ArrayExt.sortByDescending = function (list, fn) {
list.sort(function (a, b) { return fn(b) - fn(a); });
};
/** 排序成新的数组 */
ArrayExt.orderBy = function (list, fn, fn2) {
if (fn2 === void 0) { fn2 = null; }
var newList = list.concat([]);
if (fn2 == null)
return newList.sort(function (a, b) { return fn(a) - fn(b); });
else
return newList.sort(function (a, b) { return fn(a) == fn(b) ? (fn2(a) - fn2(b)) : fn(a) - fn(b); });
};
/** 降序成新的数组 */
ArrayExt.orderByDescending = function (list, fn, fn2) {
if (fn2 === void 0) { fn2 = null; }
var newList = list.concat([]);
if (fn2 == null)
return list.sort(function (a, b) { return fn(b) - fn(a); });
else
return list.sort(function (a, b) { return fn(a) == fn(b) ? (fn2(b) - fn2(a)) : fn(b) - fn(a); });
};
/** 分组 */
ArrayExt.groupBy = function (list, fn) {
var groups = new Array();
var _loop_1 = function (item) {
var key = fn(item);
var group = groups.find(function (t) { return t.key == key; });
if (group == null) {
group = new GroupItem(key);
groups.push(group);
}
group.push(item);
};
for (var _i = 0, list_8 = list; _i < list_8.length; _i++) {
var item = list_8[_i];
_loop_1(item);
}
return groups;
};
/**
* 选择
* let newObjectList = ArrayExt.Select(list,t=>({pA:t.name, pB:t.age + "_"+ t.month}) ) ;
*/
ArrayExt.Select = function (list, fn) {
var newList = new Array();
for (var _i = 0, list_9 = list; _i < list_9.length; _i++) {
var t = list_9[_i];
newList.push(fn(t));
}
return newList;
};
/** 过来,并按顺序排序 */
ArrayExt.where = function (list, whereFn, orderfn1, orderfn2) {
if (orderfn1 === void 0) { orderfn1 = null; }
if (orderfn2 === void 0) { orderfn2 = null; }
var newList = list.filter(whereFn);
if (orderfn1 == null && orderfn2 == null)
return newList;
return ArrayExt.sortBy(newList, orderfn1, orderfn2);
};
return ArrayExt;
}());
exports.ArrayExt = ArrayExt;
var GroupItem = /** @class */ (function () {
function GroupItem(k) {
this.key = k;
this.list = [];
}
Object.defineProperty(GroupItem.prototype, "count", {
get: function () { return this.list.length; },
enumerable: false,
configurable: true
});
GroupItem.prototype.push = function (d) {
this.list.push(d);
};
return GroupItem;
}());
exports.GroupItem = GroupItem;
/**
* 对排序好的数组进行去重操作
* @param {(e1, e2) => boolean} [checkFuction] 校验对象相等函数
* @returns {Array<T>} 返回自身
*/
function arrayRemoveDuplicateBySort(arr, checkFuction) {
if (checkFuction === void 0) { checkFuction = checkEqual; }
if (arr.length < 2)
return arr;
var j = 1;
for (var i = 1, l = arr.length; i < l; i++)
if (!checkFuction(arr[j - 1], arr[i]))
arr[j++] = arr[i];
arr.length = j;
return arr;
}
exports.arrayRemoveDuplicateBySort = arrayRemoveDuplicateBySort;

View File

@@ -0,0 +1,141 @@
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.Box2 = void 0;
var Vector2_js_1 = require("./Vector2.js");
var Box2 = /** @class */ (function () {
function Box2(min, max) {
if (min === void 0) { min = new Vector2_js_1.Vector2(+Number.POSITIVE_INFINITY, +Number.POSITIVE_INFINITY); }
if (max === void 0) { max = new Vector2_js_1.Vector2(Number.NEGATIVE_INFINITY, Number.NEGATIVE_INFINITY); }
this.min = min;
this.max = max;
}
Object.defineProperty(Box2.prototype, "area", {
/** 获取面积 */
get: function () {
return (this.max.x - this.min.x) * (this.max.y - this.min.y);
},
enumerable: false,
configurable: true
});
/** */
Box2.prototype.set = function (min, max) {
this.min.copy(min);
this.max.copy(max);
return this;
};
Box2.prototype.setFromPoints = function (points) {
this.makeEmpty();
for (var _i = 0, points_1 = points; _i < points_1.length; _i++) {
var p = points_1[_i];
this.expandByPoint(p);
}
return this;
};
Box2.prototype.setFromCenterAndSize = function (center, size) {
var v1 = Box2._setFromCenterAndSize_v1;
var halfSize = v1.copy(size).multiplyScalar(0.5);
this.min.copy(center).sub(halfSize);
this.max.copy(center).add(halfSize);
return this;
};
Box2.prototype.clone = function () {
return new this.constructor().copy(this);
};
Box2.prototype.copy = function (box) {
this.min.copy(box.min);
this.max.copy(box.max);
return this;
};
Box2.prototype.makeEmpty = function () {
this.min.x = this.min.y = +Number.POSITIVE_INFINITY;
this.max.x = this.max.y = Number.NEGATIVE_INFINITY;
return this;
};
Box2.prototype.isEmpty = function () {
// this is a more robust check for empty than (volume <= 0) because volume can get positive with two negative axes
return (this.max.x < this.min.x) || (this.max.y < this.min.y);
};
Box2.prototype.getCenter = function (result) {
if (result === void 0) { result = new Vector2_js_1.Vector2(); }
return this.isEmpty() ? result.set(0, 0) : result.addVectors(this.min, this.max).multiplyScalar(0.5);
};
Box2.prototype.getSize = function (result) {
if (result === void 0) { result = new Vector2_js_1.Vector2(); }
return this.isEmpty() ? result.set(0, 0) : result.subVectors(this.max, this.min);
};
Box2.prototype.expandByPoint = function (point) {
this.min.min(point);
this.max.max(point);
return this;
};
Box2.prototype.expandByVector = function (vector) {
this.min.sub(vector);
this.max.add(vector);
return this;
};
Box2.prototype.expandByScalar = function (scalar) {
this.min.addScalar(-scalar);
this.max.addScalar(scalar);
return this;
};
Box2.prototype.containsPoint = function (point) {
if (point.x < this.min.x || point.x > this.max.x
|| point.y < this.min.y || point.y > this.max.y) {
return false;
}
return true;
};
Box2.prototype.containsBox = function (box) {
if ((this.min.x <= box.min.x) && (box.max.x <= this.max.x)
&& (this.min.y <= box.min.y) && (box.max.y <= this.max.y)) {
return true;
}
return false;
};
Box2.prototype.getParameter = function (point, result) {
if (result === void 0) { result = new Vector2_js_1.Vector2(); }
// This can potentially have a divide by zero if the box
// has a size dimension of 0.
return result.set((point.x - this.min.x) / (this.max.x - this.min.x), (point.y - this.min.y) / (this.max.y - this.min.y));
};
Box2.prototype.intersectsBox = function (box) {
// using 6 splitting planes to rule out intersections.
if (box.max.x < this.min.x || box.min.x > this.max.x
|| box.max.y < this.min.y || box.min.y > this.max.y) {
return false;
}
return true;
};
Box2.prototype.clampPoint = function (point, result) {
if (result === void 0) { result = new Vector2_js_1.Vector2(); }
return result.copy(point).clamp(this.min, this.max);
};
Box2.prototype.distanceToPoint = function (point) {
var v1 = Box2._distanceToPoint_v1;
var clampedPoint = v1.copy(point).clamp(this.min, this.max);
return clampedPoint.sub(point).length();
};
Box2.prototype.intersect = function (box) {
this.min.max(box.min);
this.max.min(box.max);
return this;
};
Box2.prototype.union = function (box) {
this.min.min(box.min);
this.max.max(box.max);
return this;
};
Box2.prototype.translate = function (offset) {
this.min.add(offset);
this.max.add(offset);
return this;
};
Box2.prototype.equals = function (box) {
return box.min.equals(this.min) && box.max.equals(this.max);
};
Box2._setFromCenterAndSize_v1 = new Vector2_js_1.Vector2();
Box2._distanceToPoint_v1 = new Vector2_js_1.Vector2();
return Box2;
}());
exports.Box2 = Box2;
;

View File

@@ -7,7 +7,6 @@ import type { Curve2d } from '../base/CAD'
import { Arc2d, Point2d, copyTextToClipboard } from '../base/CAD'
import { CurveWrap } from './Curves2Parts'
// import type { Curve2d } from '../../common/base/CAD'
export class PolylineHelper {
/** 创建闭合多段线 */