Compare commits
28 Commits
Author | SHA1 | Date | |
---|---|---|---|
49a327cbee | |||
f22f1acd52 | |||
![]() |
f60054ca19 | ||
![]() |
a55986761e | ||
![]() |
e5b944539e | ||
![]() |
27dd548309 | ||
![]() |
965ae43070 | ||
![]() |
36541f1617 | ||
![]() |
fba276362c | ||
![]() |
66dbe5869e | ||
![]() |
e70354267b | ||
![]() |
eb736bce84 | ||
![]() |
40258eeaf4 | ||
![]() |
623fa9ac9a | ||
![]() |
c586096fe0 | ||
![]() |
0aa70fdb14 | ||
![]() |
93ac737777 | ||
![]() |
01110a8858 | ||
![]() |
77f997b849 | ||
![]() |
23fa547a3a | ||
![]() |
d266b5ac2d | ||
![]() |
5bccd97ab1 | ||
![]() |
caa39923dd | ||
![]() |
35347e004e | ||
![]() |
2fd1b48d32 | ||
![]() |
a10bb71035 | ||
![]() |
1fbd3d6563 | ||
![]() |
fc4c46d280 |
1
.gitignore
vendored
1
.gitignore
vendored
@ -1,3 +1,4 @@
|
||||
/node_modules
|
||||
/package-lock.json
|
||||
.history
|
||||
/dist
|
||||
|
31
.vscode/settings.json
vendored
31
.vscode/settings.json
vendored
@ -3,8 +3,10 @@
|
||||
"typescript.tsdk": "node_modules\\typescript\\lib",
|
||||
//格式化设置
|
||||
"editor.tabSize": 4,
|
||||
"editor.formatOnPaste": true,
|
||||
"editor.formatOnPaste": false,
|
||||
"editor.formatOnSave": true,
|
||||
"editor.insertSpaces": true,
|
||||
"editor.detectIndentation": false,
|
||||
//格式设置
|
||||
"typescript.format.placeOpenBraceOnNewLineForFunctions": true,
|
||||
"typescript.format.placeOpenBraceOnNewLineForControlBlocks": true,
|
||||
@ -12,5 +14,30 @@
|
||||
"javascript.format.placeOpenBraceOnNewLineForFunctions": true,
|
||||
"javascript.format.enable": 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}"
|
||||
}
|
||||
}
|
||||
],
|
||||
}
|
||||
|
@ -1,3 +1,6 @@
|
||||
# 显示板件的控件
|
||||
|
||||
使用例子请参照项目:[CADViewSample](http://git.cf/cx/CADViewSample)
|
||||
|
||||
|
||||
删除"@types/webpack-merge" 下的 node_modules/webpack 定义 坑爹导致项目跑不起来
|
||||
|
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@ -1,41 +0,0 @@
|
||||
import * as HardSourceWebpackPlugin from 'hard-source-webpack-plugin';
|
||||
import * as webpack from 'webpack';
|
||||
import ForkTsCheckerWebpackPlugin = require('fork-ts-checker-webpack-plugin');
|
||||
|
||||
const TS_LOADER = [
|
||||
{ loader: 'cache-loader', options: { cacheDirectory: "node_modules/.cache_loader" } },
|
||||
{
|
||||
loader: 'ts-loader',
|
||||
options: {
|
||||
transpileOnly: true,
|
||||
experimentalWatchApi: true,
|
||||
},
|
||||
}
|
||||
];
|
||||
|
||||
const config: webpack.Configuration = {
|
||||
devtool: "source-map",
|
||||
//项目需要解析的文件拓展名称
|
||||
resolve: {
|
||||
extensions: [".ts", ".tsx", ".js", "json"]
|
||||
},
|
||||
//模块加载器设置
|
||||
module: {
|
||||
rules: [
|
||||
{
|
||||
test: /\.tsx?$/,
|
||||
exclude: /node_modules/,
|
||||
use: TS_LOADER,
|
||||
},
|
||||
{ test: /\.css$/, loader: ['style-loader', 'css-loader'] },
|
||||
{ test: /\.[(jpg)|(png)|(obj)|(json)]$/, loader: "url-loader" },
|
||||
]
|
||||
},
|
||||
|
||||
plugins: [
|
||||
new HardSourceWebpackPlugin(),
|
||||
new ForkTsCheckerWebpackPlugin({ checkSyntacticErrors: true }),
|
||||
]
|
||||
}
|
||||
|
||||
export default config;
|
@ -1,24 +0,0 @@
|
||||
import * as webpack from 'webpack';
|
||||
import * as merge from 'webpack-merge';
|
||||
import common from './webpack.common';
|
||||
import * as path from 'path';
|
||||
|
||||
const config: webpack.Configuration = merge(
|
||||
common,
|
||||
{
|
||||
mode: "production",
|
||||
entry: "./src/index.ts",
|
||||
externals: {
|
||||
'three': "THREE"
|
||||
},
|
||||
//输出设置
|
||||
output: {
|
||||
filename: "cad.js",
|
||||
path: path.resolve(__dirname, './umd'),
|
||||
library: "cad",
|
||||
libraryTarget: "umd"
|
||||
},
|
||||
}
|
||||
);
|
||||
|
||||
export default config;
|
@ -1,29 +0,0 @@
|
||||
import * as webpack from 'webpack';
|
||||
import * as merge from 'webpack-merge';
|
||||
import common from './webpack.common';
|
||||
import * as HtmlWebPackPlugin from "html-webpack-plugin";
|
||||
|
||||
const config: webpack.Configuration = merge(
|
||||
common,
|
||||
{
|
||||
mode: "development",
|
||||
entry: "./src/ViewSrc/index.ts",
|
||||
output: { pathinfo: false },
|
||||
devtool: "eval-source-map",
|
||||
devServer: {
|
||||
contentBase: "./dist/",
|
||||
port: 7776,
|
||||
hot: true,
|
||||
},
|
||||
plugins: [
|
||||
new webpack.NamedModulesPlugin(),//Hot
|
||||
new webpack.HotModuleReplacementPlugin(),//Hot
|
||||
new HtmlWebPackPlugin({
|
||||
title: "webCAD",
|
||||
// template: './src/index.html'
|
||||
}),
|
||||
]
|
||||
}
|
||||
);
|
||||
|
||||
export default config;
|
16
index.html
Normal file
16
index.html
Normal file
@ -0,0 +1,16 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="UTF-8" />
|
||||
<meta
|
||||
name="viewport"
|
||||
content="width=device-width,initial-scale=1.0,maximum-scale=1.0"
|
||||
/>
|
||||
<meta http-equiv="X-UA-Compatible" content="ie=edge" />
|
||||
<title>CADViewComponent</title>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<script type="module" src="/src/ViewSrc/index.ts"></script>
|
||||
</body>
|
||||
</html>
|
483
package-lock.json
generated
483
package-lock.json
generated
File diff suppressed because it is too large
Load Diff
77
package.json
77
package.json
@ -1,47 +1,34 @@
|
||||
{
|
||||
"name": "cadview",
|
||||
"version": "1.1.9",
|
||||
"description": "",
|
||||
"main": "dist/index.js",
|
||||
"types": "dist/index.d.ts",
|
||||
"private": true,
|
||||
"scripts": {
|
||||
"t": "tsc --noEmit -w",
|
||||
"build": "tsc",
|
||||
"umd": "webpack --config ./config/webpack.umd.ts",
|
||||
"dev": "webpack-dev-server --config ./config/webpack.view.ts"
|
||||
},
|
||||
"repository": {
|
||||
"type": "git",
|
||||
"url": "http://git.cf/cx/CADViewComponent.git"
|
||||
},
|
||||
"author": "cx",
|
||||
"license": "ISC",
|
||||
"devDependencies": {
|
||||
"@types/hard-source-webpack-plugin": "^1.0.1",
|
||||
"@types/node": "^13.13.4",
|
||||
"@types/three": "^0.103.2",
|
||||
"@types/uglifyjs-webpack-plugin": "^1.1.0",
|
||||
"@types/webpack": "^4.41.12",
|
||||
"@types/webpack-dev-server": "^3.10.1",
|
||||
"@types/webpack-env": "^1.15.2",
|
||||
"@types/webpack-merge": "^4.1.5",
|
||||
"awesome-typescript-loader": "^5.2.1",
|
||||
"cache-loader": "^4.1.0",
|
||||
"fork-ts-checker-webpack-plugin": "^4.1.3",
|
||||
"hard-source-webpack-plugin": "^0.13.1",
|
||||
"html-webpack-plugin": "^4.2.1",
|
||||
"ts-loader": "^7.0.2",
|
||||
"ts-node": "^8.9.1",
|
||||
"typescript": "^3.8.3",
|
||||
"uglifyjs-webpack-plugin": "^2.2.0",
|
||||
"webpack": "^4.43.0",
|
||||
"webpack-cli": "^3.3.11",
|
||||
"webpack-dev-server": "^3.10.3",
|
||||
"webpack-merge": "^4.2.2"
|
||||
},
|
||||
"dependencies": {
|
||||
"three": "^0.115.0",
|
||||
"wolfy87-eventemitter": "^5.2.9"
|
||||
}
|
||||
"name": "cadview",
|
||||
"version": "1.1.9",
|
||||
"description": "",
|
||||
"main": "src/index.ts",
|
||||
"private": true,
|
||||
"scripts": {
|
||||
"dev": "vite --host",
|
||||
"build": "tsc && vite build",
|
||||
"preview": "vite preview"
|
||||
},
|
||||
"repository": {
|
||||
"type": "git",
|
||||
"url": "http://git.cf/cx/CADViewComponent.git"
|
||||
},
|
||||
"author": "cx",
|
||||
"license": "ISC",
|
||||
"devDependencies": {
|
||||
"@types/node": "^13.13.52",
|
||||
"@types/three": "^0.103.2",
|
||||
"typescript": "^5.0.2",
|
||||
"vite": "^4.4.5"
|
||||
},
|
||||
"dependencies": {
|
||||
"@jscad/modeling": "^2.11.0",
|
||||
"flatbush": "^3.3.0",
|
||||
"three": "npm:three-cf@0.122.5",
|
||||
"js-angusj-clipper": "^1.2.1",
|
||||
"polylabel": "^1.1.0",
|
||||
"xaop": "^2.0.0",
|
||||
"webcad_ue4_api": "http://gitea.cf/cx/webcad-ue4-api/archive/3.2.4.tar.gz"
|
||||
},
|
||||
"packageManager": "pnpm@9.1.1+sha1.09ada6cd05003e0ced25fb716f9fda4063ec2e3b"
|
||||
}
|
||||
|
@ -1,24 +1,24 @@
|
||||
import * as THREE from 'three';
|
||||
|
||||
import { KeyBoard, MouseKey } from './KeyEnum';
|
||||
import { Vector3 } from 'three';
|
||||
import { equaln } from './GeUtils';
|
||||
import { KeyBoard, MouseKey } from './KeyEnum';
|
||||
import { Viewer } from './Viewer';
|
||||
|
||||
//相机控制状态
|
||||
export enum CameraControlState
|
||||
{
|
||||
Null = 0, Pan = 1, Rotate = 2, Scale = 3
|
||||
Null = 0, Pan = 1, Rotate = 2, Scale = 4
|
||||
}
|
||||
|
||||
export class CameraControls
|
||||
{
|
||||
m_TouthTypeList = [CameraControlState.Rotate, CameraControlState.Scale, CameraControlState.Pan];
|
||||
m_TouthTypeList = [CameraControlState.Rotate, CameraControlState.Scale | CameraControlState.Pan, CameraControlState.Pan];
|
||||
m_domElement: HTMLElement;//HTMLDocument
|
||||
//起始点击
|
||||
m_StartClickPoint: THREE.Vector3 = new THREE.Vector3();
|
||||
m_EndClickPoint: THREE.Vector3 = new THREE.Vector3();
|
||||
m_DollyStart: THREE.Vector2 = new THREE.Vector2();
|
||||
m_DollyEnd: THREE.Vector2 = new THREE.Vector2();
|
||||
m_DollyStart: number;
|
||||
|
||||
m_KeyDown = new Map<KeyBoard, boolean>();
|
||||
m_MouseDown = new Map<MouseKey, boolean>();
|
||||
@ -40,16 +40,16 @@ export class CameraControls
|
||||
{
|
||||
if (this.m_domElement)
|
||||
{
|
||||
this.m_domElement.addEventListener("mousedown", this.onMouseDown, false)
|
||||
this.m_domElement.addEventListener("mousemove", this.onMouseMove, false)
|
||||
this.m_domElement.addEventListener("mouseup", this.onMouseUp, false)
|
||||
this.m_domElement.addEventListener("mousedown", this.onMouseDown, false);
|
||||
this.m_domElement.addEventListener("mousemove", this.onMouseMove, false);
|
||||
this.m_domElement.addEventListener("mouseup", this.onMouseUp, false);
|
||||
window.addEventListener("keydown", this.onKeyDown, false);
|
||||
window.addEventListener("keyup", this.onKeyUp, false);
|
||||
this.m_domElement.addEventListener('wheel', this.onMouseWheel, false);
|
||||
this.m_domElement.addEventListener('wheel', this.onMouseWheel, { passive: false });
|
||||
|
||||
this.m_domElement.addEventListener('touchstart', this.onTouchStart, false);
|
||||
this.m_domElement.addEventListener('touchstart', this.onTouchStart, { passive: false });
|
||||
this.m_domElement.addEventListener('touchend', this.onTouchEnd, false);
|
||||
this.m_domElement.addEventListener('touchmove', this.onTouchMove, false);
|
||||
this.m_domElement.addEventListener('touchmove', this.onTouchMove, { passive: false });
|
||||
|
||||
window.addEventListener("blur", this.onBlur, false);
|
||||
}
|
||||
@ -62,7 +62,7 @@ export class CameraControls
|
||||
{
|
||||
this.m_KeyDown.clear();
|
||||
this.m_MouseDown.clear();
|
||||
}
|
||||
};
|
||||
|
||||
//触屏开始事件
|
||||
onTouchStart = (event: TouchEvent) =>
|
||||
@ -76,15 +76,15 @@ export class CameraControls
|
||||
var dx = event.touches[0].pageX - event.touches[1].pageX;
|
||||
var dy = event.touches[0].pageY - event.touches[1].pageY;
|
||||
var distance = Math.sqrt(dx * dx + dy * dy);
|
||||
this.m_DollyStart.set(0, distance);
|
||||
this.m_DollyStart = distance;
|
||||
}
|
||||
this.m_State = this.m_TouthTypeList[event.touches.length - 1];
|
||||
}
|
||||
}
|
||||
};
|
||||
onTouchEnd = (event: TouchEvent) =>
|
||||
{
|
||||
this.m_State = CameraControlState.Null;
|
||||
}
|
||||
};
|
||||
onTouchMove = (event: TouchEvent) =>
|
||||
{
|
||||
event.preventDefault();
|
||||
@ -93,40 +93,38 @@ export class CameraControls
|
||||
this.m_EndClickPoint.set(event.touches[0].pageX, event.touches[0].pageY, 0);
|
||||
|
||||
let vec = this.m_EndClickPoint.clone().sub(this.m_StartClickPoint);
|
||||
switch (this.m_State)
|
||||
{
|
||||
case CameraControlState.Pan:
|
||||
{
|
||||
this.m_Viewer.Pan(vec);
|
||||
break;
|
||||
}
|
||||
case CameraControlState.Scale:
|
||||
{
|
||||
var dx = event.touches[0].pageX - event.touches[1].pageX;
|
||||
var dy = event.touches[0].pageY - event.touches[1].pageY;
|
||||
|
||||
var distance = Math.sqrt(dx * dx + dy * dy);
|
||||
this.m_DollyEnd.set(0, distance);
|
||||
if (distance > this.m_DollyStart.y)
|
||||
{
|
||||
this.m_Viewer.Zoom(0.95);
|
||||
}
|
||||
else
|
||||
{
|
||||
this.m_Viewer.Zoom(1.05)
|
||||
}
|
||||
this.m_DollyStart.copy(this.m_DollyEnd);
|
||||
break;
|
||||
}
|
||||
case CameraControlState.Rotate:
|
||||
if (this.m_State & CameraControlState.Pan)
|
||||
{
|
||||
this.m_Viewer.Pan(vec);
|
||||
}
|
||||
if (this.m_State & CameraControlState.Scale)
|
||||
{
|
||||
var dx = event.touches[0].pageX - event.touches[1].pageX;
|
||||
var dy = event.touches[0].pageY - event.touches[1].pageY;
|
||||
|
||||
var distance = Math.sqrt(dx * dx + dy * dy);
|
||||
if (!equaln(this.m_DollyStart / distance, 1, 0.05))//轻微防抖
|
||||
{
|
||||
|
||||
if (distance > this.m_DollyStart)
|
||||
{
|
||||
this.m_Viewer.Rotate(vec.multiplyScalar(2));
|
||||
break;
|
||||
this.m_Viewer.Zoom(0.95);
|
||||
}
|
||||
else
|
||||
{
|
||||
this.m_Viewer.Zoom(1.05);
|
||||
}
|
||||
this.m_DollyStart = distance;
|
||||
}
|
||||
}
|
||||
if (this.m_State & CameraControlState.Rotate)
|
||||
{
|
||||
this.m_Viewer.Rotate(vec.multiplyScalar(2));
|
||||
}
|
||||
this.m_StartClickPoint.copy(this.m_EndClickPoint);
|
||||
this.m_Viewer.m_bNeedUpdate = true;
|
||||
}
|
||||
};
|
||||
beginRotate()
|
||||
{
|
||||
this.m_State = CameraControlState.Rotate;
|
||||
@ -178,13 +176,13 @@ export class CameraControls
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
||||
onMouseUp = (event: MouseEvent) =>
|
||||
{
|
||||
event.preventDefault();
|
||||
this.m_State = CameraControlState.Null;
|
||||
this.m_MouseDown.set(event.button, false);
|
||||
}
|
||||
};
|
||||
onMouseMove = (event: MouseEvent) =>
|
||||
{
|
||||
event.preventDefault();
|
||||
@ -195,28 +193,16 @@ export class CameraControls
|
||||
(this.m_LeftUseRotate ||
|
||||
(this.m_KeyDown.get(KeyBoard.Control))
|
||||
)
|
||||
&& this.m_State == CameraControlState.Rotate
|
||||
&& this.m_State & CameraControlState.Rotate
|
||||
)
|
||||
{
|
||||
this.m_Viewer.Rotate(changeVec);
|
||||
}
|
||||
switch (this.m_State)
|
||||
if (this.m_State & CameraControlState.Pan)
|
||||
{
|
||||
case CameraControlState.Pan:
|
||||
{
|
||||
this.m_Viewer.Pan(changeVec);
|
||||
break;
|
||||
}
|
||||
case CameraControlState.Rotate:
|
||||
{
|
||||
break;
|
||||
}
|
||||
case CameraControlState.Scale:
|
||||
{
|
||||
break;
|
||||
}
|
||||
this.m_Viewer.Pan(changeVec);
|
||||
}
|
||||
}
|
||||
};
|
||||
/**
|
||||
* 鼠标滚轮事件
|
||||
*
|
||||
@ -237,14 +223,14 @@ export class CameraControls
|
||||
{
|
||||
this.m_Viewer.Zoom(1.4, pt);
|
||||
}
|
||||
}
|
||||
};
|
||||
//按键
|
||||
onKeyDown = (event: KeyboardEvent) =>
|
||||
{
|
||||
this.m_KeyDown.set(event.keyCode, true);
|
||||
}
|
||||
};
|
||||
onKeyUp = (event: KeyboardEvent) =>
|
||||
{
|
||||
this.m_KeyDown.set(event.keyCode, false);
|
||||
}
|
||||
};
|
||||
}
|
||||
|
@ -1,5 +1,5 @@
|
||||
import * as THREE from 'three';
|
||||
import { LineBasicMaterial, MeshBasicMaterial, Color } from 'three';
|
||||
import { Color, LineBasicMaterial, MeshBasicMaterial } from 'three';
|
||||
const ColorPalette = [
|
||||
[255, 0, 0, 255], //----- 0 - lets make it red for an example
|
||||
//[255, 255, 255, 255],//----- 0 - ByBlock - White
|
||||
@ -284,7 +284,7 @@ export class ColorMaterial
|
||||
{
|
||||
if (this.m_BasicMaterialMap.has(index))
|
||||
return this.m_BasicMaterialMap.get(index);
|
||||
let mat = new MeshBasicMaterial({ color: this.GetColor(index) });
|
||||
let mat = new MeshBasicMaterial({ color: this.GetColor(index), side: THREE.DoubleSide });
|
||||
this.m_BasicMaterialMap.set(index, mat);
|
||||
return mat;
|
||||
}
|
||||
|
@ -1,4 +1,4 @@
|
||||
import { Box3, Matrix4, Mesh, Vector3 } from "three";
|
||||
import { Matrix4, Mesh, Vector3 } from "three";
|
||||
import { Dimension, GetBoxArr } from ".";
|
||||
|
||||
|
||||
@ -19,7 +19,7 @@ export function DrawDimension(brList: Mesh[]): Dimension[]
|
||||
new Vector3(-1, 0, 0),
|
||||
new Vector3(0, -1, 0),
|
||||
new Vector3(0, 0, 1)
|
||||
)
|
||||
);
|
||||
mat4.setPosition(box.min.clone().add(new Vector3(size.x, -30)));
|
||||
|
||||
let textHeight = 45;
|
||||
@ -31,7 +31,7 @@ export function DrawDimension(brList: Mesh[]): Dimension[]
|
||||
new Vector3(0, 0, -1),
|
||||
new Vector3(1, 0, 0),
|
||||
new Vector3(0, -1, 0)
|
||||
)
|
||||
);
|
||||
mat4.setPosition(box.max.clone().add(new Vector3(30, -size.y)));
|
||||
dimz.applyMatrix4(mat4);
|
||||
|
||||
@ -40,7 +40,7 @@ export function DrawDimension(brList: Mesh[]): Dimension[]
|
||||
new Vector3(0, 1, 0),
|
||||
new Vector3(-1, 0, 0),
|
||||
new Vector3(0, 0, 1)
|
||||
)
|
||||
);
|
||||
mat4.setPosition(box.max.clone().add(new Vector3(30, -size.y)));
|
||||
dimy.applyMatrix4(mat4);
|
||||
|
||||
|
@ -1,4 +1,4 @@
|
||||
import { Geometry, Vector, Vector2, Vector3, Box3, Matrix4, Object3D, Line, Mesh } from 'three';
|
||||
import { Box3, Geometry, Line, Matrix4, Mesh, Object3D, Vector2, Vector3, type Vector } from 'three';
|
||||
import { Matrix2 } from './Matrix2';
|
||||
|
||||
|
||||
@ -112,7 +112,7 @@ export function getLoocAtUpVec(dir: Vector3): Vector3
|
||||
{
|
||||
if (dir.equals(cZeroVec))
|
||||
{
|
||||
throw ("zero vector")
|
||||
throw ("zero vector");
|
||||
}
|
||||
let norm = dir.clone().normalize();
|
||||
if (norm.equals(cZAxis))
|
||||
@ -151,8 +151,8 @@ export function ptToString(v: Vector3, fractionDigits: number = 3): string
|
||||
{
|
||||
return v.toArray().map(o =>
|
||||
{
|
||||
return o.toFixed(fractionDigits)
|
||||
}).join(",")
|
||||
return o.toFixed(fractionDigits);
|
||||
}).join(",");
|
||||
}
|
||||
|
||||
export function midPoint(v1: Vector3, v2: Vector3): Vector3
|
||||
@ -230,7 +230,7 @@ export function getProjectDist(v1: Vector3, v2: Vector3)
|
||||
return {
|
||||
h: dist * Math.cos(ang),
|
||||
v: dist * Math.sin(ang)
|
||||
}
|
||||
};
|
||||
}
|
||||
//获得输入点在2线组成的4个区间的位置
|
||||
export function getPtPostion(sp: Vector3, ep: Vector3, c: Vector3, inPt: Vector3)
|
||||
@ -255,10 +255,10 @@ export function getPtPostion(sp: Vector3, ep: Vector3, c: Vector3, inPt: Vector3
|
||||
return { sp, ep };
|
||||
} else if (inputAng > ang1 && inputAng <= ang2)
|
||||
{
|
||||
return { sp: c.clone().add(l3), ep }
|
||||
return { sp: c.clone().add(l3), ep };
|
||||
} else if (inputAng > ang2 && inputAng <= ang3)
|
||||
{
|
||||
return { sp: c.clone().add(l3), ep: c.clone().add(l4) }
|
||||
return { sp: c.clone().add(l3), ep: c.clone().add(l4) };
|
||||
} else
|
||||
{
|
||||
return { sp, ep: c.clone().add(l4) };
|
||||
@ -277,7 +277,7 @@ export function angleAndX(v: Vector3 | Vector2)
|
||||
export function angleTo2Pi(an: number)
|
||||
{
|
||||
an = an % (Math.PI * 2);
|
||||
if (an < 0) an += Math.PI * 2
|
||||
if (an < 0) an += Math.PI * 2;
|
||||
return an;
|
||||
}
|
||||
export function updateGeometry(l: Line | Mesh, geometry: Geometry)
|
||||
|
@ -1,9 +1,9 @@
|
||||
import * as THREE from 'three';
|
||||
import { Vector3, Line3 } from "three";
|
||||
import { Vector3, Line3, Plane } from "three";
|
||||
|
||||
export class PlaneExt extends THREE.Plane
|
||||
export class PlaneExt extends Plane
|
||||
{
|
||||
constructor(normal?: THREE.Vector3, constant?: number)
|
||||
constructor(normal?: Vector3, constant?: number)
|
||||
{
|
||||
super(normal, constant);
|
||||
}
|
||||
|
185
src/SimpleBoard.ts
Normal file
185
src/SimpleBoard.ts
Normal file
@ -0,0 +1,185 @@
|
||||
import { CylinderGeometry, LineSegments, Matrix4, Mesh, MeshBasicMaterial, Vector2, Vector3 } from "three";
|
||||
import { ExtrudeSolid, Polyline, boardUVGenerator2 } from "webcad_ue4_api";
|
||||
import { ColorMaterial } from "./ColorPalette";
|
||||
import { edgeMaterial } from "./Material";
|
||||
import { DbText } from "./Text";
|
||||
|
||||
function getVec(data: object): Vector3
|
||||
{
|
||||
return new Vector3(data["x"], data["y"], data["z"]);
|
||||
}
|
||||
|
||||
enum BoardType
|
||||
{
|
||||
Layer = 0,
|
||||
Vertical = 1,
|
||||
Behind = 2
|
||||
}
|
||||
export class SimpleBoard
|
||||
{
|
||||
BoardName: string;
|
||||
boardPts: any[];
|
||||
boardBuls: any[];
|
||||
xD: Vector3;
|
||||
yD: Vector3;
|
||||
zD: Vector3;
|
||||
height: number;
|
||||
width: number;
|
||||
|
||||
thickness: number;
|
||||
pBase: Vector3;
|
||||
SubBoardLocal: any[];
|
||||
Drillings: any[];
|
||||
DataID: number;
|
||||
_BoardType: BoardType;
|
||||
_CustomNumber: string;
|
||||
|
||||
constructor(boardData: any)
|
||||
{
|
||||
this.boardPts = boardData["Pts"];
|
||||
this.boardBuls = boardData["Buls"];
|
||||
this.pBase = getVec(boardData["BasePoint"]);
|
||||
|
||||
this.xD = getVec(boardData["XVec"]);
|
||||
this.yD = getVec(boardData["YVec"]);
|
||||
this.zD = getVec(boardData["ZVec"]);
|
||||
|
||||
this.SubBoardLocal = boardData["SubBoardLocal"] ?? [];
|
||||
|
||||
this.Drillings = boardData["Drillings"] ?? [];
|
||||
|
||||
this.height = boardData["L"];
|
||||
this.width = boardData["W"];
|
||||
this.thickness = boardData["H"];
|
||||
|
||||
this.BoardName = boardData["BoardName"];
|
||||
this.DataID = boardData['DataID'];
|
||||
|
||||
this._BoardType = boardData['BoardType'];
|
||||
this._CustomNumber = boardData['CustomNumber'];
|
||||
}
|
||||
|
||||
public Conver2Ext(): ExtrudeSolid
|
||||
{
|
||||
let pts: Vector2[] = [];
|
||||
let buls: number[] = [];
|
||||
|
||||
|
||||
let boardMat = new Matrix4();
|
||||
let matInv: Matrix4 = new Matrix4();
|
||||
//InitBoardMat
|
||||
|
||||
this.pBase.add(this.zD.clone().multiplyScalar(-this.thickness));
|
||||
|
||||
boardMat.makeBasis(this.xD, this.yD, this.zD);
|
||||
boardMat.setPosition(this.pBase);
|
||||
matInv.getInverse(boardMat);
|
||||
|
||||
if (this.boardPts && this.boardPts.length !== 0)
|
||||
for (let i = 0; i < this.boardPts.length; i++)
|
||||
{
|
||||
let pt = getVec(this.boardPts[i]);
|
||||
if (this.boardPts[i].z !== undefined)
|
||||
pt.applyMatrix4(matInv);
|
||||
pts.push(new Vector2(pt.x, pt.y));
|
||||
buls.push(this.boardBuls[i]);
|
||||
}
|
||||
else
|
||||
{
|
||||
|
||||
pts.push(new Vector2(0, 0),
|
||||
new Vector2(this.width, 0),
|
||||
new Vector2(this.width, this.height),
|
||||
new Vector2(0, this.height),
|
||||
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 = this.thickness;
|
||||
ext.ContourCurve = pl;
|
||||
|
||||
if (this.SubBoardLocal.length > 0)
|
||||
ext.Grooves.push(...this.SubBoardLocal.map(sub => new SimpleBoard(sub).Conver2Ext()));
|
||||
return ext;
|
||||
}
|
||||
|
||||
createBoard(boardMaterial: MeshBasicMaterial)
|
||||
{
|
||||
let ext = this.Conver2Ext();
|
||||
if (this.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 (this.Drillings.length > 0)
|
||||
{
|
||||
let dris = this.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 + this.thickness);
|
||||
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);
|
||||
// 自定义编号
|
||||
if (this._CustomNumber)
|
||||
{
|
||||
mesh.add(this.createCustomNo());
|
||||
}
|
||||
mesh.applyMatrix4(ext.OCSNoClone);
|
||||
mesh.updateWorldMatrix(false, true);
|
||||
|
||||
|
||||
|
||||
return { mesh, edges };
|
||||
}
|
||||
private createCustomNo()
|
||||
{
|
||||
let text = new DbText(this._CustomNumber?.toString(), 100);
|
||||
let position = new Vector3(this.width * 0.5, this.height * 0.5, this.thickness * 0.5);
|
||||
if (this._BoardType === BoardType.Layer)
|
||||
{
|
||||
text.applyMatrix4(new Matrix4().makeRotationZ(-Math.PI / 2).setPosition(position));
|
||||
}
|
||||
else
|
||||
{
|
||||
text.applyMatrix4(new Matrix4().setPosition(position));
|
||||
}
|
||||
|
||||
// text.CreateDoubleMesh(this._BoardType === BoardType.Layer);
|
||||
|
||||
return text;
|
||||
}
|
||||
}
|
70
src/Text.ts
70
src/Text.ts
@ -1,43 +1,59 @@
|
||||
import { Font, FontLoader, Mesh, ShapeGeometry, Vector3 } from "three";
|
||||
import { Font, FontLoader, Matrix4, Mesh, Shape, ShapeGeometry, Vector3 } from "three";
|
||||
import f from "../resources/fonts/helvetiker_regular.typeface.json";
|
||||
import { ColorMaterial } from "./ColorPalette";
|
||||
import { MoveMatrix } from "./GeUtils";
|
||||
import { XAxis, XAxisN, YAxis, YAxisN, ZAxisN } from "./Utils";
|
||||
|
||||
class FontLoaderUtil
|
||||
{
|
||||
private static defFont: Font;
|
||||
static Load(): Font
|
||||
{
|
||||
if (!this.defFont)
|
||||
private static defFont: Font;
|
||||
static Load(): Font
|
||||
{
|
||||
const f = require("../resources/fonts/helvetiker_regular.typeface.json");
|
||||
let loader = new FontLoader();
|
||||
this.defFont = loader.parse(f);
|
||||
if (!this.defFont)
|
||||
{
|
||||
let loader = new FontLoader();
|
||||
this.defFont = loader.parse(f);
|
||||
}
|
||||
return this.defFont;
|
||||
}
|
||||
return this.defFont;
|
||||
}
|
||||
}
|
||||
|
||||
export class DbText extends Mesh
|
||||
{
|
||||
/**
|
||||
*
|
||||
* 构造一个文本对象,8位点(中心点下面)在0点
|
||||
* @param {string} str 数字字符串
|
||||
* @param {number} height 文本高度
|
||||
* @memberof DbText
|
||||
*/
|
||||
constructor(str: string, height: number = 5)
|
||||
{
|
||||
let font = FontLoaderUtil.Load();
|
||||
/**
|
||||
*
|
||||
* 构造一个文本对象,8位点(中心点下面)在0点
|
||||
* @param {string} str 数字字符串
|
||||
* @param {number} height 文本高度
|
||||
* @memberof DbText
|
||||
*/
|
||||
constructor(str: string, height: number = 5)
|
||||
{
|
||||
let font = FontLoaderUtil.Load();
|
||||
|
||||
let shapes: THREE.Shape[] = font.generateShapes(str, height);
|
||||
let geometry = new ShapeGeometry(shapes);
|
||||
let shapes: Shape[] = font.generateShapes(str, height);
|
||||
let geometry = new ShapeGeometry(shapes);
|
||||
|
||||
geometry.computeBoundingBox();
|
||||
geometry.computeBoundingBox();
|
||||
|
||||
super(geometry, ColorMaterial.GetBasicMaterial(5));
|
||||
super(geometry, ColorMaterial.GetBasicMaterial(5));
|
||||
|
||||
let center = geometry.boundingBox.getCenter(new Vector3());
|
||||
this.applyMatrix4(MoveMatrix(new Vector3(-center.x, 0, 0)));
|
||||
}
|
||||
let center = geometry.boundingBox.getCenter(new Vector3());
|
||||
this.applyMatrix4(MoveMatrix(new Vector3(-center.x, 0, 0)));
|
||||
}
|
||||
|
||||
CreateDoubleMesh(IsFsText: boolean)
|
||||
{
|
||||
let mesh2 = new Mesh(this.geometry, ColorMaterial.GetBasicMaterial(5));
|
||||
//左右视图时应该这样,俯视图是X,-Y,-Z(y+=(xxx)
|
||||
if (IsFsText)
|
||||
{
|
||||
mesh2.applyMatrix4(new Matrix4().makeBasis(XAxis, YAxisN, ZAxisN));
|
||||
}
|
||||
else
|
||||
{
|
||||
mesh2.applyMatrix4(new Matrix4().makeBasis(XAxisN, YAxis, ZAxisN));
|
||||
}
|
||||
this.add(mesh2);
|
||||
}
|
||||
}
|
||||
|
16
src/Utils.ts
16
src/Utils.ts
@ -1,5 +1,12 @@
|
||||
import { Object3D } from "three";
|
||||
import { createTemplateBoard, DrawDimension, Viewer } from ".";
|
||||
import { Object3D, Vector3 } from "three";
|
||||
import { DrawDimension, Viewer, createTemplateBoard } from ".";
|
||||
|
||||
export const XAxis = new Vector3(1, 0, 0);
|
||||
export const XAxisN = new Vector3(-1, 0, 0);
|
||||
export const YAxis = new Vector3(0, 1, 0);
|
||||
export const YAxisN = new Vector3(0, -1, 0);
|
||||
export const ZAxis = new Vector3(0, 0, 1);
|
||||
export const ZAxisN = new Vector3(0, 0, -1);
|
||||
|
||||
function dispose(m: Object3D)
|
||||
{
|
||||
@ -21,7 +28,8 @@ export function LoadBoard(view: Viewer, data: any[], clear: boolean = true)
|
||||
|
||||
if (data.length === 0) return;
|
||||
//加板
|
||||
let { meshs, edgesa } = createTemplateBoard(data);
|
||||
let { meshs, edgesa, relations } = createTemplateBoard(data, view._Settings.boardMaterial);
|
||||
|
||||
//加标注
|
||||
let dims = DrawDimension(meshs);
|
||||
|
||||
@ -32,4 +40,6 @@ export function LoadBoard(view: Viewer, data: any[], clear: boolean = true)
|
||||
view.ViewToSwiso();
|
||||
view.ZoomAll();
|
||||
view.Zoom(1.1);
|
||||
|
||||
return relations;
|
||||
}
|
||||
|
@ -1,444 +1,197 @@
|
||||
[
|
||||
{
|
||||
"L": 4408.678960586129,
|
||||
"W": 4408.678960586129,
|
||||
"H": 18,
|
||||
"CabName": "主卧",
|
||||
"BoardName": "",
|
||||
"BasePoint": {
|
||||
"x": -82.91743119266054,
|
||||
"y": 73.39449541284404,
|
||||
"z": 0
|
||||
},
|
||||
"XVec": {
|
||||
"x": 0,
|
||||
"y": 1,
|
||||
"z": 0
|
||||
},
|
||||
"YVec": {
|
||||
"x": 0,
|
||||
"y": 0,
|
||||
"z": 1
|
||||
},
|
||||
"ZVec": {
|
||||
"x": 1,
|
||||
"y": 0,
|
||||
"z": 0
|
||||
},
|
||||
"Grain": 0,
|
||||
"Pts": [
|
||||
{
|
||||
"x": 4408.678960586129,
|
||||
"y": 2204.3394802930643
|
||||
},
|
||||
{
|
||||
"x": 0,
|
||||
"y": 2204.3394802930648
|
||||
},
|
||||
{
|
||||
"x": 4408.678960586129,
|
||||
"y": 2204.3394802930643
|
||||
}
|
||||
],
|
||||
"Buls": [
|
||||
-0.9999999999999999,
|
||||
-0.9999999999999999,
|
||||
0
|
||||
],
|
||||
"SubBoardLocal": [
|
||||
{
|
||||
"L": 633.2307692307686,
|
||||
"W": 633.2307692307686,
|
||||
"H": 5,
|
||||
"CabName": "",
|
||||
"BoardName": "",
|
||||
"BasePoint": {
|
||||
"x": -95.91743119266054,
|
||||
"y": 2910.9647449366785,
|
||||
"z": 1405.2625572161414
|
||||
},
|
||||
"XVec": {
|
||||
"x": 0,
|
||||
"y": 1,
|
||||
"z": 0
|
||||
},
|
||||
"YVec": {
|
||||
"x": 0,
|
||||
"y": 0,
|
||||
"z": 1
|
||||
},
|
||||
"ZVec": {
|
||||
"x": 1,
|
||||
"y": 0,
|
||||
"z": 0
|
||||
},
|
||||
"Grain": 0,
|
||||
"Pts": [
|
||||
{
|
||||
"x": 633.2307692307686,
|
||||
"y": 316.6153846153843
|
||||
},
|
||||
{
|
||||
"x": 0,
|
||||
"y": 316.61538461538436
|
||||
},
|
||||
{
|
||||
"x": 633.2307692307686,
|
||||
"y": 316.6153846153843
|
||||
}
|
||||
],
|
||||
"Buls": [
|
||||
-0.9999999999999999,
|
||||
-0.9999999999999999,
|
||||
0
|
||||
],
|
||||
"SubBoardLocal": [],
|
||||
"SubBoardAssoc": null,
|
||||
"Drillings": null
|
||||
},
|
||||
{
|
||||
"L": 557.8461538461524,
|
||||
"W": 557.8461538461524,
|
||||
"H": 5,
|
||||
"CabName": "",
|
||||
"BoardName": "",
|
||||
"BasePoint": {
|
||||
"x": -82.91743119266054,
|
||||
"y": 3016.50320647514,
|
||||
"z": 2257.1087110622957
|
||||
},
|
||||
"XVec": {
|
||||
"x": 0,
|
||||
"y": 1,
|
||||
"z": 0
|
||||
},
|
||||
"YVec": {
|
||||
"x": 0,
|
||||
"y": 0,
|
||||
"z": 1
|
||||
},
|
||||
"ZVec": {
|
||||
"x": 1,
|
||||
"y": 0,
|
||||
"z": 0
|
||||
},
|
||||
"Grain": 0,
|
||||
"Pts": [
|
||||
{
|
||||
"x": 557.8461538461524,
|
||||
"y": 278.9230769230762
|
||||
},
|
||||
{
|
||||
"x": 0,
|
||||
"y": 278.9230769230763
|
||||
},
|
||||
{
|
||||
"x": 557.8461538461524,
|
||||
"y": 278.9230769230762
|
||||
}
|
||||
],
|
||||
"Buls": [
|
||||
-0.9999999999999999,
|
||||
-0.9999999999999999,
|
||||
0
|
||||
],
|
||||
"SubBoardLocal": [],
|
||||
"SubBoardAssoc": null,
|
||||
"Drillings": null
|
||||
},
|
||||
{
|
||||
"L": 444.76923076923117,
|
||||
"W": 686,
|
||||
"H": 5,
|
||||
"CabName": "",
|
||||
"BoardName": "",
|
||||
"BasePoint": {
|
||||
"x": -95.91743119266054,
|
||||
"y": 1689.7339757059085,
|
||||
"z": 1556.0317879853721
|
||||
},
|
||||
"XVec": {
|
||||
"x": 0,
|
||||
"y": 1,
|
||||
"z": 0
|
||||
},
|
||||
"YVec": {
|
||||
"x": 0,
|
||||
"y": 0,
|
||||
"z": 1
|
||||
},
|
||||
"ZVec": {
|
||||
"x": 1,
|
||||
"y": 0,
|
||||
"z": 0
|
||||
},
|
||||
"Grain": 0,
|
||||
"Pts": [
|
||||
{
|
||||
"x": 0,
|
||||
"y": 0
|
||||
},
|
||||
{
|
||||
"x": 686,
|
||||
"y": 0
|
||||
},
|
||||
{
|
||||
"x": 686,
|
||||
"y": 444.76923076923117
|
||||
},
|
||||
{
|
||||
"x": 0,
|
||||
"y": 444.76923076923117
|
||||
},
|
||||
{
|
||||
"x": 0,
|
||||
"y": 0
|
||||
}
|
||||
],
|
||||
"Buls": [
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0
|
||||
],
|
||||
"SubBoardLocal": [],
|
||||
"SubBoardAssoc": null,
|
||||
"Drillings": null
|
||||
},
|
||||
{
|
||||
"L": 625.6923076923076,
|
||||
"W": 1349.3846153846157,
|
||||
"H": 5,
|
||||
"CabName": "",
|
||||
"BoardName": "",
|
||||
"BasePoint": {
|
||||
"x": -82.91743119266054,
|
||||
"y": 1177.1185910905238,
|
||||
"z": 2626.493326446911
|
||||
},
|
||||
"XVec": {
|
||||
"x": 0,
|
||||
"y": 1,
|
||||
"z": 0
|
||||
},
|
||||
"YVec": {
|
||||
"x": 0,
|
||||
"y": 0,
|
||||
"z": 1
|
||||
},
|
||||
"ZVec": {
|
||||
"x": 1,
|
||||
"y": 0,
|
||||
"z": 0
|
||||
},
|
||||
"Grain": 0,
|
||||
"Pts": [
|
||||
{
|
||||
"x": 0,
|
||||
"y": 0
|
||||
},
|
||||
{
|
||||
"x": 1349.3846153846157,
|
||||
"y": 0
|
||||
},
|
||||
{
|
||||
"x": 1349.3846153846157,
|
||||
"y": 625.6923076923076
|
||||
},
|
||||
{
|
||||
"x": 0,
|
||||
"y": 625.6923076923076
|
||||
},
|
||||
{
|
||||
"x": 0,
|
||||
"y": 0
|
||||
}
|
||||
],
|
||||
"Buls": [
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0
|
||||
],
|
||||
"SubBoardLocal": [],
|
||||
"SubBoardAssoc": null,
|
||||
"Drillings": null
|
||||
}
|
||||
],
|
||||
"SubBoardAssoc": null,
|
||||
"Drillings": null
|
||||
},
|
||||
{
|
||||
"L": 2000,
|
||||
"DataID": 3996018,
|
||||
"OrderNo": 20230727027642,
|
||||
"L": 800,
|
||||
"W": 600,
|
||||
"H": 18,
|
||||
"CabName": "主卧",
|
||||
"BoardName": "",
|
||||
"BoardName": "层板",
|
||||
"Grain": 0,
|
||||
"BoardType": 0,
|
||||
"CustomNumber": "",
|
||||
"BasePoint": {
|
||||
"x": 1099.0825688073396,
|
||||
"y": 73.39449541284404,
|
||||
"z": 0
|
||||
"x": 1877.02062480031,
|
||||
"y": -1.77635683940025e-13,
|
||||
"z": 823.651271182857
|
||||
},
|
||||
"XVec": {
|
||||
"x": 0,
|
||||
"x": 2.22044604925031e-16,
|
||||
"y": 1,
|
||||
"z": 0
|
||||
},
|
||||
"YVec": {
|
||||
"x": -1,
|
||||
"y": 2.22044604925031e-16,
|
||||
"z": 0
|
||||
},
|
||||
"ZVec": {
|
||||
"x": 0,
|
||||
"y": 0,
|
||||
"z": 1
|
||||
},
|
||||
"Pts": [],
|
||||
"Buls": [],
|
||||
"SubBoardLocal": [],
|
||||
"SubBoardAssoc": [],
|
||||
"Drillings": [
|
||||
{
|
||||
"x": 50,
|
||||
"y": 766,
|
||||
"r": 7.5,
|
||||
"h": 13.5,
|
||||
"f": 0
|
||||
},
|
||||
{
|
||||
"x": 300,
|
||||
"y": 766,
|
||||
"r": 7.5,
|
||||
"h": 13.5,
|
||||
"f": 0
|
||||
},
|
||||
{
|
||||
"x": 550,
|
||||
"y": 766,
|
||||
"r": 7.5,
|
||||
"h": 13.5,
|
||||
"f": 0
|
||||
},
|
||||
{
|
||||
"x": 550,
|
||||
"y": 34,
|
||||
"r": 7.5,
|
||||
"h": 13.5,
|
||||
"f": 0
|
||||
},
|
||||
{
|
||||
"x": 300,
|
||||
"y": 34,
|
||||
"r": 7.5,
|
||||
"h": 13.5,
|
||||
"f": 0
|
||||
},
|
||||
{
|
||||
"x": 50,
|
||||
"y": 34,
|
||||
"r": 7.5,
|
||||
"h": 13.5,
|
||||
"f": 0
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"DataID": 3996019,
|
||||
"OrderNo": 20230727027642,
|
||||
"L": 1200,
|
||||
"W": 600,
|
||||
"H": 18,
|
||||
"BoardName": "右侧板",
|
||||
"Grain": 0,
|
||||
"BoardType": 0,
|
||||
"CustomNumber": "",
|
||||
"BasePoint": {
|
||||
"x": 1895.02062480031,
|
||||
"y": 0,
|
||||
"z": 214.651271182857
|
||||
},
|
||||
"XVec": {
|
||||
"x": 4.93038065763132e-32,
|
||||
"y": 1,
|
||||
"z": -2.22044604925031e-16
|
||||
},
|
||||
"YVec": {
|
||||
"x": -2.22044604925031e-16,
|
||||
"y": 2.22044604925031e-16,
|
||||
"z": 1
|
||||
},
|
||||
"ZVec": {
|
||||
"x": 1,
|
||||
"y": 0,
|
||||
"z": 0
|
||||
"z": 2.22044604925031e-16
|
||||
},
|
||||
"Pts": [],
|
||||
"Buls": [],
|
||||
"SubBoardLocal": [],
|
||||
"SubBoardAssoc": [],
|
||||
"Drillings": [
|
||||
{
|
||||
"x": 550,
|
||||
"y": 600,
|
||||
"r": 5,
|
||||
"h": 13.5,
|
||||
"f": 1
|
||||
},
|
||||
{
|
||||
"x": 300,
|
||||
"y": 600,
|
||||
"r": 5,
|
||||
"h": 13.5,
|
||||
"f": 1
|
||||
},
|
||||
{
|
||||
"x": 50,
|
||||
"y": 600,
|
||||
"r": 5,
|
||||
"h": 13.5,
|
||||
"f": 1
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"DataID": 3996020,
|
||||
"OrderNo": 20230727027642,
|
||||
"L": 1200,
|
||||
"W": 600,
|
||||
"H": 18,
|
||||
"BoardName": "左侧板",
|
||||
"Grain": 0,
|
||||
"Pts": [
|
||||
"BoardType": 0,
|
||||
"CustomNumber": "",
|
||||
"BasePoint": {
|
||||
"x": 1077.02062480031,
|
||||
"y": 0,
|
||||
"z": 214.651271182857
|
||||
},
|
||||
"XVec": {
|
||||
"x": 4.93038065763132e-32,
|
||||
"y": 1,
|
||||
"z": -2.22044604925031e-16
|
||||
},
|
||||
"YVec": {
|
||||
"x": -2.22044604925031e-16,
|
||||
"y": 2.22044604925031e-16,
|
||||
"z": 1
|
||||
},
|
||||
"ZVec": {
|
||||
"x": 1,
|
||||
"y": 0,
|
||||
"z": 2.22044604925031e-16
|
||||
},
|
||||
"Pts": [],
|
||||
"Buls": [],
|
||||
"SubBoardLocal": [],
|
||||
"SubBoardAssoc": [],
|
||||
"Drillings": [
|
||||
{
|
||||
"x": 0,
|
||||
"y": 0
|
||||
"x": 50,
|
||||
"y": 600,
|
||||
"r": 5,
|
||||
"h": 13.5,
|
||||
"f": 0
|
||||
},
|
||||
{
|
||||
"x": 600,
|
||||
"y": 0
|
||||
"x": 300,
|
||||
"y": 600,
|
||||
"r": 5,
|
||||
"h": 13.5,
|
||||
"f": 0
|
||||
},
|
||||
{
|
||||
"x": 600,
|
||||
"y": 2000
|
||||
},
|
||||
{
|
||||
"x": 0,
|
||||
"y": 2000
|
||||
},
|
||||
{
|
||||
"x": 0,
|
||||
"y": 0
|
||||
"x": 550,
|
||||
"y": 600,
|
||||
"r": 5,
|
||||
"h": 13.5,
|
||||
"f": 0
|
||||
}
|
||||
],
|
||||
"Buls": [
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0
|
||||
],
|
||||
"SubBoardLocal": [
|
||||
{
|
||||
"L": 144.00000000000023,
|
||||
"W": 170.42201834862385,
|
||||
"H": 5,
|
||||
"CabName": "",
|
||||
"BoardName": "",
|
||||
"BasePoint": {
|
||||
"x": 1099.0825688073396,
|
||||
"y": 288.2935779816515,
|
||||
"z": 1001.247706422018
|
||||
},
|
||||
"XVec": {
|
||||
"x": 0,
|
||||
"y": 1,
|
||||
"z": 0
|
||||
},
|
||||
"YVec": {
|
||||
"x": 0,
|
||||
"y": 0,
|
||||
"z": 1
|
||||
},
|
||||
"ZVec": {
|
||||
"x": 1,
|
||||
"y": 0,
|
||||
"z": 0
|
||||
},
|
||||
"Grain": 0,
|
||||
"Pts": [
|
||||
{
|
||||
"x": 0,
|
||||
"y": 0
|
||||
},
|
||||
{
|
||||
"x": 170.42201834862385,
|
||||
"y": 0
|
||||
},
|
||||
{
|
||||
"x": 170.42201834862385,
|
||||
"y": 144.00000000000023
|
||||
},
|
||||
{
|
||||
"x": 0,
|
||||
"y": 144.00000000000023
|
||||
},
|
||||
{
|
||||
"x": 0,
|
||||
"y": 0
|
||||
}
|
||||
],
|
||||
"Buls": [
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0
|
||||
],
|
||||
"SubBoardLocal": [],
|
||||
"SubBoardAssoc": null,
|
||||
"Drillings": null
|
||||
},
|
||||
{
|
||||
"L": 189.0974955047293,
|
||||
"W": 189.0974955047293,
|
||||
"H": 18,
|
||||
"CabName": "",
|
||||
"BoardName": "",
|
||||
"BasePoint": {
|
||||
"x": 1099.0825688073396,
|
||||
"y": 234.6989586696538,
|
||||
"z": 1267.3595091283692
|
||||
},
|
||||
"XVec": {
|
||||
"x": 0,
|
||||
"y": 1,
|
||||
"z": 0
|
||||
},
|
||||
"YVec": {
|
||||
"x": 0,
|
||||
"y": 0,
|
||||
"z": 1
|
||||
},
|
||||
"ZVec": {
|
||||
"x": 1,
|
||||
"y": 0,
|
||||
"z": 0
|
||||
},
|
||||
"Grain": 0,
|
||||
"Pts": [
|
||||
{
|
||||
"x": 189.0974955047293,
|
||||
"y": 94.54874775236476
|
||||
},
|
||||
{
|
||||
"x": -1.4210854715202004e-14,
|
||||
"y": 94.54874775236478
|
||||
},
|
||||
{
|
||||
"x": 189.0974955047293,
|
||||
"y": 94.54874775236476
|
||||
}
|
||||
],
|
||||
"Buls": [
|
||||
-0.9999999999999999,
|
||||
-0.9999999999999999,
|
||||
0
|
||||
],
|
||||
"SubBoardLocal": [],
|
||||
"SubBoardAssoc": null,
|
||||
"Drillings": null
|
||||
}
|
||||
],
|
||||
"SubBoardAssoc": null,
|
||||
"Drillings": null
|
||||
]
|
||||
}
|
||||
]
|
||||
|
@ -1,14 +0,0 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<meta http-equiv="X-UA-Compatible" content="ie=edge">
|
||||
<title>WebCAD</title>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
</body>
|
||||
|
||||
</html>
|
@ -1,36 +1,45 @@
|
||||
// import { Color, Face3, MeshBasicMaterial, Object3D, Vector2, Vector3 } from "three";
|
||||
// import "./style.css";
|
||||
import { Vector3 } from "three";
|
||||
import { CameraControlState } from "../CameraControls";
|
||||
import { data } from "../data";
|
||||
import { Color, MeshBasicMaterial, Vector3 } from "three";
|
||||
import { GetBox } from "../GeUtils";
|
||||
import { LoadBoard } from "../Utils";
|
||||
import { Viewer } from "../Viewer";
|
||||
import data from "./data.json";
|
||||
|
||||
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");
|
||||
|
||||
el.style.width = "80%";
|
||||
el.style.height = "80%";
|
||||
el.style.width = "100%";
|
||||
el.style.height = "80vh";
|
||||
document.body.appendChild(el);
|
||||
|
||||
let view = new Viewer(el);
|
||||
let view = new Viewer(el, (settings) =>
|
||||
{
|
||||
settings.boardMaterial = new MeshBasicMaterial({
|
||||
color: new Color(0.8, 0.8, 0.8),
|
||||
polygonOffset: true,
|
||||
polygonOffsetFactor: 1, // positive value pushes polygon further away
|
||||
polygonOffsetUnits: 1,
|
||||
transparent: true,
|
||||
opacity: 0.5
|
||||
});
|
||||
});
|
||||
|
||||
//修改这个顺序 改变1 2 3 个触摸点时的触发状态.
|
||||
view.m_CameraCtrl.m_TouthTypeList = [CameraControlState.Rotate, CameraControlState.Scale, CameraControlState.Pan];
|
||||
// view.m_CameraCtrl.m_TouthTypeList = [CameraControlState.Rotate, CameraControlState.Scale, CameraControlState.Pan];
|
||||
//例如,修改单指滑动为平移.
|
||||
view.m_CameraCtrl.m_TouthTypeList = [CameraControlState.Pan, CameraControlState.Scale, CameraControlState.Rotate];
|
||||
// view.m_CameraCtrl.m_TouthTypeList = [CameraControlState.Pan, CameraControlState.Scale, CameraControlState.Rotate];
|
||||
|
||||
//加载
|
||||
btn.onclick = () =>
|
||||
@ -39,12 +48,12 @@ btn.onclick = () =>
|
||||
for (let i = 0; i < 1; i++)
|
||||
LoadBoard(view, data);
|
||||
console.timeEnd();
|
||||
}
|
||||
};
|
||||
|
||||
btn2.onclick = () =>
|
||||
{
|
||||
// LoadBoard(view, []);
|
||||
}
|
||||
};
|
||||
|
||||
btn3.onclick = () =>
|
||||
{
|
||||
@ -91,5 +100,5 @@ btn3.onclick = () =>
|
||||
|
||||
if (count === 60)
|
||||
clearInterval(t);
|
||||
}, 16)
|
||||
}
|
||||
}, 16);
|
||||
};
|
||||
|
388
src/Viewer.ts
388
src/Viewer.ts
@ -1,199 +1,243 @@
|
||||
|
||||
import { Mesh, Raycaster, Scene, Vector3, WebGLRenderer, WebGLRendererParameters } from "three";
|
||||
import { boardMaterial, CameraControls, PointPick, selectMaterial } from ".";
|
||||
import { Mesh, MeshBasicMaterial, Raycaster, Scene, Vector3, WebGLRenderer, type WebGLRendererParameters } from "three";
|
||||
import { CameraControls, PointPick, boardMaterial, selectMaterial } from ".";
|
||||
import { CameraUpdate } from "./CameraUpdate";
|
||||
import { ColorMaterial } from "./ColorPalette";
|
||||
import { cZeroVec, GetBox, GetBoxArr } from "./GeUtils";
|
||||
import { GetBox, GetBoxArr, cZeroVec } from "./GeUtils";
|
||||
import { PlaneExt } from "./PlaneExt";
|
||||
|
||||
export class ViewerSettings
|
||||
{
|
||||
boardMaterial: MeshBasicMaterial = boardMaterial;
|
||||
selectMaterial: MeshBasicMaterial = selectMaterial;
|
||||
selectByPointCallback: (meshId: number) => void = () => { };
|
||||
}
|
||||
|
||||
export class Viewer
|
||||
{
|
||||
m_LookTarget: any;
|
||||
m_Camera: CameraUpdate = new CameraUpdate();
|
||||
m_CameraCtrl: CameraControls;
|
||||
m_bNeedUpdate: boolean = true;
|
||||
m_Render: WebGLRenderer;//渲染器 //暂时只用这个类型
|
||||
m_DomEl: HTMLElement; //画布容器
|
||||
m_LookTarget: any;
|
||||
m_Camera: CameraUpdate = new CameraUpdate();
|
||||
m_CameraCtrl: CameraControls;
|
||||
m_bNeedUpdate: boolean = true;
|
||||
m_Render: WebGLRenderer;//渲染器 //暂时只用这个类型
|
||||
m_DomEl: HTMLElement; //画布容器
|
||||
|
||||
_Height: number;
|
||||
_Width: number;
|
||||
_Height: number = 0;
|
||||
_Width: number = 0;
|
||||
|
||||
m_Scene: Scene = new Scene();
|
||||
m_Scene: Scene = new Scene();
|
||||
|
||||
/**
|
||||
*
|
||||
* @param {HTMLElement} canvasContainer 可以传入一个div或者一个画布
|
||||
* @memberof Viewer
|
||||
*/
|
||||
constructor(canvasContainer: HTMLElement)
|
||||
{
|
||||
this.m_DomEl = canvasContainer;
|
||||
this.initRender(canvasContainer);
|
||||
this.OnSize();
|
||||
this.StartRender();
|
||||
this.m_CameraCtrl = new CameraControls(this);
|
||||
window.addEventListener("resize", () =>
|
||||
_Settings = new ViewerSettings();
|
||||
/**
|
||||
*
|
||||
* @param {HTMLElement} canvasContainer 可以传入一个div或者一个画布
|
||||
* @memberof Viewer
|
||||
*/
|
||||
constructor(canvasContainer: HTMLElement, setupAction: (settings: ViewerSettings) => void = null)
|
||||
{
|
||||
this.OnSize();
|
||||
});
|
||||
if (setupAction)
|
||||
{
|
||||
setupAction(this._Settings);
|
||||
}
|
||||
|
||||
let oldMesh: Mesh;
|
||||
this.m_Render.domElement.addEventListener("mousemove", (e: MouseEvent) =>
|
||||
this.m_DomEl = canvasContainer;
|
||||
this.initRender(canvasContainer);
|
||||
this.OnSize();
|
||||
this.StartRender();
|
||||
this.m_CameraCtrl = new CameraControls(this);
|
||||
window.addEventListener("resize", () =>
|
||||
{
|
||||
this.OnSize();
|
||||
});
|
||||
|
||||
this.m_Render.domElement.addEventListener("mousemove", (e: MouseEvent) =>
|
||||
{
|
||||
this.SelectByPoint(e.offsetX, e.offsetY);
|
||||
});
|
||||
}
|
||||
|
||||
//初始化render
|
||||
initRender(canvasContainer: HTMLElement)
|
||||
{
|
||||
let mesh = PointPick(this, e.offsetX, e.offsetY);
|
||||
if (oldMesh)
|
||||
oldMesh.material = boardMaterial;
|
||||
if (mesh && mesh.material !== ColorMaterial.GetBasicMaterial(1))
|
||||
{
|
||||
oldMesh = mesh;
|
||||
mesh.material = selectMaterial;
|
||||
}
|
||||
this.m_bNeedUpdate = true;
|
||||
})
|
||||
}
|
||||
let params: WebGLRendererParameters = {
|
||||
antialias: true,//antialias:true/false是否开启反锯齿
|
||||
precision: "highp",//precision:highp/mediump/lowp着色精度选择
|
||||
alpha: true//alpha:true/false是否可以设置背景色透明
|
||||
};
|
||||
if (canvasContainer instanceof HTMLCanvasElement)
|
||||
{
|
||||
params.canvas = canvasContainer;
|
||||
this.m_Render = new WebGLRenderer(params);
|
||||
}
|
||||
else
|
||||
{
|
||||
this.m_Render = new WebGLRenderer(params);
|
||||
//加到画布
|
||||
canvasContainer.appendChild(this.m_Render.domElement);
|
||||
}
|
||||
|
||||
//初始化render
|
||||
initRender(canvasContainer: HTMLElement)
|
||||
{
|
||||
let params: WebGLRendererParameters = {
|
||||
antialias: true,//antialias:true/false是否开启反锯齿
|
||||
precision: "highp",//precision:highp/mediump/lowp着色精度选择
|
||||
alpha: true//alpha:true/false是否可以设置背景色透明
|
||||
this.m_Render.autoClear = true;
|
||||
|
||||
//如果设置,那么它希望所有的纹理和颜色都是预乘的伽玛。默认值为false。
|
||||
// this.m_Render.gammaInput = true;
|
||||
// this.m_Render.gammaOutput = true;
|
||||
// this.m_Render.shadowMap.enabled = true;
|
||||
// this.m_Render.toneMapping = ReinhardToneMapping;
|
||||
//设置设备像素比。 这通常用于HiDPI设备,以防止模糊输出画布。
|
||||
this.m_Render.setPixelRatio(window.devicePixelRatio);
|
||||
this.m_Render.physicallyCorrectLights = true;
|
||||
//this.m_Render.toneMappingExposure = Math.pow(1, 5.0); // to allow for very bright scenes.
|
||||
|
||||
//设置它的背景色为黑色
|
||||
this.m_Render.setClearColor(0xffffff, 1);
|
||||
|
||||
|
||||
this.OnSize();
|
||||
}
|
||||
|
||||
OnSize = (width?, height?) =>
|
||||
{
|
||||
this._Width = width ? width : this.m_DomEl.clientWidth;
|
||||
this._Height = height ? height : this.m_DomEl.clientHeight;
|
||||
|
||||
//校验.成为2的倍数 避免外轮廓错误.
|
||||
if (this._Width % 2 == 1)
|
||||
this._Width -= 1;
|
||||
if (this._Height % 2 == 1)
|
||||
this._Height -= 1;
|
||||
|
||||
this.m_Render.setSize(this._Width, this._Height);
|
||||
this.m_Camera.SetSize(this._Width, this._Height);
|
||||
};
|
||||
if (canvasContainer instanceof HTMLCanvasElement)
|
||||
|
||||
StartRender = () =>
|
||||
{
|
||||
params.canvas = canvasContainer;
|
||||
this.m_Render = new WebGLRenderer(params);
|
||||
}
|
||||
else
|
||||
requestAnimationFrame(this.StartRender);
|
||||
if (this.m_Scene != null && this.m_bNeedUpdate)
|
||||
{
|
||||
this.Render();
|
||||
this.m_bNeedUpdate = false;
|
||||
}
|
||||
};
|
||||
Render()
|
||||
{
|
||||
this.m_Render = new WebGLRenderer(params);
|
||||
//加到画布
|
||||
canvasContainer.appendChild(this.m_Render.domElement);
|
||||
this.m_Render.render(this.m_Scene, this.m_Camera.Camera);
|
||||
}
|
||||
|
||||
this.m_Render.autoClear = true;
|
||||
|
||||
//如果设置,那么它希望所有的纹理和颜色都是预乘的伽玛。默认值为false。
|
||||
// this.m_Render.gammaInput = true;
|
||||
// this.m_Render.gammaOutput = true;
|
||||
// this.m_Render.shadowMap.enabled = true;
|
||||
// this.m_Render.toneMapping = ReinhardToneMapping;
|
||||
//设置设备像素比。 这通常用于HiDPI设备,以防止模糊输出画布。
|
||||
this.m_Render.setPixelRatio(window.devicePixelRatio);
|
||||
this.m_Render.physicallyCorrectLights = true;
|
||||
//this.m_Render.toneMappingExposure = Math.pow(1, 5.0); // to allow for very bright scenes.
|
||||
|
||||
//设置它的背景色为黑色
|
||||
this.m_Render.setClearColor(0xffffff, 1);
|
||||
|
||||
|
||||
this.OnSize();
|
||||
}
|
||||
|
||||
OnSize = (width?, height?) =>
|
||||
{
|
||||
this._Width = width ? width : this.m_DomEl.clientWidth;
|
||||
this._Height = height ? height : this.m_DomEl.clientHeight;
|
||||
|
||||
//校验.成为2的倍数 避免外轮廓错误.
|
||||
if (this._Width % 2 == 1)
|
||||
this._Width -= 1;
|
||||
if (this._Height % 2 == 1)
|
||||
this._Height -= 1;
|
||||
|
||||
this.m_Render.setSize(this._Width, this._Height);
|
||||
this.m_Camera.SetSize(this._Width, this._Height);
|
||||
}
|
||||
|
||||
StartRender = () =>
|
||||
{
|
||||
requestAnimationFrame(this.StartRender);
|
||||
if (this.m_Scene != null && this.m_bNeedUpdate)
|
||||
ScreenToWorld(pt: Vector3, planVec?: Vector3)
|
||||
{
|
||||
this.Render();
|
||||
this.m_bNeedUpdate = false;
|
||||
//变换和求交点
|
||||
let plan = new PlaneExt(planVec || new Vector3(0, 0, 1));
|
||||
let raycaster = new Raycaster();
|
||||
// 射线从相机射线向屏幕点位置
|
||||
raycaster.setFromCamera(
|
||||
{
|
||||
x: (pt.x / this._Width) * 2 - 1,
|
||||
y: - (pt.y / this._Height) * 2 + 1
|
||||
}
|
||||
, this.m_Camera.Camera
|
||||
);
|
||||
plan.intersectRay(raycaster.ray, pt, true);
|
||||
}
|
||||
}
|
||||
Render()
|
||||
{
|
||||
this.m_Render.render(this.m_Scene, this.m_Camera.Camera);
|
||||
}
|
||||
WorldToScreen(pt: Vector3)
|
||||
{
|
||||
let widthHalf = this._Width * 0.5;
|
||||
let heightHalf = this._Height * 0.5;
|
||||
|
||||
ScreenToWorld(pt: Vector3, planVec?: Vector3)
|
||||
{
|
||||
//变换和求交点
|
||||
let plan = new PlaneExt(planVec || new Vector3(0, 0, 1));
|
||||
let raycaster = new Raycaster();
|
||||
// 射线从相机射线向屏幕点位置
|
||||
raycaster.setFromCamera(
|
||||
{
|
||||
x: (pt.x / this._Width) * 2 - 1,
|
||||
y: - (pt.y / this._Height) * 2 + 1
|
||||
}
|
||||
, this.m_Camera.Camera
|
||||
)
|
||||
plan.intersectRay(raycaster.ray, pt, true);
|
||||
}
|
||||
WorldToScreen(pt: Vector3)
|
||||
{
|
||||
let widthHalf = this._Width * 0.5;
|
||||
let heightHalf = this._Height * 0.5;
|
||||
pt.project(this.m_Camera.Camera);
|
||||
|
||||
pt.project(this.m_Camera.Camera);
|
||||
pt.x = (pt.x * widthHalf) + widthHalf;
|
||||
pt.y = - (pt.y * heightHalf) + heightHalf;
|
||||
}
|
||||
|
||||
pt.x = (pt.x * widthHalf) + widthHalf;
|
||||
pt.y = - (pt.y * heightHalf) + heightHalf;
|
||||
}
|
||||
/**
|
||||
* 更新视角观测目标(物体中心)
|
||||
*
|
||||
* @memberof Viewer
|
||||
*/
|
||||
UpdateLockTarget()
|
||||
{
|
||||
let renderList = this.m_Render.renderLists.get(this.m_Scene, this.m_Camera.Camera);
|
||||
let box = GetBoxArr(renderList.opaque.map(o => o.object));
|
||||
if (box)
|
||||
this.m_LookTarget = box.getCenter(new Vector3());
|
||||
else
|
||||
this.m_LookTarget = cZeroVec;
|
||||
}
|
||||
Rotate(mouseMove: Vector3)
|
||||
{
|
||||
this.m_Camera.Rotate(mouseMove, this.m_LookTarget);
|
||||
this.m_bNeedUpdate = true;
|
||||
}
|
||||
Pan(mouseMove: Vector3)
|
||||
{
|
||||
this.m_Camera.Pan(mouseMove);
|
||||
this.m_bNeedUpdate = true;
|
||||
}
|
||||
Zoom(scale: number, center?: Vector3)
|
||||
{
|
||||
this.m_Camera.Zoom(scale, center);
|
||||
this.m_bNeedUpdate = true;
|
||||
}
|
||||
ZoomAll()
|
||||
{
|
||||
this.m_Camera.ZoomExtensBox3(GetBox(this.m_Scene, true));
|
||||
this.m_bNeedUpdate = true;
|
||||
}
|
||||
|
||||
/**
|
||||
* 更新视角观测目标(物体中心)
|
||||
*
|
||||
* @memberof Viewer
|
||||
*/
|
||||
UpdateLockTarget()
|
||||
{
|
||||
let renderList = this.m_Render.renderLists.get(this.m_Scene, this.m_Camera.Camera);
|
||||
let box = GetBoxArr(renderList.opaque.map(o => o.object));
|
||||
if (box)
|
||||
this.m_LookTarget = box.getCenter(new Vector3());
|
||||
else
|
||||
this.m_LookTarget = cZeroVec;
|
||||
}
|
||||
Rotate(mouseMove: Vector3)
|
||||
{
|
||||
this.m_Camera.Rotate(mouseMove, this.m_LookTarget);
|
||||
this.m_bNeedUpdate = true;
|
||||
}
|
||||
Pan(mouseMove: Vector3)
|
||||
{
|
||||
this.m_Camera.Pan(mouseMove);
|
||||
this.m_bNeedUpdate = true;
|
||||
}
|
||||
Zoom(scale: number, center?: Vector3)
|
||||
{
|
||||
this.m_Camera.Zoom(scale, center);
|
||||
this.m_bNeedUpdate = true;
|
||||
}
|
||||
ZoomAll()
|
||||
{
|
||||
this.m_Camera.ZoomExtensBox3(GetBox(this.m_Scene, true));
|
||||
this.m_bNeedUpdate = true;
|
||||
}
|
||||
ViewToTop()
|
||||
{
|
||||
this.m_Camera.LookAt(new Vector3(0, 0, -1));
|
||||
this.m_bNeedUpdate = true;
|
||||
}
|
||||
ViewToFront()
|
||||
{
|
||||
this.m_Camera.LookAt(new Vector3(0, 1, 0));
|
||||
this.m_bNeedUpdate = true;
|
||||
}
|
||||
ViewToSwiso()
|
||||
{
|
||||
this.m_Camera.LookAt(new Vector3(1, 1, -1));
|
||||
this.m_bNeedUpdate = true;
|
||||
}
|
||||
|
||||
ViewToTop()
|
||||
{
|
||||
this.m_Camera.LookAt(new Vector3(0, 0, -1));
|
||||
this.m_bNeedUpdate = true;
|
||||
}
|
||||
ViewToFront()
|
||||
{
|
||||
this.m_Camera.LookAt(new Vector3(0, 1, 0));
|
||||
this.m_bNeedUpdate = true;
|
||||
}
|
||||
ViewToSwiso()
|
||||
{
|
||||
this.m_Camera.LookAt(new Vector3(1, 1, -1));
|
||||
this.m_bNeedUpdate = true;
|
||||
}
|
||||
oldMesh: Mesh;
|
||||
SelectByPoint(x: number, y: number)
|
||||
{
|
||||
let mesh = PointPick(this, x, y);
|
||||
if (this.oldMesh)
|
||||
this.oldMesh.material = this._Settings.boardMaterial;
|
||||
if (mesh && mesh.material !== ColorMaterial.GetBasicMaterial(1))
|
||||
{
|
||||
this.oldMesh = mesh;
|
||||
mesh.material = this._Settings.selectMaterial;
|
||||
if (this._Settings.selectByPointCallback)
|
||||
{
|
||||
this._Settings.selectByPointCallback(mesh.id);
|
||||
}
|
||||
}
|
||||
this.m_bNeedUpdate = true;
|
||||
}
|
||||
SelectBlock(blockMeshMap: Map<number, number>, dataID: number)
|
||||
{
|
||||
if (blockMeshMap.has(dataID))
|
||||
{
|
||||
let meshId = blockMeshMap.get(dataID);
|
||||
if (this.oldMesh)
|
||||
this.oldMesh.material = this._Settings.boardMaterial;
|
||||
this.m_Scene.children.forEach(obj =>
|
||||
{
|
||||
if (obj instanceof Mesh)
|
||||
{
|
||||
if (obj.id == meshId)
|
||||
{
|
||||
this.oldMesh = obj;
|
||||
obj.material = this._Settings.selectMaterial;
|
||||
this.m_bNeedUpdate = true;
|
||||
}
|
||||
}
|
||||
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -1,9 +1,7 @@
|
||||
import { CylinderGeometry, Geometry, LineSegments, Mesh, Shape, Vector2, Vector3, Matrix4, ExtrudeGeometry, EdgesGeometry } from 'three';
|
||||
import { ColorMaterial } from './ColorPalette';
|
||||
import { equalv3, polar } from './GeUtils';
|
||||
import { boardMaterial, edgeMaterial } from './Material';
|
||||
import { RotateUVs } from './RotateUV';
|
||||
import { ThreeBSP } from './ThreeCSG';
|
||||
import { EdgesGeometry, Geometry, LineSegments, MeshBasicMaterial, Shape, Vector2 } from 'three';
|
||||
import { polar } from './GeUtils';
|
||||
import { edgeMaterial } from './Material';
|
||||
import { SimpleBoard } from './SimpleBoard';
|
||||
//解析二维圆弧类.
|
||||
export class Arc2d
|
||||
{
|
||||
@ -56,7 +54,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
|
||||
{
|
||||
@ -71,147 +69,35 @@ 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"]);
|
||||
}
|
||||
|
||||
|
||||
|
||||
//创建板件 暂时这么写
|
||||
export function createBoard(boardData: object)
|
||||
{
|
||||
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"]);
|
||||
|
||||
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"];
|
||||
let height = boardData["H"];
|
||||
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 sp = createPath(pts, buls);
|
||||
let extrudeSettings = {
|
||||
steps: 1,
|
||||
bevelEnabled: false,
|
||||
depth: boardHeight
|
||||
};
|
||||
|
||||
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 (boardData["BoardName"] === "地脚线")
|
||||
RotateUVs(ext);
|
||||
|
||||
let mesh = new Mesh(ext, boardMaterial);
|
||||
mesh.userData = ZD;
|
||||
edges.forEach(e => e.userData = ZD);
|
||||
return { mesh, edges };
|
||||
}
|
||||
|
||||
function checkObjectArray(obj: any, key: string)
|
||||
{
|
||||
return obj[key] && obj[key].length > 0;
|
||||
}
|
||||
|
||||
export function createTemplateBoard(brDataList: any[])
|
||||
export function createTemplateBoard(brDataList: any[], material: MeshBasicMaterial)
|
||||
{
|
||||
let meshs = [];
|
||||
let edgesa = [];
|
||||
|
||||
let relations = {
|
||||
blockMeshMap: new Map<number, number>(),
|
||||
meshBlockMap: new Map<number, number>()
|
||||
};
|
||||
for (let d of brDataList)
|
||||
{
|
||||
let { mesh, edges } = createBoard(d);
|
||||
let board = new SimpleBoard(d);
|
||||
let { mesh, edges } = board.createBoard(material);
|
||||
meshs.push(mesh);
|
||||
edgesa.push(...edges);
|
||||
|
||||
if (board.DataID)
|
||||
{
|
||||
relations.blockMeshMap.set(board.DataID, mesh.id);
|
||||
relations.meshBlockMap.set(mesh.id, board.DataID);
|
||||
}
|
||||
}
|
||||
return { meshs, edgesa };
|
||||
return { meshs, edgesa, relations };
|
||||
}
|
||||
|
||||
export function createEdge(geo: Geometry): LineSegments
|
||||
|
550
src/data.ts
550
src/data.ts
@ -1,550 +0,0 @@
|
||||
export var data =
|
||||
[
|
||||
{
|
||||
"L": 100.0,
|
||||
"W": 800.0,
|
||||
"H": 18.0,
|
||||
"BasePoint": {
|
||||
"x": 2076.407626150509,
|
||||
"y": 1942.2104819571228,
|
||||
"z": 1882.0
|
||||
},
|
||||
"XVec": {
|
||||
"x": 1.0,
|
||||
"y": 4.930380657631324e-32,
|
||||
"z": -2.220446049250313e-16
|
||||
},
|
||||
"YVec": {
|
||||
"x": 2.220446049250313e-16,
|
||||
"y": 2.220446049250313e-16,
|
||||
"z": 1.0
|
||||
},
|
||||
"ZVec": {
|
||||
"x": 9.860761315262648e-32,
|
||||
"y": -1.0,
|
||||
"z": 2.220446049250313e-16
|
||||
},
|
||||
"Pts": [
|
||||
{
|
||||
"x": 2076.407626150509,
|
||||
"y": 1942.2104819571228,
|
||||
"z": 1882.0
|
||||
},
|
||||
{
|
||||
"x": 2876.407626150509,
|
||||
"y": 1942.2104819571228,
|
||||
"z": 1881.9999999999998
|
||||
},
|
||||
{
|
||||
"x": 2876.407626150509,
|
||||
"y": 1942.2104819571228,
|
||||
"z": 1981.9999999999998
|
||||
},
|
||||
{
|
||||
"x": 2076.407626150509,
|
||||
"y": 1942.2104819571228,
|
||||
"z": 1982.0
|
||||
},
|
||||
{
|
||||
"x": 2076.407626150509,
|
||||
"y": 1942.2104819571228,
|
||||
"z": 1882.0
|
||||
}
|
||||
],
|
||||
"Buls": [
|
||||
0.0,
|
||||
0.0,
|
||||
0.0,
|
||||
0.0,
|
||||
0.0
|
||||
],
|
||||
"SubBoardLocal": [],
|
||||
"SubBoardAssoc": []
|
||||
},
|
||||
{
|
||||
"L": 800.0,
|
||||
"W": 100.00000000000068,
|
||||
"H": 18.0,
|
||||
"MaterialId": "EE",
|
||||
"BasePoint": {
|
||||
"x": 2876.407626150509,
|
||||
"y": 1960.2104819571226,
|
||||
"z": 1900.0000000000005
|
||||
},
|
||||
"XVec": {
|
||||
"x": 4.440892098500626e-16,
|
||||
"y": 1.0,
|
||||
"z": 2.2204460492503124e-16
|
||||
},
|
||||
"YVec": {
|
||||
"x": -1.0,
|
||||
"y": 4.440892098500626e-16,
|
||||
"z": 2.220446049250314e-16
|
||||
},
|
||||
"ZVec": {
|
||||
"x": 2.220446049250313e-16,
|
||||
"y": -2.220446049250313e-16,
|
||||
"z": 1.0
|
||||
},
|
||||
"Handle": "293",
|
||||
"CabName": "1.标准柜上梁1",
|
||||
"BoardName": "",
|
||||
"Grain": 0,
|
||||
"Pts": [
|
||||
{
|
||||
"x": 2876.407626150509,
|
||||
"y": 1960.2104819571228,
|
||||
"z": 1900.0000000000005
|
||||
},
|
||||
{
|
||||
"x": 2876.407626150509,
|
||||
"y": 2060.210481957123,
|
||||
"z": 1900.0000000000005
|
||||
},
|
||||
{
|
||||
"x": 2076.407626150509,
|
||||
"y": 2060.210481957123,
|
||||
"z": 1900.0000000000005
|
||||
},
|
||||
{
|
||||
"x": 2076.407626150509,
|
||||
"y": 1960.210481957123,
|
||||
"z": 1900.0000000000005
|
||||
},
|
||||
{
|
||||
"x": 2876.407626150509,
|
||||
"y": 1960.2104819571228,
|
||||
"z": 1900.0000000000005
|
||||
}
|
||||
],
|
||||
"Buls": [
|
||||
0.0,
|
||||
0.0,
|
||||
0.0,
|
||||
0.0,
|
||||
0.0
|
||||
],
|
||||
"SubBoardLocal": [],
|
||||
"SubBoardAssoc": []
|
||||
},
|
||||
{
|
||||
"L": 1899.9999999999998,
|
||||
"W": 800.0,
|
||||
"H": 18.0,
|
||||
"MaterialId": "EE",
|
||||
"BasePoint": {
|
||||
"x": 2076.407626150509,
|
||||
"y": 2060.2104819571225,
|
||||
"z": -1.816324868286756e-13
|
||||
},
|
||||
"XVec": {
|
||||
"x": 1.0,
|
||||
"y": 0.0,
|
||||
"z": 0.0
|
||||
},
|
||||
"YVec": {
|
||||
"x": 0.0,
|
||||
"y": 4.440892098500626e-16,
|
||||
"z": 1.0
|
||||
},
|
||||
"ZVec": {
|
||||
"x": 0.0,
|
||||
"y": -1.0,
|
||||
"z": 4.440892098500626e-16
|
||||
},
|
||||
"Handle": "291",
|
||||
"CabName": "1.标准柜上梁1",
|
||||
"BoardName": "背板",
|
||||
"Grain": 0,
|
||||
"Pts": [
|
||||
{
|
||||
"x": 2076.407626150509,
|
||||
"y": 2060.2104819571225,
|
||||
"z": -1.021405182655144e-13
|
||||
},
|
||||
{
|
||||
"x": 2876.407626150509,
|
||||
"y": 2060.2104819571225,
|
||||
"z": -1.816324868286756e-13
|
||||
},
|
||||
{
|
||||
"x": 2876.407626150509,
|
||||
"y": 2060.210481957123,
|
||||
"z": 1899.9999999999996
|
||||
},
|
||||
{
|
||||
"x": 2076.407626150509,
|
||||
"y": 2060.210481957123,
|
||||
"z": 1899.9999999999998
|
||||
},
|
||||
{
|
||||
"x": 2076.407626150509,
|
||||
"y": 2060.2104819571225,
|
||||
"z": -1.021405182655144e-13
|
||||
}
|
||||
],
|
||||
"Buls": [
|
||||
0.0,
|
||||
0.0,
|
||||
0.0,
|
||||
0.0,
|
||||
0.0
|
||||
],
|
||||
"SubBoardLocal": [],
|
||||
"SubBoardAssoc": []
|
||||
},
|
||||
{
|
||||
"L": 800.0,
|
||||
"W": 482.0000000000002,
|
||||
"H": 18.0,
|
||||
"MaterialId": "EE",
|
||||
"BasePoint": {
|
||||
"x": 2876.407626150509,
|
||||
"y": 1578.210481957122,
|
||||
"z": 97.99999999999999
|
||||
},
|
||||
"XVec": {
|
||||
"x": 4.440892098500626e-16,
|
||||
"y": 1.0,
|
||||
"z": 0.0
|
||||
},
|
||||
"YVec": {
|
||||
"x": -1.0,
|
||||
"y": 4.440892098500626e-16,
|
||||
"z": 0.0
|
||||
},
|
||||
"ZVec": {
|
||||
"x": 0.0,
|
||||
"y": 0.0,
|
||||
"z": 1.0
|
||||
},
|
||||
"Handle": "290",
|
||||
"CabName": "1.标准柜上梁1",
|
||||
"BoardName": "底板",
|
||||
"Grain": 0,
|
||||
"Pts": [
|
||||
{
|
||||
"x": 2876.407626150509,
|
||||
"y": 1578.210481957122,
|
||||
"z": 97.99999999999999
|
||||
},
|
||||
{
|
||||
"x": 2876.407626150509,
|
||||
"y": 2060.2104819571225,
|
||||
"z": 97.99999999999999
|
||||
},
|
||||
{
|
||||
"x": 2076.407626150509,
|
||||
"y": 2060.2104819571225,
|
||||
"z": 97.99999999999999
|
||||
},
|
||||
{
|
||||
"x": 2076.407626150509,
|
||||
"y": 1578.2104819571226,
|
||||
"z": 97.99999999999999
|
||||
},
|
||||
{
|
||||
"x": 2876.407626150509,
|
||||
"y": 1578.210481957122,
|
||||
"z": 97.99999999999999
|
||||
}
|
||||
],
|
||||
"Buls": [
|
||||
0.0,
|
||||
0.0,
|
||||
0.0,
|
||||
0.0,
|
||||
0.0
|
||||
],
|
||||
"SubBoardLocal": [],
|
||||
"SubBoardAssoc": []
|
||||
},
|
||||
{
|
||||
"L": 80.0,
|
||||
"W": 800.0,
|
||||
"H": 18.0,
|
||||
"MaterialId": "EE",
|
||||
"BasePoint": {
|
||||
"x": 2076.407626150509,
|
||||
"y": 1578.2104819571223,
|
||||
"z": 0.0
|
||||
},
|
||||
"XVec": {
|
||||
"x": 1.0,
|
||||
"y": 0.0,
|
||||
"z": 0.0
|
||||
},
|
||||
"YVec": {
|
||||
"x": 0.0,
|
||||
"y": 4.440892098500626e-16,
|
||||
"z": 1.0
|
||||
},
|
||||
"ZVec": {
|
||||
"x": 0.0,
|
||||
"y": -1.0,
|
||||
"z": 4.440892098500626e-16
|
||||
},
|
||||
"Handle": "28E",
|
||||
"CabName": "1.标准柜上梁1",
|
||||
"BoardName": "地脚线",
|
||||
"Grain": 1,
|
||||
"Pts": [
|
||||
{
|
||||
"x": 2076.407626150509,
|
||||
"y": 1578.2104819571223,
|
||||
"z": 0.0
|
||||
},
|
||||
{
|
||||
"x": 2876.407626150509,
|
||||
"y": 1578.2104819571223,
|
||||
"z": 0.0
|
||||
},
|
||||
{
|
||||
"x": 2876.407626150509,
|
||||
"y": 1578.2104819571223,
|
||||
"z": 80.0
|
||||
},
|
||||
{
|
||||
"x": 2076.407626150509,
|
||||
"y": 1578.2104819571223,
|
||||
"z": 80.0
|
||||
},
|
||||
{
|
||||
"x": 2076.407626150509,
|
||||
"y": 1578.2104819571223,
|
||||
"z": 0.0
|
||||
}
|
||||
],
|
||||
"Buls": [
|
||||
0.0,
|
||||
0.0,
|
||||
0.0,
|
||||
0.0,
|
||||
0.0
|
||||
],
|
||||
"SubBoardLocal": [],
|
||||
"SubBoardAssoc": []
|
||||
},
|
||||
{
|
||||
"L": 800.0,
|
||||
"W": 482.0,
|
||||
"H": 18.0,
|
||||
"MaterialId": "EE",
|
||||
"BasePoint": {
|
||||
"x": 2876.4076261505085,
|
||||
"y": 1478.210481957122,
|
||||
"z": 1999.9999999999996
|
||||
},
|
||||
"XVec": {
|
||||
"x": 4.440892098500626e-16,
|
||||
"y": 1.0,
|
||||
"z": 0.0
|
||||
},
|
||||
"YVec": {
|
||||
"x": -1.0,
|
||||
"y": 4.440892098500626e-16,
|
||||
"z": 0.0
|
||||
},
|
||||
"ZVec": {
|
||||
"x": 0.0,
|
||||
"y": 0.0,
|
||||
"z": 1.0
|
||||
},
|
||||
"Handle": "28C",
|
||||
"CabName": "1.标准柜上梁1",
|
||||
"BoardName": "顶板",
|
||||
"Grain": 0,
|
||||
"Pts": [
|
||||
{
|
||||
"x": 2076.407626150509,
|
||||
"y": 1960.2104819571223,
|
||||
"z": 1999.9999999999996
|
||||
},
|
||||
{
|
||||
"x": 2076.407626150509,
|
||||
"y": 1478.2104819571226,
|
||||
"z": 1999.9999999999996
|
||||
},
|
||||
{
|
||||
"x": 2876.407626150509,
|
||||
"y": 1478.210481957122,
|
||||
"z": 1999.9999999999996
|
||||
},
|
||||
{
|
||||
"x": 2876.4076261505085,
|
||||
"y": 1960.210481957122,
|
||||
"z": 1999.9999999999996
|
||||
},
|
||||
{
|
||||
"x": 2076.407626150509,
|
||||
"y": 1960.2104819571223,
|
||||
"z": 1999.9999999999996
|
||||
}
|
||||
],
|
||||
"Buls": [
|
||||
0.0,
|
||||
0.0,
|
||||
0.0,
|
||||
0.0,
|
||||
0.0
|
||||
],
|
||||
"SubBoardLocal": [],
|
||||
"SubBoardAssoc": []
|
||||
},
|
||||
{
|
||||
"L": 1999.9999999999996,
|
||||
"W": 600.0,
|
||||
"H": 18.0,
|
||||
"MaterialId": "EE",
|
||||
"BasePoint": {
|
||||
"x": 2894.4076261505094,
|
||||
"y": 1478.2104819571223,
|
||||
"z": -2.2737367544323197e-13
|
||||
},
|
||||
"XVec": {
|
||||
"x": 4.930380657631324e-32,
|
||||
"y": 1.0,
|
||||
"z": -2.220446049250313e-16
|
||||
},
|
||||
"YVec": {
|
||||
"x": -2.220446049250313e-16,
|
||||
"y": 2.220446049250313e-16,
|
||||
"z": 1.0
|
||||
},
|
||||
"ZVec": {
|
||||
"x": 1.0,
|
||||
"y": 0.0,
|
||||
"z": 2.220446049250313e-16
|
||||
},
|
||||
"Handle": "28B",
|
||||
"CabName": "1.标准柜上梁1",
|
||||
"BoardName": "右侧板",
|
||||
"Grain": 0,
|
||||
"Pts": [
|
||||
{
|
||||
"x": 2894.407626150509,
|
||||
"y": 1960.2104819571228,
|
||||
"z": 1899.9999999999989
|
||||
},
|
||||
{
|
||||
"x": 2894.407626150509,
|
||||
"y": 1960.2104819571228,
|
||||
"z": 1999.9999999999994
|
||||
},
|
||||
{
|
||||
"x": 2894.407626150509,
|
||||
"y": 1478.2104819571228,
|
||||
"z": 1999.9999999999994
|
||||
},
|
||||
{
|
||||
"x": 2894.4076261505094,
|
||||
"y": 1478.2104819571223,
|
||||
"z": -1.816324868286755e-13
|
||||
},
|
||||
{
|
||||
"x": 2894.4076261505094,
|
||||
"y": 2078.2104819571225,
|
||||
"z": -6.274980535181384e-13
|
||||
},
|
||||
{
|
||||
"x": 2894.407626150509,
|
||||
"y": 2078.2104819571229,
|
||||
"z": 1899.9999999999973
|
||||
},
|
||||
{
|
||||
"x": 2894.407626150509,
|
||||
"y": 1960.2104819571228,
|
||||
"z": 1899.9999999999989
|
||||
}
|
||||
],
|
||||
"Buls": [
|
||||
0.0,
|
||||
0.0,
|
||||
0.0,
|
||||
0.0,
|
||||
0.0,
|
||||
0.0,
|
||||
0.0
|
||||
],
|
||||
"SubBoardLocal": [],
|
||||
"SubBoardAssoc": []
|
||||
},
|
||||
{
|
||||
"L": 1999.9999999999996,
|
||||
"W": 600.0,
|
||||
"H": 18.0,
|
||||
"MaterialId": "EE",
|
||||
"BasePoint": {
|
||||
"x": 2076.4076261505094,
|
||||
"y": 1478.2104819571223,
|
||||
"z": 1.0097419586828951e-28
|
||||
},
|
||||
"XVec": {
|
||||
"x": 4.930380657631324e-32,
|
||||
"y": 1.0,
|
||||
"z": -2.220446049250313e-16
|
||||
},
|
||||
"YVec": {
|
||||
"x": -2.220446049250313e-16,
|
||||
"y": 2.220446049250313e-16,
|
||||
"z": 1.0
|
||||
},
|
||||
"ZVec": {
|
||||
"x": 1.0,
|
||||
"y": 0.0,
|
||||
"z": 2.220446049250313e-16
|
||||
},
|
||||
"Handle": "288",
|
||||
"CabName": "1.标准柜上梁1",
|
||||
"BoardName": "左侧板",
|
||||
"Grain": 0,
|
||||
"Pts": [
|
||||
{
|
||||
"x": 2076.407626150509,
|
||||
"y": 1960.2104819571228,
|
||||
"z": 1899.999999999999
|
||||
},
|
||||
{
|
||||
"x": 2076.407626150509,
|
||||
"y": 1960.2104819571228,
|
||||
"z": 1999.9999999999996
|
||||
},
|
||||
{
|
||||
"x": 2076.407626150509,
|
||||
"y": 1478.2104819571228,
|
||||
"z": 1999.9999999999996
|
||||
},
|
||||
{
|
||||
"x": 2076.4076261505094,
|
||||
"y": 1478.2104819571223,
|
||||
"z": 1.0097419586828951e-28
|
||||
},
|
||||
{
|
||||
"x": 2076.4076261505094,
|
||||
"y": 2078.2104819571225,
|
||||
"z": -4.4586556668946279e-13
|
||||
},
|
||||
{
|
||||
"x": 2076.407626150509,
|
||||
"y": 2078.2104819571229,
|
||||
"z": 1899.9999999999978
|
||||
},
|
||||
{
|
||||
"x": 2076.407626150509,
|
||||
"y": 1960.2104819571228,
|
||||
"z": 1899.999999999999
|
||||
}
|
||||
],
|
||||
"Buls": [
|
||||
0.0,
|
||||
0.0,
|
||||
0.0,
|
||||
0.0,
|
||||
0.0,
|
||||
0.0,
|
||||
0.0
|
||||
],
|
||||
"SubBoardLocal": [],
|
||||
"SubBoardAssoc": []
|
||||
}
|
||||
]
|
1
src/vite-env.d.ts
vendored
Normal file
1
src/vite-env.d.ts
vendored
Normal file
@ -0,0 +1 @@
|
||||
/// <reference types="vite/client" />
|
@ -1,24 +1,33 @@
|
||||
{
|
||||
"compileOnSave": true,
|
||||
"compilerOptions": {
|
||||
"sourceMap": true,
|
||||
"declaration": true,
|
||||
"outDir": "./dist",
|
||||
"target": "esnext",
|
||||
"lib": [
|
||||
"esnext",
|
||||
"dom"
|
||||
],
|
||||
"types": [
|
||||
"node",
|
||||
"webpack-env",
|
||||
"webpack-dev-server"
|
||||
],
|
||||
"module": "commonjs",
|
||||
"sourceMap": true,
|
||||
"module": "ESNext",
|
||||
"target": "ES2020",
|
||||
"noLib": false,
|
||||
"skipLibCheck": true,
|
||||
"lib": ["ES2020", "DOM", "DOM.Iterable"],
|
||||
"verbatimModuleSyntax":true,
|
||||
|
||||
/* Bundler mode */
|
||||
"moduleResolution": "bundler",
|
||||
"esModuleInterop": true,
|
||||
"allowImportingTsExtensions": true,
|
||||
"resolveJsonModule": true,
|
||||
"isolatedModules": true,
|
||||
"noEmit": true,
|
||||
|
||||
/* Linting */
|
||||
// "strict": true,
|
||||
// "noUnusedLocals": true,
|
||||
// "noUnusedParameters": true,
|
||||
// "noFallthroughCasesInSwitch": true,
|
||||
|
||||
"jsx": "react",
|
||||
"experimentalDecorators": true
|
||||
},
|
||||
"include": [
|
||||
"./src/**/*",
|
||||
// "./config/**/*"
|
||||
"./config/**/*"
|
||||
]
|
||||
}
|
||||
|
File diff suppressed because one or more lines are too long
7
utils/rmtype.ts
Normal file
7
utils/rmtype.ts
Normal 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);
|
||||
});
|
258
yarn.lock
Normal file
258
yarn.lock
Normal file
@ -0,0 +1,258 @@
|
||||
# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
|
||||
# yarn lockfile v1
|
||||
|
||||
|
||||
"@esbuild/android-arm64@0.18.19":
|
||||
version "0.18.19"
|
||||
resolved "https://registry.npmmirror.com/@esbuild/android-arm64/-/android-arm64-0.18.19.tgz#8735b552b8e0b9a943460d37fbc976b9d9cd4b4e"
|
||||
integrity sha512-4+jkUFQxZkQfQOOxfGVZB38YUWHMJX2ihZwF+2nh8m7bHdWXpixiurgGRN3c/KMSwlltbYI0/i929jwBRMFzbA==
|
||||
|
||||
"@esbuild/android-arm@0.18.19":
|
||||
version "0.18.19"
|
||||
resolved "https://registry.npmmirror.com/@esbuild/android-arm/-/android-arm-0.18.19.tgz#efd1f33583a893c0cc57f25b1d081af8cdc6bfd9"
|
||||
integrity sha512-1uOoDurJYh5MNqPqpj3l/TQCI1V25BXgChEldCB7D6iryBYqYKrbZIhYO5AI9fulf66sM8UJpc3UcCly2Tv28w==
|
||||
|
||||
"@esbuild/android-x64@0.18.19":
|
||||
version "0.18.19"
|
||||
resolved "https://registry.npmmirror.com/@esbuild/android-x64/-/android-x64-0.18.19.tgz#d9f35722701a97a2ef69c7a84f1ee2aef2a306a7"
|
||||
integrity sha512-ae5sHYiP/Ogj2YNrLZbWkBmyHIDOhPgpkGvFnke7XFGQldBDWvc/AyYwSLpNuKw9UNkgnLlB/jPpnBmlF3G9Bg==
|
||||
|
||||
"@esbuild/darwin-arm64@0.18.19":
|
||||
version "0.18.19"
|
||||
resolved "https://registry.npmmirror.com/@esbuild/darwin-arm64/-/darwin-arm64-0.18.19.tgz#8cb81b971ee5231acc7de07225f6e18562c359e4"
|
||||
integrity sha512-HIpQvNQWFYROmWDANMRL+jZvvTQGOiTuwWBIuAsMaQrnStedM+nEKJBzKQ6bfT9RFKH2wZ+ej+DY7+9xHBTFPg==
|
||||
|
||||
"@esbuild/darwin-x64@0.18.19":
|
||||
version "0.18.19"
|
||||
resolved "https://registry.npmmirror.com/@esbuild/darwin-x64/-/darwin-x64-0.18.19.tgz#81024ab64232dd323f03796d449f018b59f04ca9"
|
||||
integrity sha512-m6JdvXJQt0thNLIcWOeG079h2ivhYH4B5sVCgqb/B29zTcFd7EE8/J1nIUHhdtwGeItdUeqKaqqb4towwxvglQ==
|
||||
|
||||
"@esbuild/freebsd-arm64@0.18.19":
|
||||
version "0.18.19"
|
||||
resolved "https://registry.npmmirror.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.18.19.tgz#9fa91e3b08d10c0adfa71b37372a7627b26e9686"
|
||||
integrity sha512-G0p4EFMPZhGn/xVNspUyMQbORH3nlKTV0bFNHPIwLraBuAkTeMyxNviTe0ZXUbIXQrR1lrwniFjNFU4s+x7veQ==
|
||||
|
||||
"@esbuild/freebsd-x64@0.18.19":
|
||||
version "0.18.19"
|
||||
resolved "https://registry.npmmirror.com/@esbuild/freebsd-x64/-/freebsd-x64-0.18.19.tgz#ef6f5a85c1bb029fb0076da5b223e50b353e615c"
|
||||
integrity sha512-hBxgRlG42+W+j/1/cvlnSa+3+OBKeDCyO7OG2ICya1YJaSCYfSpuG30KfOnQHI7Ytgu4bRqCgrYXxQEzy0zM5Q==
|
||||
|
||||
"@esbuild/linux-arm64@0.18.19":
|
||||
version "0.18.19"
|
||||
resolved "https://registry.npmmirror.com/@esbuild/linux-arm64/-/linux-arm64-0.18.19.tgz#0cef913dcdc1efb1bb04406a8e5f5668b721d89e"
|
||||
integrity sha512-X8g33tczY0GsJq3lhyBrjnFtaKjWVpp1gMq5IlF9BQJ3TUfSK74nQnz9mRIEejmcV+OIYn6bkOJeUaU1Knrljg==
|
||||
|
||||
"@esbuild/linux-arm@0.18.19":
|
||||
version "0.18.19"
|
||||
resolved "https://registry.npmmirror.com/@esbuild/linux-arm/-/linux-arm-0.18.19.tgz#39ea874c8e5177b83903bec1883a43f3c163627a"
|
||||
integrity sha512-qtWyoQskfJlb9MD45mvzCEKeO4uCnDZ7lPFeNqbfaaJHqBiH9qA5Vu2EuckqYZuFMJWy1l4dxTf9NOulCVfUjg==
|
||||
|
||||
"@esbuild/linux-ia32@0.18.19":
|
||||
version "0.18.19"
|
||||
resolved "https://registry.npmmirror.com/@esbuild/linux-ia32/-/linux-ia32-0.18.19.tgz#283cd3c3d8380e8fab90583fa86ca1fcc9b9ec57"
|
||||
integrity sha512-SAkRWJgb+KN+gOhmbiE6/wu23D6HRcGQi15cB13IVtBZZgXxygTV5GJlUAKLQ5Gcx0gtlmt+XIxEmSqA6sZTOw==
|
||||
|
||||
"@esbuild/linux-loong64@0.18.19":
|
||||
version "0.18.19"
|
||||
resolved "https://registry.npmmirror.com/@esbuild/linux-loong64/-/linux-loong64-0.18.19.tgz#1c69d7928a55b26326398d31d2ac9c82d2297f1b"
|
||||
integrity sha512-YLAslaO8NsB9UOxBchos82AOMRDbIAWChwDKfjlGrHSzS3v1kxce7dGlSTsrb0PJwo1KYccypN3VNjQVLtz7LA==
|
||||
|
||||
"@esbuild/linux-mips64el@0.18.19":
|
||||
version "0.18.19"
|
||||
resolved "https://registry.npmmirror.com/@esbuild/linux-mips64el/-/linux-mips64el-0.18.19.tgz#b25b352e7645885fa1d01182116c506a78fe4733"
|
||||
integrity sha512-vSYFtlYds/oTI8aflEP65xo3MXChMwBOG1eWPGGKs/ev9zkTeXVvciU+nifq8J1JYMz+eQ4J9JDN0O2RKF8+1Q==
|
||||
|
||||
"@esbuild/linux-ppc64@0.18.19":
|
||||
version "0.18.19"
|
||||
resolved "https://registry.npmmirror.com/@esbuild/linux-ppc64/-/linux-ppc64-0.18.19.tgz#568b5a051f47af732c4314e697bb559a14b3d811"
|
||||
integrity sha512-tgG41lRVwlzqO9tv9l7aXYVw35BxKXLtPam1qALScwSqPivI8hjkZLNH0deaaSCYCFT9cBIdB+hUjWFlFFLL9A==
|
||||
|
||||
"@esbuild/linux-riscv64@0.18.19":
|
||||
version "0.18.19"
|
||||
resolved "https://registry.npmmirror.com/@esbuild/linux-riscv64/-/linux-riscv64-0.18.19.tgz#020729b47ca63321667297d1610bab81cd08a65c"
|
||||
integrity sha512-EgBZFLoN1S5RuB4cCJI31pBPsjE1nZ+3+fHRjguq9Ibrzo29bOLSBcH1KZJvRNh5qtd+fcYIGiIUia8Jw5r1lQ==
|
||||
|
||||
"@esbuild/linux-s390x@0.18.19":
|
||||
version "0.18.19"
|
||||
resolved "https://registry.npmmirror.com/@esbuild/linux-s390x/-/linux-s390x-0.18.19.tgz#ed5cca8dac130d2f736914f9efad5fa15c238c20"
|
||||
integrity sha512-q1V1rtHRojAzjSigZEqrcLkpfh5K09ShCoIsdTakozVBnM5rgV58PLFticqDp5UJ9uE0HScov9QNbbl8HBo6QQ==
|
||||
|
||||
"@esbuild/linux-x64@0.18.19":
|
||||
version "0.18.19"
|
||||
resolved "https://registry.npmmirror.com/@esbuild/linux-x64/-/linux-x64-0.18.19.tgz#f8023a38ae02b46c60a134ccbc7ae377b3bec66f"
|
||||
integrity sha512-D0IiYjpZRXxGZLQfsydeAD7ZWqdGyFLBj5f2UshJpy09WPs3qizDCsEr8zyzcym6Woj/UI9ZzMIXwvoXVtyt0A==
|
||||
|
||||
"@esbuild/netbsd-x64@0.18.19":
|
||||
version "0.18.19"
|
||||
resolved "https://registry.npmmirror.com/@esbuild/netbsd-x64/-/netbsd-x64-0.18.19.tgz#8fd667c535db0a5b346afa2d74ff1fb53477427f"
|
||||
integrity sha512-3tt3SOS8L3D54R8oER41UdDshlBIAjYhdWRPiZCTZ1E41+shIZBpTjaW5UaN/jD1ENE/Ok5lkeqhoNMbxstyxw==
|
||||
|
||||
"@esbuild/openbsd-x64@0.18.19":
|
||||
version "0.18.19"
|
||||
resolved "https://registry.npmmirror.com/@esbuild/openbsd-x64/-/openbsd-x64-0.18.19.tgz#354d5b54a6bffa381cb513e878880192e07004be"
|
||||
integrity sha512-MxbhcuAYQPlfln1EMc4T26OUoeg/YQc6wNoEV8xvktDKZhLtBxjkoeESSo9BbPaGKhAPzusXYj5n8n5A8iZSrA==
|
||||
|
||||
"@esbuild/sunos-x64@0.18.19":
|
||||
version "0.18.19"
|
||||
resolved "https://registry.npmmirror.com/@esbuild/sunos-x64/-/sunos-x64-0.18.19.tgz#e2de98bd961e04f76f6acf5970263efc7051def5"
|
||||
integrity sha512-m0/UOq1wj25JpWqOJxoWBRM9VWc3c32xiNzd+ERlYstUZ6uwx5SZsQUtkiFHaYmcaoj+f6+Tfcl7atuAz3idwQ==
|
||||
|
||||
"@esbuild/win32-arm64@0.18.19":
|
||||
version "0.18.19"
|
||||
resolved "https://registry.npmmirror.com/@esbuild/win32-arm64/-/win32-arm64-0.18.19.tgz#9dca55f0dcbbdb50bf36353d1114f5f71c269275"
|
||||
integrity sha512-L4vb6pcoB1cEcXUHU6EPnUhUc4+/tcz4OqlXTWPcSQWxegfmcOprhmIleKKwmMNQVc4wrx/+jB7tGkjjDmiupg==
|
||||
|
||||
"@esbuild/win32-ia32@0.18.19":
|
||||
version "0.18.19"
|
||||
resolved "https://registry.npmmirror.com/@esbuild/win32-ia32/-/win32-ia32-0.18.19.tgz#db6ea4467e87e6d3fc2177dea35e81f26f7a061d"
|
||||
integrity sha512-rQng7LXSKdrDlNDb7/v0fujob6X0GAazoK/IPd9C3oShr642ri8uIBkgM37/l8B3Rd5sBQcqUXoDdEy75XC/jg==
|
||||
|
||||
"@esbuild/win32-x64@0.18.19":
|
||||
version "0.18.19"
|
||||
resolved "https://registry.npmmirror.com/@esbuild/win32-x64/-/win32-x64-0.18.19.tgz#6105755d7097e0d7e22f893c3e62f143d8137bd0"
|
||||
integrity sha512-z69jhyG20Gq4QL5JKPLqUT+eREuqnDAFItLbza4JCmpvUnIlY73YNjd5djlO7kBiiZnvTnJuAbOjIoZIOa1GjA==
|
||||
|
||||
"@jscad/modeling@^2.11.0":
|
||||
version "2.12.0"
|
||||
resolved "https://registry.npmmirror.com/@jscad/modeling/-/modeling-2.12.0.tgz#66cdc08316a5c8a922e9f29f8339bf4d64a454f7"
|
||||
integrity sha512-TeAGX4QPEX+sBfeTMa04HwGL+lpdirqXt9JJKYi0r+UGgcwlsCtOs7dS23WGEAGu5QZgGNF4NJsr9DRPIWoaDQ==
|
||||
|
||||
"@types/node@^13.13.52":
|
||||
version "13.13.52"
|
||||
resolved "https://registry.npmmirror.com/@types/node/-/node-13.13.52.tgz#03c13be70b9031baaed79481c0c0cfb0045e53f7"
|
||||
integrity sha512-s3nugnZumCC//n4moGGe6tkNMyYEdaDBitVjwPxXmR5lnMG5dHePinH2EdxkG3Rh1ghFHHixAG4NJhpJW1rthQ==
|
||||
|
||||
"@types/three@^0.103.2":
|
||||
version "0.103.2"
|
||||
resolved "https://registry.npmmirror.com/@types/three/-/three-0.103.2.tgz#f7d49130001c551941a0ded757def810579aafc4"
|
||||
integrity sha512-zhtf0Qs5wLJpIn1+VWCpzSgpKayj/GSWZ6woiuz09FW59KEDeLpnBkYz6lbblVpRmGdlnG8nd0unaASshOvcXw==
|
||||
dependencies:
|
||||
three "*"
|
||||
|
||||
esbuild@^0.18.10:
|
||||
version "0.18.19"
|
||||
resolved "https://registry.npmmirror.com/esbuild/-/esbuild-0.18.19.tgz#c763ccfd50b7b1322d13232cd91f2bd36ffde56b"
|
||||
integrity sha512-ra3CaIKCzJp5bU5BDfrCc0FRqKj71fQi+gbld0aj6lN0ifuX2fWJYPgLVLGwPfA+ruKna+OWwOvf/yHj6n+i0g==
|
||||
optionalDependencies:
|
||||
"@esbuild/android-arm" "0.18.19"
|
||||
"@esbuild/android-arm64" "0.18.19"
|
||||
"@esbuild/android-x64" "0.18.19"
|
||||
"@esbuild/darwin-arm64" "0.18.19"
|
||||
"@esbuild/darwin-x64" "0.18.19"
|
||||
"@esbuild/freebsd-arm64" "0.18.19"
|
||||
"@esbuild/freebsd-x64" "0.18.19"
|
||||
"@esbuild/linux-arm" "0.18.19"
|
||||
"@esbuild/linux-arm64" "0.18.19"
|
||||
"@esbuild/linux-ia32" "0.18.19"
|
||||
"@esbuild/linux-loong64" "0.18.19"
|
||||
"@esbuild/linux-mips64el" "0.18.19"
|
||||
"@esbuild/linux-ppc64" "0.18.19"
|
||||
"@esbuild/linux-riscv64" "0.18.19"
|
||||
"@esbuild/linux-s390x" "0.18.19"
|
||||
"@esbuild/linux-x64" "0.18.19"
|
||||
"@esbuild/netbsd-x64" "0.18.19"
|
||||
"@esbuild/openbsd-x64" "0.18.19"
|
||||
"@esbuild/sunos-x64" "0.18.19"
|
||||
"@esbuild/win32-arm64" "0.18.19"
|
||||
"@esbuild/win32-ia32" "0.18.19"
|
||||
"@esbuild/win32-x64" "0.18.19"
|
||||
|
||||
flatbush@^3.3.0:
|
||||
version "3.3.0"
|
||||
resolved "https://registry.npmmirror.com/flatbush/-/flatbush-3.3.0.tgz#b68c9149107ae86d2bce6373491f404ba4f4534e"
|
||||
integrity sha512-F3EzQvKpdmXUbFwWxLKBpytOFEGYQMCTBLuqZ4GEajFOEAvnOIBiyxW3OFSZXIOtpCS8teN6bFEpNZtnVXuDQA==
|
||||
dependencies:
|
||||
flatqueue "^1.2.0"
|
||||
|
||||
flatqueue@^1.2.0:
|
||||
version "1.2.1"
|
||||
resolved "https://registry.npmmirror.com/flatqueue/-/flatqueue-1.2.1.tgz#82f501758fc5925742fbeb478637230456157ef2"
|
||||
integrity sha512-X86TpWS1rGuY7m382HuA9vngLeDuWA9lJvhEG+GfgKMV5onSvx5a71cl7GMbXzhWtlN9dGfqOBrpfqeOtUfGYQ==
|
||||
|
||||
fsevents@~2.3.2:
|
||||
version "2.3.2"
|
||||
resolved "https://registry.npmmirror.com/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a"
|
||||
integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==
|
||||
|
||||
js-angusj-clipper@^1.2.1:
|
||||
version "1.3.1"
|
||||
resolved "https://registry.npmmirror.com/js-angusj-clipper/-/js-angusj-clipper-1.3.1.tgz#433ad90228a2ade6df1a3befcf5892217bfd0832"
|
||||
integrity sha512-/qru4QXxN/gBbQjL4WaFl296YSM8kh5XKpNuNqfZhJ4t4Hw3KeLc5ERj3XHAeLi6pBrqeh6o9PFZUpS3QThEEQ==
|
||||
|
||||
nanoid@^3.3.6:
|
||||
version "3.3.6"
|
||||
resolved "https://registry.npmmirror.com/nanoid/-/nanoid-3.3.6.tgz#443380c856d6e9f9824267d960b4236ad583ea4c"
|
||||
integrity sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==
|
||||
|
||||
picocolors@^1.0.0:
|
||||
version "1.0.0"
|
||||
resolved "https://registry.npmmirror.com/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c"
|
||||
integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==
|
||||
|
||||
polylabel@^1.1.0:
|
||||
version "1.1.0"
|
||||
resolved "https://registry.npmmirror.com/polylabel/-/polylabel-1.1.0.tgz#9483e64fc7a12a49f43e07e7a06752214ed2a8e7"
|
||||
integrity sha512-bxaGcA40sL3d6M4hH72Z4NdLqxpXRsCFk8AITYg6x1rn1Ei3izf00UMLklerBZTO49aPA3CYrIwVulx2Bce2pA==
|
||||
dependencies:
|
||||
tinyqueue "^2.0.3"
|
||||
|
||||
postcss@^8.4.26:
|
||||
version "8.4.27"
|
||||
resolved "https://registry.npmmirror.com/postcss/-/postcss-8.4.27.tgz#234d7e4b72e34ba5a92c29636734349e0d9c3057"
|
||||
integrity sha512-gY/ACJtJPSmUFPDCHtX78+01fHa64FaU4zaaWfuh1MhGJISufJAH4cun6k/8fwsHYeK4UQmENQK+tRLCFJE8JQ==
|
||||
dependencies:
|
||||
nanoid "^3.3.6"
|
||||
picocolors "^1.0.0"
|
||||
source-map-js "^1.0.2"
|
||||
|
||||
rollup@^3.25.2:
|
||||
version "3.27.2"
|
||||
resolved "https://registry.npmmirror.com/rollup/-/rollup-3.27.2.tgz#59adc973504408289be89e5978e938ce852c9520"
|
||||
integrity sha512-YGwmHf7h2oUHkVBT248x0yt6vZkYQ3/rvE5iQuVBh3WO8GcJ6BNeOkpoX1yMHIiBm18EMLjBPIoUDkhgnyxGOQ==
|
||||
optionalDependencies:
|
||||
fsevents "~2.3.2"
|
||||
|
||||
source-map-js@^1.0.2:
|
||||
version "1.0.2"
|
||||
resolved "https://registry.npmmirror.com/source-map-js/-/source-map-js-1.0.2.tgz#adbc361d9c62df380125e7f161f71c826f1e490c"
|
||||
integrity sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==
|
||||
|
||||
three@*:
|
||||
version "0.137.5"
|
||||
resolved "https://registry.npmmirror.com/three/-/three-0.137.5.tgz#a1e34bedd0412f2d8797112973dfadac78022ce6"
|
||||
integrity sha512-rTyr+HDFxjnN8+N/guZjDgfVxgHptZQpf6xfL/Mo7a5JYIFwK6tAq3bzxYYB4Ae0RosDZlDuP+X5aXDXz+XnHQ==
|
||||
|
||||
"three@npm:three-cf@0.122.5":
|
||||
version "0.122.5"
|
||||
resolved "https://registry.npmmirror.com/three-cf/-/three-cf-0.122.5.tgz#d5b5fdbce59aac870983b7dbf2b6f0b8efd008cb"
|
||||
integrity sha512-GBY8xE/f5AyDWiPqmCjU0xgR052C5IbfTzFfh/lIsIHTt5G9a5QtPzspimlW4Y6jUmyWlrqbxe/ycnY0bGhB/A==
|
||||
|
||||
tinyqueue@^2.0.3:
|
||||
version "2.0.3"
|
||||
resolved "https://registry.npmmirror.com/tinyqueue/-/tinyqueue-2.0.3.tgz#64d8492ebf39e7801d7bd34062e29b45b2035f08"
|
||||
integrity sha512-ppJZNDuKGgxzkHihX8v9v9G5f+18gzaTfrukGrq6ueg0lmH4nqVnA2IPG0AEH3jKEk2GRJCUhDoqpoiw3PHLBA==
|
||||
|
||||
typescript@^5.0.2:
|
||||
version "5.1.6"
|
||||
resolved "https://registry.npmmirror.com/typescript/-/typescript-5.1.6.tgz#02f8ac202b6dad2c0dd5e0913745b47a37998274"
|
||||
integrity sha512-zaWCozRZ6DLEWAWFrVDz1H6FVXzUSfTy5FUMWsQlU8Ym5JP9eO4xkTIROFCQvhQf61z6O/G6ugw3SgAnvvm+HA==
|
||||
|
||||
vite@^4.4.5:
|
||||
version "4.4.8"
|
||||
resolved "https://registry.npmmirror.com/vite/-/vite-4.4.8.tgz#31e4a438f8748695c68bd57ffd262ba93540fdf7"
|
||||
integrity sha512-LONawOUUjxQridNWGQlNizfKH89qPigK36XhMI7COMGztz8KNY0JHim7/xDd71CZwGT4HtSRgI7Hy+RlhG0Gvg==
|
||||
dependencies:
|
||||
esbuild "^0.18.10"
|
||||
postcss "^8.4.26"
|
||||
rollup "^3.25.2"
|
||||
optionalDependencies:
|
||||
fsevents "~2.3.2"
|
||||
|
||||
"webcad_ue4_api@http://gitea.cf/cx/webcad-ue4-api/archive/3.2.4.tar.gz":
|
||||
version "0.3.12"
|
||||
resolved "http://gitea.cf/cx/webcad-ue4-api/archive/3.2.4.tar.gz#c5901b2d85434f03f8128aa230fd3fe82fe63ab6"
|
||||
|
||||
xaop@^2.0.0:
|
||||
version "2.1.0"
|
||||
resolved "https://registry.npmmirror.com/xaop/-/xaop-2.1.0.tgz#1d7108c6e2f6bd459dc4f0f64296f0be3cc0f53d"
|
||||
integrity sha512-/ovWCaQIet3a3VnoVeN1/pNPqCrS/JifF28N7crPhq8BXEWx4Da2o+LYCCxnTWGAjGp5+2W2hd0HIpVESounSQ==
|
Loading…
Reference in New Issue
Block a user