当前位置:   article > 正文

前端之电力系统SVG图低代码

前端之电力系统SVG图低代码

其实所有的图形都是由点,线,面组成的。点线面可以组成一个设备。下面就简单讲讲点线面是怎么画的吧

对于线,可以用path

  1. <g>
  2. <path
  3. :d="`M ${beginX},${beginY} L ${endX},${endY}`"
  4. :stroke-width="lineWidth"
  5. :stroke="stroke"
  6. :style="{ transform: `rotate(${rotateAngle}deg)`, transformOrigin: transformOrigin }"
  7. >
  8. <animate attributeName="stroke" :values="animateStyle" dur="1s" begin="0s" repeatCount="indefinite" v-if="animation" />
  9. </path>
  10. </g>

两点一线,只要知道两个点的坐标就可以,但是基础图元可以旋转,也可以闪烁,所以这些属性都需要动态计算。

两点可以组成线,多点可以组成折线,这就需要一个polyline类去解析每个折线。

ployline也是用path就可以了,但是中间的点需要连起来,样式的计算需要循环拼接字符串

  1. const d = computed(() => {
  2. if (polyline.value && centerPoint.value) {
  3. let tmp = "";
  4. for (let i = 0; i < pointList.value.length; i++) {
  5. const point = pointList.value[i];
  6. if (i === 0) {
  7. beginX.value = (point.X() + centerPoint.value.X()) * scaleX.value;
  8. beginY.value = (point.Y() + centerPoint.value.Y()) * scaleY.value;
  9. tmp += `M ${beginX.value},${beginY.value}`;
  10. } else {
  11. if (i === pointList.value.length - 1) {
  12. endX.value = (point.X() + centerPoint.value.X()) * scaleX.value;
  13. endY.value = (point.Y() + centerPoint.value.Y()) * scaleY.value;
  14. }
  15. tmp += `L ${(point.X() + centerPoint.value.X()) * scaleX.value},${(point.Y() + centerPoint.value.Y()) * scaleY.value}`;
  16. }
  17. }
  18. transformOrigin.value = `${(beginX.value + endX.value) / 2}px ${(beginY.value + endY.value) / 2}px`;
  19. return tmp;
  20. }
  21. return "";
  22. });

有了线,当然需要面,这时候一个polygon类就可以解决,唯一和polyline不同的是,path最后一个点需要Z闭合

 tmp += "Z";

svg里面的渲染最有难度的大圆弧和小圆弧,需要用到三角函数

  1. <path
  2. v-else
  3. :d="`M ${beginX},${beginY}
  4. A ${r} ${r} 0 ${largeArcFlag} ${sweepFlag} ${endX} ${endY}
  5. L ${cx} ${cy}
  6. Z`"
  7. :style="style"
  8. >
  9. <animate attributeName="stroke" :values="animateStyle" dur="1s" begin="0s" repeatCount="indefinite" v-if="animation" />
  10. </path>

整圆就用<circle>标签

剩下的都是用foreignObject写的

  1. <foreignObject :x="beginX" :y="beginY" :width="countWidth" :height="countHeight" requiredExtensions="http://www.w3.org/1999/xhtml">
  2. <body xmlns="http://www.w3.org/1999/xhtml" class="textBg" :style="{ transform: `rotate(${rotateAngle}deg)` }">
  3. <div :class="[isVertical ? 'isVertical' : '', 'textStyle']" v-if="!htmlText" :id="`${str._id}`">
  4. {{ strText }}
  5. </div>
  6. <div :class="[isVertical ? 'isVertical' : '', 'textStyle']" v-else v-html="strText" :id="`${str._id}`"></div>
  7. </body>
  8. </foreignObject>

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/盐析白兔/article/detail/599191
推荐阅读
相关标签
  

闽ICP备14008679号