Browse Source

mol-model: support isConnectedTo query disjunct and invert

David Sehnal 5 years ago
parent
commit
c9116575fa
1 changed files with 7 additions and 1 deletions
  1. 7 1
      src/mol-model/structure/query/queries/filters.ts

+ 7 - 1
src/mol-model/structure/query/queries/filters.ts

@@ -229,12 +229,13 @@ function withinMinMaxRadius({ queryCtx, selection, target, minRadius, maxRadius,
 
 interface IsConnectedToCtx {
     queryCtx: QueryContext,
+    disjunct: boolean,
     input: Structure,
     target: Structure
 }
 
 function checkConnected(ctx: IsConnectedToCtx, structure: Structure) {
-    const { queryCtx, input, target } = ctx;
+    const { queryCtx, input, target, disjunct } = ctx;
     const atomicLink = queryCtx.atomicLink;
 
     const interLinks = input.links;
@@ -262,6 +263,7 @@ function checkConnected(ctx: IsConnectedToCtx, structure: Structure) {
             for (let l = offset[inputIndex], _l = offset[inputIndex + 1]; l < _l; l++) {
                 // tElement.element = inputElements[b[l]];
                 atomicLink.b.element = inputUnit.elements[b[l]];
+                if (disjunct && SortedArray.has(unit.elements, atomicLink.b.element)) continue;
                 if (!target.hasElement(atomicLink.b)) continue;
 
                 atomicLink.aIndex = inputIndex;
@@ -281,6 +283,7 @@ function checkConnected(ctx: IsConnectedToCtx, structure: Structure) {
                     atomicLink.b.unit = lu.unitB;
                     atomicLink.b.element = bElements[bond.indexB];
                     if (!target.hasElement(atomicLink.b)) continue;
+                    if (disjunct && structure.hasElement(atomicLink.b)) continue;
 
                     atomicLink.a.unit = inputUnit;
                     atomicLink.aIndex = inputIndex;
@@ -316,6 +319,7 @@ export function isConnectedTo({ query, target, disjunct, invert, linkTest }: IsC
         const connCtx: IsConnectedToCtx = {
             queryCtx: ctx,
             input: ctx.inputStructure,
+            disjunct,
             target: StructureSelection.unionStructure(targetSel)
         }
 
@@ -326,6 +330,8 @@ export function isConnectedTo({ query, target, disjunct, invert, linkTest }: IsC
         StructureSelection.forEach(selection, (s, sI) => {
             if (checkConnected(connCtx, s)) {
                 ret.add(s);
+            } else if (invert) {
+                ret.add(s);
             }
             if (sI % 5 === 0) ctx.throwIfTimedOut();
         })