Browse Source

Merge remote-tracking branch 'origin/master'

master
修宁 6 months ago
parent
commit
ba7f70edc9
  1. 2
      src/core/manager/TaskManager.ts
  2. 4
      src/core/manager/WorldModel.ts
  3. 2
      src/core/manager/amr/AmrMessageManager.ts
  4. 4
      src/core/script/ModelManager.ts
  5. 0
      src/modules/amr/ptr/cl2/Cl23DGraphics.ts
  6. 4
      src/modules/amr/ptr/cl2/Cl23dObject.ts
  7. 77
      src/modules/amr/ptr/cl2/Cl2Entity.ts
  8. 0
      src/modules/amr/ptr/cl2/Cl2Interaction.ts
  9. 0
      src/modules/amr/ptr/cl2/Cl2PropertySetter.ts
  10. 2
      src/modules/amr/ptr/cl2/Cl2Renderer.ts
  11. 0
      src/modules/amr/ptr/cl2/index.ts
  12. 0
      src/modules/amr/ptr/clx/Clx3dObject.ts
  13. 2
      src/modules/amr/ptr/clx/ClxEntity.ts
  14. 0
      src/modules/amr/ptr/clx/ClxInteraction.ts
  15. 0
      src/modules/amr/ptr/clx/ClxPropertySetter.ts
  16. 2
      src/modules/amr/ptr/clx/ClxRenderer.ts
  17. 3
      src/modules/amr/ptr/clx/index.ts
  18. 144
      src/views/device/locations.vue
  19. 142
      src/views/device/vehicles.vue

2
src/core/manager/TaskManager.ts

