Files
cut-abstractions/samples/handleAbility/knifeHelper.ts

202 lines
6.6 KiB
TypeScript
Raw Normal View History

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;
}
}