使用新的webcad api进行建模

This commit is contained in:
xief
2022-02-16 13:48:57 +08:00
parent e712b7b4e2
commit 623fa9ac9a
11 changed files with 5288 additions and 146 deletions

View File

@@ -2,21 +2,20 @@
// import "./style.css";
import { 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");
@@ -36,15 +35,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 = () =>
{
@@ -91,5 +91,5 @@ btn3.onclick = () =>
if (count === 60)
clearInterval(t);
}, 16)
}
}, 16);
};

View File

@@ -1,9 +1,8 @@
import { CylinderGeometry, Geometry, LineSegments, Mesh, Shape, Vector2, Vector3, Matrix4, ExtrudeGeometry, EdgesGeometry } from 'three';
import { CylinderGeometry, EdgesGeometry, Geometry, LineSegments, Matrix4, Mesh, 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 { boardMaterial, 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)
function Conver2Ext(boardData: object): ExtrudeSolid
{
let pts: Vector2[] = [];
let buls: number[] = [];
@@ -93,6 +91,7 @@ export function createBoard(boardData: object)
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)
{
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)
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));
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)
{
let ext = Conver2Ext(boardData);
if (boardData["BoardName"] === "地脚线")
RotateUVs(ext);
Object.defineProperty(ext, "UCGenerator",
{
get: function ()
{
return boardUVGenerator2;
},
});
let mesh = new Mesh(ext, boardMaterial);
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 };
}