Skip to content

Commit

Permalink
Fix bond between two functional groups disappearing (#2282)
Browse files Browse the repository at this point in the history
  • Loading branch information
yuleicul committed Feb 28, 2023
1 parent 48b1477 commit d0d8f70
Show file tree
Hide file tree
Showing 7 changed files with 34 additions and 54 deletions.
10 changes: 4 additions & 6 deletions packages/ketcher-core/src/application/render/restruct/rebond.ts
Original file line number Diff line number Diff line change
Expand Up @@ -67,8 +67,7 @@ class ReBond extends ReObject {
FunctionalGroup.isBondInContractedFunctionalGroup(
bond,
sgroups,
functionalGroups,
true
functionalGroups
)
) {
return null
Expand All @@ -89,8 +88,7 @@ class ReBond extends ReObject {
FunctionalGroup.isBondInContractedFunctionalGroup(
bond,
sgroups,
functionalGroups,
true
functionalGroups
)
) {
return null
Expand All @@ -110,11 +108,11 @@ class ReBond extends ReObject {
const sgroups = restruct.molecule.sgroups
const functionalGroups = restruct.molecule.functionalGroups
if (
bond &&
FunctionalGroup.isBondInContractedFunctionalGroup(
bond,
sgroups,
functionalGroups,
false
functionalGroups
)
) {
return
Expand Down
52 changes: 21 additions & 31 deletions packages/ketcher-core/src/domain/entities/functionalGroup.ts
Original file line number Diff line number Diff line change
Expand Up @@ -13,10 +13,13 @@
* See the License for the specific language governing permissions and
* limitations under the License.
***************************************************************************/
import { ReSGroup } from 'application/render'
import assert from 'assert'
import { FunctionalGroupsProvider } from '../helpers'
import { Bond } from './bond'
import { Pool } from './pool'
import { SGroup } from './sgroup'
import { Struct } from './struct'
import assert from 'assert'

export class FunctionalGroup {
#sgroup: SGroup
Expand Down Expand Up @@ -216,36 +219,23 @@ export class FunctionalGroup {
}

static isBondInContractedFunctionalGroup(
bond,
sgroups,
functionalGroups,
sgroupsFromReStruct: boolean
): boolean {
const contractedFunctionalGroupsAtoms: number[] = []
if (sgroupsFromReStruct) {
sgroups.forEach((sg) => {
if (
FunctionalGroup.isContractedFunctionalGroup(
sg.item.id,
functionalGroups
)
) {
contractedFunctionalGroupsAtoms.push(...sg.item.atoms)
}
})
} else {
sgroups.forEach((sg) => {
if (
FunctionalGroup.isContractedFunctionalGroup(sg.id, functionalGroups)
) {
contractedFunctionalGroupsAtoms.push(...sg.atoms)
}
})
}
return (
contractedFunctionalGroupsAtoms.includes(bond.begin) &&
contractedFunctionalGroupsAtoms.includes(bond.end)
)
bond: Bond,
sGroups: Map<number, ReSGroup> | Pool<SGroup>,
functionalGroups: Pool<FunctionalGroup>
) {
return [...sGroups.values()].some((sGroup) => {
const sGroupId = 'item' in sGroup ? sGroup.item.id : sGroup.id
const atomsInSGroup = 'item' in sGroup ? sGroup.item.atoms : sGroup.atoms
const isContracted = FunctionalGroup.isContractedFunctionalGroup(
sGroupId,
functionalGroups
)
return (
isContracted &&
atomsInSGroup.includes(bond.begin) &&
atomsInSGroup.includes(bond.end)
)
})
}

static isContractedFunctionalGroup(sgroupId, functionalGroups): boolean {
Expand Down
6 changes: 2 additions & 4 deletions packages/ketcher-react/src/script/editor/shared/closest.js
Original file line number Diff line number Diff line change
Expand Up @@ -181,8 +181,7 @@ function findClosestBond(restruct, pos, skip, minDist, scale) {
FunctionalGroup.isBondInContractedFunctionalGroup(
bond.b,
sGroups,
functionalGroups,
true
functionalGroups
)
)
return null
Expand All @@ -202,8 +201,7 @@ function findClosestBond(restruct, pos, skip, minDist, scale) {
FunctionalGroup.isBondInContractedFunctionalGroup(
bond.b,
sGroups,
functionalGroups,
true
functionalGroups
)
)
return null
Expand Down
6 changes: 2 additions & 4 deletions packages/ketcher-react/src/script/editor/tool/eraser.ts
Original file line number Diff line number Diff line change
Expand Up @@ -154,8 +154,7 @@ class EraserTool {
!FunctionalGroup.isBondInContractedFunctionalGroup(
bondFromStruct,
sgroups,
functionalGroups,
true
functionalGroups
)
) {
bondsResult.push(bondId)
Expand Down Expand Up @@ -269,8 +268,7 @@ class EraserTool {
!FunctionalGroup.isBondInContractedFunctionalGroup(
bondFromStruct,
sgroups,
functionalGroups,
true
functionalGroups
)
) {
bondResult.push(bondId)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -42,8 +42,7 @@ function getElementsInRectangle(restruct, p0, p1) {
!FunctionalGroup.isBondInContractedFunctionalGroup(
bond.b,
sGroups,
functionalGroups,
true
functionalGroups
)
) {
bondList.push(bid)
Expand Down Expand Up @@ -177,8 +176,7 @@ function getElementsInPolygon(restruct, rr) {
!FunctionalGroup.isBondInContractedFunctionalGroup(
bond.b,
sGroups,
functionalGroups,
true
functionalGroups
)
) {
bondList.push(bid)
Expand Down
5 changes: 2 additions & 3 deletions packages/ketcher-react/src/script/editor/tool/select.ts
Original file line number Diff line number Diff line change
Expand Up @@ -468,13 +468,12 @@ class SelectTool {
)
const bondFromStruct = bondId !== null && struct.bonds.get(bondId)?.b
if (
bondId !== null &&
bondFromStruct &&
!FunctionalGroup.isBondInContractedFunctionalGroup(
// TODO: examine if this code is really needed, seems like its a hack
bondFromStruct,
sgroups,
functionalGroups,
true
functionalGroups
)
)
bondResult.push(bondId)
Expand Down
3 changes: 1 addition & 2 deletions packages/ketcher-react/src/script/editor/tool/sgroup.ts
Original file line number Diff line number Diff line change
Expand Up @@ -191,8 +191,7 @@ class SGroupTool {
!FunctionalGroup.isBondInContractedFunctionalGroup(
bondFromStruct,
sgroups,
functionalGroups,
true
functionalGroups
)
) {
bondResult.push(bondId)
Expand Down

0 comments on commit d0d8f70

Please sign in to comment.