6 Commits

Author SHA1 Message Date
49a327cbee 手机端移动与拖动优化,调试环境优化 (#2)
Co-authored-by: xief <1789784602@qq.com>
Reviewed-on: #2
2025-04-07 16:18:41 +08:00
f22f1acd52 移除webpack,替换为vite,删除弃用文件 (#1)
Co-authored-by: xief <1789784602@qq.com>
Reviewed-on: #1
2024-05-23 09:45:08 +08:00
xief
f60054ca19 修改自定义编号判断 2023-07-31 17:57:16 +08:00
xief
a55986761e 修复autocad显示错误 2023-07-27 11:22:48 +08:00
xief
e5b944539e 修复双面编号问题 2023-07-18 09:19:03 +08:00
xief
27dd548309 替换问题数据源 2023-07-17 16:17:32 +08:00
85 changed files with 670 additions and 8582 deletions

1
.gitignore vendored
View File

@@ -1,3 +1,4 @@
/node_modules /node_modules
/package-lock.json /package-lock.json
.history .history
/dist

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@@ -1,93 +0,0 @@
import * as webpack from 'webpack';
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: /\.worker\.ts$/,
exclude: /node_modules/,
use: [
{ loader: 'worker-loader', },
...TS_LOADER
]
},
{
test: /\.tsx?$/,
exclude: /node_modules/,
use: TS_LOADER,
},
{
test: /\.[(png)|(obj)|(json)]$/,
loader: "file-loader"
},
//样式加载 css
{
test: /\.css$/,
use: ['style-loader', 'css-loader']
},
//样式加载 less
{
test: /\.less$/,
use: [
{ loader: "style-loader" },
{ loader: 'css-loader', options: { sourceMap: false } },
{
loader: "less-loader",
options: {
lessOptions: {
strictMath: true,
noIeCompat: true
}
}
}
]
},
//字体加载 blueprint
{
test: /\.(ttf|eot|svg|FBX)$/,
use: {
loader: 'file-loader',
options: { name: 'fonts/[contenthash].[ext]' }
}
},
//字体加载 blueprint
{
test: /\.(woff|woff2|jpg|png)$/,
use: {
loader: 'url-loader',
options: {
name: 'fonts/[contenthash].[ext]',
limit: 5000,
mimetype: 'application/font-woff'
}
}
},
{
test: /\.(glsl|vs|fs)$/,
loader: 'shader-loader'
}
]
},
plugins: [
]
};
export default config;

View File

@@ -1,24 +0,0 @@
import path from 'path';
import * as webpack from 'webpack';
import merge from 'webpack-merge';
import common from './webpack.common';
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;

View File

@@ -1,31 +0,0 @@
import HtmlWebPackPlugin from "html-webpack-plugin";
import * as webpack from 'webpack';
import merge from 'webpack-merge';
import common from './webpack.common';
const config: webpack.Configuration = merge(
common,
{
mode: "development",
entry: "./src/ViewSrc/index.ts",
output: { pathinfo: false },
devtool: "eval-source-map",
devServer: {
// contentBase: "./dist/",
static: false,
port: 7776,
host: "0.0.0.0",
hot: true,
},
plugins: [
// new webpack.NamedModulesPlugin(),//Hot
new webpack.HotModuleReplacementPlugin(),//Hot
new HtmlWebPackPlugin({
title: "webCAD",
// template: './src/index.html'
}),
]
}
);
export default config;

View File

@@ -1,46 +0,0 @@
import * as THREE from 'three';
import { KeyBoard, MouseKey } from './KeyEnum';
import { Viewer } from './Viewer';
export declare enum CameraControlState {
Null = 0,
Pan = 1,
Rotate = 2,
Scale = 3
}
export declare class CameraControls {
m_TouthTypeList: CameraControlState[];
m_domElement: HTMLElement;
m_StartClickPoint: THREE.Vector3;
m_EndClickPoint: THREE.Vector3;
m_DollyStart: THREE.Vector2;
m_DollyEnd: THREE.Vector2;
m_KeyDown: Map<KeyBoard, boolean>;
m_MouseDown: Map<MouseKey, boolean>;
m_State: CameraControlState;
m_Viewer: Viewer;
m_LeftUseRotate: boolean;
constructor(viewer: Viewer);
RegisterEvent(): void;
/**
* 窗体失去焦点时.
*
* @memberof CameraControls
*/
onBlur: () => void;
onTouchStart: (event: TouchEvent) => void;
onTouchEnd: (event: TouchEvent) => void;
onTouchMove: (event: TouchEvent) => void;
beginRotate(): void;
lastMiddleClickTime: number;
onMouseDown: (event: MouseEvent) => void;
onMouseUp: (event: MouseEvent) => void;
onMouseMove: (event: MouseEvent) => void;
/**
* 鼠标滚轮事件
*
* @memberof CameraControls
*/
onMouseWheel: (event: WheelEvent) => void;
onKeyDown: (event: KeyboardEvent) => void;
onKeyUp: (event: KeyboardEvent) => void;
}

209
dist/CameraControls.js vendored
View File

@@ -1,209 +0,0 @@
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
var THREE = require("three");
var KeyEnum_1 = require("./KeyEnum");
var three_1 = require("three");
//相机控制状态
var CameraControlState;
(function (CameraControlState) {
CameraControlState[CameraControlState["Null"] = 0] = "Null";
CameraControlState[CameraControlState["Pan"] = 1] = "Pan";
CameraControlState[CameraControlState["Rotate"] = 2] = "Rotate";
CameraControlState[CameraControlState["Scale"] = 3] = "Scale";
})(CameraControlState = exports.CameraControlState || (exports.CameraControlState = {}));
var CameraControls = /** @class */ (function () {
function CameraControls(viewer) {
var _this = this;
this.m_TouthTypeList = [CameraControlState.Rotate, CameraControlState.Scale, CameraControlState.Pan];
//起始点击
this.m_StartClickPoint = new THREE.Vector3();
this.m_EndClickPoint = new THREE.Vector3();
this.m_DollyStart = new THREE.Vector2();
this.m_DollyEnd = new THREE.Vector2();
this.m_KeyDown = new Map();
this.m_MouseDown = new Map();
//状态
this.m_State = CameraControlState.Null;
//左键使用旋转
this.m_LeftUseRotate = true;
/**
* 窗体失去焦点时.
*
* @memberof CameraControls
*/
this.onBlur = function () {
_this.m_KeyDown.clear();
_this.m_MouseDown.clear();
};
//触屏开始事件
this.onTouchStart = function (event) {
_this.m_Viewer.UpdateLockTarget();
_this.m_StartClickPoint.set(event.touches[0].pageX, event.touches[0].pageY, 0);
if (event.touches.length < 4) {
if (event.touches.length == 2) {
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_State = _this.m_TouthTypeList[event.touches.length - 1];
}
};
this.onTouchEnd = function (event) {
_this.m_State = CameraControlState.Null;
};
this.onTouchMove = function (event) {
event.preventDefault();
event.stopPropagation();
_this.m_EndClickPoint.set(event.touches[0].pageX, event.touches[0].pageY, 0);
var 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:
{
_this.m_Viewer.Rotate(vec.multiplyScalar(2));
break;
}
}
_this.m_StartClickPoint.copy(_this.m_EndClickPoint);
_this.m_Viewer.m_bNeedUpdate = true;
};
//最后一次按中键的时间
this.lastMiddleClickTime = 0;
//鼠标
this.onMouseDown = function (event) {
event.preventDefault();
var key = event.button;
_this.m_MouseDown.set(key, true);
_this.m_StartClickPoint.set(event.offsetX, event.offsetY, 0);
switch (key) {
case KeyEnum_1.MouseKey.Left:
{
if (_this.m_LeftUseRotate) {
_this.beginRotate();
}
break;
}
case KeyEnum_1.MouseKey.Middle:
{
var curTime = Date.now();
var t = curTime - _this.lastMiddleClickTime;
_this.lastMiddleClickTime = curTime;
if (t < 350) {
_this.m_Viewer.ZoomAll();
return;
}
if (_this.m_KeyDown.get(KeyEnum_1.KeyBoard.Control)) {
_this.beginRotate();
}
else {
_this.m_State = CameraControlState.Pan;
}
break;
}
case KeyEnum_1.MouseKey.Right:
{
break;
}
}
};
this.onMouseUp = function (event) {
event.preventDefault();
_this.m_State = CameraControlState.Null;
_this.m_MouseDown.set(event.button, false);
};
this.onMouseMove = function (event) {
event.preventDefault();
_this.m_EndClickPoint.set(event.offsetX, event.offsetY, 0);
var changeVec = _this.m_EndClickPoint.clone().sub(_this.m_StartClickPoint);
_this.m_StartClickPoint.copy(_this.m_EndClickPoint);
if ((_this.m_LeftUseRotate ||
(_this.m_KeyDown.get(KeyEnum_1.KeyBoard.Control)))
&& _this.m_State == CameraControlState.Rotate) {
_this.m_Viewer.Rotate(changeVec);
}
switch (_this.m_State) {
case CameraControlState.Pan:
{
_this.m_Viewer.Pan(changeVec);
break;
}
case CameraControlState.Rotate:
{
break;
}
case CameraControlState.Scale:
{
break;
}
}
};
/**
* 鼠标滚轮事件
*
* @memberof CameraControls
*/
this.onMouseWheel = function (event) {
event.preventDefault();
event.stopPropagation();
var pt = new THREE.Vector3(event.offsetX, event.offsetY, 0);
_this.m_Viewer.ScreenToWorld(pt, new three_1.Vector3().setFromMatrixColumn(_this.m_Viewer.m_Camera.Camera.matrixWorld, 2));
if (event.deltaY < 0) {
_this.m_Viewer.Zoom(0.6, pt);
}
else if (event.deltaY > 0) {
_this.m_Viewer.Zoom(1.4, pt);
}
};
//按键
this.onKeyDown = function (event) {
_this.m_KeyDown.set(event.keyCode, true);
};
this.onKeyUp = function (event) {
_this.m_KeyDown.set(event.keyCode, false);
};
this.m_Viewer = viewer;
this.m_domElement = viewer.m_Render.domElement.parentElement;
this.RegisterEvent();
}
CameraControls.prototype.RegisterEvent = function () {
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);
window.addEventListener("keydown", this.onKeyDown, false);
window.addEventListener("keyup", this.onKeyUp, false);
this.m_domElement.addEventListener('wheel', this.onMouseWheel, false);
this.m_domElement.addEventListener('touchstart', this.onTouchStart, false);
this.m_domElement.addEventListener('touchend', this.onTouchEnd, false);
this.m_domElement.addEventListener('touchmove', this.onTouchMove, false);
window.addEventListener("blur", this.onBlur, false);
}
};
CameraControls.prototype.beginRotate = function () {
this.m_State = CameraControlState.Rotate;
this.m_Viewer.UpdateLockTarget();
};
return CameraControls;
}());
exports.CameraControls = CameraControls;
//# sourceMappingURL=CameraControls.js.map

File diff suppressed because one or more lines are too long

View File

@@ -1,49 +0,0 @@
import { Box3, Camera, Vector3 } from 'three';
/**
*
* 相机的控制.
* ->切换相机
* ->设置视口大小
* ->旋转和移动相机.
*
* @export
* @class ViewCameraManage
*/
export declare class CameraUpdate {
private m_CurCamera;
private m_CameraArray;
private m_Width;
private m_Height;
private m_ViewHeight;
private m_Target;
private m_Direction;
private m_Orbit;
m_MinViewHeight: number;
m_MaxViewHeight: number;
constructor();
get Aspect(): number;
get Camera(): Camera;
get ViewHeight(): number;
set ViewHeight(height: number);
SetSize(width: number, height: number): void;
/**
* 平移相机.
*
* @param {Vector3} mouseMove
* @memberof CameraControl
*/
Pan(mouseMove: Vector3): void;
Rotate(mouseMove: Vector3, target: Vector3): void;
Zoom(scale: number, scaleCenter?: Vector3): void;
ZoomExtensBox3(box3: Box3): void;
LookAt(dir: Vector3): void;
UpdateUp(): void;
/**
* 根据视口大小,设置相机视口范围.
*
* @returns
* @memberof CameraControl
*/
Update(): void;
SwitchCamera(): void;
}

186
dist/CameraUpdate.js vendored
View File

@@ -1,186 +0,0 @@
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
var three_1 = require("three");
var Orbit_1 = require("./Orbit");
/**
*
* 相机的控制.
* ->切换相机
* ->设置视口大小
* ->旋转和移动相机.
*
* @export
* @class ViewCameraManage
*/
var CameraUpdate = /** @class */ (function () {
function CameraUpdate() {
this.m_CameraArray = new Map();
//视口显示的高度
this.m_ViewHeight = 10;
//观察的位置
this.m_Target = new three_1.Vector3();
//观察向量
this.m_Direction = new three_1.Vector3(0, 0, -1);
//观察的轨道.
this.m_Orbit = new Orbit_1.Orbit();
this.m_MinViewHeight = 10;
this.m_MaxViewHeight = 3e4;
this.m_CameraArray.set(three_1.OrthographicCamera, new three_1.OrthographicCamera(-2, 2, 2, -2, -1e6, 1e6));
this.m_CameraArray.set(three_1.PerspectiveCamera, new three_1.PerspectiveCamera(50, 1, 0.01, 10000));
this.m_CurCamera = this.m_CameraArray.get(three_1.OrthographicCamera);
this.m_Orbit.UpdateRoValue(this.m_Direction);
this.UpdateUp();
this.Update();
}
Object.defineProperty(CameraUpdate.prototype, "Aspect", {
get: function () {
return this.m_Width / this.m_Height;
},
enumerable: true,
configurable: true
});
Object.defineProperty(CameraUpdate.prototype, "Camera", {
get: function () {
return this.m_CurCamera;
},
enumerable: true,
configurable: true
});
Object.defineProperty(CameraUpdate.prototype, "ViewHeight", {
get: function () {
return this.m_ViewHeight;
},
set: function (height) {
this.m_ViewHeight = three_1.MathUtils.clamp(height, this.m_MinViewHeight, this.m_MaxViewHeight);
},
enumerable: true,
configurable: true
});
CameraUpdate.prototype.SetSize = function (width, height) {
this.m_Width = width;
this.m_Height = height;
};
/**
* 平移相机.
*
* @param {Vector3} mouseMove
* @memberof CameraControl
*/
CameraUpdate.prototype.Pan = function (mouseMove) {
mouseMove.y *= -1;
mouseMove.multiplyScalar(-this.m_ViewHeight / this.m_Height);
mouseMove.applyQuaternion(this.Camera.quaternion);
this.m_Target.add(mouseMove);
this.Update();
};
CameraUpdate.prototype.Rotate = function (mouseMove, target) {
this.m_Orbit.RoX -= mouseMove.y * 0.003;
this.m_Orbit.RoZ -= mouseMove.x * 0.003;
//缓存观察点
var oldTargetFormCameraSpace = target.clone().applyMatrix4(this.Camera.matrixWorldInverse);
this.m_Orbit.UpdateDirection(this.m_Direction);
this.UpdateUp();
this.Update();
//-----还原观察点
//得到新的观察点相对于相机的位置
var newTargetFormCameraSpace = target.clone().applyMatrix4(this.Camera.matrixWorldInverse);
//减去原先的位置. 得到观测点在相机内移动的向量
newTargetFormCameraSpace.sub(oldTargetFormCameraSpace);
//乘以相机的矩阵. 得到向量在世界坐标系的位置
newTargetFormCameraSpace.applyMatrix4(this.Camera.matrix);
//因为使用的是点变换,所以减去基点,得到向量
newTargetFormCameraSpace.sub(this.Camera.position);
//加上移动的向量. 使得观察点时钟在相机的某个位置
this.m_Target.add(newTargetFormCameraSpace);
this.Update();
};
CameraUpdate.prototype.Zoom = function (scale, scaleCenter) {
if (this.Camera instanceof three_1.OrthographicCamera) {
this.ViewHeight *= scale;
if (scaleCenter && this.m_ViewHeight < this.m_MaxViewHeight) {
this.m_Target.sub(scaleCenter);
this.m_Target.multiplyScalar(scale);
this.m_Target.add(scaleCenter);
}
}
else if (this.Camera instanceof three_1.PerspectiveCamera) {
var add = scale > 1 ? 1 : -1;
add *= this.Camera.position.distanceTo(this.m_Target) / 10;
this.m_Target.add(this.m_Direction.clone().multiplyScalar(-add));
}
this.Update();
};
CameraUpdate.prototype.ZoomExtensBox3 = function (box3) {
if (!box3 || box3.isEmpty())
return;
this.Camera.updateMatrixWorld(false);
//变换到相机坐标系
box3.applyMatrix4(this.Camera.matrixWorldInverse);
//
box3.getCenter(this.m_Target);
//世界坐标系
this.m_Target.applyMatrix4(this.Camera.matrix);
//size
var size = box3.getSize(new three_1.Vector3());
//宽高比
var aspectRatio = size.x / size.y;
var viewAspectRatio = this.Aspect;
//
if (aspectRatio > viewAspectRatio) {
this.m_ViewHeight = size.x / viewAspectRatio;
}
else {
this.m_ViewHeight = size.y;
}
this.Update();
};
CameraUpdate.prototype.LookAt = function (dir) {
this.m_Orbit.UpdateRoValue(dir);
this.m_Direction.copy(dir);
this.UpdateUp();
this.Update();
};
CameraUpdate.prototype.UpdateUp = function () {
Orbit_1.Orbit.ComputUpDirection(this.m_Direction, this.Camera.up);
};
/**
* 根据视口大小,设置相机视口范围.
*
* @returns
* @memberof CameraControl
*/
CameraUpdate.prototype.Update = function () {
this.Camera.position.copy(this.m_Target);
if (this.Camera instanceof three_1.OrthographicCamera) {
this.Camera.left = this.Aspect * this.m_ViewHeight / -2;
this.Camera.right = this.Aspect * this.m_ViewHeight / 2;
this.Camera.bottom = this.m_ViewHeight / -2;
this.Camera.top = this.m_ViewHeight / 2;
this.Camera.position.sub(this.m_Direction);
}
else if (this.Camera instanceof three_1.PerspectiveCamera) {
this.Camera.aspect = this.Aspect;
var distens = (this.m_ViewHeight / 2) / (Math.tan(three_1.MathUtils.degToRad(this.Camera.fov) / 2));
this.Camera.position.sub(this.m_Direction.clone().multiplyScalar(distens));
}
else {
return;
}
this.Camera.lookAt(this.m_Target);
this.Camera.updateProjectionMatrix();
this.Camera.updateMatrixWorld(false);
};
CameraUpdate.prototype.SwitchCamera = function () {
if (this.Camera instanceof three_1.OrthographicCamera) {
this.m_CurCamera = this.m_CameraArray.get(three_1.PerspectiveCamera);
}
else {
this.m_CurCamera = this.m_CameraArray.get(three_1.OrthographicCamera);
}
this.UpdateUp();
this.Update();
};
return CameraUpdate;
}());
exports.CameraUpdate = CameraUpdate;
//# sourceMappingURL=CameraUpdate.js.map

File diff suppressed because one or more lines are too long

View File

@@ -1,10 +0,0 @@
import * as THREE from 'three';
import { LineBasicMaterial, MeshBasicMaterial } from 'three';
export declare class ColorMaterial {
private constructor();
private static m_LineMaterialMap;
static GetLineMaterial(index: any): LineBasicMaterial;
private static m_BasicMaterialMap;
static GetBasicMaterial(index: number): MeshBasicMaterial;
static GetColor(index: number): THREE.Color;
}

43
dist/ColorPalette.js vendored
View File

