You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
84 lines
2.6 KiB
84 lines
2.6 KiB
/** @odoo-module **/
|
|
import { registry } from "@web/core/registry";
|
|
import { isBinarySize } from "@web/core/utils/binary";
|
|
import { url } from "@web/core/utils/urls";
|
|
import {ImageField, imageCacheKey, imageField} from "@web/views/fields/image/image_field";
|
|
import { useRef, useEffect } from "@odoo/owl";
|
|
const { useState } = owl;
|
|
|
|
/**
|
|
* Create canvas for adding 3D model
|
|
*/
|
|
export class Field3D extends ImageField {
|
|
setup(){
|
|
super.setup();
|
|
this.useRef = useRef("field_3d")
|
|
this.elId = `#${this.props.name}_el`
|
|
this.state = useState({
|
|
isValid: true,
|
|
value: url('/model_viewer_widget/static/src/assets/3d.glb')
|
|
});
|
|
this.canvasEl = '<canvas class="view3d-canvas"/>'
|
|
useEffect(() => {
|
|
this.createCanvas()
|
|
if (isBinarySize(this.props.record.data[this.props.name])) {
|
|
this.state.value = url("/web/content", {
|
|
model: this.props.record.resModel,
|
|
id: this.props.record.resId,
|
|
field: this.props.name,
|
|
unique: imageCacheKey(this.rawCacheKey),
|
|
});
|
|
} else if(this.props.record.data[this.props.name]){
|
|
this.state.value = `data:model/gltf-binary;base64, ${this.props.record.data[this.props.name]}`
|
|
}
|
|
this.view3D = new View3D(this.elId, {
|
|
src: this.state.value
|
|
});
|
|
})
|
|
}
|
|
/**
|
|
* At the time of removing file, a default 3D model will be displayed
|
|
*/
|
|
onFileRemove(){
|
|
super.onFileRemove();
|
|
this.createCanvas()
|
|
this.state.value = url('/model_viewer_widget/static/src/assets/3d.glb');
|
|
if(this.view3D){
|
|
this.view3D.load(this.state.value)
|
|
}
|
|
}
|
|
/**
|
|
* Create canvas for adding 3D model
|
|
*/
|
|
createCanvas(){
|
|
var elem = this.useRef.el.querySelector(this.elId)
|
|
const prevCanvas = this.useRef.el.querySelector('canvas');
|
|
if(prevCanvas)
|
|
elem.removeChild(prevCanvas)
|
|
const canvas = document.createElement('canvas');
|
|
canvas.width = 600;
|
|
canvas.height = 500;
|
|
canvas.classList.add('view3d-canvas')
|
|
elem.appendChild(canvas);
|
|
}
|
|
/**
|
|
* At the time of uploading file, the uploaded 3D model will be displayed
|
|
*/
|
|
async onFileUploaded(info) {
|
|
super.onFileUploaded(info)
|
|
this.createCanvas()
|
|
console.log(info)
|
|
this.props.record.update({ [this.props.name]: info.data });
|
|
}
|
|
}
|
|
|
|
Field3D.acceptedFileExtensions = "*"
|
|
Field3D.template = "Field3DWidget"
|
|
|
|
export const image3D = {
|
|
...imageField,
|
|
component: Field3D,
|
|
};
|
|
|
|
|
|
registry.category("fields").add("3D_widget", image3D);
|
|
|