in packages/ketcher-core/src/domain/entities/DrawingEntitiesManager.ts [1916:2037]
public mergeInto(targetDrawingEntitiesManager: DrawingEntitiesManager) {
const command = new Command();
const monomerToNewMonomer = new Map<BaseMonomer, BaseMonomer>();
const atomToNewAtom = new Map<Atom, Atom>();
const mergedDrawingEntities = new DrawingEntitiesManager();
const editor = CoreEditor.provideEditorInstance();
const viewModel = editor.viewModel;
this.monomers.forEach((monomer) => {
const monomerAddCommand =
monomer instanceof AmbiguousMonomer
? targetDrawingEntitiesManager.addAmbiguousMonomer(
{
...monomer.variantMonomerItem,
},
monomer.position,
)
: targetDrawingEntitiesManager.addMonomer(
monomer.monomerItem,
monomer.position,
);
command.merge(monomerAddCommand);
const addedMonomer = monomerAddCommand.operations[0]
.monomer as BaseMonomer;
mergedDrawingEntities.monomers.set(addedMonomer.id, addedMonomer);
monomerToNewMonomer.set(
monomer,
monomerAddCommand.operations[0].monomer as BaseMonomer,
);
});
this.polymerBonds.forEach((polymerBond) => {
assert(polymerBond.secondMonomer);
const polymerBondCreateCommand =
targetDrawingEntitiesManager.createPolymerBond(
monomerToNewMonomer.get(polymerBond.firstMonomer) as BaseMonomer,
monomerToNewMonomer.get(polymerBond.secondMonomer) as BaseMonomer,
polymerBond.firstMonomer.getAttachmentPointByBond(
polymerBond,
) as AttachmentPointName,
polymerBond.secondMonomer.getAttachmentPointByBond(
polymerBond,
) as AttachmentPointName,
polymerBond instanceof HydrogenBond
? MACROMOLECULES_BOND_TYPES.HYDROGEN
: MACROMOLECULES_BOND_TYPES.SINGLE,
);
command.merge(polymerBondCreateCommand);
const addedPolymerBond = polymerBondCreateCommand.operations[0]
.polymerBond as PolymerBond;
mergedDrawingEntities.polymerBonds.set(
addedPolymerBond.id,
addedPolymerBond,
);
});
this.atoms.forEach((atom) => {
const atomAddCommand = targetDrawingEntitiesManager.addAtom(
atom.position,
monomerToNewMonomer.get(atom.monomer) as BaseMonomer,
atom.atomIdInMicroMode,
atom.label,
atom.properties,
);
const addedAtom = atomAddCommand.operations[0].atom as Atom;
command.merge(atomAddCommand);
mergedDrawingEntities.atoms.set(addedAtom.id, addedAtom);
atomToNewAtom.set(atom, addedAtom);
});
this.bonds.forEach((bond) => {
const newFirstAtom = atomToNewAtom.get(bond.firstAtom);
const newSecondAtom = atomToNewAtom.get(bond.secondAtom);
if (!newFirstAtom || !newSecondAtom) {
return;
}
const bondAddCommand = targetDrawingEntitiesManager.addBond(
newFirstAtom,
newSecondAtom,
bond.type,
bond.stereo,
bond.bondIdInMicroMode,
);
const addedBond = bondAddCommand.operations[0].bond as Bond;
command.merge(bondAddCommand);
mergedDrawingEntities.bonds.set(addedBond.id, addedBond);
});
viewModel.initialize([...targetDrawingEntitiesManager.bonds.values()]);
this.monomerToAtomBonds.forEach((monomerToAtomBond) => {
const bondAddCommand = targetDrawingEntitiesManager.addMonomerToAtomBond(
monomerToNewMonomer.get(monomerToAtomBond.monomer) as BaseMonomer,
atomToNewAtom.get(monomerToAtomBond.atom) as Atom,
monomerToAtomBond.monomer.getAttachmentPointByBond(
monomerToAtomBond,
) as AttachmentPointName,
);
const addedBond = bondAddCommand.operations[0]
.monomerToAtomBond as MonomerToAtomBond;
command.merge(bondAddCommand);
mergedDrawingEntities.monomerToAtomBonds.set(addedBond.id, addedBond);
});
this.micromoleculesHiddenEntities.mergeInto(
targetDrawingEntitiesManager.micromoleculesHiddenEntities,
);
return { command, mergedDrawingEntities };
}