@@ -1,43 +0,0 @@
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
var three_1 = require("three");
var ColorPalette = [
[255, 0, 0, 255],
//[255, 255, 255, 255],//----- 0 - ByBlock - White
[255, 0, 0, 255],
// [255, 0, 0, 255], //----- 1 - Red
[255, 255, 0, 255],
[0, 255, 0, 255],
[0, 255, 255, 255],
[0, 0, 255, 255],
[255, 0, 255, 255],
];
//颜色材质,对于二维图像来说可能有用,应该不对三维对象使用该材质
var ColorMaterial = /** @class */ (function () {
function ColorMaterial() {
}
ColorMaterial.GetLineMaterial = function (index) {
if (this.m_LineMaterialMap.has(index))
return this.m_LineMaterialMap.get(index);
var mat = new three_1.LineBasicMaterial({ color: this.GetColor(index) });
this.m_LineMaterialMap.set(index, mat);
return mat;
};
ColorMaterial.GetBasicMaterial = function (index) {
if (this.m_BasicMaterialMap.has(index))
return this.m_BasicMaterialMap.get(index);
var mat = new three_1.MeshBasicMaterial({ color: this.GetColor(index) });
this.m_BasicMaterialMap.set(index, mat);
return mat;
};
ColorMaterial.GetColor = function (index) {
var rgb = ColorPalette[index];
if (rgb)
return new three_1.Color(rgb[0] / 255, rgb[1] / 255, rgb[2] / 255);
};
ColorMaterial.m_LineMaterialMap = new Map();
ColorMaterial.m_BasicMaterialMap = new Map();
return ColorMaterial;
}());
exports.ColorMaterial = ColorMaterial;
//# sourceMappingURL=ColorPalette.js.map

View File

@@ -1 +0,0 @@
{"version":3,"file":"ColorPalette.js","sourceRoot":"","sources":["../src/ColorPalette.ts"],"names":[],"mappings":";;AACA,+BAAoE;AACpE,IAAM,YAAY,GAAG;IACjB,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,EAAE,GAAG,CAAC;IAChB,kDAAkD;IAClD,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,EAAE,GAAG,CAAC;IAChB,uCAAuC;IACvC,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,CAAC;IAClB,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,CAAC;IAChB,CAAC,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC;IAClB,CAAC,CAAC,EAAE,CAAC,EAAE,GAAG,EAAE,GAAG,CAAC;IAChB,CAAC,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE,GAAG,CAAC;CA8PrB,CAAC;AAGF,iCAAiC;AACjC;IAEI;IAAwB,CAAC;IAElB,6BAAe,GAAtB,UAAuB,KAAK;QAExB,IAAI,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,KAAK,CAAC;YACjC,OAAO,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QAC7C,IAAI,GAAG,GAAG,IAAI,yBAAiB,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QACjE,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;QACvC,OAAO,GAAG,CAAC;IACf,CAAC;IAEM,8BAAgB,GAAvB,UAAwB,KAAa;QAEjC,IAAI,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,KAAK,CAAC;YAClC,OAAO,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QAC9C,IAAI,GAAG,GAAG,IAAI,yBAAiB,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QACjE,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;QACxC,OAAO,GAAG,CAAC;IACf,CAAC;IAEM,sBAAQ,GAAf,UAAgB,KAAa;QAEzB,IAAI,GAAG,GAAG,YAAY,CAAC,KAAK,CAAC,CAAC;QAC9B,IAAI,GAAG;YACH,OAAO,IAAI,aAAK,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC,GAAG,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC;IACnE,CAAC;IAxBc,+BAAiB,GAAG,IAAI,GAAG,EAAmC,CAAC;IAS/D,gCAAkB,GAAG,IAAI,GAAG,EAA6B,CAAC;IAgB7E,oBAAC;CAAA,AA5BD,IA4BC;AA5BY,sCAAa"}

10
dist/Dimension.d.ts vendored
View File

@@ -1,10 +0,0 @@
import { Group } from "three";
/**
* 标注实体
* @export
* @class Dimension
* @extends {Group}
*/
export declare class Dimension extends Group {
constructor(length: number, textHeight?: number, mirror?: boolean, mirrorFoot?: boolean);
}

64
dist/Dimension.js vendored
View File