@ -1,7 +1,7 @@
import * as THREE from 'three'
import gsap from 'gsap'
import Viewport from '@/core/engine/Viewport'
import Clx3dObject from "@/modules/clx/Clx3dObject";
import Clx3dObject from "@/modules/amr/ptr/clx/Clx3dObject";
export default class TaskManager implements TaskManagerIF {

4
src/core/manager/WorldModel.ts

@ -108,8 +108,8 @@ export default class WorldModel {
import('../../modules/pallet'),
import('../../modules/tote'),
import('../../modules/carton'),
import('../../modules/cl2'),
import('../../modules/clx'),
import('../../modules/amr/ptr/cl2'),
import('../../modules/amr/ptr/clx'),
import('../../modules/charger')
]).then(() => {

2
src/core/manager/amr/AmrMessageManager.ts

@ -1,5 +1,5 @@
import { AmrMsg, AmrMsg10010, AmrMsg10050, AmrMsg10060, AmrMsg10110, AmrMsg10120, AmrMsg20050 } from '@/core/manager/amr/AmrMessageDefine'
import Cl23dObject from '@/modules/cl2/Cl23dObject'
import Cl23dObject from '@/modules/amr/ptr/cl2/Cl23dObject'
import Viewport from '@/core/engine/Viewport'
export default class AmrMessageManager {

4
src/core/script/ModelManager.ts

@ -4,8 +4,8 @@ import * as THREE from 'three'
import { getMatrixFromTf } from '@/core/ModelUtils.ts'
import type { Object3DLike } from '@/types/ModelTypes.ts'
import TaskManager from '../manager/TaskManager.ts'
import Cl2Entity from '@/modules/cl2/Cl2Entity.ts'
import ClxEntity from '@/modules/clx/ClxEntity.ts'
import Cl2Entity from '@/modules/amr/ptr/cl2/Cl2Entity.ts'
import ClxEntity from '@/modules/amr/ptr/clx/ClxEntity.ts'
import { getRenderer } from '@/core/manager/ModuleManager.ts'
export default class ModelManager implements IControls, Model {

0
src/modules/cl2/Cl23DGraphics.ts → src/modules/amr/ptr/cl2/Cl23DGraphics.ts

4
src/modules/cl2/Cl23dObject.ts → src/modules/amr/ptr/cl2/Cl23dObject.ts

@ -3,8 +3,8 @@ import {CSG} from 'three-csg-ts'
import gsap from 'gsap'
import mqtt from 'mqtt'
import {Euler} from 'three/src/math/Euler'
import Cl2Entity from '@/modules/cl2/Cl2Entity'
import Cl23DGraphics from "@/modules/cl2/Cl23DGraphics"
import Cl2Entity from '@/modules/amr/ptr/cl2/Cl2Entity'
import Cl23DGraphics from "@/modules/amr/ptr/cl2/Cl23DGraphics"
import {
AmrErrorCode,
AmrMsg,

77
src/modules/cl2/Cl2Entity.ts → src/modules/amr/ptr/cl2/Cl2Entity.ts

@ -3,7 +3,7 @@ import BaseEntity from '@/core/base/BaseItemEntity.ts'
import type Viewport from '@/core/engine/Viewport.ts'
import gsap from 'gsap'
import { nextTick } from 'vue'
import Cl23dObject, {type Cl2Task} from "@/modules/cl2/Cl23dObject";
import Cl23dObject from "./Cl23dObject";
/**
* CL2
* 0.4m/ss // a max 1.2m/s
@ -16,82 +16,7 @@ export default class Cl2Entity extends BaseEntity {
}
// 移动
addRobotTask(task: Cl2Task) {
if (task.id === 10010) {
let startX = task.content.StartX
let startY = task.content.StartY
if (task.content.Link?.length > 0) {
for (let i = 0; i < task.content.Link.length; i++) {
const link = task.content.Link[i];
let moveDirection: 0 | 1 | 2 | 3 | 15 = 15;
// 计算 移动方向
if (startX !== link.X && startY !== link.Y) {
throw new Error('Invalid task');
} else if (startX === link.X) {
if (startY < link.Y && link.Speed > 0 || startY > link.Y && link.Speed < 0) {
moveDirection = 3
} else {
moveDirection = 1
}
} else {
if (startX > link.X && link.Speed > 0 || startX < link.X && link.Speed < 0) {
moveDirection = 0
} else {
moveDirection = 2
}
}
this.taskQueue.add(this.createTask('ROTATION',
() => this.cl2Object.addRotation(moveDirection * Math.PI/2)
))
this.taskQueue.add(this.createTask('TRAVEL',
() => this.cl2Object.addTravel(Model.getPositionByLogicXY(link.X, link.Y) ,Math.abs(link.Speed/1000))
))
startX = link.X
startY = link.Y
}
}
//移动
if (task.content.OperationType === 0) {
} else if (task.content.OperationType === 1) {
} else if (task.content.OperationType === 2) {
} else if (task.content.OperationType === 3) {
} else if (task.content.OperationType === 4) {
// 取货
if (task.content.PickMode === 1) {
const gh = task.content.GoodsSlotHeight/1000
this.addArmRaise(gh)
this.addArmExtender()
// this.addArmRaise(gh + 0.1)
this.addLoad(task.content.GoodsId)
this.addArmRetractor()
this.addArmLower()
// 放货
} else if (task.content.PickMode === 2) {
this.addArmRaise(task.content.GoodsSlotHeight/1000 + 0.2)
this.addArmExtender()
this.addArmLower()
this.addUnload(task.content.GoodsId, '')
this.addArmRetractor()
}
} else if (task.content.OperationType === 5) {
} else if (task.content.OperationType === 135) {
} else if (task.content.OperationType === 136) {}
}
}
// 抬
addArmRaise(height: number) {

0
src/modules/cl2/Cl2Interaction.ts → src/modules/amr/ptr/cl2/Cl2Interaction.ts

0
src/modules/cl2/Cl2PropertySetter.ts → src/modules/amr/ptr/cl2/Cl2PropertySetter.ts

2
src/modules/cl2/Cl2Renderer.ts → src/modules/amr/ptr/cl2/Cl2Renderer.ts

@ -1,7 +1,7 @@
import * as THREE from 'three'
import BaseRenderer from '@/core/base/BaseRenderer.ts'
import Constract from '@/core/Constract.ts'
import Cl23dObject from "@/modules/cl2/Cl23dObject";
import Cl23dObject from "./Cl23dObject";
/**
* ptr侧叉渲染器

0
src/modules/cl2/index.ts → src/modules/amr/ptr/cl2/index.ts

0
src/modules/clx/Clx3dObject.ts → src/modules/amr/ptr/clx/Clx3dObject.ts

2
src/modules/clx/ClxEntity.ts → src/modules/amr/ptr/clx/ClxEntity.ts

@ -2,7 +2,7 @@ import BaseEntity from '@/core/base/BaseItemEntity.ts'
import type Viewport from '@/core/engine/Viewport.ts'
import * as THREE from 'three'
import gsap from 'gsap'
import Clx3dObject from '@/modules/clx/Clx3dObject.ts'
import Clx3dObject from './Clx3dObject.ts'
export default class ClxEntity extends BaseEntity {
constructor(viewport: Viewport, id: string) {

0
src/modules/clx/ClxInteraction.ts → src/modules/amr/ptr/clx/ClxInteraction.ts

0
src/modules/clx/ClxPropertySetter.ts → src/modules/amr/ptr/clx/ClxPropertySetter.ts

2
src/modules/clx/ClxRenderer.ts → src/modules/amr/ptr/clx/ClxRenderer.ts

@ -1,7 +1,7 @@
import * as THREE from 'three'
import BaseRenderer from '@/core/base/BaseRenderer.ts'
import Constract from '@/core/Constract.ts'
import Clx3dObject from "@/modules/clx/Clx3dObject";
import Clx3dObject from "./Clx3dObject";
/**
* clx渲染器

3
src/modules/clx/index.ts → src/modules/amr/ptr/clx/index.ts

@ -1,12 +1,11 @@
import { defineModule } from '@/core/manager/ModuleManager.ts'
import ClxRenderer from './ClxRenderer.ts'
import ClxInteraction from './ClxInteraction.ts'
import propertySetter from '@/modules/clx/ClxPropertySetter.ts'
import propertySetter from './ClxPropertySetter.ts'
export const ITEM_TYPE_NAME = 'clx'
export default defineModule(ITEM_TYPE_NAME, () => ({
name: ITEM_TYPE_NAME,
renderer: new ClxRenderer(ITEM_TYPE_NAME),
interaction: new ClxInteraction(ITEM_TYPE_NAME),
setter: propertySetter

144
src/views/device/locations.vue

@ -1,12 +1,144 @@
<script setup lang="ts">
import { onMounted, reactive } from "vue";
import { ElButton } from "element-plus";
import { Search } from "@element-plus/icons-vue";
import DataForm from "@/components/data-form/DataForm.vue";
import type { FormField } from "@/components/data-form/DataFormTypes.ts";
import { AgGridVue } from "ag-grid-vue3";
import { type GridOptions } from "ag-grid-enterprise";
import type { GridApi, GridReadyEvent } from "ag-grid-community";
import { localeText as localeTextCn } from "@/components/yvTable/yv-aggrid-cn.locale";
import { Request } from "@ease-forge/shared";
import lodash from "lodash";
// Props
interface ComponentProps {
}
// props
const props = withDefaults(defineProps<ComponentProps>(), {});
// State
interface ComponentState {
loading: boolean;
queryData: any;
grid1Data: Array<any>;
}
// state
const state = reactive<ComponentState>({
loading: false,
queryData: {},
grid1Data: [],
});
// Data
interface ComponentData {
formFields?: Array<FormField>;
gridSetting: Partial<GridOptions>;
api?: GridApi;
}
//
const data: ComponentData = {
formFields: [
{
dataPath: 'locCode', label: '货位编码', input: 'Input',
inputProps: {
placeholder: '货位编码',
clearable: true,
}
},
],
gridSetting: {
localeText: localeTextCn,
// suppressNoRowsOverlay: true,
// suppressLoadingOverlay: true,
//
rowSelection: "single",
columnDefs: [
{ headerName: "环境ID", field: "envId" },
{ headerName: "货位编码", field: "locCode" },
{ headerName: "位置类型", field: "locType" },
{ headerName: "路径点编码", field: "wayPoint" },
{ headerName: "货位相对于路径方向", field: "locDirection" },
{ headerName: "楼层数据", field: "catalogCode" },
{ headerName: "位置编码", field: "rack" },
{ headerName: "货架列", field: "bay" },
{ headerName: "货架层", field: "level" },
{ headerName: "货架格", field: "cell" },
{
headerName: "是否锁定", field: "isLock",
valueFormatter: params => lodash.toString(params.value) === "0" ? "否" : "是",
},
{
headerName: "是否冻结", field: "isFrozen",
valueFormatter: params => lodash.toString(params.value) === "0" ? "否" : "是",
},
{ headerName: "创建时间", field: "createAt" },
{ headerName: "创建人", field: "createBy" },
{ headerName: "更新时间", field: "updateAt" },
{ headerName: "更新人", field: "updateBy" },
],
onGridReady(event: GridReadyEvent) {
data.api = event.api;
// data.api.setServerSideDatasource({ getRows: serverSideDatasource });
},
},
};
onMounted(reload);
function reload() {
state.loading = true;
Request.request.get<Array<any>>(
"/api/workbench/DeviceManager@queryLocation",
{
params: {
...state.queryData,
},
},
).then(data => {
state.grid1Data = data;
}).finally(() => state.loading = false);
}
</script>
<template>
<div class="modeling-simulation">
locations
<div class="dashboard flex-column-container">
<div class="tools flex-item-fixed">
<ElButton :icon="Search" :loading="state.loading" @click="reload">查询</ElButton>
</div>
<DataForm
class="query-form flex-item-fixed"
style="width: 500px;"
:data="state.queryData"
:formFields="data.formFields"
:columnCount="2"
layout="bothFixed"
labelWidth="85px"
inputWidth="200px"
/>
<AgGridVue
ref="gridRef"
:class="['ag-theme-alpine', 'yv-table', 'hi-light-selected-row','allow-vertical-line', 'flex-item-fill']"
v-bind="{...data.gridSetting}"
:modelValue="state.grid1Data"
>
</AgGridVue>
</div>
</template>
<script setup>
</script>
<style lang="less">
.dashboard{
<style scoped>
.dashboard {
height: 100%;
}
.tools {
margin-bottom: 8px;
}
.query-form {
height: unset;
}
</style>

142
src/views/device/vehicles.vue

@ -1,12 +1,142 @@
<script setup lang="ts">
import { onMounted, reactive } from "vue";
import { ElButton } from "element-plus";
import { Search } from "@element-plus/icons-vue";
import DataForm from "@/components/data-form/DataForm.vue";
import type { FormField } from "@/components/data-form/DataFormTypes.ts";
import { AgGridVue } from "ag-grid-vue3";
import { type GridOptions } from "ag-grid-enterprise";
import type { GridApi, GridReadyEvent } from "ag-grid-community";
import { localeText as localeTextCn } from "@/components/yvTable/yv-aggrid-cn.locale";
import { Request } from "@ease-forge/shared";
import lodash from "lodash";
// Props
interface ComponentProps {
}
// props
const props = withDefaults(defineProps<ComponentProps>(), {});
// State
interface ComponentState {
loading: boolean;
queryData: any;
grid1Data: Array<any>;
}
// state
const state = reactive<ComponentState>({
loading: false,
queryData: {},
grid1Data: [],
});
// Data
interface ComponentData {
formFields?: Array<FormField>;
gridSetting: Partial<GridOptions>;
api?: GridApi;
}
//
const data: ComponentData = {
formFields: [
{
dataPath: 'virtualFloorCode', label: '仿真车所在楼层', input: 'Input',
inputProps: {
placeholder: '仿真车所在楼层',
clearable: true,
}
},
{
dataPath: 'isActive', label: '是否激活', input: 'Checkbox',
inputProps: {
placeholder: '是否激活',
clearable: true,
}
},
],
gridSetting: {
localeText: localeTextCn,
// suppressNoRowsOverlay: true,
// suppressLoadingOverlay: true,
//
rowSelection: "single",
columnDefs: [
{ headerName: "环境ID", field: "envId" },
{ headerName: "执行器ID", field: "executorId" },
{ headerName: "仿真车所在楼层", field: "virtualFloorCode" },
{ headerName: "仿真车所在XYZ", field: "virtualLocationAt" },
{ headerName: "仿真车配置详情", field: "virtualExecutorPayload" },
{
headerName: "是否激活", field: "isActive",
valueFormatter: params => lodash.toString(params.value) === "0" ? "否" : "是",
},
{ headerName: "创建时间", field: "createAt" },
{ headerName: "创建人", field: "createBy" },
{ headerName: "更新时间", field: "updateAt" },
{ headerName: "更新人", field: "updateBy" },
],
onGridReady(event: GridReadyEvent) {
data.api = event.api;
// data.api.setServerSideDatasource({ getRows: serverSideDatasource });
},
},
};
onMounted(reload);
function reload() {
state.loading = true;
Request.request.get<Array<any>>(
"/api/workbench/DeviceManager@queryExecutor",
{
params: {
...state.queryData,
},
},
).then(data => {
state.grid1Data = data;
}).finally(() => state.loading = false);
}
</script>
<template>
<div class="modeling-simulation">
vehicles
<div class="dashboard flex-column-container">
<div class="tools flex-item-fixed">
<ElButton :icon="Search" :loading="state.loading" @click="reload">查询</ElButton>
</div>
<DataForm
class="query-form flex-item-fixed"
style="width: 500px;"
:data="state.queryData"
:formFields="data.formFields"
:columnCount="2"
layout="bothFixed"
labelWidth="120px"
inputWidth="200px"
/>
<AgGridVue
ref="gridRef"
:class="['ag-theme-alpine', 'yv-table', 'hi-light-selected-row','allow-vertical-line', 'flex-item-fill']"
v-bind="{...data.gridSetting}"
:modelValue="state.grid1Data"
>
</AgGridVue>
</div>
</template>
<script setup>
</script>
<style lang="less">
.dashboard{
<style scoped>
.dashboard {
height: 100%;
}
.tools {
margin-bottom: 8px;
}
.query-form {
height: unset;
}
</style>

Loading…
Cancel
Save