Browse Source

itemType define

master
修宁 7 months ago
parent
commit
5b10ecbdeb
  1. 67
      src/designer/Viewport.ts
  2. 14
      src/model/ModelUtils.ts
  3. 2
      src/model/WorldModel.ts
  4. 2
      src/model/itemType/ItemTypeBase.ts
  5. 2
      src/model/itemType/ItemTypeDefine.ts
  6. 5
      src/model/itemType/ItemTypeLineBase.ts
  7. 0
      src/model/itemType/line/LineMeta.ts
  8. 32
      src/model/itemType/measure/Measure.ts
  9. 2
      src/model/itemType/measure/MeasureMeta.ts
  10. 0
      src/model/itemType/point/PointMeta.ts
  11. 0
      src/model/itemType/store/QueueMeta.ts

67
src/designer/Viewport.ts

@ -1,6 +1,16 @@
import _ from 'lodash' import _ from 'lodash'
import * as THREE from 'three' import * as THREE from 'three'
import { AxesHelper, GridHelper, OrthographicCamera, Raycaster, Scene, Vector3, WebGLRenderer } from 'three' import {
AxesHelper,
GridHelper,
Mesh,
type Object3D,
OrthographicCamera,
Raycaster,
Scene,
Vector3,
WebGLRenderer
} from 'three'
import { OrbitControls } from 'three/examples/jsm/controls/OrbitControls' import { OrbitControls } from 'three/examples/jsm/controls/OrbitControls'
import EsDragControls from './model2DEditor/EsDragControls' import EsDragControls from './model2DEditor/EsDragControls'
import Stats from 'three/examples/jsm/libs/stats.module' import Stats from 'three/examples/jsm/libs/stats.module'
@ -23,7 +33,7 @@ export default class Viewport {
scene: Scene scene: Scene
camera: OrthographicCamera camera: OrthographicCamera
renderer: WebGLRenderer renderer: WebGLRenderer
axesHelper: AxesHelper axesHelper: GridHelper
gridHelper: GridHelper gridHelper: GridHelper
statsControls: Stats statsControls: Stats
controls: OrbitControls controls: OrbitControls
@ -139,30 +149,35 @@ export default class Viewport {
this.initMode2DCamera() this.initMode2DCamera()
// 辅助线 // 辅助线
this.axesHelper = new THREE.AxesHelper(3) const axesHelper = new THREE.GridHelper(1000, 2)
axesHelper.material.color.setHex(0x000000)
axesHelper.material.linewidth = 2
// @ts-ignore
axesHelper.material.vertexColors = false
this.axesHelper = axesHelper
this.scene.add(this.axesHelper) this.scene.add(this.axesHelper)
this.gridHelper = new THREE.GridHelper(500, 500) const gridHelper = new THREE.GridHelper(1000, 1000)
const gridHelper = this.gridHelper gridHelper.material.color.setHex(0x999999)
gridHelper.material = new THREE.LineBasicMaterial({ gridHelper.material.opacity = 0.8
color: 0x888888, gridHelper.material.transparent = true
opacity: 0.8, // @ts-ignore
transparent: true gridHelper.material.vertexColors = false
})
scene.add(gridHelper) this.gridHelper = gridHelper
this.scene.add(this.gridHelper)
// 光照 // 光照
const ambientLight = new THREE.AmbientLight(0xffffff, 1.5) const ambientLight = new THREE.AmbientLight(0xffffff, 0.8)
scene.add(ambientLight) scene.add(ambientLight)
const directionalLight = new THREE.DirectionalLight(0xffffff, 1.5) // const directionalLight = new THREE.DirectionalLight(0xffffff, 1.5)
directionalLight.position.set(5, 5, 5).multiplyScalar(3) // directionalLight.position.set(5, 5, 5).multiplyScalar(3)
directionalLight.castShadow = true // directionalLight.castShadow = true
scene.add(directionalLight) // scene.add(directionalLight)
//
const hemisphereLight = new THREE.HemisphereLight(0xffffff, 0x444444, 1) // const hemisphereLight = new THREE.HemisphereLight(0xffffff, 0x444444, 1)
scene.add(hemisphereLight) // scene.add(hemisphereLight)
// 性能监控 // 性能监控
const statsControls = new Stats() const statsControls = new Stats()
@ -174,16 +189,6 @@ export default class Viewport {
viewerDom.appendChild(statsControls.dom) viewerDom.appendChild(statsControls.dom)
$(statsControls.dom).children().css('height', '28px') $(statsControls.dom).children().css('height', '28px')
// 创建几何体和材质
const geometry = new THREE.BoxGeometry(1, 1, 1)
const material = new THREE.MeshStandardMaterial({
color: 0xcccccc,
metalness: 0.9,
roughness: 0.1
})
const cube = new THREE.Mesh(geometry, material)
scene.add(cube)
this.animate() this.animate()
// 监听事件 // 监听事件
@ -372,9 +377,9 @@ export default class Viewport {
const fadeStartDistance = 15 // 开始淡出的距离 const fadeStartDistance = 15 // 开始淡出的距离
// 计算透明度(0~1) // 计算透明度(0~1)
let opacity = 1 let opacity = 0.8
if (cameraDistance > fadeStartDistance) { if (cameraDistance > fadeStartDistance) {
opacity = 1 - Math.min((cameraDistance - fadeStartDistance) / (maxVisibleDistance - fadeStartDistance), 1) opacity = 0.8 - Math.min((cameraDistance - fadeStartDistance) / (maxVisibleDistance - fadeStartDistance) * 0.8, 0.8)
} }
// 修改网格材质透明度 // 修改网格材质透明度

14
src/model/ModelUtils.ts

@ -1,5 +1,5 @@
import * as THREE from 'three' import * as THREE from 'three'
import type { ItemJson } from '@/model/itemTypeDefine/ItemTypeDefine.ts' import type { ItemJson, ItemTypeDefineOption } from '@/model/itemType/ItemTypeDefine.ts'
import { getAllItemTypes, getItemTypeByName } from '@/runtime/DefineItemType.ts' import { getAllItemTypes, getItemTypeByName } from '@/runtime/DefineItemType.ts'
export function loadSceneFromJson(scene: THREE.Scene, items: ItemJson[]) { export function loadSceneFromJson(scene: THREE.Scene, items: ItemJson[]) {
@ -7,15 +7,15 @@ export function loadSceneFromJson(scene: THREE.Scene, items: ItemJson[]) {
const object3ds = loadObject3DFromJson(items) const object3ds = loadObject3DFromJson(items)
// 通知所有加载的对象, 模型加载完成 // 通知所有加载的对象, 模型加载完成
getAllItemTypes().forEach(itemType => { getAllItemTypes().forEach((itemType: ItemTypeDefineOption) => {
if (typeof itemType.clazz.afterLoadComplete === 'function') { const ret = itemType.clazz.afterLoadComplete(object3ds)
itemType.clazz.afterLoadComplete(object3ds) if (ret && Array.isArray(ret)) {
// 如果返回值是数组,则合并到 object3ds 中
object3ds.push(...ret)
} }
}) })
object3ds.forEach(object3D => { scene.add(...object3ds)
scene.add(object3D)
})
// 通知所有加载的对象, 模型加载完成 // 通知所有加载的对象, 模型加载完成
getAllItemTypes().forEach(itemType => { getAllItemTypes().forEach(itemType => {

2
src/model/WorldModel.ts

@ -6,7 +6,7 @@ import { Scene } from 'three'
import type Viewport from '@/designer/Viewport.ts' import type Viewport from '@/designer/Viewport.ts'
import { loadSceneFromJson } from '@/model/ModelUtils.ts' import { loadSceneFromJson } from '@/model/ModelUtils.ts'
import MeasureMeta from './itemTypeDefine/measure/MeasureMeta' import MeasureMeta from './itemType/measure/MeasureMeta'
/** /**
* *

2
src/model/itemTypeDefine/ItemTypeBase.ts → src/model/itemType/ItemTypeBase.ts

@ -1,6 +1,6 @@
import { type Object3D } from 'three' import { type Object3D } from 'three'
import type WorldModel from '@/model/WorldModel.ts' import type WorldModel from '@/model/WorldModel.ts'
import type { ItemJson, ItemTypeDefineOption } from '@/model/itemTypeDefine/ItemTypeDefine.ts' import type { ItemJson, ItemTypeDefineOption } from '@/model/itemType/ItemTypeDefine.ts'
import * as THREE from 'three' import * as THREE from 'three'
export default abstract class ItemTypeBase { export default abstract class ItemTypeBase {

2
src/model/itemTypeDefine/ItemTypeDefine.ts → src/model/itemType/ItemTypeDefine.ts

@ -1,4 +1,4 @@
import type ItemTypeBase from '@/model/itemTypeDefine/ItemTypeBase.ts' import type ItemTypeBase from '@/model/itemType/ItemTypeBase.ts'
export type ActionType = export type ActionType =
/** /**

5
src/model/itemTypeDefine/ItemTypeLineBase.ts → src/model/itemType/ItemTypeLineBase.ts

@ -1,6 +1,6 @@
import * as THREE from 'three' import * as THREE from 'three'
import ItemTypeBase from '@/model/itemTypeDefine/ItemTypeBase.ts' import ItemTypeBase from '@/model/itemType/ItemTypeBase.ts'
import type { ItemJson } from '@/model/itemTypeDefine/ItemTypeDefine.ts' import type { ItemJson } from '@/model/itemType/ItemTypeDefine.ts'
import type WorldModel from '@/model/WorldModel.ts' import type WorldModel from '@/model/WorldModel.ts'
/** /**
@ -36,7 +36,6 @@ export default abstract class ItemTypeLineBase extends ItemTypeBase {
afterLoadPoint(point: THREE.Object3D): void { afterLoadPoint(point: THREE.Object3D): void {
} }
afterAddScene(scene: THREE.Scene, objects: THREE.Object3D[]) { afterAddScene(scene: THREE.Scene, objects: THREE.Object3D[]) {
super.afterAddScene(scene, objects) super.afterAddScene(scene, objects)

0
src/model/itemTypeDefine/line/LineMeta.ts → src/model/itemType/line/LineMeta.ts

32
src/model/itemTypeDefine/measure/Measure.ts → src/model/itemType/measure/Measure.ts

@ -1,9 +1,9 @@
import * as THREE from 'three' import * as THREE from 'three'
import ItemTypeLineBase from '@/model/itemTypeDefine/ItemTypeLineBase.ts' import ItemTypeLineBase from '@/model/itemType/ItemTypeLineBase.ts'
import type WorldModel from '@/model/WorldModel.ts' import { Material, Object3D, Scene } from 'three'
import { Material } from 'three/src/materials/Material' import WorldModel from '@/model/WorldModel.ts'
export const TYPE_NAME = 'measure' export const GROUP_NAME = 'measure-group'
export const POINT_NAME = 'measure_point' export const POINT_NAME = 'measure_point'
export const LABEL_NAME = 'measure_label' export const LABEL_NAME = 'measure_label'
export const LINE_NAME = 'measure_line' export const LINE_NAME = 'measure_line'
@ -32,6 +32,10 @@ export default class Measure extends ItemTypeLineBase {
}) })
this.pointMaterial = new THREE.MeshBasicMaterial({ color: 0x303133, transparent: true, opacity: 0.9 }) this.pointMaterial = new THREE.MeshBasicMaterial({ color: 0x303133, transparent: true, opacity: 0.9 })
this.group = new THREE.Group()
this.group.name = GROUP_NAME
return Promise.resolve() return Promise.resolve()
} }
@ -40,6 +44,26 @@ export default class Measure extends ItemTypeLineBase {
super.afterLoadLine(line) super.afterLoadLine(line)
} }
afterLoadGroup(group: THREE.Group) {
super.afterLoadGroup(group)
if (this.group) {
// 如果已经有 group,则忽略
return
}
this.group = group
}
afterLoadComplete(objects: THREE.Object3D[]): THREE.Object3D[] {
// 如果没有 group,则创建一个新的 group
if (!this.group) {
this.group = new THREE.Group()
this.group.name = GROUP_NAME
}
return [this.group]
}
/** /**
* *
*/ */

2
src/model/itemTypeDefine/measure/MeasureMeta.ts → src/model/itemType/measure/MeasureMeta.ts

@ -1,5 +1,5 @@
import { defineItemType } from '@/runtime/DefineItemType.ts' import { defineItemType } from '@/runtime/DefineItemType.ts'
import Measure from '@/model/itemTypeDefine/measure/Measure.ts' import Measure from '@/model/itemType/measure/Measure.ts'
export default defineItemType({ export default defineItemType({
name: 'measure', name: 'measure',

0
src/model/itemTypeDefine/point/PointMeta.ts → src/model/itemType/point/PointMeta.ts

0
src/model/itemTypeDefine/store/QueueMeta.ts → src/model/itemType/store/QueueMeta.ts

Loading…
Cancel
Save