From 4c901d8d6cd5eaf0799eaf9102d4d0c0f4eb4bc2 Mon Sep 17 00:00:00 2001
From: Aliaksandr Dziarkach
<18146690+AliaksandrDziarkach@users.noreply.github.com>
Date: Fri, 22 Mar 2024 12:43:23 +0300
Subject: [PATCH] #1777 Some bonds don't display correctly in ChemDraw when
opening a saved Ketcher CDX file.
Fix bond saving. Add UT.
---
.../integration/ref/formats/cdx_export.py.out | 4 +
.../ref/formats/mol_to_cdxml.py.out | 16 +-
.../integration/tests/formats/cdx_export.py | 1 +
.../tests/formats/molecules/issue_1777.ket | 1938 +++++++++++++++++
.../tests/formats/ref/issue_1777.b64cdx | 1 +
.../formats/ref/stereo_either-0020.b64cdx | 2 +-
core/indigo-core/molecule/CDXCommons.h | 28 +
.../molecule/src/molecule_cdxml_loader.cpp | 27 +-
.../molecule/src/molecule_cdxml_saver.cpp | 52 +-
.../molecule/src/molecule_json_loader.cpp | 8 +-
10 files changed, 2039 insertions(+), 38 deletions(-)
create mode 100644 api/tests/integration/tests/formats/molecules/issue_1777.ket
create mode 100644 api/tests/integration/tests/formats/ref/issue_1777.b64cdx
diff --git a/api/tests/integration/ref/formats/cdx_export.py.out b/api/tests/integration/ref/formats/cdx_export.py.out
index 1d69b29c7d..2ea2e11060 100644
--- a/api/tests/integration/ref/formats/cdx_export.py.out
+++ b/api/tests/integration/ref/formats/cdx_export.py.out
@@ -8,6 +8,10 @@ two_bn:success
*** KET to CDX ***
issue_1774:success
issue_1775:success
+molecule json loader: 'any' bonds are allowed only for queries
+*** Try as Query ***
+CDXML loader: Queries not supported
+issue_1777:success
agents:success
*** CDXML to CDX ***
AlcoholOxidation_Rxn1:success
diff --git a/api/tests/integration/ref/formats/mol_to_cdxml.py.out b/api/tests/integration/ref/formats/mol_to_cdxml.py.out
index 1846da5287..579260cbe5 100644
--- a/api/tests/integration/ref/formats/mol_to_cdxml.py.out
+++ b/api/tests/integration/ref/formats/mol_to_cdxml.py.out
@@ -374,10 +374,10 @@ stereo_either-0020.mol
-
-
-
-
+
+
+
+
@@ -386,14 +386,14 @@ stereo_either-0020.mol
-
+
-
-
-
+
+
+
diff --git a/api/tests/integration/tests/formats/cdx_export.py b/api/tests/integration/tests/formats/cdx_export.py
index a17c4ce851..9b67ccb072 100644
--- a/api/tests/integration/tests/formats/cdx_export.py
+++ b/api/tests/integration/tests/formats/cdx_export.py
@@ -72,6 +72,7 @@ def test_file(filename, suffix=".mol"):
print("*** KET to CDX ***")
test_file("issue_1774", ".ket")
test_file("issue_1775", ".ket")
+test_file("issue_1777", ".ket")
root = joinPathPy("reactions/", __file__)
files = ["agents"]
diff --git a/api/tests/integration/tests/formats/molecules/issue_1777.ket b/api/tests/integration/tests/formats/molecules/issue_1777.ket
new file mode 100644
index 0000000000..79c014963f
--- /dev/null
+++ b/api/tests/integration/tests/formats/molecules/issue_1777.ket
@@ -0,0 +1,1938 @@
+{
+ "root": {
+ "nodes": [
+ {
+ "$ref": "mol0"
+ },
+ {
+ "$ref": "mol1"
+ },
+ {
+ "$ref": "mol2"
+ },
+ {
+ "$ref": "mol3"
+ },
+ {
+ "$ref": "mol4"
+ },
+ {
+ "$ref": "mol5"
+ },
+ {
+ "$ref": "mol6"
+ },
+ {
+ "$ref": "mol7"
+ },
+ {
+ "$ref": "mol8"
+ },
+ {
+ "$ref": "mol9"
+ },
+ {
+ "$ref": "mol10"
+ },
+ {
+ "$ref": "mol11"
+ },
+ {
+ "$ref": "mol12"
+ },
+ {
+ "$ref": "mol13"
+ },
+ {
+ "$ref": "mol14"
+ },
+ {
+ "$ref": "mol15"
+ },
+ {
+ "$ref": "mol16"
+ },
+ {
+ "$ref": "mol17"
+ },
+ {
+ "$ref": "mol18"
+ },
+ {
+ "$ref": "mol19"
+ },
+ {
+ "$ref": "mol20"
+ },
+ {
+ "$ref": "mol21"
+ },
+ {
+ "$ref": "mol22"
+ },
+ {
+ "$ref": "mol23"
+ },
+ {
+ "$ref": "mol24"
+ },
+ {
+ "$ref": "mol25"
+ },
+ {
+ "type": "text",
+ "data": {
+ "content": "{\"blocks\":[{\"text\":\"single\",\"inlineStyleRanges\":[{\"offset\":0,\"length\":6,\"style\":\"CUSTOM_FONT_SIZE_15px\"}],\"entityRanges\":[],\"data\":{}}],\"entityMap\":{}}",
+ "position": {
+ "x": 4.8912288733444775,
+ "y": -2.945274369570217,
+ "z": 0
+ },
+ "pos": [
+ {
+ "x": 4.8912288733444775,
+ "y": -2.945274369570217,
+ "z": 0
+ },
+ {
+ "x": 4.8912288733444775,
+ "y": -3.370274369570217,
+ "z": 0
+ },
+ {
+ "x": 5.887469107719477,
+ "y": -3.370274369570217,
+ "z": 0
+ },
+ {
+ "x": 5.887469107719477,
+ "y": -2.945274369570217,
+ "z": 0
+ }
+ ]
+ }
+ },
+ {
+ "type": "text",
+ "data": {
+ "content": "{\"blocks\":[{\"text\":\"double\",\"inlineStyleRanges\":[{\"offset\":0,\"length\":6,\"style\":\"CUSTOM_FONT_SIZE_15px\"}],\"entityRanges\":[],\"data\":{}}],\"entityMap\":{}}",
+ "position": {
+ "x": 4.806171477725268,
+ "y": -4.244927748122193,
+ "z": 0
+ },
+ "pos": [
+ {
+ "x": 4.806171477725268,
+ "y": -4.244927748122193,
+ "z": 0
+ },
+ {
+ "x": 4.806171477725268,
+ "y": -4.669927748122193,
+ "z": 0
+ },
+ {
+ "x": 5.948712981631518,
+ "y": -4.669927748122193,
+ "z": 0
+ },
+ {
+ "x": 5.948712981631518,
+ "y": -4.244927748122193,
+ "z": 0
+ }
+ ]
+ }
+ },
+ {
+ "type": "text",
+ "data": {
+ "content": "{\"blocks\":[{\"text\":\"triple\",\"inlineStyleRanges\":[{\"offset\":0,\"length\":6,\"style\":\"CUSTOM_FONT_SIZE_15px\"}],\"entityRanges\":[],\"data\":{}}],\"entityMap\":{}}",
+ "position": {
+ "x": 5.067681671018786,
+ "y": -5.519621312388802,
+ "z": 0
+ },
+ "pos": [
+ {
+ "x": 5.067681671018786,
+ "y": -5.519621312388802,
+ "z": 0
+ },
+ {
+ "x": 5.067681671018786,
+ "y": -5.944621312388802,
+ "z": 0
+ },
+ {
+ "x": 5.921929717893786,
+ "y": -5.944621312388802,
+ "z": 0
+ },
+ {
+ "x": 5.921929717893786,
+ "y": -5.519621312388802,
+ "z": 0
+ }
+ ]
+ }
+ },
+ {
+ "type": "text",
+ "data": {
+ "content": "{\"blocks\":[{\"text\":\"duble dashed double\",\"inlineStyleRanges\":[{\"offset\":0,\"length\":19,\"style\":\"CUSTOM_FONT_SIZE_15px\"}],\"entityRanges\":[],\"data\":{}}],\"entityMap\":{}}",
+ "position": {
+ "x": 8.102779329034025,
+ "y": -2.7696546162238285,
+ "z": 0
+ },
+ "pos": [
+ {
+ "x": 8.102779329034025,
+ "y": -2.7696546162238285,
+ "z": 0
+ },
+ {
+ "x": 8.102779329034025,
+ "y": -3.1946546162238283,
+ "z": 0
+ },
+ {
+ "x": 11.601522004815275,
+ "y": -3.1946546162238283,
+ "z": 0
+ },
+ {
+ "x": 11.601522004815275,
+ "y": -2.7696546162238285,
+ "z": 0
+ }
+ ]
+ }
+ },
+ {
+ "type": "text",
+ "data": {
+ "content": "{\"blocks\":[{\"text\":\"double cis/trans unqnown\",\"inlineStyleRanges\":[{\"offset\":0,\"length\":24,\"style\":\"CUSTOM_FONT_SIZE_15px\"}],\"entityRanges\":[],\"data\":{}}],\"entityMap\":{}}",
+ "position": {
+ "x": 7.396393908775671,
+ "y": -4.04432142964565,
+ "z": 0
+ },
+ "pos": [
+ {
+ "x": 7.396393908775671,
+ "y": -4.04432142964565,
+ "z": 0
+ },
+ {
+ "x": 7.396393908775671,
+ "y": -4.46932142964565,
+ "z": 0
+ },
+ {
+ "x": 11.649518908775672,
+ "y": -4.46932142964565,
+ "z": 0
+ },
+ {
+ "x": 11.649518908775672,
+ "y": -4.04432142964565,
+ "z": 0
+ }
+ ]
+ }
+ },
+ {
+ "type": "text",
+ "data": {
+ "content": "{\"blocks\":[{\"text\":\"=aromatic\",\"inlineStyleRanges\":[{\"offset\":0,\"length\":9,\"style\":\"CUSTOM_FONT_SIZE_15px\"}],\"entityRanges\":[],\"data\":{}}],\"entityMap\":{}}",
+ "position": {
+ "x": 12.365948919335281,
+ "y": -2.944687936591424,
+ "z": 0
+ },
+ "pos": [
+ {
+ "x": 12.365948919335281,
+ "y": -2.944687936591424,
+ "z": 0
+ },
+ {
+ "x": 12.365948919335281,
+ "y": -3.369687936591424,
+ "z": 0
+ },
+ {
+ "x": 14.035369543114578,
+ "y": -3.369687936591424,
+ "z": 0
+ },
+ {
+ "x": 14.035369543114578,
+ "y": -2.944687936591424,
+ "z": 0
+ }
+ ]
+ }
+ },
+ {
+ "type": "text",
+ "data": {
+ "content": "{\"blocks\":[{\"text\":\"single down\",\"inlineStyleRanges\":[{\"offset\":0,\"length\":11,\"style\":\"CUSTOM_FONT_SIZE_15px\"}],\"entityRanges\":[],\"data\":{}}],\"entityMap\":{}}",
+ "position": {
+ "x": 4.886369951001271,
+ "y": -8.293781298368101,
+ "z": 0
+ },
+ "pos": [
+ {
+ "x": 4.886369951001271,
+ "y": -8.293781298368101,
+ "z": 0
+ },
+ {
+ "x": 4.886369951001271,
+ "y": -8.718781298368102,
+ "z": 0
+ },
+ {
+ "x": 6.866838701001271,
+ "y": -8.718781298368102,
+ "z": 0
+ },
+ {
+ "x": 6.866838701001271,
+ "y": -8.293781298368101,
+ "z": 0
+ }
+ ]
+ }
+ },
+ {
+ "type": "text",
+ "data": {
+ "content": "{\"blocks\":[{\"text\":\"dashed\",\"inlineStyleRanges\":[{\"offset\":0,\"length\":6,\"style\":\"CUSTOM_FONT_SIZE_15px\"}],\"entityRanges\":[],\"data\":{}}],\"entityMap\":{}}",
+ "position": {
+ "x": 3.4029455282784333,
+ "y": -9.418614707834442,
+ "z": 0
+ },
+ "pos": [
+ {
+ "x": 3.4029455282784333,
+ "y": -9.418614707834442,
+ "z": 0
+ },
+ {
+ "x": 3.4029455282784333,
+ "y": -9.843614707834442,
+ "z": 0
+ },
+ {
+ "x": 4.633414278278433,
+ "y": -9.843614707834442,
+ "z": 0
+ },
+ {
+ "x": 4.633414278278433,
+ "y": -9.418614707834442,
+ "z": 0
+ }
+ ]
+ }
+ },
+ {
+ "type": "text",
+ "data": {
+ "content": "{\"blocks\":[{\"text\":\"hashed\",\"inlineStyleRanges\":[{\"offset\":0,\"length\":6,\"style\":\"CUSTOM_FONT_SIZE_15px\"}],\"entityRanges\":[],\"data\":{}}],\"entityMap\":{}}",
+ "position": {
+ "x": 3.327972159521792,
+ "y": -10.268368339922135,
+ "z": 0
+ },
+ "pos": [
+ {
+ "x": 3.327972159521792,
+ "y": -10.268368339922135,
+ "z": 0
+ },
+ {
+ "x": 3.327972159521792,
+ "y": -10.693368339922136,
+ "z": 0
+ },
+ {
+ "x": 4.558440909521792,
+ "y": -10.693368339922136,
+ "z": 0
+ },
+ {
+ "x": 4.558440909521792,
+ "y": -10.268368339922135,
+ "z": 0
+ }
+ ]
+ }
+ },
+ {
+ "type": "text",
+ "data": {
+ "content": "{\"blocks\":[{\"text\":\"hashed wedged\",\"inlineStyleRanges\":[{\"offset\":0,\"length\":13,\"style\":\"CUSTOM_FONT_SIZE_15px\"}],\"entityRanges\":[],\"data\":{}}],\"entityMap\":{}}",
+ "position": {
+ "x": 2.0085107712812285,
+ "y": -11.093148246003254,
+ "z": 0
+ },
+ "pos": [
+ {
+ "x": 2.0085107712812285,
+ "y": -11.093148246003254,
+ "z": 0
+ },
+ {
+ "x": 2.0085107712812285,
+ "y": -11.518148246003255,
+ "z": 0
+ },
+ {
+ "x": 4.656948080546365,
+ "y": -11.518148246003255,
+ "z": 0
+ },
+ {
+ "x": 4.656948080546365,
+ "y": -11.093148246003254,
+ "z": 0
+ }
+ ]
+ }
+ },
+ {
+ "type": "text",
+ "data": {
+ "content": "{\"blocks\":[{\"text\":\"single up\",\"inlineStyleRanges\":[{\"offset\":0,\"length\":9,\"style\":\"CUSTOM_FONT_SIZE_15px\"}],\"entityRanges\":[],\"data\":{}}],\"entityMap\":{}}",
+ "position": {
+ "x": 9.872087590980076,
+ "y": -8.718781300770269,
+ "z": 0
+ },
+ "pos": [
+ {
+ "x": 9.872087590980076,
+ "y": -8.718781300770269,
+ "z": 0
+ },
+ {
+ "x": 9.872087590980076,
+ "y": -9.14378130077027,
+ "z": 0
+ },
+ {
+ "x": 11.389629094886326,
+ "y": -9.14378130077027,
+ "z": 0
+ },
+ {
+ "x": 11.389629094886326,
+ "y": -8.718781300770269,
+ "z": 0
+ }
+ ]
+ }
+ },
+ {
+ "type": "text",
+ "data": {
+ "content": "{\"blocks\":[{\"text\":\"bold\",\"inlineStyleRanges\":[{\"offset\":0,\"length\":4,\"style\":\"CUSTOM_FONT_SIZE_15px\"}],\"entityRanges\":[],\"data\":{}}],\"entityMap\":{}}",
+ "position": {
+ "x": 8.195107686959009,
+ "y": -9.343614707410529,
+ "z": 0
+ },
+ "pos": [
+ {
+ "x": 8.195107686959009,
+ "y": -9.343614707410529,
+ "z": 0
+ },
+ {
+ "x": 8.195107686959009,
+ "y": -9.76861470741053,
+ "z": 0
+ },
+ {
+ "x": 8.904092061959009,
+ "y": -9.76861470741053,
+ "z": 0
+ },
+ {
+ "x": 8.904092061959009,
+ "y": -9.343614707410529,
+ "z": 0
+ }
+ ]
+ }
+ },
+ {
+ "type": "text",
+ "data": {
+ "content": "{\"blocks\":[{\"text\":\"wedged\",\"inlineStyleRanges\":[{\"offset\":0,\"length\":6,\"style\":\"CUSTOM_FONT_SIZE_15px\"}],\"entityRanges\":[],\"data\":{}}],\"entityMap\":{}}",
+ "position": {
+ "x": 7.688829522838038,
+ "y": -10.293361771529757,
+ "z": 0
+ },
+ "pos": [
+ {
+ "x": 7.688829522838038,
+ "y": -10.293361771529757,
+ "z": 0
+ },
+ {
+ "x": 7.688829522838038,
+ "y": -10.718361771529757,
+ "z": 0
+ },
+ {
+ "x": 9.027501397838037,
+ "y": -10.718361771529757,
+ "z": 0
+ },
+ {
+ "x": 9.027501397838037,
+ "y": -10.293361771529757,
+ "z": 0
+ }
+ ]
+ }
+ },
+ {
+ "type": "text",
+ "data": {
+ "content": "{\"blocks\":[{\"text\":\"hollow wedged\",\"inlineStyleRanges\":[{\"offset\":0,\"length\":13,\"style\":\"CUSTOM_FONT_SIZE_15px\"}],\"entityRanges\":[],\"data\":{}}],\"entityMap\":{}}",
+ "position": {
+ "x": 6.632944421079607,
+ "y": -11.243121972716349,
+ "z": 0
+ },
+ "pos": [
+ {
+ "x": 6.632944421079607,
+ "y": -11.243121972716349,
+ "z": 0
+ },
+ {
+ "x": 6.632944421079607,
+ "y": -11.66812197271635,
+ "z": 0
+ },
+ {
+ "x": 9.114194421079606,
+ "y": -11.66812197271635,
+ "z": 0
+ },
+ {
+ "x": 9.114194421079606,
+ "y": -11.243121972716349,
+ "z": 0
+ }
+ ]
+ }
+ },
+ {
+ "type": "text",
+ "data": {
+ "content": "{\"blocks\":[{\"text\":\"dative\",\"inlineStyleRanges\":[{\"offset\":0,\"length\":6,\"style\":\"CUSTOM_FONT_SIZE_15px\"}],\"entityRanges\":[],\"data\":{}}],\"entityMap\":{}}",
+ "position": {
+ "x": 15.323027570361795,
+ "y": -2.97030768908999,
+ "z": 0
+ },
+ "pos": [
+ {
+ "x": 15.323027570361795,
+ "y": -2.97030768908999,
+ "z": 0
+ },
+ {
+ "x": 15.323027570361795,
+ "y": -3.39530768908999,
+ "z": 0
+ },
+ {
+ "x": 16.340141828174296,
+ "y": -3.39530768908999,
+ "z": 0
+ },
+ {
+ "x": 16.340141828174296,
+ "y": -2.97030768908999,
+ "z": 0
+ }
+ ]
+ }
+ },
+ {
+ "type": "text",
+ "data": {
+ "content": "{\"blocks\":[{\"text\":\"wavy\",\"inlineStyleRanges\":[{\"offset\":0,\"length\":4,\"style\":\"CUSTOM_FONT_SIZE_15px\"}],\"entityRanges\":[],\"data\":{}}],\"entityMap\":{}}",
+ "position": {
+ "x": 15.43269143721379,
+ "y": -3.8950678305465214,
+ "z": 0
+ },
+ "pos": [
+ {
+ "x": 15.43269143721379,
+ "y": -3.8950678305465214,
+ "z": 0
+ },
+ {
+ "x": 15.43269143721379,
+ "y": -4.320067830546521,
+ "z": 0
+ },
+ {
+ "x": 16.324561554401292,
+ "y": -4.320067830546521,
+ "z": 0
+ },
+ {
+ "x": 16.324561554401292,
+ "y": -3.8950678305465214,
+ "z": 0
+ }
+ ]
+ }
+ },
+ {
+ "type": "text",
+ "data": {
+ "content": "{\"blocks\":[{\"text\":\"any\",\"inlineStyleRanges\":[{\"offset\":0,\"length\":3,\"style\":\"CUSTOM_FONT_SIZE_15px\"}],\"entityRanges\":[],\"data\":{}}],\"entityMap\":{}}",
+ "position": {
+ "x": 16.197140982973956,
+ "y": -9.068648025234651,
+ "z": 0
+ },
+ "pos": [
+ {
+ "x": 16.197140982973956,
+ "y": -9.068648025234651,
+ "z": 0
+ },
+ {
+ "x": 16.197140982973956,
+ "y": -9.493648025234652,
+ "z": 0
+ },
+ {
+ "x": 16.814255240786455,
+ "y": -9.493648025234652,
+ "z": 0
+ },
+ {
+ "x": 16.814255240786455,
+ "y": -9.068648025234651,
+ "z": 0
+ }
+ ]
+ }
+ },
+ {
+ "type": "text",
+ "data": {
+ "content": "{\"blocks\":[{\"text\":\"singe/duble\",\"inlineStyleRanges\":[{\"offset\":0,\"length\":11,\"style\":\"CUSTOM_FONT_SIZE_15px\"}],\"entityRanges\":[],\"data\":{}}],\"entityMap\":{}}",
+ "position": {
+ "x": 15.031505166749941,
+ "y": -10.093341588088222,
+ "z": 0
+ },
+ "pos": [
+ {
+ "x": 15.031505166749941,
+ "y": -10.093341588088222,
+ "z": 0
+ },
+ {
+ "x": 15.031505166749941,
+ "y": -10.518341588088223,
+ "z": 0
+ },
+ {
+ "x": 16.966160928468693,
+ "y": -10.518341588088223,
+ "z": 0
+ },
+ {
+ "x": 16.966160928468693,
+ "y": -10.093341588088222,
+ "z": 0
+ }
+ ]
+ }
+ },
+ {
+ "type": "text",
+ "data": {
+ "content": "{\"blocks\":[{\"text\":\"single/aromatic\",\"inlineStyleRanges\":[{\"offset\":0,\"length\":15,\"style\":\"CUSTOM_FONT_SIZE_15px\"}],\"entityRanges\":[],\"data\":{}}],\"entityMap\":{}}",
+ "position": {
+ "x": 14.425873260413113,
+ "y": -11.11802810569805,
+ "z": 0
+ },
+ "pos": [
+ {
+ "x": 14.425873260413113,
+ "y": -11.11802810569805,
+ "z": 0
+ },
+ {
+ "x": 14.425873260413113,
+ "y": -11.54302810569805,
+ "z": 0
+ },
+ {
+ "x": 16.960284881506862,
+ "y": -11.54302810569805,
+ "z": 0
+ },
+ {
+ "x": 16.960284881506862,
+ "y": -11.11802810569805,
+ "z": 0
+ }
+ ]
+ }
+ },
+ {
+ "type": "text",
+ "data": {
+ "content": "{\"blocks\":[{\"text\":\"double/aromatic\",\"inlineStyleRanges\":[{\"offset\":0,\"length\":15,\"style\":\"CUSTOM_FONT_SIZE_15px\"}],\"entityRanges\":[],\"data\":{}}],\"entityMap\":{}}",
+ "position": {
+ "x": 14.190855513503195,
+ "y": -12.167755464781447,
+ "z": 0
+ },
+ "pos": [
+ {
+ "x": 14.190855513503195,
+ "y": -12.167755464781447,
+ "z": 0
+ },
+ {
+ "x": 14.190855513503195,
+ "y": -12.592755464781447,
+ "z": 0
+ },
+ {
+ "x": 16.871568404128194,
+ "y": -12.592755464781447,
+ "z": 0
+ },
+ {
+ "x": 16.871568404128194,
+ "y": -12.167755464781447,
+ "z": 0
+ }
+ ]
+ }
+ },
+ {
+ "type": "text",
+ "data": {
+ "content": "{\"blocks\":[{\"text\":\"=double ether\",\"inlineStyleRanges\":[{\"offset\":0,\"length\":13,\"style\":\"CUSTOM_FONT_SIZE_15px\"}],\"entityRanges\":[],\"data\":{}}],\"entityMap\":{}}",
+ "position": {
+ "x": 12.628459740312387,
+ "y": -4.244301248464978,
+ "z": 0
+ },
+ "pos": [
+ {
+ "x": 12.628459740312387,
+ "y": -4.244301248464978,
+ "z": 0
+ },
+ {
+ "x": 12.628459740312387,
+ "y": -4.669301248464977,
+ "z": 0
+ },
+ {
+ "x": 14.95759868684559,
+ "y": -4.669301248464977,
+ "z": 0
+ },
+ {
+ "x": 14.95759868684559,
+ "y": -4.244301248464978,
+ "z": 0
+ }
+ ]
+ }
+ },
+ {
+ "type": "text",
+ "data": {
+ "content": "{\"blocks\":[{\"text\":\"topology\",\"inlineStyleRanges\":[{\"offset\":0,\"length\":8,\"style\":\"CUSTOM_FONT_SIZE_15px\"}],\"entityRanges\":[],\"data\":{}}],\"entityMap\":{}}",
+ "position": {
+ "x": 5.736023611680789,
+ "y": -12.617741376837438,
+ "z": 0
+ },
+ "pos": [
+ {
+ "x": 5.736023611680789,
+ "y": -12.617741376837438,
+ "z": 0
+ },
+ {
+ "x": 5.736023611680789,
+ "y": -13.042741376837439,
+ "z": 0
+ },
+ {
+ "x": 7.191309256212039,
+ "y": -13.042741376837439,
+ "z": 0
+ },
+ {
+ "x": 7.191309256212039,
+ "y": -12.617741376837438,
+ "z": 0
+ }
+ ]
+ }
+ },
+ {
+ "type": "text",
+ "data": {
+ "content": "{\"blocks\":[{\"text\":\"ring\",\"inlineStyleRanges\":[{\"offset\":0,\"length\":4,\"style\":\"CUSTOM_FONT_SIZE_15px\"}],\"entityRanges\":[],\"data\":{}}],\"entityMap\":{}}",
+ "position": {
+ "x": 4.259423981453789,
+ "y": -13.442488916960205,
+ "z": 0
+ },
+ "pos": [
+ {
+ "x": 4.259423981453789,
+ "y": -13.442488916960205,
+ "z": 0
+ },
+ {
+ "x": 4.259423981453789,
+ "y": -13.867488916960205,
+ "z": 0
+ },
+ {
+ "x": 4.884814606453789,
+ "y": -13.867488916960205,
+ "z": 0
+ },
+ {
+ "x": 4.884814606453789,
+ "y": -13.442488916960205,
+ "z": 0
+ }
+ ]
+ }
+ },
+ {
+ "type": "text",
+ "data": {
+ "content": "{\"blocks\":[{\"text\":\"chain\",\"inlineStyleRanges\":[{\"offset\":0,\"length\":5,\"style\":\"CUSTOM_FONT_SIZE_15px\"}],\"entityRanges\":[],\"data\":{}}],\"entityMap\":{}}",
+ "position": {
+ "x": 3.7545586069283345,
+ "y": -14.667168867166783,
+ "z": 0
+ },
+ "pos": [
+ {
+ "x": 3.7545586069283345,
+ "y": -14.667168867166783,
+ "z": 0
+ },
+ {
+ "x": 3.7545586069283345,
+ "y": -15.092168867166784,
+ "z": 0
+ },
+ {
+ "x": 4.6510429819283345,
+ "y": -15.092168867166784,
+ "z": 0
+ },
+ {
+ "x": 4.6510429819283345,
+ "y": -14.667168867166783,
+ "z": 0
+ }
+ ]
+ }
+ },
+ {
+ "type": "text",
+ "data": {
+ "content": "{\"blocks\":[{\"text\":\"reaction\",\"inlineStyleRanges\":[{\"offset\":0,\"length\":8,\"style\":\"CUSTOM_FONT_SIZE_15px\"}],\"entityRanges\":[],\"data\":{}}],\"entityMap\":{}}",
+ "position": {
+ "x": 9.948067070083582,
+ "y": -12.44278878571426,
+ "z": 0
+ },
+ "pos": [
+ {
+ "x": 9.948067070083582,
+ "y": -12.44278878571426,
+ "z": 0
+ },
+ {
+ "x": 9.948067070083582,
+ "y": -12.86778878571426,
+ "z": 0
+ },
+ {
+ "x": 11.282442070083581,
+ "y": -12.86778878571426,
+ "z": 0
+ },
+ {
+ "x": 11.282442070083581,
+ "y": -12.44278878571426,
+ "z": 0
+ }
+ ]
+ }
+ },
+ {
+ "type": "text",
+ "data": {
+ "content": "{\"blocks\":[{\"text\":\"center\",\"inlineStyleRanges\":[{\"offset\":0,\"length\":6,\"style\":\"CUSTOM_FONT_SIZE_15px\"}],\"entityRanges\":[],\"data\":{}}],\"entityMap\":{}}",
+ "position": {
+ "x": 8.11888815204474,
+ "y": -13.292561646692944,
+ "z": 0
+ },
+ "pos": [
+ {
+ "x": 8.11888815204474,
+ "y": -13.292561646692944,
+ "z": 0
+ },
+ {
+ "x": 8.11888815204474,
+ "y": -13.717561646692944,
+ "z": 0
+ },
+ {
+ "x": 9.18624655048224,
+ "y": -13.717561646692944,
+ "z": 0
+ },
+ {
+ "x": 9.18624655048224,
+ "y": -13.292561646692944,
+ "z": 0
+ }
+ ]
+ }
+ },
+ {
+ "type": "text",
+ "data": {
+ "content": "{\"blocks\":[{\"text\":\"make/break\",\"inlineStyleRanges\":[{\"offset\":0,\"length\":10,\"style\":\"CUSTOM_FONT_SIZE_15px\"}],\"entityRanges\":[],\"data\":{}}],\"entityMap\":{}}",
+ "position": {
+ "x": 7.201745813776757,
+ "y": -14.092348597876498,
+ "z": 0
+ },
+ "pos": [
+ {
+ "x": 7.201745813776757,
+ "y": -14.092348597876498,
+ "z": 0
+ },
+ {
+ "x": 7.201745813776757,
+ "y": -14.517348597876499,
+ "z": 0
+ },
+ {
+ "x": 9.173474329401756,
+ "y": -14.517348597876499,
+ "z": 0
+ },
+ {
+ "x": 9.173474329401756,
+ "y": -14.092348597876498,
+ "z": 0
+ }
+ ]
+ }
+ },
+ {
+ "type": "text",
+ "data": {
+ "content": "{\"blocks\":[{\"text\":\"change\",\"inlineStyleRanges\":[{\"offset\":0,\"length\":6,\"style\":\"CUSTOM_FONT_SIZE_15px\"}],\"entityRanges\":[],\"data\":{}}],\"entityMap\":{}}",
+ "position": {
+ "x": 7.751692315195871,
+ "y": -14.842135548777446,
+ "z": 0
+ },
+ "pos": [
+ {
+ "x": 7.751692315195871,
+ "y": -14.842135548777446,
+ "z": 0
+ },
+ {
+ "x": 7.751692315195871,
+ "y": -15.267135548777446,
+ "z": 0
+ },
+ {
+ "x": 8.998420830820871,
+ "y": -15.267135548777446,
+ "z": 0
+ },
+ {
+ "x": 8.998420830820871,
+ "y": -14.842135548777446,
+ "z": 0
+ }
+ ]
+ }
+ },
+ {
+ "type": "text",
+ "data": {
+ "content": "{\"blocks\":[{\"text\":\"make and change\",\"inlineStyleRanges\":[{\"offset\":0,\"length\":15,\"style\":\"CUSTOM_FONT_SIZE_15px\"}],\"entityRanges\":[],\"data\":{}}],\"entityMap\":{}}",
+ "position": {
+ "x": 6.181138695919678,
+ "y": -15.541961910597875,
+ "z": 0
+ },
+ "pos": [
+ {
+ "x": 6.181138695919678,
+ "y": -15.541961910597875,
+ "z": 0
+ },
+ {
+ "x": 6.181138695919678,
+ "y": -15.966961910597876,
+ "z": 0
+ },
+ {
+ "x": 9.178904809200928,
+ "y": -15.966961910597876,
+ "z": 0
+ },
+ {
+ "x": 9.178904809200928,
+ "y": -15.541961910597875,
+ "z": 0
+ }
+ ]
+ }
+ },
+ {
+ "type": "text",
+ "data": {
+ "content": "{\"blocks\":[{\"text\":\"not center\",\"inlineStyleRanges\":[{\"offset\":0,\"length\":10,\"style\":\"CUSTOM_FONT_SIZE_15px\"}],\"entityRanges\":[],\"data\":{}}],\"entityMap\":{}}",
+ "position": {
+ "x": 7.4226005048766694,
+ "y": -16.29175590674256,
+ "z": 0
+ },
+ "pos": [
+ {
+ "x": 7.4226005048766694,
+ "y": -16.29175590674256,
+ "z": 0
+ },
+ {
+ "x": 7.4226005048766694,
+ "y": -16.71675590674256,
+ "z": 0
+ },
+ {
+ "x": 9.11544718456417,
+ "y": -16.71675590674256,
+ "z": 0
+ },
+ {
+ "x": 9.11544718456417,
+ "y": -16.29175590674256,
+ "z": 0
+ }
+ ]
+ }
+ },
+ {
+ "type": "text",
+ "data": {
+ "content": "{\"blocks\":[{\"text\":\"not modified\",\"inlineStyleRanges\":[{\"offset\":0,\"length\":12,\"style\":\"CUSTOM_FONT_SIZE_15px\"}],\"entityRanges\":[],\"data\":{}}],\"entityMap\":{}}",
+ "position": {
+ "x": 7.064429321208962,
+ "y": -17.141528767721248,
+ "z": 0
+ },
+ "pos": [
+ {
+ "x": 7.064429321208962,
+ "y": -17.141528767721248,
+ "z": 0
+ },
+ {
+ "x": 7.064429321208962,
+ "y": -17.56652876772125,
+ "z": 0
+ },
+ {
+ "x": 9.107398071208962,
+ "y": -17.56652876772125,
+ "z": 0
+ },
+ {
+ "x": 9.107398071208962,
+ "y": -17.141528767721248,
+ "z": 0
+ }
+ ]
+ }
+ },
+ {
+ "type": "text",
+ "data": {
+ "content": "{\"blocks\":[{\"text\":\"unmapped\",\"inlineStyleRanges\":[{\"offset\":0,\"length\":8,\"style\":\"CUSTOM_FONT_SIZE_15px\"}],\"entityRanges\":[],\"data\":{}}],\"entityMap\":{}}",
+ "position": {
+ "x": 7.293068948688582,
+ "y": -18.04130258240265,
+ "z": 0
+ },
+ "pos": [
+ {
+ "x": 7.293068948688582,
+ "y": -18.04130258240265,
+ "z": 0
+ },
+ {
+ "x": 7.293068948688582,
+ "y": -18.46630258240265,
+ "z": 0
+ },
+ {
+ "x": 9.065725198688583,
+ "y": -18.46630258240265,
+ "z": 0
+ },
+ {
+ "x": 9.065725198688583,
+ "y": -18.04130258240265,
+ "z": 0
+ }
+ ]
+ }
+ }
+ ],
+ "connections": [],
+ "templates": []
+ },
+ "mol0": {
+ "type": "molecule",
+ "atoms": [
+ {
+ "label": "C",
+ "location": [
+ 5.7055315679142815,
+ -3.351879184922522,
+ 0
+ ]
+ },
+ {
+ "label": "C",
+ "location": [
+ 6.571634131914557,
+ -2.852012444713126,
+ 0
+ ]
+ }
+ ],
+ "bonds": [
+ {
+ "type": 1,
+ "atoms": [
+ 0,
+ 1
+ ]
+ }
+ ]
+ },
+ "mol1": {
+ "type": "molecule",
+ "atoms": [
+ {
+ "label": "C",
+ "location": [
+ 6.030444987038223,
+ -4.626539370221905,
+ 0
+ ]
+ },
+ {
+ "label": "C",
+ "location": [
+ 6.8965477893935265,
+ -4.126672644909698,
+ 0
+ ]
+ }
+ ],
+ "bonds": [
+ {
+ "type": 2,
+ "atoms": [
+ 0,
+ 1
+ ]
+ }
+ ]
+ },
+ "mol2": {
+ "type": "molecule",
+ "atoms": [
+ {
+ "label": "C",
+ "location": [
+ 6.130418475113679,
+ -5.72624607056675,
+ 0
+ ]
+ },
+ {
+ "label": "C",
+ "location": [
+ 6.996521039113958,
+ -5.226379345254542,
+ 0
+ ]
+ }
+ ],
+ "bonds": [
+ {
+ "type": 3,
+ "atoms": [
+ 0,
+ 1
+ ]
+ }
+ ]
+ },
+ "mol3": {
+ "type": "molecule",
+ "atoms": [
+ {
+ "label": "C",
+ "location": [
+ 11.778779288969762,
+ -4.350926721142796,
+ 0
+ ]
+ },
+ {
+ "label": "C",
+ "location": [
+ 12.644881376259978,
+ -3.8510595191205317,
+ 0
+ ]
+ }
+ ],
+ "bonds": [
+ {
+ "type": 2,
+ "atoms": [
+ 0,
+ 1
+ ],
+ "stereo": 3
+ }
+ ]
+ },
+ "mol4": {
+ "type": "molecule",
+ "atoms": [
+ {
+ "label": "C",
+ "location": [
+ 11.55379242476539,
+ -3.151279375390904,
+ 0
+ ]
+ },
+ {
+ "label": "C",
+ "location": [
+ 12.41989451205561,
+ -2.651412650078697,
+ 0
+ ]
+ }
+ ],
+ "bonds": [
+ {
+ "type": 4,
+ "atoms": [
+ 0,
+ 1
+ ]
+ }
+ ]
+ },
+ "mol5": {
+ "type": "molecule",
+ "atoms": [
+ {
+ "label": "C",
+ "location": [
+ 16.47765959373436,
+ -3.126939134696526,
+ 0
+ ]
+ },
+ {
+ "label": "C",
+ "location": [
+ 17.343761681024574,
+ -2.627072421488286,
+ 0
+ ]
+ }
+ ],
+ "bonds": [
+ {
+ "type": 9,
+ "atoms": [
+ 0,
+ 1
+ ]
+ }
+ ]
+ },
+ "mol6": {
+ "type": "molecule",
+ "atoms": [
+ {
+ "label": "C",
+ "location": [
+ 4.805771605365326,
+ -9.575219998483762,
+ 0
+ ]
+ },
+ {
+ "label": "C",
+ "location": [
+ 5.671874169365601,
+ -9.075353273171556,
+ 0
+ ]
+ }
+ ],
+ "bonds": [
+ {
+ "type": 1,
+ "atoms": [
+ 0,
+ 1
+ ],
+ "stereo": 6
+ }
+ ]
+ },
+ "mol7": {
+ "type": "molecule",
+ "atoms": [
+ {
+ "label": "C",
+ "location": [
+ 4.755784980505112,
+ -10.325020086452074,
+ 0
+ ]
+ },
+ {
+ "label": "C",
+ "location": [
+ 5.6218875445053875,
+ -9.825153361139867,
+ 0
+ ]
+ }
+ ],
+ "bonds": [
+ {
+ "type": 1,
+ "atoms": [
+ 0,
+ 1
+ ],
+ "stereo": 6
+ }
+ ]
+ },
+ "mol8": {
+ "type": "molecule",
+ "atoms": [
+ {
+ "label": "C",
+ "location": [
+ 4.8307647986179205,
+ -11.174793424140814,
+ 0
+ ]
+ },
+ {
+ "label": "C",
+ "location": [
+ 5.696867600973224,
+ -10.674926698828608,
+ 0
+ ]
+ }
+ ],
+ "bonds": [
+ {
+ "type": 1,
+ "atoms": [
+ 0,
+ 1
+ ],
+ "stereo": 6
+ }
+ ]
+ },
+ "mol9": {
+ "type": "molecule",
+ "atoms": [
+ {
+ "label": "C",
+ "location": [
+ 9.404545621250652,
+ -9.625206861699008,
+ 0
+ ]
+ },
+ {
+ "label": "C",
+ "location": [
+ 10.27064770854087,
+ -9.125340136386798,
+ 0
+ ]
+ }
+ ],
+ "bonds": [
+ {
+ "type": 1,
+ "atoms": [
+ 0,
+ 1
+ ],
+ "stereo": 1
+ }
+ ]
+ },
+ "mol10": {
+ "type": "molecule",
+ "atoms": [
+ {
+ "label": "C",
+ "location": [
+ 9.329565326427783,
+ -10.574953449108179,
+ 0
+ ]
+ },
+ {
+ "label": "C",
+ "location": [
+ 10.195667890428059,
+ -10.07508672379597,
+ 0
+ ]
+ }
+ ],
+ "bonds": [
+ {
+ "type": 1,
+ "atoms": [
+ 0,
+ 1
+ ],
+ "stereo": 1
+ }
+ ]
+ },
+ "mol11": {
+ "type": "molecule",
+ "atoms": [
+ {
+ "label": "C",
+ "location": [
+ 9.329565326427783,
+ -11.399733831899352,
+ 0
+ ]
+ },
+ {
+ "label": "C",
+ "location": [
+ 10.195667890428059,
+ -10.899867106587147,
+ 0
+ ]
+ }
+ ],
+ "bonds": [
+ {
+ "type": 1,
+ "atoms": [
+ 0,
+ 1
+ ],
+ "stereo": 1
+ }
+ ]
+ },
+ "mol12": {
+ "type": "molecule",
+ "atoms": [
+ {
+ "label": "C",
+ "location": [
+ 16.502652548631925,
+ -4.151665957339805,
+ 0
+ ]
+ },
+ {
+ "label": "C",
+ "location": [
+ 17.36875463592214,
+ -3.6517992320275985,
+ 0
+ ]
+ }
+ ],
+ "bonds": [
+ {
+ "type": 1,
+ "atoms": [
+ 0,
+ 1
+ ],
+ "stereo": 4
+ }
+ ]
+ },
+ "mol13": {
+ "type": "molecule",
+ "atoms": [
+ {
+ "label": "Al",
+ "location": [
+ 17.003146250311403,
+ -9.32525331644919,
+ 0
+ ]
+ },
+ {
+ "label": "C",
+ "location": [
+ 17.86924833760162,
+ -8.825386591136985,
+ 0
+ ]
+ }
+ ],
+ "bonds": [
+ {
+ "type": 8,
+ "atoms": [
+ 0,
+ 1
+ ]
+ }
+ ]
+ },
+ "mol14": {
+ "type": "molecule",
+ "atoms": [
+ {
+ "label": "Si",
+ "location": [
+ 17.128139205774186,
+ -10.324980198539924,
+ 0
+ ]
+ },
+ {
+ "label": "F",
+ "location": [
+ 17.994241293064402,
+ -9.825113473227715,
+ 0
+ ]
+ }
+ ],
+ "bonds": [
+ {
+ "type": 5,
+ "atoms": [
+ 0,
+ 1
+ ]
+ }
+ ]
+ },
+ "mol15": {
+ "type": "molecule",
+ "atoms": [
+ {
+ "label": "S",
+ "location": [
+ 17.178146251300532,
+ -11.27466014719216,
+ 0
+ ]
+ },
+ {
+ "label": "Ar",
+ "location": [
+ 18.044248338590748,
+ -10.77479342187995,
+ 0
+ ]
+ }
+ ],
+ "bonds": [
+ {
+ "type": 6,
+ "atoms": [
+ 0,
+ 1
+ ]
+ }
+ ]
+ },
+ "mol16": {
+ "type": "molecule",
+ "atoms": [
+ {
+ "label": "B",
+ "location": [
+ 17.228112932204674,
+ -12.299406735025242,
+ 0
+ ]
+ },
+ {
+ "label": "As",
+ "location": [
+ 18.094215019494893,
+ -11.799540009713034,
+ 0
+ ]
+ }
+ ],
+ "bonds": [
+ {
+ "type": 7,
+ "atoms": [
+ 0,
+ 1
+ ]
+ }
+ ]
+ },
+ "mol17": {
+ "type": "molecule",
+ "atoms": [
+ {
+ "label": "C",
+ "location": [
+ 5.155678217741858,
+ -13.799093732029904,
+ 0
+ ]
+ },
+ {
+ "label": "C",
+ "location": [
+ 6.021780781742137,
+ -13.299227006717695,
+ 0
+ ]
+ }
+ ],
+ "bonds": [
+ {
+ "type": 1,
+ "atoms": [
+ 0,
+ 1
+ ],
+ "topology": 1
+ }
+ ]
+ },
+ "mol18": {
+ "type": "molecule",
+ "atoms": [
+ {
+ "label": "C",
+ "location": [
+ 5.180671649349481,
+ -14.94878777230005,
+ 0
+ ]
+ },
+ {
+ "label": "C",
+ "location": [
+ 6.046774213349757,
+ -14.448921046987842,
+ 0
+ ]
+ }
+ ],
+ "bonds": [
+ {
+ "type": 1,
+ "atoms": [
+ 0,
+ 1
+ ],
+ "topology": 2
+ }
+ ]
+ },
+ "mol19": {
+ "type": "molecule",
+ "atoms": [
+ {
+ "label": "C",
+ "location": [
+ 9.479525439363456,
+ -13.474180551260991,
+ 0
+ ]
+ },
+ {
+ "label": "C",
+ "location": [
+ 10.345627526653676,
+ -12.974313825948782,
+ 0
+ ]
+ }
+ ],
+ "bonds": [
+ {
+ "type": 1,
+ "atoms": [
+ 0,
+ 1
+ ],
+ "center": 1
+ }
+ ]
+ },
+ "mol20": {
+ "type": "molecule",
+ "atoms": [
+ {
+ "label": "C",
+ "location": [
+ 9.429538576148214,
+ -14.323954365659787,
+ 0
+ ]
+ },
+ {
+ "label": "C",
+ "location": [
+ 10.295640663438434,
+ -13.824087640347583,
+ 0
+ ]
+ }
+ ],
+ "bonds": [
+ {
+ "type": 1,
+ "atoms": [
+ 0,
+ 1
+ ],
+ "center": 4
+ }
+ ]
+ },
+ "mol21": {
+ "type": "molecule",
+ "atoms": [
+ {
+ "label": "C",
+ "location": [
+ 9.229592076707355,
+ -15.04876054531042,
+ 0
+ ]
+ },
+ {
+ "label": "C",
+ "location": [
+ 10.095694163997575,
+ -14.548893819998213,
+ 0
+ ]
+ }
+ ],
+ "bonds": [
+ {
+ "type": 1,
+ "atoms": [
+ 0,
+ 1
+ ],
+ "center": 8
+ }
+ ]
+ },
+ "mol22": {
+ "type": "molecule",
+ "atoms": [
+ {
+ "label": "C",
+ "location": [
+ 9.30457189482016,
+ -15.723580815165922,
+ 0
+ ]
+ },
+ {
+ "label": "C",
+ "location": [
+ 10.17067398211038,
+ -15.223714089853717,
+ 0
+ ]
+ }
+ ],
+ "bonds": [
+ {
+ "type": 1,
+ "atoms": [
+ 0,
+ 1
+ ],
+ "center": 12
+ }
+ ]
+ },
+ "mol23": {
+ "type": "molecule",
+ "atoms": [
+ {
+ "label": "O",
+ "location": [
+ 9.329565326427783,
+ -16.52336776634948,
+ 0
+ ]
+ },
+ {
+ "label": "C",
+ "location": [
+ 10.195667890428059,
+ -16.02350104103727,
+ 0
+ ]
+ }
+ ],
+ "bonds": [
+ {
+ "type": 1,
+ "atoms": [
+ 0,
+ 1
+ ],
+ "center": -1
+ }
+ ]
+ },
+ "mol24": {
+ "type": "molecule",
+ "atoms": [
+ {
+ "label": "C",
+ "location": [
+ 9.354558758035406,
+ -17.398134535645838,
+ 0
+ ]
+ },
+ {
+ "label": "C",
+ "location": [
+ 10.220660845325622,
+ -16.898267810333635,
+ 0
+ ]
+ }
+ ],
+ "bonds": [
+ {
+ "type": 1,
+ "atoms": [
+ 0,
+ 1
+ ],
+ "center": 2
+ }
+ ]
+ },
+ "mol25": {
+ "type": "molecule",
+ "atoms": [
+ {
+ "label": "C",
+ "location": [
+ 9.329565326427783,
+ -18.172927578511718,
+ 0
+ ]
+ },
+ {
+ "label": "C",
+ "location": [
+ 10.195667890428059,
+ -17.67306085319951,
+ 0
+ ]
+ }
+ ],
+ "bonds": [
+ {
+ "type": 1,
+ "atoms": [
+ 0,
+ 1
+ ]
+ }
+ ]
+ }
+}
\ No newline at end of file
diff --git a/api/tests/integration/tests/formats/ref/issue_1777.b64cdx b/api/tests/integration/tests/formats/ref/issue_1777.b64cdx
new file mode 100644
index 0000000000..597ddbd480
--- /dev/null
+++ b/api/tests/integration/tests/formats/ref/issue_1777.b64cdx
@@ -0,0 +1 @@
+VmpDRDAxMDAEAwIBAAAAAAAAAAAAAAAAAAAAAAUIBAAAAB4AGggCAAMAGwgCAAQAAAEkAAAAAgACAOn9BQBBcmlhbAMA6f0PAFRpbWVzIE5ldyBSb21hbgADMgAIAP///////wAAAAAAAP//AAAAAP////8AAAAA//8AAAAA/////wAAAAD/////AAD//wGAAAAAABAIAgABAA8IAgABAAOABAAAAASABQAAAAACCACEvjMADX46AAAABIAGAAAAAAIIAIq/JAC5eVQAAAAEgAcAAAAAAggA6PtZAGQ9RAAAAASACAAAAAACCADu/EoADzleAAAABIAJAAAAAAIIAKf5egAvPUcAAAAEgAoAAAAAAggArfprANo4YQAAAASACwAAAAACCAA0t1EAmLDwAAAABIAMAAAAAAIIADi4QgBCrAoBAAAEgA0AAAAAAggA6bktALLw6QAAAASADgAAAAACCADvuh4AXOwDAQAABIAPAAAAAAIIAPr+LAD+p30BAAAEgBAAAAAAAggAAAAeAKijlwEAAASAEQAAAAACCADGce4A5n8fAAAABIASAAAAAAIIAM1y3wCQezkAAAAEgBMAAAAAAggAPPAEAQAAHgAAAASAFAAAAAACCABD8fUAq/s3AAAABIAVAAAAAAIIAIBuHgHYPyAAAAAEgBYAAAAAAggAhm8PAYM7OgAAAASAFwAAAAACCACs8e8AfHapAAAABIAYAAAAAAIIALPy4AAmcsMAAAAEgBkAAAAAAggAum8MAaI2pwAAAASAGgAAAAACCADAcP0ATjLBAAAABIAbAAAAAAIIAAouJQGiNqcAAAAEgBwAAAAAAggAEC8WAU4ywQAAAASAHQAAAAACCADhvEsA8md+AQAABIAeAAAAAAIIAOe9PACcY5gBAAAEgB8AAAACBAIADQAAAggACPLmAL5rjQEGgAAAAAAAAggACPLmAL5rjQEjCAEAAAAHDgABAAAAAwBgAMgAAABBbAAAAAAEgCAAAAAAAggADvPXAGRnpwEAAASAIQAAAAIEAgAOAAACCADu7wQBriuRAQaAAAAAAAACCADu7wQBriuRASMIAQAAAAcOAAEAAAADAGAAyAAAAFNpAAAAAASAIgAAAAIEAgAJAAACCAD08PUAWCerAQaAAAAAAAACCAD08PUAWCerASMIAQAAAAcNAAEAAAA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
\ No newline at end of file
diff --git a/api/tests/integration/tests/formats/ref/stereo_either-0020.b64cdx b/api/tests/integration/tests/formats/ref/stereo_either-0020.b64cdx
index 747ac973b3..78b40fa1f7 100644
--- a/api/tests/integration/tests/formats/ref/stereo_either-0020.b64cdx
+++ b/api/tests/integration/tests/formats/ref/stereo_either-0020.b64cdx
@@ -1 +1 @@
-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
\ No newline at end of file
+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
\ No newline at end of file
diff --git a/core/indigo-core/molecule/CDXCommons.h b/core/indigo-core/molecule/CDXCommons.h
index 9ccad8b4f0..ab54065664 100644
--- a/core/indigo-core/molecule/CDXCommons.h
+++ b/core/indigo-core/molecule/CDXCommons.h
@@ -2,6 +2,7 @@
#define _H_CDXCommons
#include "CDXConstants.h"
+#include "reaction/reaction.h"
#include
#include
#include
@@ -1278,6 +1279,33 @@ namespace indigo
{kCDXBondTopology_Ring, "Ring"},
{kCDXBondTopology_Chain, "Chain"},
{kCDXBondTopology_RingOrChain, "RingOrChain"}};
+
+ static const std::unordered_map bond_rxn_participation_to_reaction_center = {
+ {kCDXBondReactionParticipation_Unspecified, RC_UNMARKED},
+ {kCDXBondReactionParticipation_ReactionCenter, RC_CENTER},
+ {kCDXBondReactionParticipation_MakeOrBreak, RC_MADE_OR_BROKEN},
+ {kCDXBondReactionParticipation_ChangeType, RC_ORDER_CHANGED},
+ {kCDXBondReactionParticipation_MakeAndChange, RC_MADE_OR_BROKEN | RC_ORDER_CHANGED},
+ {kCDXBondReactionParticipation_NotReactionCenter, RC_NOT_CENTER},
+ {kCDXBondReactionParticipation_NoChange, RC_UNCHANGED},
+ {kCDXBondReactionParticipation_Unmapped, RC_UNMARKED}};
+ static const std::unordered_map reaction_center_to_bond_rxn_participation = {
+ {RC_UNMARKED, kCDXBondReactionParticipation_Unspecified},
+ {RC_CENTER, kCDXBondReactionParticipation_ReactionCenter},
+ {RC_MADE_OR_BROKEN, kCDXBondReactionParticipation_MakeOrBreak},
+ {RC_ORDER_CHANGED, kCDXBondReactionParticipation_ChangeType},
+ {RC_MADE_OR_BROKEN | RC_ORDER_CHANGED, kCDXBondReactionParticipation_MakeAndChange},
+ {RC_NOT_CENTER, kCDXBondReactionParticipation_NotReactionCenter},
+ {RC_UNCHANGED, kCDXBondReactionParticipation_NoChange},
+ {RC_UNMARKED, kCDXBondReactionParticipation_Unmapped}};
+
+ static const std::unordered_map cdx_topology_to_topology = {{kCDXBondTopology_Unspecified, TOPOLOGY_ANY},
+ {kCDXBondTopology_Ring, TOPOLOGY_RING},
+ {kCDXBondTopology_Chain, TOPOLOGY_CHAIN},
+ {kCDXBondTopology_RingOrChain, TOPOLOGY_ANY}};
+ static const std::unordered_map topology_to_cdx_topology = {
+ {TOPOLOGY_ANY, kCDXBondTopology_Unspecified}, {TOPOLOGY_RING, kCDXBondTopology_Ring}, {TOPOLOGY_CHAIN, kCDXBondTopology_Chain}};
+
}
#ifdef _WIN32
diff --git a/core/indigo-core/molecule/src/molecule_cdxml_loader.cpp b/core/indigo-core/molecule/src/molecule_cdxml_loader.cpp
index 7690721cd8..df5fdd12f6 100644
--- a/core/indigo-core/molecule/src/molecule_cdxml_loader.cpp
+++ b/core/indigo-core/molecule/src/molecule_cdxml_loader.cpp
@@ -756,14 +756,18 @@ void MoleculeCdxmlLoader::_updateConnection(const CdxmlNode& node, int atom_idx)
int MoleculeCdxmlLoader::_addBond(Molecule& mol, const CdxmlBond& bond, int begin, int end)
{
- int bond_idx = mol.addBond_Silent(begin, end, bond.order);
+ // bond topology is allowed only for queries but queries not supported for now
+ // if (bond.topology > 0 && _pqmol == nullptr)
+ // throw Error("bond topology is allowed only for queries");
+ int bond_idx = _pmol != nullptr ? _pmol->addBond_Silent(begin, end, bond.order)
+ : _pqmol->addBond(begin, end, QueryMolecule::createQueryMoleculeBond(bond.order, bond.topology, bond.dir));
if (bond.order == BOND_DOUBLE && bond.dir == BOND_EITHER)
mol.cis_trans.ignore(bond_idx);
else if (bond.dir > 0)
mol.setBondDirection(bond_idx, bond.dir);
if (bond.reaction_center > 0)
mol.reaction_bond_reacting_center[bond_idx] = bond.reaction_center;
- // bond topology is allowed only for queries but queries not supported for now
+
return bond_idx;
}
@@ -1285,27 +1289,14 @@ void MoleculeCdxmlLoader::_parseBond(CdxmlBond& bond, BaseCDXProperty& prop)
auto reaction_center_lambda = [&bond](const std::string& data) {
uint8_t rxn_participation = kBondReactionParticipationNameToInt.at(data);
- static const std::unordered_map bond_rxn_participation_map = {
- {kCDXBondReactionParticipation_Unspecified, RC_UNMARKED},
- {kCDXBondReactionParticipation_ReactionCenter, RC_CENTER},
- {kCDXBondReactionParticipation_MakeOrBreak, RC_MADE_OR_BROKEN},
- {kCDXBondReactionParticipation_ChangeType, RC_ORDER_CHANGED},
- {kCDXBondReactionParticipation_MakeAndChange, RC_MADE_OR_BROKEN | RC_ORDER_CHANGED},
- {kCDXBondReactionParticipation_NotReactionCenter, RC_NOT_CENTER},
- {kCDXBondReactionParticipation_NoChange, RC_UNCHANGED},
- {kCDXBondReactionParticipation_Unmapped, RC_UNMARKED}};
- auto it = bond_rxn_participation_map.find(rxn_participation);
- if (it != bond_rxn_participation_map.end())
+ auto it = bond_rxn_participation_to_reaction_center.find(rxn_participation);
+ if (it != bond_rxn_participation_to_reaction_center.end())
bond.reaction_center = it->second;
};
auto topology_lambda = [&bond](const std::string& data) {
uint8_t topology = kBondTopologyNameToInt.at(data);
- static const std::unordered_map topology_map = {{kCDXBondTopology_Unspecified, TOPOLOGY_ANY},
- {kCDXBondTopology_Ring, TOPOLOGY_RING},
- {kCDXBondTopology_Chain, TOPOLOGY_CHAIN},
- {kCDXBondTopology_RingOrChain, TOPOLOGY_ANY}};
- bond.topology = topology_map.at(topology);
+ bond.topology = cdx_topology_to_topology.at(topology);
};
std::unordered_map> bond_dispatcher = {{"id", id_lambda},
diff --git a/core/indigo-core/molecule/src/molecule_cdxml_saver.cpp b/core/indigo-core/molecule/src/molecule_cdxml_saver.cpp
index 227dcd8924..ac64b6df2a 100644
--- a/core/indigo-core/molecule/src/molecule_cdxml_saver.cpp
+++ b/core/indigo-core/molecule/src/molecule_cdxml_saver.cpp
@@ -957,44 +957,57 @@ void MoleculeCdxmlSaver::addBondToFragment(BaseMolecule& mol, tinyxml2::XMLEleme
bond->SetAttribute("E", _atoms_ids[edge.end]);
int order = mol.getBondOrder(bond_idx);
+ if (order < 0 && mol.isQueryMolecule())
+ order = QueryMolecule::getQueryBondType(mol.asQueryMolecule().getBond(bond_idx));
+
+ int dir = mol.getBondDirection(bond_idx);
+
+ if (mol.cis_trans.isIgnored(bond_idx))
+ {
+ order = BOND_DOUBLE;
+ dir = BOND_EITHER;
+ }
if (order == BOND_DOUBLE || order == BOND_TRIPLE)
bond->SetAttribute("Order", order);
else if (order == BOND_AROMATIC)
{
- bond->SetAttribute("Order", "1.5");
- bond->SetAttribute("Display", "Dash");
- bond->SetAttribute("Display2", "Dash");
+ bond->SetAttribute("Order", kBondOrderIntToStr.at(kCDXBondOrder_OneHalf).c_str());
+ bond->SetAttribute("Display", kCDXProp_Bond_DisplayIdToStr.at(kCDXBondDisplay_Dash).c_str());
+ bond->SetAttribute("Display2", kCDXProp_Bond_DisplayIdToStr.at(kCDXBondDisplay_Dash).c_str());
}
else if (order == _BOND_SINGLE_OR_DOUBLE)
{
- bond->SetAttribute("Order", "1 2");
+ bond->SetAttribute("Order", (kBondOrderIntToStr.at(kCDXBondOrder_Single) + " " + kBondOrderIntToStr.at(kCDXBondOrder_Double)).c_str());
}
else if (order == _BOND_SINGLE_OR_AROMATIC)
{
- bond->SetAttribute("Order", "1 1.5");
+ bond->SetAttribute("Order", (kBondOrderIntToStr.at(kCDXBondOrder_Single) + " " + kBondOrderIntToStr.at(kCDXBondOrder_OneHalf)).c_str());
}
else if (order == _BOND_DOUBLE_OR_AROMATIC)
{
- bond->SetAttribute("Order", "1.5 2");
+ bond->SetAttribute("Order", (kBondOrderIntToStr.at(kCDXBondOrder_Double) + " " + kBondOrderIntToStr.at(kCDXBondOrder_OneHalf)).c_str());
+ }
+ else if (order == _BOND_ANY)
+ {
+ bond->SetAttribute("Order", kBondOrderIntToStr.at(kCDXBondOrder_Any).c_str());
}
else if (order == _BOND_COORDINATION)
{
- bond->SetAttribute("Order", "dative");
+ bond->SetAttribute("Order", kBondOrderIntToStr.at(kCDXBondOrder_Dative).c_str());
}
else if (order == _BOND_HYDROGEN)
{
- bond->SetAttribute("Order", "hydrogen");
+ bond->SetAttribute("Order", kBondOrderIntToStr.at(kCDXBondOrder_Hydrogen).c_str());
}
else
; // Do not write single bond order
- int dir = mol.getBondDirection(bond_idx);
int parity = mol.cis_trans.getParity(bond_idx);
if (mol.have_xyz && (dir == BOND_UP || dir == BOND_DOWN))
{
- bond->SetAttribute("Display", (dir == BOND_UP) ? "WedgeBegin" : "WedgedHashBegin");
+ bond->SetAttribute("Display", kCDXProp_Bond_DisplayIdToStr.at((dir == BOND_UP) ? kCDXBondDisplay_WedgeBegin : kCDXBondDisplay_WedgedHashBegin).c_str());
}
else if (!mol.have_xyz && parity != 0)
{
@@ -1013,6 +1026,25 @@ void MoleculeCdxmlSaver::addBondToFragment(BaseMolecule& mol, tinyxml2::XMLEleme
buf.push(0);
bond->SetAttribute("BondCircularOrdering", buf.ptr());
}
+ else if (dir == BOND_EITHER)
+ {
+ bond->SetAttribute("Display", kCDXProp_Bond_DisplayIdToStr.at(kCDXBondDisplay_Wavy).c_str());
+ }
+
+ if (mol.reaction_bond_reacting_center[bond_idx] != RC_UNMARKED)
+ {
+ auto it = reaction_center_to_bond_rxn_participation.find(mol.reaction_bond_reacting_center[bond_idx]);
+ if (it != reaction_center_to_bond_rxn_participation.end())
+ bond->SetAttribute("RxnParticipation", it->second);
+ }
+
+ if (mol.isQueryMolecule())
+ {
+ int topology = VALUE_UNKNOWN;
+ mol.asQueryMolecule().getBond(bond_idx).sureValue(QueryMolecule::BOND_TOPOLOGY, topology);
+ if (topology > 0)
+ bond->SetAttribute("Topology", topology_to_cdx_topology.at(topology));
+ }
}
void MoleculeCdxmlSaver::addBondsToFragment(BaseMolecule& mol, tinyxml2::XMLElement* fragment)
diff --git a/core/indigo-core/molecule/src/molecule_json_loader.cpp b/core/indigo-core/molecule/src/molecule_json_loader.cpp
index 24fe6cbd12..56b01f0f38 100644
--- a/core/indigo-core/molecule/src/molecule_json_loader.cpp
+++ b/core/indigo-core/molecule/src/molecule_json_loader.cpp
@@ -708,6 +708,7 @@ void MoleculeJsonLoader::parseBonds(const rapidjson::Value& bonds, BaseMolecule&
break;
case BIOVIA_STEREO_DOUBLE_CISTRANS:
mol.cis_trans.ignore(bond_idx);
+ mol.setBondDirection(bond_idx, BOND_EITHER);
break;
case BIOVIA_STEREO_ETHER:
mol.setBondDirection(bond_idx, BOND_EITHER);
@@ -1458,7 +1459,12 @@ void MoleculeJsonLoader::loadMolecule(BaseMolecule& mol, bool load_arrows)
for (int i = 0; i < mol.edgeCount(); i++)
if (mol.getBondDirection(i) == BOND_EITHER)
{
- if (MoleculeCisTrans::isGeomStereoBond(mol, i, 0, true))
+ if (mol.cis_trans.isIgnored(i))
+ {
+ ignore_cistrans[i] = 1;
+ sensible_bond_directions[i] = 1;
+ }
+ else if (MoleculeCisTrans::isGeomStereoBond(mol, i, 0, true))
{
ignore_cistrans[i] = 1;
sensible_bond_directions[i] = 1;