Merge branch 'v2' into upgrade
This commit is contained in:
@@ -2,21 +2,20 @@
|
||||
// import "./style.css";
|
||||
import { Color, MeshBasicMaterial, Vector3 } from "three";
|
||||
import { CameraControlState } from "../CameraControls";
|
||||
import { data } from "../data";
|
||||
import { GetBox } from "../GeUtils";
|
||||
import { LoadBoard } from "../Utils";
|
||||
import { Viewer } from "../Viewer";
|
||||
|
||||
let btn = document.createElement("button");
|
||||
btn.innerHTML = "载入"
|
||||
btn.innerHTML = "载入";
|
||||
document.body.appendChild(btn);
|
||||
|
||||
let btn2 = document.createElement("button");
|
||||
btn2.innerHTML = "清理"
|
||||
btn2.innerHTML = "清理";
|
||||
document.body.appendChild(btn2);
|
||||
|
||||
let btn3 = document.createElement("button");
|
||||
btn3.innerHTML = "爆炸图"
|
||||
btn3.innerHTML = "爆炸图";
|
||||
document.body.appendChild(btn3);
|
||||
|
||||
let el = document.createElement("canvas");
|
||||
@@ -46,15 +45,16 @@ view.m_CameraCtrl.m_TouthTypeList = [CameraControlState.Pan, CameraControlState.
|
||||
btn.onclick = () =>
|
||||
{
|
||||
console.time();
|
||||
let data = require("./data.json");
|
||||
for (let i = 0; i < 1; i++)
|
||||
LoadBoard(view, data);
|
||||
console.timeEnd();
|
||||
}
|
||||
};
|
||||
|
||||
btn2.onclick = () =>
|
||||
{
|
||||
// LoadBoard(view, []);
|
||||
}
|
||||
};
|
||||
|
||||
btn3.onclick = () =>
|
||||
{
|
||||
@@ -101,5 +101,5 @@ btn3.onclick = () =>
|
||||
|
||||
if (count === 60)
|
||||
clearInterval(t);
|
||||
}, 16)
|
||||
}
|
||||
}, 16);
|
||||
};
|
||||
|
@@ -1,9 +1,8 @@
|
||||
import { CylinderGeometry, Geometry, LineSegments, Mesh, Shape, Vector2, Vector3, Matrix4, ExtrudeGeometry, EdgesGeometry, MeshBasicMaterial } from 'three';
|
||||
import { CylinderGeometry, EdgesGeometry, Geometry, LineSegments, Matrix4, Mesh, MeshBasicMaterial, Shape, Vector2, Vector3 } from 'three';
|
||||
import { boardUVGenerator2, ExtrudeSolid, Polyline } from 'webcad_ue4_api';
|
||||
import { ColorMaterial } from './ColorPalette';
|
||||
import { equalv3, polar } from './GeUtils';
|
||||
import { polar } from './GeUtils';
|
||||
import { edgeMaterial } from './Material';
|
||||
import { RotateUVs } from './RotateUV';
|
||||
import { ThreeBSP } from './ThreeCSG';
|
||||
//解析二维圆弧类.
|
||||
export class Arc2d
|
||||
{
|
||||
@@ -56,7 +55,7 @@ export function createPath(pts: Vector2[], buls: number[], shapeOut?: Shape): Sh
|
||||
let nextPt = pts[i + 1];
|
||||
if (buls[i] == 0)
|
||||
{
|
||||
shape.lineTo(nextPt.x, nextPt.y)
|
||||
shape.lineTo(nextPt.x, nextPt.y);
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -76,8 +75,7 @@ export function getVec(data: object): Vector3
|
||||
return new Vector3(data["x"], data["y"], data["z"]);
|
||||
}
|
||||
|
||||
//创建板件 暂时这么写
|
||||
export function createBoard(boardData: object, material: MeshBasicMaterial)
|
||||
function Conver2Ext(boardData: object): ExtrudeSolid
|
||||
{
|
||||
let pts: Vector2[] = [];
|
||||
let buls: number[] = [];
|
||||
@@ -93,6 +91,7 @@ export function createBoard(boardData: object, material: MeshBasicMaterial)
|
||||
let yD = getVec(boardData["YVec"]);
|
||||
let ZD = getVec(boardData["ZVec"]);
|
||||
let pBase = getVec(boardData["BasePoint"]);
|
||||
pBase.add(ZD.clone().multiplyScalar(-boardHeight));
|
||||
|
||||
boardMat.makeBasis(xD, yD, ZD);
|
||||
boardMat.setPosition(pBase);
|
||||
@@ -111,7 +110,6 @@ export function createBoard(boardData: object, material: MeshBasicMaterial)
|
||||
{
|
||||
let length = boardData["L"];
|
||||
let width = boardData["W"];
|
||||
let height = boardData["H"];
|
||||
pts.push(new Vector2(0, 0),
|
||||
new Vector2(width, 0),
|
||||
new Vector2(width, length),
|
||||
@@ -121,78 +119,66 @@ export function createBoard(boardData: object, material: MeshBasicMaterial)
|
||||
buls.push(0, 0, 0, 0, 0);
|
||||
}
|
||||
|
||||
let sp = createPath(pts, buls);
|
||||
let extrudeSettings = {
|
||||
steps: 1,
|
||||
bevelEnabled: false,
|
||||
depth: boardHeight
|
||||
};
|
||||
let ext = new ExtrudeSolid();
|
||||
ext.OCSNoClone.copy(boardMat);
|
||||
let pl = new Polyline(pts.map((p, i) => { return { pt: p, bul: buls[i] }; }));
|
||||
ext.Thickness = boardHeight;
|
||||
ext.ContourCurve = pl;
|
||||
|
||||
let ext = new ExtrudeGeometry(sp, extrudeSettings) as Geometry;
|
||||
ext.computeBoundingSphere();
|
||||
ext.computeBoundingBox();
|
||||
ext.translate(0, 0, -boardHeight)
|
||||
ext.applyMatrix4(boardMat);
|
||||
|
||||
if (!equalv3(xD.clone().cross(yD), ZD))
|
||||
{
|
||||
for (let f of ext.faces)
|
||||
[f.a, f.c] = [f.c, f.a];
|
||||
}
|
||||
|
||||
//外边.
|
||||
let edges: (LineSegments | Mesh)[] = [createEdge(ext)];
|
||||
|
||||
//差集
|
||||
if (checkObjectArray(boardData, "SubBoardLocal")
|
||||
|| checkObjectArray(boardData, "Drillings"))
|
||||
{
|
||||
let thisCsg = new ThreeBSP(ext);
|
||||
|
||||
if (boardData["SubBoardLocal"])
|
||||
{
|
||||
let subBoardList = boardData["SubBoardLocal"].map(d => createBoard(d, material));
|
||||
for (let br of subBoardList)
|
||||
{
|
||||
edges.push(...br.edges);
|
||||
let subCsg = new ThreeBSP(br.mesh);
|
||||
thisCsg = thisCsg.subtract(subCsg);
|
||||
}
|
||||
}
|
||||
if (boardData["Drillings"])
|
||||
{
|
||||
let dris = boardData["Drillings"];
|
||||
for (let dri of dris)
|
||||
{
|
||||
let geo = new 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);
|
||||
|
||||
let mesh = new Mesh(geo, ColorMaterial.GetBasicMaterial(1));
|
||||
edges.push(mesh);
|
||||
// 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 (checkObjectArray(boardData, "SubBoardLocal"))
|
||||
ext.Grooves.push(...boardData["SubBoardLocal"].map(Conver2Ext));
|
||||
return ext;
|
||||
}
|
||||
|
||||
//创建板件 暂时这么写
|
||||
export function createBoard(boardData: object, boardMaterial: MeshBasicMaterial)
|
||||
{
|
||||
let ext = Conver2Ext(boardData);
|
||||
if (boardData["BoardName"] === "地脚线")
|
||||
RotateUVs(ext);
|
||||
Object.defineProperty(ext, "UCGenerator",
|
||||
{
|
||||
get: function ()
|
||||
{
|
||||
return boardUVGenerator2;
|
||||
},
|
||||
});
|
||||
|
||||
let mesh = new Mesh(ext, material);
|
||||
mesh.userData = ZD;
|
||||
edges.forEach(e => e.userData = ZD);
|
||||
//板件被镜像时.
|
||||
// if (!equalv3(xD.clone().cross(yD), ZD))
|
||||
// {
|
||||
// for (let f of ext.faces)
|
||||
// [f.a, f.c] = [f.c, f.a];
|
||||
// }
|
||||
|
||||
//边
|
||||
let edges: (LineSegments | Mesh)[] = [new LineSegments(ext.EdgeGeometry, edgeMaterial)];
|
||||
edges[0].applyMatrix4(ext.OCSNoClone);
|
||||
|
||||
if (checkObjectArray(boardData, "Drillings"))
|
||||
{
|
||||
let dris = boardData["Drillings"];
|
||||
for (let dri of dris)
|
||||
{
|
||||
let geo = new 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 + boardData["H"]);
|
||||
else //1反
|
||||
geo.translate(dri.x, dri.y, dri.h * 0.5);
|
||||
|
||||
geo.applyMatrix4(ext.OCSNoClone);
|
||||
|
||||
let mesh = new Mesh(geo, ColorMaterial.GetBasicMaterial(1));
|
||||
edges.push(mesh);
|
||||
}
|
||||
}
|
||||
|
||||
let mesh = new Mesh(ext.MeshGeometry, boardMaterial);
|
||||
mesh.userData = ext.Normal;
|
||||
edges.forEach(e => e.userData = ext.Normal);
|
||||
mesh.applyMatrix4(ext.OCSNoClone);
|
||||
mesh.updateWorldMatrix(false, true);
|
||||
return { mesh, edges };
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user