"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var three_1 = require("three"); var ColorPalette_1 = require("./ColorPalette"); var GeUtils_1 = require("./GeUtils"); var Material_1 = require("./Material"); var RotateUV_1 = require("./RotateUV"); var ThreeCSG_1 = require("./ThreeCSG"); //解析二维圆弧类. var Arc2d = /** @class */ (function () { function Arc2d(p1, p2, bul) { this.m_StartPoint = p1.clone(); this.m_EndPoint = p2.clone(); var vec = p2.clone().sub(p1); var len = vec.length(); var an = vec.angle(); this.m_Radius = len / Math.sin(2 * Math.atan(bul)) / 2; var allAngle = Math.atan(bul) * 4; var delDis = bul * len / 2; var toDis = this.m_Radius - delDis; an += Math.PI * 0.5; this.m_Center = p1.clone().add(p2); this.m_Center.multiplyScalar(0.5); GeUtils_1.polar(this.m_Center, an, toDis); this.m_StartAn = p1.clone().sub(this.m_Center).angle(); this.m_EndAn = p2.clone().sub(this.m_Center).angle(); if (bul < 0) { //一个神奇的特性 它需要这么做 this.m_StartAn -= Math.PI; this.m_EndAn -= Math.PI; } } return Arc2d; }()); exports.Arc2d = Arc2d; //创建轮廓 通过点表和凸度 function createPath(pts, buls, shapeOut) { var shape = shapeOut || new three_1.Shape(); if (pts.length === 0) return shape; var firstPt = pts[0]; shape.moveTo(firstPt.x, firstPt.y); for (var i = 0; i < pts.length - 1; i++) { var nextPt = pts[i + 1]; if (buls[i] == 0) { shape.lineTo(nextPt.x, nextPt.y); } else { var pt = pts[i]; //参考 //http://www.dorodnic.com/blog/tag/three-js/ 绘制一个齿轮 //https://www.kirupa.com/html5/drawing_circles_canvas.htm //html5 var arc2 = new Arc2d(pt, nextPt, buls[i]); var cen = arc2.m_Center; shape.absarc(cen.x, cen.y, arc2.m_Radius, arc2.m_StartAn, arc2.m_EndAn, buls[i] < 0); } } return shape; } exports.createPath = createPath; function getVec(data) { return new three_1.Vector3(data["x"], data["y"], data["z"]); } exports.getVec = getVec; //创建板件 暂时这么写 function createBoard(boardData) { var _a; var pts = []; var buls = []; var boardPts = boardData["Pts"]; var boardBuls = boardData["Buls"]; var boardHeight = boardData["H"]; var boardMat = new three_1.Matrix4(); var matInv = new three_1.Matrix4(); //InitBoardMat var xD = getVec(boardData["XVec"]); var yD = getVec(boardData["YVec"]); var ZD = getVec(boardData["ZVec"]); var pBase = getVec(boardData["BasePoint"]); boardMat.makeBasis(xD, yD, ZD); boardMat.setPosition(pBase); matInv.getInverse(boardMat); if (boardPts && boardPts.length !== 0) for (var i = 0; i < boardPts.length; i++) { var pt = getVec(boardPts[i]); if (boardPts[i].z !== undefined) pt.applyMatrix4(matInv); pts.push(new three_1.Vector2(pt.x, pt.y)); buls.push(boardBuls[i]); } else { var length_1 = boardData["L"]; var width = boardData["W"]; var height = boardData["H"]; pts.push(new three_1.Vector2(0, 0), new three_1.Vector2(width, 0), new three_1.Vector2(width, length_1), new three_1.Vector2(0, length_1), new three_1.Vector2(0, 0)); buls.push(0, 0, 0, 0, 0); } var sp = createPath(pts, buls); var extrudeSettings = { steps: 1, bevelEnabled: false, depth: boardHeight }; var ext = new three_1.ExtrudeGeometry(sp, extrudeSettings); ext.computeBoundingSphere(); ext.computeBoundingBox(); ext.translate(0, 0, -boardHeight); ext.applyMatrix4(boardMat); if (!GeUtils_1.equalv3(xD.clone().cross(yD), ZD)) { for (var _i = 0, _b = ext.faces; _i < _b.length; _i++) { var f = _b[_i]; _a = [f.c, f.a], f.a = _a[0], f.c = _a[1]; } } //外边. var edges = [createEdge(ext)]; //差集 if (checkObjectArray(boardData, "SubBoardLocal") || checkObjectArray(boardData, "Drillings")) { var thisCsg = new ThreeCSG_1.ThreeBSP(ext); if (boardData["SubBoardLocal"]) { var subBoardList = boardData["SubBoardLocal"].map(function (d) { return createBoard(d); }); for (var _c = 0, subBoardList_1 = subBoardList; _c < subBoardList_1.length; _c++) { var br = subBoardList_1[_c]; edges.push.apply(edges, br.edges); var subCsg = new ThreeCSG_1.ThreeBSP(br.mesh); thisCsg = thisCsg.subtract(subCsg); } } if (boardData["Drillings"]) { var dris = boardData["Drillings"]; for (var _d = 0, dris_1 = dris; _d < dris_1.length; _d++) { var dri = dris_1[_d]; var geo = new three_1.CylinderGeometry(dri.r, dri.r, dri.h, 8); geo.rotateX(Math.PI * 0.5); if (dri.f === 0) //0正 geo.translate(dri.x, dri.y, -dri.h * 0.5); else //1反 geo.translate(dri.x, dri.y, dri.h * 0.5 - boardData["H"]); geo.applyMatrix4(boardMat); var mesh_1 = new three_1.Mesh(geo, ColorPalette_1.ColorMaterial.GetBasicMaterial(1)); edges.push(mesh_1); // let edge = createEdge(geo); // edge.material = new LineBasicMaterial({ color: new Color(1, 0, 0) }); // edges.push(edge); // let subCsg = new ThreeBSP(geo); // thisCsg = thisCsg.subtract(subCsg); } } ext = thisCsg.toGeometry(); } if (boardData["BoardName"] === "地脚线") RotateUV_1.RotateUVs(ext); var mesh = new three_1.Mesh(ext, Material_1.boardMaterial); mesh.userData = ZD; edges.forEach(function (e) { return e.userData = ZD; }); return { mesh: mesh, edges: edges }; } exports.createBoard = createBoard; function checkObjectArray(obj, key) { return obj[key] && obj[key].length > 0; } function createTemplateBoard(brDataList) { var meshs = []; var edgesa = []; var relations = { blockMeshMap: new Map(), meshBlockMap: new Map() }; for (var _i = 0, brDataList_1 = brDataList; _i < brDataList_1.length; _i++) { var d = brDataList_1[_i]; var _a = createBoard(d), mesh = _a.mesh, edges = _a.edges; meshs.push(mesh); edgesa.push.apply(edgesa, edges); if (d['DataID']) { relations.blockMeshMap.set(d['DataID'], mesh.id); relations.meshBlockMap.set(mesh.id, d['DataID']); } } return { meshs: meshs, edgesa: edgesa, relations: relations }; } exports.createTemplateBoard = createTemplateBoard; function createEdge(geo) { var edge = new three_1.EdgesGeometry(geo, 1); return new three_1.LineSegments(edge, Material_1.edgeMaterial); } exports.createEdge = createEdge; //# sourceMappingURL=createBoard.js.map