draw method

dynamic draw(
  1. dynamic kx,
  2. dynamic ky,
  3. dynamic kw,
  4. dynamic kh,
  5. dynamic lineType,
  6. dynamic draw,
  7. dynamic pro,
)

Implementation

draw(kx, ky, kw, kh, lineType, draw, pro) {
  num x1 = 0, y1 = 0, x2 = 0, y2 = 0, x3 = 0, y3 = 0, y4 = 0, k = 0, b = 0;
  var circleR = style['drawLineStyle']['property']['circleR'];
  var linePath = [];
  var fillPath = [];
  var circlePath = [];
  var txtPath = [];
  var reactPath = [];
  var startPoint = {'x': 0 as num, 'y': 0 as num};
  var stopPoint = {'x': 0 as num, 'y': 0 as num};
  var firstPoint = {};
  var point = draw['p'];
  if (lineType == Line['ZX']) {
    if (point.length >= 2) {
      //鼠标点
      x1 = kx +
          (point[0]['x'] - pro.kStartI) * pro.kWG +
          point[0]['xp'] +
          pro.kStartX;
      y1 = ky + Tools.priceToY(pro.kYh, point[0]['y'], pro.kYMin, pro.kScale);
      x2 = kx +
          (point[1]['x'] - pro.kStartI) * pro.kWG +
          point[1]['xp'] +
          pro.kStartX;
      y2 = ky + Tools.priceToY(pro.kYh, point[1]['y'], pro.kYMin, pro.kScale);
      //原始开始结束点
      draw['startPoint'] = {'x': x1, 'y': y1};
      draw['stopPoint'] = {'x': x2, 'y': y2};
      //绘画开始结束点
      k = (y2 - y1) / (x2 - x1);
      b = y1 - k * x1;
      startPoint['x'] = kx;
      startPoint['y'] = k * startPoint['x']! + b;
      stopPoint['x'] = kx + kw;
      stopPoint['y'] = k * stopPoint['x']! + b;
      linePath.addAll([
        [
          "moveTo",
          [startPoint['x'], startPoint['y']]
        ],
        [
          "lineTo",
          [stopPoint['x'], stopPoint['y']]
        ]
      ]);
      if (draw['selected'] != null && draw['selected'] ||
          draw['highlight'] != null && draw['highlight']) {
        circlePath.addAll([
          [
            "drawCircle",
            [x1, y1, circleR]
          ],
          [
            "drawCircle",
            [x2, y2, circleR]
          ]
        ]);
      }
    }
  } else if (lineType == Line['SPZX']) {
    if (point.length >= 1) {
      x1 = kx +
          (point[0]['x'] - pro.kStartI) * pro.kWG +
          point[0]['xp'] +
          pro.kStartX;
      y1 = ky + Tools.priceToY(pro.kYh, point[0]['y'], pro.kYMin, pro.kScale);
      //原始点
      draw['startPoint'] = {'x': x1, 'y': y1};
      //绘制点
      startPoint = {'x': kx, 'y': y1};
      stopPoint = {'x': kx + kw, 'y': y1};
      linePath.addAll([
        [
          "moveTo",
          [startPoint['x'], startPoint['y']]
        ],
        [
          "lineTo",
          [stopPoint['x'], stopPoint['y']]
        ]
      ]);
      if (draw['selected'] != null && draw['selected'] ||
          draw['highlight'] != null && draw['highlight']) {
        circlePath.add([
          "drawCircle",
          [x1, y1, circleR]
        ]);
      }
    }
  } else if (lineType == Line['CZZX']) {
    if (point.length >= 1) {
      x1 = kx +
          (point[0]['x'] - pro.kStartI) * pro.kWG +
          point[0]['xp'] +
          pro.kStartX;
      y1 = ky + Tools.priceToY(pro.kYh, point[0]['y'], pro.kYMin, pro.kScale);
      //原始点
      draw['startPoint'] = {'x': x1, 'y': y1};
      //绘制点
      startPoint = {'x': x1, 'y': 0};
      stopPoint = {'x': x1, 'y': ky + kh};
      linePath.addAll([
        [
          "moveTo",
          [startPoint['x'], startPoint['y']]
        ],
        [
          "lineTo",
          [stopPoint['x'], stopPoint['y']]
        ]
      ]);
      if (draw['selected'] != null && draw['selected'] ||
          draw['highlight'] != null && draw['highlight']) {
        circlePath.add([
          "drawCircle",
          [x1, y1, circleR]
        ]);
      }
    }
  } else if (lineType == Line['XD']) {
    if (point.length >= 2) {
      x1 = kx +
          (point[0]['x'] - pro.kStartI) * pro.kWG +
          point[0]['xp'] +
          pro.kStartX;
      y1 = ky + Tools.priceToY(pro.kYh, point[0]['y'], pro.kYMin, pro.kScale);
      x2 = kx +
          (point[1]['x'] - pro.kStartI) * pro.kWG +
          point[1]['xp'] +
          pro.kStartX;
      y2 = ky + Tools.priceToY(pro.kYh, point[1]['y'], pro.kYMin, pro.kScale);

      //原始点
      draw['startPoint'] = {'x': x1, 'y': y1};
      draw['stopPoint'] = {'x': x2, 'y': y2};
      //根据鼠标点计算直线方程所需参数
      callKb(x1, y1, x2, y2, draw);
      //根据参数计算绘制点
      startPoint = {'x': x1, 'y': y1};
      stopPoint = {'x': x2, 'y': y2};
      linePath.addAll([
        [
          "moveTo",
          [startPoint['x'], startPoint['y']]
        ],
        [
          "lineTo",
          [stopPoint['x'], stopPoint['y']]
        ]
      ]);
      if (draw['selected'] != null && draw['selected'] ||
          draw['highlight'] != null && draw['highlight']) {
        circlePath.addAll([
          [
            "drawCircle",
            [x1, y1, circleR]
          ],
          [
            "drawCircle",
            [x2, y2, circleR]
          ]
        ]);
      }
    }
  } else if (lineType == Line['JT']) {
    if (point.length >= 2) {
      x1 = kx +
          (point[0]['x'] - pro.kStartI) * pro.kWG +
          point[0]['xp'] +
          pro.kStartX;
      y1 = ky + Tools.priceToY(pro.kYh, point[0]['y'], pro.kYMin, pro.kScale);
      x2 = kx +
          (point[1]['x'] - pro.kStartI) * pro.kWG +
          point[1]['xp'] +
          pro.kStartX;
      y2 = ky + Tools.priceToY(pro.kYh, point[1]['y'], pro.kYMin, pro.kScale);

      //原始点
      draw['startPoint'] = {'x': x1, 'y': y1};
      draw['stopPoint'] = {'x': x2, 'y': y2};
      //根据鼠标点计算直线方程所需参数
      callKb(x1, y1, x2, y2, draw);
      //根据参数计算绘制点
      startPoint = {'x': x1, 'y': y1};
      stopPoint = {'x': x2, 'y': y2};
      linePath.addAll([
        [
          "moveTo",
          [startPoint['x'], startPoint['y']]
        ],
        [
          "lineTo",
          [stopPoint['x'], stopPoint['y']]
        ]
      ]);
      arow([startPoint['x'], startPoint['y']],
          [stopPoint['x'], stopPoint['y']], 9, 5, linePath);
      if (draw['selected'] != null && draw['selected'] ||
          draw['highlight'] != null && draw['highlight']) {
        circlePath.addAll([
          [
            "drawCircle",
            [x1, y1, circleR]
          ],
          [
            "drawCircle",
            [x2, y2, circleR]
          ]
        ]);
      }
    }
  } else if (lineType == Line['SPXD']) {
    if (point.length >= 2) {
      x1 = kx +
          (point[0]['x'] - pro.kStartI) * pro.kWG +
          point[0]['xp'] +
          pro.kStartX;
      y1 = ky + Tools.priceToY(pro.kYh, point[0]['y'], pro.kYMin, pro.kScale);
      x2 = kx +
          (point[1]['x'] - pro.kStartI) * pro.kWG +
          point[1]['xp'] +
          pro.kStartX;
      y2 = y1;
      //原始点
      draw['startPoint'] = {'x': x1, 'y': y1};
      draw['stopPoint'] = {'x': x2, 'y': y2};
      //根据鼠标点计算直线方程所需参数
      callKb(x1, y1, x2, y2, draw);
      //根据参数计算绘制点
      startPoint = {'x': x1, 'y': y1};
      stopPoint = {'x': x2, 'y': y2 + 0.5};
      linePath.addAll([
        [
          "moveTo",
          [startPoint['x'], startPoint['y']]
        ],
        [
          "lineTo",
          [stopPoint['x'], stopPoint['y']]
        ]
      ]);
      if (draw['selected'] != null && draw['selected'] ||
          draw['highlight'] != null && draw['highlight']) {
        circlePath.addAll([
          [
            "drawCircle",
            [x1, y1, circleR]
          ],
          [
            "drawCircle",
            [x2, y2, circleR]
          ]
        ]);
      }
    }
  } else if (lineType == Line['SX']) {
    if (point.length >= 2) {
      x1 = kx +
          (point[0]['x'] - pro.kStartI) * pro.kWG +
          point[0]['xp'] +
          pro.kStartX;
      y1 = ky + Tools.priceToY(pro.kYh, point[0]['y'], pro.kYMin, pro.kScale);
      x2 = kx +
          (point[1]['x'] - pro.kStartI) * pro.kWG +
          point[1]['xp'] +
          pro.kStartX;
      y2 = ky + Tools.priceToY(pro.kYh, point[1]['y'], pro.kYMin, pro.kScale);

      //原始点
      draw['startPoint'] = {'x': x1, 'y': y1};
      draw['stopPoint'] = {'x': x2, 'y': y2};
      //根据鼠标点计算直线方程所需参数
      k = (y2 - y1) / (x2 - x1);
      //第一根线 两个点
      b = y1 - k * x1;
      if (x2 > x1) {
        startPoint['x'] = x1;
        startPoint['y'] = y1;
        stopPoint['x'] = kx + kw;
        stopPoint['y'] = k * stopPoint['x']! + b;
      } else {
        startPoint['x'] = kx;
        startPoint['y'] = k * startPoint['x']! + b;
        stopPoint['x'] = x1;
        stopPoint['y'] = y1;
      }
      linePath.addAll([
        [
          "moveTo",
          [startPoint['x'], startPoint['y']]
        ],
        [
          "lineTo",
          [stopPoint['x'], stopPoint['y']]
        ]
      ]);
      if (draw['selected'] != null && draw['selected'] ||
        draw['highlight'] != null && draw['highlight']) {
        circlePath.addAll([
          [
            "drawCircle",
            [x1, y1, circleR]
          ],
          [
            "drawCircle",
            [x2, y2, circleR]
          ]
        ]);
      }
    }
  } else if (lineType == Line['SPSX']) {
    if (point.length >= 2) {
      x1 = kx +
          (point[0]['x'] - pro.kStartI) * pro.kWG +
          point[0]['xp'] +
          pro.kStartX;
      y1 = ky + Tools.priceToY(pro.kYh, point[0]['y'], pro.kYMin, pro.kScale);
      x2 = kx +
          (point[1]['x'] - pro.kStartI) * pro.kWG +
          point[1]['xp'] +
          pro.kStartX;
      y2 = y1;
      //原始点
      draw['startPoint'] = {'x': x1, 'y': y1};
      draw['stopPoint'] = {'x': x2, 'y': y2};

      if (x2 > x1) {
        //根据参数计算绘制点
        startPoint = {'x': x1, 'y': y1};
        stopPoint = {'x': kx + kw, 'y': y2 + 0.5};
      } else {
        //根据参数计算绘制点
        startPoint = {'x': kx, 'y': y2 + 0.5};
        stopPoint = {'x': x1, 'y': y1};
      }

      linePath.addAll([
        [
          "moveTo",
          [startPoint['x'], startPoint['y']]
        ],
        [
          "lineTo",
          [stopPoint['x'], stopPoint['y']]
        ]
      ]);
      if (draw['selected'] != null && draw['selected'] ||
          draw['highlight'] != null && draw['highlight']) {
        circlePath.addAll([
          [
            "drawCircle",
            [x1, y1, circleR]
          ],
          [
            "drawCircle",
            [x2, y2, circleR]
          ]
        ]);
      }
    }
  } else if (lineType == Line['JGX']) {
    //价格线 跟水平射线一样  只是多了价格  斐波那契可以理解为多跟价格线 将区间y分成几份
    if (point.length >= 1) {
      //x1 直接采用点击时的屏幕x坐标(通过xxbfb * _kw反推出来,这样屏幕尺寸发生改变后,x1也会在正确的位置),不在和k线挂钩,这样k线移动不受影响,线始终以点击时坐标为基准布局。但是y轴随之变化
      x1 = kx +
          (point[0]['xxbfb'] * kw)
              .floor(); //(point[0]['x']-pro.kStartI)*(pro.kW+pro.kGap)+point[0]['xp']+pro.kStartX;
      y1 = ky + Tools.priceToY(pro.kYh, point[0]['y'], pro.kYMin, pro.kScale);
      //原始点
      draw['startPoint'] = {'x': x1, 'y': y1};

      //根据参数计算绘制点
      startPoint = {'x': x1, 'y': y1};
      stopPoint = {'x': x1 + kw, 'y': y1};
      linePath.addAll([
        [
          "moveTo",
          [startPoint['x'], startPoint['y']]
        ],
        [
          "lineTo",
          [stopPoint['x'], stopPoint['y']]
        ]
      ]);
      txtPath.add(
          [point[0]['y'], x1 + 5, y1 + 5, config[Line['JGX']]['txtStyle']]);

      if (draw['selected'] != null && draw['selected'] ||
          draw['highlight'] != null && draw['highlight']) {
        circlePath.add([
          "drawCircle",
          [x1, y1, circleR]
        ]);
      }

    }
  } else if (lineType == Line['SJ']) {
    if (point.length >= 2) {
      x1 = kx +
          (point[0]['x'] - pro.kStartI) * pro.kWG +
          point[0]['xp'] +
          pro.kStartX;
      y1 = ky + Tools.priceToY(pro.kYh, point[0]['y'], pro.kYMin, pro.kScale);
      x2 = kx +
          (point[1]['x'] - pro.kStartI) * pro.kWG +
          point[1]['xp'] +
          pro.kStartX;
      y2 = ky + Tools.priceToY(pro.kYh, point[1]['y'], pro.kYMin, pro.kScale);
      linePath.addAll([
        [
          "moveTo",
          [x1, y1]
        ],
        [
          "lineTo",
          [x2, y2]
        ]
      ]);
      if (point.length >= 3) {
        x3 = kx +
            (point[2]['x'] - pro.kStartI) * pro.kWG +
            point[2]['xp'] +
            pro.kStartX;
        y3 = ky +
            Tools.priceToY(pro.kYh, point[2]['y'], pro.kYMin, pro.kScale);
        linePath.addAll([
          [
            "lineTo",
            [x3, y3]
          ],
          [
            "lineTo",
            [x1, y1]
          ]
        ]);
      }
      fillPath = linePath;
      //原始点
      draw['startPoint'] = {'x': x1, 'y': y1};
      draw['secondPoint'] = {'x': x2, 'y': y2};
      draw['stopPoint'] = {'x': x3, 'y': y3};

      if ((draw['selected'] != null && draw['selected'] ||
              draw['highlight'] != null && draw['highlight']) &&
          point.length >= 3) {
        circlePath.addAll([
          [
            "drawCircle",
            [x1, y1, circleR]
          ],
          [
            "drawCircle",
            [x2, y2, circleR]
          ],
          [
            "drawCircle",
            [x3, y3, circleR]
          ]
        ]);
      }
    }
  } else if (lineType == Line['JX']) {
    if (point.length >= 2) {
      x1 = kx +
          (point[0]['x'] - pro.kStartI) * (pro.kWG) +
          point[0]['xp'] +
          pro.kStartX;
      y1 = ky + Tools.priceToY(pro.kYh, point[0]['y'], pro.kYMin, pro.kScale);
      x2 = kx +
          (point[1]['x'] - pro.kStartI) * (pro.kWG) +
          point[1]['xp'] +
          pro.kStartX;
      y2 = ky + Tools.priceToY(pro.kYh, point[1]['y'], pro.kYMin, pro.kScale);
      // print('x1 ${x1} x2 ${x2}.  kx ${kx}. kStartI${pro.kStartI}. pro.kWG ${pro.kWG}. point ${point}');
      //原始点
      draw['startPoint'] = {'x': x1, 'y': y1};
      draw['stopPoint'] = {'x': x2, 'y': y2};
      reactPath.add([
        "drawRect",
        [
          (x2 < x1 ? x1 - (x2 - x1).abs() : x1),
          (y2 < y1 ? y1 - (y2 - y1).abs() : y1),
          (x2 - x1).abs(),
          (y2 - y1).abs(),
        ]
      ]);
      fillPath = reactPath;
      if (draw['selected'] != null && draw['selected'] ||
          draw['highlight'] != null && draw['highlight']) {
        circlePath.addAll([
          [
            "drawCircle",
            [x1, y1, circleR]
          ],
          [
            "drawCircle",
            [x2, y2, circleR]
          ]
        ]);
      }
    }
  } else if (lineType == Line['PXSX']) {
    if (point.length >= 2) {
      x1 = kx +
          (point[0]['x'] - pro.kStartI) * pro.kWG +
          point[0]['xp'] +
          pro.kStartX;
      y1 = ky + Tools.priceToY(pro.kYh, point[0]['y'], pro.kYMin, pro.kScale);
      x2 = kx +
          (point[1]['x'] - pro.kStartI) * pro.kWG +
          point[1]['xp'] +
          pro.kStartX;
      y2 = ky + Tools.priceToY(pro.kYh, point[1]['y'], pro.kYMin, pro.kScale);

      k = (y2 - y1) / (x2 - x1);
      //第一根线 两个点
      b = y1 - k * x1;
      if (x2 > x1) {
        startPoint['x'] = x1;
        startPoint['y'] = y1;
        stopPoint['x'] = kx + kw;
        stopPoint['y'] = k * stopPoint['x']! + b;
      } else {
        startPoint['x'] = kx;
        startPoint['y'] = k * startPoint['x']! + b;
        stopPoint['x'] = x1;
        stopPoint['y'] = y1;
      }
      firstPoint = startPoint;
      linePath.addAll([
        [
          "moveTo",
          [startPoint['x'], startPoint['y']]
        ],
        [
          "lineTo",
          [stopPoint['x'], stopPoint['y']]
        ]
      ]);
      fillPath.addAll([
        [
          "moveTo",
          [startPoint['x'], startPoint['y']]
        ],
        [
          "lineTo",
          [stopPoint['x'], stopPoint['y']]
        ]
      ]);
      if (point.length >= 3) {
        //第三个点 产生另外一条线
        //第二根线 一个点 从新计算b 斜率相同
        x3 = kx +
            (point[2]['x'] - pro.kStartI) * pro.kWG +
            point[2]['xp'] +
            pro.kStartX;
        y3 = ky +
            Tools.priceToY(pro.kYh, point[2]['y'], pro.kYMin, pro.kScale);
        b = y3 - k * x3;
        if (x2 > x1) {
          startPoint['x'] = x3;
          startPoint['y'] = y3;
          stopPoint['x'] = kx + kw;
          stopPoint['y'] = k * stopPoint['x']! + b;
        } else {
          startPoint['x'] = kx;
          startPoint['y'] = k * startPoint['x']! + b;
          stopPoint['x'] = x3;
          stopPoint['y'] = y3;
        }
        linePath.addAll([
          [
            "moveTo",
            [startPoint['x'], startPoint['y']]
          ],
          [
            "lineTo",
            [stopPoint['x'], stopPoint['y']]
          ]
        ]);

        fillPath.addAll([
          [
            "lineTo",
            [stopPoint['x'], stopPoint['y']]
          ],
          [
            "lineTo",
            [startPoint['x'], startPoint['y']]
          ],[
            "lineTo",
            [firstPoint['x'], firstPoint['y']]
          ],
        ]);
      }

      //原始点
      draw['startPoint'] = {'x': x1, 'y': y1};
      draw['secondPoint'] = {'x': x2, 'y': y2};
      draw['stopPoint'] = {'x': x3, 'y': y3};

      if (draw['selected'] != null && draw['selected'] ||
          draw['highlight'] != null && draw['highlight']) {
        circlePath.addAll([
          [
            "drawCircle",
            [x1, y1, circleR]
          ],
          [
            "drawCircle",
            [x2, y2, circleR]
          ]
        ]);
        if (point.length >= 3) {
          //第三个点 产生另外一条线
          //第二根线 一个点 从新计算b 斜率相同
          circlePath.add([
            "drawCircle",
            [x3, y3, circleR]
          ]);
        }
      }
    }
  } else if (lineType == Line['PXZX']) {
    if (point.length >= 2) {
      x1 = kx +
          (point[0]['x'] - pro.kStartI) * pro.kWG +
          point[0]['xp'] +
          pro.kStartX;
      y1 = ky + Tools.priceToY(pro.kYh, point[0]['y'], pro.kYMin, pro.kScale);
      x2 = kx +
          (point[1]['x'] - pro.kStartI) * pro.kWG +
          point[1]['xp'] +
          pro.kStartX;
      y2 = ky + Tools.priceToY(pro.kYh, point[1]['y'], pro.kYMin, pro.kScale);
      k = (y2 - y1) / (x2 - x1);
      //第一根线 两个点
      b = y1 - k * x1;
      startPoint['x'] = kx;
      startPoint['y'] = k * startPoint['x']! + b;
      stopPoint['x'] = kx + kw;
      stopPoint['y'] = k * stopPoint['x']! + b;
      firstPoint = startPoint;

      linePath.addAll([
        [
          "moveTo",
          [startPoint['x'], startPoint['y']]
        ],
        [
          "lineTo",
          [stopPoint['x'], stopPoint['y']]
        ]
      ]);
      fillPath.addAll([
        [
          "moveTo",
          [startPoint['x'], startPoint['y']]
        ],
        [
          "lineTo",
          [stopPoint['x'], stopPoint['y']]
        ]
      ]);
      //第二根线 一个点 从新计算b 斜率相同
      if (point.length >= 3) {
        //第三个点 产生另外一条线
        x3 = kx +
            (point[2]['x'] - pro.kStartI) * pro.kWG +
            point[2]['xp'] +
            pro.kStartX;
        y3 = ky +
            Tools.priceToY(pro.kYh, point[2]['y'], pro.kYMin, pro.kScale);
        b = y3 - k * x3;
        startPoint['x'] = kx;
        startPoint['y'] = k * startPoint['x']! + b;
        stopPoint['x'] = kx + kw;
        stopPoint['y'] = k * stopPoint['x']! + b;
        linePath.addAll([
          [
            "moveTo",
            [startPoint['x'], startPoint['y']]
          ],
          [
            "lineTo",
            [stopPoint['x'], stopPoint['y']]
          ]
        ]);
        fillPath.addAll([
          [
            "lineTo",
            [stopPoint['x'], stopPoint['y']]
          ],
          [
            "lineTo",
            [startPoint['x'], startPoint['y']]
          ],[
            "lineTo",
            [firstPoint['x'], firstPoint['y']]
          ],
        ]);
      }

      //原始点
      draw['startPoint'] = {'x': x1, 'y': y1};
      draw['secondPoint'] = {'x': x2, 'y': y2};
      draw['stopPoint'] = {'x': x3, 'y': y3};

      if (draw['selected'] != null && draw['selected'] ||
          draw['highlight'] != null && draw['highlight']) {
        circlePath.addAll([
          [
            "drawCircle",
            [x1, y1, circleR]
          ],
          [
            "drawCircle",
            [x2, y2, circleR]
          ]
        ]);
        //第二根线 一个点 从新计算b 斜率相同
        if (point.length >= 3) {
          //第三个点 产生另外一条线
          circlePath.add([
            "drawCircle",
            [x3, y3, circleR]
          ]);
        }
      }
    }
  } else if (lineType == Line['TDX']) {
    if (point.length >= 2) {
      x1 = kx +
          (point[0]['x'] - pro.kStartI) * pro.kWG +
          point[0]['xp'] +
          pro.kStartX;
      y1 = ky + Tools.priceToY(pro.kYh, point[0]['y'], pro.kYMin, pro.kScale);
      x2 = kx +
          (point[1]['x'] - pro.kStartI) * pro.kWG +
          point[1]['xp'] +
          pro.kStartX;
      y2 = ky + Tools.priceToY(pro.kYh, point[1]['y'], pro.kYMin, pro.kScale);

      if (x1 == x2) {
        //竖向通道线
        startPoint['x'] = x1;
        startPoint['y'] = ky;
        stopPoint['x'] = x2;
        stopPoint['y'] = ky + kh;
      } else if (y1 == y2) {
        //横向通道线
        startPoint['x'] = kx;
        startPoint['y'] = y1;
        stopPoint['x'] = kx + kw;
        stopPoint['y'] = y2;
      } else {
        k = (y2 - y1) / (x2 - x1);
        b = y1 - k * x1;
        startPoint['x'] = kx;
        startPoint['y'] = k * startPoint['x']! + b;
        stopPoint['x'] = kx + kw;
        stopPoint['y'] = k * stopPoint['x']! + b;
      }
      linePath.addAll([
        [
          "moveTo",
          [startPoint['x'], startPoint['y']]
        ],
        [
          "lineTo",
          [stopPoint['x'], stopPoint['y']]
        ]
      ]);
      if (point.length >= 3) {
        x3 = kx +
            (point[2]['x'] - pro.kStartI) * pro.kWG +
            point[2]['xp'] +
            pro.kStartX;
        y3 = ky +
            Tools.priceToY(pro.kYh, point[2]['y'], pro.kYMin, pro.kScale);

        if (x1 == x2) {
          //竖向通道线
          startPoint['x'] = x1 - (x3 - x1).abs();
          startPoint['y'] = ky;
          stopPoint['x'] = x1 - (x3 - x1).abs();
          stopPoint['y'] = ky + kh;
          linePath.addAll([
            [
              "moveTo",
              [startPoint['x'], startPoint['y']]
            ],
            [
              "lineTo",
              [stopPoint['x'], stopPoint['y']]
            ]
          ]);
          firstPoint = startPoint;
          fillPath.addAll([
            [
              "moveTo",
              [startPoint['x'], startPoint['y']]
            ],
            [
              "lineTo",
              [stopPoint['x'], stopPoint['y']]
            ]
          ]);
          startPoint['x'] = x1 + (x3 - x1).abs();
          startPoint['y'] = ky;
          stopPoint['x'] = x1 + (x3 - x1).abs();
          stopPoint['y'] = ky + kh;
          linePath.addAll([
            [
              "moveTo",
              [startPoint['x'], startPoint['y']]
            ],
            [
              "lineTo",
              [stopPoint['x'], stopPoint['y']]
            ]
          ]);
          fillPath.addAll([
            [
              "lineTo",
              [stopPoint['x'], stopPoint['y']]
            ],
            [
              "lineTo",
              [startPoint['x'], startPoint['y']]
            ],[
              "lineTo",
              [firstPoint['x'], firstPoint['y']]
            ],
          ]);
        } else if (y1 == y2) {
          //横向通道线
          startPoint['x'] = kx;
          startPoint['y'] = y1 - (y3 - y1).abs();
          stopPoint['x'] = kx + kw;
          stopPoint['y'] = y1 - (y3 - y1).abs();
          linePath.addAll([
            [
              "moveTo",
              [startPoint['x'], startPoint['y']]
            ],
            [
              "lineTo",
              [stopPoint['x'], stopPoint['y']]
            ]
          ]);
          firstPoint = startPoint;
          fillPath.addAll([
            [
              "moveTo",
              [startPoint['x'], startPoint['y']]
            ],
            [
              "lineTo",
              [stopPoint['x'], stopPoint['y']]
            ]
          ]);
          startPoint['x'] = kx;
          startPoint['y'] = y1 + (y3 - y1).abs();
          stopPoint['x'] = kx + kw;
          stopPoint['y'] = y1 + (y3 - y1).abs();
          linePath.addAll([
            [
              "moveTo",
              [startPoint['x'], startPoint['y']]
            ],
            [
              "lineTo",
              [stopPoint['x'], stopPoint['y']]
            ]
          ]);
          fillPath.addAll([
            [
              "lineTo",
              [stopPoint['x'], stopPoint['y']]
            ],
            [
              "lineTo",
              [startPoint['x'], startPoint['y']]
            ],[
              "lineTo",
              [firstPoint['x'], firstPoint['y']]
            ],
          ]);
        } else {
          var p1 = k * x3 + b;
          y4 = p1 - (y3 - p1);
          b = y3 - k * x3;
          startPoint['x'] = kx;
          startPoint['y'] = k * startPoint['x']! + b;
          stopPoint['x'] = kx + kw;
          stopPoint['y'] = k * stopPoint['x']! + b;
          linePath.addAll([
            [
              "moveTo",
              [startPoint['x'], startPoint['y']]
            ],
            [
              "lineTo",
              [stopPoint['x'], stopPoint['y']]
            ]
          ]);
          firstPoint = startPoint;
          fillPath.addAll([
            [
              "moveTo",
              [startPoint['x'], startPoint['y']]
            ],
            [
              "lineTo",
              [stopPoint['x'], stopPoint['y']]
            ]
          ]);
          b = y4 - k * x3;
          startPoint['x'] = kx;
          startPoint['y'] = k * startPoint['x']! + b;
          stopPoint['x'] = kx + kw;
          stopPoint['y'] = k * stopPoint['x']! + b;
          linePath.addAll([
            [
              "moveTo",
              [startPoint['x'], startPoint['y']]
            ],
            [
              "lineTo",
              [stopPoint['x'], stopPoint['y']]
            ]
          ]);
          fillPath.addAll([
            [
              "lineTo",
              [stopPoint['x'], stopPoint['y']]
            ],
            [
              "lineTo",
              [startPoint['x'], startPoint['y']]
            ],[
              "lineTo",
              [firstPoint['x'], firstPoint['y']]
            ],
          ]);

        }
      }

      draw['startPoint'] = {'x': x1, 'y': y1};
      draw['secondPoint'] = {'x': x2, 'y': y2};
      draw['stopPoint'] = {'x': x3, 'y': y3};

      if (draw['selected'] != null && draw['selected'] ||
          draw['highlight'] != null && draw['highlight']) {
        circlePath.addAll([
          [
            "drawCircle",
            [x1, y1, circleR]
          ],
          [
            "drawCircle",
            [x2, y2, circleR]
          ]
        ]);
        if (point.length >= 3) {
          circlePath.add([
            "drawCircle",
            [x3, y3, circleR]
          ]);
        }
      }
    }
  } else if (lineType == Line['FBNQ']) {
    if (point.length >= 2) {
      x1 = kx + (point[0]['xxbfb'] * kw).floor();
      y1 = ky + Tools.priceToY(pro.kYh, point[0]['y'], pro.kYMin, pro.kScale);
      x2 = x1;
      y2 = ky + Tools.priceToY(pro.kYh, point[1]['y'], pro.kYMin, pro.kScale);

      draw['startPoint'] = {'x': x1, 'y': y1};
      draw['stopPoint'] = {'x': x2, 'y': y2};

      var jg = (point[0]['y'] - point[1]['y']).abs();
      if (jg > 0) {
        var dic = y2 < y1 ? 1 : -1; // -1 向上画线 1向下画线
        dynamic fbnqp, fbnqy;
        dic *= 1; //Tools.YDIC;

        for (var i = 0, il = FBNQP.length; i < il; i++) {
          fbnqp = point[1]['y'] - dic * jg * FBNQP[i];
          fbnqp = Tools.toFixed(
              fbnqp, klineState.widget.propertys['priceDigits']);

          fbnqy = ky +
              Tools.priceToY(
                  pro.kYh, num.parse(fbnqp), pro.kYMin, pro.kScale);

          linePath.addAll([
            [
              "moveTo",
              [x1, fbnqy]
            ],
            [
              "lineTo",
              [x1 + kw, fbnqy]
            ]
          ]);
          if(i == 0){
            firstPoint = {'x':x1,'y':fbnqy};
            fillPath.addAll([
              [
                "moveTo",
                [x1, fbnqy]
              ],
              [
                "lineTo",
                [x1 + kw, fbnqy]
              ]
            ]);
          }else if(i == il-1){
            fillPath.addAll([
              [
                "lineTo",
                [x1 + kw, fbnqy]
              ],
              [
                "lineTo",
                [x1, fbnqy]
              ],
              [
                "lineTo",
                [firstPoint['x'], firstPoint['y']]
              ]
            ]);
          }
          txtPath.add([
            '${Tools.toFixed(FBNQP[i] * 100, 1)}%   $fbnqp',
            x1,
            fbnqy + 5,
            config[Line['FBNQ']]['txtStyle']
          ]); //
        }
      }

      if (draw['selected'] != null && draw['selected'] ||
          draw['highlight'] != null && draw['highlight']) {
        circlePath.add([
          "drawCircle",
          [x2, y2, circleR]
        ]);
      }
    }
  } else if (lineType == Line['FBNQSX']) {
    if (point.length >= 2) {
      x1 = kx +
          (point[0]['x'] - pro.kStartI) * pro.kWG +
          point[0]['xp'] +
          pro.kStartX;
      y1 = ky + Tools.priceToY(pro.kYh, point[0]['y'], pro.kYMin, pro.kScale);
      x2 = kx +
          (point[1]['x'] - pro.kStartI) * pro.kWG +
          point[1]['xp'] +
          pro.kStartX;
      y2 = ky + Tools.priceToY(pro.kYh, point[1]['y'], pro.kYMin, pro.kScale);

      draw['startPoint'] = {'x': x1, 'y': y1};
      draw['stopPoint'] = {'x': x2, 'y': y2};

      k = (y2 - y1) / (x2 - x1);
      //第一根线 两个点
      b = y1 - k * x1;
      if (x2 > x1) {
        startPoint['x'] = x1;
        startPoint['y'] = y1;
        stopPoint['x'] = kx + kw;
        stopPoint['y'] = k * stopPoint['x']! + b;
      } else {
        startPoint['x'] = kx;
        startPoint['y'] = k * startPoint['x']! + b;
        stopPoint['x'] = x1;
        stopPoint['y'] = y1;
      }

      firstPoint = startPoint;
      linePath.addAll([
        [
          "moveTo",
          [startPoint['x'], startPoint['y']]
        ],
        [
          "lineTo",
          [stopPoint['x'], stopPoint['y']]
        ]
      ]);
      fillPath.addAll([
        [
          "moveTo",
          [startPoint['x'], startPoint['y']]
        ],
        [
          "lineTo",
          [stopPoint['x'], stopPoint['y']]
        ]
      ]);
      if (draw['selected'] != null && draw['selected'] ||
          draw['highlight'] != null && draw['highlight']) {
        circlePath.addAll([
          [
            "drawCircle",
            [x1, y1, circleR]
          ],
          [
            "drawCircle",
            [x2, y2, circleR]
          ]
        ]);
      }

      //其余三根线
      var jg = (point[0]['y'] - point[1]['y']).abs();
      if (jg > 0) {
        var dic = y2 < y1 ? 1 : -1; // -1 向上画线 1向下画线
        dynamic p;
        dic *= 1; //Tools.YDIC;
        var drawp = {};
        for (var i = 0, il = FBNQSXP.length; i < il; i++) {
          //计算y2
          p = (point[1]['y']) - dic * jg * FBNQSXP[i];
          p = Tools.toFixed(p, klineState.widget.propertys['priceDigits']);
          y2 = ky +
              Tools.priceToY(pro.kYh, num.parse(p), pro.kYMin, pro.kScale);
          drawp['startPoint'] = {'x': x1, 'y': y1};
          drawp['stopPoint'] = {'x': x2, 'y': y2};

          //用来计算是否在此条线上用的
          draw["sxPoint$i"] = {'x': x2, 'y': y2};
          k = (y2 - y1) / (x2 - x1);
          //第一根线 两个点
          b = y1 - k * x1;
          if (x2 > x1) {
            startPoint['x'] = x1;
            startPoint['y'] = y1;
            stopPoint['x'] = kx + kw;
            stopPoint['y'] = k * stopPoint['x']! + b;
          } else {
            startPoint['x'] = kx;
            startPoint['y'] = k * startPoint['x']! + b;
            stopPoint['x'] = x1;
            stopPoint['y'] = y1;
          }

          linePath.addAll([
            [
              "moveTo",
              [startPoint['x'], startPoint['y']]
            ],
            [
              "lineTo",
              [stopPoint['x'], stopPoint['y']]
            ]
          ]);
          txtPath.add([
            '${Tools.toFixed(FBNQSXP[i] * 100, 1)}%   $p',
            x2,
            y2,
            config[Line['FBNQSX']]['txtStyle']
          ]); //

          if(i == il-1){
            fillPath.addAll([
            [
              "lineTo",
              [stopPoint['x'], stopPoint['y']]
            ],
            [
              "lineTo",
              [startPoint['x'], startPoint['y']]
            ],[
              "lineTo",
              [firstPoint['x'], firstPoint['y']]
            ],
          ]);
          }
        }
      }
    }
  } else if (lineType == Line['CL']) {
    //退出画线时,需要移出lineName 是 Line['CL'] 的 测量线路径
    if (point.length >= 2) {
      x1 = kx +
          (point[0]['x'] - pro.kStartI) * pro.kWG +
          point[0]['xp'] +
          pro.kStartX;
      y1 = ky + Tools.priceToY(pro.kYh, point[0]['y'], pro.kYMin, pro.kScale);
      x2 = kx +
          (point[1]['x'] - pro.kStartI) * pro.kWG +
          point[1]['xp'] +
          pro.kStartX;
      y2 = ky + Tools.priceToY(pro.kYh, point[1]['y'], pro.kYMin, pro.kScale);

      draw['startPoint'] = {'x': x1, 'y': y1};
      draw['stopPoint'] = {'x': x2, 'y': y2};

      var knum = point[1]['x'] - point[0]['x'];
      var interval = klineState.widget.propertys['interval'];
      var ktime = Tools.getClStr(interval, knum);
      var pcha = Tools.floatSub(point[1]['y'], point[0]['y']);
      var showstr =
          '${klineState.widget.propertys['i18n']['cltip'].replaceAll("v1", knum.toString())}  $ktime  $pcha';
      var ktimesize = Tools.getStrW(showstr, style['drawLineStyle']['font']);
      reactPath.add([
        "drawRect",
        [
          (x2 < x1 ? x1 - (x2 - x1).abs() : x1),
          (y2 < y1 ? y1 - (y2 - y1).abs() : y1),
          (x2 - x1).abs(),
          (y2 - y1).abs(),
        ]
      ]);
      txtPath.add([
        showstr,
        x1 + (x2 - x1) / 2 - ktimesize['width'] / 2,
        y1 + (y2 - y1 - ktimesize['height']) / 2,
        config[Line['CL']]['txtStyle']
      ]);
    }
  }

  return {
    'style': draw['style'],
    'linePath': linePath,
    'txtPath': txtPath,
    'reactPath': reactPath,
    'fillPath':fillPath,
    'circlePath': circlePath,

  };
}