2018-05-28 09:49:45 +08:00
|
|
|
"use strict";
|
|
|
|
Object.defineProperty(exports, "__esModule", { value: true });
|
2018-06-06 17:23:22 +08:00
|
|
|
var THREE = require("three");
|
|
|
|
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");
|
2018-05-28 09:49:45 +08:00
|
|
|
//解析二维圆弧类.
|
2018-06-06 17:23:22 +08:00
|
|
|
var Arc2d = /** @class */ (function () {
|
|
|
|
function Arc2d(p1, p2, bul) {
|
2018-05-28 09:49:45 +08:00
|
|
|
this.m_StartPoint = p1.clone();
|
|
|
|
this.m_EndPoint = p2.clone();
|
2018-06-06 17:23:22 +08:00
|
|
|
var vec = p2.clone().sub(p1);
|
|
|
|
var len = vec.length();
|
|
|
|
var an = vec.angle();
|
2018-05-28 09:49:45 +08:00
|
|
|
this.m_Radius = len / Math.sin(2 * Math.atan(bul)) / 2;
|
2018-06-06 17:23:22 +08:00
|
|
|
var allAngle = Math.atan(bul) * 4;
|
|
|
|
var delDis = bul * len / 2;
|
|
|
|
var toDis = this.m_Radius - delDis;
|
2018-05-28 09:49:45 +08:00
|
|
|
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;
|
|
|
|
}
|
|
|
|
}
|
2018-06-06 17:23:22 +08:00
|
|
|
return Arc2d;
|
|
|
|
}());
|
2018-05-28 09:49:45 +08:00
|
|
|
exports.Arc2d = Arc2d;
|
|
|
|
//创建轮廓 通过点表和凸度
|
|
|
|
function createPath(pts, buls, shapeOut) {
|
2018-06-06 17:23:22 +08:00
|
|
|
var shape = shapeOut || new three_1.Shape();
|
2018-05-28 09:49:45 +08:00
|
|
|
if (pts.length === 0)
|
|
|
|
return shape;
|
2018-06-06 17:23:22 +08:00
|
|
|
var firstPt = pts[0];
|
2018-05-28 09:49:45 +08:00
|
|
|
shape.moveTo(firstPt.x, firstPt.y);
|
2018-06-06 17:23:22 +08:00
|
|
|
for (var i = 0; i < pts.length - 1; i++) {
|
|
|
|
var nextPt = pts[i + 1];
|
2018-05-28 09:49:45 +08:00
|
|
|
if (buls[i] == 0) {
|
|
|
|
shape.lineTo(nextPt.x, nextPt.y);
|
|
|
|
}
|
|
|
|
else {
|
2018-06-06 17:23:22 +08:00
|
|
|
var pt = pts[i];
|
2018-05-28 09:49:45 +08:00
|
|
|
//参考
|
|
|
|
//http://www.dorodnic.com/blog/tag/three-js/ 绘制一个齿轮
|
|
|
|
//https://www.kirupa.com/html5/drawing_circles_canvas.htm //html5
|
2018-06-06 17:23:22 +08:00
|
|
|
var arc2 = new Arc2d(pt, nextPt, buls[i]);
|
|
|
|
var cen = arc2.m_Center;
|
2018-05-28 09:49:45 +08:00
|
|
|
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.Vector3(data["x"], data["y"], data["z"]);
|
|
|
|
}
|
|
|
|
exports.getVec = getVec;
|
|
|
|
//创建板件 暂时这么写
|
|
|
|
function createBoard(boardData) {
|
2018-07-02 12:07:16 +08:00
|
|
|
var pts = [];
|
|
|
|
var buls = [];
|
2018-06-06 17:23:22 +08:00
|
|
|
var boardPts = boardData["Pts"];
|
|
|
|
var boardBuls = boardData["Buls"];
|
|
|
|
var boardHeight = boardData["H"];
|
|
|
|
var boardMat = new THREE.Matrix4();
|
|
|
|
var matInv = new THREE.Matrix4();
|
2018-05-28 09:49:45 +08:00
|
|
|
//InitBoardMat
|
|
|
|
{
|
2018-06-06 17:23:22 +08:00
|
|
|
var xD = getVec(boardData["XVec"]);
|
|
|
|
var yD = getVec(boardData["YVec"]);
|
|
|
|
var ZD = getVec(boardData["ZVec"]);
|
|
|
|
var pBase = getVec(boardData["BasePoint"]);
|
2018-05-28 09:49:45 +08:00
|
|
|
boardMat.makeBasis(xD, yD, ZD);
|
|
|
|
boardMat.setPosition(pBase);
|
|
|
|
matInv.getInverse(boardMat, true);
|
|
|
|
}
|
2018-05-29 09:27:09 +08:00
|
|
|
if (boardPts && boardPts.length !== 0)
|
2018-06-06 17:23:22 +08:00
|
|
|
for (var i = 0; i < boardPts.length; i++) {
|
|
|
|
var pt = getVec(boardPts[i]);
|
2018-05-29 10:13:37 +08:00
|
|
|
if (boardPts[i].z !== undefined)
|
2018-05-29 09:15:05 +08:00
|
|
|
pt.applyMatrix4(matInv);
|
|
|
|
pts.push(new THREE.Vector2(pt.x, pt.y));
|
|
|
|
buls.push(boardBuls[i]);
|
|
|
|
}
|
|
|
|
else {
|
2018-06-06 17:23:22 +08:00
|
|
|
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));
|
2018-05-29 09:15:05 +08:00
|
|
|
buls.push(0, 0, 0, 0, 0);
|
2018-05-28 09:49:45 +08:00
|
|
|
}
|
2018-06-06 17:23:22 +08:00
|
|
|
var sp = createPath(pts, buls);
|
|
|
|
var extrudeSettings = {
|
2018-05-28 09:49:45 +08:00
|
|
|
steps: 1,
|
|
|
|
bevelEnabled: false,
|
|
|
|
amount: boardHeight
|
|
|
|
};
|
2018-06-06 17:23:22 +08:00
|
|
|
var ext = new THREE.ExtrudeGeometry(sp, extrudeSettings);
|
2018-05-28 09:49:45 +08:00
|
|
|
ext.computeBoundingSphere();
|
|
|
|
ext.computeBoundingBox();
|
|
|
|
ext.translate(0, 0, -boardHeight);
|
|
|
|
ext.applyMatrix(boardMat);
|
|
|
|
//外边.
|
2018-06-06 17:23:22 +08:00
|
|
|
var edges = [createEdge(ext)];
|
2018-05-28 09:49:45 +08:00
|
|
|
//差集
|
2018-05-31 11:12:29 +08:00
|
|
|
if (checkObjectArray(boardData, "SubBoardLocal")
|
|
|
|
|| checkObjectArray(boardData, "Drillings")) {
|
2018-06-06 17:23:22 +08:00
|
|
|
var thisCsg = new ThreeCSG_1.ThreeBSP(ext);
|
2018-05-31 11:12:29 +08:00
|
|
|
if (boardData["SubBoardLocal"]) {
|
2018-06-06 17:23:22 +08:00
|
|
|
var subBoardList = boardData["SubBoardLocal"].map(function (d) { return createBoard(d); });
|
|
|
|
for (var _i = 0, subBoardList_1 = subBoardList; _i < subBoardList_1.length; _i++) {
|
|
|
|
var br = subBoardList_1[_i];
|
|
|
|
edges.push.apply(edges, br.edges);
|
|
|
|
var subCsg = new ThreeCSG_1.ThreeBSP(br.mesh);
|
2018-05-31 11:12:29 +08:00
|
|
|
thisCsg = thisCsg.subtract(subCsg);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if (boardData["Drillings"]) {
|
2018-06-06 17:23:22 +08:00
|
|
|
var dris = boardData["Drillings"];
|
|
|
|
for (var _a = 0, dris_1 = dris; _a < dris_1.length; _a++) {
|
|
|
|
var dri = dris_1[_a];
|
|
|
|
var geo = new three_1.CylinderGeometry(dri.r, dri.r, dri.h, 8);
|
2018-05-31 11:12:29 +08:00
|
|
|
geo.rotateX(Math.PI * 0.5);
|
2018-05-31 11:24:37 +08:00
|
|
|
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"]);
|
2018-05-31 11:12:29 +08:00
|
|
|
geo.applyMatrix(boardMat);
|
2018-06-06 17:23:22 +08:00
|
|
|
var mesh_1 = new three_1.Mesh(geo, ColorPalette_1.ColorMaterial.GetLineMaterial(1));
|
|
|
|
edges.push(mesh_1);
|
2018-05-31 11:12:29 +08:00
|
|
|
}
|
2018-05-28 09:49:45 +08:00
|
|
|
}
|
|
|
|
ext = thisCsg.toGeometry();
|
|
|
|
}
|
|
|
|
if (boardData["BoardName"] === "地脚线")
|
|
|
|
RotateUV_1.RotateUVs(ext);
|
2018-06-06 17:23:22 +08:00
|
|
|
var mesh = new THREE.Mesh(ext, Material_1.boardMaterial);
|
|
|
|
return { mesh: mesh, edges: edges };
|
2018-05-28 09:49:45 +08:00
|
|
|
}
|
|
|
|
exports.createBoard = createBoard;
|
2018-05-31 11:12:29 +08:00
|
|
|
function checkObjectArray(obj, key) {
|
|
|
|
return obj[key] && obj[key].length > 0;
|
|
|
|
}
|
2018-05-28 09:49:45 +08:00
|
|
|
function createTemplateBoard(brDataList) {
|
2018-06-06 17:23:22 +08:00
|
|
|
var meshs = [];
|
|
|
|
var edgesa = [];
|
|
|
|
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;
|
2018-05-28 09:49:45 +08:00
|
|
|
meshs.push(mesh);
|
2018-06-06 17:23:22 +08:00
|
|
|
edgesa.push.apply(edgesa, edges);
|
2018-05-28 09:49:45 +08:00
|
|
|
}
|
2018-06-06 17:23:22 +08:00
|
|
|
return { meshs: meshs, edgesa: edgesa };
|
2018-05-28 09:49:45 +08:00
|
|
|
}
|
|
|
|
exports.createTemplateBoard = createTemplateBoard;
|
|
|
|
function createEdge(geo) {
|
2018-06-06 17:23:22 +08:00
|
|
|
var edge = new THREE.EdgesGeometry(geo, 1);
|
2018-05-28 09:49:45 +08:00
|
|
|
return new three_1.LineSegments(edge, Material_1.edgeMaterial);
|
|
|
|
}
|
|
|
|
exports.createEdge = createEdge;
|
|
|
|
//# sourceMappingURL=createBoard.js.map
|