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;
}