@@ -1,64 +0,0 @@
"use strict";
var __extends = (this && this.__extends) || (function () {
var extendStatics = function (d, b) {
extendStatics = Object.setPrototypeOf ||
({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
return extendStatics(d, b);
};
return function (d, b) {
extendStatics(d, b);
function __() { this.constructor = d; }
d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
};
})();
Object.defineProperty(exports, "__esModule", { value: true });
var three_1 = require("three");
var ColorPalette_1 = require("./ColorPalette");
var Text_1 = require("./Text");
var GeUtils_1 = require("./GeUtils");
/**
* 标注实体
* @export
* @class Dimension
* @extends {Group}
*/
var Dimension = /** @class */ (function (_super) {
__extends(Dimension, _super);
function Dimension(length, textHeight, mirror, mirrorFoot) {
if (textHeight === void 0) { textHeight = 25; }
if (mirror === void 0) { mirror = false; }
if (mirrorFoot === void 0) { mirrorFoot = false; }
var _this = _super.call(this) || this;
var footLength = 60;
if (mirrorFoot) {
footLength = -footLength;
}
//针脚几何体
var lineGeo = new three_1.Geometry();
lineGeo.vertices.push(new three_1.Vector3(), new three_1.Vector3(0, footLength, 0));
//托盘几何体
var lineGeo2 = new three_1.Geometry();
lineGeo2.vertices.push(new three_1.Vector3(0, footLength), new three_1.Vector3(length, footLength, 0));
var material = ColorPalette_1.ColorMaterial.GetLineMaterial(5);
var line1 = new three_1.Line(lineGeo, material);
var line2 = new three_1.Line(lineGeo, material);
line2.position.x = length;
var line3 = new three_1.Line(lineGeo2, material);
var text = new Text_1.DbText(parseFloat(length.toFixed(2)).toString(), textHeight);
if (mirror) {
var roMat = new three_1.Matrix4().makeRotationZ(Math.PI);
text.applyMatrix4(roMat);
text.applyMatrix4(GeUtils_1.MoveMatrix(new three_1.Vector3(length * 0.5, footLength - textHeight * 0.1)));
}
else {
text.applyMatrix4(GeUtils_1.MoveMatrix(new three_1.Vector3(length * 0.5, footLength * 1.1)));
}
_this.add(text);
_this.add(line1, line2, line3);
return _this;
}
return Dimension;
}(three_1.Group));
exports.Dimension = Dimension;
//# sourceMappingURL=Dimension.js.map

View File

@@ -1 +0,0 @@
{"version":3,"file":"Dimension.js","sourceRoot":"","sources":["../src/Dimension.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AAAA,+BAAgE;AAChE,+CAA+C;AAC/C,+BAAgC;AAChC,qCAAuC;AAEvC;;;;;GAKG;AACH;IAA+B,6BAAK;IAGhC,mBAAY,MAAc,EAAE,UAAuB,EAAE,MAAuB,EAAE,UAA2B;QAA7E,2BAAA,EAAA,eAAuB;QAAE,uBAAA,EAAA,cAAuB;QAAE,2BAAA,EAAA,kBAA2B;QAAzG,YAEI,iBAAO,SAuCV;QAtCG,IAAI,UAAU,GAAG,EAAE,CAAC;QACpB,IAAI,UAAU,EACd;YACI,UAAU,GAAG,CAAC,UAAU,CAAC;SAC5B;QAED,OAAO;QACP,IAAI,OAAO,GAAG,IAAI,gBAAQ,EAAE,CAAC;QAC7B,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,eAAO,EAAE,EAAE,IAAI,eAAO,CAAC,CAAC,EAAE,UAAU,EAAE,CAAC,CAAC,CAAC,CAAC;QAEpE,OAAO;QACP,IAAI,QAAQ,GAAG,IAAI,gBAAQ,EAAE,CAAC;QAC9B,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,eAAO,CAAC,CAAC,EAAE,UAAU,CAAC,EAAE,IAAI,eAAO,CAAC,MAAM,EAAE,UAAU,EAAE,CAAC,CAAC,CAAC,CAAC;QAEvF,IAAI,QAAQ,GAAG,4BAAa,CAAC,eAAe,CAAC,CAAC,CAAC,CAAA;QAE/C,IAAI,KAAK,GAAG,IAAI,YAAI,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;QACxC,IAAI,KAAK,GAAG,IAAI,YAAI,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;QACxC,KAAK,CAAC,QAAQ,CAAC,CAAC,GAAG,MAAM,CAAC;QAE1B,IAAI,KAAK,GAAG,IAAI,YAAI,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;QAEzC,IAAI,IAAI,GAAG,IAAI,aAAM,CAAC,UAAU,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,EAAE,UAAU,CAAC,CAAC;QAC5E,IAAI,MAAM,EACV;YACI,IAAI,KAAK,GAAG,IAAI,eAAO,EAAE,CAAC,aAAa,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YACjD,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC;YACzB,IAAI,CAAC,YAAY,CAAC,oBAAU,CAAC,IAAI,eAAO,CAAC,MAAM,GAAG,GAAG,EAAE,UAAU,GAAG,UAAU,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC;SAC3F;aAED;YACI,IAAI,CAAC,YAAY,CAAC,oBAAU,CAAC,IAAI,eAAO,CAAC,MAAM,GAAG,GAAG,EAAE,UAAU,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC;SAC9E;QAGD,KAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAEf,KAAI,CAAC,GAAG,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;;IAClC,CAAC;IACL,gBAAC;AAAD,CAAC,AA7CD,CAA+B,aAAK,GA6CnC;AA7CY,8BAAS"}

View File

@@ -1,10 +0,0 @@
import { Mesh } from "three";
import { Dimension } from ".";
/**
* 绘制标注实体
*
* @export
* @param {Box3} box
* @returns 标注实体列表
*/
export declare function DrawDimension(brList: Mesh[]): Dimension[];

32
dist/DrawDimension.js vendored
View File

@@ -1,32 +0,0 @@
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
var three_1 = require("three");
var _1 = require(".");
/**
* 绘制标注实体
*
* @export
* @param {Box3} box
* @returns 标注实体列表
*/
function DrawDimension(brList) {
var box = _1.GetBoxArr(brList);
var size = box.getSize(new three_1.Vector3());
var mat4 = new three_1.Matrix4();
mat4.makeBasis(new three_1.Vector3(-1, 0, 0), new three_1.Vector3(0, -1, 0), new three_1.Vector3(0, 0, 1));
mat4.setPosition(box.min.clone().add(new three_1.Vector3(size.x, -30)));
var textHeight = 45;
var dimx = new _1.Dimension(size.x, textHeight, true);
dimx.applyMatrix4(mat4);
var dimz = new _1.Dimension(size.z, textHeight);
mat4.makeBasis(new three_1.Vector3(0, 0, -1), new three_1.Vector3(1, 0, 0), new three_1.Vector3(0, -1, 0));
mat4.setPosition(box.max.clone().add(new three_1.Vector3(30, -size.y)));
dimz.applyMatrix4(mat4);
var dimy = new _1.Dimension(size.y, textHeight, true, true);
mat4.makeBasis(new three_1.Vector3(0, 1, 0), new three_1.Vector3(-1, 0, 0), new three_1.Vector3(0, 0, 1));
mat4.setPosition(box.max.clone().add(new three_1.Vector3(30, -size.y)));
dimy.applyMatrix4(mat4);
return [dimx, dimy, dimz];
}
exports.DrawDimension = DrawDimension;
//# sourceMappingURL=DrawDimension.js.map

View File

@@ -1 +0,0 @@
{"version":3,"file":"DrawDimension.js","sourceRoot":"","sources":["../src/DrawDimension.ts"],"names":[],"mappings":";;AAAA,+BAAqD;AACrD,sBAAyC;AAGzC;;;;;;GAMG;AACH,SAAgB,aAAa,CAAC,MAAc;IAExC,IAAI,GAAG,GAAG,YAAS,CAAC,MAAM,CAAC,CAAC;IAC5B,IAAI,IAAI,GAAG,GAAG,CAAC,OAAO,CAAC,IAAI,eAAO,EAAE,CAAC,CAAC;IAEtC,IAAI,IAAI,GAAG,IAAI,eAAO,EAAE,CAAC;IACzB,IAAI,CAAC,SAAS,CACV,IAAI,eAAO,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EACrB,IAAI,eAAO,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,EACrB,IAAI,eAAO,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CACvB,CAAA;IACD,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,GAAG,CAAC,IAAI,eAAO,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IAEhE,IAAI,UAAU,GAAG,EAAE,CAAC;IACpB,IAAI,IAAI,GAAG,IAAI,YAAS,CAAC,IAAI,CAAC,CAAC,EAAE,UAAU,EAAE,IAAI,CAAC,CAAC;IACnD,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;IAExB,IAAI,IAAI,GAAG,IAAI,YAAS,CAAC,IAAI,CAAC,CAAC,EAAE,UAAU,CAAC,CAAC;IAC7C,IAAI,CAAC,SAAS,CACV,IAAI,eAAO,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,EACrB,IAAI,eAAO,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EACpB,IAAI,eAAO,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CACxB,CAAA;IACD,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,GAAG,CAAC,IAAI,eAAO,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAChE,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;IAExB,IAAI,IAAI,GAAG,IAAI,YAAS,CAAC,IAAI,CAAC,CAAC,EAAE,UAAU,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;IACzD,IAAI,CAAC,SAAS,CACV,IAAI,eAAO,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EACpB,IAAI,eAAO,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EACrB,IAAI,eAAO,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CACvB,CAAA;IACD,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,GAAG,CAAC,IAAI,eAAO,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAChE,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;IAGxB,OAAO,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;AAC9B,CAAC;AArCD,sCAqCC"}

72
dist/GeUtils.d.ts vendored
View File

@@ -1,72 +0,0 @@
import { Geometry, Vector, Vector2, Vector3, Box3, Matrix4, Object3D, Line, Mesh } from 'three';
export declare const cZeroVec: Vector3;
export declare const cXAxis: Vector3;
export declare const cYAxis: Vector3;
export declare const cZAxis: Vector3;
/**
* 旋转一个点,旋转中心在原点
*
* @export
* @param {Vector3} pt 点
* @param {number} ang 角度.
* @returns {Vector3} 返回pt不拷贝.
*/
export declare function rotatePoint(pt: Vector3, ang: number): Vector3;
export declare function equaln(v1: number, v2: number, fuzz?: number): boolean;
export declare function equalv3(v1: Vector3, v2: Vector3, fuzz?: number): boolean;
export declare function equal<T extends Vector>(v1: T, v2: T): boolean;
export declare function fixAngle(an: number, fixAngle: number, fuzz?: number): number;
/**
* 按照极坐标的方式移动一个点
*
* @export
* @template
* @param {T} v 向量(2d,3d)
* @param {number} an 角度
* @param {number} dis 距离
* @returns {T}
*/
export declare function polar<T extends Vector2 | Vector3>(v: T, an: number, dis: number): T;
export declare function angle(v: Vector3 | Vector2): number;
/**
* 求两个向量的夹角,顺时针为负,逆时针为正
*
* @param {Vector3} v1
* @param {Vector3} v2
* @param {Vector3} [ref] 参考向量,如果为世界坐标系则为0,0,1
* @returns
*/
export declare function angleTo(v1: Vector3, v2: Vector3, ref?: Vector3): number;
export declare function getLoocAtUpVec(dir: Vector3): Vector3;
export declare function createLookAtMat4(dir: Vector3): Matrix4;
export declare function isParallelTo(v1: Vector3, v2: Vector3): boolean;
export declare function ptToString(v: Vector3, fractionDigits?: number): string;
export declare function midPoint(v1: Vector3, v2: Vector3): Vector3;
export declare function midPoint2(v1: Vector2, v2: Vector2): Vector2;
export declare function midPtCir(v1: Vector3, v2: Vector3): Vector3;
/**
* 获得Three对象的包围盒.
* @param obj
* @param [updateMatrix] 是否应该更新对象矩阵
* @returns box
*/
export declare function GetBox(obj: Object3D, updateMatrix?: boolean): Box3;
export declare function GetBoxArr(arr: Array<Object3D>): Box3;
export declare function MoveMatrix(v: Vector3): Matrix4;
export declare function getProjectDist(v1: Vector3, v2: Vector3): {
h: number;
v: number;
};
export declare function getPtPostion(sp: Vector3, ep: Vector3, c: Vector3, inPt: Vector3): {
sp: Vector3;
ep: Vector3;
};
export declare function angleAndX(v: Vector3 | Vector2): number;
/**
* 将角度调整为0-2pi之间
*
* @export
* @param {number} an
*/
export declare function angleTo2Pi(an: number): number;
export declare function updateGeometry(l: Line | Mesh, geometry: Geometry): void;

266
dist/GeUtils.js vendored
View File

@@ -1,266 +0,0 @@
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
var three_1 = require("three");
var Matrix2_1 = require("./Matrix2");
exports.cZeroVec = new three_1.Vector3();
exports.cXAxis = new three_1.Vector3(1, 0, 0);
exports.cYAxis = new three_1.Vector3(0, 1, 0);
exports.cZAxis = new three_1.Vector3(0, 0, 1);
/**
* 旋转一个点,旋转中心在原点
*
* @export
* @param {Vector3} pt 点
* @param {number} ang 角度.
* @returns {Vector3} 返回pt不拷贝.
*/
function rotatePoint(pt, ang) {
new Matrix2_1.Matrix2().setRotate(ang).applyVector(pt);
return pt;
}
exports.rotatePoint = rotatePoint;
function equaln(v1, v2, fuzz) {
if (fuzz === void 0) { fuzz = 1e-3; }
return Math.abs(v1 - v2) < fuzz;
}
exports.equaln = equaln;
function equalv3(v1, v2, fuzz) {
if (fuzz === void 0) { fuzz = 1e-8; }
return equaln(v1.x, v2.x, fuzz) && equaln(v1.y, v2.y, fuzz) && equaln(v1.z, v2.z, fuzz);
}
exports.equalv3 = equalv3;
function equal(v1, v2) {
return v1.distanceToSquared(v2) < 1e-8;
}
exports.equal = equal;
function fixAngle(an, fixAngle, fuzz) {
if (fuzz === void 0) { fuzz = 0.1; }
if (an < 0)
an += Math.PI * 2;
an += fuzz;
var rem = an % fixAngle;
if (rem < fuzz * 2) {
an -= rem;
}
else {
an -= fuzz;
}
return an;
}
exports.fixAngle = fixAngle;
/**
* 按照极坐标的方式移动一个点
*
* @export
* @template
* @param {T} v 向量(2d,3d)
* @param {number} an 角度
* @param {number} dis 距离
* @returns {T}
*/
function polar(v, an, dis) {
v.x += Math.cos(an) * dis;
v.y += Math.sin(an) * dis;
return v;
}
exports.polar = polar;
function angle(v) {
if (equaln(v.y, 0) && v.x > 0)
return 0;
var angle = Math.atan2(v.y, v.x);
if (angle < 0)
angle += Math.PI * 2;
return angle;
}
exports.angle = angle;
/**
* 求两个向量的夹角,顺时针为负,逆时针为正
*
* @param {Vector3} v1
* @param {Vector3} v2
* @param {Vector3} [ref] 参考向量,如果为世界坐标系则为0,0,1
* @returns
*/
function angleTo(v1, v2, ref) {
if (ref === void 0) { ref = new three_1.Vector3(0, 0, 1); }
if (!ref.equals(new three_1.Vector3(0, 0, 1))) {
//任意轴坐标系. 使用相机的构造矩阵.
ref.multiplyScalar(-1);
var up = getLoocAtUpVec(ref);
var refOcs = new three_1.Matrix4();
refOcs.lookAt(exports.cZeroVec, ref, up);
var refOcsInv = new three_1.Matrix4().getInverse(refOcs);
v1.applyMatrix4(refOcsInv);
v2.applyMatrix4(refOcsInv);
v1.z = 0;
v2.z = 0;
}
if (v1.equals(exports.cZeroVec) || v2.equals(exports.cZeroVec))
return 0;
var cv = new three_1.Vector3().crossVectors(v1, v2).normalize();
return cv.z === 0 ? v1.angleTo(v2) : v1.angleTo(v2) * cv.z;
}
exports.angleTo = angleTo;
function getLoocAtUpVec(dir) {
if (dir.equals(exports.cZeroVec)) {
throw ("zero vector");
}
var norm = dir.clone().normalize();
if (norm.equals(exports.cZAxis)) {
return new three_1.Vector3(0, 1, 0);
}
else if (norm.equals(exports.cZAxis.clone().negate())) {
return new three_1.Vector3(0, -1, 0);
}
else {
var xv = new three_1.Vector3();
xv.crossVectors(exports.cZAxis, norm);
var up = new three_1.Vector3();
up.crossVectors(norm, xv);
return up;
}
}
exports.getLoocAtUpVec = getLoocAtUpVec;
function createLookAtMat4(dir) {
var up = getLoocAtUpVec(dir);
var mat = new three_1.Matrix4();
mat.lookAt(exports.cZeroVec, dir, up);
return mat;
}
exports.createLookAtMat4 = createLookAtMat4;
function isParallelTo(v1, v2) {
return v1.clone().cross(v2).lengthSq() < 1e-9;
}
exports.isParallelTo = isParallelTo;
function ptToString(v, fractionDigits) {
if (fractionDigits === void 0) { fractionDigits = 3; }
return v.toArray().map(function (o) {
return o.toFixed(fractionDigits);
}).join(",");
}
exports.ptToString = ptToString;
function midPoint(v1, v2) {
return v1.clone().add(v2).multiplyScalar(0.5);
}
exports.midPoint = midPoint;
function midPoint2(v1, v2) {
return v1.clone().add(v2).multiplyScalar(0.5);
}
exports.midPoint2 = midPoint2;
function midPtCir(v1, v2) {
var baseline = new three_1.Vector3(1, 0, 0);
var outLine = v2.clone().sub(v1);
var ang = angleTo(baseline, outLine) / 2;
var midLine = rotatePoint(outLine, -ang);
return v1.clone().add(midLine);
}
exports.midPtCir = midPtCir;
/**
* 获得Three对象的包围盒.
* @param obj
* @param [updateMatrix] 是否应该更新对象矩阵
* @returns box
*/
function GetBox(obj, updateMatrix) {
var box = new three_1.Box3();
if (updateMatrix)
obj.updateMatrixWorld(false);
if (!obj.visible)
return box;
obj.traverse(function (o) {
//因为实体Erase时,实体仍然保存在Scene中.
if (o.visible === false)
return;
//@ts-ignore
var geo = o.geometry;
if (geo) {
if (!geo.boundingBox)
geo.computeBoundingBox();
box.union(geo.boundingBox.clone().applyMatrix4(o.matrixWorld));
}
});
return box;
}
exports.GetBox = GetBox;
function GetBoxArr(arr) {
var box = new three_1.Box3();
for (var _i = 0, arr_1 = arr; _i < arr_1.length; _i++) {
var o = arr_1[_i];
var b = GetBox(o);
if (!b.isEmpty())
box.union(b);
}
return box;
}
exports.GetBoxArr = GetBoxArr;
function MoveMatrix(v) {
var mat = new three_1.Matrix4();
mat.makeTranslation(v.x, v.y, v.z);
return mat;
}
exports.MoveMatrix = MoveMatrix;
function getProjectDist(v1, v2) {
var ang = v1.angleTo(v2);
var dist = v1.length();
return {
h: dist * Math.cos(ang),
v: dist * Math.sin(ang)
};
}
exports.getProjectDist = getProjectDist;
//获得输入点在2线组成的4个区间的位置
function getPtPostion(sp, ep, c, inPt) {
var l1 = sp.clone().sub(c);
var l2 = ep.clone().sub(c);
var l3 = l1.clone().negate();
var l4 = l2.clone().negate();
var inputLine = inPt.clone().sub(c);
var ang1 = angleTo(l1, l2);
var ang2 = Math.PI;
var ang3 = ang2 + Math.abs(ang1);
var inputAng = angleTo(l1, inputLine);
if (ang1 * inputAng < 0) {
inputAng = (Math.PI * 2 - Math.abs(inputAng));
}
ang1 = Math.abs(ang1);
inputAng = Math.abs(inputAng);
if (inputAng <= ang1) {
return { sp: sp, ep: ep };
}
else if (inputAng > ang1 && inputAng <= ang2) {
return { sp: c.clone().add(l3), ep: ep };
}
else if (inputAng > ang2 && inputAng <= ang3) {
return { sp: c.clone().add(l3), ep: c.clone().add(l4) };
}
else {
return { sp: sp, ep: c.clone().add(l4) };
}
}
exports.getPtPostion = getPtPostion;
function angleAndX(v) {
return v.x ? Math.atan(v.y / v.x) : Math.PI / 2;
}
exports.angleAndX = angleAndX;
/**
* 将角度调整为0-2pi之间
*
* @export
* @param {number} an
*/
function angleTo2Pi(an) {
an = an % (Math.PI * 2);
if (an < 0)
an += Math.PI * 2;
return an;
}
exports.angleTo2Pi = angleTo2Pi;
function updateGeometry(l, geometry) {
var geo = l.geometry;
geo.dispose();
l.geometry = geometry;
geometry.verticesNeedUpdate = true;
geometry.computeBoundingSphere();
}
exports.updateGeometry = updateGeometry;
//# sourceMappingURL=GeUtils.js.map

1
dist/GeUtils.js.map vendored

File diff suppressed because one or more lines are too long

149
dist/KeyEnum.d.ts vendored
View File

@@ -1,149 +0,0 @@
export declare enum MouseKey {
Left = 0,
Middle = 1,
Right = 2
}
export declare enum KeyBoard {
Digit1 = 49,
Digit2 = 50,
Digit3 = 51,
Digit4 = 52,
Digit5 = 53,
Digit6 = 54,
Digit7 = 55,
Digit8 = 56,
Digit9 = 57,
Digit0 = 58,
KeyA = 65,
KeyB = 66,
KeyC = 67,
KeyD = 68,
KeyE = 69,
KeyF = 70,
KeyG = 71,
KeyH = 72,
KeyI = 73,
KeyJ = 74,
KeyK = 75,
KeyL = 76,
KeyM = 77,
KeyN = 78,
KeyO = 79,
KeyP = 80,
KeyQ = 81,
KeyR = 82,
KeyS = 83,
KeyT = 84,
KeyU = 85,
KeyV = 86,
KeyW = 87,
KeyX = 88,
KeyY = 89,
KeyZ = 90,
/**
* 逗号
*/
Comma = 188,
CommaChrome = 229,
/**
* 句号
*/
Period = 190,
/**
* 分号
*/
Semicolon = 186,
/**
* 引号
*/
Quote = 222,
/**
* 左括号
*/
BracketLeft = 219,
/**
* 右括号
*/
BracketRight = 220,
/**
* 反引号
*/
Backquote = 192,
/**
* 反斜杠
*/
Backslash = 220,
/**
* 减号
*/
Minus = 189,
/**
* 等号
*/
Equal = 187,
IntlRo = 193,
IntlYen = 255,
Alt = 18,
/**
* 大写锁定
*/
CapsLock = 20,
Control = 17,
/**
* win左键
*/
OSLeft = 91,
/**
* win右键
*/
OSRight = 92,
Shift = 16,
ContextMenu = 93,
Enter = 13,
Space = 32,
Backspace = 8,
Tab = 9,
Delete = 46,
End = 35,
Home = 36,
Insert = 45,
PageDown = 34,
PageUp = 33,
ArrowDown = 40,
ArrowLeft = 37,
ArrowRight = 39,
ArrowUp = 38,
Escape = 27,
PrintScreen = 44,
ScrollLock = 145,
Pause = 19,
F1 = 112,
F2 = 113,
F3 = 114,
F5 = 116,
F6 = 117,
F7 = 118,
F8 = 119,
F9 = 120,
F10 = 121,
F11 = 122,
F12 = 123,
NumLock = 114,
Numpad0 = 96,
Numpad1 = 97,
Numpad2 = 98,
Numpad3 = 99,
Numpad4 = 100,
Numpad5 = 101,
Numpad6 = 102,
Numpad7 = 103,
Numpad8 = 104,
Numpad9 = 105,
NumpadAdd = 107,
NumpadDivide = 111,
NumpadEqual = 12,
NumpadMultiply = 106,
NumpadSubtract = 109,
NumpadDot = 110,
NumpadDot1 = 190
}

161
dist/KeyEnum.js vendored
View File

@@ -1,161 +0,0 @@
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
//鼠标类型
var MouseKey;
(function (MouseKey) {
MouseKey[MouseKey["Left"] = 0] = "Left";
MouseKey[MouseKey["Middle"] = 1] = "Middle";
MouseKey[MouseKey["Right"] = 2] = "Right";
})(MouseKey = exports.MouseKey || (exports.MouseKey = {}));
var KeyBoard;
(function (KeyBoard) {
// 数字
KeyBoard[KeyBoard["Digit1"] = 49] = "Digit1";
KeyBoard[KeyBoard["Digit2"] = 50] = "Digit2";
KeyBoard[KeyBoard["Digit3"] = 51] = "Digit3";
KeyBoard[KeyBoard["Digit4"] = 52] = "Digit4";
KeyBoard[KeyBoard["Digit5"] = 53] = "Digit5";
KeyBoard[KeyBoard["Digit6"] = 54] = "Digit6";
KeyBoard[KeyBoard["Digit7"] = 55] = "Digit7";
KeyBoard[KeyBoard["Digit8"] = 56] = "Digit8";
KeyBoard[KeyBoard["Digit9"] = 57] = "Digit9";
KeyBoard[KeyBoard["Digit0"] = 58] = "Digit0";
// 字母
KeyBoard[KeyBoard["KeyA"] = 65] = "KeyA";
KeyBoard[KeyBoard["KeyB"] = 66] = "KeyB";
KeyBoard[KeyBoard["KeyC"] = 67] = "KeyC";
KeyBoard[KeyBoard["KeyD"] = 68] = "KeyD";
KeyBoard[KeyBoard["KeyE"] = 69] = "KeyE";
KeyBoard[KeyBoard["KeyF"] = 70] = "KeyF";
KeyBoard[KeyBoard["KeyG"] = 71] = "KeyG";
KeyBoard[KeyBoard["KeyH"] = 72] = "KeyH";
KeyBoard[KeyBoard["KeyI"] = 73] = "KeyI";
KeyBoard[KeyBoard["KeyJ"] = 74] = "KeyJ";
KeyBoard[KeyBoard["KeyK"] = 75] = "KeyK";
KeyBoard[KeyBoard["KeyL"] = 76] = "KeyL";
KeyBoard[KeyBoard["KeyM"] = 77] = "KeyM";
KeyBoard[KeyBoard["KeyN"] = 78] = "KeyN";
KeyBoard[KeyBoard["KeyO"] = 79] = "KeyO";
KeyBoard[KeyBoard["KeyP"] = 80] = "KeyP";
KeyBoard[KeyBoard["KeyQ"] = 81] = "KeyQ";
KeyBoard[KeyBoard["KeyR"] = 82] = "KeyR";
KeyBoard[KeyBoard["KeyS"] = 83] = "KeyS";
KeyBoard[KeyBoard["KeyT"] = 84] = "KeyT";
KeyBoard[KeyBoard["KeyU"] = 85] = "KeyU";
KeyBoard[KeyBoard["KeyV"] = 86] = "KeyV";
KeyBoard[KeyBoard["KeyW"] = 87] = "KeyW";
KeyBoard[KeyBoard["KeyX"] = 88] = "KeyX";
KeyBoard[KeyBoard["KeyY"] = 89] = "KeyY";
KeyBoard[KeyBoard["KeyZ"] = 90] = "KeyZ";
// 符号
/**
* 逗号
*/
KeyBoard[KeyBoard["Comma"] = 188] = "Comma";
KeyBoard[KeyBoard["CommaChrome"] = 229] = "CommaChrome";
/**
* 句号
*/
KeyBoard[KeyBoard["Period"] = 190] = "Period";
/**
* 分号
*/
KeyBoard[KeyBoard["Semicolon"] = 186] = "Semicolon";
/**
* 引号
*/
KeyBoard[KeyBoard["Quote"] = 222] = "Quote";
/**
* 左括号
*/
KeyBoard[KeyBoard["BracketLeft"] = 219] = "BracketLeft";
/**
* 右括号
*/
KeyBoard[KeyBoard["BracketRight"] = 220] = "BracketRight";
/**
* 反引号
*/
KeyBoard[KeyBoard["Backquote"] = 192] = "Backquote";
/**
* 反斜杠
*/
KeyBoard[KeyBoard["Backslash"] = 220] = "Backslash";
/**
* 减号
*/
KeyBoard[KeyBoard["Minus"] = 189] = "Minus";
/**
* 等号
*/
KeyBoard[KeyBoard["Equal"] = 187] = "Equal";
KeyBoard[KeyBoard["IntlRo"] = 193] = "IntlRo";
KeyBoard[KeyBoard["IntlYen"] = 255] = "IntlYen";
// 功能键
KeyBoard[KeyBoard["Alt"] = 18] = "Alt";
/**
* 大写锁定
*/
KeyBoard[KeyBoard["CapsLock"] = 20] = "CapsLock";
KeyBoard[KeyBoard["Control"] = 17] = "Control";
/**
* win左键
*/
KeyBoard[KeyBoard["OSLeft"] = 91] = "OSLeft";
/**
* win右键
*/
KeyBoard[KeyBoard["OSRight"] = 92] = "OSRight";
KeyBoard[KeyBoard["Shift"] = 16] = "Shift";
KeyBoard[KeyBoard["ContextMenu"] = 93] = "ContextMenu";
KeyBoard[KeyBoard["Enter"] = 13] = "Enter";
KeyBoard[KeyBoard["Space"] = 32] = "Space";
KeyBoard[KeyBoard["Backspace"] = 8] = "Backspace";
KeyBoard[KeyBoard["Tab"] = 9] = "Tab";
KeyBoard[KeyBoard["Delete"] = 46] = "Delete";
KeyBoard[KeyBoard["End"] = 35] = "End";
KeyBoard[KeyBoard["Home"] = 36] = "Home";
KeyBoard[KeyBoard["Insert"] = 45] = "Insert";
KeyBoard[KeyBoard["PageDown"] = 34] = "PageDown";
KeyBoard[KeyBoard["PageUp"] = 33] = "PageUp";
KeyBoard[KeyBoard["ArrowDown"] = 40] = "ArrowDown";
KeyBoard[KeyBoard["ArrowLeft"] = 37] = "ArrowLeft";
KeyBoard[KeyBoard["ArrowRight"] = 39] = "ArrowRight";
KeyBoard[KeyBoard["ArrowUp"] = 38] = "ArrowUp";
KeyBoard[KeyBoard["Escape"] = 27] = "Escape";
KeyBoard[KeyBoard["PrintScreen"] = 44] = "PrintScreen";
KeyBoard[KeyBoard["ScrollLock"] = 145] = "ScrollLock";
KeyBoard[KeyBoard["Pause"] = 19] = "Pause";
// F数字
KeyBoard[KeyBoard["F1"] = 112] = "F1";
KeyBoard[KeyBoard["F2"] = 113] = "F2";
KeyBoard[KeyBoard["F3"] = 114] = "F3";
KeyBoard[KeyBoard["F5"] = 116] = "F5";
KeyBoard[KeyBoard["F6"] = 117] = "F6";
KeyBoard[KeyBoard["F7"] = 118] = "F7";
KeyBoard[KeyBoard["F8"] = 119] = "F8";
KeyBoard[KeyBoard["F9"] = 120] = "F9";
KeyBoard[KeyBoard["F10"] = 121] = "F10";
KeyBoard[KeyBoard["F11"] = 122] = "F11";
KeyBoard[KeyBoard["F12"] = 123] = "F12";
//数字键盘
KeyBoard[KeyBoard["NumLock"] = 114] = "NumLock";
KeyBoard[KeyBoard["Numpad0"] = 96] = "Numpad0";
KeyBoard[KeyBoard["Numpad1"] = 97] = "Numpad1";
KeyBoard[KeyBoard["Numpad2"] = 98] = "Numpad2";
KeyBoard[KeyBoard["Numpad3"] = 99] = "Numpad3";
KeyBoard[KeyBoard["Numpad4"] = 100] = "Numpad4";
KeyBoard[KeyBoard["Numpad5"] = 101] = "Numpad5";
KeyBoard[KeyBoard["Numpad6"] = 102] = "Numpad6";
KeyBoard[KeyBoard["Numpad7"] = 103] = "Numpad7";
KeyBoard[KeyBoard["Numpad8"] = 104] = "Numpad8";
KeyBoard[KeyBoard["Numpad9"] = 105] = "Numpad9";
KeyBoard[KeyBoard["NumpadAdd"] = 107] = "NumpadAdd";
KeyBoard[KeyBoard["NumpadDivide"] = 111] = "NumpadDivide";
KeyBoard[KeyBoard["NumpadEqual"] = 12] = "NumpadEqual";
KeyBoard[KeyBoard["NumpadMultiply"] = 106] = "NumpadMultiply";
KeyBoard[KeyBoard["NumpadSubtract"] = 109] = "NumpadSubtract";
KeyBoard[KeyBoard["NumpadDot"] = 110] = "NumpadDot";
KeyBoard[KeyBoard["NumpadDot1"] = 190] = "NumpadDot1";
})(KeyBoard = exports.KeyBoard || (exports.KeyBoard = {}));
//# sourceMappingURL=KeyEnum.js.map

1
dist/KeyEnum.js.map vendored
View File

@@ -1 +0,0 @@
{"version":3,"file":"KeyEnum.js","sourceRoot":"","sources":["../src/KeyEnum.ts"],"names":[],"mappings":";;AAAA,MAAM;AACN,IAAY,QAKX;AALD,WAAY,QAAQ;IAEhB,uCAAQ,CAAA;IACR,2CAAU,CAAA;IACV,yCAAS,CAAA;AACb,CAAC,EALW,QAAQ,GAAR,gBAAQ,KAAR,gBAAQ,QAKnB;AAED,IAAY,QA2JX;AA3JD,WAAY,QAAQ;IAEhB,KAAK;IACL,4CAAW,CAAA;IACX,4CAAW,CAAA;IACX,4CAAW,CAAA;IACX,4CAAW,CAAA;IACX,4CAAW,CAAA;IACX,4CAAW,CAAA;IACX,4CAAW,CAAA;IACX,4CAAW,CAAA;IACX,4CAAW,CAAA;IACX,4CAAW,CAAA;IACX,KAAK;IACL,wCAAS,CAAA;IACT,wCAAS,CAAA;IACT,wCAAS,CAAA;IACT,wCAAS,CAAA;IACT,wCAAS,CAAA;IACT,wCAAS,CAAA;IACT,wCAAS,CAAA;IACT,wCAAS,CAAA;IACT,wCAAS,CAAA;IACT,wCAAS,CAAA;IACT,wCAAS,CAAA;IACT,wCAAS,CAAA;IACT,wCAAS,CAAA;IACT,wCAAS,CAAA;IACT,wCAAS,CAAA;IACT,wCAAS,CAAA;IACT,wCAAS,CAAA;IACT,wCAAS,CAAA;IACT,wCAAS,CAAA;IACT,wCAAS,CAAA;IACT,wCAAS,CAAA;IACT,wCAAS,CAAA;IACT,wCAAS,CAAA;IACT,wCAAS,CAAA;IACT,wCAAS,CAAA;IACT,wCAAS,CAAA;IAET,KAAK;IACL;;OAEG;IACH,2CAAW,CAAA;IACX,uDAAiB,CAAA;IACjB;;OAEG;IACH,6CAAY,CAAA;IACZ;;OAEG;IACH,mDAAe,CAAA;IACf;;OAEG;IACH,2CAAW,CAAA;IACX;;OAEG;IACH,uDAAiB,CAAA;IACjB;;OAEG;IACH,yDAAkB,CAAA;IAClB;;OAEG;IACH,mDAAe,CAAA;IACf;;OAEG;IACH,mDAAe,CAAA;IACf;;OAEG;IACH,2CAAW,CAAA;IACX;;OAEG;IACH,2CAAW,CAAA;IACX,6CAAY,CAAA;IACZ,+CAAa,CAAA;IACb,MAAM;IACN,sCAAQ,CAAA;IACR;;OAEG;IACH,gDAAa,CAAA;IACb,8CAAY,CAAA;IACZ;;OAEG;IACH,4CAAW,CAAA;IACX;;OAEG;IACH,8CAAY,CAAA;IACZ,0CAAU,CAAA;IAEV,sDAAgB,CAAA;IAChB,0CAAU,CAAA;IACV,0CAAU,CAAA;IACV,iDAAa,CAAA;IACb,qCAAO,CAAA;IACP,4CAAW,CAAA;IACX,sCAAQ,CAAA;IACR,wCAAS,CAAA;IACT,4CAAW,CAAA;IACX,gDAAa,CAAA;IACb,4CAAW,CAAA;IACX,kDAAc,CAAA;IACd,kDAAc,CAAA;IACd,oDAAe,CAAA;IACf,8CAAY,CAAA;IACZ,4CAAW,CAAA;IACX,sDAAgB,CAAA;IAChB,qDAAgB,CAAA;IAChB,0CAAU,CAAA;IAEV,MAAM;IACN,qCAAQ,CAAA;IACR,qCAAQ,CAAA;IACR,qCAAQ,CAAA;IACR,qCAAQ,CAAA;IACR,qCAAQ,CAAA;IACR,qCAAQ,CAAA;IACR,qCAAQ,CAAA;IACR,qCAAQ,CAAA;IACR,uCAAS,CAAA;IACT,uCAAS,CAAA;IACT,uCAAS,CAAA;IAET,MAAM;IACN,+CAAa,CAAA;IACb,8CAAY,CAAA;IACZ,8CAAY,CAAA;IACZ,8CAAY,CAAA;IACZ,8CAAY,CAAA;IACZ,+CAAa,CAAA;IACb,+CAAa,CAAA;IACb,+CAAa,CAAA;IACb,+CAAa,CAAA;IACb,+CAAa,CAAA;IACb,+CAAa,CAAA;IACb,mDAAe,CAAA;IACf,yDAAkB,CAAA;IAClB,sDAAgB,CAAA;IAChB,6DAAoB,CAAA;IACpB,6DAAoB,CAAA;IACpB,mDAAe,CAAA;IACf,qDAAgB,CAAA;AAEpB,CAAC,EA3JW,QAAQ,GAAR,gBAAQ,KAAR,gBAAQ,QA2JnB"}

4
dist/Material.d.ts vendored
View File

@@ -1,4 +0,0 @@
import { MeshBasicMaterial, LineBasicMaterial } from "three";
export declare let boardMaterial: MeshBasicMaterial;
export declare let selectMaterial: MeshBasicMaterial;
export declare let edgeMaterial: LineBasicMaterial;

19
dist/Material.js vendored
View File

@@ -1,19 +0,0 @@
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
var three_1 = require("three");
//板件的材质,使用这个材质避免板件将线覆盖.
exports.boardMaterial = new three_1.MeshBasicMaterial({
color: new three_1.Color(0.8, 0.8, 0.8),
polygonOffset: true,
polygonOffsetFactor: 1,
polygonOffsetUnits: 1
});
exports.selectMaterial = new three_1.MeshBasicMaterial({
color: new three_1.Color(0.1, 0.5, 0.5),
polygonOffset: true,
polygonOffsetFactor: 1,
polygonOffsetUnits: 1
});
//线框的材质
exports.edgeMaterial = new three_1.LineBasicMaterial({ linewidth: 2, color: new three_1.Color(0, 0, 0) });
//# sourceMappingURL=Material.js.map

View File

@@ -1 +0,0 @@
{"version":3,"file":"Material.js","sourceRoot":"","sources":["../src/Material.ts"],"names":[],"mappings":";;AAAA,+BAAoE;AAEpE,uBAAuB;AACZ,QAAA,aAAa,GAAG,IAAI,yBAAiB,CAAC;IAC7C,KAAK,EAAE,IAAI,aAAK,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC;IAC/B,aAAa,EAAE,IAAI;IACnB,mBAAmB,EAAE,CAAC;IACtB,kBAAkB,EAAE,CAAC;CACxB,CAAC,CAAC;AAEQ,QAAA,cAAc,GAAG,IAAI,yBAAiB,CAAC;IAC9C,KAAK,EAAE,IAAI,aAAK,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC;IAC/B,aAAa,EAAE,IAAI;IACnB,mBAAmB,EAAE,CAAC;IACtB,kBAAkB,EAAE,CAAC;CACxB,CAAC,CAAC;AAEH,OAAO;AACI,QAAA,YAAY,GAAG,IAAI,yBAAiB,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,KAAK,EAAE,IAAI,aAAK,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC"}

7
dist/Matrix2.d.ts vendored
View File

@@ -1,7 +0,0 @@
import { Vector2, Vector3 } from "three";
export declare class Matrix2 {
private el;
set(n11: number, n12: number, n21: number, n22: number): this;
applyVector(vec: Vector2 | Vector3): this;
setRotate(theta: number): Matrix2;
}

31
dist/Matrix2.js vendored
View File

@@ -1,31 +0,0 @@
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
var Matrix2 = /** @class */ (function () {
function Matrix2() {
this.el = [1, 0, 0, 1];
}
Matrix2.prototype.set = function (n11, n12, n21, n22) {
var te = this.el;
te[0] = n11;
te[1] = n21;
te[2] = n12;
te[3] = n22;
return this;
};
Matrix2.prototype.applyVector = function (vec) {
var x = vec.x, y = vec.y;
var e = this.el;
vec.x = e[0] * x + e[2] * y;
vec.y = e[1] * x + e[3] * y;
return this;
};
Matrix2.prototype.setRotate = function (theta) {
var el = this.el;
var c = Math.cos(theta), s = Math.sin(theta);
this.set(c, -s, s, c);
return this;
};
return Matrix2;
}());
exports.Matrix2 = Matrix2;
//# sourceMappingURL=Matrix2.js.map

1
dist/Matrix2.js.map vendored
View File

@@ -1 +0,0 @@
{"version":3,"file":"Matrix2.js","sourceRoot":"","sources":["../src/Matrix2.ts"],"names":[],"mappings":";;AAEA;IAAA;QAEY,OAAE,GAAG,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;IA4B9B,CAAC;IA3BG,qBAAG,GAAH,UAAI,GAAW,EAAE,GAAW,EAAE,GAAW,EAAE,GAAW;QAElD,IAAI,EAAE,GAAG,IAAI,CAAC,EAAE,CAAC;QAEjB,EAAE,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC;QAAC,EAAE,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC;QACzB,EAAE,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC;QAAC,EAAE,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC;QACzB,OAAO,IAAI,CAAC;IAChB,CAAC;IACD,6BAAW,GAAX,UAAY,GAAsB;QAE9B,IAAI,CAAC,GAAG,GAAG,CAAC,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC;QACzB,IAAI,CAAC,GAAG,IAAI,CAAC,EAAE,CAAC;QAChB,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;QAC5B,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;QAE5B,OAAO,IAAI,CAAC;IAChB,CAAC;IAED,2BAAS,GAAT,UAAU,KAAa;QAEnB,IAAI,EAAE,GAAG,IAAI,CAAC,EAAE,CAAC;QACjB,IAAI,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QAE7C,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,EACV,CAAC,EAAE,CAAC,CAAC,CAAC;QACV,OAAO,IAAI,CAAC;IAChB,CAAC;IACL,cAAC;AAAD,CAAC,AA9BD,IA8BC;AA9BY,0BAAO"}

39
dist/Orbit.d.ts vendored
View File

@@ -1,39 +0,0 @@
import { Vector3 } from "three";
/**
* 轨道控制的数学类,观察向量和角度的互相转换
* 当x当抬头或者低头到90度时,触发万向锁.
*
* @class Orbit
*/
export declare class Orbit {
private m_RoX;
RoZ: number;
get RoX(): number;
set RoX(v: number);
/**
* 使用旋转角度 计算观察向量
*
* @param {Vector3} [dir] 引用传入,如果传入,那么就不构造新的向量
* @returns {Vector3} 返回观察向量
* @memberof Orbit
*/
UpdateDirection(dir?: Vector3): Vector3;
/**
* 使用观察向量,计算旋转角度
*
* @param {Vector3} dir
* @memberof Orbit
*/
UpdateRoValue(dir: Vector3): void;
/**
*
* 根据观察向量 求头部的向量.
*
* @static
* @param {Vector3} dir
* @param {Vector3} [up]
* @returns {Vector3}
* @memberof Orbit
*/
static ComputUpDirection(dir: Vector3, up?: Vector3): Vector3;
}

86
dist/Orbit.js vendored
View File

@@ -1,86 +0,0 @@
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
var three_1 = require("three");
/**
* 轨道控制的数学类,观察向量和角度的互相转换
* 当x当抬头或者低头到90度时,触发万向锁.
*
* @class Orbit
*/
var Orbit = /** @class */ (function () {
function Orbit() {
//抬头低头 正数抬头 负数低头
this.m_RoX = 0;
//身体旋转 0为正右边 逆时针旋转
this.RoZ = 0;
}
Object.defineProperty(Orbit.prototype, "RoX", {
get: function () {
return this.m_RoX;
},
set: function (v) {
this.m_RoX = three_1.MathUtils.clamp(v, Math.PI * -0.5, Math.PI * 0.5);
},
enumerable: true,
configurable: true
});
/**
* 使用旋转角度 计算观察向量
*
* @param {Vector3} [dir] 引用传入,如果传入,那么就不构造新的向量
* @returns {Vector3} 返回观察向量
* @memberof Orbit
*/
Orbit.prototype.UpdateDirection = function (dir) {
var rtDir = dir ? dir : new three_1.Vector3();
rtDir.z = Math.sin(this.m_RoX);
//归一化专用.
var d = Math.abs(Math.cos(this.m_RoX));
rtDir.x = Math.cos(this.RoZ) * d;
rtDir.y = Math.sin(this.RoZ) * d;
return rtDir;
};
/**
* 使用观察向量,计算旋转角度
*
* @param {Vector3} dir
* @memberof Orbit
*/
Orbit.prototype.UpdateRoValue = function (dir) {
dir.normalize();
this.m_RoX = Math.asin(dir.z);
if (dir.x < 1e-4 && dir.y < 1e-4)
this.RoZ = Math.PI * 0.5;
else
this.RoZ = Math.atan2(dir.y, dir.x);
};
/**
*
* 根据观察向量 求头部的向量.
*
* @static
* @param {Vector3} dir
* @param {Vector3} [up]
* @returns {Vector3}
* @memberof Orbit
*/
Orbit.ComputUpDirection = function (dir, up) {
var upRes = up ? up : new three_1.Vector3();
if (dir.equals(new three_1.Vector3(0, 0, -1))) {
upRes.set(0, 1, 0);
}
else if (dir.equals(new three_1.Vector3(0, 0, 1))) {
upRes.set(0, -1, 0);
}
else {
var xv = new three_1.Vector3();
xv.crossVectors(new three_1.Vector3(0, 0, 1), dir);
upRes.crossVectors(dir, xv);
upRes.normalize();
}
return upRes;
};
return Orbit;
}());
exports.Orbit = Orbit;
//# sourceMappingURL=Orbit.js.map

1
dist/Orbit.js.map vendored
View File

@@ -1 +0,0 @@
{"version":3,"file":"Orbit.js","sourceRoot":"","sources":["../src/Orbit.ts"],"names":[],"mappings":";;AAAA,+BAA2C;AAE3C;;;;;GAKG;AACH;IAAA;QAEI,gBAAgB;QACR,UAAK,GAAW,CAAC,CAAC;QAE1B,kBAAkB;QAClB,QAAG,GAAW,CAAC,CAAC;IA+EpB,CAAC;IA7EG,sBAAI,sBAAG;aAAP;YAEI,OAAO,IAAI,CAAC,KAAK,CAAC;QACtB,CAAC;aACD,UAAQ,CAAC;YAEL,IAAI,CAAC,KAAK,GAAG,iBAAS,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,EAAE,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,EAAE,GAAG,GAAG,CAAC,CAAC;QACnE,CAAC;;;OAJA;IAMD;;;;;;OAMG;IACH,+BAAe,GAAf,UAAgB,GAAa;QAEzB,IAAI,KAAK,GAAG,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,eAAO,EAAE,CAAC;QAEtC,KAAK,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAE/B,QAAQ;QACR,IAAI,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;QAEvC,KAAK,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACjC,KAAK,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAEjC,OAAO,KAAK,CAAC;IACjB,CAAC;IAED;;;;;OAKG;IACH,6BAAa,GAAb,UAAc,GAAY;QAEtB,GAAG,CAAC,SAAS,EAAE,CAAC;QAChB,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;QAC9B,IAAI,GAAG,CAAC,CAAC,GAAG,IAAI,IAAI,GAAG,CAAC,CAAC,GAAG,IAAI;YAC5B,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,CAAC;;YAEzB,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC;IAC5C,CAAC;IAED;;;;;;;;;OASG;IACI,uBAAiB,GAAxB,UAAyB,GAAY,EAAE,EAAY;QAE/C,IAAI,KAAK,GAAG,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,eAAO,EAAE,CAAC;QACpC,IAAI,GAAG,CAAC,MAAM,CAAC,IAAI,eAAO,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EACrC;YACI,KAAK,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;SACtB;aACI,IAAI,GAAG,CAAC,MAAM,CAAC,IAAI,eAAO,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,EACzC;YACI,KAAK,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;SACvB;aAED;YACI,IAAI,EAAE,GAAG,IAAI,eAAO,EAAE,CAAC;YACvB,EAAE,CAAC,YAAY,CAAC,IAAI,eAAO,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;YAC3C,KAAK,CAAC,YAAY,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;YAC5B,KAAK,CAAC,SAAS,EAAE,CAAC;SACrB;QACD,OAAO,KAAK,CAAC;IACjB,CAAC;IACL,YAAC;AAAD,CAAC,AArFD,IAqFC;AArFY,sBAAK"}

7
dist/PlaneExt.d.ts vendored
View File

@@ -1,7 +0,0 @@
import * as THREE from 'three';
import { Vector3, Line3, Plane } from "three";
export declare class PlaneExt extends Plane {
constructor(normal?: Vector3, constant?: number);
intersectLine(line: Line3, optionalTarget?: Vector3, extendLine?: boolean): Vector3;
intersectRay(ray: THREE.Ray, optionalTarget?: Vector3, extendLine?: boolean): Vector3;
}

51
dist/PlaneExt.js vendored
View File

@@ -1,51 +0,0 @@
"use strict";
var __extends = (this && this.__extends) || (function () {
var extendStatics = function (d, b) {
extendStatics = Object.setPrototypeOf ||
({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
return extendStatics(d, b);
};
return function (d, b) {
extendStatics(d, b);
function __() { this.constructor = d; }
d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
};
})();
Object.defineProperty(exports, "__esModule", { value: true });
var THREE = require("three");
var three_1 = require("three");
var PlaneExt = /** @class */ (function (_super) {
__extends(PlaneExt, _super);
function PlaneExt(normal, constant) {
return _super.call(this, normal, constant) || this;
}
PlaneExt.prototype.intersectLine = function (line, optionalTarget, extendLine) {
var v1 = new three_1.Vector3();
var result = optionalTarget || new three_1.Vector3();
var direction = line.delta(v1);
var denominator = this.normal.dot(direction);
if (denominator === 0) {
// line is coplanar, return origin
if (this.distanceToPoint(line.start) === 0) {
return result.copy(line.start);
}
// Unsure if this is the correct method to handle this case.
return undefined;
}
var t = -(line.start.dot(this.normal) + this.constant) / denominator;
//If you not extendLine,check intersect point in Line
if (!extendLine && (t < 0 || t > 1)) {
return undefined;
}
return result.copy(direction).multiplyScalar(t).add(line.start);
};
PlaneExt.prototype.intersectRay = function (ray, optionalTarget, extendLine) {
// 从射线初始位置
var line = new THREE.Line3(ray.origin.clone(), ray.origin.clone().add(ray.direction));
return this.intersectLine(line, optionalTarget, extendLine);
};
return PlaneExt;
}(three_1.Plane));
exports.PlaneExt = PlaneExt;
//# sourceMappingURL=PlaneExt.js.map

View File

@@ -1 +0,0 @@
{"version":3,"file":"PlaneExt.js","sourceRoot":"","sources":["../src/PlaneExt.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AAAA,6BAA+B;AAC/B,+BAA8C;AAE9C;IAA8B,4BAAK;IAE/B,kBAAY,MAAgB,EAAE,QAAiB;eAE3C,kBAAM,MAAM,EAAE,QAAQ,CAAC;IAC3B,CAAC;IACD,gCAAa,GAAb,UAAc,IAAW,EAAE,cAAwB,EAAE,UAAoB;QAErE,IAAI,EAAE,GAAG,IAAI,eAAO,EAAE,CAAC;QAEvB,IAAI,MAAM,GAAG,cAAc,IAAI,IAAI,eAAO,EAAE,CAAC;QAE7C,IAAI,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QAE/B,IAAI,WAAW,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;QAE7C,IAAI,WAAW,KAAK,CAAC,EACrB;YACI,kCAAkC;YAClC,IAAI,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,EAC1C;gBACI,OAAO,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;aAClC;YACD,4DAA4D;YAC5D,OAAO,SAAS,CAAC;SACpB;QAED,IAAI,CAAC,GAAG,CAAE,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,WAAW,CAAC;QACtE,qDAAqD;QACrD,IAAI,CAAC,UAAU,IAAI,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EACnC;YACI,OAAO,SAAS,CAAC;SACpB;QAED,OAAO,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACpE,CAAC;IACD,+BAAY,GAAZ,UAAa,GAAc,EAAE,cAAwB,EAAE,UAAoB;QAEvE,UAAU;QACV,IAAI,IAAI,GAAG,IAAI,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,EAAE,EAAE,GAAG,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC;QACtF,OAAO,IAAI,CAAC,aAAa,CAAC,IAAI,EAAE,cAAc,EAAE,UAAU,CAAC,CAAC;IAChE,CAAC;IACL,eAAC;AAAD,CAAC,AA1CD,CAA8B,aAAK,GA0ClC;AA1CY,4BAAQ"}

12
dist/PointPick.d.ts vendored
View File

@@ -1,12 +0,0 @@
import { Mesh } from "three";
import { Viewer } from ".";
/**
* 点选
*
* @export
* @param {Viewer} view
* @param {number} ptx
* @param {number} pty
* @returns {(Mesh | undefined)}
*/
export declare function PointPick(view: Viewer, ptx: number, pty: number): Mesh | undefined;

39
dist/PointPick.js vendored
View File

@@ -1,39 +0,0 @@
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
var three_1 = require("three");
/**
* 点选
*
* @export
* @param {Viewer} view
* @param {number} ptx
* @param {number} pty
* @returns {(Mesh | undefined)}
*/
function PointPick(view, ptx, pty) {
var raycaster = new three_1.Raycaster();
raycaster.setFromCamera({
x: (ptx / view._Width) * 2 - 1,
y: -(pty / view._Height) * 2 + 1 //y轴相反
}, view.m_Camera.Camera);
//https://github.com/mrdoob/three.js/issues/14128
raycaster.ray.origin.set((ptx / view._Width) * 2 - 1, -(pty / view._Height) * 2 + 1, -1).unproject(view.m_Camera.Camera);
var minDis = Infinity;
var minObj = undefined;
view.m_Scene.children.forEach(function (obj) {
if (obj instanceof three_1.Mesh) {
var intersects = [];
obj.raycast(raycaster, intersects);
for (var _i = 0, intersects_1 = intersects; _i < intersects_1.length; _i++) {
var i = intersects_1[_i];
if (i.distance < minDis) {
minObj = obj;
minDis = i.distance;
}
}
}
});
return minObj;
}
exports.PointPick = PointPick;
//# sourceMappingURL=PointPick.js.map

View File

@@ -1 +0,0 @@
{"version":3,"file":"PointPick.js","sourceRoot":"","sources":["../src/PointPick.ts"],"names":[],"mappings":";;AAAA,+BAA2E;AAc3E;;;;;;;;GAQG;AACH,SAAgB,SAAS,CAAC,IAAY,EAAE,GAAW,EAAE,GAAW;IAE5D,IAAI,SAAS,GAAG,IAAI,iBAAS,EAAE,CAAC;IAChC,SAAS,CAAC,aAAa,CAAC;QACpB,CAAC,EAAE,CAAC,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC;QAC9B,CAAC,EAAE,CAAE,CAAC,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,MAAM;KAC3C,EAAE,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;IAEzB,iDAAiD;IACjD,SAAS,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAE,CAAC,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;IAG1H,IAAI,MAAM,GAAG,QAAQ,CAAC;IACtB,IAAI,MAAM,GAAG,SAAS,CAAC;IAEvB,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,UAAA,GAAG;QAE7B,IAAI,GAAG,YAAY,YAAI,EACvB;YACI,IAAI,UAAU,GAAgB,EAAE,CAAC;YACjC,GAAG,CAAC,OAAO,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC;YAEnC,KAAc,UAAU,EAAV,yBAAU,EAAV,wBAAU,EAAV,IAAU,EACxB;gBADK,IAAI,CAAC,mBAAA;gBAEN,IAAI,CAAC,CAAC,QAAQ,GAAG,MAAM,EACvB;oBACI,MAAM,GAAG,GAAG,CAAC;oBACb,MAAM,GAAG,CAAC,CAAC,QAAQ,CAAC;iBACvB;aACJ;SACJ;IACL,CAAC,CAAC,CAAC;IAEH,OAAO,MAAM,CAAC;AAClB,CAAC;AAlCD,8BAkCC"}

2
dist/RotateUV.d.ts vendored
View File

@@ -1,2 +0,0 @@
import { Geometry } from 'three';
export declare function RotateUVs(geo: Geometry): void;

23
dist/RotateUV.js vendored
View File

@@ -1,23 +0,0 @@
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
var Matrix2_1 = require("./Matrix2");
var three_1 = require("three");
function RotateUVs(geo) {
var roMat = new Matrix2_1.Matrix2();
roMat.set(0, -1, 1, 0);
var addV = new three_1.Vector2(1, 0);
for (var _i = 0, _a = geo.faceVertexUvs; _i < _a.length; _i++) {
var uvs = _a[_i];
for (var _b = 0, uvs_1 = uvs; _b < uvs_1.length; _b++) {
var uv = uvs_1[_b];
for (var _c = 0, uv_1 = uv; _c < uv_1.length; _c++) {
var v = uv_1[_c];
roMat.applyVector(v);
v.add(addV);
}
}
}
geo.uvsNeedUpdate = true;
}
exports.RotateUVs = RotateUVs;
//# sourceMappingURL=RotateUV.js.map

View File

@@ -1 +0,0 @@
{"version":3,"file":"RotateUV.js","sourceRoot":"","sources":["../src/RotateUV.ts"],"names":[],"mappings":";;AAAA,qCAAoC;AACpC,+BAA0C;AAG1C,SAAgB,SAAS,CAAC,GAAa;IAEnC,IAAI,KAAK,GAAG,IAAI,iBAAO,EAAE,CAAC;IAC1B,KAAK,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,EACX,CAAC,EAAE,CAAC,CAAC,CAAC;IAEV,IAAI,IAAI,GAAG,IAAI,eAAO,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAE7B,KAAgB,UAAiB,EAAjB,KAAA,GAAG,CAAC,aAAa,EAAjB,cAAiB,EAAjB,IAAiB,EACjC;QADK,IAAI,GAAG,SAAA;QAER,KAAe,UAAG,EAAH,WAAG,EAAH,iBAAG,EAAH,IAAG,EAClB;YADK,IAAI,EAAE,YAAA;YAEP,KAAc,UAAE,EAAF,SAAE,EAAF,gBAAE,EAAF,IAAE,EAChB;gBADK,IAAI,CAAC,WAAA;gBAEN,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC;gBACrB,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;aACf;SACJ;KACJ;IACD,GAAG,CAAC,aAAa,GAAG,IAAI,CAAC;AAC7B,CAAC;AApBD,8BAoBC"}

11
dist/Text.d.ts vendored
View File

@@ -1,11 +0,0 @@
import { Mesh } from "three";
export declare class DbText extends Mesh {
/**
*
* 构造一个文本对象,8位点(中心点下面)在0点
* @param {string} str 数字字符串
* @param {number} height 文本高度
* @memberof DbText
*/
constructor(str: string, height?: number);
}

56
dist/Text.js vendored
View File

@@ -1,56 +0,0 @@
"use strict";
var __extends = (this && this.__extends) || (function () {
var extendStatics = function (d, b) {
extendStatics = Object.setPrototypeOf ||
({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
return extendStatics(d, b);
};
return function (d, b) {
extendStatics(d, b);
function __() { this.constructor = d; }
d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
};
})();
Object.defineProperty(exports, "__esModule", { value: true });
var three_1 = require("three");
var ColorPalette_1 = require("./ColorPalette");
var GeUtils_1 = require("./GeUtils");
var FontLoaderUtil = /** @class */ (function () {
function FontLoaderUtil() {
}
FontLoaderUtil.Load = function () {
if (!this.defFont) {
var f = require("../resources/fonts/helvetiker_regular.typeface.json");
var loader = new three_1.FontLoader();
this.defFont = loader.parse(f);
}
return this.defFont;
};
return FontLoaderUtil;
}());
var DbText = /** @class */ (function (_super) {
__extends(DbText, _super);
/**
*
* 构造一个文本对象,8位点(中心点下面)在0点
* @param {string} str 数字字符串
* @param {number} height 文本高度
* @memberof DbText
*/
function DbText(str, height) {
if (height === void 0) { height = 5; }
var _this = this;
var font = FontLoaderUtil.Load();
var shapes = font.generateShapes(str, height);
var geometry = new three_1.ShapeGeometry(shapes);
geometry.computeBoundingBox();
_this = _super.call(this, geometry, ColorPalette_1.ColorMaterial.GetBasicMaterial(5)) || this;
var center = geometry.boundingBox.getCenter(new three_1.Vector3());
_this.applyMatrix4(GeUtils_1.MoveMatrix(new three_1.Vector3(-center.x, 0, 0)));
return _this;
}
return DbText;
}(three_1.Mesh));
exports.DbText = DbText;
//# sourceMappingURL=Text.js.map

1
dist/Text.js.map vendored
View File

@@ -1 +0,0 @@
{"version":3,"file":"Text.js","sourceRoot":"","sources":["../src/Text.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AAAA,+BAA8E;AAC9E,+CAA+C;AAC/C,qCAAuC;AAEvC;IAAA;IAaA,CAAC;IAVQ,mBAAI,GAAX;QAEE,IAAI,CAAC,IAAI,CAAC,OAAO,EACjB;YACE,IAAM,CAAC,GAAG,OAAO,CAAC,qDAAqD,CAAC,CAAC;YACzE,IAAI,MAAM,GAAG,IAAI,kBAAU,EAAE,CAAC;YAC9B,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;SAChC;QACD,OAAO,IAAI,CAAC,OAAO,CAAC;IACtB,CAAC;IACH,qBAAC;AAAD,CAAC,AAbD,IAaC;AAED;IAA4B,0BAAI;IAE9B;;;;;;OAMG;IACH,gBAAY,GAAW,EAAE,MAAkB;QAAlB,uBAAA,EAAA,UAAkB;QAA3C,iBAaC;QAXC,IAAI,IAAI,GAAG,cAAc,CAAC,IAAI,EAAE,CAAC;QAEjC,IAAI,MAAM,GAAkB,IAAI,CAAC,cAAc,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;QAC7D,IAAI,QAAQ,GAAG,IAAI,qBAAa,CAAC,MAAM,CAAC,CAAC;QAEzC,QAAQ,CAAC,kBAAkB,EAAE,CAAC;QAE9B,QAAA,kBAAM,QAAQ,EAAE,4BAAa,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC,SAAC;QAEnD,IAAI,MAAM,GAAG,QAAQ,CAAC,WAAW,CAAC,SAAS,CAAC,IAAI,eAAO,EAAE,CAAC,CAAC;QAC3D,KAAI,CAAC,YAAY,CAAC,oBAAU,CAAC,IAAI,eAAO,CAAC,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;;IAC9D,CAAC;IACH,aAAC;AAAD,CAAC,AAvBD,CAA4B,YAAI,GAuB/B;AAvBY,wBAAM"}

58
dist/ThreeCSG.d.ts vendored
View File

@@ -1,58 +0,0 @@
import * as THREE from "three";
export declare class ThreeBSP {
tree: Node;
matrix: THREE.Matrix4;
Node: typeof Node;
Vertex: typeof Vertex;
Polygon: typeof Polygon;
constructor(geometry: any);
subtract(other_tree: any): ThreeBSP;
union(other_tree: any): ThreeBSP;
intersect(other_tree: any): ThreeBSP;
toGeometry(): THREE.Geometry;
toMesh(material: any): THREE.Mesh;
}
export declare class Polygon {
w: any;
normal: any;
vertices: any;
constructor(vertices?: any, normal?: any, w?: any);
calculateProperties(): this;
clone(): Polygon;
flip(): this;
classifyVertex(vertex: any): 1 | 2 | 0;
classifySide(polygon: any): 1 | 3 | 2 | 0;
splitPolygon(polygon: any, coplanar_front: any, coplanar_back: any, front: any, back: any): void;
}
export declare class Vertex {
uv: any;
normal: any;
z: any;
y: any;
x: any;
constructor(x: number, y: number, z: number, normal: THREE.Vector3, uv: THREE.Vector2);
clone(): Vertex;
add(vertex: any): this;
subtract(vertex: any): this;
multiplyScalar(scalar: any): this;
cross(vertex: any): this;
normalize(): this;
dot(vertex: any): number;
lerp(a: any, t: any): this;
interpolate(other: any, t: any): Vertex;
applyMatrix4(m: any): this;
}
export declare class Node {
divider: any;
back: any;
front: any;
polygons: any[];
constructor(polygons?: any);
isConvex(polygons: any): boolean;
build(polygons: any): void;
allPolygons(): any[];
clone(): Node;
invert(): this;
clipPolygons(polygons: any): any;
clipTo(node: any): void;
}

458
dist/ThreeCSG.js vendored
View File

@@ -1,458 +0,0 @@
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
var THREE = require("three");
/*jshint esversion: 6 */
var EPSILON = 1e-5, COPLANAR = 0, //共面
FRONT = 1, //前
BACK = 2, SPANNING = 3;
var ThreeBSP = /** @class */ (function () {
function ThreeBSP(geometry) {
// Convert THREE.Geometry to ThreeBSP
var i, _length_i, face, vertex, faceVertexUvs, uvs, polygon, polygons = [], tree;
this.Polygon = Polygon;
this.Vertex = Vertex;
this.Node = Node;
if (geometry instanceof THREE.Geometry) {
this.matrix = new THREE.Matrix4();
}
else if (geometry instanceof THREE.Mesh) {
// #todo: add hierarchy support
geometry.updateMatrix();
this.matrix = geometry.matrix.clone();
geometry = geometry.geometry;
}
else if (geometry instanceof Node) {
this.tree = geometry;
this.matrix = new THREE.Matrix4();
return this;
}
else {
throw 'ThreeBSP: Given geometry is unsupported';
}
for (i = 0, _length_i = geometry.faces.length; i < _length_i; i++) {
face = geometry.faces[i];
faceVertexUvs = geometry.faceVertexUvs[0][i];
polygon = new Polygon();
if (face instanceof THREE.Face3) {
vertex = geometry.vertices[face.a];
uvs = faceVertexUvs ? new THREE.Vector2(faceVertexUvs[0].x, faceVertexUvs[0].y) : null;
vertex = new Vertex(vertex.x, vertex.y, vertex.z, face.vertexNormals[0], uvs);
vertex.applyMatrix4(this.matrix);
polygon.vertices.push(vertex);
vertex = geometry.vertices[face.b];
uvs = faceVertexUvs ? new THREE.Vector2(faceVertexUvs[1].x, faceVertexUvs[1].y) : null;
vertex = new Vertex(vertex.x, vertex.y, vertex.z, face.vertexNormals[1], uvs);
vertex.applyMatrix4(this.matrix);
polygon.vertices.push(vertex);
vertex = geometry.vertices[face.c];
uvs = faceVertexUvs ? new THREE.Vector2(faceVertexUvs[2].x, faceVertexUvs[2].y) : null;
vertex = new Vertex(vertex.x, vertex.y, vertex.z, face.vertexNormals[2], uvs);
vertex.applyMatrix4(this.matrix);
polygon.vertices.push(vertex);
}
else {
throw 'Invalid face type at index ' + i;
}
polygon.calculateProperties();
polygons.push(polygon);
}
this.tree = new Node(polygons);
}
//减
ThreeBSP.prototype.subtract = function (other_tree) {
var a = this.tree.clone(), b = other_tree.tree.clone();
a.invert();
a.clipTo(b);
b.clipTo(a);
b.invert();
b.clipTo(a);
b.invert();
a.build(b.allPolygons());
a.invert();
var bsp = new ThreeBSP(a);
bsp.matrix = this.matrix;
return bsp;
};
//结合
ThreeBSP.prototype.union = function (other_tree) {
var a = this.tree.clone(), b = other_tree.tree.clone();
a.clipTo(b);
b.clipTo(a);
b.invert();
b.clipTo(a);
b.invert();
a.build(b.allPolygons());
var bsp = new ThreeBSP(a);
bsp.matrix = this.matrix;
return bsp;
};
//相交
ThreeBSP.prototype.intersect = function (other_tree) {
var a = this.tree.clone(), b = other_tree.tree.clone();
a.invert();
b.clipTo(a);
b.invert();
a.clipTo(b);
b.clipTo(a);
a.build(b.allPolygons());
a.invert();
var bsp = new ThreeBSP(a);
bsp.matrix = this.matrix;
return bsp;
};
ThreeBSP.prototype.toGeometry = function () {
var i, j, matrix = new THREE.Matrix4().getInverse(this.matrix), geometry = new THREE.Geometry(), polygons = this.tree.allPolygons(), polygon_count = polygons.length, polygon, polygon_vertice_count, vertice_dict = {}, vertex_idx_a, vertex_idx_b, vertex_idx_c, vertex, face, verticeUvs;
for (i = 0; i < polygon_count; i++) {
polygon = polygons[i];
polygon_vertice_count = polygon.vertices.length;
for (j = 2; j < polygon_vertice_count; j++) {
verticeUvs = [];
vertex = polygon.vertices[0];
verticeUvs.push(new THREE.Vector2(vertex.uv.x, vertex.uv.y));
vertex = new THREE.Vector3(vertex.x, vertex.y, vertex.z);
vertex.applyMatrix4(matrix);
if (typeof vertice_dict[vertex.x + ',' + vertex.y + ',' + vertex.z] !== 'undefined') {
vertex_idx_a = vertice_dict[vertex.x + ',' + vertex.y + ',' + vertex.z];
}
else {
geometry.vertices.push(vertex);
vertex_idx_a = vertice_dict[vertex.x + ',' + vertex.y + ',' + vertex.z] = geometry.vertices.length - 1;
}
vertex = polygon.vertices[j - 1];
verticeUvs.push(new THREE.Vector2(vertex.uv.x, vertex.uv.y));
vertex = new THREE.Vector3(vertex.x, vertex.y, vertex.z);
vertex.applyMatrix4(matrix);
if (typeof vertice_dict[vertex.x + ',' + vertex.y + ',' + vertex.z] !== 'undefined') {
vertex_idx_b = vertice_dict[vertex.x + ',' + vertex.y + ',' + vertex.z];
}
else {
geometry.vertices.push(vertex);
vertex_idx_b = vertice_dict[vertex.x + ',' + vertex.y + ',' + vertex.z] = geometry.vertices.length - 1;
}
vertex = polygon.vertices[j];
verticeUvs.push(new THREE.Vector2(vertex.uv.x, vertex.uv.y));
vertex = new THREE.Vector3(vertex.x, vertex.y, vertex.z);
vertex.applyMatrix4(matrix);
if (typeof vertice_dict[vertex.x + ',' + vertex.y + ',' + vertex.z] !== 'undefined') {
vertex_idx_c = vertice_dict[vertex.x + ',' + vertex.y + ',' + vertex.z];
}
else {
geometry.vertices.push(vertex);
vertex_idx_c = vertice_dict[vertex.x + ',' + vertex.y + ',' + vertex.z] = geometry.vertices.length - 1;
}
face = new THREE.Face3(vertex_idx_a, vertex_idx_b, vertex_idx_c, new THREE.Vector3(polygon.normal.x, polygon.normal.y, polygon.normal.z));
geometry.faces.push(face);
geometry.faceVertexUvs[0].push(verticeUvs);
}
}
return geometry;
};
ThreeBSP.prototype.toMesh = function (material) {
var geometry = this.toGeometry(), mesh = new THREE.Mesh(geometry, material);
mesh.position.setFromMatrixPosition(this.matrix);
mesh.rotation.setFromRotationMatrix(this.matrix);
return mesh;
};
return ThreeBSP;
}());
exports.ThreeBSP = ThreeBSP;
//多边形
var Polygon = /** @class */ (function () {
function Polygon(vertices, normal, w) {
if (!(vertices instanceof Array)) {
vertices = [];
}
this.vertices = vertices;
if (vertices.length > 0) {
this.calculateProperties();
}
else {
this.normal = this.w = undefined;
}
}
Polygon.prototype.calculateProperties = function () {
var a = this.vertices[0], b = this.vertices[1], c = this.vertices[2];
this.normal = b.clone().subtract(a).cross(c.clone().subtract(a)).normalize();
this.w = this.normal.clone().dot(a);
return this;
};
Polygon.prototype.clone = function () {
var i, vertice_count, polygon = new Polygon();
for (i = 0, vertice_count = this.vertices.length; i < vertice_count; i++) {
polygon.vertices.push(this.vertices[i].clone());
}
polygon.calculateProperties();
return polygon;
};
Polygon.prototype.flip = function () {
var i, vertices = [];
this.normal.multiplyScalar(-1);
this.w *= -1;
for (i = this.vertices.length - 1; i >= 0; i--) {
vertices.push(this.vertices[i]);
}
this.vertices = vertices;
return this;
};
//划分?
Polygon.prototype.classifyVertex = function (vertex) {
var side_value = this.normal.dot(vertex) - this.w;
if (side_value < -EPSILON) {
return BACK;
}
else if (side_value > EPSILON) {
return FRONT;
}
else {
return COPLANAR;
}
};
//划分边?
Polygon.prototype.classifySide = function (polygon) {
var i, vertex, classification, num_positive = 0, num_negative = 0, vertice_count = polygon.vertices.length;
for (i = 0; i < vertice_count; i++) {
vertex = polygon.vertices[i];
classification = this.classifyVertex(vertex);
if (classification === FRONT) {
num_positive++;
}
else if (classification === BACK) {
num_negative++;
}
}
if (num_positive > 0 && num_negative === 0) {
return FRONT;
}
else if (num_positive === 0 && num_negative > 0) {
return BACK;
}
else if (num_positive === 0 && num_negative === 0) {
return COPLANAR;
}
else {
return SPANNING;
}
};
//分解 分离 区域?
Polygon.prototype.splitPolygon = function (polygon, coplanar_front, coplanar_back, front, back) {
var classification = this.classifySide(polygon);
if (classification === COPLANAR) {
(this.normal.dot(polygon.normal) > 0 ? coplanar_front : coplanar_back).push(polygon);
}
else if (classification === FRONT) {
front.push(polygon);
}
else if (classification === BACK) {
back.push(polygon);
}
else {
var vertice_count = void 0, i = void 0, j = void 0, ti = void 0, tj = void 0, vi = void 0, vj = void 0, t = void 0, v = void 0, f = [], b = [];
for (i = 0, vertice_count = polygon.vertices.length; i < vertice_count; i++) {
j = (i + 1) % vertice_count;
vi = polygon.vertices[i];
vj = polygon.vertices[j];
ti = this.classifyVertex(vi);
tj = this.classifyVertex(vj);
if (ti != BACK)
f.push(vi);
if (ti != FRONT)
b.push(vi);
if ((ti | tj) === SPANNING) {
t = (this.w - this.normal.dot(vi)) / this.normal.dot(vj.clone().subtract(vi));
v = vi.interpolate(vj, t);
f.push(v);
b.push(v);
}
}
if (f.length >= 3)
front.push(new Polygon(f).calculateProperties());
if (b.length >= 3)
back.push(new Polygon(b).calculateProperties());
}
};
return Polygon;
}());
exports.Polygon = Polygon;
var Vertex = /** @class */ (function () {
function Vertex(x, y, z, normal, uv) {
this.x = x;
this.y = y;
this.z = z;
this.normal = normal || new THREE.Vector3();
this.uv = uv || new THREE.Vector2();
}
Vertex.prototype.clone = function () {
return new Vertex(this.x, this.y, this.z, this.normal.clone(), this.uv.clone());
};
Vertex.prototype.add = function (vertex) {
this.x += vertex.x;
this.y += vertex.y;
this.z += vertex.z;
return this;
};
Vertex.prototype.subtract = function (vertex) {
this.x -= vertex.x;
this.y -= vertex.y;
this.z -= vertex.z;
return this;
};
Vertex.prototype.multiplyScalar = function (scalar) {
this.x *= scalar;
this.y *= scalar;
this.z *= scalar;
return this;
};
//×乘
Vertex.prototype.cross = function (vertex) {
var x = this.x, y = this.y, z = this.z;
this.x = y * vertex.z - z * vertex.y;
this.y = z * vertex.x - x * vertex.z;
this.z = x * vertex.y - y * vertex.x;
return this;
};
Vertex.prototype.normalize = function () {
var length = Math.sqrt(this.x * this.x + this.y * this.y + this.z * this.z);
this.x /= length;
this.y /= length;
this.z /= length;
return this;
};
//点乘
Vertex.prototype.dot = function (vertex) {
return this.x * vertex.x + this.y * vertex.y + this.z * vertex.z;
};
//线性插值
Vertex.prototype.lerp = function (a, t) {
this.add(a.clone().subtract(this).multiplyScalar(t));
this.normal.add(a.normal.clone().sub(this.normal).multiplyScalar(t));
this.uv.add(a.uv.clone().sub(this.uv).multiplyScalar(t));
return this;
};
//插值
Vertex.prototype.interpolate = function (other, t) {
return this.clone().lerp(other, t);
};
Vertex.prototype.applyMatrix4 = function (m) {
// input: THREE.Matrix4 affine matrix
var x = this.x, y = this.y, z = this.z;
var e = m.elements;
this.x = e[0] * x + e[4] * y + e[8] * z + e[12];
this.y = e[1] * x + e[5] * y + e[9] * z + e[13];
this.z = e[2] * x + e[6] * y + e[10] * z + e[14];
return this;
};
return Vertex;
}());
exports.Vertex = Vertex;
var Node = /** @class */ (function () {
function Node(polygons) {
var i, polygon_count, front = [], back = [];
this.polygons = [];
this.front = this.back = undefined;
if (!(polygons instanceof Array) || polygons.length === 0)
return;
this.divider = polygons[0].clone();
for (i = 0, polygon_count = polygons.length; i < polygon_count; i++) {
this.divider.splitPolygon(polygons[i], this.polygons, this.polygons, front, back);
}
if (front.length > 0) {
this.front = new Node(front);
}
if (back.length > 0) {
this.back = new Node(back);
}
}
//是凸的? 凸包?
Node.prototype.isConvex = function (polygons) {
var i, j;
for (i = 0; i < polygons.length; i++) {
for (j = 0; j < polygons.length; j++) {
if (i !== j && polygons[i].classifySide(polygons[j]) !== BACK) {
return false;
}
}
}
return true;
};
Node.prototype.build = function (polygons) {
var i, polygon_count, front = [], back = [];
if (!this.divider) {
this.divider = polygons[0].clone();
}
for (i = 0, polygon_count = polygons.length; i < polygon_count; i++) {
this.divider.splitPolygon(polygons[i], this.polygons, this.polygons, front, back);
}
if (front.length > 0) {
if (!this.front)
this.front = new Node();
this.front.build(front);
}
if (back.length > 0) {
if (!this.back)
this.back = new Node();
this.back.build(back);
}
};
Node.prototype.allPolygons = function () {
var polygons = this.polygons.slice();
if (this.front)
polygons = polygons.concat(this.front.allPolygons());
if (this.back)
polygons = polygons.concat(this.back.allPolygons());
return polygons;
};
Node.prototype.clone = function () {
var node = new Node();
node.divider = this.divider.clone();
node.polygons = this.polygons.map(function (polygon) {
return polygon.clone();
});
node.front = this.front && this.front.clone();
node.back = this.back && this.back.clone();
return node;
};
//反转
Node.prototype.invert = function () {
var i, polygon_count, temp;
for (i = 0, polygon_count = this.polygons.length; i < polygon_count; i++) {
this.polygons[i].flip();
}
this.divider.flip();
if (this.front)
this.front.invert();
if (this.back)
this.back.invert();
temp = this.front;
this.front = this.back;
this.back = temp;
return this;
};
//
Node.prototype.clipPolygons = function (polygons) {
var i, polygon_count, front, back;
if (!this.divider)
return polygons.slice();
front = [];
back = [];
for (i = 0, polygon_count = polygons.length; i < polygon_count; i++) {
this.divider.splitPolygon(polygons[i], front, back, front, back);
}
if (this.front)
front = this.front.clipPolygons(front);
if (this.back)
back = this.back.clipPolygons(back);
else
back = [];
return front.concat(back);
};
Node.prototype.clipTo = function (node) {
this.polygons = node.clipPolygons(this.polygons);
if (this.front)
this.front.clipTo(node);
if (this.back)
this.back.clipTo(node);
};
return Node;
}());
exports.Node = Node;
//# sourceMappingURL=ThreeCSG.js.map

File diff suppressed because one or more lines are too long

5
dist/Utils.d.ts vendored
View File

@@ -1,5 +0,0 @@
import { Viewer } from ".";
export declare function LoadBoard(view: Viewer, data: any[], clear?: boolean): {
blockMeshMap: Map<number, number>;
meshBlockMap: Map<number, number>;
};

33
dist/Utils.js vendored
View File

@@ -1,33 +0,0 @@
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
var _1 = require(".");
function dispose(m) {
//@ts-ignore
if (m.geometry)
//@ts-ignore
m.geometry.dispose();
m.children.forEach(function (o) { return dispose(o); });
}
function LoadBoard(view, data, clear) {
var _a, _b, _c;
if (clear === void 0) { clear = true; }
if (clear) {
dispose(view.m_Scene);
view.m_Scene.children.length = 0;
}
if (data.length === 0)
return;
//加板
var _d = _1.createTemplateBoard(data), meshs = _d.meshs, edgesa = _d.edgesa, relations = _d.relations;
//加标注
var dims = _1.DrawDimension(meshs);
(_a = view.m_Scene).add.apply(_a, meshs);
(_b = view.m_Scene).add.apply(_b, edgesa);
(_c = view.m_Scene).add.apply(_c, dims);
view.ViewToSwiso();
view.ZoomAll();
view.Zoom(1.1);
return relations;
}
exports.LoadBoard = LoadBoard;
//# sourceMappingURL=Utils.js.map

1
dist/Utils.js.map vendored
View File

@@ -1 +0,0 @@
{"version":3,"file":"Utils.js","sourceRoot":"","sources":["../src/Utils.ts"],"names":[],"mappings":";;AACA,sBAA+E;AAE/E,SAAS,OAAO,CAAC,CAAW;IAExB,YAAY;IACZ,IAAI,CAAC,CAAC,QAAQ;QACV,YAAY;QACZ,CAAC,CAAC,QAAQ,CAAC,OAAO,EAAE,CAAC;IAEzB,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,UAAA,CAAC,IAAI,OAAA,OAAO,CAAC,CAAC,CAAC,EAAV,CAAU,CAAC,CAAC;AACxC,CAAC;AAED,SAAgB,SAAS,CAAC,IAAY,EAAE,IAAW,EAAE,KAAqB;;IAArB,sBAAA,EAAA,YAAqB;IAEtE,IAAI,KAAK,EACT;QACI,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACtB,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC;KACpC;IAED,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO;IAC9B,IAAI;IACA,IAAA,iCAAwD,EAAtD,gBAAK,EAAE,kBAAM,EAAE,wBAAuC,CAAC;IAE7D,KAAK;IACL,IAAI,IAAI,GAAG,gBAAa,CAAC,KAAK,CAAC,CAAC;IAEhC,CAAA,KAAA,IAAI,CAAC,OAAO,CAAA,CAAC,GAAG,WAAI,KAAK,EAAE;IAC3B,CAAA,KAAA,IAAI,CAAC,OAAO,CAAA,CAAC,GAAG,WAAI,MAAM,EAAE;IAC5B,CAAA,KAAA,IAAI,CAAC,OAAO,CAAA,CAAC,GAAG,WAAI,IAAI,EAAE;IAE1B,IAAI,CAAC,WAAW,EAAE,CAAC;IACnB,IAAI,CAAC,OAAO,EAAE,CAAC;IACf,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAEf,OAAO,SAAS,CAAC;AACrB,CAAC;AAxBD,8BAwBC"}

View File

@@ -1 +0,0 @@
export {};

70
dist/ViewSrc/index.js vendored
View File

@@ -1,70 +0,0 @@
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
// import { Color, Face3, MeshBasicMaterial, Object3D, Vector2, Vector3 } from "three";
// import "./style.css";
var three_1 = require("three");
var CameraControls_1 = require("../CameraControls");
var data_1 = require("../data");
var GeUtils_1 = require("../GeUtils");
var Utils_1 = require("../Utils");
var Viewer_1 = require("../Viewer");
var btn = document.createElement("button");
btn.innerHTML = "载入";
document.body.appendChild(btn);
var btn2 = document.createElement("button");
btn2.innerHTML = "清理";
document.body.appendChild(btn2);
var btn3 = document.createElement("button");
btn3.innerHTML = "爆炸图";
document.body.appendChild(btn3);
var el = document.createElement("canvas");
el.style.width = "80%";
el.style.height = "80%";
document.body.appendChild(el);
var view = new Viewer_1.Viewer(el);
//修改这个顺序 改变1 2 3 个触摸点时的触发状态.
view.m_CameraCtrl.m_TouthTypeList = [CameraControls_1.CameraControlState.Rotate, CameraControls_1.CameraControlState.Scale, CameraControls_1.CameraControlState.Pan];
//例如,修改单指滑动为平移.
view.m_CameraCtrl.m_TouthTypeList = [CameraControls_1.CameraControlState.Pan, CameraControls_1.CameraControlState.Scale, CameraControls_1.CameraControlState.Rotate];
//加载
btn.onclick = function () {
console.time();
for (var i = 0; i < 1; i++)
Utils_1.LoadBoard(view, data_1.data);
console.timeEnd();
};
btn2.onclick = function () {
// LoadBoard(view, []);
};
btn3.onclick = function () {
var box = GeUtils_1.GetBox(view.m_Scene);
var cen = box.getCenter(new three_1.Vector3());
var m = [];
for (var _i = 0, _a = view.m_Scene.children; _i < _a.length; _i++) {
var obj = _a[_i];
if (obj.userData && obj.userData instanceof three_1.Vector3) {
var objCen = GeUtils_1.GetBox(obj).getCenter(new three_1.Vector3());
var v = objCen.clone().sub(cen);
var zv = obj.userData;
if (zv instanceof three_1.Vector3) {
var d = zv.dot(v);
// m.set(obj, zv.clone().multiplyScalar(d));
m.push([obj, zv.clone().multiplyScalar(d)]);
}
}
}
var count = 0;
var t = setInterval(function () {
for (var _i = 0, m_1 = m; _i < m_1.length; _i++) {
var _a = m_1[_i], o = _a[0], v = _a[1];
o.position.add(v.clone().multiplyScalar(1.5 / 120));
o.updateMatrix();
}
view.ZoomAll();
view.m_bNeedUpdate = true;
count++;
if (count === 60)
clearInterval(t);
}, 16);
};
//# sourceMappingURL=index.js.map

View File

@@ -1 +0,0 @@
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/ViewSrc/index.ts"],"names":[],"mappings":";;AAAA,uFAAuF;AACvF,wBAAwB;AACxB,+BAAgC;AAChC,oDAAuD;AACvD,gCAA+B;AAC/B,sCAAoC;AACpC,kCAAqC;AACrC,oCAAmC;AAEnC,IAAI,GAAG,GAAG,QAAQ,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC;AAC3C,GAAG,CAAC,SAAS,GAAG,IAAI,CAAA;AACpB,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;AAE/B,IAAI,IAAI,GAAG,QAAQ,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC;AAC5C,IAAI,CAAC,SAAS,GAAG,IAAI,CAAA;AACrB,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;AAEhC,IAAI,IAAI,GAAG,QAAQ,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC;AAC5C,IAAI,CAAC,SAAS,GAAG,KAAK,CAAA;AACtB,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;AAEhC,IAAI,EAAE,GAAG,QAAQ,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC;AAE1C,EAAE,CAAC,KAAK,CAAC,KAAK,GAAG,KAAK,CAAC;AACvB,EAAE,CAAC,KAAK,CAAC,MAAM,GAAG,KAAK,CAAC;AACxB,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC;AAE9B,IAAI,IAAI,GAAG,IAAI,eAAM,CAAC,EAAE,CAAC,CAAC;AAE1B,4BAA4B;AAC5B,IAAI,CAAC,YAAY,CAAC,eAAe,GAAG,CAAC,mCAAkB,CAAC,MAAM,EAAE,mCAAkB,CAAC,KAAK,EAAE,mCAAkB,CAAC,GAAG,CAAC,CAAC;AAClH,eAAe;AACf,IAAI,CAAC,YAAY,CAAC,eAAe,GAAG,CAAC,mCAAkB,CAAC,GAAG,EAAE,mCAAkB,CAAC,KAAK,EAAE,mCAAkB,CAAC,MAAM,CAAC,CAAC;AAElH,IAAI;AACJ,GAAG,CAAC,OAAO,GAAG;IAEV,OAAO,CAAC,IAAI,EAAE,CAAC;IACf,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE;QACtB,iBAAS,CAAC,IAAI,EAAE,WAAI,CAAC,CAAC;IAC1B,OAAO,CAAC,OAAO,EAAE,CAAC;AACtB,CAAC,CAAA;AAED,IAAI,CAAC,OAAO,GAAG;IAEX,uBAAuB;AAC3B,CAAC,CAAA;AAED,IAAI,CAAC,OAAO,GAAG;IAEX,IAAI,GAAG,GAAG,gBAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAE/B,IAAI,GAAG,GAAG,GAAG,CAAC,SAAS,CAAC,IAAI,eAAO,EAAE,CAAC,CAAC;IACvC,IAAI,CAAC,GAAG,EAAE,CAAC;IACX,KAAgB,UAAqB,EAArB,KAAA,IAAI,CAAC,OAAO,CAAC,QAAQ,EAArB,cAAqB,EAArB,IAAqB,EACrC;QADK,IAAI,GAAG,SAAA;QAER,IAAI,GAAG,CAAC,QAAQ,IAAI,GAAG,CAAC,QAAQ,YAAY,eAAO,EACnD;YACI,IAAI,MAAM,GAAG,gBAAM,CAAC,GAAG,CAAC,CAAC,SAAS,CAAC,IAAI,eAAO,EAAE,CAAC,CAAC;YAElD,IAAI,CAAC,GAAG,MAAM,CAAC,KAAK,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YAEhC,IAAI,EAAE,GAAG,GAAG,CAAC,QAAmB,CAAC;YACjC,IAAI,EAAE,YAAY,eAAO,EACzB;gBACI,IAAI,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;gBAClB,4CAA4C;gBAC5C,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,KAAK,EAAE,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;aAC/C;SACJ;KACJ;IAGD,IAAI,KAAK,GAAG,CAAC,CAAC;IAEd,IAAI,CAAC,GAAG,WAAW,CAAC;QAEhB,KAAmB,UAAC,EAAD,OAAC,EAAD,eAAC,EAAD,IAAC,EACpB;YADS,IAAA,YAAM,EAAL,SAAC,EAAE,SAAC;YAEV,CAAC,CAAC,QAAQ,CAAC,GAAG,CACV,CAAC,CAAC,KAAK,EAAE,CAAC,cAAc,CAAC,GAAG,GAAG,GAAG,CAAC,CACtC,CAAC;YACF,CAAC,CAAC,YAAY,EAAE,CAAC;SACpB;QAED,IAAI,CAAC,OAAO,EAAE,CAAC;QAEf,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC;QAE1B,KAAK,EAAE,CAAC;QAER,IAAI,KAAK,KAAK,EAAE;YACZ,aAAa,CAAC,CAAC,CAAC,CAAC;IACzB,CAAC,EAAE,EAAE,CAAC,CAAA;AACV,CAAC,CAAA"}

42
dist/Viewer.d.ts vendored
View File

@@ -1,42 +0,0 @@
import { Mesh, Scene, Vector3, WebGLRenderer } from "three";
import { CameraControls } from ".";
import { CameraUpdate } from "./CameraUpdate";
export declare class Viewer {
m_LookTarget: any;
m_Camera: CameraUpdate;
m_CameraCtrl: CameraControls;
m_bNeedUpdate: boolean;
m_Render: WebGLRenderer;
m_DomEl: HTMLElement;
_Height: number;
_Width: number;
m_Scene: Scene;
/**
*
* @param {HTMLElement} canvasContainer 可以传入一个div或者一个画布
* @memberof Viewer
*/
constructor(canvasContainer: HTMLElement);
initRender(canvasContainer: HTMLElement): void;
OnSize: (width?: any, height?: any) => void;
StartRender: () => void;
Render(): void;
ScreenToWorld(pt: Vector3, planVec?: Vector3): void;
WorldToScreen(pt: Vector3): void;
/**
* 更新视角观测目标(物体中心)
*
* @memberof Viewer
*/
UpdateLockTarget(): void;
Rotate(mouseMove: Vector3): void;
Pan(mouseMove: Vector3): void;
Zoom(scale: number, center?: Vector3): void;
ZoomAll(): void;
ViewToTop(): void;
ViewToFront(): void;
ViewToSwiso(): void;
oldMesh: Mesh;
SelectByPoint(x: number, y: number): void;
SelectBlock(blockMeshMap: Map<number, number>, dataID: number): void;
}

172
dist/Viewer.js vendored
View File

@@ -1,172 +0,0 @@
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
var three_1 = require("three");
var _1 = require(".");
var CameraUpdate_1 = require("./CameraUpdate");
var ColorPalette_1 = require("./ColorPalette");
var GeUtils_1 = require("./GeUtils");
var PlaneExt_1 = require("./PlaneExt");
var Viewer = /** @class */ (function () {
/**
*
* @param {HTMLElement} canvasContainer 可以传入一个div或者一个画布
* @memberof Viewer
*/
function Viewer(canvasContainer) {
var _this = this;
this.m_Camera = new CameraUpdate_1.CameraUpdate();
this.m_bNeedUpdate = true;
this.m_Scene = new three_1.Scene();
this.OnSize = function (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);
};
this.StartRender = function () {
requestAnimationFrame(_this.StartRender);
if (_this.m_Scene != null && _this.m_bNeedUpdate) {
_this.Render();
_this.m_bNeedUpdate = false;
}
};
this.m_DomEl = canvasContainer;
this.initRender(canvasContainer);
this.OnSize();
this.StartRender();
this.m_CameraCtrl = new _1.CameraControls(this);
window.addEventListener("resize", function () {
_this.OnSize();
});
this.m_Render.domElement.addEventListener("mousemove", function (e) {
_this.SelectByPoint(e.offsetX, e.offsetY);
});
}
//初始化render
Viewer.prototype.initRender = function (canvasContainer) {
var params = {
antialias: true,
precision: "highp",
alpha: true //alpha:true/false是否可以设置背景色透明
};
if (canvasContainer instanceof HTMLCanvasElement) {
params.canvas = canvasContainer;
this.m_Render = new three_1.WebGLRenderer(params);
}
else {
this.m_Render = new three_1.WebGLRenderer(params);
//加到画布
canvasContainer.appendChild(this.m_Render.domElement);
}
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();
};
Viewer.prototype.Render = function () {
this.m_Render.render(this.m_Scene, this.m_Camera.Camera);
};
Viewer.prototype.ScreenToWorld = function (pt, planVec) {
//变换和求交点
var plan = new PlaneExt_1.PlaneExt(planVec || new three_1.Vector3(0, 0, 1));
var raycaster = new three_1.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);
};
Viewer.prototype.WorldToScreen = function (pt) {
var widthHalf = this._Width * 0.5;
var heightHalf = this._Height * 0.5;
pt.project(this.m_Camera.Camera);
pt.x = (pt.x * widthHalf) + widthHalf;
pt.y = -(pt.y * heightHalf) + heightHalf;
};
/**
* 更新视角观测目标(物体中心)
*
* @memberof Viewer
*/
Viewer.prototype.UpdateLockTarget = function () {
var renderList = this.m_Render.renderLists.get(this.m_Scene, this.m_Camera.Camera);
var box = GeUtils_1.GetBoxArr(renderList.opaque.map(function (o) { return o.object; }));
if (box)
this.m_LookTarget = box.getCenter(new three_1.Vector3());
else
this.m_LookTarget = GeUtils_1.cZeroVec;
};
Viewer.prototype.Rotate = function (mouseMove) {
this.m_Camera.Rotate(mouseMove, this.m_LookTarget);
this.m_bNeedUpdate = true;
};
Viewer.prototype.Pan = function (mouseMove) {
this.m_Camera.Pan(mouseMove);
this.m_bNeedUpdate = true;
};
Viewer.prototype.Zoom = function (scale, center) {
this.m_Camera.Zoom(scale, center);
this.m_bNeedUpdate = true;
};
Viewer.prototype.ZoomAll = function () {
this.m_Camera.ZoomExtensBox3(GeUtils_1.GetBox(this.m_Scene, true));
this.m_bNeedUpdate = true;
};
Viewer.prototype.ViewToTop = function () {
this.m_Camera.LookAt(new three_1.Vector3(0, 0, -1));
this.m_bNeedUpdate = true;
};
Viewer.prototype.ViewToFront = function () {
this.m_Camera.LookAt(new three_1.Vector3(0, 1, 0));
this.m_bNeedUpdate = true;
};
Viewer.prototype.ViewToSwiso = function () {
this.m_Camera.LookAt(new three_1.Vector3(1, 1, -1));
this.m_bNeedUpdate = true;
};
Viewer.prototype.SelectByPoint = function (x, y) {
var mesh = _1.PointPick(this, x, y);
if (this.oldMesh)
this.oldMesh.material = _1.boardMaterial;
if (mesh && mesh.material !== ColorPalette_1.ColorMaterial.GetBasicMaterial(1)) {
this.oldMesh = mesh;
mesh.material = _1.selectMaterial;
}
this.m_bNeedUpdate = true;
};
Viewer.prototype.SelectBlock = function (blockMeshMap, dataID) {
var _this = this;
if (blockMeshMap.has(dataID)) {
var meshId_1 = blockMeshMap.get(dataID);
if (this.oldMesh)
this.oldMesh.material = _1.boardMaterial;
this.m_Scene.children.forEach(function (obj) {
if (obj instanceof three_1.Mesh) {
if (obj.id == meshId_1) {
_this.oldMesh = obj;
obj.material = _1.selectMaterial;
_this.m_bNeedUpdate = true;
}
}
});
}
};
return Viewer;
}());
exports.Viewer = Viewer;
//# sourceMappingURL=Viewer.js.map

1
dist/Viewer.js.map vendored

File diff suppressed because one or more lines are too long

25
dist/createBoard.d.ts vendored
View File

@@ -1,25 +0,0 @@
import { Geometry, LineSegments, Mesh, Shape, Vector2, Vector3 } from 'three';
export declare class Arc2d {
m_StartAn: number;
m_EndAn: number;
m_StartPoint: Vector2;
m_EndPoint: Vector2;
m_Center: Vector2;
m_Radius: number;
constructor(p1: Vector2, p2: Vector2, bul: number);
}
export declare function createPath(pts: Vector2[], buls: number[], shapeOut?: Shape): Shape;
export declare function getVec(data: object): Vector3;
export declare function createBoard(boardData: object): {
mesh: Mesh;
edges: (Mesh | LineSegments)[];
};
export declare function createTemplateBoard(brDataList: any[]): {
meshs: any[];
edgesa: any[];
relations: {
blockMeshMap: Map<number, number>;
meshBlockMap: Map<number, number>;
};
};
export declare function createEdge(geo: Geometry): LineSegments;

188
dist/createBoard.js vendored
View File

@@ -1,188 +0,0 @@
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
var three_1 = require("three");
var ColorPalette_1 = require("./ColorPalette");
var GeUtils_1 = require("./GeUtils");
var Material_1 = require("./Material");
var RotateUV_1 = require("./RotateUV");
var ThreeCSG_1 = require("./ThreeCSG");
//解析二维圆弧类.
var Arc2d = /** @class */ (function () {
function Arc2d(p1, p2, bul) {
this.m_StartPoint = p1.clone();
this.m_EndPoint = p2.clone();
var vec = p2.clone().sub(p1);
var len = vec.length();
var an = vec.angle();
this.m_Radius = len / Math.sin(2 * Math.atan(bul)) / 2;
var allAngle = Math.atan(bul) * 4;
var delDis = bul * len / 2;
var toDis = this.m_Radius - delDis;
an += Math.PI * 0.5;
this.m_Center = p1.clone().add(p2);
this.m_Center.multiplyScalar(0.5);
GeUtils_1.polar(this.m_Center, an, toDis);
this.m_StartAn = p1.clone().sub(this.m_Center).angle();
this.m_EndAn = p2.clone().sub(this.m_Center).angle();
if (bul < 0) {
//一个神奇的特性 它需要这么做
this.m_StartAn -= Math.PI;
this.m_EndAn -= Math.PI;
}
}
return Arc2d;
}());
exports.Arc2d = Arc2d;
//创建轮廓 通过点表和凸度
function createPath(pts, buls, shapeOut) {
var shape = shapeOut || new three_1.Shape();
if (pts.length === 0)
return shape;
var firstPt = pts[0];
shape.moveTo(firstPt.x, firstPt.y);
for (var i = 0; i < pts.length - 1; i++) {
var nextPt = pts[i + 1];
if (buls[i] == 0) {
shape.lineTo(nextPt.x, nextPt.y);
}
else {
var pt = pts[i];
//参考
//http://www.dorodnic.com/blog/tag/three-js/ 绘制一个齿轮
//https://www.kirupa.com/html5/drawing_circles_canvas.htm //html5
var arc2 = new Arc2d(pt, nextPt, buls[i]);
var cen = arc2.m_Center;
shape.absarc(cen.x, cen.y, arc2.m_Radius, arc2.m_StartAn, arc2.m_EndAn, buls[i] < 0);
}
}
return shape;
}
exports.createPath = createPath;
function getVec(data) {
return new three_1.Vector3(data["x"], data["y"], data["z"]);
}
exports.getVec = getVec;
//创建板件 暂时这么写
function createBoard(boardData) {
var _a;
var pts = [];
var buls = [];
var boardPts = boardData["Pts"];
var boardBuls = boardData["Buls"];
var boardHeight = boardData["H"];
var boardMat = new three_1.Matrix4();
var matInv = new three_1.Matrix4();
//InitBoardMat
var xD = getVec(boardData["XVec"]);
var yD = getVec(boardData["YVec"]);
var ZD = getVec(boardData["ZVec"]);
var pBase = getVec(boardData["BasePoint"]);
boardMat.makeBasis(xD, yD, ZD);
boardMat.setPosition(pBase);
matInv.getInverse(boardMat);
if (boardPts && boardPts.length !== 0)
for (var i = 0; i < boardPts.length; i++) {
var pt = getVec(boardPts[i]);
if (boardPts[i].z !== undefined)
pt.applyMatrix4(matInv);
pts.push(new three_1.Vector2(pt.x, pt.y));
buls.push(boardBuls[i]);
}
else {
var length_1 = boardData["L"];
var width = boardData["W"];
var height = boardData["H"];
pts.push(new three_1.Vector2(0, 0), new three_1.Vector2(width, 0), new three_1.Vector2(width, length_1), new three_1.Vector2(0, length_1), new three_1.Vector2(0, 0));
buls.push(0, 0, 0, 0, 0);
}
var sp = createPath(pts, buls);
var extrudeSettings = {
steps: 1,
bevelEnabled: false,
depth: boardHeight
};
var ext = new three_1.ExtrudeGeometry(sp, extrudeSettings);
ext.computeBoundingSphere();
ext.computeBoundingBox();
ext.translate(0, 0, -boardHeight);
ext.applyMatrix4(boardMat);
if (!GeUtils_1.equalv3(xD.clone().cross(yD), ZD)) {
for (var _i = 0, _b = ext.faces; _i < _b.length; _i++) {
var f = _b[_i];
_a = [f.c, f.a], f.a = _a[0], f.c = _a[1];
}
}
//外边.
var edges = [createEdge(ext)];
//差集
if (checkObjectArray(boardData, "SubBoardLocal")
|| checkObjectArray(boardData, "Drillings")) {
var thisCsg = new ThreeCSG_1.ThreeBSP(ext);
if (boardData["SubBoardLocal"]) {
var subBoardList = boardData["SubBoardLocal"].map(function (d) { return createBoard(d); });
for (var _c = 0, subBoardList_1 = subBoardList; _c < subBoardList_1.length; _c++) {
var br = subBoardList_1[_c];
edges.push.apply(edges, br.edges);
var subCsg = new ThreeCSG_1.ThreeBSP(br.mesh);
thisCsg = thisCsg.subtract(subCsg);
}
}
if (boardData["Drillings"]) {
var dris = boardData["Drillings"];
for (var _d = 0, dris_1 = dris; _d < dris_1.length; _d++) {
var dri = dris_1[_d];
var geo = new three_1.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);
var mesh_1 = new three_1.Mesh(geo, ColorPalette_1.ColorMaterial.GetBasicMaterial(1));
edges.push(mesh_1);
// 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"] === "地脚线")
RotateUV_1.RotateUVs(ext);
var mesh = new three_1.Mesh(ext, Material_1.boardMaterial);
mesh.userData = ZD;
edges.forEach(function (e) { return e.userData = ZD; });
return { mesh: mesh, edges: edges };
}
exports.createBoard = createBoard;
function checkObjectArray(obj, key) {
return obj[key] && obj[key].length > 0;
}
function createTemplateBoard(brDataList) {
var meshs = [];
var edgesa = [];
var relations = {
blockMeshMap: new Map(),
meshBlockMap: new Map()
};
for (var _i = 0, brDataList_1 = brDataList; _i < brDataList_1.length; _i++) {
var d = brDataList_1[_i];
var _a = createBoard(d), mesh = _a.mesh, edges = _a.edges;
meshs.push(mesh);
edgesa.push.apply(edgesa, edges);
if (d['DataID']) {
relations.blockMeshMap.set(d['DataID'], mesh.id);
relations.meshBlockMap.set(mesh.id, d['DataID']);
}
}
return { meshs: meshs, edgesa: edgesa, relations: relations };
}
exports.createTemplateBoard = createTemplateBoard;
function createEdge(geo) {
var edge = new three_1.EdgesGeometry(geo, 1);
return new three_1.LineSegments(edge, Material_1.edgeMaterial);
}
exports.createEdge = createEdge;
//# sourceMappingURL=createBoard.js.map

File diff suppressed because one or more lines are too long

75
dist/data.d.ts vendored
View File

@@ -1,75 +0,0 @@
export declare var data: ({
L: number;
W: number;
H: number;
BasePoint: {
x: number;
y: number;
z: number;
};
XVec: {
x: number;
y: number;
z: number;
};
YVec: {
x: number;
y: number;
z: number;
};
ZVec: {
x: number;
y: number;
z: number;
};
Pts: {
x: number;
y: number;
z: number;
}[];
Buls: number[];
SubBoardLocal: any[];
SubBoardAssoc: any[];
MaterialId?: undefined;
Handle?: undefined;
CabName?: undefined;
BoardName?: undefined;
Grain?: undefined;
} | {
L: number;
W: number;
H: number;
MaterialId: string;
BasePoint: {
x: number;
y: number;
z: number;
};
XVec: {
x: number;
y: number;
z: number;
};
YVec: {
x: number;
y: number;
z: number;
};
ZVec: {
x: number;
y: number;
z: number;
};
Handle: string;
CabName: string;
BoardName: string;
Grain: number;
Pts: {
x: number;
y: number;
z: number;
}[];
Buls: number[];
SubBoardLocal: any[];
SubBoardAssoc: any[];
})[];

552
dist/data.js vendored
View File

@@ -1,552 +0,0 @@
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.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": []
}
];
//# sourceMappingURL=data.js.map

1
dist/data.js.map vendored

File diff suppressed because one or more lines are too long

9
dist/index.d.ts vendored
View File

@@ -1,9 +0,0 @@
export * from "./Viewer";
export * from "./CameraControls";
export * from "./GeUtils";
export * from "./createBoard";
export * from "./Dimension";
export * from "./DrawDimension";
export * from "./Material";
export * from "./PointPick";
export * from "./Utils";

15
dist/index.js vendored
View File

@@ -1,15 +0,0 @@
"use strict";
function __export(m) {
for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
}
Object.defineProperty(exports, "__esModule", { value: true });
__export(require("./Viewer"));
__export(require("./CameraControls"));
__export(require("./GeUtils"));
__export(require("./createBoard"));
__export(require("./Dimension"));
__export(require("./DrawDimension"));
__export(require("./Material"));
__export(require("./PointPick"));
__export(require("./Utils"));
//# sourceMappingURL=index.js.map

1
dist/index.js.map vendored
View File

@@ -1 +0,0 @@
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;AAAA,8BAAyB;AACzB,sCAAiC;AACjC,+BAA0B;AAC1B,mCAA8B;AAC9B,iCAA4B;AAC5B,qCAAgC;AAChC,gCAA2B;AAC3B,iCAA2B;AAC3B,6BAAuB"}

16
index.html Normal file
View 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>

View File

@@ -5,11 +5,9 @@
"main": "src/index.ts", "main": "src/index.ts",
"private": true, "private": true,
"scripts": { "scripts": {
"t": "tsc --noEmit -w", "dev": "vite --host",
"build": "tsc", "build": "tsc && vite build",
"umd": "webpack --config ./config/webpack.umd.ts", "preview": "vite preview"
"dev": "webpack-dev-server --config ./config/webpack.view.ts",
"rmtype": "ts-node ./utils/rmtype.ts"
}, },
"repository": { "repository": {
"type": "git", "type": "git",
@@ -18,25 +16,10 @@
"author": "cx", "author": "cx",
"license": "ISC", "license": "ISC",
"devDependencies": { "devDependencies": {
"@types/hard-source-webpack-plugin": "^1.0.1",
"@types/node": "^13.13.52", "@types/node": "^13.13.52",
"@types/three": "^0.103.2", "@types/three": "^0.103.2",
"@types/uglifyjs-webpack-plugin": "^1.1.0", "typescript": "^5.0.2",
"@types/webpack": "^4.41.32", "vite": "^4.4.5"
"@types/webpack-env": "^1.18.0",
"awesome-typescript-loader": "^5.2.1",
"cache-loader": "^4.1.0",
"fork-ts-checker-webpack-plugin": "^4.1.6",
"hard-source-webpack-plugin": "^0.13.1",
"html-webpack-plugin": "^4.5.2",
"ts-loader": "^7.0.5",
"ts-node": "^8.10.2",
"typescript": "^4.5.5",
"uglifyjs-webpack-plugin": "^2.2.0",
"webpack": "^5.75.0",
"webpack-cli": "^4.10.0",
"webpack-dev-server": "^4.11.1",
"webpack-merge": "^5.8.0"
}, },
"dependencies": { "dependencies": {
"@jscad/modeling": "^2.11.0", "@jscad/modeling": "^2.11.0",
@@ -46,5 +29,6 @@
"polylabel": "^1.1.0", "polylabel": "^1.1.0",
"xaop": "^2.0.0", "xaop": "^2.0.0",
"webcad_ue4_api": "http://gitea.cf/cx/webcad-ue4-api/archive/3.2.4.tar.gz" "webcad_ue4_api": "http://gitea.cf/cx/webcad-ue4-api/archive/3.2.4.tar.gz"
} },
"packageManager": "pnpm@9.1.1+sha1.09ada6cd05003e0ced25fb716f9fda4063ec2e3b"
} }

View File

@@ -1,24 +1,24 @@
import * as THREE from 'three'; import * as THREE from 'three';
import { KeyBoard, MouseKey } from './KeyEnum';
import { Vector3 } from 'three'; import { Vector3 } from 'three';
import { equaln } from './GeUtils';
import { KeyBoard, MouseKey } from './KeyEnum';
import { Viewer } from './Viewer'; import { Viewer } from './Viewer';
//相机控制状态 //相机控制状态
export enum CameraControlState export enum CameraControlState
{ {
Null = 0, Pan = 1, Rotate = 2, Scale = 3 Null = 0, Pan = 1, Rotate = 2, Scale = 4
} }
export class CameraControls 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_domElement: HTMLElement;//HTMLDocument
//起始点击 //起始点击
m_StartClickPoint: THREE.Vector3 = new THREE.Vector3(); m_StartClickPoint: THREE.Vector3 = new THREE.Vector3();
m_EndClickPoint: THREE.Vector3 = new THREE.Vector3(); m_EndClickPoint: THREE.Vector3 = new THREE.Vector3();
m_DollyStart: THREE.Vector2 = new THREE.Vector2(); m_DollyStart: number;
m_DollyEnd: THREE.Vector2 = new THREE.Vector2();
m_KeyDown = new Map<KeyBoard, boolean>(); m_KeyDown = new Map<KeyBoard, boolean>();
m_MouseDown = new Map<MouseKey, boolean>(); m_MouseDown = new Map<MouseKey, boolean>();
@@ -40,16 +40,16 @@ export class CameraControls
{ {
if (this.m_domElement) if (this.m_domElement)
{ {
this.m_domElement.addEventListener("mousedown", this.onMouseDown, false) this.m_domElement.addEventListener("mousedown", this.onMouseDown, false);
this.m_domElement.addEventListener("mousemove", this.onMouseMove, false) this.m_domElement.addEventListener("mousemove", this.onMouseMove, false);
this.m_domElement.addEventListener("mouseup", this.onMouseUp, false) this.m_domElement.addEventListener("mouseup", this.onMouseUp, false);
window.addEventListener("keydown", this.onKeyDown, false); window.addEventListener("keydown", this.onKeyDown, false);
window.addEventListener("keyup", this.onKeyUp, 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('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); window.addEventListener("blur", this.onBlur, false);
} }
@@ -62,7 +62,7 @@ export class CameraControls
{ {
this.m_KeyDown.clear(); this.m_KeyDown.clear();
this.m_MouseDown.clear(); this.m_MouseDown.clear();
} };
//触屏开始事件 //触屏开始事件
onTouchStart = (event: TouchEvent) => onTouchStart = (event: TouchEvent) =>
@@ -76,15 +76,15 @@ export class CameraControls
var dx = event.touches[0].pageX - event.touches[1].pageX; var dx = event.touches[0].pageX - event.touches[1].pageX;
var dy = event.touches[0].pageY - event.touches[1].pageY; var dy = event.touches[0].pageY - event.touches[1].pageY;
var distance = Math.sqrt(dx * dx + dy * dy); 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]; this.m_State = this.m_TouthTypeList[event.touches.length - 1];
} }
} };
onTouchEnd = (event: TouchEvent) => onTouchEnd = (event: TouchEvent) =>
{ {
this.m_State = CameraControlState.Null; this.m_State = CameraControlState.Null;
} };
onTouchMove = (event: TouchEvent) => onTouchMove = (event: TouchEvent) =>
{ {
event.preventDefault(); event.preventDefault();
@@ -93,40 +93,38 @@ export class CameraControls
this.m_EndClickPoint.set(event.touches[0].pageX, event.touches[0].pageY, 0); this.m_EndClickPoint.set(event.touches[0].pageX, event.touches[0].pageY, 0);
let vec = this.m_EndClickPoint.clone().sub(this.m_StartClickPoint); 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); if (this.m_State & CameraControlState.Pan)
this.m_DollyEnd.set(0, distance); {
if (distance > this.m_DollyStart.y) this.m_Viewer.Pan(vec);
{ }
this.m_Viewer.Zoom(0.95); if (this.m_State & CameraControlState.Scale)
} {
else var dx = event.touches[0].pageX - event.touches[1].pageX;
{ var dy = event.touches[0].pageY - event.touches[1].pageY;
this.m_Viewer.Zoom(1.05)
} var distance = Math.sqrt(dx * dx + dy * dy);
this.m_DollyStart.copy(this.m_DollyEnd); if (!equaln(this.m_DollyStart / distance, 1, 0.05))//轻微防抖
break; {
}
case CameraControlState.Rotate: if (distance > this.m_DollyStart)
{ {
this.m_Viewer.Rotate(vec.multiplyScalar(2)); this.m_Viewer.Zoom(0.95);
break;
} }
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_StartClickPoint.copy(this.m_EndClickPoint);
this.m_Viewer.m_bNeedUpdate = true; this.m_Viewer.m_bNeedUpdate = true;
} };
beginRotate() beginRotate()
{ {
this.m_State = CameraControlState.Rotate; this.m_State = CameraControlState.Rotate;
@@ -178,13 +176,13 @@ export class CameraControls
break; break;
} }
} }
} };
onMouseUp = (event: MouseEvent) => onMouseUp = (event: MouseEvent) =>
{ {
event.preventDefault(); event.preventDefault();
this.m_State = CameraControlState.Null; this.m_State = CameraControlState.Null;
this.m_MouseDown.set(event.button, false); this.m_MouseDown.set(event.button, false);
} };
onMouseMove = (event: MouseEvent) => onMouseMove = (event: MouseEvent) =>
{ {
event.preventDefault(); event.preventDefault();
@@ -195,28 +193,16 @@ export class CameraControls
(this.m_LeftUseRotate || (this.m_LeftUseRotate ||
(this.m_KeyDown.get(KeyBoard.Control)) (this.m_KeyDown.get(KeyBoard.Control))
) )
&& this.m_State == CameraControlState.Rotate && this.m_State & CameraControlState.Rotate
) )
{ {
this.m_Viewer.Rotate(changeVec); this.m_Viewer.Rotate(changeVec);
} }
switch (this.m_State) if (this.m_State & CameraControlState.Pan)
{ {
case CameraControlState.Pan: this.m_Viewer.Pan(changeVec);
{
this.m_Viewer.Pan(changeVec);
break;
}
case CameraControlState.Rotate:
{
break;
}
case CameraControlState.Scale:
{
break;
}
} }
} };
/** /**
* 鼠标滚轮事件 * 鼠标滚轮事件
* *
@@ -237,14 +223,14 @@ export class CameraControls
{ {
this.m_Viewer.Zoom(1.4, pt); this.m_Viewer.Zoom(1.4, pt);
} }
} };
//按键 //按键
onKeyDown = (event: KeyboardEvent) => onKeyDown = (event: KeyboardEvent) =>
{ {
this.m_KeyDown.set(event.keyCode, true); this.m_KeyDown.set(event.keyCode, true);
} };
onKeyUp = (event: KeyboardEvent) => onKeyUp = (event: KeyboardEvent) =>
{ {
this.m_KeyDown.set(event.keyCode, false); this.m_KeyDown.set(event.keyCode, false);
} };
} }

View File

@@ -1,5 +1,5 @@
import * as THREE from 'three'; import * as THREE from 'three';
import { LineBasicMaterial, MeshBasicMaterial, Color } from 'three'; import { Color, LineBasicMaterial, MeshBasicMaterial } from 'three';
const ColorPalette = [ const ColorPalette = [
[255, 0, 0, 255], //----- 0 - lets make it red for an example [255, 0, 0, 255], //----- 0 - lets make it red for an example
//[255, 255, 255, 255],//----- 0 - ByBlock - White //[255, 255, 255, 255],//----- 0 - ByBlock - White
@@ -284,7 +284,7 @@ export class ColorMaterial
{ {
if (this.m_BasicMaterialMap.has(index)) if (this.m_BasicMaterialMap.has(index))
return this.m_BasicMaterialMap.get(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); this.m_BasicMaterialMap.set(index, mat);
return mat; return mat;
} }

View File

@@ -1,4 +1,4 @@
import { Box3, Matrix4, Mesh, Vector3 } from "three"; import { Matrix4, Mesh, Vector3 } from "three";
import { Dimension, GetBoxArr } from "."; import { Dimension, GetBoxArr } from ".";
@@ -19,7 +19,7 @@ export function DrawDimension(brList: Mesh[]): Dimension[]
new Vector3(-1, 0, 0), new Vector3(-1, 0, 0),
new Vector3(0, -1, 0), new Vector3(0, -1, 0),
new Vector3(0, 0, 1) new Vector3(0, 0, 1)
) );
mat4.setPosition(box.min.clone().add(new Vector3(size.x, -30))); mat4.setPosition(box.min.clone().add(new Vector3(size.x, -30)));
let textHeight = 45; let textHeight = 45;
@@ -31,7 +31,7 @@ export function DrawDimension(brList: Mesh[]): Dimension[]
new Vector3(0, 0, -1), new Vector3(0, 0, -1),
new Vector3(1, 0, 0), new Vector3(1, 0, 0),
new Vector3(0, -1, 0) new Vector3(0, -1, 0)
) );
mat4.setPosition(box.max.clone().add(new Vector3(30, -size.y))); mat4.setPosition(box.max.clone().add(new Vector3(30, -size.y)));
dimz.applyMatrix4(mat4); dimz.applyMatrix4(mat4);
@@ -40,7 +40,7 @@ export function DrawDimension(brList: Mesh[]): Dimension[]
new Vector3(0, 1, 0), new Vector3(0, 1, 0),
new Vector3(-1, 0, 0), new Vector3(-1, 0, 0),
new Vector3(0, 0, 1) new Vector3(0, 0, 1)
) );
mat4.setPosition(box.max.clone().add(new Vector3(30, -size.y))); mat4.setPosition(box.max.clone().add(new Vector3(30, -size.y)));
dimy.applyMatrix4(mat4); dimy.applyMatrix4(mat4);

View File

@@ -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'; import { Matrix2 } from './Matrix2';
@@ -112,7 +112,7 @@ export function getLoocAtUpVec(dir: Vector3): Vector3
{ {
if (dir.equals(cZeroVec)) if (dir.equals(cZeroVec))
{ {
throw ("zero vector") throw ("zero vector");
} }
let norm = dir.clone().normalize(); let norm = dir.clone().normalize();
if (norm.equals(cZAxis)) if (norm.equals(cZAxis))
@@ -151,8 +151,8 @@ export function ptToString(v: Vector3, fractionDigits: number = 3): string
{ {
return v.toArray().map(o => return v.toArray().map(o =>
{ {
return o.toFixed(fractionDigits) return o.toFixed(fractionDigits);
}).join(",") }).join(",");
} }
export function midPoint(v1: Vector3, v2: Vector3): Vector3 export function midPoint(v1: Vector3, v2: Vector3): Vector3
@@ -230,7 +230,7 @@ export function getProjectDist(v1: Vector3, v2: Vector3)
return { return {
h: dist * Math.cos(ang), h: dist * Math.cos(ang),
v: dist * Math.sin(ang) v: dist * Math.sin(ang)
} };
} }
//获得输入点在2线组成的4个区间的位置 //获得输入点在2线组成的4个区间的位置
export function getPtPostion(sp: Vector3, ep: Vector3, c: Vector3, inPt: Vector3) 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 }; return { sp, ep };
} else if (inputAng > ang1 && inputAng <= ang2) } 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) } 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 } else
{ {
return { sp, ep: c.clone().add(l4) }; return { sp, ep: c.clone().add(l4) };
@@ -277,7 +277,7 @@ export function angleAndX(v: Vector3 | Vector2)
export function angleTo2Pi(an: number) export function angleTo2Pi(an: number)
{ {
an = an % (Math.PI * 2); an = an % (Math.PI * 2);
if (an < 0) an += Math.PI * 2 if (an < 0) an += Math.PI * 2;
return an; return an;
} }
export function updateGeometry(l: Line | Mesh, geometry: Geometry) export function updateGeometry(l: Line | Mesh, geometry: Geometry)

View File

@@ -89,8 +89,8 @@ export class SimpleBoard
pts.push(new Vector2(0, 0), pts.push(new Vector2(0, 0),
new Vector2(this.width, 0), new Vector2(this.width, 0),
new Vector2(this.width, length), new Vector2(this.width, this.height),
new Vector2(0, length), new Vector2(0, this.height),
new Vector2(0, 0) new Vector2(0, 0)
); );
buls.push(0, 0, 0, 0, 0); buls.push(0, 0, 0, 0, 0);
@@ -178,7 +178,7 @@ export class SimpleBoard
text.applyMatrix4(new Matrix4().setPosition(position)); text.applyMatrix4(new Matrix4().setPosition(position));
} }
text.CreateDoubleMesh(this._BoardType === BoardType.Layer); // text.CreateDoubleMesh(this._BoardType === BoardType.Layer);
return text; return text;
} }

View File

@@ -1,4 +1,5 @@
import { Font, FontLoader, Matrix4, Mesh, Shape, 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 { ColorMaterial } from "./ColorPalette";
import { MoveMatrix } from "./GeUtils"; import { MoveMatrix } from "./GeUtils";
import { XAxis, XAxisN, YAxis, YAxisN, ZAxisN } from "./Utils"; import { XAxis, XAxisN, YAxis, YAxisN, ZAxisN } from "./Utils";
@@ -10,7 +11,6 @@ class FontLoaderUtil
{ {
if (!this.defFont) if (!this.defFont)
{ {
const f = require("../resources/fonts/helvetiker_regular.typeface.json");
let loader = new FontLoader(); let loader = new FontLoader();
this.defFont = loader.parse(f); this.defFont = loader.parse(f);
} }

View File

@@ -1,62 +1,197 @@
[ [
{ {
"L": 875, "DataID": 3996018,
"W": 560, "OrderNo": 20230727027642,
"H": 18.5, "L": 800,
"CabName": "客厅", "W": 600,
"BoardName": "左侧板", "H": 18,
"BoardName": "层板",
"Grain": 0,
"BoardType": 0,
"CustomNumber": "",
"BasePoint": { "BasePoint": {
"x": 6154.77834988623, "x": 1877.02062480031,
"y": 224.38394523692736, "y": -1.77635683940025e-13,
"z": 1399.4464813779712 "z": 823.651271182857
}, },
"XVec": { "XVec": {
"x": 0, "x": 2.22044604925031e-16,
"y": 1, "y": 1,
"z": 0 "z": 0
}, },
"YVec": { "YVec": {
"x": -1,
"y": 2.22044604925031e-16,
"z": 0
},
"ZVec": {
"x": 0, "x": 0,
"y": 0, "y": 0,
"z": 1 "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": { "ZVec": {
"x": 1, "x": 1,
"y": 0, "y": 0,
"z": 0 "z": 2.22044604925031e-16
}, },
"Pts": [ "Pts": [],
"Buls": [],
"SubBoardLocal": [],
"SubBoardAssoc": [],
"Drillings": [
{ {
"x": 0, "x": 550,
"y": 0 "y": 600,
"r": 5,
"h": 13.5,
"f": 1
}, },
{ {
"x": 560, "x": 300,
"y": 0 "y": 600,
"r": 5,
"h": 13.5,
"f": 1
}, },
{ {
"x": 560, "x": 50,
"y": 875 "y": 600,
}, "r": 5,
{ "h": 13.5,
"x": 0, "f": 1
"y": 875
},
{
"x": 0,
"y": 0
} }
], ]
"Buls": [ },
0, {
0, "DataID": 3996020,
0, "OrderNo": 20230727027642,
0, "L": 1200,
0 "W": 600,
], "H": 18,
"DataID": 3988993, "BoardName": "左侧板",
"Drillings": [], "Grain": 0,
"BoardType": 1, "BoardType": 0,
"CustomNumber": 1 "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": 50,
"y": 600,
"r": 5,
"h": 13.5,
"f": 0
},
{
"x": 300,
"y": 600,
"r": 5,
"h": 13.5,
"f": 0
},
{
"x": 550,
"y": 600,
"r": 5,
"h": 13.5,
"f": 0
}
]
} }
] ]

View File

@@ -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>

View File

@@ -1,10 +1,10 @@
// import { Color, Face3, MeshBasicMaterial, Object3D, Vector2, Vector3 } from "three"; // import { Color, Face3, MeshBasicMaterial, Object3D, Vector2, Vector3 } from "three";
// import "./style.css"; // import "./style.css";
import { Color, MeshBasicMaterial, Vector3 } from "three"; import { Color, MeshBasicMaterial, Vector3 } from "three";
import { CameraControlState } from "../CameraControls";
import { GetBox } from "../GeUtils"; import { GetBox } from "../GeUtils";
import { LoadBoard } from "../Utils"; import { LoadBoard } from "../Utils";
import { Viewer } from "../Viewer"; import { Viewer } from "../Viewer";
import data from "./data.json";
let btn = document.createElement("button"); let btn = document.createElement("button");
btn.innerHTML = "载入"; btn.innerHTML = "载入";
@@ -20,8 +20,8 @@ document.body.appendChild(btn3);
let el = document.createElement("canvas"); let el = document.createElement("canvas");
el.style.width = "80%"; el.style.width = "100%";
el.style.height = "80%"; el.style.height = "80vh";
document.body.appendChild(el); document.body.appendChild(el);
let view = new Viewer(el, (settings) => let view = new Viewer(el, (settings) =>
@@ -37,15 +37,14 @@ let view = new Viewer(el, (settings) =>
}); });
//修改这个顺序 改变1 2 3 个触摸点时的触发状态. //修改这个顺序 改变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 = () => 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();

View File

@@ -1,243 +1,243 @@
import { Mesh, MeshBasicMaterial, Raycaster, Scene, Vector3, WebGLRenderer, WebGLRendererParameters } from "three"; import { Mesh, MeshBasicMaterial, Raycaster, Scene, Vector3, WebGLRenderer, type WebGLRendererParameters } from "three";
import { boardMaterial, CameraControls, PointPick, selectMaterial } from "."; import { CameraControls, PointPick, boardMaterial, selectMaterial } from ".";
import { CameraUpdate } from "./CameraUpdate"; import { CameraUpdate } from "./CameraUpdate";
import { ColorMaterial } from "./ColorPalette"; import { ColorMaterial } from "./ColorPalette";
import { cZeroVec, GetBox, GetBoxArr } from "./GeUtils"; import { GetBox, GetBoxArr, cZeroVec } from "./GeUtils";
import { PlaneExt } from "./PlaneExt"; import { PlaneExt } from "./PlaneExt";
export class ViewerSettings export class ViewerSettings
{ {
boardMaterial: MeshBasicMaterial = boardMaterial; boardMaterial: MeshBasicMaterial = boardMaterial;
selectMaterial: MeshBasicMaterial = selectMaterial; selectMaterial: MeshBasicMaterial = selectMaterial;
selectByPointCallback: (meshId: number) => void = () => { }; selectByPointCallback: (meshId: number) => void = () => { };
} }
export class Viewer export class Viewer
{ {
m_LookTarget: any; m_LookTarget: any;
m_Camera: CameraUpdate = new CameraUpdate(); m_Camera: CameraUpdate = new CameraUpdate();
m_CameraCtrl: CameraControls; m_CameraCtrl: CameraControls;
m_bNeedUpdate: boolean = true; m_bNeedUpdate: boolean = true;
m_Render: WebGLRenderer;//渲染器 //暂时只用这个类型 m_Render: WebGLRenderer;//渲染器 //暂时只用这个类型
m_DomEl: HTMLElement; //画布容器 m_DomEl: HTMLElement; //画布容器
_Height: number; _Height: number = 0;
_Width: number; _Width: number = 0;
m_Scene: Scene = new Scene(); m_Scene: Scene = new Scene();
_Settings = new ViewerSettings(); _Settings = new ViewerSettings();
/** /**
* *
* @param {HTMLElement} canvasContainer 可以传入一个div或者一个画布 * @param {HTMLElement} canvasContainer 可以传入一个div或者一个画布
* @memberof Viewer * @memberof Viewer
*/ */
constructor(canvasContainer: HTMLElement, setupAction: (settings: ViewerSettings) => void = null) constructor(canvasContainer: HTMLElement, setupAction: (settings: ViewerSettings) => void = null)
{
if (setupAction)
{ {
setupAction(this._Settings); if (setupAction)
}
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 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);
}
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)
{
this.Render();
this.m_bNeedUpdate = false;
}
}
Render()
{
this.m_Render.render(this.m_Scene, this.m_Camera.Camera);
}
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.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;
}
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) setupAction(this._Settings);
{
this.oldMesh = obj;
obj.material = this._Settings.selectMaterial;
this.m_bNeedUpdate = true;
}
} }
}) 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 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);
}
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)
{
this.Render();
this.m_bNeedUpdate = false;
}
};
Render()
{
this.m_Render.render(this.m_Scene, this.m_Camera.Camera);
}
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.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;
}
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;
}
}
});
}
} }
}
} }

