使用新的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

31
.vscode/settings.json vendored
View File

@ -3,8 +3,10 @@
"typescript.tsdk": "node_modules\\typescript\\lib", "typescript.tsdk": "node_modules\\typescript\\lib",
// //
"editor.tabSize": 4, "editor.tabSize": 4,
"editor.formatOnPaste": true, "editor.formatOnPaste": false,
"editor.formatOnSave": true, "editor.formatOnSave": true,
"editor.insertSpaces": true,
"editor.detectIndentation": false,
// //
"typescript.format.placeOpenBraceOnNewLineForFunctions": true, "typescript.format.placeOpenBraceOnNewLineForFunctions": true,
"typescript.format.placeOpenBraceOnNewLineForControlBlocks": true, "typescript.format.placeOpenBraceOnNewLineForControlBlocks": true,
@ -12,5 +14,30 @@
"javascript.format.placeOpenBraceOnNewLineForFunctions": true, "javascript.format.placeOpenBraceOnNewLineForFunctions": true,
"javascript.format.enable": true, "javascript.format.enable": true,
"files.insertFinalNewline": true, "files.insertFinalNewline": true,
"editor.detectIndentation": true, "typescript.format.semicolons": "insert",
"files.trimFinalNewlines": true,
"files.trimTrailingWhitespace": true,
//
"editor.codeActionsOnSave": {
"source.organizeImports": true,
},
"gitlens.remotes": [
{
"domain": "gitee.com",
"type": "Custom",
"name": "码云",
"protocol": "https",
"urls": {
"repository": "https://gitee.com/cf-fz/${repoPath}",
"branches": "https://gitee.com/cf-fz/${repoPath}/branches",
"branch": "https://gitee.com/cf-fz/${repoPath}/commits/${branch}",
"commit": "https://gitee.com/cf-fz/${repoPath}/commit/${id}",
"file": "https://gitee.com/cf-fz/${repoPath}?path=${file}${line}",
"fileInBranch": "https://gitee.com/cf-fz/${repoPath}/blob/${branch}/${file}${line}",
"fileInCommit": "https://gitee.com/cf-fz/${repoPath}/blob/${id}/${file}${line}",
"fileLine": "#L${line}",
"fileRange": "#L${start}-L${end}"
}
}
],
} }

View File

@ -1,3 +1,6 @@
# 显示板件的控件 # 显示板件的控件
使用例子请参照项目:[CADViewSample](http://git.cf/cx/CADViewSample) 使用例子请参照项目:[CADViewSample](http://git.cf/cx/CADViewSample)
删除"@types/webpack-merge" 下的 node_modules/webpack 定义 坑爹导致项目跑不起来

View File

@ -1,6 +1,4 @@
import * as HardSourceWebpackPlugin from 'hard-source-webpack-plugin';
import * as webpack from 'webpack'; import * as webpack from 'webpack';
import ForkTsCheckerWebpackPlugin = require('fork-ts-checker-webpack-plugin');
const TS_LOADER = [ const TS_LOADER = [
{ loader: 'cache-loader', options: { cacheDirectory: "node_modules/.cache_loader" } }, { loader: 'cache-loader', options: { cacheDirectory: "node_modules/.cache_loader" } },
@ -33,8 +31,6 @@ const config: webpack.Configuration = {
}, },
plugins: [ plugins: [
new HardSourceWebpackPlugin(),
new ForkTsCheckerWebpackPlugin({ checkSyntacticErrors: true }),
] ]
} }

View File

