From 93ac737777f3d43632382258cc67bcc243c8a55f Mon Sep 17 00:00:00 2001 From: xief <1789784602@qq.com> Date: Wed, 3 Mar 2021 15:07:59 +0800 Subject: [PATCH] =?UTF-8?q?=E6=94=AF=E6=8C=81=E6=9D=90=E8=B4=A8=E8=87=AA?= =?UTF-8?q?=E5=AE=9A=E4=B9=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- package-lock.json | 158 +++++++++++++++++++++++++++++++++++++++++++ src/Utils.ts | 4 +- src/ViewSrc/index.ts | 14 +++- src/Viewer.ts | 25 +++++-- src/createBoard.ts | 14 ++-- 5 files changed, 198 insertions(+), 17 deletions(-) diff --git a/package-lock.json b/package-lock.json index b663ef7..6492d55 100644 --- a/package-lock.json +++ b/package-lock.json @@ -113,6 +113,12 @@ "@types/node": "*" } }, + "@types/json-schema": { + "version": "7.0.7", + "resolved": "https://registry.npm.taobao.org/@types/json-schema/download/@types/json-schema-7.0.7.tgz?cache=0&sync_timestamp=1613378919536&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40types%2Fjson-schema%2Fdownload%2F%40types%2Fjson-schema-7.0.7.tgz", + "integrity": "sha1-mKmTUWyFnrDVxMjwmDF6nqaNua0=", + "dev": true + }, "@types/mime": { "version": "2.0.1", "resolved": "https://registry.npm.taobao.org/@types/mime/download/@types/mime-2.0.1.tgz?cache=0&sync_timestamp=1588201894076&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40types%2Fmime%2Fdownload%2F%40types%2Fmime-2.0.1.tgz", @@ -1002,6 +1008,12 @@ "integrity": "sha1-Uvq8xqYG0aADAoAmSO9o9jnaJow=", "dev": true }, + "buffer-json": { + "version": "2.0.0", + "resolved": "https://registry.npm.taobao.org/buffer-json/download/buffer-json-2.0.0.tgz", + "integrity": "sha1-9z4TseQvGW/i/WfQAcfXEH7dfCM=", + "dev": true + }, "buffer-xor": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", @@ -1068,6 +1080,152 @@ "unset-value": "^1.0.0" } }, + "cache-loader": { + "version": "4.1.0", + "resolved": "https://registry.npm.taobao.org/cache-loader/download/cache-loader-4.1.0.tgz", + "integrity": "sha1-mUjK41OuwKH8ser9ojAIFuyFOH4=", + "dev": true, + "requires": { + "buffer-json": "^2.0.0", + "find-cache-dir": "^3.0.0", + "loader-utils": "^1.2.3", + "mkdirp": "^0.5.1", + "neo-async": "^2.6.1", + "schema-utils": "^2.0.0" + }, + "dependencies": { + "ajv": { + "version": "6.12.6", + "resolved": "https://registry.npm.taobao.org/ajv/download/ajv-6.12.6.tgz", + "integrity": "sha1-uvWmLoArB9l3A0WG+MO69a3ybfQ=", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npm.taobao.org/ajv-keywords/download/ajv-keywords-3.5.2.tgz?cache=0&sync_timestamp=1608059984992&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fajv-keywords%2Fdownload%2Fajv-keywords-3.5.2.tgz", + "integrity": "sha1-MfKdpatuANHC0yms97WSlhTVAU0=", + "dev": true + }, + "big.js": { + "version": "5.2.2", + "resolved": "https://registry.npm.taobao.org/big.js/download/big.js-5.2.2.tgz", + "integrity": "sha1-ZfCvOC9Xi83HQr2cKB6cstd2gyg=", + "dev": true + }, + "emojis-list": { + "version": "3.0.0", + "resolved": "https://registry.npm.taobao.org/emojis-list/download/emojis-list-3.0.0.tgz", + "integrity": "sha1-VXBmIEatKeLpFucariYKvf9Pang=", + "dev": true + }, + "find-cache-dir": { + "version": "3.3.1", + "resolved": "https://registry.npm.taobao.org/find-cache-dir/download/find-cache-dir-3.3.1.tgz", + "integrity": "sha1-ibM/rUpGcNqpT4Vff74x1thP6IA=", + "dev": true, + "requires": { + "commondir": "^1.0.1", + "make-dir": "^3.0.2", + "pkg-dir": "^4.1.0" + } + }, + "find-up": { + "version": "4.1.0", + "resolved": "https://registry.npm.taobao.org/find-up/download/find-up-4.1.0.tgz?cache=0&sync_timestamp=1597169884679&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Ffind-up%2Fdownload%2Ffind-up-4.1.0.tgz", + "integrity": "sha1-l6/n1s3AvFkoWEt8jXsW6KmqXRk=", + "dev": true, + "requires": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + } + }, + "json5": { + "version": "1.0.1", + "resolved": "https://registry.npm.taobao.org/json5/download/json5-1.0.1.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fjson5%2Fdownload%2Fjson5-1.0.1.tgz", + "integrity": "sha1-d5+wAYYE+oVOrL9iUhgNg1Q+Pb4=", + "dev": true, + "requires": { + "minimist": "^1.2.0" + } + }, + "loader-utils": { + "version": "1.4.0", + "resolved": "https://registry.npm.taobao.org/loader-utils/download/loader-utils-1.4.0.tgz", + "integrity": "sha1-xXm140yzSxp07cbB+za/o3HVphM=", + "dev": true, + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^1.0.1" + } + }, + "locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npm.taobao.org/locate-path/download/locate-path-5.0.0.tgz", + "integrity": "sha1-Gvujlq/WdqbUJQTQpno6frn2KqA=", + "dev": true, + "requires": { + "p-locate": "^4.1.0" + } + }, + "make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npm.taobao.org/make-dir/download/make-dir-3.1.0.tgz", + "integrity": "sha1-QV6WcEazp/HRhSd9hKpYIDcmoT8=", + "dev": true, + "requires": { + "semver": "^6.0.0" + } + }, + "p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npm.taobao.org/p-locate/download/p-locate-4.1.0.tgz", + "integrity": "sha1-o0KLtwiLOmApL2aRkni3wpetTwc=", + "dev": true, + "requires": { + "p-limit": "^2.2.0" + } + }, + "path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npm.taobao.org/path-exists/download/path-exists-4.0.0.tgz", + "integrity": "sha1-UTvb4tO5XXdi6METfvoZXGxhtbM=", + "dev": true + }, + "pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npm.taobao.org/pkg-dir/download/pkg-dir-4.2.0.tgz?cache=0&sync_timestamp=1602859056682&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fpkg-dir%2Fdownload%2Fpkg-dir-4.2.0.tgz", + "integrity": "sha1-8JkTPfft5CLoHR2ESCcO6z5CYfM=", + "dev": true, + "requires": { + "find-up": "^4.0.0" + } + }, + "schema-utils": { + "version": "2.7.1", + "resolved": "https://registry.npm.taobao.org/schema-utils/download/schema-utils-2.7.1.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fschema-utils%2Fdownload%2Fschema-utils-2.7.1.tgz", + "integrity": "sha1-HKTzLRskxZDCA7jnpQvw6kzTlNc=", + "dev": true, + "requires": { + "@types/json-schema": "^7.0.5", + "ajv": "^6.12.4", + "ajv-keywords": "^3.5.2" + } + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npm.taobao.org/semver/download/semver-6.3.0.tgz?cache=0&sync_timestamp=1606852064928&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fsemver%2Fdownload%2Fsemver-6.3.0.tgz", + "integrity": "sha1-7gpkyK9ejO6mdoexM3YeG+y9HT0=", + "dev": true + } + } + }, "camel-case": { "version": "4.1.1", "resolved": "https://registry.npm.taobao.org/camel-case/download/camel-case-4.1.1.tgz", diff --git a/src/Utils.ts b/src/Utils.ts index 13a02f7..b569639 100644 --- a/src/Utils.ts +++ b/src/Utils.ts @@ -1,5 +1,5 @@ import { Object3D, Mesh } from "three"; -import { createTemplateBoard, DrawDimension, Viewer, selectMaterial } from "."; +import { createTemplateBoard, DrawDimension, Viewer } from "."; function dispose(m: Object3D) { @@ -21,7 +21,7 @@ export function LoadBoard(view: Viewer, data: any[], clear: boolean = true) if (data.length === 0) return; //加板 - let { meshs, edgesa, relations } = createTemplateBoard(data); + let { meshs, edgesa, relations } = createTemplateBoard(data, view._Settings.boardMaterial); //加标注 let dims = DrawDimension(meshs); diff --git a/src/ViewSrc/index.ts b/src/ViewSrc/index.ts index 9dc79fe..7df5aee 100644 --- a/src/ViewSrc/index.ts +++ b/src/ViewSrc/index.ts @@ -1,6 +1,6 @@ // import { Color, Face3, MeshBasicMaterial, Object3D, Vector2, Vector3 } from "three"; // import "./style.css"; -import { Vector3 } from "three"; +import { Color, MeshBasicMaterial, Vector3 } from "three"; import { CameraControlState } from "../CameraControls"; import { data } from "../data"; import { GetBox } from "../GeUtils"; @@ -25,7 +25,17 @@ el.style.width = "80%"; el.style.height = "80%"; document.body.appendChild(el); -let view = new Viewer(el); +let view = new Viewer(el, (settings) => +{ + settings.boardMaterial = new MeshBasicMaterial({ + color: new Color(0.8, 0.8, 0.8), + polygonOffset: true, + polygonOffsetFactor: 1, // positive value pushes polygon further away + polygonOffsetUnits: 1, + transparent: true, + opacity: 0.5 + }); +}); //修改这个顺序 改变1 2 3 个触摸点时的触发状态. view.m_CameraCtrl.m_TouthTypeList = [CameraControlState.Rotate, CameraControlState.Scale, CameraControlState.Pan]; diff --git a/src/Viewer.ts b/src/Viewer.ts index e6d0107..0f3f7fd 100644 --- a/src/Viewer.ts +++ b/src/Viewer.ts @@ -1,11 +1,18 @@ -import { Mesh, Raycaster, Scene, Vector3, WebGLRenderer, WebGLRendererParameters } from "three"; +import { Mesh, MeshBasicMaterial, Raycaster, Scene, Vector3, WebGLRenderer, WebGLRendererParameters } from "three"; import { boardMaterial, CameraControls, PointPick, selectMaterial } from "."; import { CameraUpdate } from "./CameraUpdate"; import { ColorMaterial } from "./ColorPalette"; import { cZeroVec, GetBox, GetBoxArr } from "./GeUtils"; import { PlaneExt } from "./PlaneExt"; +export class ViewerSettings +{ + boardMaterial: MeshBasicMaterial = boardMaterial; + selectMaterial: MeshBasicMaterial = selectMaterial; + +} + export class Viewer { m_LookTarget: any; @@ -20,13 +27,19 @@ export class Viewer m_Scene: Scene = new Scene(); + _Settings = new ViewerSettings(); /** * * @param {HTMLElement} canvasContainer 可以传入一个div或者一个画布 * @memberof Viewer */ - constructor(canvasContainer: HTMLElement) + constructor(canvasContainer: HTMLElement, setupAction: (settings: ViewerSettings) => void = null) { + if (setupAction) + { + setupAction(this._Settings); + } + this.m_DomEl = canvasContainer; this.initRender(canvasContainer); this.OnSize(); @@ -193,11 +206,11 @@ export class Viewer { let mesh = PointPick(this, x, y); if (this.oldMesh) - this.oldMesh.material = boardMaterial; + this.oldMesh.material = this._Settings.boardMaterial; if (mesh && mesh.material !== ColorMaterial.GetBasicMaterial(1)) { this.oldMesh = mesh; - mesh.material = selectMaterial; + mesh.material = this._Settings.selectMaterial; } this.m_bNeedUpdate = true; } @@ -207,7 +220,7 @@ export class Viewer { let meshId = blockMeshMap.get(dataID); if (this.oldMesh) - this.oldMesh.material = boardMaterial; + this.oldMesh.material = this._Settings.boardMaterial; this.m_Scene.children.forEach(obj => { if (obj instanceof Mesh) @@ -215,7 +228,7 @@ export class Viewer if (obj.id == meshId) { this.oldMesh = obj; - obj.material = selectMaterial; + obj.material = this._Settings.selectMaterial; this.m_bNeedUpdate = true; } } diff --git a/src/createBoard.ts b/src/createBoard.ts index 0ee009b..bd4c70a 100644 --- a/src/createBoard.ts +++ b/src/createBoard.ts @@ -1,7 +1,7 @@ -import { CylinderGeometry, Geometry, LineSegments, Mesh, Shape, Vector2, Vector3, Matrix4, ExtrudeGeometry, EdgesGeometry } from 'three'; +import { CylinderGeometry, Geometry, LineSegments, Mesh, Shape, Vector2, Vector3, Matrix4, ExtrudeGeometry, EdgesGeometry, MeshBasicMaterial } from 'three'; import { ColorMaterial } from './ColorPalette'; import { equalv3, polar } from './GeUtils'; -import { boardMaterial, edgeMaterial } from './Material'; +import { edgeMaterial } from './Material'; import { RotateUVs } from './RotateUV'; import { ThreeBSP } from './ThreeCSG'; //解析二维圆弧类. @@ -77,7 +77,7 @@ export function getVec(data: object): Vector3 } //创建板件 暂时这么写 -export function createBoard(boardData: object) +export function createBoard(boardData: object, material: MeshBasicMaterial) { let pts: Vector2[] = []; let buls: number[] = []; @@ -151,7 +151,7 @@ export function createBoard(boardData: object) if (boardData["SubBoardLocal"]) { - let subBoardList = boardData["SubBoardLocal"].map(d => createBoard(d)); + let subBoardList = boardData["SubBoardLocal"].map(d => createBoard(d, material)); for (let br of subBoardList) { edges.push(...br.edges); @@ -190,7 +190,7 @@ export function createBoard(boardData: object) if (boardData["BoardName"] === "地脚线") RotateUVs(ext); - let mesh = new Mesh(ext, boardMaterial); + let mesh = new Mesh(ext, material); mesh.userData = ZD; edges.forEach(e => e.userData = ZD); return { mesh, edges }; @@ -201,7 +201,7 @@ function checkObjectArray(obj: any, key: string) return obj[key] && obj[key].length > 0; } -export function createTemplateBoard(brDataList: any[]) +export function createTemplateBoard(brDataList: any[], material: MeshBasicMaterial) { let meshs = []; let edgesa = []; @@ -212,7 +212,7 @@ export function createTemplateBoard(brDataList: any[]) }; for (let d of brDataList) { - let { mesh, edges } = createBoard(d); + let { mesh, edges } = createBoard(d, material); meshs.push(mesh); edgesa.push(...edges);