Compare commits

...

15 Commits

  1. 5
      package.json
  2. BIN
      public/013.stl
  3. BIN
      public/015.stl
  4. BIN
      public/018.stl
  5. 54
      src/components/check/index.vue
  6. 1
      src/libs/utils.ts
  7. 11
      src/router/routes.ts
  8. 181
      src/views/dataModel/index.vue
  9. 80
      src/views/home/index.vue

5
package.json

@ -1,7 +1,7 @@
{
"name": "matrix-spray-web",
"type": "module",
"version": "0.0.8",
"version": "0.0.13",
"description": "",
"author": "",
"license": "ISC",
@ -26,7 +26,9 @@
"prettier": "prettier --write ."
},
"dependencies": {
"@dataview/datav-vue3": "0.0.0-test.1672506674342",
"@element-plus/icons-vue": "^2.3.1",
"@types/three": "^0.176.0",
"autoprefixer": "^10.4.20",
"axios": "1.8.2",
"cssnano": "^7.0.6",
@ -43,6 +45,7 @@
"postcss-url": "^10.1.3",
"postcss-viewport-units": "^0.1.6",
"postcss-write-svg": "^3.0.1",
"three": "^0.176.0",
"vue": "^3.5.13",
"vue-router": "^4.5.0",
"ws": "^8.18.1"

BIN
public/013.stl

BIN
public/015.stl

BIN
public/018.stl

54
src/components/check/index.vue

@ -40,6 +40,11 @@ const onStartSelfTest = () => {
}
}
const statusMap: Record<string, Record<string, string>> = {
doorOrigin: {
name: '门',
value: '',
type: 'door',
},
gantryXOrigin: {
name: '机械臂x轴',
value: 'x',
@ -52,19 +57,19 @@ const statusMap: Record<string, Record<string, string>> = {
},
gantryZOrigin: {
name: '机械臂z轴',
value: 'y',
value: 'z',
type: 'axis',
},
dualRobotJoint1Origin: {
name: '机械臂01',
value: 'largeArm',
type: 'liquid',
},
dualRobotJoint2Origin: {
name: '机械臂02',
value: 'smallArm',
dualRobotOrigin: {
name: '加液机械臂',
value: '',
type: 'liquid',
},
// dualRobotJoint2Origin: {
// name: '02',
// value: 'smallArm',
// type: 'liquid',
// },
capLiftingOrigin: {
name: '拍子电机升降',
value: '',
@ -77,12 +82,12 @@ const statusMap: Record<string, Record<string, string>> = {
},
trayLifting02Origin: {
name: '加热区02托盘升降',
value: 'heat_module_01',
value: 'heat_module_02',
type: 'heat',
},
trayLifting03Origin: {
name: '加热区03托盘升降',
value: 'heat_module_01',
value: 'heat_module_03',
type: 'heat',
},
trayLifting04Origin: {
@ -161,11 +166,14 @@ const queryContainerList = () => {
}
const resetOrign = (item: SelfStatus) => {
if (item.value === 'x' || item.value === 'y' || item.value === 'z') {
if (item.type === 'door') {
door_origin()
}
else if (item.value === 'x' || item.value === 'y' || item.value === 'z') {
gantry_origin(item.value)
}
else if (item.type === 'liquid') {
dual_robot_joint_origin(item.value)
dual_robot_origin()
}
else if (item.type === 'heat') {
tray_lifting_origin(item.value)
@ -175,6 +183,17 @@ const resetOrign = (item: SelfStatus) => {
}
}
const door_origin = async () => {
currentCommandId = Date.now().toString()
const params = {
commandId: currentCommandId,
command: `door_origin`,
params: {},
}
await homeStore.sendControl(params)
}
// TODO
// const currentPumpId = ref()
// const onPumpChange = (value: string) => {
@ -196,14 +215,12 @@ const gantry_origin = async (motor: 'x' | 'y' | 'z') => {
await homeStore.sendControl(params)
}
const dual_robot_joint_origin = async (arm: string) => {
const dual_robot_origin = async () => {
currentCommandId = Date.now().toString()
const params = {
commandId: currentCommandId,
command: 'dual_robot_joint_origin',
params: {
target: [arm],
},
command: 'dual_robot_origin',
params: {},
}
await homeStore.sendControl(params)
}
@ -311,5 +328,6 @@ const onComplete = () => {
display: grid;
grid-template-columns: 2fr 1fr 1fr;
margin-top: 5px;
height: 30px;
}
</style>

1
src/libs/utils.ts

@ -50,6 +50,7 @@ export const cmdNameMap = {
gantry_z_origin: '机械臂z轴回原点',
cap_lifting_origin: '拍子电机回原点',
tray_lifting_origin: '加热区托盘电机回原点',
door_origin: '门电机回原点',
}
export const generateColors = (count: number): string[] => {

11
src/router/routes.ts

@ -32,6 +32,17 @@ const authRoutes: RouteRecordRaw[] = [
},
},
{
path: '/dataModel',
name: 'dataModel',
component: () => import('views/dataModel/index.vue'),
meta: {
isDefault: true,
title: '数据模型',
icon: n_home,
activeIcon: s_home,
},
},
{
path: '/systemLog',
name: 'systemLog',
component: () => import('views/home/index.vue'),

181
src/views/dataModel/index.vue

@ -0,0 +1,181 @@
<script setup lang="ts">
import { BorderBox11 } from '@dataview/datav-vue3'
import * as THREE from 'three'
import { OrbitControls } from 'three/examples/jsm/controls/OrbitControls'
import { STLLoader } from 'three/examples/jsm/loaders/STLLoader'
import { onMounted, ref } from 'vue'
const container = ref<HTMLDivElement>()
let scene: THREE.Scene
let camera: THREE.PerspectiveCamera
let renderer: THREE.WebGLRenderer
let controls: OrbitControls
let mesh: THREE.Mesh
//
// const modelGroup = new THREE.Group()
const initThree = () => {
scene = new THREE.Scene()
// scene.background = new THREE.Color('#ccc')
scene.background = new THREE.Color('#041622')
//
camera = new THREE.PerspectiveCamera(
75,
800 / 500,
1,
3000,
)
camera.position.set(292, 223, 185)
camera.lookAt(0, 0, 0)
//
renderer = new THREE.WebGLRenderer({ antialias: true })
renderer.setSize(800, 500)
renderer.setPixelRatio(window.devicePixelRatio)
container.value?.appendChild(renderer.domElement)
controls = new OrbitControls(camera, renderer.domElement)
renderer.render(scene, camera)
controls.enableDamping = true
controls.addEventListener('change', () => {
renderer.render(scene, camera) //
})//
//
const ambientLight = new THREE.AmbientLight(0xFFFFFF, 0.8)
scene.add(ambientLight)
//
// const pointLight = new THREE.PointLight(0xFFFFFF, 1)
// pointLight.position.set(5, 5, 5)
// scene.add(pointLight)
// STL
const loader = new STLLoader()
// loader.load('./013.stl', (geometry) => {
// console.log('geometry', geometry)
// //
// const material = new THREE.MeshPhysicalMaterial({
// color: '#b0b0b0', //
// metalness: 1, //
// roughness: 0.1, //
// clearcoat: 1, //
// clearcoatRoughness: 0.05, //
// reflectivity: 1, //
// ior: 1.5, //
// })
// //
// mesh = new THREE.Mesh(geometry, material)
// //
// // const box = new THREE.Box3().setFromObject(mesh)
// // const center = box.getCenter(new THREE.Vector3())
// // mesh.position.sub(center) //
// mesh.position.set(10, 0, 0)
// mesh.scale.set(0.2, 0.2, 0.2)
// scene.add(mesh)
// modelGroup.add(mesh)
// })
// loader.load('./018.stl', (geometry) => {
// console.log('geometry', geometry)
// //
// const material = new THREE.MeshPhysicalMaterial({
// color: '#b0b0b0', //
// metalness: 1, //
// roughness: 0.1, //
// clearcoat: 1, //
// clearcoatRoughness: 0.05, //
// reflectivity: 1, //
// ior: 1.5, //
// })
// //
// mesh = new THREE.Mesh(geometry, material)
// //
// const box = new THREE.Box3().setFromObject(mesh)
// const center = box.getCenter(new THREE.Vector3())
// mesh.position.sub(center) //
// mesh.scale.set(0.5, 0.5, 0.5)
// scene.add(mesh)
// modelGroup.add(mesh)
// })
loader.load('./013.stl', (geometry) => {
console.log('geometry', geometry)
//
// const material = new THREE.MeshPhysicalMaterial({
// color: '#b0b0b0', //
// metalness: 1, //
// roughness: 0.1, //
// clearcoat: 1, //
// clearcoatRoughness: 0.05, //
// reflectivity: 1, //
// ior: 1.5, //
// })
const material = new THREE.MeshStandardMaterial({
color: 'red',
metalness: 0.7,
roughness: 0.2,
})
//
mesh = new THREE.Mesh(geometry, material)
//
const box = new THREE.Box3().setFromObject(mesh)
const center = box.getCenter(new THREE.Vector3())
mesh.position.sub(center) //
mesh.scale.set(0.5, 0.5, 0.5)
mesh.rotateX(Math.PI / 2)
// mesh.position.set(-100, 0, 0)
scene.add(mesh)
// modelGroup.add(mesh)
})
// modelGroup.position.set(0, 0, 0)
// AxesHelper
const axesHelper = new THREE.AxesHelper(100)
scene.add(axesHelper)
// //
// window.addEventListener('keydown', (event) => {
// if (event.key === 'ArrowUp') {
// //
// camera.position.multiplyScalar(0.9)
// }
// else if (event.key === 'ArrowDown') {
// //
// camera.position.multiplyScalar(1.1)
// }
// })
//
// const animate = () => {
// requestAnimationFrame(animate)
// controls.update()
// renderer.render(scene, camera)
// }
// animate()
}
onMounted(() => {
initThree()
})
</script>
<template>
<div class="data-content">
<BorderBox11 class="box" :color="['#1A4468', '#163A5A']" background-color="#041622" title="石墨消解仪">
<div ref="container" />
</BorderBox11>
</div>
</template>
<style scoped lang="scss">
.data-content {
padding: 0 !important;
background: rgba(0,0,0,0) !important;
}
.box {
width: 100%;
height: 100%;
padding: 60px 20px 30px;
}
</style>

80
src/views/home/index.vue

@ -1,7 +1,5 @@
<script setup lang="ts">
import { startCraft } from 'apis/crafts'
import AddLiquid from 'components/home/AddLiquid/index.vue'
import SelectCraft from 'components/home/SelectCraft/index.vue'
import SetTemperature from 'components/home/SetTemperature/index.vue'
import StartExperiment from 'components/home/StartExperiment/index.vue'
import Tube from 'components/home/Tube/index.vue'
@ -37,30 +35,30 @@ const startVisible = ref(false)
// startVisible.value = true
// }
const selectCraftVisible = ref(false)
const selectCraft = () => {
const count = homeStore.heatAreaList.filter(item => item.selected).length
if (!count) {
FtMessage.warning('请选择加热区')
return
}
selectCraftVisible.value = true
}
const executeCraftHandle = async () => {
const selectedHeatAreas = homeStore.heatAreaList.filter(item => item.selected)
if (!selectedHeatAreas.length) {
FtMessage.warning('请选择加热区')
return
}
// TODO
for (let i = 0; i < selectedHeatAreas.length; i++) {
await startCraft({
heatId: selectedHeatAreas[i].value,
})
}
FtMessage.success('工艺已开始执行')
}
// const selectCraftVisible = ref(false)
// const selectCraft = () => {
// const count = homeStore.heatAreaList.filter(item => item.selected).length
// if (!count) {
// FtMessage.warning('')
// return
// }
// selectCraftVisible.value = true
// }
//
// const executeCraftHandle = async () => {
// const selectedHeatAreas = homeStore.heatAreaList.filter(item => item.selected)
// if (!selectedHeatAreas.length) {
// FtMessage.warning('')
// return
// }
// // TODO
// for (let i = 0; i < selectedHeatAreas.length; i++) {
// await startCraft({
// heatId: selectedHeatAreas[i].value,
// })
// }
// FtMessage.success('')
// }
const setTemperatureVisible = ref(false)
const currentTemperatureId = ref('')
@ -330,18 +328,18 @@ const take_photo = async () => {
<!-- </ft-button> -->
<!-- </el-col> -->
<!-- </el-row> -->
<el-row :gutter="10">
<el-col :span="12">
<ft-button @click="selectCraft">
选择工艺
</ft-button>
</el-col>
<el-col :span="12">
<ft-button :click-handle="executeCraftHandle">
执行工艺
</ft-button>
</el-col>
</el-row>
<!-- <el-row :gutter="10"> -->
<!-- <el-col :span="12"> -->
<!-- <ft-button @click="selectCraft"> -->
<!-- 选择工艺 -->
<!-- </ft-button> -->
<!-- </el-col> -->
<!-- <el-col :span="12"> -->
<!-- <ft-button :click-handle="executeCraftHandle"> -->
<!-- 执行工艺 -->
<!-- </ft-button> -->
<!-- </el-col> -->
<!-- </el-row> -->
<el-row :gutter="10">
<el-col :span="24">
<ft-button @click="addLiquid">
@ -363,12 +361,12 @@ const take_photo = async () => {
</el-row>
<el-row :gutter="10">
<el-col :span="12">
<ft-button :click-handle="move_to_heat_area">
<ft-button :click-handle="move_to_heat_area" :disabled="!systemStore.systemStatus.gantryArm.idle">
移至加热
</ft-button>
</el-col>
<el-col :span="12">
<ft-button :click-handle="move_to_solution_area">
<ft-button :click-handle="move_to_solution_area" :disabled="!systemStore.systemStatus.gantryArm.idle">
移至加液
</ft-button>
</el-col>
@ -403,7 +401,7 @@ const take_photo = async () => {
</el-row>
<StartExperiment v-if="startVisible" @ok="startVisible = false" @cancel="startVisible = false" />
<SelectCraft v-if="selectCraftVisible" @ok="selectCraftVisible = false" @cancel="selectCraftVisible = false" />
<!-- <SelectCraft v-if="selectCraftVisible" @ok="selectCraftVisible = false" @cancel="selectCraftVisible = false" /> -->
<SetTemperature v-if="setTemperatureVisible" :id="currentTemperatureId" @ok="setTemperatureVisible = false" @cancel="setTemperatureVisible = false" />
<AddLiquid v-if="addLiquidVisible" @ok="addLiquidVisible = false" @cancel="addLiquidVisible = false" />
</div>

Loading…
Cancel
Save