202 lines
6.6 KiB
TypeScript
202 lines
6.6 KiB
TypeScript
|
import { _knifeType, Knife, SideModel } from "../confClass";
|
||
|
import { knifeData,knifeData1,knifeData2 } from "../demoKnives";
|
||
|
/** 刀库 管理刀具*/
|
||
|
export class KnifeHelper {
|
||
|
knifeList: Knife[]
|
||
|
constructor(_knifeList) {
|
||
|
|
||
|
this.knifeList.push(knifeData);
|
||
|
|
||
|
|
||
|
if (Array.isArray(_knifeList) && _knifeList.length >0 ) {
|
||
|
this.loadKnifeList(_knifeList)
|
||
|
}
|
||
|
}
|
||
|
|
||
|
loadKnifeList(_knifeList) {
|
||
|
this.knifeList = _knifeList || []
|
||
|
}
|
||
|
|
||
|
/** 根据刀名称获取造型刀 */
|
||
|
getModelKnifeByName(name: string): Knife | undefined {
|
||
|
return this.knifeList.find(t => t.knifeName.trim() == name.trim() && t.isModelingKnife());
|
||
|
}
|
||
|
|
||
|
/** 根据半径获取造型刀 */
|
||
|
getModelKnifeByRadius(radius: number, depth: number): Knife | undefined {
|
||
|
return this.knifeList.find(t => t.isModelingKnife() && Math.abs(t.diameter - 2 * radius) < 0.02 && t.length >= depth - 0.01);
|
||
|
}
|
||
|
|
||
|
/** 获取合适的开料刀作为造型刀 */
|
||
|
getFittedModelKnife(radius: number, depth: number): Knife | null {
|
||
|
const knives = this.knifeList.filter(t => t.isModelingKnife() && t.length > depth - 0.01 && t.diameter / 2 < radius - 0.02);
|
||
|
if (knives) {
|
||
|
knives.sort((a, b) => b.diameter - a.diameter); //按刀直径倒序排序
|
||
|
return knives[0];
|
||
|
}
|
||
|
|
||
|
return null;
|
||
|
}
|
||
|
|
||
|
/** 根据厚度获取开料刀 */
|
||
|
getKnifeByThickness(thickness: number): Knife | undefined {
|
||
|
return this.knifeList.find(t => t.length >= thickness);
|
||
|
}
|
||
|
/** 通用 找刀具 根据查询条件 */
|
||
|
getKnifeByParams(params: _knifeType) {
|
||
|
let knife: Knife | null = null
|
||
|
|
||
|
if (params) {
|
||
|
let tempKnifeList: Knife[] = [...this.knifeList] // []
|
||
|
let keys = Object.keys(params)
|
||
|
if (keys.length > 0) {
|
||
|
keys.forEach(key => {
|
||
|
if (Array.isArray(params[key]) && key == 'ability') {
|
||
|
// 进来的应该是ability 是数组 判断刀的能力
|
||
|
for (const arrItem of params[key]) {
|
||
|
let _knifeList = this.knifeList.filter(e => e.ability.includes(arrItem))
|
||
|
_knifeList.forEach(k => {
|
||
|
if (!this.KnifeIsInKnifeList(k, tempKnifeList)) {
|
||
|
tempKnifeList.push(k)
|
||
|
}
|
||
|
})
|
||
|
}
|
||
|
} else if (['string', 'number'].includes(typeof (params[key]))) {
|
||
|
if (params && params[key] && typeof (params[key]) == 'number') {
|
||
|
|
||
|
if (key == 'length') {
|
||
|
tempKnifeList = tempKnifeList.filter(e => e[key] >= params[key])
|
||
|
} else {
|
||
|
tempKnifeList = tempKnifeList.filter(e => e[key] == params[key])
|
||
|
}
|
||
|
|
||
|
|
||
|
}
|
||
|
}
|
||
|
});
|
||
|
if (tempKnifeList.length > 0) {
|
||
|
knife = tempKnifeList[0]
|
||
|
}
|
||
|
} else {
|
||
|
console.log('传入的查询条件 没有参数')
|
||
|
}
|
||
|
}
|
||
|
return knife
|
||
|
}
|
||
|
|
||
|
/** 判断 刀是否在 刀列表内
|
||
|
* true 存在
|
||
|
* false 不存在
|
||
|
*/
|
||
|
KnifeIsInKnifeList(_knife: Knife, _knifeList: Knife[]) {
|
||
|
let k = _knifeList.find(e => _knife.axleId == e.axleId
|
||
|
&& _knife.diameter == e.diameter
|
||
|
&& _knife.knifeId == e.knifeId)
|
||
|
|
||
|
if (k) {
|
||
|
return true
|
||
|
} else {
|
||
|
return false
|
||
|
}
|
||
|
}
|
||
|
getSideModelKnife(model: SideModel): Knife | undefined | null {
|
||
|
if (model.knifeName && model.knifeName.trim() != '') {
|
||
|
return this.getModelKnifeByName(model.knifeName.trim());
|
||
|
}
|
||
|
//获取刀半径(直径)和长度与造型定义的刀半径和深度一致的刀
|
||
|
const knife = this.getSideModelKnifeByRadius(model.knifeRadius, model.depth, model.direction);
|
||
|
if (knife) return knife;
|
||
|
//获取刀半径(直径)小于造型定义的刀半径、长度不小于造型深度的刀
|
||
|
return this.getFittedSideModelKnife(model.knifeRadius, model.depth, model.direction);
|
||
|
}
|
||
|
/** 获取合适的开料刀作为造型刀 */
|
||
|
getFittedSideModelKnife(radius: number, depth: number, direction): Knife | null {
|
||
|
let processFaceArr: number[] = [];
|
||
|
processFaceArr.push(5)
|
||
|
switch (direction) {
|
||
|
case 0:
|
||
|
processFaceArr.push(4)
|
||
|
|
||
|
break;
|
||
|
case 1:
|
||
|
processFaceArr.push(2)
|
||
|
|
||
|
break;
|
||
|
case 2:
|
||
|
processFaceArr.push(3)
|
||
|
|
||
|
break;
|
||
|
case 3:
|
||
|
|
||
|
processFaceArr.push(1)
|
||
|
break;
|
||
|
case 10:
|
||
|
|
||
|
|
||
|
break;
|
||
|
case 11:
|
||
|
|
||
|
break;
|
||
|
case 12:
|
||
|
|
||
|
break;
|
||
|
case 13:
|
||
|
|
||
|
break;
|
||
|
default:
|
||
|
break;
|
||
|
}
|
||
|
const knives = this.knifeList.filter(t => t.isModelingKnife() && t.length > depth - 0.01 && t.diameter / 2 < radius - 0.02 && processFaceArr.includes(t.processFace));
|
||
|
if (knives) {
|
||
|
knives.sort((a, b) => b.diameter - a.diameter); //按刀直径倒序排序
|
||
|
return knives[0];
|
||
|
}
|
||
|
|
||
|
return null;
|
||
|
}
|
||
|
/** 根据半径获取造型刀 */
|
||
|
// direction 0 下 1右 2上 3左 10 左下斜 11 右下斜 12右上斜 13 左上斜
|
||
|
// processFace: number // 加工面 2024 11 21 : 正面 0 反面 1 左侧面 2 右侧面 3 上侧面 4 下侧面 5 任意 6
|
||
|
getSideModelKnifeByRadius(radius: number, depth: number, direction): Knife | undefined {
|
||
|
|
||
|
let processFaceArr: number[] = [];
|
||
|
processFaceArr.push(5)
|
||
|
switch (direction) {
|
||
|
case 0:
|
||
|
processFaceArr.push(4)
|
||
|
|
||
|
break;
|
||
|
case 1:
|
||
|
processFaceArr.push(2)
|
||
|
|
||
|
break;
|
||
|
case 2:
|
||
|
processFaceArr.push(3)
|
||
|
|
||
|
break;
|
||
|
case 3:
|
||
|
|
||
|
processFaceArr.push(1)
|
||
|
break;
|
||
|
case 10:
|
||
|
|
||
|
|
||
|
break;
|
||
|
case 11:
|
||
|
|
||
|
break;
|
||
|
case 12:
|
||
|
|
||
|
break;
|
||
|
case 13:
|
||
|
|
||
|
break;
|
||
|
default:
|
||
|
break;
|
||
|
}
|
||
|
let knife = this.knifeList.find(t => t.isModelingKnife() && Math.abs(t.diameter - 2 * radius) < 0.02 && t.length >= depth - 0.01 && processFaceArr.includes(t.processFace))
|
||
|
|
||
|
return knife;
|
||
|
}
|
||
|
|
||
|
}
|