2025-08-07 10:00:14 +08:00
|
|
|
|
//自定义绘制节点的方法
|
|
|
|
|
|
export const paintNodeFunction = function (ctx, onlyShape) {
|
|
|
|
|
|
//默认绘制数据类型图片
|
|
|
|
|
|
if (this.properties.typeIcon) {
|
|
|
|
|
|
if (this.selected || this.showSelected) {
|
|
|
|
|
|
this.drawShape(ctx, onlyShape)
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
if (this.alpha < 1) {
|
|
|
|
|
|
ctx.save()
|
|
|
|
|
|
ctx.globalAlpha = this.alpha
|
|
|
|
|
|
ctx.drawImage(
|
|
|
|
|
|
this.properties.typeIcon,
|
|
|
|
|
|
-this.width / 2,
|
|
|
|
|
|
-this.height / 2,
|
|
|
|
|
|
this.width,
|
|
|
|
|
|
this.height
|
|
|
|
|
|
)
|
|
|
|
|
|
ctx.restore()
|
|
|
|
|
|
} else {
|
|
|
|
|
|
ctx.drawImage(
|
|
|
|
|
|
this.properties.typeIcon,
|
|
|
|
|
|
-this.width / 2,
|
|
|
|
|
|
-this.height / 2,
|
|
|
|
|
|
this.width,
|
|
|
|
|
|
this.height
|
|
|
|
|
|
)
|
|
|
|
|
|
}
|
|
|
|
|
|
} else {
|
|
|
|
|
|
this.drawShape(ctx, onlyShape)
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2025-08-12 08:56:18 +08:00
|
|
|
|
// ctx.beginPath()
|
|
|
|
|
|
// ctx.arc(0, 0, this.radius + 6, 0, Math.PI * 2)
|
|
|
|
|
|
// ctx.lineWidth = 8
|
|
|
|
|
|
// ctx.strokeStyle = `rgba(${this.fillColor},${this.alpha * 0.4})`
|
|
|
|
|
|
// ctx.stroke()
|
|
|
|
|
|
// 半径 & 样式参数(按需调整)
|
|
|
|
|
|
// ===== 三层:实心圆 + 半透明边框 + 外圈虚线 =====
|
|
|
|
|
|
const rFill = this.radius // 实心圆半径
|
|
|
|
|
|
const ringWidth = 15 // 半透明边框的宽度
|
|
|
|
|
|
const ringGap = 0 // 实心与半透明边框之间的间隙(需要留缝就调大)
|
|
|
|
|
|
const outerGap = 0 // 半透明边框与虚线之间的间隙
|
|
|
|
|
|
const dashWidth = 2 // 虚线线宽
|
|
|
|
|
|
const dash = 2,
|
|
|
|
|
|
gap = 4 // 虚线样式
|
|
|
|
|
|
const ringAlphaFactor = 0.5 // 半透明边框的相对透明度(相对于 this.alpha)
|
2025-08-11 17:49:31 +08:00
|
|
|
|
|
2025-08-12 08:56:18 +08:00
|
|
|
|
// 1) 中间实心圆(填充)
|
|
|
|
|
|
ctx.save()
|
|
|
|
|
|
ctx.beginPath()
|
|
|
|
|
|
ctx.arc(0, 0, rFill, 0, Math.PI * 2)
|
|
|
|
|
|
ctx.fillStyle = `rgba(${this.fillColor}, ${this.alpha})`
|
|
|
|
|
|
ctx.fill()
|
|
|
|
|
|
ctx.restore()
|
2025-08-11 17:49:31 +08:00
|
|
|
|
|
2025-08-12 08:56:18 +08:00
|
|
|
|
// 2) 同色半透明边框(描边,不是挖空)
|
|
|
|
|
|
ctx.save()
|
|
|
|
|
|
ctx.beginPath()
|
|
|
|
|
|
const rRing = rFill + ringGap + ringWidth / 2
|
|
|
|
|
|
ctx.arc(0, 0, rRing, 0, Math.PI * 2)
|
|
|
|
|
|
ctx.lineWidth = ringWidth
|
|
|
|
|
|
ctx.setLineDash([]) // 确保这里是实线
|
|
|
|
|
|
ctx.strokeStyle = `rgba(${this.fillColor}, ${this.alpha * ringAlphaFactor})`
|
|
|
|
|
|
ctx.stroke()
|
|
|
|
|
|
ctx.restore()
|
2025-08-11 17:49:31 +08:00
|
|
|
|
|
2025-08-12 08:56:18 +08:00
|
|
|
|
// 3) 外圈虚线(同色)
|
|
|
|
|
|
ctx.save()
|
|
|
|
|
|
ctx.beginPath()
|
|
|
|
|
|
const rDash = rRing + ringWidth / 2 + outerGap + dashWidth / 2
|
|
|
|
|
|
ctx.arc(0, 0, rDash, 0, Math.PI * 2)
|
|
|
|
|
|
ctx.lineWidth = dashWidth
|
|
|
|
|
|
ctx.setLineDash([dash, gap])
|
|
|
|
|
|
ctx.lineCap = "round"
|
|
|
|
|
|
ctx.strokeStyle = `rgba(${this.fillColor}, ${this.alpha})`
|
|
|
|
|
|
ctx.stroke()
|
|
|
|
|
|
ctx.setLineDash([]) // 清理,避免影响后续绘制
|
|
|
|
|
|
ctx.restore()
|
2025-08-07 10:00:14 +08:00
|
|
|
|
|
|
|
|
|
|
this.paintText(ctx) //调用内部方法绘制文字
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
//自定义连线的方法
|
|
|
|
|
|
export const paintLineFunction = function (ctx, needHideText) {
|
|
|
|
|
|
this.drawOriginalLine(ctx, needHideText) //内置默认的绘制方法
|
|
|
|
|
|
|
|
|
|
|
|
//指定路径,用于鼠标检测选中
|
2025-08-07 19:11:52 +08:00
|
|
|
|
this.path = [
|
|
|
|
|
|
{ x: this.source.cx, y: this.source.cy },
|
|
|
|
|
|
{ x: this.target.cx, y: this.target.cy }
|
|
|
|
|
|
]
|
2025-08-07 10:00:14 +08:00
|
|
|
|
|
|
|
|
|
|
// //绘制路径
|
2025-08-07 19:11:52 +08:00
|
|
|
|
ctx.beginPath()
|
|
|
|
|
|
ctx.moveTo(this.source.cx, this.source.cy)
|
|
|
|
|
|
ctx.lineTo(this.target.cx, this.target.cy)
|
|
|
|
|
|
this.setLineStyle(ctx)
|
|
|
|
|
|
ctx.stroke()
|
2025-08-07 10:00:14 +08:00
|
|
|
|
|
|
|
|
|
|
// //绘制连线上文字(内部方法)
|
2025-08-07 19:11:52 +08:00
|
|
|
|
this.paintTextOnLineWithAngle(ctx, this.source, this.target)
|
2025-08-07 10:00:14 +08:00
|
|
|
|
}
|