Merge branch 'feature/绑定托盘功能' into develop
This commit is contained in:
@@ -247,3 +247,20 @@ class CuttingToolType(models.Model):
|
||||
brand_id = fields.Many2one('mrs.machine.brand', string='品牌')
|
||||
remark = fields.Text('备注')
|
||||
active = fields.Boolean('有效', default=True)
|
||||
|
||||
class CNCprocessing(models.Model):
|
||||
_name = 'cnc.processing'
|
||||
_description = "CNC加工"
|
||||
|
||||
FNo = fields.Char(string="序号")
|
||||
FPGName = fields.Char(string="程序名")
|
||||
FKnifeName = fields.Char(string="刀具名称")
|
||||
FDNo = fields.Char(string="刀号")
|
||||
FWorkType = fields.Char(string="加工类型")
|
||||
FXY = fields.Char(string="余量_X/Y")
|
||||
FZ = fields.Char(string="余量_Z")
|
||||
FJGSD = fields.Char(string="加工深度(Z)")
|
||||
FSCCD = fields.Char(string="刀具伸出长度")
|
||||
FDJSpec = fields.Char(string="刀柄型号")
|
||||
FJGDate = fields.Char(string="预计加工时间")
|
||||
FComment = fields.Char(string="备注")
|
||||
|
||||
@@ -72,9 +72,9 @@ class Tray(models.Model):
|
||||
_name = 'sf.tray'
|
||||
_description = '托盘'
|
||||
|
||||
code = fields.Char('编码')
|
||||
code = fields.Char('编码',copy=False)
|
||||
name = fields.Char('名称')
|
||||
state = fields.Selection(
|
||||
[("空闲", "空闲"), ("占用", "占用"), ("报损", "报损")],
|
||||
default=" ", string="状态")
|
||||
default="空闲", string="状态")
|
||||
active = fields.Boolean('有效', default=True)
|
||||
|
||||
@@ -13,6 +13,7 @@ access_mrs_production_materials,mrs_production_materials,model_mrs_production_ma
|
||||
access_mrs_materials_model,mrs_materials_model,model_mrs_materials_model,base.group_user,1,1,1,1
|
||||
access_mrs_processing_technology,mrs_processing_technology,model_mrs_processing_technology,base.group_user,1,1,1,1
|
||||
access_sf_tray,sf_tray,model_sf_tray,base.group_user,1,1,1,1
|
||||
access_cnc_processing,cnc_processing,model_cnc_processing,base.group_user,1,1,1,1
|
||||
|
||||
|
||||
|
||||
|
||||
|
@@ -281,14 +281,18 @@
|
||||
<field name="name">sf.tray.search</field>
|
||||
<field name="model">sf.tray</field>
|
||||
<field name="arch" type="xml">
|
||||
<search string="托盘">
|
||||
<field name="name" string="名称" filter_domain="[('name','ilike',self)]"/>
|
||||
<field name="code" string="编码" filter_domain="[('code','ilike',self)]"/>
|
||||
<!-- <field name="state" string="状态" filter_domain="[('state','ilike',self)]"/>-->
|
||||
</search>
|
||||
<group string="分组">
|
||||
<filter name="state" string="状态" domain="[]" context="{'group_by': 'state'}"/>
|
||||
</group>
|
||||
<!-- <group>-->
|
||||
|
||||
|
||||
<search string="托盘">
|
||||
<field name="name" string="名称" filter_domain="[('name','like',self)]"/>
|
||||
<field name="code" string="编码" filter_domain="[('code','like',self)]"/>
|
||||
|
||||
</search>
|
||||
<group string="分组">
|
||||
<filter name="state" string="状态" domain="[]" context="{'group_by': 'state'}"/>
|
||||
</group>
|
||||
<!-- </group>-->
|
||||
</field>
|
||||
</record>
|
||||
|
||||
@@ -308,11 +312,11 @@
|
||||
<field name="name">sf.tray.form</field>
|
||||
<field name="model">sf.tray</field>
|
||||
<field name="arch" type="xml">
|
||||
<header><field name = 'state' widget="radio" options="{'horizontal': True}"/></header>
|
||||
<form string="托盘">
|
||||
<group string="基本信息">
|
||||
<group string="基本信息" name="group1">
|
||||
<group>
|
||||
<field name="code" required="1"/>
|
||||
<field name="state" required="1"/>
|
||||
</group>
|
||||
<group>
|
||||
<field name="name" required="1"/>
|
||||
|
||||
3
sf_route_workcenter/__init__.py
Normal file
3
sf_route_workcenter/__init__.py
Normal file
@@ -0,0 +1,3 @@
|
||||
# -*-coding:utf-8-*-
|
||||
from . import models
|
||||
from . import report
|
||||
26
sf_route_workcenter/__manifest__.py
Normal file
26
sf_route_workcenter/__manifest__.py
Normal file
@@ -0,0 +1,26 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
# Part of Odoo. See LICENSE file for full copyright and licensing details.
|
||||
{
|
||||
'name': '机企猫藏智能工厂 工序',
|
||||
'version': '1.0',
|
||||
'summary': '智能工厂工作中心工序',
|
||||
'sequence': 1,
|
||||
'description': """
|
||||
在本模块,同步资源库
|
||||
""",
|
||||
'category': 'YZ',
|
||||
'website': 'https://www.sf.cs.jikimo.com',
|
||||
'depends': ['mrp', 'sf_base','hr_holidays'],
|
||||
'data': [
|
||||
'views/sf_tray_view.xml',
|
||||
'views/sf_workorder.xml',
|
||||
'report/sf_tray_report.xml'
|
||||
],
|
||||
'demo': [
|
||||
],
|
||||
'qweb': [
|
||||
],
|
||||
'installable': True,
|
||||
'application': False,
|
||||
'auto_install': False,
|
||||
}
|
||||
2
sf_route_workcenter/models/__init__.py
Normal file
2
sf_route_workcenter/models/__init__.py
Normal file
@@ -0,0 +1,2 @@
|
||||
# -*-coding:utf-8-*-
|
||||
from . import workcenter
|
||||
207
sf_route_workcenter/models/workcenter.py
Normal file
207
sf_route_workcenter/models/workcenter.py
Normal file
@@ -0,0 +1,207 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
# Part of SmartGo. See LICENSE file for full copyright and licensing details.
|
||||
import base64
|
||||
import logging
|
||||
import math
|
||||
|
||||
import qrcode
|
||||
|
||||
from io import BytesIO
|
||||
from odoo import api, fields, models
|
||||
import barcode
|
||||
from barcode.writer import ImageWriter
|
||||
from pystrich.code128 import Code128Encoder
|
||||
from odoo.exceptions import UserError
|
||||
|
||||
_logger = logging.getLogger(__name__)
|
||||
|
||||
|
||||
class CNCprocessing(models.Model):
|
||||
_inherit = 'cnc.processing'
|
||||
_description = "CNC加工"
|
||||
|
||||
workorder_id = fields.Many2one('mrp.workorder' ,string="工单")
|
||||
|
||||
|
||||
class Tray(models.Model):
|
||||
_inherit = 'sf.tray'
|
||||
_description = '托盘'
|
||||
qr_image = fields.Binary(string="托盘二维码", compute='compute_qr_image')
|
||||
|
||||
production_id = fields.Many2one('mrp.production', string='制造订单',
|
||||
related='workorder_id.production_id'
|
||||
)
|
||||
workorder_id = fields.Many2one('mrp.workorder', string="工单"
|
||||
)
|
||||
|
||||
@api.onchange('production_id')
|
||||
def updateTrayState(self):
|
||||
|
||||
if self.workorder_id != False:
|
||||
self.state = '占用'
|
||||
else:
|
||||
self.state = '空闲'
|
||||
|
||||
def unclamp(self):
|
||||
self.workorder_id = False
|
||||
self.production_id = False
|
||||
self.state = '空闲'
|
||||
|
||||
@api.depends('code')
|
||||
def compute_qr_image(self):
|
||||
for item in self:
|
||||
if not item.code:
|
||||
item.qr_image = False
|
||||
continue
|
||||
# 根据code动态生成二维码图片
|
||||
# qr = qrcode.QRCode(
|
||||
# version=1,
|
||||
# error_correction=qrcode.constants.ERROR_CORRECT_L,
|
||||
# box_size=10,
|
||||
# border=4,
|
||||
# )
|
||||
# qr.add_data(item.code)
|
||||
# qr.make(fit=True)
|
||||
# img = qr.make_image()
|
||||
# 生成条形码文件
|
||||
# bar = barcode.get("ean13", "123456789102", writer=ImageWriter())
|
||||
# a = bar.get_fullcode()
|
||||
# b = bar.save('occ')
|
||||
# 生成条形码图片
|
||||
partner_encoder = Code128Encoder(item.code)
|
||||
# 转换bytes流
|
||||
temp = BytesIO()
|
||||
partner_encoder.save(temp)
|
||||
# img.save(temp, format='PNG')
|
||||
qr_image = base64.b64encode(temp.getvalue())
|
||||
item.qr_image = qr_image
|
||||
|
||||
|
||||
'''
|
||||
工单绑定托盘信息
|
||||
'''
|
||||
|
||||
|
||||
class MrpWorkOrder(models.Model):
|
||||
_inherit = 'mrp.workorder'
|
||||
_description = '工单'
|
||||
|
||||
tray_id = fields.Many2one('sf.tray', string="托盘")
|
||||
tray_code = fields.Char(
|
||||
string='托盘编码',
|
||||
related='tray_id.code')
|
||||
tray_state = fields.Selection(
|
||||
string='托盘状态',
|
||||
related='tray_id.state')
|
||||
|
||||
# def get_tray_info(self):
|
||||
# @api.onchange('X_axis', 'Y_axis', 'Z_axis')
|
||||
# def get_center_point(self):
|
||||
# return 'X:%s,Y:%s,Z:%s' % (self.X_axis, self.Y_axis, self.Z_axis)
|
||||
# 加工面
|
||||
surface = fields.Selection([("前面", "前面"), ("后面", "后面"), ("左面", "左面"), ("右面", "右面"),
|
||||
("上面", "上面")], required=True, default="顶面", string="加工面")
|
||||
material_center_point = fields.Char(string='配料中心点')
|
||||
X1_axis = fields.Float(string='Lx1', default=0)
|
||||
Y1_axis = fields.Float(string='Ly1', default=0)
|
||||
Z1_axis = fields.Float(string='Lz1', default=0)
|
||||
X2_axis = fields.Float(string='Lx2', default=0)
|
||||
Y2_axis = fields.Float(string='Ly2', default=0)
|
||||
Z2_axis = fields.Float(string='Lz2', default=0)
|
||||
X3_axis = fields.Float(string='Fx3', default=0)
|
||||
Y3_axis = fields.Float(string='Fy3', default=0)
|
||||
Z3_axis = fields.Float(string='Fz3', default=0)
|
||||
X4_axis = fields.Float(string='Fx4', default=0)
|
||||
Y4_axis = fields.Float(string='Fy4', default=0)
|
||||
Z4_axis = fields.Float(string='Fz4', default=0)
|
||||
X5_axis = fields.Float(string='Rx5', default=0)
|
||||
Y5_axis = fields.Float(string='Ry5', default=0)
|
||||
Z5_axis = fields.Float(string='Rz5', default=0)
|
||||
X6_axis = fields.Float(string='Rx6', default=0)
|
||||
Y6_axis = fields.Float(string='Ry6', default=0)
|
||||
Z6_axis = fields.Float(string='Rz6', default=0)
|
||||
X7_axis = fields.Float(string='Bx7', default=0)
|
||||
Y7_axis = fields.Float(string='By7', default=0)
|
||||
Z7_axis = fields.Float(string='Bz7', default=0)
|
||||
X8_axis = fields.Float(string='Bx8', default=0)
|
||||
Y8_axis = fields.Float(string='By8', default=0)
|
||||
Z8_axis = fields.Float(string='Bz8', default=0)
|
||||
X9_axis = fields.Float(string='Uz9', default=0)
|
||||
Y9_axis = fields.Float(string='Uz9', default=0)
|
||||
Z9_axis = fields.Float(string='Uz9', default=0)
|
||||
X10_axis = fields.Float(string='Uz10', default=0)
|
||||
Y10_axis = fields.Float(string='Uz10', default=0)
|
||||
Z10_axis = fields.Float(string='Uz10', default=0)
|
||||
|
||||
# 扫码绑定托盘方法
|
||||
def gettray(self):
|
||||
return ""
|
||||
|
||||
# 计算配料中心点和与x轴倾斜度方法
|
||||
def getcenter(self):
|
||||
x1 = self.X1_axis
|
||||
x2 = self.X2_axis
|
||||
x3 = self.X3_axis
|
||||
x4 = self.X4_axis
|
||||
x5 = self.X5_axis
|
||||
x6 = self.X6_axis
|
||||
x7 = self.X7_axis
|
||||
x8 = self.X8_axis
|
||||
y1 = self.Y1_axis
|
||||
y2 = self.Y2_axis
|
||||
y3 = self.Y3_axis
|
||||
y4 = self.Y4_axis
|
||||
y5 = self.Y5_axis
|
||||
y6 = self.Y6_axis
|
||||
y7 = self.Y7_axis
|
||||
y8 = self.Y8_axis
|
||||
z1 = self.Z9_axis
|
||||
x0 = ((x3 - x4) * (x2 * y1 - x1 * y2) - (x1 - x2) * (x4 * y3 - x3 * y4)) / (
|
||||
(x3 - x4) * (y1 - y2) - (x1 - x2) * (y3 - y4))
|
||||
y0 = ((y3 - y4) * (y2 * x1 - y1 * x2) - (y1 - y2) * (y4 * x3 - y3 * x4)) / (
|
||||
(y3 - y4) * (x1 - x2) - (y1 - y2) * (x3 - x4))
|
||||
x1 = ((x7 - x8) * (x6 * y5 - x5 * y7) - (x5 - x6) * (x8 * y7 - x7 * y8)) / (
|
||||
(x7 - x8) * (y5 - y6) - (x5 - x6) * (y7 - y8));
|
||||
y1 = ((y7 - y8) * (y6 * x5 - y5 * x7) - (y5 - y6) * (y8 * x7 - y7 * x8)) / (
|
||||
(y7 - y8) * (x5 - x6) - (y5 - y6) * (x7 - x8))
|
||||
x = (x0 + x1) / 2
|
||||
y = (y0 + y1) / 2
|
||||
z = z1 / 2
|
||||
|
||||
jd = math.atan2((x7 - x8), (y7 - y8))
|
||||
jdz = jd * 180 / math.pi
|
||||
print("(%s,%s)" % (x, y))
|
||||
self.material_center_point = ("(%s,%s,%s)" % (x, y, z))
|
||||
self.X_deviation_angle = jdz
|
||||
|
||||
X_deviation_angle = fields.Integer(string="X轴偏差度", default=0)
|
||||
|
||||
test_results = fields.Selection([("合格", "合格"), ("返工", "返工"), ("报废", "报废")], string="检测结果")
|
||||
|
||||
cnc_ids = fields.One2many("cnc.processing",'workorder_id', string="CNC加工")
|
||||
# @api.depends('tray_id')
|
||||
# def updateTrayState(self):
|
||||
#
|
||||
# for item in self:
|
||||
# if item.tray_code == False:
|
||||
# continue
|
||||
# trayInfo = self.env['sf.tray'].sudo.search([('code', '=', item.tray_code)])
|
||||
# if trayInfo:
|
||||
# trayInfo.update(
|
||||
# {
|
||||
# 'production_id': item.production_id,
|
||||
# 'state': "占用",
|
||||
# }
|
||||
# )
|
||||
|
||||
|
||||
'''
|
||||
制造订单绑定托盘信息
|
||||
'''
|
||||
|
||||
|
||||
class MrpProduction(models.Model):
|
||||
_inherit = 'mrp.production'
|
||||
_description = "制造订单"
|
||||
|
||||
tray_ids = fields.One2many('sf.tray', 'production_id', string="托盘")
|
||||
50
sf_route_workcenter/report/sf_tray_report.xml
Normal file
50
sf_route_workcenter/report/sf_tray_report.xml
Normal file
@@ -0,0 +1,50 @@
|
||||
<odoo>
|
||||
<data>
|
||||
|
||||
<record id="sf_tray1" model="report.paperformat">
|
||||
<field name="name">Dymo Label Sheet</field>
|
||||
<field name="default" eval="True"/>
|
||||
<field name="format">custom</field>
|
||||
<field name="page_height">100</field>
|
||||
<field name="page_width">60</field>
|
||||
<field name="orientation">Landscape</field>
|
||||
<field name="margin_top">0</field>
|
||||
<field name="margin_bottom">0</field>
|
||||
<field name="margin_left">0</field>
|
||||
<field name="margin_right">0</field>
|
||||
<field name="disable_shrinking" eval="True"/>
|
||||
<field name="dpi">96</field>
|
||||
</record>
|
||||
|
||||
<record id="label_sf_tray_code" model="ir.actions.report">
|
||||
<field name="name">打印条形码</field>
|
||||
<field name="model">sf.tray</field>
|
||||
<field name="report_type">qweb-pdf</field>
|
||||
<field name="report_name">sf_route_workcenter.sf_tray_template</field>
|
||||
<field name="report_file">sf_route_workcenter.sf_tray_template</field>
|
||||
<field name="binding_model_id" ref="model_sf_tray"/>
|
||||
<field name="binding_type">report</field>
|
||||
<field name="paperformat_id" ref="sf_route_workcenter.sf_tray1"/>
|
||||
|
||||
</record>
|
||||
|
||||
<template id="sf_tray_template">
|
||||
<t t-call="web.html_container">
|
||||
<t t-call="web.external_layout">
|
||||
<t t-foreach="docs" t-as="o">
|
||||
<div class="page">
|
||||
|
||||
<div t-field="o.code"
|
||||
t-options="{'widget': 'barcode', 'width': 600, 'height': 100, 'img_style': 'width:350px;height:60px'}"/>
|
||||
<div t-field="o.code" style="text-align: center"/>
|
||||
</div>
|
||||
|
||||
</t>
|
||||
</t>
|
||||
</t>
|
||||
|
||||
</template>
|
||||
|
||||
|
||||
</data>
|
||||
</odoo>
|
||||
29
sf_route_workcenter/views/sf_tray_view.xml
Normal file
29
sf_route_workcenter/views/sf_tray_view.xml
Normal file
@@ -0,0 +1,29 @@
|
||||
<odoo>
|
||||
<data>
|
||||
<record id="sf_tray_form_inherit" model="ir.ui.view">
|
||||
<field name="name">托盘条形码生成</field>
|
||||
<field name="model">sf.tray</field>
|
||||
<field name="inherit_id" ref="sf_base.sf_tray_form"/>
|
||||
<field name="arch" type="xml">
|
||||
<xpath expr="//group[@name='group1']" position="after">
|
||||
<notebook>
|
||||
<page string="生成条形码">
|
||||
<field name='qr_image' widget="image"/>
|
||||
<group>
|
||||
<field name='production_id' readonly="1"
|
||||
attrs='{"invisible": [("production_id","=",False)]}'/>
|
||||
<field name="workorder_id"/>
|
||||
</group>
|
||||
<div class="col-12 col-lg-6 o_setting_box">
|
||||
<button type="object" class="oe_highlight" name="unclamp" string="解除装夹"
|
||||
attrs='{"invisible": [("state","=","空闲")]}'/>
|
||||
</div>
|
||||
|
||||
</page>
|
||||
|
||||
</notebook>
|
||||
</xpath>
|
||||
</field>
|
||||
</record>
|
||||
</data>
|
||||
</odoo>
|
||||
158
sf_route_workcenter/views/sf_workorder.xml
Normal file
158
sf_route_workcenter/views/sf_workorder.xml
Normal file
@@ -0,0 +1,158 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<odoo>
|
||||
<data>
|
||||
<record id="sf_install_the_tray_workorder_form_view" model="ir.ui.view">
|
||||
<field name="name">装夹工序工单</field>
|
||||
<field name="model">mrp.workorder</field>
|
||||
<field name="inherit_id" ref="mrp.mrp_production_workorder_form_view_inherit"/>
|
||||
<field name="arch" type="xml">
|
||||
<xpath expr="//page[last()]" position="after">
|
||||
<page string="装夹托盘">
|
||||
<group>
|
||||
<field name="surface" widget="radio"/>
|
||||
<div class="col-12 col-lg-6 o_setting_box">
|
||||
<button type="object" class="oe_highlight" name="gettray" string="扫描托盘"
|
||||
/>
|
||||
</div>
|
||||
</group>
|
||||
</page>
|
||||
|
||||
</xpath>
|
||||
<xpath expr="//page[last()]" position="after">
|
||||
|
||||
<page string="三元前置检测定位参数">
|
||||
<group>
|
||||
<group>
|
||||
<field name="surface" widget="radio"/>
|
||||
|
||||
</group>
|
||||
|
||||
</group>
|
||||
<group>
|
||||
<div class="o_address_city">
|
||||
<label for="X1_axis" string="Lx1"/>
|
||||
<field name='X1_axis' class="o_address_city"/>
|
||||
<label for="Y1_axis" string="Ly1"/>
|
||||
<field name='Y1_axis' class="o_address_city"/>
|
||||
<label for="Z1_axis" string="Lz1"/>
|
||||
<field name='Z1_axis' class="o_address_city"/>
|
||||
</div>
|
||||
<div class="o_address_city">
|
||||
<label for="X2_axis" string="Lx2"/>
|
||||
<field name='X2_axis' class="o_address_city"/>
|
||||
<label for="Y2_axis" string="Ly2"/>
|
||||
<field name='Y2_axis' class="o_address_city"/>
|
||||
<label for="Z2_axis" string="Lz2"/>
|
||||
<field name='Z2_axis' class="o_address_city"/>
|
||||
</div>
|
||||
|
||||
<div class="o_address_city">
|
||||
<label for="X3_axis" string="Fx3"/>
|
||||
<field name='X3_axis' class="o_address_city"/>
|
||||
<label for="Y3_axis" string="Fy3"/>
|
||||
<field name='Y3_axis' class="o_address_city"/>
|
||||
<label for="Z3_axis" string="Fz3"/>
|
||||
<field name='Z3_axis' class="o_address_city"/>
|
||||
</div>
|
||||
<div class="o_address_city">
|
||||
<label for="X4_axis" string="Fx4"/>
|
||||
<field name='X4_axis' class="o_address_city"/>
|
||||
<label for="Y4_axis" string="Fy4"/>
|
||||
<field name='Y4_axis' class="o_address_city"/>
|
||||
<label for="Z4_axis" string="Fz4"/>
|
||||
<field name='Z4_axis' class="o_address_city"/>
|
||||
</div>
|
||||
|
||||
<div class="o_address_city">
|
||||
<label for="X5_axis" string="Rx5"/>
|
||||
<field name='X5_axis' class="o_address_city"/>
|
||||
<label for="Y5_axis" string="Ry5"/>
|
||||
<field name='Y5_axis' class="o_address_city"/>
|
||||
<label for="Z5_axis" string="Rz5"/>
|
||||
<field name='Z5_axis' class="o_address_city"/>
|
||||
</div>
|
||||
<div class="o_address_city">
|
||||
<label for="X6_axis" string="Rx6"/>
|
||||
<field name='X6_axis' class="o_address_city"/>
|
||||
<label for="Y6_axis" string="Ry6"/>
|
||||
<field name='Y6_axis' class="o_address_city"/>
|
||||
<label for="Z6_axis" string="Rz6"/>
|
||||
<field name='Z6_axis' class="o_address_city"/>
|
||||
</div>
|
||||
|
||||
<div class="o_address_city">
|
||||
<label for="X7_axis" string="Bx7"/>
|
||||
<field name='X7_axis' class="o_address_city"/>
|
||||
<label for="Y7_axis" string="By7"/>
|
||||
<field name='Y7_axis' class="o_address_city"/>
|
||||
<label for="Z7_axis" string="Bz7"/>
|
||||
<field name='Z7_axis' class="o_address_city"/>
|
||||
</div>
|
||||
<div class="o_address_city">
|
||||
<label for="X8_axis" string="Bx8"/>
|
||||
<field name='X8_axis' class="o_address_city"/>
|
||||
<label for="Y8_axis" string="By8"/>
|
||||
<field name='Y8_axis' class="o_address_city"/>
|
||||
<label for="Z8_axis" string="Bz8"/>
|
||||
<field name='Z8_axis' class="o_address_city"/>
|
||||
</div>
|
||||
|
||||
<div class="o_address_city">
|
||||
<label for="X9_axis" string="Ux9"/>
|
||||
<field name='X9_axis' class="o_address_city"/>
|
||||
<label for="Y9_axis" string="Uy9"/>
|
||||
<field name='Y9_axis' class="o_address_city"/>
|
||||
<label for="Z9_axis" string="Uz9"/>
|
||||
<field name='Z9_axis' class="o_address_city"/>
|
||||
</div>
|
||||
<div class="o_address_city">
|
||||
<label for="X10_axis" string="Ux10"/>
|
||||
<field name='X10_axis' class="o_address_city"/>
|
||||
<label for="Y10_axis" string="Uy10"/>
|
||||
<field name='Y10_axis' class="o_address_city"/>
|
||||
<label for="Z10_axis" string="Uz10"/>
|
||||
<field name='Z10_axis' class="o_address_city"/>
|
||||
</div>
|
||||
|
||||
|
||||
<div class="col-12 col-lg-6 o_setting_box">
|
||||
<button type="object" class="oe_highlight" name="getcenter" string="中心定位"
|
||||
/>
|
||||
</div>
|
||||
|
||||
|
||||
</group>
|
||||
<group>
|
||||
<field name="material_center_point"/>
|
||||
<field name='X_deviation_angle'/>
|
||||
</group>
|
||||
|
||||
</page>
|
||||
|
||||
|
||||
</xpath>
|
||||
|
||||
<xpath expr="//page[last()]" position="after">
|
||||
<page string="CNC加工">
|
||||
<group>
|
||||
<field name="cnc_ids" widget="one2many"/>
|
||||
|
||||
</group>
|
||||
</page>
|
||||
|
||||
</xpath>
|
||||
|
||||
<xpath expr="//page[last()]" position="after">
|
||||
<page string="后置三元检测">
|
||||
<group>
|
||||
<field name="test_results" widget="radio"/>
|
||||
|
||||
</group>
|
||||
</page>
|
||||
|
||||
</xpath>
|
||||
|
||||
</field>
|
||||
</record>
|
||||
</data>
|
||||
</odoo>
|
||||
Reference in New Issue
Block a user