diff --git a/src/Add-on/KJLImport.ts b/src/Add-on/KJLImport.ts index 45613c6a1..9a135c008 100644 --- a/src/Add-on/KJLImport.ts +++ b/src/Add-on/KJLImport.ts @@ -16,6 +16,8 @@ import { HotCMD } from "../Hot/HotCommand"; import { FaceDirection, LinesType, IHighSealedItem } from "../UI/Store/BoardInterface"; import { ParagraphSealinglist, HandleRectBoardSealingData } from "../GraphicsSystem/CalcEdgeSealing"; import { arrayLast } from "../Common/ArrayExt"; +import { userConfig } from "../Editor/UserConfig"; +import { safeEval } from "../Common/eval"; /** 模型类型 */ enum KJL_ModelType @@ -98,6 +100,12 @@ interface KJL_JsonFile designData: KJL_DesignData; } +interface KJL_DrillData//排钻信息 +{ + bigHole: number;//0-正, 1-反 + drillSides: number[];//0-不排, 1...n-排n型 +} + class FuzzPoint { private map: { [key: string]: Vec2; } = {}; @@ -173,7 +181,7 @@ function ParseRoomNameMap(d: KJL_DesignData): Map } -function ParseModel(model: KJL_ParamModel, roomName: string, gName: string, parentMatrix?: Matrix4, edgeBandingAll?: number[]): Board | TemplateRecord +function ParseModel(model: KJL_ParamModel, roomName: string, gName: string, parentMatrix?: Matrix4, edgeBandingAll?: number[], drillData?: KJL_DrillData): Board | TemplateRecord { let mtx = new Matrix4().makeRotationFromEuler(new Euler(model.rotate.x, model.rotate.y, model.rotate.z, "ZYX")) .setPosition(model.position.x, model.position.y, model.position.z); @@ -217,6 +225,23 @@ function ParseModel(model: KJL_ParamModel, roomName: string, gName: string, pare } br.GrooveCheckAll([]); + //设置排钻边 + if (drillData?.drillSides.length > 0) + { + let curvesNum = br.ContourCurve.CurveCount; + let types = ["不排", ...userConfig.DrillConfigs.keys()]; + let last = types[arrayLast(drillData.drillSides)]; + let drills: string[] = Array(curvesNum); + for (let i = 0; i < curvesNum; i++) + { + if (i < drillData.drillSides.length) + drills[i] = types[drillData.drillSides[i]]; + else + drills[i] = last; + } + br.BoardProcessOption.highDrill = drills; + } + let n = new Vector3().setFromMatrixColumn(mtx, 2).toArray(); for (let i = 0; i < n.length; i++) { @@ -254,6 +279,10 @@ function ParseModel(model: KJL_ParamModel, roomName: string, gName: string, pare else br.BoardProcessOption[EBoardKeyList.BigHole] = FaceDirection.Back; } + + //根据kjl数据设置大孔面 + br.BoardProcessOption[EBoardKeyList.BigHole] = drillData?.bigHole === 0 ? FaceDirection.Front : FaceDirection.Back; + if (model.textureAngle === 0) br.BoardProcessOption[EBoardKeyList.Lines] = LinesType.Reverse; else @@ -287,7 +316,8 @@ function ParseModel(model: KJL_ParamModel, roomName: string, gName: string, pare for (let m of model.subModels) { let edgeBandings = ParseEdgeBanding(model.parameters) || ParseEdgeBanding(model.ignoreParameters) || ParseEdgeBanding(model.constParameters); - let obj = ParseModel(m, roomName, gName, mtx, edgeBandings); + let drillData = ParseDrilling(model.parameters) || ParseDrilling(model.ignoreParameters) || ParseDrilling(model.constParameters); + let obj = ParseModel(m, roomName, gName, mtx, edgeBandings, drillData); if (obj) { if (obj instanceof Board) @@ -350,6 +380,40 @@ function ParseEdgeBanding(params: KJL_Parameter[]): number[] | undefined } } +function ParseDrilling(params: KJL_Parameter[]): KJL_DrillData | undefined +{ + if (!params) return; + + let data: KJL_DrillData = { bigHole: null, drillSides: [] }; + //大孔面 0-正, 1-反 + let sbIndex = params.findIndex(p => p.name === "SBFX"); + if (sbIndex !== -1) + data.bigHole = parseFloat(params[sbIndex].value); + + //排钻边 0-不排, 1...n-排n型 + let ecIndex = params.findIndex(p => p.name === "EC");//EC: 全边统一配置 + if (ecIndex !== -1) + { + data.drillSides = [parseFloat(params[ecIndex].value)]; + return data; + } + + let index = params.findIndex(p => p.name === "EC1");//ECx: 按边分别配置 + if (index !== -1) + { + for (let i = index; i < params.length; i++) + { + let p = params[i]; + if (!p.name.startsWith("EC")) + break; + let num = safeEval(p.name.slice(2)); + if (!isNaN(num)) + data.drillSides[num - 1] = (parseFloat(p.value)); + } + return data; + } +} + /** * 分析Path的外轮廓和内网洞 * @param path