Merge branch 'main' into dev

2.1
咬轮猫 4 years ago
commit c85ec3b037

@ -1,9 +1,12 @@
# vue-webtopo-svgeditor
> 纯vue3实现的svg可视化web组态编辑器。主要用于物联网mqtt实时系统图
> 纯vue3实现的svg可视化web组态编辑器。可无需修改代码动态添加组件
这个分支为开发分支之前的版本每个组件都要写一个vue文件项目不仅乱还难以管理今天增加了这个分支首先要改变组件模式调整为动态组件等这个完成之后继续完善之前的代码
当前主分支版本为2.0
## [版本1.0请点此](https://svgv1.yaolunmao.top)
## [图片挂了点此](https://www.cnblogs.com/Hero-/p/14784744.html)
## 预览地址
[https://svg.yaolunmao.top](https://svg.yaolunmao.top)
@ -37,20 +40,59 @@ yarn serve
- deleted删除当前选中组件
- 鼠标滚轮放大缩小选中组件
## Todo
## 动态添加组件
可使用任意生成svg代码的工具我这里使用在线编译器进行模拟
点击[这里](https://svgedit.yaolunmao.top/)进行svg图像绘制我这里以心形为例
![绘制心形图片](https://images.cnblogs.com/cnblogs_com/Hero-/1976969/o_2105190646421.png)
将svg代码复制下来双引号进行转义删除无用属性比如id你也可以直接使用我下面的代码
```
<path fill=\"#FF0000\" stroke=\"#000000\" stroke-width=\"5\" style=\"pointer-events:inherit\" d=\"m143.72081869586242,163.35565803158485 c14.617751633754164,-41.93617271978648 71.89058180534832,0 0,53.91793635401125 c-71.89058180534832,-53.91793635401125 -14.617751633754164,-95.85410907379776 0,-53.91793635401125 z\" fill-opacity=\"1\" stroke-opacity=\"1\"></path>
```
将拓展字段进行双向绑定 我目前只做了颜色
```
<path :fill=\"svg_color\" :stroke=\"svg_color\" stroke-width=\"5\" style=\"pointer-events:inherit\" d=\"m143.72081869586242,163.35565803158485 c14.617751633754164,-41.93617271978648 71.89058180534832,0 0,53.91793635401125 c-71.89058180534832,-53.91793635401125 -14.617751633754164,-95.85410907379776 0,-53.91793635401125 z\" fill-opacity=\"1\" stroke-opacity=\"1\"></path>
```
修改项目文件夹pubilc下的模拟接口返回的json新增一项
```
{
"type": "TestAddSvg",
"title": "测试新增组件",
"template": "<path :fill=\"svg_color\" :stroke=\"svg_color\" stroke-width=\"5\" style=\"pointer-events:inherit\" d=\"m143.72081869586242,163.35565803158485 c14.617751633754164,-41.93617271978648 71.89058180534832,0 0,53.91793635401125 c-71.89058180534832,-53.91793635401125 -14.617751633754164,-95.85410907379776 0,-53.91793635401125 z\" fill-opacity=\"1\" stroke-opacity=\"1\"></path>",
"props": ["svg_color"],
"default_color":"#FF0000",
"priview_img":"https://svg.yaolunmao.top/test.png"
}
```
![修改json](https://images.cnblogs.com/cnblogs_com/Hero-/1976969/o_210519050539%E6%B7%BB%E5%8A%A0%E7%BB%84%E4%BB%B62.png)
启动项目,就可以看到刚才添加的组件了
![预览界面](https://images.cnblogs.com/cnblogs_com/Hero-/1976969/o_210519050543%E6%B7%BB%E5%8A%A0%E7%BB%84%E4%BB%B63.png)
也支持直接引入图片只不过放大有失真将下面的代码替换上面json文件的template值
```
<image x=\"-33\" y=\"-33\" width=\"66\" height=\"66\" xlink:href=\"https://svg.yaolunmao.top/test.png\" />
```
- 鼠标框选批量选中
- 画布绑定mqtt平台
- 组件旋转
- 画布缩放
- 编辑器撤销、重做
ps目前中心辅助线的坐标取决于svg组件的中心坐标请自行添加transform属性调整svg组件中心坐标
## 截图
![编辑器页面](https://p.130014.xyz/2021/03/19/svgedit.png)
![编辑器页面](https://img-blog.csdnimg.cn/20210322100014954.gif#pic_center)
![预览界面](https://p.130014.xyz/2021/03/21/svgview.png)
![预览界面](https://img-blog.csdnimg.cn/20210322100043996.gif#pic_center)
## License
[MIT](http://opensource.org/licenses/MIT)
[MIT](http://opensource.org/licenses/MIT)

@ -5,12 +5,45 @@
<a-layout>
<!-- {{tableDefaultData}} -->
<a-layout-header>
<a-modal v-model:visible="addSvgVisible"
title="模拟添加组件"
@ok="addSvgHandleOk">
<a-form layout="horizontal">
<a-form-item label="类型">
<a-input v-model:value="testAddSvg.type"
placeholder="请输入组件类型" />
</a-form-item>
<a-form-item label="标题">
<a-input v-model:value="testAddSvg.title"
placeholder="请输入组件标题" />
</a-form-item>
<a-form-item label="svg代码">
<a-input v-model:value="testAddSvg.template"
placeholder="请输入svg代码" />
</a-form-item>
<a-form-item label="默认颜色">
<input type="color"
v-model="testAddSvg.default_color">
</a-form-item>
<a-form-item label="预览图像">
<a-input v-model:value="testAddSvg.priview_img"
placeholder="请输入预览图像地址" />
</a-form-item>
</a-form>
</a-modal>
<!-- <a-button type="primary"
@click="testD">导出数据</a-button>
<a-button type="primary"
@click="testE">载入模板</a-button> -->
<a-button type="primary"
@click="testH">预览</a-button>
<a style="margin-left:20px">
<a-button type="primary"
style="margin-left:20px"
@click="showAddSvgModal">
添加组件
</a-button>
</a>
<a style="margin-left:20px"
href="https://svgv1.yaolunmao.top">
<a-button type="primary">1.0版本</a-button>
@ -23,6 +56,10 @@
href="https://github.com/yaolunmao/vue-webtopo-svgeditor">
<a-button type="primary">帮助</a-button>
</a>
<a style="margin-left:20px">
<a-button type="primary"
@click="exportSvg">导出svg</a-button>
</a>
</a-layout-header>
<span v-if="!shrink"
@click="exitFullscreen"
@ -49,7 +86,8 @@
xmlns:xlink="http://www.w3.org/1999/xlink"
style="background-color:#000000"
width="100%"
height="100%">
height="100%"
id="svgCanvas">
<defs />
<filter x="0"
y="0"
@ -92,6 +130,15 @@ export default {
components: { LeftToolBar, RightToolBar, SvgComponents },
data () {
return {
testAddSvg: {
type: "testAddSvg",
title: "测试新增组件",
template: "<path :fill=\"svg_color\" :stroke=\"svg_color\" stroke-width=\"5\" style=\"pointer-events:inherit\" d=\"m143.72081869586242,163.35565803158485 c14.617751633754164,-41.93617271978648 71.89058180534832,0 0,53.91793635401125 c-71.89058180534832,-53.91793635401125 -14.617751633754164,-95.85410907379776 0,-53.91793635401125 z\" fill-opacity=\"1\" stroke-opacity=\"1\" transform=\"translate(-145,-180)\"></path>",
props: ["svg_color"],
default_color: "#FF0000",
priview_img: "https://svg.yaolunmao.top/test.png"
},
addSvgVisible: false,
svgInfoData: [],//
shrink: true,// true false
svgLists: [],//svg
@ -120,6 +167,18 @@ export default {
}
},
methods: {
showAddSvgModal () {
this.addSvgVisible = true;
},
addSvgHandleOk () {
this.svgInfoData.push(this.testAddSvg);
this.addSvgVisible = false;
},
exportSvg () {
var exportStr = document.querySelector("#svgCanvas").outerHTML;
console.log(exportStr);
alert("请使用F12查看consolo面板");
},
MouseMove (e) {
let _this = this;
@ -180,9 +239,9 @@ export default {
}
}, 1);
},
MousedownCanvas () {
MousedownCanvas (e) {
//console.log('');
console.log('当前鼠标位置',e.clientX,e.clientY)
},
MousedownSvg (id, index, pointX, pointY, e) {
window.CurrentlySelectedToolBar.Type = '';
@ -191,8 +250,8 @@ export default {
this.selectSvg.ID = id;
this.selectSvg.Index = index;
this.selectSvg.mouseStatus = 1;
this.selectSvg.mPositionX = e.clientX;
this.selectSvg.mPositionY = e.clientY;
this.selectSvg.mPositionX = e.offsetX;
this.selectSvg.mPositionY = e.offsetY;
this.selectSvg.pointX = pointX;
this.selectSvg.pointY = pointY;
this.selectSvgInfo = this.svgLists[index];
@ -217,7 +276,6 @@ export default {
e.preventDefault();
// -100 100
let svgZoom = e.deltaY < 0 ? 0.1 : -0.1;
console.log(e.deltaY);
selectSvgInfo.size += svgZoom;
selectSvgInfo.size = parseFloat(selectSvgInfo.size.toFixed(1));
if (selectSvgInfo.size < 1) {

Loading…
Cancel
Save