in packages/ketcher-core/src/application/render/renderers/PolymerBondRenderer/SnakeModePolymerBondRenderer.ts [457:655]
private updateSnakeBondPath(
startPosition: Vec2,
endPosition: Vec2,
reCheckAttachmentPoint = true,
): void {
const isR1TheCurrentAttachmentPointOfFirstMonomer =
this.polymerBond.firstMonomer.getAttachmentPointByBond(
this.polymerBond,
) === 'R1' ||
this.polymerBond.firstMonomer.getPotentialAttachmentPointByBond(
this.polymerBond,
) === 'R1';
// check if there is nucleotide in current row
const isBondConnectedWithNucleotide =
this.polymerBond.firstMonomer.isMonomerInRnaChainRow;
const verticalLineLength = this.polymerBond.firstMonomer.monomerItem
.isAntisense
? RNA_ANTISENSE_CHAIN_VERTICAL_LINE_LENGTH
: this.polymerBond.firstMonomer.monomerItem.isSense &&
(this.polymerBond.restOfRowsWithAntisense || 0) > 0
? RNA_SENSE_CHAIN_VERTICAL_LINE_LENGTH
: isBondConnectedWithNucleotide
? RNA_CHAIN_VERTICAL_LINE_LENGTH
: VERTICAL_LINE_LENGTH + 5;
if (this.isSecondMonomerBottomRight(startPosition, endPosition)) {
if (
isR1TheCurrentAttachmentPointOfFirstMonomer &&
reCheckAttachmentPoint
) {
this.updateSnakeBondPath(endPosition, startPosition, false);
return;
}
this.addLine(
LineDirection.Horizontal,
LINE_FROM_MONOMER_LENGTH + this.getMonomerWidth() / 2,
startPosition,
);
this.addLineFromLeftToBottom();
this.addLine(
LineDirection.Vertical,
endPosition.y - startPosition.y - CORNER_LENGTH * 2,
);
this.addLineFromTopToRight();
this.addLine(
LineDirection.Horizontal,
endPosition.x -
startPosition.x -
CORNER_LENGTH * 2 -
LINE_FROM_MONOMER_LENGTH -
this.getMonomerWidth() / 2,
);
} else if (this.isSecondMonomerTopRight(startPosition, endPosition)) {
if (
isR1TheCurrentAttachmentPointOfFirstMonomer &&
reCheckAttachmentPoint
) {
this.updateSnakeBondPath(endPosition, startPosition, false);
return;
}
this.addLine(
LineDirection.Horizontal,
LINE_FROM_MONOMER_LENGTH + this.getMonomerWidth() / 2,
startPosition,
);
this.addLineFromLeftToTop();
this.addLine(
LineDirection.Vertical,
endPosition.y -
startPosition.y -
CORNER_LENGTH * 2 +
this.getMonomerHeight() / 2,
);
this.addLineFromBottomToRight();
this.addLine(
LineDirection.Horizontal,
endPosition.x -
startPosition.x -
CORNER_LENGTH * 2 -
LINE_FROM_MONOMER_LENGTH -
this.getMonomerWidth() / 2,
);
} else if (this.isSecondMonomerBottomLeft(startPosition, endPosition)) {
if (
isR1TheCurrentAttachmentPointOfFirstMonomer &&
reCheckAttachmentPoint
) {
this.updateSnakeBondPath(endPosition, startPosition, false);
return;
}
this.addLine(
LineDirection.Horizontal,
LINE_FROM_MONOMER_LENGTH -
(this.polymerBond.firstMonomer.monomerItem.isAntisense ? 10 : 0) +
this.getMonomerWidth() / 2,
startPosition,
);
this.addLineFromLeftToBottom();
this.addLine(LineDirection.Vertical, verticalLineLength);
this.addLineFromTopToLeft();
this.addLine(
LineDirection.Horizontal,
-(
startPosition.x -
endPosition.x +
LINE_FROM_MONOMER_LENGTH * 2 +
this.getMonomerWidth()
),
);
this.addLineFromRightToBottom();
this.addLine(
LineDirection.Vertical,
endPosition.y -
startPosition.y -
CORNER_LENGTH * 4 -
verticalLineLength,
);
this.addLineFromTopToRight();
this.addLine(
LineDirection.Horizontal,
LINE_FROM_MONOMER_LENGTH + this.getMonomerWidth() / 2,
);
} else if (this.isSecondMonomerTopLeft(startPosition, endPosition)) {
if (
isR1TheCurrentAttachmentPointOfFirstMonomer &&
reCheckAttachmentPoint
) {
this.updateSnakeBondPath(endPosition, startPosition, false);
return;
}
this.addLine(
LineDirection.Horizontal,
LINE_FROM_MONOMER_LENGTH + this.getMonomerWidth() / 2,
startPosition,
);
this.addLineFromLeftToBottom();
this.addLine(LineDirection.Vertical, this.getMonomerHeight());
this.addLineFromTopToLeft();
this.addLine(
LineDirection.Horizontal,
-(
startPosition.x -
endPosition.x +
LINE_FROM_MONOMER_LENGTH * 2 +
this.getMonomerWidth()
),
);
this.addLineFromRightToTop();
this.addLine(
LineDirection.Vertical,
endPosition.y - startPosition.y - this.getMonomerHeight(),
);
this.addLineFromBottomToRight();
this.addLine(
LineDirection.Horizontal,
LINE_FROM_MONOMER_LENGTH + this.getMonomerWidth() / 2,
);
} else if (this.isSecondMonomerLeft(startPosition, endPosition)) {
if (
isR1TheCurrentAttachmentPointOfFirstMonomer &&
reCheckAttachmentPoint
) {
this.updateSnakeBondPath(endPosition, startPosition, false);
return;
}
this.addLine(
LineDirection.Horizontal,
LINE_FROM_MONOMER_LENGTH + this.getMonomerWidth() / 2,
startPosition,
);
this.addLineFromLeftToBottom();
this.addLine(
LineDirection.Vertical,
endPosition.y - startPosition.y + this.getMonomerHeight(),
);
this.addLineFromTopToLeft();
this.addLine(
LineDirection.Horizontal,
-(
startPosition.x -
endPosition.x +
LINE_FROM_MONOMER_LENGTH * 2 +
this.getMonomerWidth()
),
);
this.addLineFromRightToTop();
this.addLine(LineDirection.Vertical, -this.getMonomerHeight());
this.addLineFromBottomToRight();
this.addLine(
LineDirection.Horizontal,
LINE_FROM_MONOMER_LENGTH + this.getMonomerWidth() / 2,
);
} else {
this.addRandomLine(startPosition, endPosition);
}
}