function getBondPath()

in packages/ketcher-core/src/application/render/restruct/rebond.ts [559:754]


function getBondPath(
  restruct: ReStruct,
  bond: ReBond,
  hb1: HalfBond,
  hb2: HalfBond,
  isSnapping: boolean,
) {
  let path: any = null;
  const render = restruct.render;
  const struct = restruct.molecule;
  const shiftA = !restruct.atoms.get(hb1.begin)?.showLabel;
  const shiftB = !restruct.atoms.get(hb2.begin)?.showLabel;
  let newHalfBonds: [HalfBond, HalfBond];
  const xShiftMinus1 = -1;
  const xShiftPlus1 = 1;
  switch (bond.b.type) {
    case Bond.PATTERN.TYPE.SINGLE:
      switch (bond.b.stereo) {
        case Bond.PATTERN.STEREO.UP:
          findIncomingUpBonds(hb1.bid, bond, restruct);
          if (bond.boldStereo && bond.neihbid1 >= 0 && bond.neihbid2 >= 0) {
            path = getBondSingleStereoBoldPath(
              render,
              hb1,
              hb2,
              bond,
              struct,
              isSnapping,
            );
          } else
            path = getBondSingleUpPath(
              render,
              hb1,
              hb2,
              bond,
              struct,
              isSnapping,
            );
          break;
        case Bond.PATTERN.STEREO.DOWN:
          path = getBondSingleDownPath(
            render,
            hb1,
            hb2,
            bond,
            struct,
            isSnapping,
          );
          break;
        case Bond.PATTERN.STEREO.EITHER:
          path = getBondSingleEitherPath(
            render,
            hb1,
            hb2,
            bond,
            struct,
            isSnapping,
          );
          break;
        default:
          path = draw.bondSingle(
            render.paper,
            hb1,
            hb2,
            render.options,
            isSnapping,
            getStereoBondColor(render.options, bond, struct),
          );
          break;
      }
      break;
    case Bond.PATTERN.TYPE.DOUBLE:
      findIncomingUpBonds(hb1.bid, bond, restruct);
      if (
        bond.b.stereo === Bond.PATTERN.STEREO.NONE &&
        bond.boldStereo &&
        bond.neihbid1 >= 0 &&
        bond.neihbid2 >= 0
      ) {
        path = getBondDoubleStereoBoldPath(
          render,
          hb1,
          hb2,
          bond,
          struct,
          shiftA,
          shiftB,
          isSnapping,
        );
      } else
        path = getBondDoublePath(
          render,
          hb1,
          hb2,
          bond,
          shiftA,
          shiftB,
          isSnapping,
        );
      break;
    case Bond.PATTERN.TYPE.TRIPLE:
      path = draw.bondTriple(
        render.paper,
        hb1,
        hb2,
        render.options,
        isSnapping,
      );
      break;
    case Bond.PATTERN.TYPE.AROMATIC: {
      const inAromaticLoop =
        (hb1.loop >= 0 && struct.loops.get(hb1.loop)?.aromatic) ||
        (hb2.loop >= 0 && struct.loops.get(hb2.loop)?.aromatic);
      path = inAromaticLoop
        ? draw.bondSingle(render.paper, hb1, hb2, render.options, isSnapping)
        : getBondAromaticPath(
            render,
            hb1,
            hb2,
            bond,
            shiftA,
            shiftB,
            isSnapping,
          );
      break;
    }
    case Bond.PATTERN.TYPE.SINGLE_OR_DOUBLE:
      newHalfBonds = util.updateHalfBondCoordinates(hb1, hb2, xShiftPlus1);
      path = getSingleOrDoublePath(
        render,
        newHalfBonds[0],
        newHalfBonds[1],
        isSnapping,
      );
      break;
    case Bond.PATTERN.TYPE.SINGLE_OR_AROMATIC:
      path = getBondAromaticPath(
        render,
        hb1,
        hb2,
        bond,
        shiftA,
        shiftB,
        isSnapping,
      );
      break;
    case Bond.PATTERN.TYPE.DOUBLE_OR_AROMATIC:
      newHalfBonds = util.updateHalfBondCoordinates(hb1, hb2, xShiftMinus1);
      path = getBondAromaticPath(
        render,
        newHalfBonds[0],
        newHalfBonds[1],
        bond,
        shiftA,
        shiftB,
        isSnapping,
      );
      break;
    case Bond.PATTERN.TYPE.ANY:
      newHalfBonds = util.updateHalfBondCoordinates(hb1, hb2, xShiftMinus1);
      path = draw.bondAny(
        render.paper,
        newHalfBonds[0],
        newHalfBonds[1],
        render.options,
        isSnapping,
      );
      break;
    case Bond.PATTERN.TYPE.HYDROGEN:
      newHalfBonds = util.updateHalfBondCoordinates(hb1, hb2, xShiftPlus1);
      path = draw.bondHydrogen(
        render.paper,
        newHalfBonds[0],
        newHalfBonds[1],
        render.options,
        isSnapping,
      );
      break;
    case Bond.PATTERN.TYPE.DATIVE:
      path = draw.bondDative(
        render.paper,
        hb1,
        hb2,
        render.options,
        isSnapping,
      );
      break;
    default:
      throw new Error('Bond type ' + bond.b.type + ' not supported');
  }
  if (path) {
    const { previewOpacity } = render.options;
    path.attr({ opacity: bond.b.isPreview ? previewOpacity : 1 });
  }
  return path;
}