调整板初始化代码,新增自定义编号

This commit is contained in:
xief
2023-07-13 11:57:28 +08:00
parent eb736bce84
commit e70354267b
7 changed files with 1273 additions and 2326 deletions

View File

@@ -1,8 +1,7 @@
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 { EdgesGeometry, Geometry, LineSegments, MeshBasicMaterial, Shape, Vector2 } from 'three';
import { polar } from './GeUtils';
import { edgeMaterial } from './Material';
import { SimpleBoard } from './SimpleBoard';
//解析二维圆弧类.
export class Arc2d
{
@@ -70,122 +69,11 @@ export function createPath(pts: Vector2[], buls: number[], shapeOut?: Shape): Sh
}
return shape;
}
export function getVec(data: object): Vector3
{
return new Vector3(data["x"], data["y"], data["z"]);
}
function Conver2Ext(boardData: object): ExtrudeSolid
{
let pts: Vector2[] = [];
let buls: number[] = [];
let boardPts = boardData["Pts"];
let boardBuls = boardData["Buls"];
let boardHeight = boardData["H"];
let boardMat = new Matrix4();
let matInv: Matrix4 = new Matrix4();
//InitBoardMat
let xD = getVec(boardData["XVec"]);
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);
matInv.getInverse(boardMat);
if (boardPts && boardPts.length !== 0)
for (let i = 0; i < boardPts.length; i++)
{
let pt = getVec(boardPts[i]);
if (boardPts[i].z !== undefined)
pt.applyMatrix4(matInv);
pts.push(new Vector2(pt.x, pt.y));
buls.push(boardBuls[i]);
}
else
{
let length = boardData["L"];
let width = boardData["W"];
pts.push(new Vector2(0, 0),
new Vector2(width, 0),
new Vector2(width, length),
new Vector2(0, length),
new Vector2(0, 0)
);
buls.push(0, 0, 0, 0, 0);
}
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;
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"] === "地脚线")
Object.defineProperty(ext, "UCGenerator",
{
get: function ()
{
return boardUVGenerator2;
},
});
//板件被镜像时.
// 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 };
}
function checkObjectArray(obj: any, key: string)
{
return obj[key] && obj[key].length > 0;
}
export function createTemplateBoard(brDataList: any[], material: MeshBasicMaterial)
{
@@ -198,14 +86,15 @@ export function createTemplateBoard(brDataList: any[], material: MeshBasicMateri
};
for (let d of brDataList)
{
let { mesh, edges } = createBoard(d, material);
let board = new SimpleBoard(d);
let { mesh, edges } = board.createBoard(material);
meshs.push(mesh);
edgesa.push(...edges);
if (d['DataID'])
if (board.DataID)
{
relations.blockMeshMap.set(d['DataID'], mesh.id);
relations.meshBlockMap.set(mesh.id, d['DataID']);
relations.blockMeshMap.set(board.DataID, mesh.id);
relations.meshBlockMap.set(mesh.id, board.DataID);
}
}
return { meshs, edgesa, relations };