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 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193
|
/* Copyright (C) 2000-2003 Damir Zucic */
/*=============================================================================
catch.c
Purpose:
Execute catch (take) command: catch the specified macromolecular
complex and release all others. Set the new default caught ID
and refresh the control window. Reset the group flag (RuntimeS).
Input:
(1) Pointer to MolComplexS structure, with macromol. complexes.
(2) Number of macromolecular complexes.
(3) Pointer to RuntimeS structure, with some runtime data.
(4) Pointer to ConfigS structure, with configuration data.
(5) Pointer to GUIS structure, with GUI data.
(6) Pointer to NearestAtomS structure.
(7) The number of pixels in the main window free area.
(8) Pointer to refreshI.
(9) The string which contains the macromol. complex identifier.
Output:
(1) The catch flag (catchF) set for each macromolecular complex.
(2) Return value.
Return value:
(1) Positive (command) code on success.
(2) Negative (error) code on failure.
Notes:
(1) This command takes only one argument. If you want to catch
more than one macromolecular complex, use command group.
(2) 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 *);
size_t MainRefresh_ (MolComplexS *, int,
RuntimeS *, ConfigS *, GUIS *,
NearestAtomS *, size_t, unsigned int);
int ControlRefresh_ (MolComplexS *, ConfigS *, GUIS *);
/*======execute catch command:===============================================*/
int Catch_ (MolComplexS *mol_complexSP, int mol_complexesN,
RuntimeS *runtimeSP, ConfigS *configSP, GUIS *guiSP,
NearestAtomS *nearest_atomSP, size_t pixelsN,
unsigned int *refreshIP, char *stringP)
{
char *remainderP;
char tokenA[SHORTSTRINGSIZE];
int complexID;
int mol_complexI;
MolComplexS *curr_mol_complexSP;
int job_doneF = 0;
/* Extract the macromolecular complex identifier: */
remainderP = ExtractToken_ (tokenA, SHORTSTRINGSIZE, stringP, " \t\n");
if (!remainderP)
{
strcpy (runtimeSP->messageA, "Complex identifier missing!");
runtimeSP->message_length = strlen (runtimeSP->messageA);
return ERROR_NO_ID;
}
/* Read the identifier (integer expected): */
if (sscanf (tokenA, "%d", &complexID) != 1)
{
strcpy (runtimeSP->messageA, "Bad macromolecular complex identifier!");
runtimeSP->message_length = strlen (runtimeSP->messageA);
return ERROR_BAD_ID;
}
/* Set the catchF and the group_memberF for the specified complex: */
for (mol_complexI = 0; mol_complexI < mol_complexesN; mol_complexI++)
{
/** Prepare the pointer to the current macromolecular complex: **/
curr_mol_complexSP = mol_complexSP + mol_complexI;
/** Check the number of atoms; for bad **/
/** and discarded complexes it is zero: **/
if (curr_mol_complexSP->atomsN == 0) continue;
/** If macromolecular complex is recognized: **/
if (curr_mol_complexSP->mol_complexID == complexID)
{
/* Set the catchF to one: */
curr_mol_complexSP->catchF = 1;
/* Set the group_memberF to zero: */
curr_mol_complexSP->group_memberF = 0;
/* Set the flag which says that the complex was found: */
job_doneF = 1;
}
}
/* If complex was not found, return negative value: */
if (job_doneF == 0)
{
strcpy (runtimeSP->messageA, "Bad complex identifier (out of range)!");
runtimeSP->message_length = strlen (runtimeSP->messageA);
return ERROR_BAD_ID;
}
/* If complex was found, set all other catch flags to zero: */
for (mol_complexI = 0; mol_complexI < mol_complexesN; mol_complexI++)
{
/** Prepare the pointer to the current macromolecular complex: **/
curr_mol_complexSP = mol_complexSP + mol_complexI;
/** For the specified complex, do not reset the catch flag, but **/
/** use the complex index as the index of default caught complex: **/
if (curr_mol_complexSP->mol_complexID == complexID)
{
runtimeSP->default_complexI = mol_complexI;
continue;
}
/** For all other complexes, set the catch flag to zero: **/
curr_mol_complexSP->catchF = 0;
}
/* Default editing mode (0, no editing) does not */
/* require redrawing. Other modes require it: */
if (runtimeSP->edit_modeI != 0)
{
/* Reset the edit mode index: */
runtimeSP->edit_modeI = 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);
}
/* Don't forget to reset the group flag to zero. If some structures */
/* were grouped before, the command CATCH should break the group: */
runtimeSP->groupF = 0;
/* If some structures were involved in a formation of a */
/* group, restore the original rotation center vectors: */
for (mol_complexI = 0; mol_complexI < mol_complexesN; mol_complexI++)
{
/* Prepare the pointer to the current macromolecular complex: */
curr_mol_complexSP = mol_complexSP + mol_complexI;
/* Check was this complex a group member: */
if (curr_mol_complexSP->group_memberF == 0) continue;
/* If this point is reached, the current complex was a group member. */
/* Restore the original rotation center vector: */
curr_mol_complexSP->rotation_center_vectorS.x =
curr_mol_complexSP->backup_vectorS.x;
curr_mol_complexSP->rotation_center_vectorS.y =
curr_mol_complexSP->backup_vectorS.y;
curr_mol_complexSP->rotation_center_vectorS.z =
curr_mol_complexSP->backup_vectorS.z;
/* Reset the group_memberF: */
curr_mol_complexSP->group_memberF = 0;
}
/* Return positive value on success: */
return COMMAND_CATCH;
}
/*===========================================================================*/
|