arrow.vue 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160
  1. <template>
  2. <div>
  3. <el-table :data="tableData" style="width: 100%" class="elementTable">
  4. <el-table-column prop="val" label="值" width="180"></el-table-column>
  5. <el-table-column prop="desc" label="描述"></el-table-column>
  6. </el-table>
  7. <div style="margin: 14px 0;">
  8. <span style="font-size: 14px;">选择起始点样式</span>
  9. <el-select placeholder="请选择" @change="changeStart" size="small" v-model="begin">
  10. <el-option v-for="item in options" :key="item.value" :label="item.label"
  11. :value="item.value"></el-option>
  12. </el-select>
  13. <span style="font-size: 14px;">选择结束点样式</span>
  14. <el-select placeholder="请选择" @change="changeEnd" size="small" v-model="end">
  15. <el-option v-for="item in options" :key="item.value" :label="item.label"
  16. :value="item.value"></el-option>
  17. </el-select>
  18. </div>
  19. <canvas :id="id" width="740" height="400" tabindex="0"/>
  20. </div>
  21. </template>
  22. <script lang="ts">
  23. import { SGraphItem, SGraphScene, SGraphView } from "@persagy-web/graph/lib";
  24. import { SArrowStyleType, SPainter, SPoint, SRect } from "@persagy-web/draw/lib"
  25. import { Component, Vue } from "vue-property-decorator";
  26. import { v1 as uuid } from "uuid";
  27. class Polyline extends SGraphItem {
  28. /** 起始点样式 */
  29. _begin = SArrowStyleType.Basic;
  30. get begin(): SArrowStyleType {
  31. return this._begin;
  32. }
  33. set begin(v: SArrowStyleType) {
  34. this._begin = v;
  35. this.update();
  36. }
  37. /** 结束点样式 */
  38. _end = SArrowStyleType.Basic;
  39. get end(): SArrowStyleType {
  40. return this._end;
  41. }
  42. set end(v: SArrowStyleType) {
  43. this._end = v;
  44. this.update();
  45. }
  46. pointList: SPoint[] = [
  47. new SPoint(0, 0),
  48. new SPoint(1000, 1000),
  49. new SPoint(1200, 1800),
  50. new SPoint(1800, 1800),
  51. new SPoint(2000, 100),
  52. // new SPoint(0, 0)
  53. ];
  54. boundingRect(): SRect {
  55. return new SRect(0, 0, 2000, 1800);
  56. }
  57. /**
  58. * Item 绘制操作
  59. * @param painter 绘制对象
  60. */
  61. onDraw(painter: SPainter) {
  62. //线宽
  63. painter.pen.lineWidth = painter.toPx(1);
  64. //箭头起点,终点样式
  65. const style = {
  66. begin: this.begin,
  67. end: this.end
  68. };
  69. for (let i = 0; i < this.pointList.length - 1; i++) {
  70. //绘制带箭头的线段
  71. painter.drawArrowLine(this.pointList[i], this.pointList[i + 1], style)
  72. }
  73. }
  74. }
  75. @Component
  76. export default class ShadowCanvas extends Vue {
  77. id: string = uuid();
  78. options = [
  79. {
  80. value: SArrowStyleType.None,
  81. label: 'None'
  82. }, {
  83. value: SArrowStyleType.Basic,
  84. label: 'Basic'
  85. }, {
  86. value: SArrowStyleType.Triangle,
  87. label: 'Triangle'
  88. }, {
  89. value: SArrowStyleType.Diamond,
  90. label: 'Diamond'
  91. }, {
  92. value: SArrowStyleType.Square,
  93. label: 'Square'
  94. }, {
  95. value: SArrowStyleType.Circle,
  96. label: 'Circle'
  97. }
  98. ];
  99. view: SGraphView | undefined;
  100. item: Polyline | undefined;
  101. tableData = [
  102. {
  103. val: 'None',
  104. desc: '无样式'
  105. }, {
  106. val: 'Basic',
  107. desc: '基本箭头'
  108. },
  109. {
  110. val: 'Triangle',
  111. desc: '三角形箭头'
  112. },
  113. {
  114. val: 'Diamond',
  115. desc: '菱形箭头'
  116. },
  117. {
  118. val: 'Square',
  119. desc: '方形箭头'
  120. },
  121. {
  122. val: 'Circle',
  123. desc: '圆形箭头'
  124. },
  125. ];
  126. begin: SArrowStyleType = SArrowStyleType.Basic;
  127. end: SArrowStyleType = SArrowStyleType.Basic;
  128. mounted(): void {
  129. this.init()
  130. };
  131. init() {
  132. this.view = new SGraphView(this.id);
  133. const scene = new SGraphScene();
  134. this.item = new Polyline(null);
  135. scene.addItem(this.item);
  136. this.view.scene = scene;
  137. this.view.fitSceneToView();
  138. this.view.scalable = false;
  139. };
  140. changeStart(val: SArrowStyleType): void {
  141. this.item!!.begin = val
  142. };
  143. changeEnd(val: SArrowStyleType): void {
  144. this.item!!.end = val
  145. }
  146. }
  147. </script>