@ -1,7 +1,7 @@
import path from 'path';
import * as webpack from 'webpack'; import * as webpack from 'webpack';
import * as merge from 'webpack-merge'; import merge from 'webpack-merge';
import common from './webpack.common'; import common from './webpack.common';
import * as path from 'path';
const config: webpack.Configuration = merge( const config: webpack.Configuration = merge(
common, common,

View File

@ -1,7 +1,7 @@
import * as webpack from 'webpack'; import * as webpack from 'webpack';
import * as merge from 'webpack-merge'; import merge from 'webpack-merge';
import common from './webpack.common'; import common from './webpack.common';
import * as HtmlWebPackPlugin from "html-webpack-plugin"; import HtmlWebPackPlugin from "html-webpack-plugin";
const config: webpack.Configuration = merge( const config: webpack.Configuration = merge(
common, common,

View File

@ -1,47 +1,50 @@
{ {
"name": "cadview", "name": "cadview",
"version": "1.1.9", "version": "1.1.9",
"description": "", "description": "",
"main": "dist/index.js", "main": "dist/index.js",
"types": "dist/index.d.ts", "types": "dist/index.d.ts",
"private": true, "private": true,
"scripts": { "scripts": {
"t": "tsc --noEmit -w", "t": "tsc --noEmit -w",
"build": "tsc", "build": "tsc",
"umd": "webpack --config ./config/webpack.umd.ts", "umd": "webpack --config ./config/webpack.umd.ts",
"dev": "webpack-dev-server --config ./config/webpack.view.ts" "dev": "webpack-dev-server --config ./config/webpack.view.ts",
}, "postinstall": "ts-node ./utils/rmtype.ts"
"repository": { },
"type": "git", "repository": {
"url": "http://git.cf/cx/CADViewComponent.git" "type": "git",
}, "url": "http://git.cf/cx/CADViewComponent.git"
"author": "cx", },
"license": "ISC", "author": "cx",
"devDependencies": { "license": "ISC",
"@types/hard-source-webpack-plugin": "^1.0.1", "devDependencies": {
"@types/node": "^13.13.4", "@types/hard-source-webpack-plugin": "^1.0.1",
"@types/three": "^0.103.2", "@types/node": "^13.13.52",
"@types/uglifyjs-webpack-plugin": "^1.1.0", "@types/three": "^0.103.2",
"@types/webpack": "^4.41.12", "@types/uglifyjs-webpack-plugin": "^1.1.0",
"@types/webpack-dev-server": "^3.10.1", "@types/webpack": "^4.41.32",
"@types/webpack-env": "^1.15.2", "@types/webpack-dev-server": "^3.11.6",
"@types/webpack-merge": "^4.1.5", "@types/webpack-env": "^1.15.2",
"awesome-typescript-loader": "^5.2.1", "@types/webpack-merge": "^4.1.5",
"cache-loader": "^4.1.0", "awesome-typescript-loader": "^5.2.1",
"fork-ts-checker-webpack-plugin": "^4.1.3", "cache-loader": "^4.1.0",
"hard-source-webpack-plugin": "^0.13.1", "fork-ts-checker-webpack-plugin": "^4.1.6",
"html-webpack-plugin": "^4.2.1", "hard-source-webpack-plugin": "^0.13.1",
"ts-loader": "^7.0.2", "html-webpack-plugin": "^4.5.2",
"ts-node": "^8.9.1", "ts-loader": "^7.0.5",
"typescript": "^3.8.3", "ts-node": "^8.10.2",
"uglifyjs-webpack-plugin": "^2.2.0", "typescript": "^4.5.5",
"webpack": "^4.43.0", "uglifyjs-webpack-plugin": "^2.2.0",
"webpack-cli": "^3.3.11", "webpack": "^4.46.0",
"webpack-dev-server": "^3.10.3", "webpack-cli": "^3.3.12",
"webpack-merge": "^4.2.2" "webpack-dev-server": "^3.11.3",
}, "webpack-merge": "^4.2.2"
"dependencies": { },
"three": "^0.115.0", "dependencies": {
"wolfy87-eventemitter": "^5.2.9" "@jscad/modeling": "^2.7.1",
} "flatbush": "^3.3.0",
"three": "^0.115.0",
"webcad_ue4_api": "http://gitea.cf/cx/webcad-ue4-api/archive/0.2.3.tar.gz"
}
} }

View File

@ -2,21 +2,20 @@
// import "./style.css"; // import "./style.css";
import { Vector3 } from "three"; import { Vector3 } from "three";
import { CameraControlState } from "../CameraControls"; import { CameraControlState } from "../CameraControls";
import { data } from "../data";
import { GetBox } from "../GeUtils"; import { GetBox } from "../GeUtils";
import { LoadBoard } from "../Utils"; import { LoadBoard } from "../Utils";
import { Viewer } from "../Viewer"; import { Viewer } from "../Viewer";
let btn = document.createElement("button"); let btn = document.createElement("button");
btn.innerHTML = "载入" btn.innerHTML = "载入";
document.body.appendChild(btn); document.body.appendChild(btn);
let btn2 = document.createElement("button"); let btn2 = document.createElement("button");
btn2.innerHTML = "清理" btn2.innerHTML = "清理";
document.body.appendChild(btn2); document.body.appendChild(btn2);
let btn3 = document.createElement("button"); let btn3 = document.createElement("button");
btn3.innerHTML = "爆炸图" btn3.innerHTML = "爆炸图";
document.body.appendChild(btn3); document.body.appendChild(btn3);
let el = document.createElement("canvas"); let el = document.createElement("canvas");
@ -36,15 +35,16 @@ view.m_CameraCtrl.m_TouthTypeList = [CameraControlState.Pan, CameraControlState.
btn.onclick = () => btn.onclick = () =>
{ {
console.time(); console.time();
let data = require("./data.json");
for (let i = 0; i < 1; i++) for (let i = 0; i < 1; i++)
LoadBoard(view, data); LoadBoard(view, data);
console.timeEnd(); console.timeEnd();
} };
btn2.onclick = () => btn2.onclick = () =>
{ {
// LoadBoard(view, []); // LoadBoard(view, []);
} };
btn3.onclick = () => btn3.onclick = () =>
{ {
@ -91,5 +91,5 @@ btn3.onclick = () =>
if (count === 60) if (count === 60)
clearInterval(t); 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 { ColorMaterial } from './ColorPalette';
import { equalv3, polar } from './GeUtils'; import { polar } from './GeUtils';
import { boardMaterial, edgeMaterial } from './Material'; import { boardMaterial, edgeMaterial } from './Material';
import { RotateUVs } from './RotateUV';
import { ThreeBSP } from './ThreeCSG';
//解析二维圆弧类. //解析二维圆弧类.
export class Arc2d export class Arc2d
{ {
@ -56,7 +55,7 @@ export function createPath(pts: Vector2[], buls: number[], shapeOut?: Shape): Sh
let nextPt = pts[i + 1]; let nextPt = pts[i + 1];
if (buls[i] == 0) if (buls[i] == 0)
{ {
shape.lineTo(nextPt.x, nextPt.y) shape.lineTo(nextPt.x, nextPt.y);
} }
else else
{ {
@ -76,8 +75,7 @@ export function getVec(data: object): Vector3
return new Vector3(data["x"], data["y"], data["z"]); return new Vector3(data["x"], data["y"], data["z"]);
} }
//创建板件 暂时这么写 function Conver2Ext(boardData: object): ExtrudeSolid
export function createBoard(boardData: object)
{ {
let pts: Vector2[] = []; let pts: Vector2[] = [];
let buls: number[] = []; let buls: number[] = [];
@ -93,6 +91,7 @@ export function createBoard(boardData: object)
let yD = getVec(boardData["YVec"]); let yD = getVec(boardData["YVec"]);
let ZD = getVec(boardData["ZVec"]); let ZD = getVec(boardData["ZVec"]);
let pBase = getVec(boardData["BasePoint"]); let pBase = getVec(boardData["BasePoint"]);
pBase.add(ZD.clone().multiplyScalar(-boardHeight));
boardMat.makeBasis(xD, yD, ZD); boardMat.makeBasis(xD, yD, ZD);
boardMat.setPosition(pBase); boardMat.setPosition(pBase);
@ -111,7 +110,6 @@ export function createBoard(boardData: object)
{ {
let length = boardData["L"]; let length = boardData["L"];
let width = boardData["W"]; let width = boardData["W"];
let height = boardData["H"];
pts.push(new Vector2(0, 0), pts.push(new Vector2(0, 0),
new Vector2(width, 0), new Vector2(width, 0),
new Vector2(width, length), new Vector2(width, length),
@ -121,78 +119,66 @@ export function createBoard(boardData: object)
buls.push(0, 0, 0, 0, 0); buls.push(0, 0, 0, 0, 0);
} }
let sp = createPath(pts, buls); let ext = new ExtrudeSolid();
let extrudeSettings = { ext.OCSNoClone.copy(boardMat);
steps: 1, let pl = new Polyline(pts.map((p, i) => { return { pt: p, bul: buls[i] }; }));
bevelEnabled: false, ext.Thickness = boardHeight;
depth: boardHeight ext.ContourCurve = pl;
};
let ext = new ExtrudeGeometry(sp, extrudeSettings) as Geometry; if (checkObjectArray(boardData, "SubBoardLocal"))
ext.computeBoundingSphere(); ext.Grooves.push(...boardData["SubBoardLocal"].map(Conver2Ext));
ext.computeBoundingBox(); return ext;
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();
}
//创建板件 暂时这么写
export function createBoard(boardData: object)
{
let ext = Conver2Ext(boardData);
if (boardData["BoardName"] === "地脚线") if (boardData["BoardName"] === "地脚线")
RotateUVs(ext); Object.defineProperty(ext, "UCGenerator",
{
get: function ()
{
return boardUVGenerator2;
},
});
let mesh = new Mesh(ext, boardMaterial); //板件被镜像时.
mesh.userData = ZD; // if (!equalv3(xD.clone().cross(yD), ZD))
edges.forEach(e => e.userData = 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 }; return { mesh, edges };
} }

View File

@ -1,10 +1,13 @@
{ {
"compileOnSave": true,
"compilerOptions": { "compilerOptions": {
"sourceMap": true,
"declaration": true,
"outDir": "./dist", "outDir": "./dist",
"target": "esnext", "sourceMap": true,
"module": "commonjs",
"target": "es2020",
"noLib": false,
"moduleResolution": "node",
"skipLibCheck": true,
"esModuleInterop": true,
"lib": [ "lib": [
"esnext", "esnext",
"dom" "dom"
@ -12,13 +15,13 @@
"types": [ "types": [
"node", "node",
"webpack-env", "webpack-env",
"webpack-dev-server" "webpack-dev-server",
], ],
"module": "commonjs", "jsx": "react",
"experimentalDecorators": true "experimentalDecorators": true
}, },
"include": [ "include": [
"./src/**/*", "./src/**/*",
// "./config/**/*" "./config/**/*"
] ]
} }

7
utils/rmtype.ts Normal file
View File

@ -0,0 +1,7 @@
import fs from "fs";
fs.rmdir(".\\node_modules\\@types\\webpack-merge\\node_modules\\webpack", { recursive: true }, (err) =>
{
console.log("删除webpack目录");
if (err) console.log(err);
});

5117
yarn.lock Normal file

File diff suppressed because it is too large Load Diff