技术标签: Vue js vue.js Echart javascript
JSON转String 存数据库就行.....
<template>
<div class="i-container">
<div class="i-main" style="padding:0;">
<el-form ref="dataForm" :model="data" :rules="validRules" label-position="right" label-width="20%"
style="width: 100%;height:100%;overflow:hidden;">
<el-row style="height:100%;">
<el-col :span="12" style="height:100%;overflow:auto;padding:10px 20px;">
<div class="i-title max bold">基本信息</div>
<el-form-item label="类型" prop="type">
<el-select v-model="data.type">
<el-option v-for="item in dictData['CHART']" :key="item.value" :value="item.value" :label="item.label"></el-option>
</el-select>
</el-form-item>
<el-form-item label="组件图名称" prop="name">
<el-input v-model="data.name" placeholder="组件图名称" />
</el-form-item>
<!-- <el-form-item label="状态" prop="status">
<el-select v-model="data.status">
<el-option v-for="item in dictData['status']" :key="item.value" :value="item.value" :label="item.label"></el-option>
</el-select>
</el-form-item> -->
<div class="i-title max bold">配置信息</div>
<!-- <div v-for="(item,index) in opts" :key="index">
<el-form-item :label="item.label">
<el-input v-if="item.type=='input'" v-model="optionItem[item.code]" @change="setOptions(item.code)"/>
</el-form-item>
</div> -->
<el-form-item label="图表种类">
<el-select v-model="subConfig.tbzl" @change="initOptions(subConfig.tbzl)">
<el-option v-for="(item,index) in TBZL" :key="index" :value="item.value" :label="item.text"></el-option>
</el-select>
</el-form-item>
<!-- <el-form-item label="图表主标题">
<el-input v-model="options.title.text" style="width:50%"/>
<el-color-picker v-model="options.title.textStyle.color" show-alpha></el-color-picker>
</el-form-item>
<el-form-item label="图表副标题">
<el-input v-model="options.title.subtext" style="width:50%"/>
<el-color-picker v-model="options.title.subtextStyle.color" show-alpha></el-color-picker>
</el-form-item> -->
<el-form-item label="图表背景色">
<el-color-picker v-model="options.backgroundColor" show-alpha></el-color-picker>
</el-form-item>
<el-form-item label="开启类目">
<el-switch v-model="subConfig.legend" @change="initOptionsLegend()"></el-switch>
</el-form-item>
<el-form-item label="开启工具">
<el-switch v-model="subConfig.toolbox" @change="initOptionsToolbox()"></el-switch>
</el-form-item>
<el-form-item label="坐标系调整" v-if="subConfig.tbzl=='zbxt'">
<el-switch v-model="subConfig.posit" @change="initOptionsGrid()"></el-switch>
</el-form-item>
<div v-if="subConfig.legend">
<div class="i-title max bold">类目配置</div>
<el-row>
<el-col :span="6">
<el-form-item label="左">
<el-input v-model="options.legend.left" @change="initOptionsLegendPoist(options.legend.left,'left')" />
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="右">
<el-input v-model="options.legend.right" @change="initOptionsLegendPoist(options.legend.right,'right')" />
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="上">
<el-input v-model="options.legend.top" @change="initOptionsLegendPoist(options.legend.top,'top')"/>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="下">
<el-input v-model="options.legend.bottom" @change="initOptionsLegendPoist(options.legend.top,'bottom')"/>
</el-form-item>
</el-col>
</el-row>
</div>
<div v-if="subConfig.posit">
<div class="i-title max bold">位置|大小</div>
<el-row>
<el-col :span="6">
<el-form-item label="左">
<el-input v-model="subConfig.grid.x" @change="initOptionsGrid(subConfig.grid)" />
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="右">
<el-input v-model="subConfig.grid.x2" @change="initOptionsGrid(subConfig.grid)" />
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="上">
<el-input v-model="subConfig.grid.y" @change="initOptionsGrid(subConfig.grid)" />
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="下">
<el-input v-model="subConfig.grid.y2" @change="initOptionsGrid(subConfig.grid)" />
</el-form-item>
</el-col>
</el-row>
<!-- <el-row>
<el-col :span="12">
<el-form-item label="宽度">
<el-input v-model="subConfig.grid.width" @change="initOptionsGrid(subConfig.grid)" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="高度">
<el-input v-model="subConfig.grid.height" @change="initOptionsGrid(subConfig.grid)" />
</el-form-item>
</el-col>
</el-row> -->
</div>
<el-table :data="options.series" border fit v-if="subConfig.tbzl">
<el-table-column label="配置项">
<template slot-scope="{row, $index}">
<el-form-item label="图表类型">
<el-select v-model="row.type" @change="initOptionSeriesData(row.type,$index)">
<el-option v-for="item in selectionTBLX" :key="item.value" :value="item.value" :label="item.name"></el-option>
</el-select>
</el-form-item>
<el-form-item label="类目名称" v-if="row.type!='radar'">
<el-input v-model="row.name" @change="initOptionSeriesName(row.type,row.name,$index)" placeholder="类目名称"/>
</el-form-item>
<el-form-item label="南丁格尔图" v-if="row.type=='pie'">
<el-switch v-model="row.roseType" @change="initOptionsRoseType()"></el-switch>
</el-form-item>
<!-- <el-form-item label="图表数据">
<el-input v-text="row.data" placeholder="图表数据"/>
</el-form-item> -->
<el-form-item label="图表位置" v-if="row.type=='pie'||row.type=='radar'">
<el-row>
<el-col :span="12">
<el-form-item label="X轴">
<el-input v-model="row.Xcenter" @change="initOptionsCenter(row.Xcenter,row.Ycenter,$index,row.type)"></el-input>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="Y轴">
<el-input v-model="row.Ycenter" @change="initOptionsCenter(row.Xcenter,row.Ycenter,$index,row.type)"></el-input>
</el-form-item>
</el-col>
</el-row>
</el-form-item>
<el-form-item label="图表大小" v-if="row.type=='pie'">
<el-row>
<el-col :span="12">
<el-form-item label="内圈">
<el-input v-model="row.Xradius" @change="initOptionsRadius(row.Xradius,row.Yradius,$index,row.type)"></el-input>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="外圈">
<el-input v-model="row.Yradius" @change="initOptionsRadius(row.Xradius,row.Yradius,$index,row.type)"></el-input>
</el-form-item>
</el-col>
</el-row>
</el-form-item>
<el-form-item label="透明度" v-if="row.type=='radar'">
<el-slider v-model="row.Topacity" @change="initOptionsOpacity(row.Topacity,$index,row.type)" style="width:50%"></el-slider>
</el-form-item>
</template>
</el-table-column>
<el-table-column label width="40">
<template slot="header">
<i class="s-btn-add el-icon-circle-plus" @click="addRow('series')"></i>
</template>
<template slot-scope="{row, $index}">
<i class="s-btn-del el-icon-remove" @click="removeRow('series',$index)"></i>
</template>
</el-table-column>
</el-table>
</el-col>
<el-col :span="12" style="padding:10px 20px;height:100%">
<el-tabs v-model="activeName" style="height:100%;" class="s-tabs">
<el-tab-pane label="图形实例" name="txsl">
<div class="s-optionDiv" ref="sOpt"></div>
<el-button type="primary" class="s-btn-top" icon="el-icon-refresh" @click="doFlush()">刷新</el-button>
</el-tab-pane>
<el-tab-pane label="源码" name="ym" >
<el-input :rows="30" type="textarea" v-model="optionCode" @change="ChangeOptions(optionCode)"></el-input>
<el-button @click="doJSON(optionCode)" class="s-btn-top" type="primary" icon="el-icon-tickets">格式化</el-button>
</el-tab-pane>
<el-tab-pane label="测试数据" name="cssj" >
<el-input :rows="30" type="textarea" v-model="optionData" @change="ChangeOptionsData(optionData)"></el-input>
<el-button @click="doJSON(optionData)" class="s-btn-top" type="primary" icon="el-icon-tickets">格式化</el-button>
</el-tab-pane>
</el-tabs>
</el-col>
</el-row>
</el-form>
</div>
<div class="i-footer border">
<el-button :loading="loading" type="primary" icon="el-icon-check" @click="update()">提交</el-button>
</div>
</div>
</template>
<script>
import echarts from 'echarts'
import { loadEntity, updateEntity, saveEntity,dictData,dictLoad } from "./data";
export default {
props: {
params: {
required: true,
default: {}
}
},
data() {
return {
activeName:"txsl",
loading: false,
dictData,
optionItem:{},
data: {},
chart:null,
// opts:[
// {label:"图表主标题",code:"title.text",type:"input",dict:""},
// {label:"主标题颜色",code:"title.textStyle.color",type:"input",dict:""},
// {label:"图表副标题",code:"title.subtext",type:"input",dict:""},
// {label:"副标题颜色",code:"title.subtextStyle.color",type:"input",dict:"",children:[
// ]},
// ],
TBZL: [
{
text: '坐标系图',
value:'zbxt',
TBLX: [
{ "name": "柱状图", "value": "bar", "ptype": "zbxt" },
{ "name": "折线图", "value": "line", "ptype": "zbxt" },
]
},
{
text: '非坐标系图',
value:'fzbxt',
TBLX: [
{ "name": "饼图", "value": "pie", "ptype": "fzbxt" },
{ "name": "雷达图", "value": "radar", "ptype": "fzbxt" },
]
},
],
options:{
legend:{},
series:[],
title:{
text:null,
textStyle:{},
subtext:null,
subtextStyle:{}
},
},
toption:{
},
optionCode:null,
optionData:null,
subConfig:{
legend:true,
grid:{},
},
validRules: {
name: [
{ max: 255, message: "长度不能超过255", trigger: "blur" }
]
,option: [
{ max: 2000, message: "长度不能超过2000", trigger: "blur" }
]
,data: [
{ max: 2000, message: "长度不能超过2000", trigger: "blur" }
]
,type: [
{ max: 255, message: "长度不能超过255", trigger: "blur" }
]
}
};
},
computed: {
selectionTBLX: {
get: function() {
let _this = this;
return this.TBZL.filter(function(item) {
return item.value == _this.subConfig.tbzl;
})[0].TBLX;
}
}
},
watch:{
options:{
immediate:false,
deep:true,
handler(){
const item = this.$refs.sOpt
this.chart = echarts.init(item);
this.chart.setOption(this.options,true);
this.optionCode =JSON.stringify(this.options);
this.optionData =JSON.stringify(this.options.series)
this.optionCode=this.doJSON(this.optionCode)
this.optionData=this.doJSON(this.optionData)
}
},
},
mounted() {
let _this = this;
this.dictLoad();
const id= this.params.id;
if (id) {
loadEntity({ id: id }).then(function(response) {
_this.data = response.data;
_this.options = JSON.parse(_this.data.options);
//如果数据类型是折线图或柱状图, 则显示坐标系图 同时取位置信息出来
if(_this.options.series[0].type=='line'||_this.options.series[0].type=='bar'){
_this.subConfig.tbzl="zbxt";
if(_this.options.grid!=null){
_this.subConfig.posit=true;
_this.subConfig.grid = _this.options.grid;
}
}else{
_this.subConfig.tbzl="fzbxt";
}
//有工具开启工具栏
if(_this.options.toolbox!=null){
_this.subConfig.toolbox=true;
}
});
}
},
methods: {
dictLoad,
setOptions(pcode){
const val = this.optionItem[pcode]
const codes = pcode.split(".")
let data = this.options;
const size = codes.length;
for(let i=0; i<size; i++){
const code = codes[i];
if((i+1)==size){
data[code] = val;
}else{
if(!data[code]){
this.$set(data,code,{})
}
data = data[code];
}
}
},
update() {
let _this = this;
this.$refs.dataForm.validate((valid)=>{
if(valid){
if (_this.data.id) {
_this.loading = true
_this.data.options = JSON.stringify(_this.options);
updateEntity(this.data).then(function () {
_this.loading = false
_this.Alert("提交成功");
_this.close();
});
} else {
_this.loading = true
_this.data.options = JSON.stringify(_this.options);
saveEntity(_this.data).then(function () {
_this.loading = false
_this.Alert("提交成功");
_this.close();
});
}
}
})
},
close() {
this.$emit("close", { type: "edit" });
},
addRow(key) {
if (!this.options[key]) {
this.$set(this.options, key, []);
}
this.options[key].push({});
},
removeRow(key, index) {
this.options[key].splice(index, 1);
},
doFlush(){
this.chart.setOption(this.options,true);
},
ChangeOptions(code){
this.options = JSON.parse(code);
},
ChangeOptionsData(code){
this.options.series = JSON.parse(code);
},
/**
* 格式化JSON
*/
doJSON(txt,sc){
sc = sc?sc:" ";
txt = txt.replace(/\-\-(.+)\n/ig,function(code){
return code.replace(/\[/ig,"#ZKL#").replace(/\]/ig,"#ZKR#").replace(/\{/ig,"#DKL#").replace(/\}/ig,"#DKR#").replace(/\,/ig,"#DH#");
})
txt = txt.replace(/\n\s*/ig,"");
txt = txt.replace(/\<\!\[CDATA\[(.*)\]\]\>/ig,"#CD#$1#DC#");
txt = txt.replace(/\"([^\"]*)\"/ig,function($0){
var txt = $0;
return txt.replace(/\[/ig,"#ZKL#").replace(/\]/ig,"#ZKR#").replace(/\{/ig,"#DKL#").replace(/\}/ig,"#DKR#").replace(/\,/ig,"#DH#");
});
txt = txt.replace(/(,|\[|\]|\{|\})/ig,"#SP#$1#SP#").replace(/(#SP#){2,}/ig,"#SP#").replace(/^#SP#/i,"");
var ta = txt.split("#SP#");
var space="";
for(var i=0;i<ta.length;i++){
var f = ta[i];
if(f=="{"||f=="["){
ta[i] = space+ta[i];
space+=sc;
}else if(f=="}"||f=="]"){
space = space.replace(sc,"");
ta[i] = space+ta[i];
}else{
ta[i] = space+ta[i];
}
}
var rstr = ta.join("\n").replace(/\,\s*/ig,",").replace(/ \,/ig,",").replace(/#ZKR#/g,"]").replace(/#ZKL#/g,"[").replace(/#DKL#/g,"{").replace(/#DKR#/g,"}").replace(/#DH#/g,",")
rstr = rstr.replace(/\:\n*\s*(\{|\[)/ig,":$1").replace(/#CD#/ig,"<![CDATA[").replace(/#DC#/ig,"]]>");
return rstr;
},
/**
* 切换图表类型,重置options
*/
initOptions(value){
this.options ={
legend:{},
series:[],
title:{
text:null,
textStyle:{},
subtext:null,
subtextStyle:{}
},
};
if(value=='zbxt'){
var tOptions = {
xAxis:{type:"category",data:['实例一','实例二','实例三','实例四','实例五','实例六','实例七']},
yAxis:{type:"value"},
tooltip: {
trigger: 'axis',
axisPointer: {
type: 'cross',
crossStyle: {
color: '#999'
}
}
},
}
this.options.xAxis = tOptions.xAxis;
this.options.yAxis = tOptions.yAxis;
this.options.tooltip = tOptions.tooltip;
}else if(value=="fzbxt"){
}
},
/**
* 生成测试数据
*/
initOptionSeriesData(type,index){
//如果是坐标系图, 直接随机生成一个数组
var array = [];
if(this.subConfig.tbzl=='zbxt'){
for(var i=1; i<8;i++){
array.push(Math.floor(Math.random()*100+1))
}
this.options.series[index].data = array;
}
//非坐标系图 判断 是 圆图 还是雷达图
else if(this.subConfig.tbzl="fzbxt"){
//如果是圆图, 则随机生成7个对象存到数组里面 对象结构为 {value:xx,name:xx}
//存储类目
var tmpLegend = [];
if(type=='pie'){
for(var i=1; i<8;i++){
var name = "实例"+i*(index+1)
tmpLegend.push(name)
array.push({value:Math.floor(Math.random()*100+1),name:name})
}
this.options.series[index].data = array;
var obj = {data:tmpLegend}
//如果是第一条数据 直接赋值对象,如果不是第一条, 直接合并对象的data数组,避免覆盖
if(this.options.legend.data!=null){
this.options.legend.data = tmpLegend.concat(this.options.legend.data);
}else{
this.options.legend = obj;
}
var tooltip={trigger: 'item',formatter: '{a} <br/>{b}: {c} ({d}%)'};
this.options.tooltip = tooltip;
}
//如果是雷达图 则对象结构为 {value:[],name:xx}
else if(type=='radar'){
var tmpObj = [];
var tmpindicator = [];
//模拟数据
for(var i=0;i<3;i++){
var name = "数据"+i;
for(var j=1; j<6; j++){
tmpObj.push(Math.floor(Math.random()*100+1))
}
tmpLegend.push(name);
array.push({value:tmpObj,name:name})
tmpObj = [];
}
//模拟项
for(var i=1;i<6;i++){
var name ="实例"+i*(index+1);
tmpindicator.push({name:name,max:100});
}
this.options.series[index].data = array;
var radar={indicator:tmpindicator}
var legend = {data:tmpLegend}
this.options.radar = radar;
this.options.tooltip={ trigger: 'item'};
this.options.legend = legend.concat(this.options.legend);
}
}
},
/**
* 针对坐标系 添加类目
*/
initOptionSeriesName(type,name,index){
if(type=='zbxt'){
this.options.legend.data[index]=name;
}
},
/**
* 类目开关处理
*/
initOptionsLegend(){
//默认开启类目,当点击取消之后 再点击开启类目,就把之前已经保存的类目重新赋值
if(this.subConfig.legend){
for(var i=0; i<this.options.series.length; i++){
var obj = this.options.series[i];
//坐标系图和非坐标系图的 数据结构不同,坐标系图 类目 直接 series[i].name 就行
if(this.subConfig.tbzl=='zbxt'){
this.options.legend.data.push(obj.name);
}
//非坐标系图类目 数据结构为 series[i].data[j].name;
else if(this.subConfig.tbzl=='fzbxt'){
var tmpObj = obj.data;
for(var j=0; j<tmpObj.length; j++){
this.options.legend.data.push(tmpObj[j].name);
}
}
}
}else{
//关闭类目,就把类目数据全部清空
this.options.legend.data=[];
}
},
/**
* 工具栏开关处理
*/
initOptionsToolbox(){
//默认关闭工具栏
var toolbox={
show: true,
feature: {
dataZoom: { yAxisIndex: 'none'},
dataView: {readOnly: false},
// magicType: {type: ['line', 'bar']},
restore: {},
saveAsImage: {}
}
}
// 开启工具栏 把定好的对象赋值上去就行,
// 关闭工具栏 把定好的对象赋空就行
if(this.subConfig.toolbox){
this.options.toolbox = toolbox;
}else{
this.options.toolbox =null;
}
},
/**是否开启南丁格尔图 */
initOptionsRoseType(type,index,bol){
if(type=='pie' && bol){
this.options.series[index].roseType='area';
}else{
delete this.options.series[index].roseType;
}
},
//坐标系图开启位置调整
initOptionsGrid(obj){
if(this.subConfig.tbzl=='zbxt'){
if(this.subConfig.posit==true){
this.options.grid = obj;
}else{
delete this.options.grid;
}
}
},
//非坐标系开启位置调整
initOptionsCenter(x,y,index,type){
var array =[x,y];
if(type=='pie'){
this.options.series[index].center = array;
}else if(type=='radar'){
this.options.radar.center = array;
}
},
//非坐标系开启大小调整
initOptionsRadius(x,y,index,type){
var array =[x,y];
if(type=='pie'){
this.options.series[index].radius = array;
}
// else if(type=='radar'){
// this.options.radar.radius = array;
// }
},
/***
* 雷达图调整区域透明度
* data :数值
* index:第几项数据
* type:图表类型
*/
initOptionsOpacity(data,index,type){
if(type=="radar"){
var areaStyle = {opacity:(data/100)}
this.options.series[index].areaStyle = areaStyle;
}
},
/**
* value:值
* type:类型
*/
initOptionsLegendPoist(value,type){
if(value==""){
if(type=='left'){
delete this.options.legend.left;
}else if(type=='right'){
delete this.options.legend.right;
}else if(type=="top"){
delete this.options.legend.top;
}else if(type=="bottom"){
delete this.options.legend.bottom;
}
}
}
}
};
</script>
<style lang="scss" scoped>
.s-optionDiv{
width: 100%;
height: 100%;
border: 1px solid #dddddd;
}
.s-tabs{
position: relative;
/deep/ .el-tabs__content{
position: absolute;
top:50px;
bottom:0;
left:0;
right:0;
overflow: inherit;
.el-tab-pane{
height: 100%;
}
}
.s-btn-top{
position: absolute;
top:-50px;
right:0;
}
}
</style>
还存在的小bug
代码存在的缺陷
可改进
文章浏览阅读1k次。通过使用ajax方法跨域请求是浏览器所不允许的,浏览器出于安全考虑是禁止的。警告信息如下:不过jQuery对跨域问题也有解决方案,使用jsonp的方式解决,方法如下:$.ajax({ async:false, url: 'http://www.mysite.com/demo.do', // 跨域URL ty..._nginx不停的xhr
文章浏览阅读2k次。关于在 Oracle 中配置 extproc 以访问 ST_Geometry,也就是我们所说的 使用空间SQL 的方法,官方文档链接如下。http://desktop.arcgis.com/zh-cn/arcmap/latest/manage-data/gdbs-in-oracle/configure-oracle-extproc.htm其实简单总结一下,主要就分为以下几个步骤。..._extproc
文章浏览阅读1.5w次。linux下没有上面的两个函数,需要使用函数 mbstowcs和wcstombsmbstowcs将多字节编码转换为宽字节编码wcstombs将宽字节编码转换为多字节编码这两个函数,转换过程中受到系统编码类型的影响,需要通过设置来设定转换前和转换后的编码类型。通过函数setlocale进行系统编码的设置。linux下输入命名locale -a查看系统支持的编码_linux c++ gbk->utf8
文章浏览阅读750次。今天准备从生产库向测试库进行数据导入,结果在imp导入的时候遇到“ IMP-00009:导出文件异常结束” 错误,google一下,发现可能有如下原因导致imp的数据太大,没有写buffer和commit两个数据库字符集不同从低版本exp的dmp文件,向高版本imp导出的dmp文件出错传输dmp文件时,文件损坏解决办法:imp时指定..._imp-00009导出文件异常结束
文章浏览阅读143次。当下是一个大数据的时代,各个行业都离不开数据的支持。因此,网络爬虫就应运而生。网络爬虫当下最为火热的是Python,Python开发爬虫相对简单,而且功能库相当完善,力压众多开发语言。本次教程我们爬取前程无忧的招聘信息来分析Python程序员需要掌握那些编程技术。首先在谷歌浏览器打开前程无忧的首页,按F12打开浏览器的开发者工具。浏览器开发者工具是用于捕捉网站的请求信息,通过分析请求信息可以了解请..._初级python程序员能力要求
文章浏览阅读7.6k次,点赞2次,收藏6次。@Service标注的bean,类名:ABDemoService查看源码后发现,原来是经过一个特殊处理:当类的名字是以两个或以上的大写字母开头的话,bean的名字会与类名保持一致public class AnnotationBeanNameGenerator implements BeanNameGenerator { private static final String C..._@service beanname
文章浏览阅读6.9w次,点赞73次,收藏463次。1.前序创建#include<stdio.h>#include<string.h>#include<stdlib.h>#include<malloc.h>#include<iostream>#include<stack>#include<queue>using namespace std;typed_二叉树的建立
文章浏览阅读7.1k次。在Asp.net上使用Excel导出功能,如果文件名出现中文,便会以乱码视之。 解决方法: fileName = HttpUtility.UrlEncode(fileName, System.Text.Encoding.UTF8);_asp.net utf8 导出中文字符乱码
文章浏览阅读2.1k次,点赞4次,收藏23次。第一次实验 词法分析实验报告设计思想词法分析的主要任务是根据文法的词汇表以及对应约定的编码进行一定的识别,找出文件中所有的合法的单词,并给出一定的信息作为最后的结果,用于后续语法分析程序的使用;本实验针对 PL/0 语言 的文法、词汇表编写一个词法分析程序,对于每个单词根据词汇表输出: (单词种类, 单词的值) 二元对。词汇表:种别编码单词符号助记符0beginb..._对pl/0作以下修改扩充。增加单词
文章浏览阅读773次。我在使用adb.exe时遇到了麻烦.我想使用与bash相同的adb.exe shell提示符,所以我决定更改默认的bash二进制文件(当然二进制文件是交叉编译的,一切都很完美)更改bash二进制文件遵循以下顺序> adb remount> adb push bash / system / bin /> adb shell> cd / system / bin> chm..._adb shell mv 权限
文章浏览阅读6.8k次,点赞12次,收藏125次。1. 单目相机标定引言相机标定已经研究多年,标定的算法可以分为基于摄影测量的标定和自标定。其中,应用最为广泛的还是张正友标定法。这是一种简单灵活、高鲁棒性、低成本的相机标定算法。仅需要一台相机和一块平面标定板构建相机标定系统,在标定过程中,相机拍摄多个角度下(至少两个角度,推荐10~20个角度)的标定板图像(相机和标定板都可以移动),即可对相机的内外参数进行标定。下面介绍张氏标定法(以下也这么称呼)的原理。原理相机模型和单应矩阵相机标定,就是对相机的内外参数进行计算的过程,从而得到物体到图像的投影_相机-投影仪标定
文章浏览阅读2.2k次。文章目录Wayland 架构Wayland 渲染Wayland的 硬件支持简 述: 翻译一篇关于和 wayland 有关的技术文章, 其英文标题为Wayland Architecture .Wayland 架构若是想要更好的理解 Wayland 架构及其与 X (X11 or X Window System) 结构;一种很好的方法是将事件从输入设备就开始跟踪, 查看期间所有的屏幕上出现的变化。这就是我们现在对 X 的理解。 内核是从一个输入设备中获取一个事件,并通过 evdev 输入_wayland