1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165
|
/* Copyright (C) 2000, 2001 Damir Zucic */
/*=============================================================================
select.c
Purpose:
Execute select command. Select the specified atoms in all
caught macromolecular complexes. Three selection modes are
available: 0 = overwrite, 1 = restrict, 2 = expand previous
selection.
Input:
(1) Pointer to MolComplexS structure.
(2) Number of macromolecular complexes.
(3) Pointer to RuntimeS structure.
(4) Pointer to ConfigS structure.
(5) Pointer to GUIS structure.
(6) Pointer to NearestAtomS structure.
(7) The number of pixels in the main window free area.
(8) Pointer to refreshI.
(9) The selection string.
(10) Selection mode index.
Output:
(1) Selection flag changed for some or all atoms.
(2) Return value.
Return value:
(1) Positive (command) code on success.
(2) Negative (error) code on failure.
Notes:
(1) This function resets the edit mode index.
========includes:============================================================*/
#include <stdio.h>
#include <string.h>
#include <X11/Xlib.h>
#include <X11/Xutil.h>
#include <X11/Xos.h>
#include <X11/Xatom.h>
#include "defines.h"
#include "commands.h"
#include "typedefs.h"
/*======function prototypes:=================================================*/
char *ExtractToken_ (char *, int, char *, char *);
long FullSelect_ (MolComplexS *, int, char *, int);
long SelectElement_ (MolComplexS *, int, char *, int);
long SelectAtoms_ (MolComplexS *, int, RuntimeS *, char *, int);
long SpecialSelect_ (MolComplexS *, int, RuntimeS *, char *, int);
long QuickSelect_ (MolComplexS *, int, char *, int);
size_t MainRefresh_ (MolComplexS *, int,
RuntimeS *, ConfigS *, GUIS *,
NearestAtomS *, size_t, unsigned int);
int ControlRefresh_ (MolComplexS *, ConfigS *, GUIS *);
/*======execute select command:==============================================*/
int Select_ (MolComplexS *mol_complexSP, int mol_complexesN,
RuntimeS *runtimeSP, ConfigS *configSP, GUIS *guiSP,
NearestAtomS *nearest_atomSP, size_t pixelsN,
unsigned int *refreshIP,
char *stringP, int selection_modeI)
{
char *remainderP;
char tokenA[STRINGSIZE];
long selected_atomsN;
/* The second token should contain the selection */
/* criteria; it is called "the selection string": */
remainderP = ExtractToken_ (tokenA, STRINGSIZE, stringP, "\n\0");
if (!remainderP)
{
strcpy (runtimeSP->messageA, "Selection criteria missing!");
runtimeSP->message_length = strlen (runtimeSP->messageA);
return ERROR_SELECT;
}
/* First try with the function which expects precise selection */
/* criteria; the string is expected to contain three slashes: */
selected_atomsN = FullSelect_ (mol_complexSP, mol_complexesN,
tokenA, selection_modeI);
/* If the first attempt failed, try to intepret the command */
/* as the request to select the specified chemical element: */
if (selected_atomsN == -1)
{
selected_atomsN = SelectElement_ (mol_complexSP, mol_complexesN,
tokenA, selection_modeI);
}
/* Try to interpret the command as the request to select */
/* the atom which has the specified serial number: */
if (selected_atomsN == -1)
{
selected_atomsN = SelectAtoms_ (mol_complexSP, mol_complexesN,
runtimeSP, tokenA, selection_modeI);
}
/* If all previous functions were unable to interpret the */
/* selection string try with the special selection function: */
if (selected_atomsN == -1)
{
selected_atomsN = SpecialSelect_ (mol_complexSP, mol_complexesN,
runtimeSP, tokenA, selection_modeI);
}
/* The last attempt - try with the "quick" selection: */
if (selected_atomsN == -1)
{
selected_atomsN = QuickSelect_ (mol_complexSP, mol_complexesN,
tokenA, selection_modeI);
}
/* Write the number of selected atoms to the input window: */
if (selected_atomsN >= 0)
{
sprintf (runtimeSP->messageA,
"%ld atom(s) selected", selected_atomsN);
runtimeSP->message_length = strlen (runtimeSP->messageA);
}
/* If all selection functions failed, prepare error message: */
else
{
strcpy (runtimeSP->messageA, "Selection failed!");
runtimeSP->message_length = strlen (runtimeSP->messageA);
return ERROR_SELECT;
}
/* Default editing mode (0, no editing) does not */
/* require redrawing. Other modes require it: */
if (runtimeSP->edit_modeI != 0)
{
/* Reset edit mode index: */
runtimeSP->edit_modeI = 0;
/* Reset edit_single_bondF flag: */
runtimeSP->edit_single_bondF = 0;
/* Refresh the main window: */
(*refreshIP)++;
MainRefresh_ (mol_complexSP, mol_complexesN,
runtimeSP, configSP, guiSP,
nearest_atomSP, pixelsN, *refreshIP);
/* Refresh the control window: */
ControlRefresh_ (mol_complexSP + runtimeSP->default_complexI,
configSP, guiSP);
}
/* If this point is reached, everything worked fine: */
return COMMAND_SELECT;
}
/*===========================================================================*/
|