View File

@@ -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
View File

@@ -0,0 +1 @@
/// <reference types="vite/client" />

View File

@@ -2,21 +2,27 @@
"compilerOptions": { "compilerOptions": {
"outDir": "./dist", "outDir": "./dist",
"sourceMap": true, "sourceMap": true,
"module": "commonjs", "module": "ESNext",
"target": "es2020", "target": "ES2020",
"noLib": false, "noLib": false,
"moduleResolution": "node",
"skipLibCheck": true, "skipLibCheck": true,
"lib": ["ES2020", "DOM", "DOM.Iterable"],
"verbatimModuleSyntax":true,
/* Bundler mode */
"moduleResolution": "bundler",
"esModuleInterop": true, "esModuleInterop": true,
"lib": [ "allowImportingTsExtensions": true,
"esnext", "resolveJsonModule": true,
"dom" "isolatedModules": true,
], "noEmit": true,
"types": [
"node", /* Linting */
"webpack-env", // "strict": true,
"webpack-dev-server", // "noUnusedLocals": true,
], // "noUnusedParameters": true,
// "noFallthroughCasesInSwitch": true,
"jsx": "react", "jsx": "react",
"experimentalDecorators": true "experimentalDecorators": true
}, },

4225
yarn.lock

File diff suppressed because it is too large Load Diff