public mergeInto()

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