1
/***************************************************************************
5
* Molecular Graphics Visualisation Tool *
8
* Based on RasMol 2.6 by Roger Sayle *
9
* Biomolecular Structures Group, Glaxo Wellcome Research & Development, *
10
* Stevenage, Hertfordshire, UK *
11
* Version 2.6, August 1995, Version 2.6.4, December 1998 *
12
* Copyright (C) Roger Sayle 1992-1999 *
14
* and Based on Mods by *
15
*Author Version, Date Copyright *
16
*Arne Mueller RasMol 2.6x1 May 98 (C) Arne Mueller 1998 *
17
*Gary Grossman and RasMol 2.5-ucb Nov 95 (C) UC Regents/ModularCHEM *
18
*Marco Molinaro RasMol 2.6-ucb Nov 96 Consortium 1995, 1996 *
20
*Philippe Valadon RasTop 1.3 Aug 00 (C) Philippe Valadon 2000 *
22
*Herbert J. RasMol 2.7.0 Mar 99 (C) Herbert J. Bernstein *
23
*Bernstein RasMol 2.7.1 Jun 99 1998-2008 *
24
* RasMol 2.7.1.1 Jan 01 *
25
* RasMol 2.7.2 Aug 00 *
26
* RasMol 2.7.2.1 Apr 01 *
27
* RasMol 2.7.2.1.1 Jan 04 *
28
* RasMol 2.7.3 Feb 05 *
29
* RasMol 2.7.3.1 Apr 06 *
30
* RasMol 2.7.4 Nov 07 *
31
* RasMol 2.7.4.1 Jan 08 *
32
* RasMol 2.7.4.2 Mar 08 *
33
* RasMol 2.7.5 May 09 *
35
* RasMol 2.7.5 incorporates changes by T. Ikonen, G. McQuillan, N. Darakev*
36
* and L. Andrews (via the neartree package). Work on RasMol 2.7.5 *
37
* supported in part by grant 1R15GM078077-01 from the National Institute *
38
* of General Medical Sciences (NIGMS), U.S. National Institutes of Health *
39
* and by grant ER63601-1021466-0009501 from the Office of Biological & *
40
* Environmental Research (BER), Office of Science, U. S. Department of *
41
* Energy. RasMol 2.7.4 incorporated changes by G. Todorov, Nan Jia, *
42
* N. Darakev, P. Kamburov, G. McQuillan, and J. Jemilawon. Work on RasMol *
43
* 2.7.4 supported in part by grant 1R15GM078077-01 from the NIGMS/NIH and *
44
* grant ER63601-1021466-0009501 from BER/DOE. RasMol 2.7.3 incorporates *
45
* changes by Clarice Chigbo, Ricky Chachra, and Mamoru Yamanishi. Work *
46
* on RasMol 2.7.3 supported in part by grants DBI-0203064, DBI-0315281 *
47
* and EF-0312612 from the U.S. National Science Foundation and grant *
48
* DE-FG02-03ER63601 from BER/DOE. The content is solely the responsibility*
49
* of the authors and does not necessarily represent the official views of *
50
* the funding organizations. *
52
* The code for use of RasMol under GTK in RasMol 2.7.4.2 and 2.7.5 was *
53
* written by Teemu Ikonen. *
55
* and Incorporating Translations by *
56
* Author Item Language *
57
* Isabel Servan Martinez, *
58
* Jose Miguel Fernandez Fernandez 2.6 Manual Spanish *
59
* Jose Miguel Fernandez Fernandez 2.7.1 Manual Spanish *
60
* Fernando Gabriel Ranea 2.7.1 menus and messages Spanish *
61
* Jean-Pierre Demailly 2.7.1 menus and messages French *
62
* Giuseppe Martini, Giovanni Paolella, 2.7.1 menus and messages *
63
* A. Davassi, M. Masullo, C. Liotto 2.7.1 help file Italian *
64
* G. Pozhvanov 2.7.3 menus and messages Russian *
65
* G. Todorov 2.7.3 menus and messages Bulgarian*
66
* Nan Jia, G. Todorov 2.7.3 menus and messages Chinese *
67
* Mamoru Yamanishi, Katajima Hajime 2.7.3 menus and messages Japanese *
70
* Herbert J. Bernstein, Bernstein + Sons, 5 Brewster Ln, Bellport, NY, USA*
71
* yaya@bernstein-plus-sons.com *
72
* Copyright(C) Herbert J. Bernstein 1998-2008 *
74
* READ THE FILE NOTICE FOR RASMOL LICENSES *
75
*Please read the file NOTICE for important notices which apply to this *
76
*package and for license terms (GPL or RASLIC). *
77
***************************************************************************/
81
/* With post-2.7.2.1-release mod,
82
Update for inline script loading in UCB multiple
83
molecule environment. HJB, 18 April 2001 */
84
/* With post-2.7.2.1-release mod,
85
Disable STRICT checking in ExecuteLoadCommand
86
To fix load inline for Windows. HJB 19 April 2001 */
87
/* With post-2.7.2.1-release mod,
88
Correct logic for inline load of new molecule
89
from data file treated as a script. HJB 29 June 2001 */
101
#ifdef __CONDITIONALMACROS__
102
#include <Printing.h>
104
#include <PrintTraps.h>
112
#if defined(IBMPC) || defined(VMS) || defined(APPLEMAC)
113
#include "string_case.h"
122
#if !defined(IBMPC) && !defined(VMS) && !defined(APPLEMAC)
129
#include "molecule.h"
132
#include "transfor.h"
133
#include "cmndline.h"
136
#include "graphics.h"
137
#include "pixutils.h"
140
#include "multiple.h" /* [GSG 11/9/95] */
141
/* #include "toolbar.h" */ /* [GSG 11/11/95] */
143
#include "wbrotate.h"
154
#if defined(__sun) && !defined(_XOPEN_SOURCE)
155
/* SUN doesn't always define popen in stdio! */
156
extern FILE *popen( const char*, const char* );
159
/* Macros for commonly used loops */
160
#define ForEachAtom for(chain=Database->clist;chain;chain=chain->cnext) \
161
for(group=chain->glist;group;group=group->gnext) \
162
for(ptr=group->alist;ptr;ptr=ptr->anext)
163
#define ForEachBond for(bptr=Database->blist;bptr;bptr=bptr->bnext)
164
#define ForEachSurfBond for(sbptr=Database->sblist;sbptr;sbptr=sbptr->sbnext)
167
#define IsIdentChar(x) ((isalnum(x))||((x)=='_')||((x)=='$'))
170
#define InvertY(y) (y)
172
#define InvertY(y) (-(y))
175
#define Round(x) ((int)rint(x))
195
static RGBStruct ColourTable[34] = {
196
{ 0, 0, 0 }, /* Black */
197
{ 0, 0, 255 }, /* Blue */
198
{ 175, 214, 255 }, /* BlueTint */
199
{ 175, 117, 89 }, /* Brown */
200
{ 0, 255, 255 }, /* Cyan */
201
{ 255, 156, 0 }, /* Gold */
202
{ 125, 125, 125 }, /* Gray */
203
{ 0, 255, 0 }, /* Green */
204
{ 46, 139, 87 }, /* GreenBlue */
205
{ 152, 255, 179 }, /* GreenTint */
206
{ 255, 0, 101 }, /* HotPink */
207
{ 255, 0, 255 }, /* Magenta */
208
{ 255, 165, 0 }, /* Orange */
209
{ 255, 101, 117 }, /* Pink */
210
{ 255, 171, 187 }, /* PinkTint */
211
{ 160, 32, 240 }, /* Purple */
212
{ 255, 0, 0 }, /* Red */
213
{ 255, 69, 0 }, /* RedOrange */
214
{ 0, 250, 109 }, /* SeaGreen */
215
{ 58, 144, 255 }, /* SkyBlue */
216
{ 238, 130, 238 }, /* Violet */
217
{ 255, 255, 255 }, /* White */
218
{ 255, 255, 0 }, /* Yellow */
219
{ 246, 246, 117 } /* YellowTint */
223
typedef struct _HlpEntry {
224
struct _HlpEntry __far *next;
225
struct _HlpEntry __far *info;
231
static char *HelpFileName;
232
static char HelpFileBuf[80];
233
static HlpEntry __far *FreeInfo;
234
static HlpEntry __far *HelpInfo;
237
static char ResidueChar[29] = {
238
'A', 'G', 'L', 'S', 'V', 'T', 'K', 'D', 'I', 'N',
239
'E', 'P', 'R', 'F', 'Q', 'Y', 'H', 'C', 'M', 'W',
247
static char *NameStack[STACKSIZE];
248
static FILE *FileStack[STACKSIZE];
249
static int LineStack[STACKSIZE];
250
static char AcceptData[STACKSIZE];
252
static int TokenLength;
253
static Long TokenValue;
254
static char TokenIdent[128];
255
static char *TokenStart;
256
static char *TokenPtr;
260
static int RVal, GVal, BVal;
261
static int SeqFormat;
264
/*=======================*/
265
/* Function Prototypes */
266
/*=======================*/
268
int ExecuteCommand( void );
269
int ExecuteIPCCommand( char __huge* );
270
static int PrefixString( char __far*, char __far* );
271
static char __far * xfgets( char __far*, int, FILE __far *);
272
static int FetchToken( void );
273
void WriteImageFile( char *, int, int );
275
void CommandError( char *error )
281
{ if( FileDepth > -1 )
282
{ InvalidateCmndLine();
283
WriteString(CurLine);
285
} else WriteString(" ");
287
for( ptr=CurLine; ptr<TokenStart; ptr++ )
293
{ if( LineStack[FileDepth] )
294
{ if( NameStack[FileDepth] )
296
ptr = NameStack[FileDepth];
298
while( *ptr != '\\' && ptr != NameStack[FileDepth] ) ptr--;
299
if( *ptr == '\\' ) ptr++;
303
sprintf(buffer,"line %d: ",LineStack[FileDepth]);
306
{ WriteString(NameStack[FileDepth]);
312
{ WriteString(error);
313
if (strlen(error)>(size_t)0 && !(error[strlen(error)-(size_t)1]=='\n')) {
317
CommandActive = False;
323
/*==========================*/
324
/* File Handling Services */
325
/*==========================*/
328
static char *ProcessFileName( char *name )
337
{ *ptr++ = ToUpper(*name);
341
/* Strip trailing spaces! */
342
while( (ptr!=DataFileName) && (ptr[-1]==' ') )
350
static char *ProcessFileName( char *name )
361
/* Strip trailing spaces! */
362
while( (ptr!=DataFileName) && (ptr[-1]==' ') )
370
static char *ProcessFileName( char *name )
378
while( *name && (*name!=' ') )
379
{ *ptr++ = ToUpper(*name);
388
#if !defined(IBMPC) && !defined(APPLEMAC) && !defined(VMS)
389
static int IsSecure( int ch )
392
{ /* Dangerous characters in UNIX "popen"! */
393
case('<'): case('>'): case('('): case(')'):
394
case('{'): case('}'): case('['): case(']'):
395
case('\''): case(';'): case('|'): case('&'):
402
static char *ProcessFileName( char *name )
404
register struct passwd *entry;
412
/* Perform filename globbing */
414
{ ptr = username; name++;
415
while( *name && (*name!=' ') && (*name!='/') )
421
{ if( (entry=getpwnam(username)) )
422
{ temp = entry->pw_dir;
424
} else /* Unknown user! */
429
} else if( !(temp=(char*)getenv("HOME")) )
434
} else ptr = DataFileName;
436
/* Strip dubious characters! */
437
while( *name && (*name!=' ') )
438
if( IsSecure(*name) )
450
/* UNIX Compressed Filename extensions! */
451
static char *FileExt[MaxFileExt] = { "", ".Z", ".gz", ".z" };
453
static FILE *OpenDataFile( char *begin, char *end )
455
register char *src, *dst;
459
for( i=0; i<MaxFileExt; i++ )
460
{ dst = end; src = FileExt[i];
461
while( (*dst++ = *src++) );
462
if( (fp=fopen(begin,"rb")) ) {
467
fp = fopen(begin,"rb");
471
#else /* !defined(UNIX) */
473
static FILE *OpenDataFile( char *begin, char *end )
477
fp = fopen(begin,"rb");
483
int ProcessFile( int format, int info, FILE *fp )
488
temp = getenv("RASMOLCIF");
491
if (!strncasecmp(temp,"cif",3)) UseCIF = 1;
495
{ case(FormatPDB): done = LoadPDBMolecule(fp,False); break;
496
case(FormatNMRPDB): done = LoadPDBMolecule(fp,True); break;
497
case(FormatMacroMod): done = LoadMacroModelMolecule(fp); break;
498
case(FormatAlchemy): done = LoadAlchemyMolecule(fp); break;
499
case(FormatCharmm): done = LoadCharmmMolecule(fp); break;
500
case(FormatBiosym): done = LoadBiosymMolecule(fp); break;
501
case(FormatMOPAC): done = LoadMOPACMolecule(fp); break;
502
case(FormatSHELX): done = LoadSHELXMolecule(fp); break;
503
case(FormatMol2): done = LoadMol2Molecule(fp); break;
504
case(FormatFDAT): done = LoadFDATMolecule(fp); break;
505
case(FormatMDL): done = LoadMDLMolecule(fp); break;
506
case(FormatXYZ): done = LoadXYZMolecule(fp); break;
507
case(FormatCIF): done = LoadCIFMolecule(fp); break;
509
case(FormatCEX): done = LoadCEXMolecule(fp); break;
511
default: done = False;
516
} else if( !Database )
518
if (Interactive) ReviseTitle();
521
if (!DataFileFormat) DataFileFormat = format;
522
AdviseUpdate(AdvName);
523
AdviseUpdate(AdvClass);
524
AdviseUpdate(AdvIdent);
531
ReDrawFlag |= RFInitial;
533
{ if( Info.bondcount < (MainAtomCount+HetaAtomCount)-Info.chaincount )
534
{ if( MainAtomCount+HetaAtomCount > 255 )
535
{ CreateMoleculeBonds(info,False,False);
536
} else CreateMoleculeBonds(info,True,False);
539
if( CalcSurfFlag ) CreateSurfaceBonds();
541
/* Explicit Hydrogen Bonds! */
542
if( Info.hbondcount > 0 )
543
SetHBondStatus(True,True,0,0);
545
/* Explicit SSbonds! */
546
if (Info.ssbondcount > 0 ) {
547
SetHBondStatus(False,True,0,0);
559
static int FetchFileOne( int format, int info, char *name )
565
register char *src,*dst;
568
#endif /* APPLEMAC */
570
register int done = 0;
574
name = ProcessFileName(name);
575
fp = OpenDataFile(DataFileName,name);
578
/* Search for directory specification! */
581
{ src = DataFileName;
582
while( *src && (*src!=DirChar) )
590
/* Try using a default file path! */
595
{ case(FormatNMRPDB):
596
case(FormatPDB): src = (char*)getenv("RASMOLPDBPATH"); break;
597
case(FormatMol2): src = (char*)getenv("RASMOLMOL2PATH"); break;
598
case(FormatMMDB): src = (char*)getenv("RASMOLMMDBPATH"); break;
599
case(FormatAlchemy): src = (char*)getenv("RASMOLMOLPATH"); break;
600
case(FormatMDL): src = (char*)getenv("RASMOLMDLPATH"); break;
601
case(FormatXYZ): src = (char*)getenv("RASMOLXYZPATH"); break;
602
case(FormatCIF): src = (char*)getenv("RASMOLCIFPATH"); break;
606
src = (char*)getenv("RASMOLPATH");
612
while( *src ) *dst++ = *src++;
615
while( *dst = *tmp++ ) dst++;
616
if( fp = OpenDataFile(buffer,dst) )
617
strcpy(DataFileName,buffer);
621
while( *src && (*src!=':') )
627
{ if( *(dst-1) != DirChar )
629
if (strcmp(datadir,"")) {
631
while( (*dst = *tmp++)) dst++;
632
if( *(dst-1) != DirChar )
636
while( (*dst = *tmp++) ) dst++;
637
if( (fp = OpenDataFile(buffer,dst)) )
638
{ strcpy(DataFileName,buffer);
646
#endif /* APPLEMAC */
650
if( !fp && (format==FormatCEX) )
651
{ if( ProcessFile(format,info,fp) )
658
InvalidateCmndLine();
659
WriteString(MsgStrs[StrErrFile]);
660
WriteString(DataFileName);
661
WriteString(MsgStrs[StrNotFnd]);
673
{ /* Should #include <signal.h> and trap "" SIGPIPE */
674
sprintf(buffer,"trap \"\" 13; uncompress -c '%s' 2> /dev/null\n",
676
} else if( done == 0x8b )
677
{ /* Should #include <signal.h> and trap "" SIGPIPE */
678
sprintf(buffer,"trap \"\" 13; gzip -cdq '%s' 2> /dev/null\n",
680
} else /* bad magic number! */
681
{ InvalidateCmndLine();
682
WriteString(MsgStrs[StrCFmt]);
687
fp = popen(buffer,"r");
689
{ InvalidateCmndLine();
690
WriteString(MsgStrs[StrDcmp]);
693
} else /* Uncompressed! */
699
done = ProcessFile(format,info,fp);
704
{ InvalidateCmndLine();
705
WriteString(MsgStrs[StrDcmp]);
709
#else /* !defined(UNIX) */
715
/* [GSG 11/9/95] Multiple Molecule Support */
716
int FetchFile( int format, int info, char *name )
718
int SaveMolecule = MoleculeIndex;
721
if (NumMolecules >= MAX_MOLECULES) {
724
SwitchMolecule(NumMolecules);
725
result = FetchFileOne( format, info, name );
726
if (result && Database) {
730
SwitchMolecule(SaveMolecule);
735
int FetchStdin( int format )
737
int SaveMolecule = MoleculeIndex;
740
if (NumMolecules >= MAX_MOLECULES) {
743
SwitchMolecule(NumMolecules);
744
result = ProcessFile( format, True, stdin );
745
if (result && Database) {
749
SwitchMolecule(SaveMolecule);
754
static int SetNewMolecule( void )
756
if (NumMolecules >= MAX_MOLECULES) {
759
SwitchMolecule(NumMolecules);
764
int DivertToData( int format, int info )
766
register int ch,len,done;
770
fp = FileStack[FileDepth];
775
while( (ch!='\n') && (ch!='\r') && (ch!=EOF) )
776
{ if( len<MAXBUFFLEN )
788
{ CurLine[len] = '\0';
791
if ( CurToken == QuitTok || CurToken == ExitTok )
792
{ if ( SetNewMolecule()) {
793
done = ProcessFile( format, info, fp );
794
fseek(fp,pos,SEEK_SET);
795
strcpy (Info.filename,"inline");
798
CommandError(MsgStrs[ErrBadLoad]);
802
if ( CurToken == HeaderTok || CurToken == CIFDataTok )
804
Recycle = &CurLine[0];
805
AcceptData[FileDepth] = 'N';
806
if ( SetNewMolecule()) {
807
done = ProcessFile( format, info, fp );
808
fseek(fp,pos,SEEK_SET);
809
strcpy (Info.filename,"inline");
812
CommandError(MsgStrs[ErrBadLoad]);
818
} else CommandError(MsgStrs[StrSLong]);
821
if( SetNewMolecule() )
822
{ fseek(fp,0,SEEK_SET);
823
AcceptData[FileDepth] = 'N';
824
done = ProcessFile( format, info, fp );
825
fseek(fp,pos,SEEK_SET);
828
CommandError(MsgStrs[ErrBadLoad]);
835
void LoadScriptFile( FILE *fp, char *name )
844
len = strlen(name)+1;
845
ptr = (char*)_fmalloc(len);
846
memcpy(ptr,name,len);
847
NameStack[FileDepth] = ptr;
848
FileStack[FileDepth] = fp;
849
LineStack[FileDepth] = 0;
850
AcceptData[FileDepth] = 'Y';
855
while( (ch!='\n') && (ch!='\r') && (ch!=EOF) )
856
{ if( len<(size_t)MAXBUFFLEN )
867
LineStack[FileDepth]++;
868
if( len<(size_t)MAXBUFFLEN )
869
{ CurLine[len] = '\0';
870
stat = ExecuteCommand();
872
{ if( stat == QuitTok )
873
{ while( FileDepth >= 0 )
874
{ fclose(FileStack[FileDepth]);
875
_ffree(NameStack[FileDepth]);
881
} else if( IsPaused )
884
} else CommandError(MsgStrs[StrSLong]);
886
_ffree(NameStack[FileDepth]);
890
{ CommandError( (char*)NULL );
891
WriteString(MsgStrs[StrSFile]);
892
WriteString(name); WriteString("'\n");
897
/*============================*/
898
/* Deferred Command Support */
899
/*============================*/
902
static int Define_Symbol(const char __far * string, const char __far * definition) {
905
Symbol __far * symbol;
906
Symbol __far * prevsymbol;
910
symbol = Defer_Symbols[clead];
913
if (!strcasecmp(string,symbol->string)) {
914
if (symbol->definition_capacity < strlen(definition)+1) {
915
_ffree((void *)symbol->definition);
916
symbol->definition = (const char __far *)_fmalloc(strlen(definition)+1);
917
if (!symbol->definition)return -1;
918
symbol->definition_capacity = symbol->definition_size = strlen(definition)+1;
920
strcpy((char *)(symbol->definition),definition);
925
symbol = symbol->Symbol_Next;
928
symbol = (Symbol __far *)_fmalloc(SymbolPool*sizeof(Symbol));
929
if (!symbol)return -1;
930
for (is = 0; is < SymbolPool-1; is++) {
931
(symbol[is]).Symbol_Next= &(symbol[is+1]);
933
symbol[SymbolPool-1].Symbol_Next = NULL;
934
for (is = 0; is < SymbolPool; is ++) {
935
(symbol[is]).string = NULL;
936
(symbol[is]).definition = NULL;
937
(symbol[is]).definition_size=0;
938
(symbol[is]).definition_capacity=0;
943
FreeSymbol = symbol->Symbol_Next;
944
symbol->string = (const char __far *)_fmalloc(strlen(string)+1);
945
if (!symbol->string) return -1;
946
strcpy((char *)(symbol->string),string);
947
symbol->definition = (const char __far *)_fmalloc(strlen(definition)+1);
948
if (!symbol->definition)
950
_ffree((void *)symbol->string);
953
symbol->definition_capacity = symbol->definition_size = strlen(definition)+1;
954
strcpy((char *)(symbol->definition),definition);
956
prevsymbol->Symbol_Next = symbol;
958
Defer_Symbols[clead] = symbol;
960
symbol->Symbol_Next = NULL;
965
static int Append_Symbol_Definition(const char __far * string, const char __far * definition, int bylines) {
968
Symbol __far * symbol;
969
Symbol __far * prevsymbol;
975
symbol = Defer_Symbols[clead];
978
if (!strcasecmp(string,symbol->string)) {
979
xsize = strlen(symbol->definition)+strlen(definition)+il+1;
980
if (symbol->definition_capacity < xsize) {
981
const char * old_definition;
982
old_definition = symbol->definition;
983
symbol->definition = (const char __far *)_fmalloc(xsize);
984
if (!symbol->definition)return -1;
985
strcpy((char *)symbol->definition,old_definition);
986
symbol->definition_size = strlen(old_definition+1);
987
symbol->definition_capacity = xsize;
988
_ffree((void *)old_definition);
990
if (bylines) strcat((char *)(symbol->definition),"\n");
991
strcat((char *)(symbol->definition),definition);
996
symbol = symbol->Symbol_Next;
999
symbol = (Symbol __far *)_fmalloc(SymbolPool*sizeof(Symbol));
1000
if (!symbol)return -1;
1001
for (is = 0; is < SymbolPool-1; is++) {
1002
(symbol[is]).Symbol_Next= &(symbol[is+1]);
1004
symbol[SymbolPool-1].Symbol_Next = NULL;
1005
for (is = 0; is < SymbolPool; is ++) {
1006
(symbol[is]).string = NULL;
1007
(symbol[is]).definition = NULL;
1008
(symbol[is]).definition_size=0;
1009
(symbol[is]).definition_capacity=0;
1011
FreeSymbol = symbol;
1013
symbol = FreeSymbol;
1014
FreeSymbol = symbol->Symbol_Next;
1015
symbol->string = (const char __far *)_fmalloc(strlen(string)+1);
1016
if (!symbol->string) return -1;
1017
strcpy((char *)(symbol->string),string);
1018
symbol->definition = (const char __far *)_fmalloc(strlen(definition)+1);
1019
if (!symbol->definition)
1021
_ffree((void *)(symbol->string));
1024
symbol->definition_capacity = symbol->definition_size = strlen(definition)+1;
1025
strcpy((char *)(symbol->definition),definition);
1027
prevsymbol->Symbol_Next = symbol;
1029
Defer_Symbols[clead] = symbol;
1031
symbol->Symbol_Next = NULL;
1035
static int Free_Symbol(const char __far * string) {
1038
Symbol __far * symbol;
1039
Symbol __far * prevsymbol;
1043
symbol = Defer_Symbols[clead];
1046
if (!strcasecmp(string,symbol->string)) {
1047
_ffree((void *)(symbol->definition));
1048
_ffree((void *)(symbol->string));
1049
symbol->string = NULL;
1050
symbol->definition = NULL;
1051
symbol->definition_size=0;
1052
symbol->definition_capacity=0;
1054
prevsymbol->Symbol_Next = symbol->Symbol_Next;
1056
Defer_Symbols[clead] = symbol->Symbol_Next;
1058
symbol->Symbol_Next = FreeSymbol;
1059
FreeSymbol = symbol;
1062
prevsymbol = symbol;
1063
symbol = symbol->Symbol_Next;
1068
static int Find_Symbol_Definition(const char __far * string, const char __far * __far * definition) {
1071
Symbol __far * symbol;
1072
Symbol __far * prevsymbol;
1076
symbol = Defer_Symbols[clead];
1079
if (!strcasecmp(string,symbol->string)) {
1080
*definition = symbol->definition;
1083
prevsymbol = symbol;
1084
symbol = symbol->Symbol_Next;
1089
void ExecuteDeferCommand( void ) {
1090
const char * strptr;
1094
if (CurToken == ZapTok) {
1098
if (CurToken == '(') {
1099
if (Append_Symbol_Definition("", TokenStart, True)==-1) {
1100
InvalidateCmndLine();
1101
RasMolFatalExit(MsgStrs[StrMalloc]);
1106
CommandError(MsgStrs[ErrSyntax]);
1109
strptr = TokenIdent;
1112
while( ch && (ch!='#') ){
1120
if (!strncasecmp("zap",TokenPtr,3) && (!(*(TokenPtr+3)) ||isspace(*(TokenPtr+3)))){
1121
Free_Symbol(strptr);
1123
if (Append_Symbol_Definition(strptr, TokenPtr, True)==-1) {
1124
InvalidateCmndLine();
1125
RasMolFatalExit(MsgStrs[StrMalloc]);
1132
void ShowDeferCommand( void ) {
1133
const char * definition;
1136
CommandError(MsgStrs[ErrSyntax]);
1139
if (!Find_Symbol_Definition(TokenIdent,&definition)) {
1140
WriteString((char *)definition);
1143
WriteString(TokenIdent);
1144
WriteString(MsgStrs[StrNotFnd]);
1147
WriteString("\n=================\n");
1151
void ExecuteExecuteCommand( void ) {
1152
const char * definition;
1154
register size_t len;
1156
int save_Interactive;
1157
int save_molecule, save_num_molecules;
1159
double * dialsave_old;
1160
double * dialsave_new;
1166
CommandError(MsgStrs[ErrSyntax]);
1169
if (!Find_Symbol_Definition(TokenIdent,&definition))
1171
save_Interactive = Interactive;
1173
dialsave_old = (double *)_fmalloc(sizeof(double)*11*NumMolecules);
1174
if (!dialsave_old) {
1175
RasMolFatalExit(MsgStrs[StrMalloc]);
1177
save_molecule = MoleculeIndex;
1178
save_num_molecules = NumMolecules;
1180
for (im=0; im<NumMolecules; im++) {
1182
memmove((char *)(dialsave_old+im*11),(char *)DialValue,11*sizeof(double));
1184
SwitchMolecule(save_molecule);
1186
Interactive=False; /* Supress all screen activity while
1187
executing the commands first time around */
1191
while( ch && (ch!='\n') && (ch!='\r') ){
1192
if( len<(size_t)MAXBUFFLEN )
1193
CurLine[len++] = ch;
1197
{ ch = *definition++;
1201
if( len<(size_t)MAXBUFFLEN )
1202
{ CurLine[len] = '\0';
1203
stat = ExecuteCommand();
1205
{ if( stat == QuitTok ) {
1206
Interactive = save_Interactive;
1208
} else /* ExitTok */
1211
} else CommandError(MsgStrs[StrSLong]);
1214
dialsave_new = (double *)_fmalloc(sizeof(double)*11*NumMolecules);
1215
if (!dialsave_new) {
1216
_ffree(dialsave_old);
1217
RasMolFatalExit(MsgStrs[StrMalloc]);
1219
save_molecule = MoleculeIndex;
1221
for (im=0; im<NumMolecules; im++) {
1223
memmove((char *)(dialsave_new+im*11),(char *)DialValue,11*sizeof(double));
1224
if (im<save_num_molecules)
1226
memmove((char *)DialValue,(char *)(dialsave_old+im*11),11*sizeof(double));
1230
SwitchMolecule(save_molecule);
1238
Interactive = save_Interactive;
1240
for (im=0; im<NumMolecules; im++) {
1242
memmove((char *)DialValue,(char *)(dialsave_new+im*11),11*sizeof(double));
1245
SwitchMolecule(save_molecule);
1253
/*===========================*/
1254
/* Movie Support Utilities */
1255
/*===========================*/
1259
void ShowRecordCommand( void ) {
1262
millisec = RecordFrom + 1000.*((double)record_frame[0])/record_fps;
1264
|| RecordTemplate[0] == '\0'
1265
|| (millisec > RecordMaxMS && RecordMaxMS > 1.)
1266
|| (RecordUntil >= RecordFrom
1267
&& millisec > RecordUntil + 1000.*((double)record_frame[0])/record_fps)) {
1268
WriteString("record off\n");
1270
sprintf(param,"record from %g until %g\n",RecordFrom/1000., RecordUntil/1000.);
1272
if (record_fps > 0.) {
1273
sprintf(param,"set record.fps %g\n",record_fps);
1276
if (record_aps > 0.) {
1277
sprintf(param,"set record.aps %g\n",record_aps);
1280
if (record_dwell > 0.) {
1281
sprintf(param,"set record.dwell %g\n",record_dwell);
1284
if (record_on[0]) WriteString("record motion on\n");
1285
else WriteString("record motion off\n");
1286
if (record_on[1]) WriteString("record appearance on\n");
1287
else WriteString("record apperance off\n");
1288
if (RecordMaxMS == 1.) {
1289
sprintf(param,RecordTemplate);
1291
sprintf(param,RecordTemplate,millisec<0?0:millisec);
1293
WriteString("record on ");
1294
switch(RecordOption) {
1298
WriteString("GIF "); break;
1300
WriteString("PPM "); break;
1304
WriteString("PDB "); break;
1306
WriteString("MDL "); break;
1308
WriteString("XYZ "); break;
1310
WriteString("CIF "); break;
1312
WriteString("ALCHEMY "); break;
1314
WriteString("GIF "); break;
1316
WriteString("BMP "); break;
1318
WriteString("PPM "); break;
1320
WriteString("SUN "); break;
1322
WriteString("SUNRLE "); break;
1324
WriteString("PICT "); break;
1326
WriteString("IRIS "); break;
1328
WriteString("EPSF "); break;
1330
WriteString("MONOPS "); break;
1332
WriteString("VECTPS "); break;
1334
WriteString("R3D "); break;
1338
WriteString("SCRIPT "); break;
1340
WriteString("KINEMAGE "); break;
1342
WriteString("MOLSCRIPT "); break;
1344
WriteString("POVRAY "); break;
1346
WriteString("POVRAY3 "); break;
1348
WriteString("PHIPSI "); break;
1350
WriteString("RAMACHAN "); break;
1352
WriteString("RPP "); break;
1354
WriteString("VRML ");
1355
if (RecordSubOption == MirrorTok) WriteString("MIRROR ");
1356
if (RecordSubOption == RotateTok) WriteString("ROTATE ");
1366
void ShowPlayCommand( void ) {
1369
millisec = PlayFrom + 1000.*((double)play_frame[0])/play_fps;
1371
|| PlayTemplate[0] == '\0'
1372
|| (millisec > PlayMaxMS && PlayMaxMS > 1.)
1373
|| (PlayUntil >= PlayFrom
1374
&& millisec > PlayUntil + 1000.*((double)play_frame[0])/play_fps)) {
1375
WriteString("play off\n");
1377
sprintf(param,"play from %g until %g\n",PlayFrom/1000., PlayUntil/1000.);
1379
if (play_fps > 0.) {
1380
sprintf(param,"set play.fps %g\n",record_fps);
1383
if (PlayMaxMS == 1.) {
1384
sprintf(param,PlayTemplate);
1386
sprintf(param,PlayTemplate,millisec<0?0:millisec);
1388
WriteString("play on ");
1389
switch(PlayOption) {
1393
WriteString("GIF "); break;
1395
WriteString("PPM "); break;
1399
WriteString("PDB "); break;
1401
WriteString("MDL "); break;
1403
WriteString("XYZ "); break;
1405
WriteString("CIF "); break;
1407
WriteString("ALCHEMY "); break;
1409
WriteString("GIF "); break;
1411
WriteString("BMP "); break;
1413
WriteString("PPM "); break;
1415
WriteString("SUN "); break;
1417
WriteString("SUNRLE "); break;
1419
WriteString("PICT "); break;
1421
WriteString("IRIS "); break;
1423
WriteString("EPSF "); break;
1425
WriteString("MONOPS "); break;
1427
WriteString("VECTPS "); break;
1429
WriteString("R3D "); break;
1433
WriteString("SCRIPT "); break;
1435
WriteString("KINEMAGE "); break;
1437
WriteString("MOLSCRIPT "); break;
1439
WriteString("POVRAY "); break;
1441
WriteString("POVRAY3 "); break;
1443
WriteString("PHIPSI "); break;
1445
WriteString("RAMACHAN "); break;
1447
WriteString("RPP "); break;
1449
WriteString("VRML ");
1450
if (PlaySubOption == MirrorTok) WriteString("MIRROR ");
1451
if (PlaySubOption == RotateTok) WriteString("ROTATE ");
1461
void WriteMovieFrame( void ) {
1464
millisec = RecordFrom + 1000.*((double)record_frame[0])/record_fps;
1465
if (RecordTemplate[0] == '\0'
1466
|| (millisec > RecordMaxMS && RecordMaxMS > 1.)
1467
|| (RecordUntil >= RecordFrom
1468
&& millisec > RecordUntil)) {
1471
if (RecordMaxMS == 1.) {
1472
sprintf(param,RecordTemplate);
1474
sprintf(param,RecordTemplate,millisec);
1476
if (!IsMoleculeToken(RecordOption)) {
1477
WriteImageFile( param, RecordOption, RecordSubOption );
1478
} else switch(RecordOption) {
1480
case(PDBTok): SavePDBMolecule(param); break;
1481
case(MDLTok): SaveMDLMolecule(param); break;
1482
case(XYZTok): SaveXYZMolecule(param); break;
1483
case(CIFTok): SaveCIFMolecule(param); break;
1484
case(AlchemyTok): SaveAlchemyMolecule(param);
1491
static int PlayMovieFrame( void ) {
1496
millisec = PlayFrom + 1000.*((double)play_frame[0])/play_fps;
1497
if (PlayTemplate[0] == '\0'
1498
|| (millisec > PlayMaxMS && PlayMaxMS > 1.)
1499
|| (PlayUntil >= PlayFrom
1500
&& millisec > PlayUntil)) {
1505
for (play_frame[1] = 0;play_frame[1]<=millisec; play_frame[1]++)
1507
if (RecordMaxMS == 1.) {
1508
sprintf(param,PlayTemplate);
1510
sprintf(param,PlayTemplate,millisec-play_frame[1]);
1512
ProcessFileName(param);
1513
moviefp = fopen(DataFileName,"rb");
1515
if (PlayOption == ScriptTok) {
1516
LoadScriptFile(moviefp,DataFileName);
1520
SwitchMolecule(NumMolecules);
1521
if (!ProcessFile(Tok2Format(PlayOption),False,moviefp)) return -1;
1525
DefaultRepresentation();
1534
static void PlayMovie( void ) {
1535
int interactive_save;
1536
int SaveMolecule = MoleculeIndex;
1538
if ((!IsMoleculeToken(PlayOption) && PlayOption != ScriptTok)
1539
|| NumMolecules >= MAX_MOLECULES ){
1540
CommandError(MsgStrs[ErrBadLoad]);
1543
if (FileDepth == -1) ShowPlayCommand();
1544
interactive_save = Interactive;
1545
if (IsMoleculeToken(PlayOption)) {
1546
SwitchMolecule(NumMolecules);
1548
while (!PlayPause && PlayTemplate[0]) {
1549
Interactive = False;
1550
status = PlayMovieFrame();
1551
Interactive = interactive_save;
1552
ReDrawFlag |= RFRefresh;
1557
if (IsMoleculeToken(PlayOption)) {
1558
SwitchMolecule(SaveMolecule);
1565
/* Convert a Play/Record file name template
1566
The first string of s...s (case insensitive s's or digits) is changed to %.nd where
1567
n is the number of s's. An s in the template can be protected
1568
from this conversion with a backslash. Each % is converted to %%.
1570
*** Warning: if the length of param is K, then the size of the
1571
template must be at least max(1+2*K,3+K)
1573
The result is a conversion string for sprintf */
1575
static int ConvPRTemplate(char * template, const char * param, size_t limit, double *numfiles) {
1586
while ((c=*param++)) {
1587
if (!escape && c=='\\') {
1591
if (escape || (c != 's' && c != 'S' && !(isdigit(c)))){
1593
if ( template-torig >= limit ) return -1;
1594
if (c=='%') *template++ = c;
1595
if ( template-torig >= limit ) return -1;
1604
while ((c=*param++)) {
1605
if (c != 's' && c != 'S' && !(isdigit(c))) break;
1610
if ( template-torig >= limit ) return -1;
1612
if ( template-torig >= limit ) return -1;
1616
*template = (swid%10)+'0';
1619
if ( template+cwid-torig >= limit ) return -1;
1620
for (ii=0; ii<cwid; ii++) {
1621
template[cwid-ii]=template[cwid-ii-1];
1629
if ( template-torig >= limit ) return -1;
1635
while ((c=*param++)) {
1636
if (!escape && c=='\\') {
1642
if ( template-torig >= limit ) return -1;
1643
if (c=='%') *template++ = c;
1644
if ( template-torig >= limit ) return -1;
1652
/*====================================*/
1653
/* Command Line On-Line Help System */
1654
/*====================================*/
1656
static int PrefixString( char __far *str1, char __far *str2 )
1659
if( *str1++ != *str2++ )
1664
static char __far *xfgets( char __far* s, int n, FILE __far *fp )
1668
register char __far *cs;
1671
for (i = 0; i < n-1; i++)
1673
if ((c = fgetc(fp)) == EOF)
1678
if (c == '\r' || c == '\n' || c == '\0') break;
1683
if ( c != '\n' ) ungetc(c,fp);
1692
static HlpEntry __far *EnterHelpInfo( char *text )
1694
register HlpEntry __far * __far *tmp;
1695
register HlpEntry __far *ptr;
1696
register int res,len,i;
1700
ptr = (void __far*)0;
1701
while( *text && (*text!='\n') )
1702
{ while( *text && (*text!='\n') && (*text==' ') )
1706
while( *text && (*text!='\n') && (*text!=' ') )
1709
keyword[len++] = ToUpper(ch);
1715
ptr = (void __far*)0;
1716
} else tmp = &HelpInfo;
1719
{ res = _fstrcmp(keyword,(*tmp)->keyword);
1720
if( res==0 ) /* Exact Match */
1725
tmp = &(*tmp)->next;
1730
{ ptr = (HlpEntry __far*)_fmalloc(HelpPool*sizeof(HlpEntry));
1732
RasMolFatalExit(MsgStrs[StrSMem]);
1733
for( i=1; i<HelpPool; i++ )
1734
{ ptr->next = FreeInfo;
1739
FreeInfo = ptr->next;
1742
ptr->keyword = (char __far*)_fmalloc(len+1);
1743
for( i=0; i<=len; i++ )
1744
ptr->keyword[i] = keyword[i];
1746
ptr->info = (void __far*)0;
1756
void InitHelpFile( void )
1758
register char *src,*dst;
1759
register HlpEntry __far *fix;
1760
register HlpEntry __far *ptr;
1765
HelpFileName = "rasmol.hlp";
1766
fp=fopen(HelpFileName,"rb");
1769
{ src = (char*)getenv("RASMOLPATH");
1771
{ HelpFileName = dst = HelpFileBuf;
1775
if( (dst!=HelpFileBuf) && (*(dst-1)!=DirChar) )
1779
strcpy(dst,"rasmol.hlp");
1780
fp = fopen(HelpFileName,"rb");
1787
HelpFileName = dst = HelpFileBuf;
1791
if( (dst!=HelpFileBuf) && (*(dst-1)!=DirChar) )
1796
while( (*dst++ = *src++) );
1797
fp = fopen(HelpFileName,"rb");
1802
{ InvalidateCmndLine();
1803
WriteString(MsgStrs[StrHFil]);
1804
HelpFileName = NULL;
1809
xfgets(buffer,80,fp);
1811
{ fix = (void __far*)0;
1812
while( *buffer=='?' )
1813
{ ptr = EnterHelpInfo(buffer+1);
1820
if( !xfgets(buffer,80,fp) )
1826
fix->info = (void __far*)0;
1831
while( xfgets(buffer,80,fp) )
1839
static void FindHelpInfo( void )
1841
register HlpEntry __far * __far *tmp;
1842
register HlpEntry __far *ptr;
1843
register int res,len;
1850
while( *TokenPtr && (*TokenPtr==' ') )
1857
while( *TokenPtr && (*TokenPtr!=' ') )
1860
keyword[len++] = ToUpper(ch);
1866
ptr = (void __far*)0;
1867
} else tmp = &HelpInfo;
1870
{ res = _fstrcmp(keyword,(*tmp)->keyword);
1872
{ if( PrefixString(keyword,(*tmp)->keyword) )
1875
PrefixString(keyword,ptr->next->keyword) )
1876
{ InvalidateCmndLine();
1877
WriteString(MsgStrs[StrHTop]);
1885
tmp = &(*tmp)->next;
1888
while( *TokenPtr && (*TokenPtr==' ') )
1890
} while( *TokenPtr && ptr );
1892
if( !ptr || !ptr->fpos )
1893
{ InvalidateCmndLine();
1894
WriteString(MsgStrs[StrHNone]);
1896
} else pos=ptr->fpos;
1900
if( !(fp=fopen(HelpFileName,"rb")) )
1901
RasMolFatalExit(MsgStrs[StrHROpn]);
1903
InvalidateCmndLine();
1905
fseek(fp,pos,SEEK_SET);
1906
while( xfgets(buffer,80,fp) )
1908
{ WriteString(buffer);
1915
/*=================================*/
1916
/* Command Line Lexical Analysis */
1917
/*=================================*/
1919
static int FetchToken( void )
1925
while( ch && (ch!='#') )
1931
TokenStart = TokenPtr-1;
1934
*TokenIdent = ToUpper(ch);
1935
while( IsIdentChar(*TokenPtr) && (TokenLength<32) )
1937
TokenIdent[TokenLength++] = ToUpper(ch);
1939
if( TokenLength==32 )
1940
{ CommandError(MsgStrs[StrILong]);
1942
} else TokenIdent[TokenLength] = '\0';
1943
return( CurToken = LookUpKeyword(TokenIdent) );
1945
} else if( isdigit(ch) )
1946
{ TokenValue = ch-'0';
1947
while( isdigit(*TokenPtr) )
1948
TokenValue = 10*TokenValue + (*TokenPtr++)-'0';
1949
return( CurToken = NumberTok );
1951
} else if( (ch=='\'') || (ch=='\"') || (ch=='`') )
1953
while( *TokenPtr && (TokenLength<128) && (*TokenPtr!=ch) )
1954
TokenIdent[TokenLength++] = *TokenPtr++;
1956
if( ch != *TokenPtr )
1958
{ CommandError(MsgStrs[StrCTerm]);
1959
} else CommandError(MsgStrs[StrCLong]);
1963
TokenIdent[TokenLength]='\0';
1964
return( CurToken = StringTok );
1965
} else if( ispunct(ch) )
1966
return( CurToken = ch );
1975
static int NextIf( int tok, int err )
1977
if( FetchToken() != tok )
1978
{ CommandError(MsgStrs[err]);
1980
} else return False;
1984
static void FetchFloat( Long value, int scale )
1989
if( !value && !isdigit(*TokenPtr) )
1990
{ CommandError(MsgStrs[StrFNum]);
1997
while( isdigit(*TokenPtr) )
1998
{ if( count < scale )
1999
{ mant = 10*mant + (*TokenPtr-'0');
2005
mant = (scale*mant)/count;
2006
TokenValue = value*scale + mant;
2009
static void FetchBracketedTriple(Long Triple[3]) {
2011
for (index = 0; index < 3; index++) {
2014
if (CurToken == '-') {
2020
if (CurToken == NumberTok) {
2021
if (*TokenPtr=='.') {
2023
FetchFloat(TokenValue,250);
2025
} else if( CurToken=='.' ) {
2027
} else CommandError(MsgStrs[ErrNotNum]);
2028
Triple[index] = neg?(-TokenValue):TokenValue;
2030
if( !(CurToken == ',' && index < 2) &&
2031
!(CurToken == ']' && index == 2 )) {
2032
CommandError(MsgStrs[ErrSyntax]);
2040
static int ParseColour( void )
2042
register RGBStruct *rgb;
2044
if( IsColourToken(CurToken) )
2045
{ rgb = ColourTable + Token2Colour(CurToken);
2051
} else if( CurToken == '[' )
2052
{ RVal = GVal = BVal = 0;
2054
if( NextIf(NumberTok,ErrNotNum) )
2056
} else if( TokenValue>255 )
2057
{ CommandError(MsgStrs[ErrBigNum]);
2059
} else RVal = (int)TokenValue;
2061
if( NextIf(',',ErrNotSep) )
2064
if( NextIf(NumberTok,ErrNotNum) )
2066
} else if( TokenValue>255 )
2067
{ CommandError(MsgStrs[ErrBigNum]);
2069
} else GVal = (int)TokenValue;
2071
if( NextIf(',',ErrNotSep) )
2074
if( NextIf(NumberTok,ErrNotNum) )
2076
} else if( TokenValue>255 )
2077
{ CommandError(MsgStrs[ErrBigNum]);
2079
} else BVal = (int)TokenValue;
2081
return !NextIf(']',ErrNotBrac);
2083
} else if( !CurToken && (*TokenPtr=='#') )
2088
} else if( CurToken == IdentTok )
2090
return LookUpColour(TokenIdent,&RVal,&GVal,&BVal);
2096
static Expr *ParseRange( int neg )
2098
register Expr *tmp1,*tmp2;
2101
tmp1 = AllocateNode();
2102
tmp1->type = OpLftProp|OpRgtVal;
2103
tmp1->rgt.val = neg? -(int)TokenValue : (int)TokenValue;
2104
tmp1->lft.val = PropResId;
2106
if( *TokenPtr == '-' )
2108
neg = (*TokenPtr=='-');
2109
if( neg ) TokenPtr++;
2112
if( CurToken != NumberTok )
2113
{ CommandError(MsgStrs[ErrNotNum]);
2114
DeAllocateExpr( tmp1 );
2115
return( (Expr*)NULL );
2118
tmp1->type |= OpMoreEq;
2119
tmp2 = AllocateNode();
2120
tmp2->rgt.ptr = tmp1;
2123
tmp1 = AllocateNode();
2124
tmp1->type = OpLftProp|OpRgtVal|OpLessEq;
2125
tmp1->rgt.val = neg? -(int)TokenValue : (int)TokenValue;
2126
tmp1->lft.val = PropResId;
2127
tmp2->lft.ptr = tmp1;
2129
} else tmp1->type |= OpEqual;
2131
if( *TokenPtr == ':' )
2139
tmp2 = AllocateNode();
2141
tmp2->rgt.ptr = tmp1;
2143
tmp1 = AllocateNode();
2144
tmp1->type = OpEqual | OpLftProp | OpRgtVal;
2145
tmp1->lft.val = PropChain;
2148
tmp2->lft.ptr = tmp1;
2150
} else if( (ch=='?') || (ch=='%') || (ch=='*') )
2158
static Expr *ParseExpression( int level )
2160
register Expr *tmp1,*tmp2;
2161
register int done, pred = 0;
2165
{ case(0): /* Disjunctions */
2166
tmp1 = ParseExpression(1);
2167
while( (CurToken==OrTok) || (CurToken=='|') ||
2169
{ if( CurToken=='|' )
2170
{ if( FetchToken()=='|' )
2172
} else FetchToken();
2174
tmp2 = AllocateNode();
2176
tmp2->lft.ptr = tmp1;
2177
tmp2->rgt.ptr = NULL;
2178
if( !(tmp1=ParseExpression(1)) )
2179
{ DeAllocateExpr(tmp2);
2182
tmp2->rgt.ptr = tmp1;
2187
case(1): /* Conjunctions */
2188
tmp1 = ParseExpression(2);
2189
while( (CurToken==AndTok) || (CurToken==YTok) || (CurToken=='&') )
2190
{ if( CurToken=='&' )
2191
{ if( FetchToken()=='&' )
2193
} else FetchToken();
2195
tmp2 = AllocateNode();
2197
tmp2->lft.ptr = tmp1;
2198
tmp2->rgt.ptr = NULL;
2199
if( !(tmp1=ParseExpression(2)) )
2200
{ DeAllocateExpr(tmp2);
2203
tmp2->rgt.ptr = tmp1;
2208
case(2): /* Primitives */
2209
if( IsPredTok(CurToken) || (CurToken==BackboneTok) )
2210
{ switch( CurToken )
2211
{ case(HelixTok): if( Info.helixcount < 0 )
2212
DetermineStructure(False);
2215
case(SheetTok): if( Info.laddercount < 0 )
2216
DetermineStructure(False);
2219
case(TurnTok): if( Info.turncount < 0 )
2220
DetermineStructure(False);
2223
case(CystineTok): if( Info.ssbondcount < 0 )
2224
FindDisulphideBridges();
2227
case(CisBondedTok):if( Info.cisbondcount<0 )
2231
case(BackboneTok): pred = PredMainChain; break;
2232
case(SelectedTok): pred = PropSelect; break;
2233
default: pred = PredAbsChr(PredTokOrd(CurToken));
2236
tmp1 = AllocateNode();
2237
tmp1->type = OpConst|OpLftProp|OpRgtVal;
2238
tmp1->lft.val = pred;
2242
} else if( IsPropTok(CurToken) )
2243
{ tmp1 = AllocateNode();
2244
tmp1->type = OpLftProp|OpRgtVal;
2246
{ case(TemperatureTok): pred = PropTemp; break;
2247
case(RadiusTok): pred = PropRad; break;
2248
case(AtomNoTok): pred = PropIdent; break;
2249
case(ElemNoTok): pred = PropElemNo; break;
2250
case(ResNoTok): pred = PropResId; break;
2251
case(ModelTok): pred = PropModel; break;
2252
case(AltlTok): pred = PropAltl; break;
2254
tmp1->lft.val = pred;
2258
{ tmp1->type |= OpEqual;
2259
if( FetchToken()=='=' )
2261
} else if( CurToken=='<' )
2264
{ tmp1->type |= OpNotEq;
2266
} else if( CurToken=='=' )
2267
{ tmp1->type |= OpLessEq;
2269
} else tmp1->type |= OpLess;
2270
} else if( CurToken=='>' )
2271
{ if( FetchToken()=='=' )
2272
{ tmp1->type |= OpMoreEq;
2274
} else tmp1->type |= OpMore;
2275
} else if( (CurToken=='!') || (CurToken=='/') )
2276
{ if( NextIf('=',ErrBadExpr) )
2277
{ DeAllocateExpr( tmp1 );
2278
return( (Expr*)NULL );
2279
} else tmp1->type |= OpNotEq;
2282
{ CommandError(MsgStrs[ErrBadExpr]);
2283
DeAllocateExpr( tmp1 );
2284
return( (Expr*)NULL );
2288
if( CurToken == '-' )
2293
if( CurToken!=NumberTok )
2294
{ CommandError(MsgStrs[ErrNotNum]);
2295
DeAllocateExpr( tmp1 );
2296
return( (Expr*)NULL );
2300
{ tmp1->rgt.val = -(int)TokenValue;
2301
} else tmp1->rgt.val = (int)TokenValue;
2305
} else switch( CurToken )
2306
{ case('('): FetchToken();
2307
if( !(tmp1=ParseExpression(0)) )
2308
return( (Expr*)NULL );
2311
{ CommandError(MsgStrs[ErrParen]);
2312
DeAllocateExpr( tmp1 );
2313
return( (Expr*)NULL );
2318
case('!'): case('~'):
2319
case(NotTok): FetchToken();
2320
if( !(tmp1=ParseExpression(2)) )
2321
return( (Expr*)NULL );
2323
tmp2 = AllocateNode();
2324
tmp2->type = OpNot | OpRgtVal;
2325
tmp2->lft.ptr = tmp1;
2328
case('-'): if( NextIf(NumberTok,ErrNotNum) )
2329
return( (Expr*)NULL );
2330
return( ParseRange(True) );
2333
return( ParseRange(False) );
2336
if( NextIf('(',ErrFunc) )
2337
return( (Expr*)NULL );
2340
if( CurToken==NumberTok )
2341
{ if( *TokenPtr=='.' )
2343
FetchFloat(TokenValue,250);
2345
} else if( CurToken!='.' )
2346
{ CommandError(MsgStrs[ErrNotNum]);
2347
return( (Expr*)NULL );
2348
} else FetchFloat(0,250);
2350
if( TokenValue>10000 )
2351
{ CommandError(MsgStrs[ErrBigNum]);
2352
return( (Expr*)NULL );
2353
} else pred = (int)TokenValue;
2354
if( NextIf(',',ErrNotSep) )
2355
return( (Expr*)NULL );
2358
if( !(tmp1=ParseExpression(0)) )
2359
return( (Expr*)NULL );
2362
{ CommandError(MsgStrs[ErrParen]);
2363
DeAllocateExpr( tmp1 );
2364
return( (Expr*)NULL );
2371
tmp2 = AllocateNode();
2372
tmp2->type = OpWithin;
2373
tmp2->lft.limit = (Long)pred*pred;
2374
tmp2->rgt.set = BuildAtomSet(tmp1);
2375
DeAllocateExpr(tmp1);
2378
default: if( CurToken==IdentTok )
2379
{ tmp1 = LookUpSetExpr(TokenIdent);
2381
tmp1 = LookUpElement(TokenIdent);
2389
TokenPtr = TokenStart;
2390
done = ParsePrimitiveExpr(&TokenPtr);
2394
{ CommandError(MsgStrs[ErrBadExpr]);
2395
DeAllocateExpr( QueryExpr );
2396
return( (Expr*)NULL );
2397
} else return( QueryExpr );
2405
/*======================================*/
2406
/* RasMol Command Parsing & Execution */
2407
/* Commands listed alphabetically */
2408
/*======================================*/
2410
static void ExecuteAxesCommand( void )
2413
if( !CurToken || (CurToken==FalseTok) )
2414
{ ReDrawFlag |= RFRefresh;
2416
} else if( CurToken == TrueTok )
2417
{ ReDrawFlag |= RFRefresh;
2419
} else CommandError(MsgStrs[ErrBadOpt]);
2423
static void ExecuteBoundBoxCommand( void )
2426
if( !CurToken || (CurToken==FalseTok) )
2427
{ ReDrawFlag |= RFRefresh;
2428
DrawBoundBox = False;
2429
} else if( CurToken == TrueTok )
2430
{ ReDrawFlag |= RFRefresh;
2431
DrawBoundBox = True;
2432
} else CommandError(MsgStrs[ErrBadOpt]);
2436
static void ExecuteCentreCommand( void )
2438
register Real x, y, z;
2439
register Long count;
2442
xlatecen = XlateCen;
2445
if( !CurToken || (CurToken==AllTok) )
2446
{ CentreTransform(0,0,0,xlatecen);
2450
if( (CurToken==CentreTok) || (CurToken==TranslateTok) ) {
2451
xlatecen = XlateCen = (CurToken==TranslateTok)?True:False;
2453
if ( !CurToken ) return;
2454
if ( CurToken==AllTok ) {
2455
CentreTransform(0,0,0,xlatecen);
2461
/* Check for Centre [CenX, CenY, CenZ] syntax */
2463
if ( CurToken == '[' )
2467
/* int icen, negcen;
2469
for (icen = 0; icen < 3; icen++)
2472
if( CurToken == '-' )
2475
} else negcen = False;
2476
if( CurToken == NumberTok )
2478
{ CenV[icen] = -TokenValue;
2479
} else CenV[icen] = TokenValue;
2482
if( !(CurToken == ',' && icen < 2) &&
2483
!(CurToken == ']' && icen == 2 ))
2484
{ CommandError(MsgStrs[ErrSyntax]);
2490
FetchBracketedTriple(CenV);
2497
if ( (CurToken==CentreTok) || (CurToken==TranslateTok) ) {
2498
xlatecen = (CurToken==TranslateTok)?True:False;
2500
CommandError(MsgStrs[ErrSyntax]);
2504
CentreTransform(CenV[0],CenV[1],-CenV[2],xlatecen);
2508
QueryExpr = ParseExpression(0);
2509
if( !QueryExpr ) return;
2512
{ CommandError(MsgStrs[ErrSyntax]);
2513
DeAllocateExpr(QueryExpr);
2517
/* CentreZoneExpr(QueryExpr); */
2518
if( !Database ) return;
2522
for( QChain=Database->clist; QChain; QChain=QChain->cnext )
2523
for( QGroup=QChain->glist; QGroup; QGroup=QGroup->gnext )
2524
for( QAtom=QGroup->alist; QAtom; QAtom=QAtom->anext )
2525
if( EvaluateExpr(QueryExpr) )
2526
{ x += (Real)(QAtom->xorg+QAtom->fxorg);
2527
y += (Real)(QAtom->yorg+QAtom->fyorg);
2528
z += (Real)(QAtom->zorg+QAtom->fzorg);
2535
if ( (CurToken==CentreTok) || (CurToken==TranslateTok) ) {
2536
xlatecen = (CurToken==TranslateTok)?True:False;
2538
CommandError(MsgStrs[ErrSyntax]);
2542
CentreTransform((Long)(x/count),(Long)(y/count),(Long)(z/count),xlatecen);
2544
{ InvalidateCmndLine();
2545
WriteString(MsgStrs[StrCent]);
2547
DeAllocateExpr(QueryExpr);
2551
static void ExecuteClipboardCommand( void )
2553
if( !ClipboardImage() )
2554
{ InvalidateCmndLine();
2555
WriteString(MsgStrs[StrCClip]);
2560
static void ExecuteLoadCommand( void )
2562
register int format;
2565
int checkfile = False;
2569
if( !*TokenPtr || *TokenPtr==' ' )
2570
{ if( IsMoleculeToken(CurToken) )
2571
{ format = Tok2Format(CurToken);
2573
} else if( CurToken == DotsTok )
2574
{ format = FormatDots;
2576
} else if (CurToken == MapTok)
2577
{ format = FormatMap;
2579
CommandError(MsgStrs[ErrBadMolDB]);
2587
{ CommandError(MsgStrs[ErrFilNam]);
2592
if( (CurToken!=StringTok) && (CurToken!=IdentTok) )
2593
{ CommandError(MsgStrs[ErrFilNam]);
2598
info = (FileDepth == -1);
2599
if( IsMoleculeFormat(format) )
2600
{ if( NumMolecules >= MAX_MOLECULES )
2601
{ CommandError(MsgStrs[ErrBadLoad]);
2605
if( CurToken==InLineTok )
2606
{ if( (FileDepth!=-1) && LineStack[FileDepth] )
2607
{ DivertToData( format, info );
2608
} else CommandError(MsgStrs[ErrOutScrpt]);
2609
} else if( CurToken==StringTok )
2610
{ checkfile = FetchFile(format,info,TokenIdent);
2611
} else checkfile = FetchFile(format,info,TokenStart);
2613
/* don't color the molecule unless it's actually loaded! */
2614
if (checkfile == True)
2615
DefaultRepresentation();
2616
} else /* format == FormatDots || format == FormatMap */
2618
{ CommandError(MsgStrs[ErrBadMolDB]);
2622
if( CurToken==StringTok )
2623
{ ProcessFileName(TokenIdent);
2624
} else ProcessFileName(TokenStart);
2626
if( !(fp=fopen(DataFileName,"rb")) )
2627
{ CommandError( (char*)NULL );
2628
WriteString(MsgStrs[StrDFile]);
2629
WriteString(DataFileName);
2630
WriteString("'!\n");
2632
} else if (format == FormatDots) {
2633
LoadDotsFile(fp,info);
2637
else { /* format == FormatMap */
2638
if(LoadCCP4MapFile(fp,info, -1)) {
2639
if( !(fp=fopen(DataFileName,"rb")) ) {
2640
CommandError( (char*)NULL );
2641
WriteString(MsgStrs[StrDFile]);
2642
WriteString(DataFileName);
2643
WriteString("'!\n");
2645
} else if (LoadCBFMapFile(fp,info,-1)) {
2646
CommandError( (char*)NULL );
2647
WriteString(MsgStrs[StrErrFile]);
2648
WriteString(DataFileName);
2649
WriteString("'!\n");
2653
ReDrawFlag |= RFInitial|RFColour;
2661
static void ExecutePauseCommand( void )
2663
if( FileDepth == -1 )
2664
{ CommandError(MsgStrs[ErrOutScrpt]);
2668
/* Ignore Pause Commands via IPC! */
2669
if( LineStack[FileDepth] )
2670
{ CommandActive = True;
2674
/* Disable Drag & Drop! */
2675
DragAcceptFiles(CanvWin,FALSE);
2679
ReDrawFlag |= RFRefresh;
2683
static void ExecutePickingCommand( void )
2685
switch( FetchToken() )
2686
{ case(TrueTok): case(0):
2687
case(IdentifyTok): SetPickMode(PickIdent); break;
2689
case(NoneTok): SetPickMode(PickNone); break;
2690
case(LabelTok): SetPickMode(PickLabel); break;
2691
case(DistanceTok): SetPickMode(PickDist); break;
2692
case(AngleTok): SetPickMode(PickAngle); break;
2693
case(TorsionTok): SetPickMode(PickTorsn); break;
2694
case(MonitorTok): SetPickMode(PickMonit); break;
2695
case(CentreTok): SetPickMode(PickCentr); break;
2696
case(OriginTok): SetPickMode(PickOrign); break;
2697
case(CoordTok): SetPickMode(PickCoord); break;
2698
case(AtomTok): SetPickMode(PickAtom); break;
2699
case(GroupTok): SetPickMode(PickGroup); break;
2700
case(ChainTok): SetPickMode(PickChain); break;
2701
case(BondTok): SetPickMode(PickBond); break;
2702
default: CommandError(MsgStrs[ErrBadOpt]);
2707
static void ExecutePrintCommand( void )
2710
{ InvalidateCmndLine();
2711
WriteString(MsgStrs[StrNPrint]);
2716
static void ExecuteTitleCommand( void )
2720
{ char VersionStr[50];
2722
sprintf (VersionStr,"RasMol Version %s", VERSION);
2723
SetCanvasTitle(VersionStr);
2724
} else if( CurToken == StringTok )
2725
{ SetCanvasTitle(TokenIdent);
2726
} else SetCanvasTitle(TokenStart);
2731
static void ExecuteUnitCellCommand( void )
2734
if( !CurToken || (CurToken==FalseTok) )
2735
{ ReDrawFlag |= RFRefresh;
2736
DrawUnitCell = False;
2737
} else if( CurToken == TrueTok )
2738
{ ReDrawFlag |= RFRefresh;
2739
DrawUnitCell = True;
2740
} else CommandError(MsgStrs[ErrBadOpt]);
2745
/*=======================================*/
2746
/* Generic Command Parsing & Execution */
2747
/*=======================================*/
2749
static void ExecuteSetCommand( void )
2751
register int option;
2754
switch( FetchToken() )
2759
if( CurToken==RejectTok )
2760
{ option = SlabReject;
2761
} else if( CurToken==HalfTok )
2762
{ option = SlabHalf;
2763
} else if( CurToken==HollowTok )
2764
{ option = SlabHollow;
2765
} else if( CurToken==SolidTok )
2766
{ option = SlabClose;
2767
} else if( CurToken==SectionTok )
2768
option = SlabSection;
2771
{ if( UseSlabPlane && (SlabMode!=option) )
2772
ReDrawFlag |= RFRefresh;
2774
} else CommandError(MsgStrs[ErrBadOpt]);
2779
if( CurToken==TrueTok )
2782
VoxelsClean = False;
2783
UseSlabPlane = False;
2784
UseDepthPlane = False;
2785
ReDrawFlag |= RFRefresh;
2787
} else if( CurToken==FalseTok )
2788
{ ReDrawFlag |= RFRefresh;
2790
} else CommandError(MsgStrs[ErrBadOpt]);
2795
if( CurToken==TrueTok )
2796
{ FakeSpecular = True;
2797
ReDrawFlag |= RFColour;
2798
} else if( CurToken==FalseTok )
2799
{ FakeSpecular = False;
2800
ReDrawFlag |= RFColour;
2801
} else CommandError(MsgStrs[ErrBadOpt]);
2808
ReDrawFlag |= RFColour;
2809
} else if( CurToken==NumberTok )
2810
{ if( TokenValue<=100 )
2811
{ ReDrawFlag |= RFColour;
2812
SpecPower = (int)TokenValue;
2814
CommandError(MsgStrs[ErrBigNum]);
2815
} else CommandError(MsgStrs[ErrNotNum]);
2819
case(ShadePowerTok):
2823
ReDrawFlag |= RFColour;
2824
} else if( CurToken==NumberTok )
2825
{ if( TokenValue<=100 )
2826
{ ReDrawFlag |= RFColour;
2827
ShadePower = (int)((TokenValue-50)*0.4);
2829
CommandError(MsgStrs[ErrBigNum]);
2830
} else CommandError(MsgStrs[ErrNotNum]);
2836
{ ReDrawFlag |= RFColour;
2837
Ambient = DefaultAmbient;
2838
} else if( CurToken==NumberTok )
2839
{ if( TokenValue<=100 )
2840
{ Ambient = TokenValue/100.0;
2841
ReDrawFlag |= RFColour;
2843
CommandError(MsgStrs[ErrBigNum]);
2844
} else CommandError(MsgStrs[ErrNotNum]);
2849
if( CurToken==TrueTok )
2850
{ HetaGroups = True;
2851
} else if( CurToken==FalseTok )
2852
{ HetaGroups = False;
2853
} else CommandError(MsgStrs[ErrBadOpt]);
2858
if( CurToken==TrueTok )
2860
} else if( CurToken==FalseTok )
2861
{ Hydrogens = False;
2862
} else CommandError(MsgStrs[ErrBadOpt]);
2866
case(BackgroundTok):
2868
if( CurToken == TransparentTok )
2869
{ UseTransparent = True;
2870
} else if( CurToken == NormalTok )
2871
{ UseTransparent = False;
2872
} else if( ParseColour() )
2873
{ ReDrawFlag |= RFColour;
2877
DefaultBackground = False; /* [GSG 11/29/95] */
2881
} else if( CurToken )
2882
{ CommandError(MsgStrs[ErrColour]);
2883
} else CommandError(MsgStrs[ErrNoCol]);
2888
if( !CurToken || (CurToken==AndTok) )
2890
} else if( CurToken==OrTok )
2892
} else if( CurToken==AllTok )
2893
{ MarkAtoms = AllAtomFlag;
2894
} else if( CurToken==NoneTok)
2896
} else if( CurToken==NotTok )
2898
if( !CurToken || (CurToken==BondedTok) )
2899
{ MarkAtoms = NonBondFlag;
2900
} else CommandError(MsgStrs[ErrBadOpt]);
2901
} else CommandError(MsgStrs[ErrBadOpt]);
2906
if( (CurToken==BackboneTok) || (CurToken==MainChainTok) )
2907
{ ReDrawFlag |= RFRefresh;
2909
} else if( !CurToken || (CurToken==SidechainTok) )
2910
{ ReDrawFlag |= RFRefresh;
2912
} else if( CurToken == ChainTok )
2914
if( !CurToken || (CurToken==TrueTok) )
2915
{ if( !HBondChainsFlag && (Info.hbondcount>=0) )
2916
{ ReDrawFlag |= RFRefresh;
2917
HBondChainsFlag = True;
2918
CalcHydrogenBonds();
2920
} else if( CurToken == FalseTok )
2921
{ if( HBondChainsFlag && (Info.hbondcount>=0) )
2922
{ ReDrawFlag |= RFRefresh;
2923
HBondChainsFlag = False;
2924
CalcHydrogenBonds();
2926
} else CommandError(MsgStrs[ErrBadOpt]);
2927
} else CommandError(MsgStrs[ErrBadOpt]);
2932
if( (CurToken==BackboneTok) || (CurToken==MainChainTok) )
2933
{ ReDrawFlag |= RFRefresh;
2935
} else if( !CurToken || (CurToken==SidechainTok) )
2936
{ ReDrawFlag |= RFRefresh;
2938
} else CommandError(MsgStrs[ErrBadOpt]);
2943
if( CurToken==TrueTok )
2944
{ UseHourGlass = True;
2945
} else if( CurToken==FalseTok )
2946
{ UseHourGlass = False;
2947
} else CommandError(MsgStrs[ErrBadOpt]);
2953
{ ReDrawFlag |= RFRefresh;
2955
} else if( CurToken==NumberTok )
2956
{ if( (TokenValue>0) && (TokenValue<=5) )
2957
{ SplineCount = (int)TokenValue;
2958
ReDrawFlag |= RFRefresh;
2959
} else if( TokenValue==9 )
2960
{ ReDrawFlag |= RFRefresh;
2962
} else CommandError(MsgStrs[ErrBadOpt]);
2963
} else CommandError(MsgStrs[ErrNotNum]);
2968
if( !CurToken || (CurToken==RasMolTok) || (CurToken==NewTok) || (CurToken==OldTok) )
2969
{ if( Interactive ) {
2970
if (CurToken == RasMolTok) {
2972
if (!CurToken || CurToken==NewTok) {
2973
SetMouseMode( MMRasMol );
2974
} else if (CurToken==OldTok) {
2975
SetMouseMode( MMRasOld );
2976
} else CommandError(MsgStrs[ErrBadOpt]);
2979
if (CurToken == NewTok) {
2981
if (!CurToken || CurToken==RasMolTok) {
2982
SetMouseMode( MMRasMol );
2983
} else CommandError(MsgStrs[ErrBadOpt]);
2986
if (CurToken == OldTok) {
2988
if (!CurToken || CurToken==RasMolTok) {
2989
SetMouseMode( MMRasOld );
2990
} else CommandError(MsgStrs[ErrBadOpt]);
2993
SetMouseMode( MMRasMol );
2995
} else if( CurToken==InsightTok )
2997
SetMouseMode( MMInsight );
2998
} else if( CurToken==QuantaTok )
3000
SetMouseMode( MMQuanta );
3001
} else if( CurToken==SybylTok )
3003
SetMouseMode( MMSybyl );
3004
} else CommandError(MsgStrs[ErrBadOpt]);
3009
/* Affect StereoMode Parameters?? */
3010
if( !CurToken || (CurToken==NormalTok) )
3011
{ ReDrawFlag |= RFRefresh | RFColour;
3013
} else if( CurToken==SelectedTok )
3014
{ ReDrawFlag |= RFRefresh | RFColour;
3016
} else CommandError(MsgStrs[ErrBadOpt]);
3021
if( !CurToken || (CurToken==FalseTok) )
3022
{ UseOutLine = False;
3023
} else if( CurToken == TrueTok )
3024
{ UseOutLine = True;
3025
} else CommandError(MsgStrs[ErrBadOpt]);
3030
if( !CurToken || (CurToken==FalseTok) )
3031
{ UseOutLine = False;
3032
} else if( CurToken == TrueTok )
3033
{ UseOutLine = True;
3034
} else CommandError(MsgStrs[ErrBadOpt]);
3039
if( !CurToken || (CurToken==FalseTok) )
3040
{ KinemageFlag = False;
3041
} else if( CurToken == TrueTok )
3042
{ KinemageFlag = True;
3043
} else CommandError(MsgStrs[ErrBadOpt]);
3048
if( !CurToken || (CurToken==TrueTok) )
3049
{ EnableMenus(True);
3050
} else if( CurToken == FalseTok )
3051
{ EnableMenus(False);
3052
} else CommandError(MsgStrs[ErrBadOpt]);
3058
{ ProbeRadius = SolventDots? 300 : 0;
3059
} else if( CurToken==NumberTok )
3060
{ if( *TokenPtr=='.' )
3062
FetchFloat(TokenValue,250);
3065
if( TokenValue>1500 )
3066
{ CommandError(MsgStrs[ErrBigNum]);
3067
} else ProbeRadius = (int)TokenValue;
3068
} else if( CurToken=='.' )
3069
{ FetchFloat(0,250);
3070
if( TokenValue>1500 )
3071
{ CommandError(MsgStrs[ErrBigNum]);
3072
} else ProbeRadius = (int)TokenValue;
3074
} else CommandError(MsgStrs[ErrNotNum]);
3075
iProbeRad = (int)(Scale*(Real)ProbeRadius);
3076
ReDrawFlag |= RFRefresh;
3081
if( !CurToken || (CurToken==FalseTok) )
3082
{ SolventDots = False;
3084
} else if( CurToken == TrueTok )
3085
{ SolventDots = True;
3087
} else CommandError(MsgStrs[ErrBadOpt]);
3088
iProbeRad = (int)(Scale*(Real)ProbeRadius);
3089
ReDrawFlag |= RFRefresh;
3094
if( CurToken==NumberTok )
3095
{ if( TokenValue<=48 )
3098
fsize = (int)TokenValue;
3100
if ( !CurToken || CurToken==FSTok )
3101
{ SetFontSize(fsize);
3102
} else if ( CurToken ==PSTok )
3103
{ SetFontSize(-fsize);
3104
} else CommandError(MsgStrs[ErrBadOpt]);
3105
} else CommandError(MsgStrs[ErrBigNum]);
3106
} else if( !CurToken )
3108
} else if (CurToken == FSTok)
3109
{ SetFontSize(abs(FontSize));
3110
} else if (CurToken == PSTok)
3111
{ SetFontSize(-abs(FontSize));
3112
} else CommandError(MsgStrs[ErrBadOpt]);
3115
case(FontStrokeTok):
3117
if( CurToken==NumberTok )
3118
{ if( TokenValue<=8 )
3119
{ if( LabelList || (MonitList && DrawMonitDistance) )
3120
ReDrawFlag |= RFRefresh;
3121
SetFontStroke((int)TokenValue);
3122
} else CommandError(MsgStrs[ErrBigNum]);
3123
} else if( !CurToken )
3125
ReDrawFlag |= RFRefresh;
3127
} else CommandError(MsgStrs[ErrBadOpt]);
3132
if( !CurToken || (CurToken==FalseTok) )
3133
{ AllowWrite = False;
3134
} else if( CurToken == TrueTok )
3135
{ if( (FileDepth!=-1) && LineStack[FileDepth] )
3136
{ CommandError(MsgStrs[ErrInScrpt]);
3137
} else AllowWrite = True;
3138
} else CommandError(MsgStrs[ErrBadOpt]);
3145
StereoAngle = -StereoAngle;
3146
if (StereoAngle < 0.0 ) {
3147
SetStereoMode(True);
3149
SetStereoMode(False);
3151
} else SetStereoMode(True);
3152
} else if( CurToken==TrueTok )
3153
{ SetStereoMode(True);
3154
} else if( CurToken==FalseTok )
3155
{ SetStereoMode(False);
3156
} else if( CurToken == '-' )
3157
{ if( !NextIf(NumberTok,ErrNotNum) )
3158
{ StereoAngle = -TokenValue;
3159
SetStereoMode(True);
3161
} else if( CurToken == '+' )
3162
{ if( !NextIf(NumberTok,ErrNotNum) )
3163
{ StereoAngle = TokenValue;
3164
SetStereoMode(True);
3166
} else if( CurToken==NumberTok )
3167
{ StereoAngle = TokenValue;
3168
SetStereoMode(True);
3170
CommandError(MsgStrs[ErrSyntax]);
3173
if (StereoAngle > 60.) {
3175
CommandError(MsgStrs[ErrBigNum]);
3178
if (StereoAngle < -60.) {
3180
CommandError(MsgStrs[ErrBigNum]);
3187
if( !CurToken || (CurToken==FalseTok) )
3188
{ ReDrawFlag |= RFRefresh;
3189
DrawDoubleBonds = False;
3190
} else if( CurToken == TrueTok )
3191
{ ReDrawFlag |= RFRefresh;
3192
DrawDoubleBonds = True;
3193
} else CommandError(MsgStrs[ErrBadOpt]);
3198
if( !CurToken || (CurToken==TrueTok) )
3199
{ ReDrawFlag |= RFRefresh;
3200
DrawMonitDistance = True;
3201
} else if( CurToken == FalseTok )
3202
{ ReDrawFlag |= RFRefresh;
3203
DrawMonitDistance = False;
3204
} else CommandError(MsgStrs[ErrBadOpt]);
3210
{ ReDrawFlag |= RFRefresh;
3211
DrawBetaArrows = True;
3212
CartoonHeight = 120;
3213
} else if( CurToken==TrueTok )
3214
{ ReDrawFlag |= RFRefresh;
3215
DrawBetaArrows = True;
3216
} else if( CurToken==FalseTok )
3217
{ ReDrawFlag |= RFRefresh;
3218
DrawBetaArrows = False;
3219
} else if( CurToken==NumberTok )
3220
{ if( *TokenPtr=='.' )
3222
FetchFloat(TokenValue,250);
3225
if( TokenValue <= 500 )
3226
{ CartoonHeight = (int)TokenValue;
3227
ReDrawFlag |= RFRefresh;
3228
} else CommandError(MsgStrs[ErrBigNum]);
3229
} else if( CurToken=='.' )
3230
{ FetchFloat(0,250);
3231
if( TokenValue <= 500 )
3232
{ CartoonHeight = (int)TokenValue;
3233
ReDrawFlag |= RFRefresh;
3234
} else CommandError(MsgStrs[ErrBigNum]);
3236
} else CommandError(MsgStrs[ErrBadOpt]);
3241
if( !CurToken || (CurToken==FalseTok) )
3242
{ ReDrawFlag |= RFColour;
3243
UseBackFade = False;
3244
} else if( CurToken == TrueTok )
3245
{ ReDrawFlag |= RFColour;
3247
} else CommandError(MsgStrs[ErrBadOpt]);
3250
case(TransparentTok):
3252
if( !CurToken || (CurToken==FalseTok) )
3253
{ UseTransparent = False;
3254
} else if( CurToken == TrueTok )
3255
{ UseTransparent = True;
3256
} else CommandError(MsgStrs[ErrBadOpt]);
3261
if( !CurToken || (CurToken==FalseTok) )
3262
{ ReDrawFlag |= RFColour;
3263
UseDepthCue = False;
3264
} else if( CurToken == TrueTok )
3265
{ ReDrawFlag |= RFColour;
3267
} else CommandError(MsgStrs[ErrBadOpt]);
3273
{ CisBondCutOff = CIS;
3275
if( CurToken==NumberTok )
3276
{ if( TokenValue<=180 )
3277
{ CisBondCutOff = TokenValue;
3278
Info.cisbondcount = -1; /* to recalculate peptide bonds */
3280
CommandError(MsgStrs[ErrBigNum]);
3283
CommandError(MsgStrs[ErrNotNum]);
3286
sprintf(buffer,"CisBondCutOff = %d\n", CisBondCutOff);
3287
WriteString( buffer );
3292
if( !CurToken || (CurToken==FalseTok) )
3293
{ SeqFormat = False;
3294
} else if( CurToken == TrueTok )
3296
} else CommandError(MsgStrs[ErrBadOpt]);
3301
if( !CurToken || (CurToken==TrueTok) )
3302
{ CalcBondsFlag = True;
3303
} else if( CurToken == FalseTok )
3304
{ CalcBondsFlag = False;
3305
} else CommandError(MsgStrs[ErrBadOpt]);
3308
case(AxesTok): ExecuteAxesCommand(); break;
3309
case(BoundBoxTok): ExecuteBoundBoxCommand(); break;
3310
case(PickingTok): ExecutePickingCommand(); break;
3311
case(TitleTok): ExecuteTitleCommand(); break;
3312
case(UnitCellTok): ExecuteUnitCellCommand(); break;
3317
{ SurfaceChainsFlag = False;
3318
SolventDots = False;
3320
} else if( CurToken == SolventTok )
3322
if( !CurToken || (CurToken==FalseTok) )
3323
{ SolventDots = False;
3325
} else if( CurToken == TrueTok )
3326
{ SolventDots = True;
3328
} else CommandError(MsgStrs[ErrBadOpt]);
3329
} else if( CurToken == ChainTok )
3331
if( !CurToken || (CurToken==TrueTok) )
3332
{ SurfaceChainsFlag = True;
3333
} else if( CurToken == FalseTok )
3334
{ SurfaceChainsFlag = False;
3335
} else CommandError(MsgStrs[ErrBadOpt]);
3336
} else if( CurToken == NumberTok )
3337
{ if( TokenValue<=20 )
3339
{ DotSize = TokenValue;
3340
ReDrawFlag |= RFRefresh;
3342
} else CommandError(MsgStrs[ErrBigNum]);
3343
} else CommandError(MsgStrs[ErrBadOpt]);
3344
iProbeRad = (int)(Scale*(Real)ProbeRadius);
3345
ReDrawFlag |= RFRefresh;
3348
/* set notoggle command - gm */
3351
if (!CurToken || CurToken == TrueTok)
3354
WriteString(MsgStrs[StrNoTogOn]);
3356
else if (CurToken == FalseTok)
3359
WriteString(MsgStrs[StrNoTogOff]);
3363
/* set play.fps command */
3365
{ int errorcode = 0;
3368
if (CurToken == '.') {
3370
if(CurToken == FPSTok) {
3372
if (CurToken == NumberTok ) {
3373
play_fps = (double)TokenValue;
3374
if( *TokenPtr=='.') {
3376
FetchFloat(TokenValue,1000);
3377
play_fps = (double)TokenValue/1000.;
3379
} else if (CurToken=='.') {
3381
play_fps = (double)TokenValue/1000.;
3389
if (errorcode) CommandError(MsgStrs[ErrBadArg]);
3393
/* set record.fps <n> command
3394
set record.aps <n> command
3395
set record.dwell <n> <what> command
3397
handling of <what> deferred */
3399
{ int errorcode = 0;
3400
double __far * settarget;
3401
double targetdefault = 24.;
3404
if (CurToken == '.') {
3407
case FPSTok: settarget = &record_fps; break;
3408
case APSTok: settarget = &record_aps; targetdefault = 10.;break;
3409
case DwellTok: settarget = &record_dwell; targetdefault = 0.5; break;
3410
default: settarget = (double __far *)NULL;
3414
if (CurToken == NumberTok ) {
3415
*settarget = (double)TokenValue;
3416
if( *TokenPtr=='.') {
3418
FetchFloat(TokenValue,1000);
3419
*settarget = (double)TokenValue/1000.;
3421
} else if (CurToken=='.') {
3423
*settarget = (double)TokenValue/1000.;
3426
*settarget = targetdefault;
3431
if (errorcode) CommandError(MsgStrs[ErrBadArg]);
3437
CommandError(MsgStrs[ErrParam]);
3442
static void OldExecuteColourCommand( void )
3447
switch( FetchToken() )
3452
{ case(CPKTok): CPKColourAttrib();
3453
ReDrawFlag |= RFColour; break;
3455
case(CpkNewTok): CpkNewColourAttrib();
3456
ReDrawFlag |= RFColour; break;
3458
case(AminoTok): AminoColourAttrib();
3459
ReDrawFlag |= RFColour; break;
3461
case(ShapelyTok): ShapelyColourAttrib();
3462
ReDrawFlag |= RFColour; break;
3464
case(UserTok): UserMaskAttrib(MaskColourFlag);
3465
ReDrawFlag |= RFColour; break;
3467
case(GroupTok): ScaleColourAttrib(GroupAttr);
3468
ReDrawFlag |= RFColour; break;
3470
case(ChainTok): ScaleColourAttrib(ChainAttr);
3471
ReDrawFlag |= RFColour; break;
3473
case(ModelTok): ScaleColourAttrib(ModelAttr);
3474
ReDrawFlag |= RFColour; break;
3476
case(AltlTok): ScaleColourAttrib(AltAttr);
3477
ReDrawFlag |= RFColour; break;
3479
case(ChargeTok): ScaleColourAttrib(ChargeAttr);
3480
ReDrawFlag |= RFColour; break;
3482
case(TemperatureTok): ScaleColourAttrib(TempAttr);
3483
ReDrawFlag |= RFColour; break;
3485
case(StructureTok): StructColourAttrib();
3486
ReDrawFlag |= RFColour; break;
3488
default: if( ParseColour() )
3489
{ MonoColourAttrib(RVal,GVal,BVal);
3490
ReDrawFlag |= RFColour;
3491
} else if( CurToken )
3492
{ CommandError(MsgStrs[ErrColour]);
3493
} else CommandError(MsgStrs[ErrNoCol]);
3500
if( CurToken==NoneTok )
3502
ReDrawFlag |= RFColour;
3503
} else if( ParseColour() )
3504
{ ColourBondAttrib(RVal,GVal,BVal);
3505
ReDrawFlag |= RFColour;
3506
} else if( CurToken )
3507
{ CommandError(MsgStrs[ErrColour]);
3508
} else CommandError(MsgStrs[ErrNoCol]);
3513
if( CurToken==NoneTok )
3515
ReDrawFlag |= RFColour;
3516
} else if( ParseColour() )
3517
{ ColourBackAttrib(RVal,GVal,BVal);
3518
ReDrawFlag |= RFColour;
3519
} else if( CurToken )
3520
{ CommandError(MsgStrs[ErrColour]);
3521
} else CommandError(MsgStrs[ErrNoCol]);
3526
if( CurToken==NoneTok )
3527
{ ReDrawFlag |= RFColour;
3528
ColourHBondNone( False );
3529
} else if( ParseColour() )
3530
{ ReDrawFlag |= RFColour;
3531
ColourHBondAttrib(False,RVal,GVal,BVal);
3532
} else if( CurToken )
3533
{ CommandError(MsgStrs[ErrColour]);
3534
} else CommandError(MsgStrs[ErrNoCol]);
3539
if( CurToken==NoneTok )
3540
{ ReDrawFlag |= RFColour;
3541
ColourHBondNone( True );
3542
} else if( CurToken==TypeTok )
3543
{ ReDrawFlag |= RFColour;
3545
} else if( ParseColour() )
3546
{ ReDrawFlag |= RFColour;
3547
ColourHBondAttrib(True,RVal,GVal,BVal);
3548
} else if( CurToken )
3549
{ CommandError(MsgStrs[ErrColour]);
3550
} else CommandError(MsgStrs[ErrNoCol]);
3555
if( CurToken==PotentialTok )
3556
{ ReDrawFlag |= RFColour;
3557
ColourDotsPotential();
3558
} else if( ParseColour() )
3559
{ ReDrawFlag |= RFColour;
3560
ColourDotsAttrib(RVal,GVal,BVal);
3561
} else if( CurToken )
3562
{ CommandError(MsgStrs[ErrColour]);
3563
} else CommandError(MsgStrs[ErrNoCol]);
3568
if( CurToken==PotentialTok )
3569
{ ReDrawFlag |= RFColour;
3570
MapFlag |= MapColourPot;
3571
MapFlag &= ~MapColourAtom;
3573
} else if( CurToken==AtomTok )
3574
{ ReDrawFlag |= RFColour;
3575
MapFlag |= MapColourAtom;
3576
MapFlag &= ~MapColourPot;
3578
} else if( ParseColour() )
3579
{ ReDrawFlag |= RFColour;
3580
MapRGBCol[0] = RVal;
3581
MapRGBCol[1] = GVal;
3582
MapRGBCol[2] = BVal;
3583
MapFlag &= ~(MapColourPot|MapColourAtom);
3585
} else if( CurToken )
3586
{ CommandError(MsgStrs[ErrColour]);
3587
} else CommandError(MsgStrs[ErrNoCol]);
3593
if( CurToken == NoneTok )
3594
{ ColourMonitNone();
3595
} else if( ParseColour() )
3596
{ ReDrawFlag |= RFColour;
3597
ColourMonitAttrib(RVal,GVal,BVal);
3598
} else if( CurToken )
3599
{ CommandError(MsgStrs[ErrColour]);
3600
} else CommandError(MsgStrs[ErrNoCol]);
3608
{ BoxR = RVal; BoxG = GVal; BoxB = BVal;
3609
ReDrawFlag |= RFColour;
3610
} else if( CurToken )
3611
{ CommandError(MsgStrs[ErrColour]);
3612
} else CommandError(MsgStrs[ErrNoCol]);
3617
if( CurToken==NoneTok )
3618
{ ReDrawFlag |= RFColour;
3619
UseLabelCol = False;
3620
} else if( ParseColour() )
3621
{ LabR = RVal; LabG = GVal; LabB = BVal;
3622
ReDrawFlag |= RFColour;
3624
} else if( CurToken )
3625
{ CommandError(MsgStrs[ErrColour]);
3626
} else CommandError(MsgStrs[ErrNoCol]);
3632
case(CartoonTok): flag = RibColBoth; break;
3633
case(Ribbon1Tok): flag = RibColInside; break;
3634
case(Ribbon2Tok): flag = RibColOutside; break;
3639
if( CurToken==NoneTok )
3640
{ ReDrawFlag |= RFColour;
3641
ColourRibbonNone(flag);
3642
} else if( ParseColour() )
3643
{ ReDrawFlag |= RFColour;
3644
ColourRibbonAttrib(flag,RVal,GVal,BVal);
3645
} else if( CurToken )
3646
{ CommandError(MsgStrs[ErrColour]);
3647
} else CommandError(MsgStrs[ErrNoCol]);
3651
static void ExecuteColourCommand( void )
3653
/* The new ExecuteColorCommand - at present this is a copy of the
3654
* previous version */
3657
/* in case we want to use the old code... */
3658
if (UseOldColorCode)
3660
/* ... use it ... */
3661
OldExecuteColourCommand();
3666
switch( FetchToken() )
3671
{ case(CPKTok): CPKColourAttrib();
3672
ReDrawFlag |= RFColour; break;
3674
case(CpkNewTok): CpkNewColourAttrib();
3675
ReDrawFlag |= RFColour; break;
3677
case(AminoTok): AminoColourAttrib();
3678
ReDrawFlag |= RFColour; break;
3680
case(ShapelyTok): ShapelyColourAttrib();
3681
ReDrawFlag |= RFColour; break;
3683
case(UserTok): UserMaskAttrib(MaskColourFlag);
3684
ReDrawFlag |= RFColour; break;
3686
case(GroupTok): ScaleColourAttrib(GroupAttr);
3687
ReDrawFlag |= RFColour; break;
3689
case(ChainTok): ScaleColourAttrib(ChainAttr);
3690
ReDrawFlag |= RFColour; break;
3692
case(ModelTok): ScaleColourAttrib(ModelAttr);
3693
ReDrawFlag |= RFColour; break;
3695
case(AltlTok): ScaleColourAttrib(AltAttr);
3696
ReDrawFlag |= RFColour; break;
3698
case(ChargeTok): ScaleColourAttrib(ChargeAttr);
3699
ReDrawFlag |= RFColour; break;
3701
case(TemperatureTok): ScaleColourAttrib(TempAttr);
3702
ReDrawFlag |= RFColour; break;
3704
case(StructureTok): StructColourAttrib();
3705
ReDrawFlag |= RFColour; break;
3707
default: if( ParseColour() )
3709
MonoColourAttrib(RVal,GVal,BVal);
3710
ReDrawFlag |= RFColour;
3711
} else if( CurToken )
3712
{ CommandError(MsgStrs[ErrColour]);
3713
} else CommandError(MsgStrs[ErrNoCol]);
3720
if( CurToken==NoneTok )
3722
ReDrawFlag |= RFColour;
3723
} else if( ParseColour() )
3724
{ ColourBondAttrib(RVal,GVal,BVal);
3725
ReDrawFlag |= RFColour;
3726
} else if( CurToken )
3727
{ CommandError(MsgStrs[ErrColour]);
3728
} else CommandError(MsgStrs[ErrNoCol]);
3733
if( CurToken==NoneTok )
3735
ReDrawFlag |= RFColour;
3736
} else if( ParseColour() )
3737
{ ColourBackAttrib(RVal,GVal,BVal);
3738
ReDrawFlag |= RFColour;
3739
} else if( CurToken )
3740
{ CommandError(MsgStrs[ErrColour]);
3741
} else CommandError(MsgStrs[ErrNoCol]);
3746
if( CurToken==NoneTok )
3747
{ ReDrawFlag |= RFColour;
3748
ColourHBondNone( False );
3749
} else if( ParseColour() )
3750
{ ReDrawFlag |= RFColour;
3751
ColourHBondAttrib(False,RVal,GVal,BVal);
3752
} else if( CurToken )
3753
{ CommandError(MsgStrs[ErrColour]);
3754
} else CommandError(MsgStrs[ErrNoCol]);
3759
if( CurToken==NoneTok )
3760
{ ReDrawFlag |= RFColour;
3761
ColourHBondNone( True );
3762
} else if( CurToken==TypeTok )
3763
{ ReDrawFlag |= RFColour;
3765
} else if( ParseColour() )
3766
{ ReDrawFlag |= RFColour;
3767
ColourHBondAttrib(True,RVal,GVal,BVal);
3768
} else if( CurToken )
3769
{ CommandError(MsgStrs[ErrColour]);
3770
} else CommandError(MsgStrs[ErrNoCol]);
3775
if( CurToken==PotentialTok )
3776
{ ReDrawFlag |= RFColour;
3777
ColourDotsPotential();
3778
} else if( ParseColour() )
3779
{ ReDrawFlag |= RFColour;
3780
ColourDotsAttrib(RVal,GVal,BVal);
3781
} else if( CurToken )
3782
{ CommandError(MsgStrs[ErrColour]);
3783
} else CommandError(MsgStrs[ErrNoCol]);
3788
if( CurToken==PotentialTok )
3789
{ ReDrawFlag |= RFColour;
3790
MapFlag |= MapColourPot;
3791
MapFlag &= ~MapColourAtom;
3793
} else if( CurToken==AtomTok )
3794
{ ReDrawFlag |= RFColour;
3795
MapFlag |= MapColourAtom;
3796
MapFlag &= ~MapColourPot;
3798
} else if( ParseColour() )
3799
{ ReDrawFlag |= RFColour;
3800
MapRGBCol[0] = RVal;
3801
MapRGBCol[1] = GVal;
3802
MapRGBCol[2] = BVal;
3803
MapFlag &= ~(MapColourPot|MapColourAtom);
3805
} else if( CurToken )
3806
{ CommandError(MsgStrs[ErrColour]);
3807
} else CommandError(MsgStrs[ErrNoCol]);
3813
if( CurToken == NoneTok )
3814
{ ColourMonitNone();
3815
} else if( ParseColour() )
3816
{ ReDrawFlag |= RFColour;
3817
ColourMonitAttrib(RVal,GVal,BVal);
3818
} else if( CurToken )
3819
{ CommandError(MsgStrs[ErrColour]);
3820
} else CommandError(MsgStrs[ErrNoCol]);
3828
{ BoxR = RVal; BoxG = GVal; BoxB = BVal;
3829
ReDrawFlag |= RFColour;
3830
} else if( CurToken )
3831
{ CommandError(MsgStrs[ErrColour]);
3832
} else CommandError(MsgStrs[ErrNoCol]);
3837
if( CurToken==NoneTok )
3838
{ ReDrawFlag |= RFColour;
3839
UseLabelCol = False;
3840
} else if( ParseColour() )
3841
{ LabR = RVal; LabG = GVal; LabB = BVal;
3842
ReDrawFlag |= RFColour;
3844
} else if( CurToken )
3845
{ CommandError(MsgStrs[ErrColour]);
3846
} else CommandError(MsgStrs[ErrNoCol]);
3852
case(CartoonTok): flag = RibColBoth; break;
3853
case(Ribbon1Tok): flag = RibColInside; break;
3854
case(Ribbon2Tok): flag = RibColOutside; break;
3859
if( CurToken==NoneTok )
3860
{ ReDrawFlag |= RFColour;
3861
ColourRibbonNone(flag);
3862
} else if( ParseColour() )
3863
{ ReDrawFlag |= RFColour;
3864
ColourRibbonAttrib(flag,RVal,GVal,BVal);
3865
} else if( CurToken )
3866
{ CommandError(MsgStrs[ErrColour]);
3867
} else CommandError(MsgStrs[ErrNoCol]);
3872
/* prints out information about all selected objects to terminal */
3873
/* example: Describe(ATM) could print output in terms of: */
3874
/* Chain: ? Group: ??? ?? Atom: ??? ???? */
3875
static void DescribeSelected( Selection type )
3878
register Chain __far *chain = (Chain __far*)NULL;
3879
register Group __far *group = (Group __far*)NULL;
3880
register RAtom __far *ptr = (RAtom __far*)NULL;
3895
for(chain=Database->clist;chain;chain=chain->cnext){
3896
Gselect = Gcount = 0;
3898
current.chn = chain;
3899
for(group=chain->glist;group;group=group->gnext){
3900
Aselect = Acount = 0;
3901
current.grp = group;
3902
for(ptr=group->alist;ptr;ptr=ptr->anext) {
3904
if( !(ptr->flag&HeteroFlag) || type != CHN) {
3905
if( ptr->flag&SelectFlag ) {
3908
if( type == ATM || type == CRD){ /* Atom or Coordinates */
3909
WriteString(DescribeObj(¤t, type));
3916
if( Acount == Aselect )
3919
if( Aselect && (type == GRP || type == CHN)) {
3920
if (!(model == group->model)) {
3921
model = group->model;
3923
sprintf(buffer,"Model: %d\n",model);
3924
WriteString(buffer);
3928
if( Aselect && type == GRP) { /* Group */
3929
WriteString(DescribeObj(¤t, GRP));
3930
sprintf(buffer, "\t(%d/%d)\tatoms\n",Aselect, Acount);
3931
WriteString(buffer);
3934
if( touched && type == CHN ) { /* Chain */
3935
WriteString(DescribeObj(¤t, CHN));
3937
sprintf(buffer,"\t(%d/%d)\tgroups\n",Gselect, Gcount);
3938
WriteString(buffer);
3941
WriteString("\tno group completely selected\n");
3947
/* Selection for printing selected atoms || groups || chains to terminal */
3948
static void ExecuteSelectedCommand()
3951
switch( FetchToken() )
3954
DescribeSelected(ATM);
3957
DescribeSelected(CRD);
3960
DescribeSelected(GRP);
3963
DescribeSelected(CHN);
3966
DescribeSelected(GRP); /* default option for show selected is 'group' */
3969
CommandError(MsgStrs[ErrBadArg]);
3974
static void DescribeSequence( void )
3976
register Chain __far *chn;
3977
register Group __far *grp;
3978
register int chain,count;
3979
register int subcount;
3984
InvalidateCmndLine();
3989
for( chn=Database->clist; chn; chn=chn->cnext )
3990
{ chain = (Info.chaincount<2); count = 0;
3992
for( grp=chn->glist; grp; grp=grp->gnext )
3993
if( grp->alist && !(grp->alist->flag&HeteroFlag) )
3995
{ if (!(model==grp->model))
3996
{ model = grp->model;
3998
{ sprintf(buffer,"Model: %d ",model);
3999
WriteString(buffer);
4002
WriteString("Chain ");
4003
WriteChar(chn->ident);
4014
str = Residue[grp->refno];
4019
sprintf(buffer,"%-3d ",grp->serno);
4020
WriteString(buffer);
4036
if( grp->refno < 29 )
4037
{ WriteChar(ResidueChar[grp->refno]);
4038
} else WriteChar('*');
4047
static void ExecuteShowCommand( void )
4053
switch( FetchToken() )
4067
ShowRecordCommand();
4079
ExecuteSelectedCommand();
4083
WritePhiPsiAngles(NULL, False); /* Writing to stderr/stdout */
4087
WritePhiPsiAngles(NULL, -1); /* Writing to stderr/stdout */
4091
InvalidateCmndLine();
4093
if( *Info.spacegroup )
4094
{ sprintf(buffer,"%s ...... %s\n",MsgStrs[StrSGroup],Info.spacegroup);
4095
WriteString(buffer);
4097
sprintf(buffer,"%s A ...... %g\n",MsgStrs[StrUCell],Info.cella);
4098
WriteString(buffer);
4099
sprintf(buffer,"%s B ...... %g\n",MsgStrs[StrUCell],Info.cellb);
4100
WriteString(buffer);
4101
sprintf(buffer,"%s C ...... %g\n",MsgStrs[StrUCell],Info.cellc);
4102
WriteString(buffer);
4104
temp = Rad2Deg*Info.cellalpha;
4105
sprintf(buffer,"%s alpha .. %g\n",MsgStrs[StrUCell],temp);
4106
WriteString(buffer);
4107
temp = Rad2Deg*Info.cellbeta;
4108
sprintf(buffer,"%s beta ... %g\n",MsgStrs[StrUCell],temp);
4109
WriteString(buffer);
4110
temp = Rad2Deg*Info.cellgamma;
4111
sprintf(buffer,"%s gamma .. %g\n",MsgStrs[StrUCell],temp);
4112
WriteString(buffer);
4114
} else WriteString(MsgStrs[StrSymm]);
4119
InvalidateCmndLine();
4120
if ( CenX || CenY || CenZ ) {
4122
sprintf(buffer,"centre [%ld,%ld,%ld]\n", CenX, -CenY, -CenZ);
4124
sprintf(buffer,"centre [%ld,%ld,%ld]\n", CenX, CenY, -CenZ);
4126
WriteString(buffer);
4131
InvalidateCmndLine();
4132
ReDrawFlag |= RFRotate;
4136
phi = Round(Rad2Deg*asin(RotX[2]));
4138
{ theta = -Round(Rad2Deg*atan2(RotY[0],RotY[1]));
4140
} else if( phi == -90 )
4141
{ theta = Round(Rad2Deg*atan2(RotY[0],RotY[1]));
4144
{ theta = Round(Rad2Deg*atan2(RotY[2],RotZ[2]));
4145
psi = Round(-Rad2Deg*atan2(RotX[1],RotX[0]));
4149
phi = psi = theta = 0.0;
4150
RMat2RV(&theta, &phi, &psi, RotX, RotY, RotZ);
4156
if( Round(theta) ) {
4157
sprintf(buffer,"rotate x %d\n",Round(InvertY(-theta)));
4158
WriteString(buffer);
4161
sprintf(buffer,"rotate y %d\n",Round(phi));
4162
WriteString(buffer);
4165
sprintf(buffer,"rotate z %d\n",Round(InvertY(-psi)));
4166
WriteString(buffer);
4168
if (BondsSelected) {
4169
BondRot __far *brptr;
4171
brptr = BondsSelected;
4173
sprintf(buffer,"bond %ld %ld pick\n",
4174
(brptr->BSrcAtom)->serno, (brptr->BDstAtom)->serno);
4175
WriteString(buffer);
4176
if( brptr->BRotValue ) {
4177
sprintf(buffer,"rotate bond %d\n",
4178
Round((brptr->BRotValue)*180.));
4179
WriteString(buffer);
4181
brptr = brptr->brnext;
4187
InvalidateCmndLine();
4188
/* temp = 100.0*DialValue[DialTX]; */
4189
temp = (int)(100.0*(Real)(XOffset-WRange)/((Real)XRange*Zoom));
4191
sprintf(buffer,"translate x %.2f\n",temp);
4192
WriteString(buffer);
4194
/* temp = 100.0*DialValue[DialTY]; */
4195
temp = (int)(100.0*(Real)(YOffset-HRange)/((Real)YRange*Zoom));
4197
sprintf(buffer,"translate y %.2f\n",InvertY(-temp));
4198
WriteString(buffer);
4200
/* temp = 100.0*DialValue[DialTZ]; */
4201
temp = (int)(100.0*(Real)(ZOffset-10000)/((Real)ZRange*Zoom));
4203
sprintf(buffer,"translate z %.2f\n",temp);
4204
WriteString(buffer);
4209
InvalidateCmndLine();
4210
if( DialValue[DialZoom] != 0.0 )
4211
{ if( DialValue[DialZoom]<0.0 )
4212
{ temp = 100.0*DialValue[DialZoom];
4213
} else temp = 100.0*MaxZoom*DialValue[DialZoom];
4214
sprintf(buffer,"zoom %d\n",(int)(temp+100));
4215
WriteString(buffer);
4220
InvalidateCmndLine();
4221
sprintf(buffer,"set play.fps %g\n",play_fps);
4222
WriteString(buffer);
4223
sprintf(buffer,"set record.fps %g\n",record_fps);
4224
WriteString(buffer);
4228
InvalidateCmndLine();
4229
sprintf(buffer,"set record.aps %g\n",record_aps);
4230
WriteString(buffer);
4234
CommandError(MsgStrs[ErrBadArg]);
4241
/*Function call on "select <...<" , start and continue selection,
4242
* "select <...>" , start and stop selection,
4243
* or "select >...>" , continue and stop selection.
4244
* Escape the parser to make fast atom selection under the format:
4245
* "select (< or >) x1[-x2],...,xi[-x(i+1)](> or <)" where xi represent atomno.
4247
static void ReadAtomSelection( int start )
4248
{ register Long ori=0, end=0;
4249
register int neg, bloc=0;
4251
register Bond __far *bptr;
4252
register SurfBond __far *sbptr;
4257
/*Empty selection at start*/
4259
{ for( QChain=Database->clist; QChain; QChain=QChain->cnext )
4260
for( QGroup=QChain->glist; QGroup; QGroup=QGroup->gnext )
4261
for( QAtom=QGroup->alist; QAtom; QAtom=QAtom->anext )
4262
QAtom->flag &= ~SelectFlag;
4274
while( *TokenPtr && isspace(ch) )
4278
else if( ch != '+' )
4281
if( CurToken==NumberTok )
4284
while( *TokenPtr && isspace(ch) )
4291
while( *TokenPtr && isspace(ch) )
4295
else if( ch != '+' )
4298
if( CurToken==NumberTok )
4303
while( *TokenPtr && isspace(ch) )
4305
if( ch==','||ch=='>'||ch=='<' )
4308
} else if( ch==','||ch=='>'||ch=='<' )
4315
{ for( QChain=Database->clist; QChain; QChain=QChain->cnext )
4316
for( QGroup=QChain->glist; QGroup; QGroup=QGroup->gnext )
4317
for( QAtom=QGroup->alist; QAtom; QAtom=QAtom->anext )
4318
if( QAtom->serno >= ori && QAtom->serno <= end )
4319
{ if( !(QAtom->flag&SelectFlag) )
4321
QAtom->flag |= SelectFlag;
4324
{ if( ch!=',' && ch!='<' && ch!='>' ) /*not empty bloc*/
4325
CommandError(MsgStrs[ErrBlocSel]);
4326
while( *TokenPtr && ch!=',' && ch!='<' && ch!='>' )
4342
{ if( (FileDepth == -1) || !LineStack[FileDepth] )
4343
DisplaySelectCount( );
4347
if( (bptr->srcatom->flag&bptr->dstatom->flag) & SelectFlag )
4348
{ bptr->flag |= SelectFlag;
4349
} else bptr->flag &= ~SelectFlag;
4351
if( (sbptr->srcatom->flag&sbptr->dstatom->flag) & SelectFlag )
4352
{ sbptr->flag |= SelectFlag;
4353
} else sbptr->flag &= ~SelectFlag;
4356
if( (bptr->srcatom->flag|bptr->dstatom->flag) & SelectFlag )
4357
{ bptr->flag |= SelectFlag;
4358
} else bptr->flag &= ~SelectFlag;
4360
if( (sbptr->srcatom->flag|sbptr->dstatom->flag) & SelectFlag )
4361
{ sbptr->flag |= SelectFlag;
4362
} else sbptr->flag &= ~SelectFlag;
4369
void ZapDatabase( void )
4372
int s; /* 's' is for "shade" */
4374
for( i=0; i<10; i++ )
4376
CQRMSet(DialQRot,0.,0.,0.,0.);
4392
for (s = 0; s < LastShade; s++)
4393
Shade[s].refcount = 0;
4395
#if 0 /* [GSG 11/10/95] */
4396
BackR = BackG = BackB = 0;
4402
/* [11/10/95 GSG] Prevent colormap reset, refresh instead of clear */
4409
ReDrawFlag = RFRefresh;
4413
{ UpdateScrollBars();
4414
/* ClearImage(); [GSG 11/10/95] */
4416
AdviseUpdate(AdvName);
4417
AdviseUpdate(AdvClass);
4418
AdviseUpdate(AdvIdent);
4420
/* [GSG 11/10/95] */
4426
void WriteImageFile( char *name, int type, int subtype )
4435
if ( (type != VRMLTok) && subtype ) {
4436
CommandError(MsgStrs[ErrSyntax]);
4441
{ case(GIFTok): WriteGIFFile(name); break;
4442
case(BMPTok): WriteBMPFile(name); break;
4443
case(PPMTok): WritePPMFile(name,True); break;
4444
case(SUNTok): WriteRastFile(name,False); break;
4445
case(SUNRLETok): WriteRastFile(name,True); break;
4446
case(PICTTok): WritePICTFile(name); break;
4447
case(IRISTok): WriteIRISFile(name); break;
4448
case(EPSFTok): WriteEPSFFile(name,True,True); break;
4449
case(MonoPSTok): WriteEPSFFile(name,False,True); break;
4450
case(VectPSTok): WriteVectPSFile(name); break;
4451
case(Raster3DTok): WriteR3DFile(name); break;
4454
case(ScriptTok): WriteScriptFile(name); break;
4455
case(KinemageTok): WriteKinemageFile(name); break;
4456
case(MolScriptTok): WriteMolScriptFile(name); break;
4457
case(POVRayTok): WritePOVRayFile(name); break;
4458
case(POVRay3Tok): WritePOVRay3File(name); break;
4459
case(PhiPsiTok): WritePhiPsiAngles(name, False); break;
4460
case(RamachanTok): WritePhiPsiAngles(name, 1); break;
4461
case(RamPrintTok): WritePhiPsiAngles(name, -1); break;
4462
case(VRMLTok): WriteVRMLFile(name, subtype); break;
4468
void ResumePauseCommand( void )
4470
register int ch,len;
4474
CommandActive = False;
4478
/* Re-enable Drag & Drop! */
4479
DragAcceptFiles(CanvWin,TRUE);
4482
while( FileDepth >= 0 )
4483
{ fp = FileStack[FileDepth];
4487
while( (ch!='\n') && (ch!='\r') && (ch!=EOF) )
4488
{ if( len<MAXBUFFLEN )
4489
CurLine[len++] = ch;
4493
LineStack[FileDepth]++;
4494
if( len<MAXBUFFLEN )
4495
{ CurLine[len] = '\0';
4496
stat = ExecuteCommand();
4498
{ if( stat == QuitTok )
4499
{ while( FileDepth >= 0 )
4500
{ fclose(FileStack[FileDepth]);
4501
_ffree(NameStack[FileDepth]);
4505
} else /* ExitTok */
4507
} else if( IsPaused )
4509
} else CommandError(MsgStrs[StrSLong]);
4511
_ffree(NameStack[FileDepth]);
4518
void InterruptPauseCommand( void )
4520
WriteString("*** RasMol script interrupted! ***\n\n");
4521
CommandActive = False;
4525
/* Re-enable Drag & Drop! */
4526
DragAcceptFiles(CanvWin,TRUE);
4529
while( FileDepth >= 0 )
4530
{ fclose(FileStack[FileDepth]);
4531
_ffree(NameStack[FileDepth]);
4537
static void ExecuteConnectCommand( void )
4539
register Bond __far *bptr;
4540
register int info,flag;
4544
{ flag = (MainAtomCount+HetaAtomCount<256);
4545
} else if( CurToken == TrueTok )
4547
} else if( CurToken == FalseTok )
4550
{ CommandError(MsgStrs[ErrSyntax]);
4557
Shade[Colour2Shade(bptr->col)].refcount--;
4558
info = (FileDepth == -1);
4559
CreateMoleculeBonds(info,flag,True);
4560
ReDrawFlag |= RFRefresh|RFColour;
4561
EnableWireframe(WireFlag,0,0);
4564
CalcBondsFlag = True;
4570
The format of a map command is
4571
map {<map_selector>} subcommand parameters
4573
where the optional map_selector is one of the following:
4574
m -- a map number m indicating a particular map for the currently active molecule
4575
m1-m2 -- a range of map numbers indicating all maps for the current molecule
4576
with numbers between m1 and m2, inclusive. If m1 is blank, m1 is assumed
4577
to be the number of the first map. If m2 is blank, m2 is assumed to be the
4578
number of the last map.
4579
next -- the next map number after the highest number selected map in circular order.
4580
If all maps are already selected or no maps are selected, the result will be selection
4581
of the first map. If there are no maps, next has the same effect as new
4582
new (or none) -- no maps are selected, but if the subcommand changes any parameters
4583
or setting, they are changed for the next map to be created
4584
all -- all maps are selected
4585
a quoted string to be used as a map label, or one of the above followed by a
4586
quoted string to be used as a map label
4588
SelectMaps parses map_selector tokens until it is positioned on the
4589
token after the last token of the map selector, setting the MapMarkedFlag
4590
for each selected map and, if it is to be applied to the next map,
4591
the global map flag. The MapSelectFlag is not changed at this stage.
4592
The transfer will be done in a call to ApplyMapSelection, to allow the
4593
processing to be aborted on errors in the subcommand or parameters
4598
static void SelectMaps( void ) {
4600
int lomap, himap, labfound, nextflag, newflag, j, nummaps;
4613
if (!MapInfoPtr) InitialiseMaps();
4615
if (MapInfoPtr) nummaps = MapInfoPtr->size;
4618
if (CurToken == NewTok || CurToken == NoneTok) {
4622
if (CurToken == StringTok) labfound = 1;
4623
} else if (CurToken == NextTok) {
4627
if (CurToken == StringTok) labfound = 1;
4628
} else if (CurToken == AllTok) {
4633
if (CurToken == StringTok) labfound = 1;
4634
} else if (CurToken == NumberTok) {
4636
lomap = (int)TokenValue;
4639
if (CurToken == '-') {
4642
if (CurToken == NumberTok) {
4643
himap = (int)TokenValue;
4645
if (CurToken == StringTok) labfound = 1;
4648
if (CurToken == StringTok) labfound = 1;
4653
if (CurToken == '-') {
4657
if (CurToken == NumberTok) {
4658
himap = (int)TokenValue;
4660
if (CurToken == StringTok) labfound = 1;
4663
if (CurToken == StringTok) labfound = 1;
4674
MapLabel = _fmalloc(strlen(TokenIdent)+1);
4675
strcpy(MapLabel,TokenIdent);
4678
MapFlag &= ~(MapMarkedFlag|MapNoSelectFlag);
4679
if (nomapselected) MapFlag |= MapNoSelectFlag;
4682
for (j=0; j < MapInfoPtr->size; j++) {
4683
vector_get_elementptr((GenericVec __far *)MapInfoPtr,(void __far * __far *)&mapinfo,j );
4684
mapinfo->flag &= (~MapMarkedFlag);
4686
if (j+1 >= lomap && j+1 <=himap
4687
&& mapinfo->MapLabel
4688
&& !strcasecmp(mapinfo->MapLabel,MapLabel)) {
4690
mapinfo->flag |= MapMarkedFlag;
4693
if (j+1 >= lomap && j+1 <=himap) {
4695
mapinfo->flag |= MapMarkedFlag;
4702
if ( maxmapsel >= MapInfoPtr->size ) maxmapsel = 1;
4703
for (j=0; j < MapInfoPtr->size; j++) {
4704
vector_get_elementptr((GenericVec __far *)MapInfoPtr,(void __far * __far *)&mapinfo,j );
4705
if (j != maxmapsel) mapinfo->flag &= (~MapMarkedFlag);
4706
else mapinfo->flag |= MapMarkedFlag;
4710
if (newflag) MapFlag |= MapMarkedFlag;
4718
static void ApplyMapSelection( void ) {
4722
if (MapFlag&MapNoSelectFlag) return;
4723
MapFlag &= (~MapSelectFlag);
4724
if (MapFlag&MapMarkedFlag) MapFlag |= MapSelectFlag;
4727
for (j=0; j < MapInfoPtr->size; j++) {
4728
vector_get_elementptr((GenericVec __far *)MapInfoPtr,(void __far * __far *)&mapinfo,j );
4729
mapinfo->flag &= (~MapSelectFlag);
4730
if (mapinfo->flag&MapMarkedFlag) mapinfo->flag |= MapSelectFlag;
4737
ApplyMapAtomSelection
4739
Searchs for atoms within the specified SearchRadius of the points of
4740
the currently selected maps. If clear is set, all selections are
4741
cleared prior to the search. If current is not set, all atoms are
4742
selected prior to the search.
4746
static void ApplyMapAtomSelection(int dontadd, int searchwithin, int SearchRadius) {
4749
void CNEARTREE_FAR * objClosest;
4750
MapPointVec __far *MapPointsPtr;
4756
/* First we need to set up the selection flags for CreateAtomTree
4758
If we are adding to the selection (dontadd is false)
4759
we need to save the current selection using SaveFlag
4760
and restore those selections at the end.
4762
If we are not searching within (searchwithin is false)
4763
we need to set all selection flags
4767
for( QChain=Database->clist; QChain; QChain=QChain->cnext )
4768
for( QGroup=QChain->glist; QGroup; QGroup=QGroup->gnext )
4769
for( QAtom=QGroup->alist; QAtom; QAtom=QAtom->anext ) {
4770
QAtom->flag &= ~SaveFlag;
4771
if (!dontadd && ((QAtom->flag)&SelectFlag)) QAtom->flag |= SaveFlag;
4772
if (searchwithin==False) QAtom->flag |= SelectFlag;
4775
if (!AtomTree || dontadd==True || searchwithin==False || NeedAtomTree) {
4776
if (CreateAtomTree()) {
4777
RasMolFatalExit(MsgStrs[StrMalloc]);
4780
#ifdef CNEARTREE_INSTRUMENTED
4782
CNearTreeSetNodeVisits(AtomTree,visits);
4785
/* Now, clear all selection flags */
4787
for( QChain=Database->clist; QChain; QChain=QChain->cnext )
4788
for( QGroup=QChain->glist; QGroup; QGroup=QGroup->gnext )
4789
for( QAtom=QGroup->alist; QAtom; QAtom=QAtom->anext ) {
4790
QAtom->flag &= ~SelectFlag;
4795
for (j=0; j < MapInfoPtr->size; j++) {
4796
vector_get_elementptr((GenericVec __far *)MapInfoPtr,(void __far * __far *)&mapinfo,j );
4797
if (mapinfo->flag&MapSelectFlag) {
4798
MapPointsPtr = mapinfo->MapPointsPtr;
4800
for (i=0; i<MapPointsPtr->size; i++) {
4801
if (!(MapPointsPtr->array[i]).flag&SelectFlag) continue;
4802
coord[0] = (double)(MapPointsPtr->array[i]).xpos;
4803
coord[1] = (double)(MapPointsPtr->array[i]).ypos;
4804
coord[2] = (double)(MapPointsPtr->array[i]).zpos;
4806
if (!CNearTreeNearestNeighbor(AtomTree,(double)(SearchRadius),NULL,&objClosest,coord)) {
4807
(*((RAtom __far * *)objClosest))->flag |= SelectFlag;
4815
if (dontadd==False) {
4816
for( QChain=Database->clist; QChain; QChain=QChain->cnext )
4817
for( QGroup=QChain->glist; QGroup; QGroup=QGroup->gnext )
4818
for( QAtom=QGroup->alist; QAtom; QAtom=QAtom->anext ) {
4819
if ((QAtom->flag)&SaveFlag) {
4820
QAtom->flag |= SelectFlag;
4821
QAtom->flag &= ~SaveFlag;
4827
fprintf(stderr,"Map select time %g size %ld depth %ld\n",
4828
((double)(tc2-tc1))/CLOCKS_PER_SEC,
4829
(long)(AtomTree->m_szsize),(long)(AtomTree->m_szdepth));
4830
#ifdef CNEARTREE_INSTRUMENTED
4831
CNearTreeGetNodeVisits(AtomTree,&visits);
4832
fprintf(stderr,"Node visits %ld\n", (long)visits);
4842
void ApplyMapColour( void ) {
4847
for (j=0; j < MapInfoPtr->size; j++) {
4848
vector_get_elementptr((GenericVec __far *)MapInfoPtr,(void __far * __far *)&mapinfo,j );
4849
if (mapinfo->flag&MapSelectFlag) {
4850
mapinfo->flag &= ~(MapColourPot|MapColourAtom);
4851
mapinfo->flag |= (MapFlag&(MapColourPot|MapColourAtom));
4852
for (i=0;i<3;i++) mapinfo->MapRGBCol[i]=MapRGBCol[i];
4853
if (mapinfo->flag&MapColourPot) ColourPointPotential(j);
4854
else if(mapinfo->flag&MapColourAtom) ColourPointAtom(j);
4855
else ColourPointAttrib(mapinfo->MapRGBCol[0],mapinfo->MapRGBCol[1],mapinfo->MapRGBCol[2],j);
4864
static void ApplyMapFlag( void ) {
4869
mapflag = MapFlag&(MapPointFlag|MapMeshDashFlag|MapSurfFlag);
4872
for (j=0; j < MapInfoPtr->size; j++) {
4873
vector_get_elementptr((GenericVec __far *)MapInfoPtr,(void __far * __far *)&mapinfo,j );
4874
if (mapinfo->flag&MapSelectFlag) {
4875
mapinfo->flag |= mapflag;
4877
if (mapinfo->MapPtr) {
4878
if (mapinfo->flag&(MapPointFlag|MapMeshFlag|MapSurfFlag)) {
4879
vector_create((GenericVec __far **)&mapinfo->MapPointsPtr,sizeof(MapPoint),1000);
4880
if (mapinfo->flag&(MapMeshFlag))
4881
vector_create((GenericVec __far **)&mapinfo->MapBondsPtr,sizeof(MapBond),1000);
4882
if (mapinfo->flag&(MapSurfFlag))
4883
vector_create((GenericVec __far **)&mapinfo->MapTanglePtr,sizeof(MapTangle),1000);
4884
map_points(mapinfo->MapPtr,
4885
mapinfo->MapLevel+((mapinfo->flag&MapMeanFlag)?mapinfo->MapPtr->mapdatamean:0.),
4886
mapinfo->MapSpacing, mapinfo->MapPointsPtr,mapinfo->MapBondsPtr,mapinfo->MapTanglePtr,
4887
mapinfo->MapMaskPtr, mapinfo->MapRGBCol );
4888
if (mapinfo->flag&MapColourPot) ColourPointPotential(j);
4889
if (mapinfo->flag&MapColourAtom) ColourPointAtom(j);
4897
ReDrawFlag |= RFInitial|RFColour;
4901
static void ApplyMapLevel( void ) {
4905
mapflag = MapFlag&MapMeanFlag;
4908
for (j=0; j < MapInfoPtr->size; j++) {
4909
vector_get_elementptr((GenericVec __far *)MapInfoPtr,(void __far * __far *)&mapinfo,j );
4910
if (mapinfo->flag&MapSelectFlag) {
4911
mapinfo->flag &= ~MapMeanFlag;
4912
mapinfo->flag |= mapflag;
4913
mapinfo->MapLevel = MapLevel;
4921
static void ApplyMapSpread( void ) {
4926
for (j=0; j < MapInfoPtr->size; j++) {
4927
vector_get_elementptr((GenericVec __far *)MapInfoPtr,(void __far * __far *)&mapinfo,j );
4928
if (mapinfo->flag&MapSelectFlag) {
4929
mapinfo->MapSpread = MapSpread;
4937
static void ApplyMapSpacing( void ) {
4942
for (j=0; j < MapInfoPtr->size; j++) {
4943
vector_get_elementptr((GenericVec __far *)MapInfoPtr,(void __far * __far *)&mapinfo,j );
4944
if (mapinfo->flag&MapSelectFlag) {
4945
mapinfo->MapSpacing = MapSpacing;
4952
static void ApplyMapZap( void ) {
4957
for (j=0; j < MapInfoPtr->size; j++) {
4958
vector_get_elementptr((GenericVec __far *)MapInfoPtr,(void __far * __far *)&mapinfo,j );
4959
if (mapinfo->flag&MapSelectFlag) {
4967
static void ApplyMapRestriction( void ) {
4972
for (j=0; j < MapInfoPtr->size; j++) {
4973
vector_get_elementptr((GenericVec __far *)MapInfoPtr,(void __far * __far *)&mapinfo,j );
4974
if (!mapinfo->flag&MapSelectFlag) {
4983
/* Code for calculation of the distance from a point to the Lee-Richards
4984
Surface of a pair of atoms
4986
x is the location of the test point
4987
a is the location of the first atom
4988
b is the location of the second atom
4989
ra, rb and rp are the radii of a, b and the probe */
4991
#define vsub(result,src,dst) \
4992
result[0] = dst[0]-src[0]; result[1] = dst[1]-src[1]; result[2] = dst[2]-src[2];
4993
#define vadd(result,src,dst) \
4994
result[0] = dst[0]+src[0]; result[1] = dst[1]+src[1]; result[2] = dst[2]+src[2];
4996
u[0]*v[0] + u[1]*v[1] + u[2]*v[2]
4997
#define vscale(result,scalar,vector) \
4998
result[0] = scalar*vector[0]; result[1] = scalar*vector[1]; result[2] = scalar*vector[2];
5024
*---------*-----------*-----------*---------*
5026
|---dae---|-----dec---|---dfc-----|---dfb---|
5027
|---------dac---------|---------dbc---------|
5028
|--------------------dab--------------------|
5041
double surfdist(double x[3], double a[3], double b[3],
5042
double ra, double rb, double rp) {
5044
double dxas, dxbs; /* signed distances from x to vdw surfaces */
5045
double xa[3], xb[3]; /* vectors from x to a and b */
5046
double dab; /* distance from a to b */
5047
double dpc; /* distance from probe center, p, to c */
5048
double vab[3]; /* vector from a to b */
5049
double uab[3]; /* unit vector along a to b vector */
5050
double c[3]; /* break point between ends of the reentrant surface */
5051
double dac, dbc; /* distances from a to c and b to c */
5052
double xc[3]; /* x redone as vector from c to x */
5053
double xcaxial[3]; /* the axial vector component of xc */
5054
double dxcaxial; /* the axial coordinate of xcaxial */
5055
double xcperp[3]; /* the orthogonal vector component of xc */
5056
double dxcperp; /* the orthogonal coordinate of xc */
5057
double dpasq, dpbsq; /* squares of lengths from probe center to a and b */
5058
double dpxsq; /* square of length from probe center to x */
5059
double rtot; /* ra + rb + 2*rb */
5060
double vdwdist; /* the distance to the van der Waals surface */
5064
dxas = sqrt(vdot(xa,xa)) -ra;
5065
dxbs = sqrt(vdot(xb,xb)) -rb;
5067
dab = sqrt(vdot(vab,vab));
5069
if ((dxas * dxbs) >= 0. ) {
5071
if (fabs(dxas)<fabs(dxbs)) {
5083
if ( dxas < dxbs ) {
5094
/* if the distance is too large or too small ignore the reentrant surface */
5095
if (dab > rtot || dab < (ra+rb)/2.) {
5101
vscale(uab,1./dab,vab)
5102
dac = .5*((rtot)*(ra-rb)/dab + dab);
5103
dbc = .5*((rtot)*(rb-ra)/dab + dab);
5107
dxcaxial = vdot(xc,uab);
5108
vscale(xcaxial,dxcaxial,uab)
5109
vsub(xcperp,xcaxial,xc)
5110
dxcperp = sqrt(vdot(xcperp,xcperp));
5111
dpc = sqrt((rp+rb)*(rp+rb) - dbc*dbc);
5113
/* If x is further from the axis than p
5114
just return the van der Waals distance
5115
otherwise we will need to check if the
5116
angle between x-p and c-p is less than
5117
the angle between a-p or b-p and c-p*/
5119
if (dxcperp >= dpc || dpc < rp ) {
5125
/* In the (axial, perp) coordinate frame centered on c:
5127
x = (dxcaxial,dxcperp)
5133
so (a-p).(c-p) = (-dac,-dpc).(0,-dpc) = dpc*dpc
5134
(b-p).(c-p) = dpc*dpc
5135
||a-p|| = sqrt(dac*dac+dpc*dpc)
5136
||b-p|| = sqrt(dbc*dbc+dpc*dpc)
5138
We are inside a sector from p to the reentrant surface, on,
5139
say, the a side, if the cosine of the angle between a-p and
5140
c-p is larger than the cosine of the angle between x-p and c-p:
5142
|(a-p).(c-p)|/(||a-p||.||c-p||) >= |(x-p).(c-p)|/(||x-p||.||c-p||)
5144
||x-p||*|(a-p).(c-p)|>=||a-p||*|(x-p).(c-p)|
5146
||x-p||*dpc*dpc >= sqrt(dac*dac+dpc*dpc)*|(dxcperp-dpc)*dpc|
5148
||x-p||*dpc >= sqrt(dac*dac+dpc*dpc)*|(dxcperp-dpc)|
5153
dpxsq = dxcaxial*dxcaxial + (dxcperp-dpc)*(dxcperp-dpc);
5156
/* x is on the b-side */
5158
dpbsq = dbc*dbc + dpc*dpc;
5160
if (dpc*dpc*dpxsq >= (dxcperp-dpc)*(dxcperp-dpc)*dpbsq) {
5166
return rp - sqrt(dpxsq);
5172
dpasq = dac*dac + dpc*dpc;
5174
if (dpc*dpc*dpxsq >= (dxcperp-dpc)*(dxcperp-dpc)*dpasq) {
5180
return rp - sqrt(dpxsq);
5199
Searchs for atoms within the specified SearchRadius of the points of
5200
the currently selected maps. Show the statistics of the distances
5201
from the map points to the molecular surface of those atoms
5205
static void ApplyMapAtomShow(int SearchRadius) {
5208
void CNEARTREE_FAR * objClosest;
5209
MapPointVec __far *MapPointsPtr;
5210
double coord[3], acoord[3], bcoord[3], arad, brad;
5211
CVectorHandle atomsclosest;
5212
double vdwdistmin, vdwdistmax, vdwdistmean, vdwvariance;
5213
double lrdistmin, lrdistmax, lrdistmean, lrvariance;
5214
double dtemp, vdwdtemp;
5215
int vdwpcount, vdwptotal, lrpcount, lrptotal;
5218
CVectorCreate(&atomsclosest,sizeof(void CVECTOR_FAR *),2);
5220
vdwpcount = vdwptotal = 0;
5227
lrpcount = lrptotal =0;
5235
if (!AtomTree || NeedAtomTree ) {
5236
if (CreateAtomTree()) {
5237
RasMolFatalExit(MsgStrs[StrMalloc]);
5242
for (j=0; j < MapInfoPtr->size; j++) {
5243
vector_get_elementptr((GenericVec __far *)MapInfoPtr,(void __far * __far *)&mapinfo,j );
5244
if (mapinfo->flag&MapSelectFlag) {
5245
MapPointsPtr = mapinfo->MapPointsPtr;
5247
for (i=0; i<MapPointsPtr->size; i++) {
5248
if (!(MapPointsPtr->array[i]).flag&SelectFlag) continue;
5249
coord[0] = (double)(MapPointsPtr->array[i]).xpos;
5250
coord[1] = (double)(MapPointsPtr->array[i]).ypos;
5251
coord[2] = (double)(MapPointsPtr->array[i]).zpos;
5255
if (!CNearTreeNearestNeighbor(AtomTree,(double)(SearchRadius),NULL,&objClosest,coord)) {
5256
acoord[0] = (double)(*((RAtom __far * *)objClosest))->xorg
5257
+ (double)(*((RAtom __far * *)objClosest))->fxorg
5258
+ ((double)(*((RAtom __far * *)objClosest))->xtrl)/40.;
5259
acoord[1] = (double)(*((RAtom __far * *)objClosest))->yorg
5260
+ (double)(*((RAtom __far * *)objClosest))->fyorg
5261
+ ((double)(*((RAtom __far * *)objClosest))->ytrl)/40.;
5262
acoord[2] = (double)(*((RAtom __far * *)objClosest))->zorg
5263
+ (double)(*((RAtom __far * *)objClosest))->fzorg
5264
+ ((double)(*((RAtom __far * *)objClosest))->ztrl)/40.;
5265
arad = (double)ElemVDWRadius((*((RAtom __far * *)objClosest))->elemno);
5266
vdwdtemp = sqrt((coord[0]-acoord[0])*(coord[0]-acoord[0]) +
5267
(coord[1]-acoord[1])*(coord[1]-acoord[1]) +
5268
(coord[2]-acoord[2])*(coord[2]-acoord[2]))-arad;
5269
if (fabs(vdwdtemp) <= SearchRadius-((ProbeRadius < 10)?350:ProbeRadius)) {
5271
if (vdwpcount == 1) {
5272
vdwdistmin = vdwdistmax = vdwdtemp;
5274
if (vdwdtemp < vdwdistmin) vdwdistmin = vdwdtemp;
5275
if (vdwdtemp > vdwdistmax) vdwdistmax = vdwdtemp;
5277
vdwdistmean += vdwdtemp;
5278
vdwvariance += vdwdtemp*vdwdtemp;
5283
if (!CNearTreeFindKNearest(AtomTree,2,(double)(SearchRadius),NULL,atomsclosest,coord,1)) {
5284
switch (CVectorSize(atomsclosest)) {
5287
objClosest = CVectorElementAt(atomsclosest,0);
5288
acoord[0] = (double)(**((RAtom __far * * *)objClosest))->xorg
5289
+ (double)(**((RAtom __far * * *)objClosest))->fxorg
5290
+ ((double)(**((RAtom __far * * *)objClosest))->xtrl)/40.;
5291
acoord[1] = (double)(**((RAtom __far * * *)objClosest))->yorg
5292
+ (double)(**((RAtom __far * * *)objClosest))->fyorg
5293
+ ((double)(**((RAtom __far * * *)objClosest))->ytrl)/40.;
5294
acoord[2] = (double)(**((RAtom __far * * *)objClosest))->zorg
5295
+ (double)(**((RAtom __far * * *)objClosest))->fzorg
5296
+ ((double)(**((RAtom __far * * *)objClosest))->ztrl)/40.;
5297
arad = (double)ElemVDWRadius((**((RAtom __far * * * )objClosest))->elemno);
5298
dtemp = sqrt((coord[0]-acoord[0])*(coord[0]-acoord[0]) +
5299
(coord[1]-acoord[1])*(coord[1]-acoord[1]) +
5300
(coord[2]-acoord[2])*(coord[2]-acoord[2]))-arad;
5301
if (fabs(dtemp) <= SearchRadius-((ProbeRadius < 10)?350:ProbeRadius)) {
5303
if (lrpcount == 1) {
5304
lrdistmin = lrdistmax = dtemp;
5306
if (dtemp < lrdistmin) lrdistmin = dtemp;
5307
if (dtemp > lrdistmax) lrdistmax = dtemp;
5309
lrdistmean += dtemp;
5310
lrvariance += dtemp*dtemp;
5314
objClosest = CVectorElementAt(atomsclosest,0);
5315
acoord[0] = (double)(**((RAtom __far * * *)objClosest))->xorg
5316
+ (double)(**((RAtom __far * * *)objClosest))->fxorg
5317
+ ((double)(**((RAtom __far * * *)objClosest))->xtrl)/40.;
5318
acoord[1] = (double)(**((RAtom __far * * *)objClosest))->yorg
5319
+ (double)(**((RAtom __far * * *)objClosest))->fyorg
5320
+ ((double)(**((RAtom __far * * *)objClosest))->ytrl)/40.;
5321
acoord[2] = (double)(**((RAtom __far * * *)objClosest))->zorg
5322
+ (double)(**((RAtom __far * * *)objClosest))->fzorg
5323
+ ((double)(**((RAtom __far * * *)objClosest))->ztrl)/40.;
5324
arad = (double)ElemVDWRadius((**((RAtom __far * * *)objClosest))->elemno);
5325
objClosest = CVectorElementAt(atomsclosest,1);
5326
bcoord[0] = (double)(**((RAtom __far * * *)objClosest))->xorg
5327
+ (double)(**((RAtom __far * * *)objClosest))->fxorg
5328
+ ((double)(**((RAtom __far * * *)objClosest))->xtrl)/40.;
5329
bcoord[1] = (double)(**((RAtom __far * * *)objClosest))->yorg
5330
+ (double)(**((RAtom __far * * *)objClosest))->fyorg
5331
+ ((double)(**((RAtom __far * * *)objClosest))->ytrl)/40.;
5332
bcoord[2] = (double)(**((RAtom __far * * *)objClosest))->zorg
5333
+ (double)(**((RAtom __far * * *)objClosest))->fzorg
5334
+ ((double)(**((RAtom __far * * *)objClosest))->ztrl)/40.;
5335
brad = (double)ElemVDWRadius((**((RAtom __far * * *)objClosest))->elemno);
5336
dtemp = surfdist(coord,acoord,bcoord,arad,brad,(double)((ProbeRadius < 10)?350:ProbeRadius));
5338
if (lrpcount == 1) {
5339
lrdistmin = lrdistmax = dtemp;
5341
if (dtemp < lrdistmin) lrdistmin = dtemp;
5342
if (dtemp > lrdistmax) lrdistmax = dtemp;
5344
lrdistmean += dtemp;
5345
lrvariance += dtemp*dtemp;
5357
sprintf(buffer," points in mesh, points used in distances:\n total %d, used %d, within %g of surface\n",
5358
vdwptotal, vdwpcount, ((double)(SearchRadius-((ProbeRadius < 10)?350:ProbeRadius)))/250.);
5359
WriteString(buffer);
5360
if (vdwpcount > 0) {
5361
vdwdistmean /= (250.*(double)vdwpcount);
5362
vdwvariance /= (250.*250.*(double)vdwpcount)-vdwdistmean;
5365
sprintf(buffer," distance to selected van der Waals surface:\n mean %#g, min %#g, max %#g, esd %#g\n",
5366
vdwdistmean, vdwdistmin, vdwdistmax, sqrt(vdwvariance) );
5367
WriteString(buffer);
5371
lrdistmean /= (250.*(double)lrpcount);
5372
lrvariance /= (250.*250.*(double)lrpcount)-lrdistmean;
5375
sprintf(buffer," distance to selected Lee-Richards surface:\n mean %#g, min %#g, max %#g, esd %#g\n",
5376
lrdistmean, lrdistmin, lrdistmax, sqrt(lrvariance) );
5377
WriteString(buffer);
5380
CVectorFree(&atomsclosest);
5387
void ApplyMapShow( void ) {
5392
InvalidateCmndLine();
5394
if (MapFlag & MapSelectFlag) {
5395
sprintf(buffer,"map new %s %s %#lg spacing %#lg spread %#lg\n",
5396
MapFlag&MapSurfFlag?"surface":(MapFlag&MapMeshFlag?"mesh":(
5397
MapFlag&MapPointFlag?"dots":"unknown") ),
5398
MapFlag&MapMeanFlag?"level MEAN ":"level ",(double)MapLevel,
5399
(double)MapSpacing/250., (double)MapSpread);
5400
WriteString(buffer);
5402
sprintf(buffer,"mask: mean %#g, esd %#g, min %#g, max %#g\n",
5403
MapMaskPtr->mapdatamean,
5404
MapMaskPtr->mapdataesd,
5405
MapMaskPtr->mapdatamin,
5406
MapMaskPtr->mapdatamax );
5407
WriteString(buffer);
5412
for (j=0; j < MapInfoPtr->size; j++) {
5413
vector_get_elementptr((GenericVec __far *)MapInfoPtr,(void __far * __far *)&mapinfo,j );
5414
if (mapinfo->flag&MapSelectFlag) {
5415
sprintf(buffer,"map %d: %s %s %lg spacing %#lg spread %#lg %s %s\n",j+1,
5416
mapinfo->flag&MapSurfFlag?"surface":(mapinfo->flag&MapMeshFlag?"mesh":(
5417
mapinfo->flag&MapPointFlag?"dots":"unknown") ),
5418
mapinfo->flag&MapMeanFlag?"level MEAN ":"level ",(double)mapinfo->MapLevel,
5419
(double)mapinfo->MapSpacing/250., (double)mapinfo->MapSpread,
5420
mapinfo->MapFile?"file: ":"",
5421
mapinfo->MapFile?mapinfo->MapFile:"");
5422
WriteString(buffer);
5423
if (mapinfo->MapLabel) {
5424
WriteString("label: ");
5425
WriteString(mapinfo->MapLabel);
5428
if (mapinfo->MapPtr) {
5429
sprintf(buffer,"map: mean %#g, esd %#g, min %#g, max %#g\n",
5430
mapinfo->MapPtr->mapdatamean,
5431
mapinfo->MapPtr->mapdataesd,
5432
mapinfo->MapPtr->mapdatamin,
5433
mapinfo->MapPtr->mapdatamax );
5434
WriteString(buffer);
5435
ApplyMapAtomShow( 1000 + ((ProbeRadius< 10)?350:ProbeRadius) );
5437
WriteString("map: NONE\n");
5439
if (mapinfo->MapMaskPtr) {
5440
sprintf(buffer,"mask: mean %#g, esd %#g, min %#g, max %#g\n",
5441
mapinfo->MapMaskPtr->mapdatamean,
5442
mapinfo->MapMaskPtr->mapdataesd,
5443
mapinfo->MapMaskPtr->mapdatamin,
5444
mapinfo->MapMaskPtr->mapdatamax );
5445
WriteString(buffer);
5454
int ApplyMapMask(int mapno ) {
5456
MapInfo *mapinfo, *omapinfo;
5457
MapStruct __far *mapmaskptr;
5458
MapAtmSelVec __far *mapmaskgensel;
5461
ApplyMapSelection();
5462
if (MapSpacing <= 0) MapSpacing = 250L;
5465
if (mapno != -1 && mapno > MapInfoPtr->size) {
5466
CommandError(MsgStrs[ErrBadArg]);
5470
vector_get_elementptr((GenericVec __far *)MapInfoPtr,(void __far * __far *)&mapinfo,mapno-1);
5471
if (!mapinfo || !mapinfo->MapPtr) {
5472
CommandError(MsgStrs[ErrBadArg]);
5476
for (j=-1; j==-1 || j < MapInfoPtr->size; j++) {
5477
mapmaskgensel = NULL;
5481
vector_get_elementptr((GenericVec __far *)MapInfoPtr,(void __far * __far *)&mapinfo,j );
5482
flag = mapinfo->flag;
5487
if (flag&MapSelectFlag) {
5490
if (MapSpread < 0.) MapSpread = 2.*(double)MapSpacing/750.;
5492
if(generate_map(&mapmaskptr,MapSpacing,
5493
MapSpacing, MapSpacing, 0L, 0L, 0L,
5494
(Long)(250.*(1.+MapSpread)+MapSpacing),
5495
(MapSpread > 0.)?(1./MapSpread):0., (flag&MapScaleFlag)?1:0 )){
5496
CommandError(MsgStrs[StrMalloc]);
5500
vector_create((GenericVec __far **)&mapmaskgensel,sizeof(MapAtmSel),10);
5501
WriteMapAtoms(mapmaskgensel);
5502
} else if (mapno > 0) {
5503
if ( mapno <= MapInfoPtr->size ) {
5504
vector_get_elementptr((GenericVec __far *)MapInfoPtr,(void __far * __far *)&omapinfo,mapno-1 );
5505
if (omapinfo && omapinfo->MapPtr) {
5506
mapmaskptr = _fmalloc(sizeof(MapStruct));
5508
CommandError(MsgStrs[StrMalloc]);
5511
mapmaskptr->mapdata = _fmalloc(omapinfo->MapPtr->elsize*
5512
((omapinfo->MapPtr)->xhigh-(omapinfo->MapPtr)->xlow+1)*
5513
((omapinfo->MapPtr)->yhigh-(omapinfo->MapPtr)->ylow+1)*
5514
((omapinfo->MapPtr)->zhigh-(omapinfo->MapPtr)->zlow+1));
5515
if(!mapmaskptr->mapdata) {
5517
CommandError(MsgStrs[StrMalloc]);
5520
mapmaskptr->elsize=omapinfo->MapPtr->elsize;
5521
mapmaskptr->eltype=omapinfo->MapPtr->eltype;
5522
mapmaskptr->maptype=omapinfo->MapPtr->maptype;
5523
mapmaskptr->adiv=omapinfo->MapPtr->adiv;
5524
mapmaskptr->bdiv=omapinfo->MapPtr->bdiv;
5525
mapmaskptr->cdiv=omapinfo->MapPtr->cdiv;
5526
mapmaskptr->xint=omapinfo->MapPtr->xint;
5527
mapmaskptr->yint=omapinfo->MapPtr->yint;
5528
mapmaskptr->zint=omapinfo->MapPtr->zint;
5529
mapmaskptr->xorig=omapinfo->MapPtr->xorig;
5530
mapmaskptr->yorig=omapinfo->MapPtr->yorig;
5531
mapmaskptr->zorig=omapinfo->MapPtr->zorig;
5532
mapmaskptr->xlow=omapinfo->MapPtr->xlow;
5533
mapmaskptr->ylow=omapinfo->MapPtr->ylow;
5534
mapmaskptr->zlow=omapinfo->MapPtr->zlow;
5535
mapmaskptr->xhigh=omapinfo->MapPtr->xhigh;
5536
mapmaskptr->yhigh=omapinfo->MapPtr->yhigh;
5537
mapmaskptr->zhigh=omapinfo->MapPtr->zhigh;
5538
mapmaskptr->mapdatamin=omapinfo->MapPtr->mapdatamin;
5539
mapmaskptr->mapdatamax=omapinfo->MapPtr->mapdatamax;
5540
mapmaskptr->mapdatamean=omapinfo->MapPtr->mapdatamean;
5541
mapmaskptr->mapdataesd=omapinfo->MapPtr->mapdataesd;
5542
for (i=0; i<9; i++) {
5543
mapmaskptr->mapm2r[i]=omapinfo->MapPtr->mapm2r[i];
5544
mapmaskptr->mapr2m[i]=omapinfo->MapPtr->mapr2m[i];
5546
for (i=0; i<3; i++) {
5547
mapmaskptr->mapxlate[i]=omapinfo->MapPtr->mapxlate[i];
5549
memmove(mapmaskptr->mapdata,omapinfo->MapPtr->mapdata,
5550
((mapmaskptr)->xhigh-(mapmaskptr)->xlow+1)
5551
*((mapmaskptr)->yhigh-(mapmaskptr)->ylow+1)
5552
*((mapmaskptr)->zhigh-(mapmaskptr)->zlow+1)
5553
*((mapmaskptr)->elsize));
5554
if (omapinfo->MapGenSel) {
5555
MapAtmSel *mapatmsel;
5556
vector_create((GenericVec __far **)&mapmaskgensel,sizeof(MapAtmSel),10);
5557
for (i = 0; i < omapinfo->MapGenSel->size; i++) {
5558
vector_get_elementptr((GenericVec __far *)omapinfo->MapGenSel,(void __far * __far *)&mapatmsel,i );
5559
vector_set_element((GenericVec __far *)mapmaskgensel,mapatmsel,i);
5567
if (MapMaskPtr->mapdata)_ffree((void __far *)MapMaskPtr->mapdata);
5568
_ffree((void __far *)MapMaskPtr);
5570
MapMaskPtr = mapmaskptr;
5572
if (mapinfo->MapMaskPtr) {
5573
if (mapinfo->MapMaskPtr->mapdata)_ffree((void __far *)mapinfo->MapMaskPtr->mapdata);
5574
_ffree((void __far *)mapinfo->MapMaskPtr);
5576
mapinfo->MapMaskPtr = mapmaskptr;
5579
if (MapMaskGenSel) {
5580
vector_free((GenericVec __far * __far *)&(MapMaskGenSel ) );
5582
MapMaskGenSel=mapmaskgensel;
5584
if (mapinfo->MapMaskGenSel) {
5585
vector_free((GenericVec __far * __far *)&(mapinfo->MapMaskGenSel ) );
5587
mapinfo->MapMaskGenSel=mapmaskgensel;
5594
ReDrawFlag |= RFInitial|RFColour;
5598
/* Generate a new map for the current molecule */
5600
static int ExecuteGenerateCommand( int mapflags ) {
5604
MapStruct __far *mapmaskptr;
5605
MapAtmSelVec __far *mapmaskgensel;
5606
Long MapSpaceAdjust;
5610
ApplyMapSelection();
5611
if (MapSpacing <= 0) MapSpacing = 250L;
5613
/* Initialize a mapinfo struct */
5615
mapinfo.MapLevel = MapLevel;
5616
mapinfo.MapSpacing = MapSpacing;
5617
if (mapinfo.MapSpacing < 25) mapinfo.MapSpacing = 25;
5618
if (MapSpread < 0.) MapSpread = 2.*((double)(MapSpacing))/750.;
5619
mapinfo.MapSpread = MapSpread;
5620
mapinfo.flag = SelectFlag|mapflags;
5621
if (mapinfo.flag&MapLRSurfFlag) {
5622
mapinfo.MapSpread = 0.;
5623
mapinfo.MapLevel = 1.;
5624
mapinfo.flag &= ~(MapMeanFlag|MapScaleFlag);
5626
mapinfo.MapPointsPtr = NULL;
5627
mapinfo.MapBondsPtr = NULL;
5628
mapinfo.MapTanglePtr = NULL;
5629
mapinfo.MapPtr = NULL;
5630
mapinfo.MapMaskPtr = NULL;
5631
mapinfo.MapFile = NULL;
5632
mapinfo.MapGenSel = NULL;
5633
mapinfo.MapMaskGenSel = NULL;
5634
mapinfo.MapRGBCol[0] = MapRGBCol[0];
5635
mapinfo.MapRGBCol[1] = MapRGBCol[1];
5636
mapinfo.MapRGBCol[2] = MapRGBCol[2];
5637
mapinfo.MapMeshRad = MapMeshRad;
5638
mapinfo.MapPointRad = MapPointRad;
5639
mapinfo.MapLabel = MapLabel;
5642
mapmaskptr = _fmalloc(sizeof(MapStruct));
5644
CommandError(MsgStrs[StrMalloc]);
5647
mapmaskptr->mapdata = _fmalloc(MapMaskPtr->elsize*
5648
((MapMaskPtr)->xhigh-(MapMaskPtr)->xlow+1)*
5649
((MapMaskPtr)->yhigh-(MapMaskPtr)->ylow+1)*
5650
((MapMaskPtr)->zhigh-(MapMaskPtr)->zlow+1));
5651
if(!mapmaskptr->mapdata) {
5653
CommandError(MsgStrs[StrMalloc]);
5656
mapmaskptr->elsize=MapMaskPtr->elsize;
5657
mapmaskptr->eltype=MapMaskPtr->eltype;
5658
mapmaskptr->maptype=MapMaskPtr->maptype;
5659
mapmaskptr->adiv=MapMaskPtr->adiv;
5660
mapmaskptr->bdiv=MapMaskPtr->bdiv;
5661
mapmaskptr->cdiv=MapMaskPtr->cdiv;
5662
mapmaskptr->xint=MapMaskPtr->xint;
5663
mapmaskptr->yint=MapMaskPtr->yint;
5664
mapmaskptr->zint=MapMaskPtr->zint;
5665
mapmaskptr->xorig=MapMaskPtr->xorig;
5666
mapmaskptr->yorig=MapMaskPtr->yorig;
5667
mapmaskptr->zorig=MapMaskPtr->zorig;
5668
mapmaskptr->xlow=MapMaskPtr->xlow;
5669
mapmaskptr->ylow=MapMaskPtr->ylow;
5670
mapmaskptr->zlow=MapMaskPtr->zlow;
5671
mapmaskptr->xhigh=MapMaskPtr->xhigh;
5672
mapmaskptr->yhigh=MapMaskPtr->yhigh;
5673
mapmaskptr->zhigh=MapMaskPtr->zhigh;
5674
mapmaskptr->mapdatamin=MapMaskPtr->mapdatamin;
5675
mapmaskptr->mapdatamax=MapMaskPtr->mapdatamax;
5676
mapmaskptr->mapdatamean=MapMaskPtr->mapdatamean;
5677
mapmaskptr->mapdataesd=MapMaskPtr->mapdataesd;
5678
for (i=0; i<9; i++) {
5679
mapmaskptr->mapm2r[i]=MapMaskPtr->mapm2r[i];
5680
mapmaskptr->mapr2m[i]=MapMaskPtr->mapr2m[i];
5682
for (i=0; i<3; i++) {
5683
mapmaskptr->mapxlate[i]=MapMaskPtr->mapxlate[i];
5685
memmove(mapmaskptr->mapdata,MapMaskPtr->mapdata,
5686
((mapmaskptr)->xhigh-(mapmaskptr)->xlow+1)
5687
*((mapmaskptr)->yhigh-(mapmaskptr)->ylow+1)
5688
*((mapmaskptr)->zhigh-(mapmaskptr)->zlow+1)
5689
*((mapmaskptr)->elsize));
5690
mapinfo.MapMaskPtr = mapmaskptr;
5692
if (MapMaskGenSel) {
5693
MapAtmSel *mapatmsel;
5694
vector_create((GenericVec __far **)&mapmaskgensel,sizeof(MapAtmSel),10);
5695
for (i = 0; i < MapMaskGenSel->size; i++) {
5696
vector_get_elementptr((GenericVec __far *)MapMaskGenSel,(void __far * __far *)&mapatmsel,i );
5697
vector_set_element((GenericVec __far *)mapmaskgensel,mapatmsel,i);
5699
mapinfo.MapMaskGenSel = mapmaskgensel;
5702
MapSpaceAdjust = 1.;
5707
generate_map(&mapinfo.MapPtr,mapinfo.MapSpacing*MapSpaceAdjust, mapinfo.MapSpacing*MapSpaceAdjust, mapinfo.MapSpacing*MapSpaceAdjust, 0L, 0L, 0L,
5708
(Long)(250.*(1.+mapinfo.MapSpread)+mapinfo.MapSpacing), (mapinfo.MapSpread>0.)?1./mapinfo.MapSpread:0.,
5709
(mapinfo.flag&MapScaleFlag)?1:0 );
5710
if (!mapallocfailed || MapSpaceAdjust >= 8) break;
5711
MapSpaceAdjust *= 2;
5712
sprintf(buffer," Trying coarser map spacing %g\n",((double)(mapinfo.MapSpacing*MapSpaceAdjust))/250.);
5713
WriteString(buffer);
5716
if (mapallocfailed) {
5717
CommandError(MsgStrs[StrMalloc]);
5718
if (mapinfo.MapMaskGenSel) vector_free((GenericVec __far * __far *)&(mapinfo.MapMaskGenSel));
5719
if (mapinfo.MapMaskPtr) {
5720
_ffree((void __far *)(mapinfo.MapMaskPtr)->mapdata);
5721
_ffree((void __far *)mapinfo.MapMaskPtr);
5725
mapinfo.MapSpacing *= MapSpaceAdjust;
5726
vector_create((GenericVec __far **)&mapinfo.MapGenSel,sizeof(MapAtmSel),10);
5727
WriteMapAtoms(mapinfo.MapGenSel);
5730
if (mapinfo.flag&(MapPointFlag|MapMeshFlag|MapSurfFlag)) {
5731
vector_create((GenericVec __far **)&mapinfo.MapPointsPtr,sizeof(MapPoint),1000);
5732
if (mapinfo.flag&(MapMeshFlag))
5733
vector_create((GenericVec __far **)&mapinfo.MapBondsPtr,sizeof(MapBond),1000);
5734
if (mapinfo.flag&(MapSurfFlag))
5735
vector_create((GenericVec __far **)&mapinfo.MapTanglePtr,sizeof(MapTangle),1000);
5736
map_points(mapinfo.MapPtr,
5737
mapinfo.MapLevel+((mapinfo.flag&MapMeanFlag)?mapinfo.MapPtr->mapdatamean:0.),
5738
mapinfo.MapSpacing, mapinfo.MapPointsPtr,mapinfo.MapBondsPtr,mapinfo.MapTanglePtr,
5739
mapinfo.MapMaskPtr, mapinfo.MapRGBCol );
5741
if (MapFlag&MapNoSelectFlag) {
5742
vector_add_element((GenericVec __far *)MapInfoPtr,(void __far *)&mapinfo);
5744
if (MapFlag&MapSelectFlag) {
5745
vector_add_element((GenericVec __far *)MapInfoPtr,(void __far *)&mapinfo);
5747
for (j=0; j < MapInfoPtr->size; j++) {
5748
vector_get_elementptr((GenericVec __far *)MapInfoPtr,(void __far * __far *)&omapinfo,j );
5749
if (omapinfo->flag&MapSelectFlag) {
5750
DeleteMap(j, False);
5751
vector_set_element((GenericVec __far *)MapInfoPtr,(void __far *)&mapinfo,j);
5762
ReDrawFlag |= RFInitial|RFColour;
5767
/* Execute a command given as
5768
{(<selection>){.}}command
5769
if a selection is provided, it applies only during
5770
execution of this command, except for the following
5771
commands, the prior selection is not restored:
5780
int ExecuteCommandOne( int * );
5782
int ExecuteCommand( void )
5796
if (CurToken == '(') {
5797
SaveAtomSelection();
5799
if( CurToken==AllTok )
5800
{ SelectZone(AllAtomFlag);
5801
} else if( CurToken==NoneTok )
5803
} else if( CurToken==ViewTok )
5804
{ SelectArea(False,True,1,1,XRange,YRange);
5805
} else if( CurToken=='<' )
5806
{ ReadAtomSelection(True);
5807
} else if( CurToken=='>' )
5808
{ ReadAtomSelection(False);
5809
} else if ( CurToken != ')')
5810
{ QueryExpr = ParseExpression(0);
5812
{ if( CurToken == ')' )
5813
{ SelectZoneExpr(QueryExpr);
5815
xret=ExecuteCommandOne(&restore);
5816
if ( restore ) LoadAtomSelection();
5817
DeAllocateExpr(QueryExpr);
5819
} else CommandError(MsgStrs[ErrSyntax]);
5820
DeAllocateExpr(QueryExpr);
5823
{ CommandError(MsgStrs[ErrSyntax]);
5828
if( CurToken == ')' ) {
5830
xret=ExecuteCommandOne(&restore);
5832
LoadAtomSelection();
5837
{ CommandError(MsgStrs[ErrSyntax]);
5842
else return ExecuteCommandOne(&restore);
5846
int ExecuteCommandOne( int * restore )
5848
register char *param;
5849
register int option;
5850
register int i,done;
5860
if (CurToken=='.') {
5861
if( !FetchToken() ) {
5868
if (CurToken == SelectTok
5869
|| CurToken == RestrictTok
5870
|| CurToken == ScriptTok) *restore = 0;
5873
{ case(AxesTok): ExecuteAxesCommand(); break;
5874
case(BoundBoxTok): ExecuteBoundBoxCommand(); break;
5875
case(BulgarianTok): SwitchLang(Bulgarian); break;
5876
case(CentreTok): ExecuteCentreCommand(); break;
5877
case(ChineseTok): SwitchLang(Chinese); break;
5878
case(ClipboardTok): ExecuteClipboardCommand(); break;
5879
case(ColourTok): ExecuteColourCommand(); break;
5880
case(ConnectTok): ExecuteConnectCommand(); break;
5881
case(DeferTok): ExecuteDeferCommand(); break;
5882
case(EnglishTok): SwitchLang(English); break;
5883
case(ExecuteTok): ExecuteExecuteCommand(); break;
5884
case(FrenchTok): SwitchLang(French); break;
5885
case(GenerateTok): ExecuteGenerateCommand(MapMeshFlag);
5887
case(ItalianTok): SwitchLang(Italian); break;
5888
case(JapaneseTok): SwitchLang(Japanese); break;
5889
case(LoadTok): ExecuteLoadCommand(); break;
5890
case(WaitTok): ExecutePauseCommand(); break;
5891
case(PickingTok): ExecutePickingCommand(); break;
5892
case(PrintTok): ExecutePrintCommand(); break;
5893
case(RussianTok): SwitchLang(Russian); break;
5894
case(SetTok): ExecuteSetCommand(); break;
5895
case(ShowTok): ExecuteShowCommand(); break;
5896
case(SpanishTok): SwitchLang(Spanish); break;
5897
case(TitleTok): ExecuteTitleCommand(); break;
5898
case(UnitCellTok): ExecuteUnitCellCommand(); break;
5903
prevtime = CommandTime;
5904
CommandTime = ((double)(clock()))/CLOCKS_PER_SEC;
5906
sprintf(buffer," Time: %g, Delta Time: %g\n", CommandTime, CommandTime-prevtime);
5908
sprintf(buffer," Time: %g\n", CommandTime);
5910
WriteString(buffer);
5914
case(RefreshTok): RefreshScreen();
5915
ReDrawFlag = NextReDrawFlag; break;
5918
case(ZapTok): FetchToken();
5919
if ( CurToken == MapTok ) {
5920
DeleteMaps(); break;
5921
} else if (!CurToken) {
5922
ZapDatabase(); break;
5923
} else CommandError(MsgStrs[ErrBadArg]);
5926
case (ColourModeTok): /* gm */
5928
if (CurToken == TrueTok)
5930
UseOldColorCode = 1;
5931
WriteString(MsgStrs[StrCCompOn]);
5933
else if (CurToken == FalseTok)
5935
UseOldColorCode = 0;
5936
WriteString(MsgStrs[StrCCompOff]);
5940
if (UseOldColorCode)
5942
UseOldColorCode = 0;
5943
WriteString(MsgStrs[StrCCompOff]);
5947
UseOldColorCode = 1;
5948
WriteString(MsgStrs[StrCCompOn]);
5953
CommandError(MsgStrs[ErrNoToggle]);
5958
case (NoToggleTok): /* gm */
5961
if (CurToken == TrueTok)
5964
WriteString(MsgStrs[StrNoTogOn]);
5966
else if (CurToken == FalseTok)
5969
WriteString(MsgStrs[StrNoTogOff]);
5973
WriteString(MsgStrs[StrNoTogOn]);
5978
case(BondTok): FetchToken();
5979
if( CurToken == NumberTok )
5980
{ temp = TokenValue;
5982
if( CurToken == ',' )
5984
if( CurToken == NumberTok )
5989
if ( (!CurToken) || CurToken == '+' ) {
5990
CreateBondOrder(temp, temp2);
5991
ReDrawFlag |= RFInitial;
5992
} else if ( CurToken == PickingTok ) {
5993
CreateBondAxis(temp,TokenValue);
5994
ReDrawFlag |= RFInitial;
5995
} else CommandError(MsgStrs[ErrBadArg]);
5996
} else CommandError(MsgStrs[ErrNotNum]);
5997
} else if (CurToken==RotateTok)
6000
(!CurToken || CurToken==TrueTok))
6001
{ RotMode = RotBond;
6002
ReDrawFlag |= RFRotBond;
6003
} else if(CurToken==FalseTok)
6004
{ if( RotMode == RotBond )
6006
ReDrawFlag |= RFRotate;
6008
} else CommandError(MsgStrs[ErrBadArg]);
6009
} else CommandError(MsgStrs[ErrBadArg]);
6012
case(UnBondTok): FetchToken();
6013
if( CurToken == NumberTok )
6014
{ temp = TokenValue;
6016
if( CurToken == ',' )
6018
if( CurToken == NumberTok )
6019
{ if (RemoveBond(temp,TokenValue)) {
6020
ReDrawFlag |= RFInitial;
6022
CommandError(MsgStrs[ErrBadArg]);
6024
} else CommandError(MsgStrs[ErrNotNum]);
6025
} else if( (!CurToken) && BondSelected )
6026
{ if (RemoveBond(BSrcAtom->serno,BDstAtom->serno)) {
6027
BSrcAtom = NULL; BDstAtom = NULL;
6028
ReDrawFlag |= RFRefresh;
6029
BondSelected = False;
6031
CommandError(MsgStrs[ErrBadArg]);
6033
} else CommandError(MsgStrs[ErrBadArg]);
6038
if (CurToken != NumberTok) {
6039
CommandError(MsgStrs[ErrBadArg]);
6042
if (TokenValue < 1 || TokenValue > NumMolecules) {
6043
CommandError(MsgStrs[ErrBadArg]);
6046
SelectMolecule(TokenValue-1);
6049
case(SelectTok): FetchToken();
6051
{ option = NormAtomFlag;
6052
if( HetaGroups ) option |= HeteroFlag;
6053
if( Hydrogens ) option |= HydrogenFlag;
6055
} else if( CurToken==AllTok )
6056
{ SelectZone(AllAtomFlag);
6057
} else if( CurToken==NoneTok )
6059
} else if( CurToken==ViewTok )
6060
{ SelectArea(False,True,1,1,XRange,YRange);
6061
} else if( CurToken=='<' )
6062
{ ReadAtomSelection(True);
6063
} else if( CurToken=='>' )
6064
{ ReadAtomSelection(False);
6066
{ QueryExpr = ParseExpression(0);
6069
{ SelectZoneExpr(QueryExpr);
6070
} else CommandError(MsgStrs[ErrSyntax]);
6071
DeAllocateExpr(QueryExpr);
6080
{ option = NormAtomFlag;
6081
if( HetaGroups ) option |= HeteroFlag;
6082
if( Hydrogens ) option |= HydrogenFlag;
6083
RestrictZone(option);
6084
ReDrawFlag |= RFRefresh;
6085
} else if( CurToken==AllTok )
6086
{ RestrictZone(AllAtomFlag);
6087
ReDrawFlag |= RFRefresh;
6088
} else if( CurToken==NoneTok )
6089
{ RestrictZone(0x00);
6090
ReDrawFlag |= RFRefresh;
6092
{ QueryExpr = ParseExpression(0);
6095
{ RestrictZoneExpr(QueryExpr);
6096
ReDrawFlag |= RFRefresh;
6097
} else CommandError(MsgStrs[ErrSyntax]);
6098
DeAllocateExpr(QueryExpr);
6114
if (CurToken==FalseTok) {
6115
MapFlag &= ~MapPointFlag;
6116
} else if( (CurToken==TrueTok) || !CurToken ) {
6117
MapFlag &= ~(MapPointFlag|MapMeshDashFlag|MapSurfFlag);
6118
MapFlag |= MapPointFlag;
6119
} else if( CurToken==NumberTok && TokenValue >=0)
6120
{ if( *TokenPtr=='.' )
6122
FetchFloat(TokenValue,250);
6125
if( TokenValue<=500 )
6126
{ if (TokenValue !=0) {
6127
MapFlag &= ~(MapPointFlag|MapMeshDashFlag|MapSurfFlag);
6128
MapFlag |= MapPointFlag;
6129
MapPointRad = TokenValue;
6131
MapFlag &= ~MapPointFlag;
6133
} else { CommandError(MsgStrs[ErrBigNum]); break;}
6134
} else if( CurToken=='.' ) {
6136
if( TokenValue<=500 ) {
6137
MapFlag &= ~(MapPointFlag|MapMeshDashFlag|MapSurfFlag);
6138
MapFlag |= MapPointFlag;
6139
MapPointRad = TokenValue;
6140
} else { CommandError(MsgStrs[ErrBigNum]); break;}
6141
} else if (!CurToken) {
6142
MapFlag &= ~(MapPointFlag|MapMeshDashFlag|MapSurfFlag);
6143
MapFlag |= MapPointFlag;
6145
} else { CommandError(MsgStrs[ErrBadArg]); break; }
6146
ApplyMapSelection();
6148
ReDrawFlag |= RFRefresh;
6153
if (CurToken==FalseTok) {
6154
MapFlag &= ~MapMeshDashFlag;
6155
} else if( (CurToken==TrueTok) || !CurToken ) {
6156
MapFlag &= ~(MapPointFlag|MapMeshDashFlag|MapSurfFlag);
6157
MapFlag |= MapMeshFlag;
6158
} else if( CurToken==DashTok )
6159
{ MapFlag &= ~(MapPointFlag|MapMeshDashFlag|MapSurfFlag);
6160
MapFlag |= MapMeshDashFlag;
6161
} else if( CurToken==NumberTok && TokenValue >=0)
6162
{ if( *TokenPtr=='.' )
6164
FetchFloat(TokenValue,250);
6167
if( TokenValue<=500 )
6168
{ MapFlag &= ~(MapPointFlag|MapMeshDashFlag|MapSurfFlag);
6169
MapFlag |= MapMeshFlag;
6170
MapMeshRad = TokenValue;
6171
} else { CommandError(MsgStrs[ErrBigNum]); break;}
6172
} else if( CurToken=='.' ) {
6174
if( TokenValue<=500 ) {
6175
MapFlag &= ~(MapPointFlag|MapMeshDashFlag|MapSurfFlag);
6176
MapFlag |= MapMeshFlag;
6177
MapMeshRad = TokenValue;
6178
} else { CommandError(MsgStrs[ErrBigNum]); break;}
6179
} else if (!CurToken) {
6180
MapFlag &= ~(MapPointFlag|MapMeshDashFlag|MapSurfFlag);
6181
MapFlag |= MapMeshFlag;
6183
} else { CommandError(MsgStrs[ErrBadArg]); break; }
6184
ApplyMapSelection();
6186
ReDrawFlag |= RFRefresh;
6190
MapFlag &= ~(MapPointFlag|MapMeshFlag|MapSurfFlag);
6191
MapFlag |= MapSurfFlag;
6193
if (CurToken) CommandError(MsgStrs[ErrBadArg]);
6195
ApplyMapSelection();
6198
ReDrawFlag |= RFRefresh;
6203
if (CurToken == TrueTok || CurToken==ZTok || !CurToken) {
6204
MapFlag |= MapScaleFlag;
6205
} else if (CurToken == NoneTok || CurToken == FalseTok) {
6206
MapFlag &= ~MapScaleFlag;
6207
} else { CommandError(MsgStrs[ErrBadArg]);
6210
ApplyMapSelection();
6211
ReDrawFlag |= RFRefresh;
6219
if (CurToken==MolSurfTok) {
6220
mapflags |= MapLRSurfFlag;
6223
if (CurToken==DotsTok) {
6224
mapflags &= ~(MapPointFlag|MapMeshFlag|MapSurfFlag);
6225
mapflags |= MapPointFlag;
6227
} else if (CurToken==WireframeTok) {
6228
mapflags &= ~(MapPointFlag|MapMeshFlag|MapSurfFlag);
6229
mapflags |= MapMeshFlag;
6231
} else if (CurToken==SurfaceTok) {
6232
mapflags &= ~(MapPointFlag|MapMeshFlag|MapSurfFlag);
6233
mapflags |= MapSurfFlag;
6236
if (CurToken==MolSurfTok) {
6237
mapflags |= MapLRSurfFlag;
6239
} else if (CurToken) {
6240
CommandError(MsgStrs[ErrBadArg]);
6243
if (!(mapflags &(MapPointFlag|MapMeshFlag|MapSurfFlag)))
6244
mapflags |= MapPointFlag;
6245
ExecuteGenerateCommand(mapflags);
6251
CommandError(MsgStrs[ErrBadMolDB]);
6255
if( CurToken==StringTok ) {
6256
ProcessFileName(TokenIdent);
6257
} else ProcessFileName(TokenStart);
6259
if( !(fp=fopen(DataFileName,"rb")) ) {
6260
CommandError( (char*)NULL );
6261
WriteString(MsgStrs[StrDFile]);
6262
WriteString(DataFileName);
6263
WriteString("'!\n");
6270
if (MapFlag&MapNoSelectFlag) mapno=-1;
6272
ApplyMapSelection();
6273
if (MapFlag&MapSelectFlag) {
6276
for (j=0; j < MapInfoPtr->size; j++) {
6277
vector_get_elementptr((GenericVec __far *)MapInfoPtr,(void __far * __far *)&omapinfo,j );
6278
if (omapinfo->flag&MapSelectFlag) {
6286
if(LoadCCP4MapFile(fp,(FileDepth == -1),mapno)) {
6287
if( !(fp=fopen(DataFileName,"rb")) ) {
6288
CommandError( (char*)NULL );
6289
WriteString(MsgStrs[StrErrFile]);
6290
WriteString(DataFileName);
6291
WriteString("'!\n");
6293
} else if (LoadCBFMapFile(fp,(FileDepth == -1),mapno)) {
6294
CommandError( (char*)NULL );
6295
WriteString(MsgStrs[StrErrFile]);
6296
WriteString(DataFileName);
6297
WriteString("'!\n");
6302
ReDrawFlag |= RFInitial|RFColour;
6305
CommandError(MsgStrs[ErrBadArg]);
6315
MapFlag &= ~MapMeanFlag;
6318
if ( CurToken==MeanTok) {
6319
MapFlag |= MapMeanFlag;
6323
if ( CurToken == '-' ) {
6328
if ( CurToken==NumberTok)
6329
{ if( *TokenPtr=='.' )
6331
FetchFloat(TokenValue,1000);
6335
if( TokenValue<=50000 )
6336
{ if (TokenValue > 0 || MapFlag&MapMeanFlag) {
6337
MapLevel = ((Real)TokenValue)/1000.;
6338
if (neg) MapLevel *= -1.;
6339
ApplyMapSelection();
6341
ReDrawFlag |= RFRefresh;
6343
} else CommandError(MsgStrs[ErrBigNum]);
6344
} else CommandError(MsgStrs[ErrBigNum]);
6345
} else if( CurToken=='.' ) { FetchFloat(0,1000);
6346
if( TokenValue<=50000 )
6347
{ MapLevel = ((Real)TokenValue)/1000.;
6348
if (neg) MapLevel *= -1.;
6349
ApplyMapSelection();
6351
ReDrawFlag |= RFRefresh;
6353
} else CommandError(MsgStrs[ErrBigNum]);
6355
if (!CurToken && (MapFlag&MapMeanFlag)) {
6356
ApplyMapSelection();
6359
} else CommandError(MsgStrs[ErrBadArg]);
6367
if( (FileDepth!=-1) && LineStack[FileDepth] )
6368
{ CommandError(MsgStrs[ErrInScrpt]);
6373
CommandError(MsgStrs[ErrBadMolDB]);
6379
CommandError(MsgStrs[ErrFilNam]);
6381
} else if( CurToken==StringTok ) {
6382
ProcessFileName(TokenIdent);
6383
} else ProcessFileName(TokenStart);
6385
param = DataFileName;
6389
if( !(fp=fopen(DataFileName,"w+b")) ) {
6390
CommandError( (char*)NULL );
6391
FatalOutputError(DataFileName);
6397
ApplyMapSelection();
6398
if (MapFlag&MapSelectFlag) {
6399
CommandError(MsgStrs[ErrBadArg]);
6403
for (j=0; j < MapInfoPtr->size; j++) {
6404
vector_get_elementptr((GenericVec __far *)MapInfoPtr,(void __far * __far *)&omapinfo,j );
6405
if (omapinfo->flag&MapSelectFlag) {
6406
if(SaveMapFile(fp,(FileDepth == -1),j)) {
6407
CommandError( (char*)NULL );
6408
WriteString(MsgStrs[StrErrFile]);
6409
WriteString(DataFileName);
6410
WriteString("'!\n");
6421
CommandError(MsgStrs[ErrBadArg]);
6428
if (CurToken == SelectedTok) {
6430
} else if (CurToken==NumberTok && TokenValue>0) {
6431
ApplyMapMask(TokenValue);
6432
} else if (CurToken==NoneTok) {
6435
else CommandError(MsgStrs[ErrBadArg]);
6438
case(ResolutionTok):
6440
if ( CurToken==NumberTok && TokenValue >=0)
6441
{ if( *TokenPtr=='.' )
6443
FetchFloat(TokenValue,1000);
6447
if( TokenValue<=50000 )
6448
{ if (TokenValue !=0)
6449
MapSpacing = 250.*((Real)TokenValue)/1000.;
6450
MapSpread = .6667*((Real)TokenValue)/1000.;
6451
ApplyMapSelection();
6454
ReDrawFlag |= RFRefresh;
6455
} else CommandError(MsgStrs[ErrBigNum]);
6456
} else if( CurToken=='.' )
6457
{ FetchFloat(0,1000);
6458
if( TokenValue<=50000 )
6459
{ MapSpacing = 250.*((Real)TokenValue)/1000.;
6460
MapSpread = .6667*((Real)TokenValue)/1000.;
6461
ApplyMapSelection();
6464
ReDrawFlag |= RFRefresh;
6465
} else CommandError(MsgStrs[ErrBigNum]);
6466
} else CommandError(MsgStrs[ErrBadArg]);
6473
if ( CurToken==NumberTok && TokenValue >=0)
6474
{ if( *TokenPtr=='.' )
6476
FetchFloat(TokenValue,1000);
6480
if( TokenValue<=50000 )
6481
{ MapSpread = ((Real)TokenValue)/1000.;
6482
ApplyMapSelection();
6484
ReDrawFlag |= RFRefresh;
6485
} else CommandError(MsgStrs[ErrBigNum]);
6486
} else if( CurToken=='.' )
6487
{ FetchFloat(0,1000);
6488
if( TokenValue<=50000 )
6489
{ MapSpread = ((Real)TokenValue)/1000.;
6490
ApplyMapSelection();
6492
ReDrawFlag |= RFRefresh;
6493
} else CommandError(MsgStrs[ErrBigNum]);
6494
} else CommandError(MsgStrs[ErrBadArg]);
6499
if ( CurToken==NumberTok && TokenValue >=0)
6500
{ if( *TokenPtr=='.' )
6502
FetchFloat(TokenValue,250);
6504
if( TokenValue<=50000 )
6505
{ if (TokenValue !=0)
6506
MapSpacing = TokenValue;
6507
ApplyMapSelection();
6509
ReDrawFlag |= RFRefresh;
6510
} else CommandError(MsgStrs[ErrBigNum]);
6511
} else if( CurToken=='.' )
6512
{ FetchFloat(0,250);
6513
if( TokenValue<=50000 )
6514
{ MapSpacing = TokenValue;
6515
ApplyMapSelection();
6517
ReDrawFlag |= RFRefresh;
6518
} else CommandError(MsgStrs[ErrBigNum]);
6519
} else CommandError(MsgStrs[ErrBadArg]);
6524
if( CurToken==PotentialTok )
6525
{ ReDrawFlag |= RFColour;
6526
MapFlag |= MapColourPot;
6527
MapFlag &= ~MapColourAtom;
6528
} else if( CurToken==AtomTok )
6529
{ ReDrawFlag |= RFColour;
6530
MapFlag |= MapColourAtom;
6531
MapFlag &= ~MapColourPot;
6532
} else if( ParseColour() )
6533
{ ReDrawFlag |= RFColour;
6534
MapRGBCol[0] = RVal;
6535
MapRGBCol[1] = GVal;
6536
MapRGBCol[2] = BVal;
6537
MapFlag &= ~(MapColourPot|MapColourAtom);
6538
} else if( CurToken )
6539
{ CommandError(MsgStrs[ErrColour]);
6540
} else CommandError(MsgStrs[ErrNoCol]);
6541
ApplyMapSelection();
6548
ApplyMapSelection();
6551
else CommandError(MsgStrs[ErrSyntax]);
6554
/* map {<mapselection>} select
6555
map {<mapselection>} select atom {SearchRadius} {+|add} {-|within}
6556
map {<mapselection>} restrict atom {SearchRadius} {+|add} {-|within}
6558
The default SearchRadius is 6 Angstroms + probe radius
6559
The default is to discard all current selections first
6560
use '+' or 'add' to add to the current selections instead
6561
The default is to search through all atoms
6562
use '-' or 'within' to search through only currently selected atoms
6563
It is an error to use both add and within
6568
ApplyMapSelection();
6569
} else if (CurToken == AtomTok){
6570
int dontadd, searchwithin, SearchRadius;
6571
SearchRadius = 1000+((ProbeRadius<10)?350:ProbeRadius);
6573
searchwithin = False;
6574
while (FetchToken()) {
6575
if( CurToken==NumberTok ) {
6576
if( *TokenPtr=='.' ) {
6578
FetchFloat(TokenValue,250);
6580
if( TokenValue>7500 ) {
6581
CommandError(MsgStrs[ErrBigNum]);
6583
} else SearchRadius = (int)TokenValue;
6585
} else if( CurToken=='.' ) {
6587
if( TokenValue>7500 ){
6588
CommandError(MsgStrs[ErrBigNum]);
6590
} else SearchRadius = (int)TokenValue;
6592
} else if( CurToken == '+' || CurToken == AddTok ) {
6595
} else if( CurToken == '-' || CurToken == WithinTok) {
6596
searchwithin = True;
6599
CommandError(MsgStrs[ErrSyntax]);
6606
ApplyMapAtomSelection(dontadd,searchwithin,SearchRadius);
6607
SelectZone(SelectFlag);
6609
ReDrawFlag |= RFRefresh;
6611
else CommandError(MsgStrs[ErrSyntax]);
6617
ApplyMapSelection();
6618
ApplyMapRestriction();
6619
} else if (CurToken == AtomTok){
6620
int dontadd, searchwithin, SearchRadius;
6621
SearchRadius = 1000+((ProbeRadius<10)?350:ProbeRadius);
6623
searchwithin = False;
6624
while (FetchToken()) {
6625
if( CurToken==NumberTok ) {
6626
if( *TokenPtr=='.' ) {
6628
FetchFloat(TokenValue,250);
6630
if( TokenValue>7500 ) {
6631
CommandError(MsgStrs[ErrBigNum]);
6633
} else SearchRadius = (int)TokenValue;
6635
} else if( CurToken=='.' ) {
6637
if( TokenValue>7500 ){
6638
CommandError(MsgStrs[ErrBigNum]);
6640
} else SearchRadius = (int)TokenValue;
6642
} else if( CurToken == '+' || CurToken == AddTok) {
6645
} else if( CurToken == '-' || CurToken == WithinTok) {
6646
searchwithin = True;
6649
CommandError(MsgStrs[ErrSyntax]);
6656
ApplyMapAtomSelection(dontadd,searchwithin,SearchRadius);
6657
RestrictZone(SelectFlag);
6659
ReDrawFlag |= RFRefresh;
6661
else CommandError(MsgStrs[ErrSyntax]);
6667
ApplyMapSelection();
6670
else CommandError(MsgStrs[ErrSyntax]);
6674
default: CommandError(MsgStrs[ErrBadArg]); break;
6677
} else CommandError(MsgStrs[ErrSyntax]);
6684
if( CurToken==FalseTok )
6685
{ ReDrawFlag |= RFRefresh;
6687
} else if( (CurToken==TrueTok) || !CurToken )
6688
{ ReDrawFlag |= RFRefresh;
6689
EnableWireframe(WireFlag,0,0);
6690
} else if( CurToken==DashTok )
6691
{ ReDrawFlag |= RFRefresh;
6692
EnableWireframe(DashFlag,0,0);
6693
} else if( CurToken==NumberTok && TokenValue >=0)
6694
{ if( *TokenPtr=='.' )
6696
FetchFloat(TokenValue,250);
6699
if( TokenValue<=500 )
6700
{ if (TokenValue !=0)
6701
{ EnableWireframe(CylinderFlag,
6703
(int)((TokenValue*4)/5));
6704
ReDrawFlag |= RFRefresh;
6707
ReDrawFlag |= RFRefresh;
6710
} else CommandError(MsgStrs[ErrBigNum]);
6711
} else if( CurToken=='.' )
6712
{ FetchFloat(0,250);
6713
if( TokenValue<=500 )
6714
{ EnableWireframe(CylinderFlag,
6716
(int)((TokenValue*4)/5));
6717
ReDrawFlag |= RFRefresh;
6718
} else CommandError(MsgStrs[ErrBigNum]);
6719
} else CommandError(MsgStrs[ErrBadArg]);
6724
if( CurToken==FalseTok )
6725
{ ReDrawFlag |= RFRefresh;
6727
} else if( (CurToken==TrueTok) || !CurToken )
6728
{ ReDrawFlag |= RFRefresh;
6729
EnableBackbone(WireFlag,0,0);
6730
} else if( CurToken==DashTok )
6731
{ ReDrawFlag |= RFRefresh;
6732
EnableBackbone(DashFlag,0,0);
6733
} else if( CurToken==NumberTok && TokenValue>=0)
6734
{ if( *TokenPtr=='.' )
6736
FetchFloat(TokenValue,250);
6740
if( TokenValue<=500 )
6741
{ if (TokenValue!=0) { EnableBackbone(CylinderFlag,
6743
(int)((4*TokenValue)/5));
6744
ReDrawFlag |= RFRefresh; } else { ReDrawFlag |= RFRefresh; DisableBackbone(); } } else CommandError(MsgStrs[ErrBigNum]);
6745
} else if( CurToken=='.' )
6746
{ FetchFloat(0,250);
6747
if( TokenValue<=500 )
6748
{ EnableBackbone(CylinderFlag,
6750
(int)((4*TokenValue)/5));
6751
ReDrawFlag |= RFRefresh;
6752
} else CommandError(MsgStrs[ErrBigNum]);
6753
} else CommandError(MsgStrs[ErrBadArg]);
6759
if( CurToken==FalseTok )
6760
{ ReDrawFlag |= RFRefresh;
6762
} else if( CurToken==NumberTok )
6763
{ if( *TokenPtr=='.' )
6765
FetchFloat(TokenValue,250);
6768
if( TokenValue<=3000 )
6769
{ SetRadiusValue(MaxFun((int)TokenValue,1),
6772
ReDrawFlag |= RFRefresh;
6773
} else CommandError(MsgStrs[ErrBigNum]);
6774
} else if( CurToken=='.' )
6775
{ FetchFloat(0,250);
6776
if( TokenValue<=3000 )
6777
{ SetRadiusValue(MaxFun((int)TokenValue,1),
6780
ReDrawFlag |= RFRefresh;
6781
} else CommandError(MsgStrs[ErrBigNum]);
6782
} else if( CurToken==UserTok )
6783
{ UserMaskAttrib(MaskRadiusFlag);
6785
ReDrawFlag |= RFRefresh;
6786
} else if( CurToken==TemperatureTok )
6787
{ ReDrawFlag |= RFRefresh;
6789
SetRadiusTemperature( SphereFlag );
6790
} else if( CurToken==SolventTok )
6791
{ ReDrawFlag |= RFRefresh;
6792
SetVanWaalRadius( SphereFlag | ExpandFlag );
6793
} else if( (CurToken==TrueTok) || !CurToken )
6794
{ ReDrawFlag |= RFRefresh;
6796
SetVanWaalRadius( SphereFlag );
6797
} else CommandError(MsgStrs[ErrBadArg]);
6801
if( CurToken == SolventTok) {
6803
if( CurToken == DotsTok ) {
6804
} else if( CurToken == SolidTok ) {
6805
} else if( CurToken == NumberTok )
6806
{ if( *TokenPtr=='.' )
6808
FetchFloat(TokenValue,250);
6810
if( TokenValue<=3000 )
6811
{ ProbeRadius = (int)TokenValue;
6813
ReDrawFlag |= RFRefresh;
6814
SetVanWaalRadius( SphereFlag |
6816
} else CommandError(MsgStrs[ErrBigNum]);
6817
} else CommandError(MsgStrs[ErrBadArg]);
6819
} else if( CurToken == MoleculeTok) {
6821
if( CurToken == DotsTok ) {
6822
} else if( CurToken == SolidTok ) {
6823
} else if( CurToken == NumberTok )
6824
{ if( *TokenPtr=='.' )
6826
FetchFloat(TokenValue,250);
6828
if( TokenValue<=3000 )
6829
{ ProbeRadius = (int)TokenValue;
6831
ReDrawFlag |= RFRefresh;
6834
SetVanWaalRadius( SphereFlag | TouchFlag );
6835
else if( CurToken==NumberTok ) {
6836
if( *TokenPtr=='.' ) {
6838
FetchFloat(TokenValue,250);
6840
if( TokenValue<=3000 ) {
6841
SetRadiusValue(MaxFun((int)TokenValue,1),
6842
SphereFlag | TouchFlag);
6843
} else CommandError(MsgStrs[ErrBigNum]);
6844
} else if( CurToken=='.' ) {
6846
if( TokenValue<=3000 ) {
6847
SetRadiusValue(MaxFun((int)TokenValue,1),
6848
SphereFlag | TouchFlag);
6849
} else CommandError(MsgStrs[ErrBigNum]);
6850
} else if( CurToken==UserTok ) {
6851
UserMaskAttrib(MaskRadiusFlag);
6852
} else if( CurToken==TemperatureTok ) {
6853
ReDrawFlag |= RFRefresh;
6854
} else CommandError(MsgStrs[ErrBadArg]);
6855
/* if( MainAtomCount+HetaAtomCount > 255 ) */
6856
CreateSurfaceBonds();
6857
} else CommandError(MsgStrs[ErrBigNum]);
6858
} else CommandError(MsgStrs[ErrBadArg]);
6859
} else CommandError(MsgStrs[ErrBadArg]);
6864
if( CurToken==FalseTok )
6866
ReDrawFlag |= RFRefresh;
6868
} else if( CurToken==NumberTok )
6869
{ if( *TokenPtr=='.' )
6871
FetchFloat(TokenValue,250);
6874
if( TokenValue<=1500 )
6875
{ SetRadiusValue(MaxFun((int)TokenValue,1),
6878
ReDrawFlag |= RFRefresh;
6879
} else CommandError(MsgStrs[ErrBigNum]);
6880
} else if( CurToken=='.' )
6881
{ FetchFloat(0,250);
6882
if( TokenValue<=1500 )
6883
{ SetRadiusValue(MaxFun((int)TokenValue,1),
6886
ReDrawFlag |= RFRefresh;
6887
} else CommandError(MsgStrs[ErrBigNum]);
6888
} else if( CurToken==UserTok )
6889
{ UserMaskAttrib(MaskRadiusFlag);
6891
ReDrawFlag |= RFRefresh;
6892
} else if( CurToken==TemperatureTok )
6894
ReDrawFlag |= RFRefresh;
6895
SetRadiusTemperature( SphereFlag );
6896
} else if( (CurToken==TrueTok) || !CurToken )
6898
ReDrawFlag |= RFRefresh;
6899
SetVanWaalRadius( SphereFlag );
6900
} else CommandError(MsgStrs[ErrBadArg]);
6905
if( CurToken==FalseTok )
6906
{ ReDrawFlag |= RFRefresh;
6908
} else if( CurToken==NumberTok )
6909
{ if( *TokenPtr=='.' )
6911
FetchFloat(TokenValue,250);
6913
if( TokenValue<=750 )
6914
{ SetRadiusValue(MaxFun((int)TokenValue,1),
6916
ReDrawFlag |= RFRefresh;
6917
} else CommandError(MsgStrs[ErrBigNum]);
6918
} else if( CurToken=='.' )
6919
{ FetchFloat(0,250);
6920
if( TokenValue<=750 )
6921
{ SetRadiusValue(MaxFun((int)TokenValue,1),
6923
ReDrawFlag |= RFRefresh;
6924
} else CommandError(MsgStrs[ErrBigNum]);
6925
} else if( CurToken==UserTok )
6926
{ UserMaskAttrib(MaskRadiusFlag);
6927
ReDrawFlag |= RFRefresh;
6928
} else if( CurToken==TemperatureTok )
6929
{ ReDrawFlag |= RFRefresh;
6930
SetRadiusTemperature( StarFlag );
6931
} else if( (CurToken==TrueTok) || !CurToken )
6932
{ ReDrawFlag |= RFRefresh;
6933
SetVanWaalRadius( StarFlag );
6934
} else CommandError(MsgStrs[ErrBadArg]);
6937
case(DashTok): FetchToken();
6938
if( CurToken==FalseTok )
6939
{ ReDrawFlag |= RFRefresh;
6941
} else if( (CurToken==TrueTok) || !CurToken )
6942
{ ReDrawFlag |= RFRefresh;
6943
EnableWireframe(DashFlag,0,0);
6944
} else CommandError(MsgStrs[ErrBadArg]);
6947
case(SSBondTok): FetchToken();
6948
if( CurToken==NumberTok )
6949
{ if( *TokenPtr=='.' )
6951
FetchFloat(TokenValue,250);
6954
if( TokenValue<=500 )
6955
{ SetHBondStatus(False,True,(int)TokenValue,
6956
(int)((4*TokenValue)/5));
6957
ReDrawFlag |= RFRefresh;
6958
} else CommandError(MsgStrs[ErrBigNum]);
6959
} else if( CurToken=='.' )
6960
{ FetchFloat(0,250);
6961
if( TokenValue<=500 )
6962
{ SetHBondStatus(False,True,(int)TokenValue,
6963
(int)((4*TokenValue)/5));
6964
ReDrawFlag |= RFRefresh;
6965
} else CommandError(MsgStrs[ErrBigNum]);
6966
} else if( CurToken==FalseTok )
6967
{ ReDrawFlag |= RFRefresh;
6968
SetHBondStatus(False,False,0,0);
6969
} else if( (CurToken==TrueTok) || !CurToken )
6970
{ ReDrawFlag |= RFRefresh;
6971
SetHBondStatus(False,True,0,0);
6972
} else CommandError(MsgStrs[ErrBadArg]);
6975
case(HBondTok): FetchToken();
6976
if( CurToken==NumberTok )
6977
{ if( *TokenPtr=='.' )
6979
FetchFloat(TokenValue,250);
6982
if( TokenValue<=500 )
6983
{ SetHBondStatus(True,True,(int)TokenValue,
6984
(int)((4*TokenValue)/5));
6985
ReDrawFlag |= RFRefresh;
6986
} else CommandError(MsgStrs[ErrBigNum]);
6987
} else if( CurToken=='.' )
6988
{ FetchFloat(0,250);
6989
if( TokenValue<=500 )
6990
{ SetHBondStatus(True,True,(int)TokenValue,
6991
(int)((4*TokenValue)/5));
6992
ReDrawFlag |= RFRefresh;
6993
} else CommandError(MsgStrs[ErrBigNum]);
6994
} else if( CurToken==FalseTok )
6995
{ ReDrawFlag |= RFRefresh;
6996
SetHBondStatus(True,False,0,0);
6997
} else if( (CurToken==TrueTok) || !CurToken )
6998
{ ReDrawFlag |= RFRefresh;
6999
SetHBondStatus(True,True,0,0);
7000
} else CommandError(MsgStrs[ErrBadArg]);
7003
case(RibbonTok): FetchToken();
7004
if( CurToken==NumberTok && TokenValue>=0)
7005
{ if( *TokenPtr=='.' )
7007
FetchFloat(TokenValue,250);
7010
if( TokenValue<=1000 )
7011
{ if (TokenValue !=0)
7012
{SetRibbonStatus(True,RibbonFlag,
7014
ReDrawFlag |= RFRefresh;
7015
} else { ReDrawFlag |= RFRefresh;
7016
SetRibbonStatus(False, RibbonFlag,0);
7018
} else CommandError(MsgStrs[ErrBigNum]);
7019
} else if( CurToken=='.' )
7020
{ FetchFloat(0,250);
7021
if( TokenValue<=1000 )
7022
{ SetRibbonStatus(True,RibbonFlag,
7024
ReDrawFlag |= RFRefresh;
7025
} else CommandError(MsgStrs[ErrBigNum]);
7026
} else if( CurToken==FalseTok )
7027
{ ReDrawFlag |= RFRefresh;
7028
SetRibbonStatus(False,RibbonFlag,0);
7029
} else if( (CurToken==TrueTok) || !CurToken )
7030
{ ReDrawFlag |= RFRefresh;
7031
SetRibbonStatus(True,RibbonFlag,0);
7032
} else CommandError(MsgStrs[ErrBadArg]);
7035
case(StrandsTok): FetchToken();
7036
if( CurToken == DashTok )
7037
{ option = DashStrandFlag;
7039
} else option = StrandFlag;
7041
if( CurToken==NumberTok && TokenValue>=0)
7042
{ if( *TokenPtr=='.' )
7044
FetchFloat(TokenValue,250);
7047
if( TokenValue<=1000 )
7048
{ if (TokenValue !=0)
7049
{ SetRibbonStatus(True,option,(int)TokenValue);
7050
ReDrawFlag |= RFRefresh;
7052
ReDrawFlag |= RFRefresh;
7053
SetRibbonStatus (False,option,0);
7055
} else CommandError(MsgStrs[ErrBigNum]);
7056
} else if( CurToken=='.' )
7057
{ FetchFloat(0,250);
7058
if( TokenValue<=1000 )
7059
{ SetRibbonStatus(True,option,(int)TokenValue);
7060
ReDrawFlag |= RFRefresh;
7061
} else CommandError(MsgStrs[ErrBigNum]);
7062
} else if( CurToken==FalseTok )
7063
{ ReDrawFlag |= RFRefresh;
7064
SetRibbonStatus(False,option,0);
7065
} else if( (CurToken==TrueTok) || !CurToken )
7066
{ ReDrawFlag |= RFRefresh;
7067
SetRibbonStatus(True,option,0);
7068
} else CommandError(MsgStrs[ErrBadArg]);
7071
case(TraceTok): FetchToken();
7072
if( CurToken==FalseTok )
7073
{ ReDrawFlag |= RFRefresh;
7074
SetRibbonStatus(False,TraceFlag,80);
7075
} else if( (CurToken==TrueTok) || !CurToken )
7076
{ ReDrawFlag |= RFRefresh;
7077
SetRibbonStatus(True,TraceFlag,80);
7078
} else if( CurToken==TemperatureTok )
7079
{ ReDrawFlag |= RFRefresh;
7080
SetTraceTemperature();
7081
} else if( CurToken==DotsTok )
7082
{ ReDrawFlag |= RFRefresh;
7083
SetRibbonStatus(True,DotsFlag,80);
7084
} else if( CurToken==NumberTok && TokenValue>=0)
7085
{ if( *TokenPtr=='.' )
7087
FetchFloat(TokenValue,250);
7090
if( TokenValue<=500)
7091
{ if (TokenValue !=0)
7092
{ SetRibbonStatus(True,TraceFlag,
7094
ReDrawFlag |= RFRefresh;
7097
ReDrawFlag |= RFRefresh;
7098
SetRibbonStatus(False,TraceFlag,80);
7100
} else CommandError(MsgStrs[ErrBigNum]);
7101
} else if( CurToken=='.' )
7102
{ FetchFloat(0,250);
7103
if( TokenValue<=500 )
7104
{ SetRibbonStatus(True,TraceFlag,
7106
ReDrawFlag |= RFRefresh;
7107
} else CommandError(MsgStrs[ErrBigNum]);
7108
} else CommandError(MsgStrs[ErrBadArg]);
7111
case(CartoonTok): FetchToken();
7112
if( CurToken==NumberTok && TokenValue>=0)
7113
{ if( *TokenPtr=='.' )
7115
FetchFloat(TokenValue,250);
7118
if( TokenValue<=1000 )
7119
{ if (TokenValue !=0)
7120
{ SetRibbonStatus(True,CartoonFlag,
7122
ReDrawFlag |= RFRefresh;
7125
ReDrawFlag |= RFRefresh;
7126
SetRibbonStatus(False,CartoonFlag,0);
7128
} else CommandError(MsgStrs[ErrBigNum]);
7129
} else if( CurToken=='.' )
7130
{ FetchFloat(0,250);
7131
if( TokenValue<=1000 )
7132
{ SetRibbonStatus(True,CartoonFlag,
7134
ReDrawFlag |= RFRefresh;
7135
} else CommandError(MsgStrs[ErrBigNum]);
7136
} else if( CurToken==FalseTok )
7137
{ ReDrawFlag |= RFRefresh;
7138
SetRibbonStatus(False,CartoonFlag,0);
7139
} else if( (CurToken==TrueTok) || !CurToken )
7140
{ ReDrawFlag |= RFRefresh;
7141
SetRibbonStatus(True,CartoonFlag,0);
7142
} else CommandError(MsgStrs[ErrBadArg]);
7145
case(DotsTok): FetchToken();
7146
if( CurToken==NumberTok )
7147
{ if( TokenValue<=1000 )
7149
{ CalculateSurface((int)TokenValue);
7150
} else CalculateSurface(1);
7151
ReDrawFlag |= RFRefresh;
7152
} else CommandError(MsgStrs[ErrBigNum]);
7153
} else if( CurToken==FalseTok )
7154
{ ReDrawFlag |= RFRefresh;
7157
} else if( (CurToken==TrueTok) || !CurToken )
7158
{ ReDrawFlag |= RFRefresh;
7159
CalculateSurface(100);
7160
} else CommandError(MsgStrs[ErrBadArg]);
7163
case(MonitorTok): FetchToken();
7164
if( CurToken == NumberTok )
7165
{ temp = TokenValue;
7167
if( CurToken == ',' )
7170
if( CurToken == NumberTok )
7171
{ CreateMonitor(temp,TokenValue);
7172
ReDrawFlag |= RFRefresh;
7173
} else CommandError(MsgStrs[ErrNotNum]);
7174
} else if( CurToken == FalseTok )
7175
{ ReDrawFlag |= RFRefresh;
7177
} else if( !CurToken || CurToken == TrueTok )
7178
{ ReDrawFlag |= RFRefresh;
7179
DrawMonitDistance = True;
7180
}else CommandError(MsgStrs[ErrBadArg]);
7183
case(SlabTok): FetchToken();
7184
if( (CurToken==NumberTok) || (CurToken=='.') )
7185
{ if( CurToken==NumberTok )
7186
{ if( *TokenPtr=='.' )
7188
FetchFloat(TokenValue,100);
7189
} else TokenValue *= 100;
7190
} else FetchFloat(0,100);
7192
if( TokenValue<=10000 )
7193
{ DialValue[DialSlab] = (TokenValue-5000)/5000.0;
7194
/* UpdateScrollBars(); */
7195
ReDrawFlag |= RFSlab;
7196
UseSlabPlane = True;
7198
} else CommandError(MsgStrs[ErrBigNum]);
7200
} else if( CurToken==FalseTok )
7201
{ if( UseSlabPlane )
7202
{ ReDrawFlag |= RFRefresh;
7203
UseSlabPlane = False;
7205
} else if( !CurToken || (CurToken==TrueTok) )
7206
{ if( !UseSlabPlane )
7207
{ ReDrawFlag |= RFRefresh;
7208
UseSlabPlane = True;
7211
} else CommandError(MsgStrs[ErrSyntax]);
7214
case(DepthTok): FetchToken();
7215
if( (CurToken==NumberTok) || (CurToken=='.') )
7216
{ if( CurToken==NumberTok )
7217
{ if( *TokenPtr=='.' )
7219
FetchFloat(TokenValue,100);
7220
} else TokenValue *= 100;
7221
} else FetchFloat(0,100);
7223
if( TokenValue<=10000 )
7224
{ DialValue[DialBClip] = (TokenValue-5000)/5000.0;
7225
/* UpdateScrollBars(); */
7226
ReDrawFlag |= RFRotate;
7227
UseDepthPlane = True;
7229
} else CommandError(MsgStrs[ErrBigNum]);
7231
} else if( CurToken==FalseTok )
7232
{ if( UseDepthPlane )
7233
{ ReDrawFlag |= RFRotate;
7234
UseDepthPlane = False;
7236
} else if( !CurToken || (CurToken==TrueTok) )
7237
{ if( !UseSlabPlane )
7238
{ ReDrawFlag |= RFRotate;
7239
UseDepthPlane = True;
7242
} else CommandError(MsgStrs[ErrSyntax]);
7245
case(ZoomTok): FetchToken();
7246
if( (CurToken==NumberTok) || (CurToken=='.') )
7247
{ if( CurToken==NumberTok )
7248
{ if( *TokenPtr=='.' )
7250
FetchFloat(TokenValue,100);
7251
} else TokenValue *= 100;
7252
} else FetchFloat(0,100);
7254
if( TokenValue<=10000 )
7255
{ DialValue[DialZoom] = (TokenValue-10000)/10000.0;
7256
ReDrawFlag |= RFZoom;
7257
} else if( Database )
7258
{ /* Magnification */
7259
TokenValue -= 10000;
7260
temp = (Long)(MaxZoom*10000);
7261
if( TokenValue<=temp )
7262
{ DialValue[DialZoom] = (Real)TokenValue/temp;
7263
ReDrawFlag |= RFZoom;
7264
} else CommandError(MsgStrs[ErrBigNum]);
7266
} else if( CurToken==TrueTok )
7267
{ ReDrawFlag |= RFZoom;
7268
DialValue[DialZoom] = 0.5;
7269
} else if( !CurToken || (CurToken==FalseTok) )
7270
{ ReDrawFlag |= RFZoom;
7271
DialValue[DialZoom] = 0.0;
7272
} else CommandError(MsgStrs[ErrSyntax]);
7273
/* UpdateScrollBars(); */
7276
case(RotateTok): FetchToken();
7277
if( CurToken==XTok )
7279
} else if( CurToken==YTok )
7281
} else if( CurToken==ZTok )
7283
} else if( CurToken==BondTok )
7284
{ if (!BondSelected) {
7285
CommandError(MsgStrs[ErrNoBond]);
7290
} else if( CurToken==AllTok )
7292
} else if( CurToken==MoleculeTok )
7295
{ CommandError(MsgStrs[ErrSyntax]);
7301
(!CurToken || CurToken==FalseTok ||
7303
{ if( (option == -1 &&
7304
CurToken==FalseTok && RotMode==RotBond) ||
7306
(!CurToken || CurToken==TrueTok)) ||
7308
CurToken==FalseTok && RotMode==RotAll) )
7310
ReDrawFlag |= RFRotate;
7312
if( option == -1 && CurToken==TrueTok )
7313
{ RotMode = RotBond;
7314
ReDrawFlag |= RFRotBond;
7317
(!CurToken || CurToken==TrueTok))
7319
ReDrawFlag |= RFRotate;
7322
} else if( CurToken == '-' )
7325
} else done = False;
7330
if( (CurToken==NumberTok) || (CurToken=='.') )
7331
{ if( CurToken==NumberTok )
7332
{ if( *TokenPtr=='.' )
7334
FetchFloat(TokenValue,100);
7335
} else TokenValue *= 100;
7336
} else FetchFloat(0,100);
7339
{ if( ReDrawFlag & RFRotate )
7341
if( done ) TokenValue = -TokenValue;
7343
ReDrawFlag |= RFRotBond;
7344
BondSelected->BRotValue +=
7346
while( BondSelected->BRotValue < -1.0 )
7347
BondSelected->BRotValue += 2.0;
7348
while( BondSelected->BRotValue > 1.0 )
7349
BondSelected->BRotValue -= 2.0;
7354
CommandError(MsgStrs[ErrSyntax]);
7357
if (RotMode == RotAll) {
7358
xtemp = WorldDialValue[option];
7360
xtemp = DialValue[option];
7363
ReDrawFlag |= (1<<option);
7365
xtemp += TokenValue/18000.0;
7372
if (RotMode == RotAll) {
7373
WorldDialValue[option] = xtemp;
7375
DialValue[option] = xtemp;
7380
ReDrawFlag |= RFRefresh;
7382
} else if (CurToken == ResetTok) {
7384
BondSelected->BRotValue = 0.0;
7385
ReDrawFlag |=RFRotBond;
7387
ReDrawFlag |= (1<<option);
7388
if (RotMode == RotAll) {
7389
WorldDialValue[option] = 0.0;
7391
DialValue[option] = 0.0;
7396
ReDrawFlag |= RFRefresh;
7397
} else CommandError(MsgStrs[ErrNotNum]);
7402
if( CurToken==XTok )
7404
} else if( CurToken==YTok )
7406
} else if( CurToken==ZTok )
7409
{ CommandError(MsgStrs[ErrSyntax]);
7414
if( CurToken == '-' )
7417
} else done = False;
7423
if( (CurToken==NumberTok) || (CurToken=='.') )
7424
{ if( CurToken==NumberTok )
7425
{ if( *TokenPtr=='.' )
7427
FetchFloat(TokenValue,100);
7428
} else TokenValue *= 100;
7429
} else FetchFloat(0,100);
7431
if( TokenValue<=10000 )
7434
ReDrawFlag |= RFTrans;
7435
if( done ) TokenValue = -TokenValue;
7436
wtemp = TokenValue/10000.0;
7437
if( RotMode == RotAll && option == 4 ) {
7438
WorldDialValue[DialTX] = wtemp;
7440
if( RotMode == RotAll && option == 5 ) {
7441
WorldDialValue[DialTY] = wtemp;
7443
if( RotMode == RotAll && option == 6 ) {
7444
WorldDialValue[DialTZ] = wtemp;
7446
DialValue[option] = TokenValue/10000.0;
7451
/* UpdateScrollBars(); */
7452
} else CommandError(MsgStrs[ErrBigNum]);
7453
} else CommandError(MsgStrs[ErrNotNum]);
7456
case(StereoTok): FetchToken();
7457
if( !CurToken || (CurToken==TrueTok) )
7458
{ SetStereoMode(True);
7459
} else if( CurToken==FalseTok )
7460
{ SetStereoMode(False);
7461
} else if( CurToken == '-' )
7462
{ if( !NextIf(NumberTok,ErrNotNum) )
7463
{ StereoAngle = -TokenValue;
7464
SetStereoMode(True);
7466
} else if( CurToken==NumberTok )
7467
{ StereoAngle = TokenValue;
7468
SetStereoMode(True);
7470
CommandError(MsgStrs[ErrSyntax]);
7473
if (StereoAngle > 60.) {
7475
CommandError(MsgStrs[ErrBigNum]);
7478
if (StereoAngle < -60.) {
7480
CommandError(MsgStrs[ErrBigNum]);
7485
case(ResizeTok): FetchToken();
7488
case(ResetTok): for( i=0; i<10; i++ )
7490
ReDrawFlag |= RFDials;
7493
/* ReDrawFlag |= RFRefresh|RFColour; */
7494
/* DisplayMode = 0; */
7501
case(HelpTok): if( !HelpFileName )
7508
case(LabelTok): FetchToken();
7509
if( !CurToken || (CurToken==TrueTok) )
7510
{ if( Info.chaincount>1 )
7511
{ DefineLabels("%n%r:%c.%a%A");
7512
} else if( MainGroupCount>1 )
7513
{ DefineLabels("%n%r.%a%A");
7514
} else DefineLabels("%e%i%A");
7515
} else if( CurToken==FalseTok )
7517
} else if( CurToken!=StringTok )
7518
{ DefineLabels(TokenStart);
7520
} else DefineLabels(TokenIdent);
7521
ReDrawFlag |= RFRefresh;
7524
case(EchoTok): FetchToken();
7525
InvalidateCmndLine();
7526
if( CurToken==StringTok )
7527
{ WriteString(TokenIdent);
7528
} else if( CurToken )
7529
WriteString(TokenStart);
7534
case(DefineTok): FetchToken();
7535
if( CurToken != IdentTok )
7536
{ CommandError(MsgStrs[ErrSetName]);
7540
param = (char*)malloc(TokenLength+1);
7542
{ memcpy(param,TokenIdent,TokenLength+1);
7544
{ QueryExpr = ParseExpression(0);
7546
{ done = DefineSetExpr(param,QueryExpr);
7548
} else done = DefineSetExpr(param,(Expr*)NULL);
7549
} else done = False;
7552
CommandError(MsgStrs[ErrBadSet]);
7555
case(BackgroundTok):
7557
if( CurToken == TransparentTok )
7558
{ UseTransparent = True;
7559
} else if( CurToken == NormalTok )
7560
{ UseTransparent = False;
7561
} else if( ParseColour() )
7562
{ ReDrawFlag |= RFColour;
7569
} else if( CurToken )
7570
{ CommandError(MsgStrs[ErrColour]);
7571
} else CommandError(MsgStrs[ErrNoCol]);
7576
int newPlayFrom, newPlayUntil;
7578
newPlayFrom = PlayFrom;
7579
newPlayUntil = PlayUntil;
7580
if (PlayTemplate[0]==0){
7586
if (CurToken == FromTok) {
7588
if( (CurToken==NumberTok) || (CurToken=='.') ) {
7589
if( CurToken==NumberTok ) {
7590
if( *TokenPtr=='.' ) {
7592
FetchFloat(TokenValue,1000);
7593
} else TokenValue *= 1000;
7594
} else FetchFloat(0,1000);
7595
newPlayFrom = (double)TokenValue;
7596
PlayFrom = newPlayFrom;
7598
CommandError(MsgStrs[ErrSyntax]);
7601
} else if (CurToken == UntilTok) {
7603
if( (CurToken==NumberTok) || (CurToken=='.') ) {
7604
if( CurToken==NumberTok ) {
7605
if( *TokenPtr=='.' ) {
7607
FetchFloat(TokenValue,1000);
7608
} else TokenValue *= 1000;
7609
} else FetchFloat(0,1000);
7610
newPlayUntil = (double)TokenValue;
7611
PlayUntil = newPlayUntil;
7613
CommandError(MsgStrs[ErrSyntax]);
7616
} else if (CurToken == OnTok){
7620
if( (option==RasMolTok) || (option==ScriptTok)
7621
|| (IsMoleculeToken(option))
7622
|| (IsImageToken(option)) )
7623
{ if( !*TokenPtr || *TokenPtr==' ' )
7624
suboption = FetchToken();
7625
if (suboption == MirrorTok || suboption == RotateTok)
7626
{ if (!*TokenPtr || *TokenPtr==' ')
7633
{ CommandError(MsgStrs[ErrFilNam]);
7635
} else if( CurToken==StringTok )
7636
{ ProcessFileName(TokenIdent);
7638
ProcessFileName(TokenStart);
7641
if (ConvPRTemplate(PlayTemplate,DataFileName,1024,&PlayMaxMS)) {
7642
CommandError(MsgStrs[StrCLong]);
7645
PlayOption = option;
7646
PlaySubOption = suboption;
7648
if (play_fps <= 0.) play_fps = 24.;
7649
play_frame[0] = play_frame[1] = 0;
7650
PlayFrom = newPlayFrom;
7651
PlayUntil = newPlayUntil;
7652
if (PlayUntil == 0) PlayUntil = PlayMaxMS-1.;
7653
if (PlayUntil > PlayMaxMS-1. && PlayMaxMS > 1.) PlayUntil = PlayMaxMS-1.;
7654
} else if (CurToken == OffTok ) {
7657
if (!CurToken) break;
7658
PlayTemplate[0] = 0;
7660
CommandError(MsgStrs[ErrSyntax]);
7663
if (CurToken) FetchToken();
7664
} while (CurToken != 0);
7665
if (!PlayPause && PlayTemplate[0] != '\0') PlayMovie();
7671
int newRecordFrom, newRecordUntil;
7673
newRecordFrom = RecordFrom;
7674
newRecordUntil = RecordUntil;
7675
if (RecordTemplate[0]==0){
7677
newRecordUntil = -1;
7680
if( (FileDepth!=-1) && LineStack[FileDepth] )
7681
{ CommandError(MsgStrs[ErrInScrpt]);
7685
CommandError(MsgStrs[ErrBadMolDB]);
7690
if (CurToken == FromTok) {
7692
if( (CurToken==NumberTok) || (CurToken=='.') ) {
7693
if( CurToken==NumberTok ) {
7694
if( *TokenPtr=='.' ) {
7696
FetchFloat(TokenValue,1000);
7697
} else TokenValue *= 1000;
7698
} else FetchFloat(0,1000);
7699
newRecordFrom = (double)TokenValue;
7700
RecordFrom = newRecordFrom;
7702
CommandError(MsgStrs[ErrSyntax]);
7705
} else if (CurToken == UntilTok) {
7707
if( (CurToken==NumberTok) || (CurToken=='.') ) {
7708
if( CurToken==NumberTok ) {
7709
if( *TokenPtr=='.' ) {
7711
FetchFloat(TokenValue,1000);
7712
} else TokenValue *= 1000;
7713
} else FetchFloat(0,1000);
7714
newRecordUntil = (double)TokenValue;
7715
RecordUntil = newRecordUntil;
7717
CommandError(MsgStrs[ErrSyntax]);
7720
} else if (CurToken == OnTok){
7724
if( (option==RasMolTok) || (option==ScriptTok)
7725
|| (IsMoleculeToken(option))
7726
|| (IsImageToken(option)) )
7727
{ if( !*TokenPtr || *TokenPtr==' ' )
7728
suboption = FetchToken();
7729
if (suboption == MirrorTok || suboption == RotateTok)
7730
{ if (!*TokenPtr || *TokenPtr==' ')
7737
{ CommandError(MsgStrs[ErrFilNam]);
7739
} else if( CurToken==StringTok )
7740
{ ProcessFileName(TokenIdent);
7742
ProcessFileName(TokenStart);
7745
if (ConvPRTemplate(RecordTemplate,DataFileName,1024,&RecordMaxMS)) {
7746
CommandError(MsgStrs[StrCLong]);
7749
RecordOption = option;
7750
RecordSubOption = suboption;
7752
record_frame[0] = record_frame[1] = 0;
7753
if (record_fps <= 0.) record_fps = 24.;
7754
RecordFrom = newRecordFrom;
7755
RecordUntil = newRecordUntil;
7756
if (RecordUntil == 0) RecordUntil = RecordMaxMS-1.;
7757
if (RecordUntil > RecordMaxMS-1. && RecordMaxMS > 1.) RecordUntil = RecordMaxMS-1.;
7758
} else if (CurToken == OffTok ) {
7761
if (!CurToken) break;
7762
RecordTemplate[0] = 0;
7763
} else if (CurToken == MotionTok || CurToken==MouseTok) {
7765
if (CurToken ==0 || CurToken == OnTok) {
7766
record_on[0] = True;
7767
} else if (CurToken == OffTok ){
7768
record_on[0] = False;
7770
} else if (CurToken == AppearanceTok ) {
7772
if (CurToken ==0 || CurToken == OnTok) {
7773
record_on[1] = True;
7774
} else if (CurToken == OffTok ){
7775
record_on[1] = False;
7779
CommandError(MsgStrs[ErrSyntax]);
7782
if (CurToken) FetchToken();
7783
} while (CurToken != 0);
7789
case(SaveTok): i = CurToken; /* Save keyword! */
7791
if( (FileDepth!=-1) && LineStack[FileDepth] )
7792
{ CommandError(MsgStrs[ErrInScrpt]);
7796
CommandError(MsgStrs[ErrBadMolDB]);
7800
option = FetchToken();
7802
if( (option==RasMolTok) || (option==ScriptTok)
7803
|| (IsMoleculeToken(option))
7804
|| (IsImageToken(option)) )
7805
{ if( !*TokenPtr || *TokenPtr==' ' )
7806
suboption = FetchToken();
7807
if (suboption == MirrorTok || suboption == RotateTok)
7808
{ if (!*TokenPtr || *TokenPtr==' ')
7812
} else if( i==SaveTok )
7817
{ CommandError(MsgStrs[ErrFilNam]);
7819
} else if( CurToken==StringTok )
7820
{ ProcessFileName(TokenIdent);
7821
} else ProcessFileName(TokenStart);
7822
param = DataFileName;
7825
if( !IsMoleculeToken(option) )
7826
{ if( ReDrawFlag ) {
7828
ReDrawFlag = NextReDrawFlag;
7830
WriteImageFile( param, option, suboption );
7832
} else switch(option)
7834
case(PDBTok): SavePDBMolecule(param); break;
7835
case(MDLTok): SaveMDLMolecule(param); break;
7836
case(XYZTok): SaveXYZMolecule(param); break;
7837
case(CIFTok): SaveCIFMolecule(param); break;
7839
case(CEXTok): SaveCEXMolecule(param); break;
7841
case(AlchemyTok): SaveAlchemyMolecule(param);
7846
case(ScriptTok): FetchToken();
7847
if( FileDepth<STACKSIZE )
7849
{ CommandError(MsgStrs[ErrFilNam]);
7851
} else if( CurToken==StringTok )
7852
{ ProcessFileName(TokenIdent);
7853
} else ProcessFileName(TokenStart);
7856
script = fopen(DataFileName,"rb");
7857
LoadScriptFile(script,DataFileName);
7858
} else CommandError(MsgStrs[ErrScript]);
7861
case(RenumTok): FetchToken();
7863
{ if( CurToken=='-' )
7866
} else done = False;
7868
if( CurToken == NumberTok )
7870
{ RenumberMolecule(-(int)TokenValue);
7871
} else RenumberMolecule((int)TokenValue);
7872
} else CommandError(MsgStrs[ErrNotNum]);
7873
} else RenumberMolecule(1);
7878
if( !CurToken || (CurToken==FalseTok) )
7879
{ DetermineStructure(False);
7880
} else if( CurToken==TrueTok )
7881
{ DetermineStructure(True);
7882
} else CommandError(MsgStrs[ErrSyntax]);
7887
if( AcceptData[FileDepth] == 'Y' ) {
7888
if( (FileDepth != -1) && LineStack[FileDepth] ) {
7889
Recycle = &CurLine[0];
7892
if (SetNewMolecule()){
7893
ProcessFile(FormatPDB,False,
7894
FileStack[FileDepth]);
7896
CommandError(MsgStrs[ErrBadLoad]);
7901
if (SetNewMolecule()){
7902
ProcessFile(FormatCIF,False,
7903
FileStack[FileDepth]);
7905
CommandError(MsgStrs[ErrBadLoad]);
7909
DefaultRepresentation();
7911
CommandError(MsgStrs[ErrOutScrpt]);
7917
case(ExitTok): return( ExitTok );
7918
case(QuitTok): return( QuitTok );
7919
default: CommandError(MsgStrs[StrUnrec]);
7925
CommandError(MsgStrs[StrIgnore]);
7931
int ExecuteIPCCommand( char __huge *ptr )
7933
auto char buffer[256];
7934
register int stat,result;
7935
register int len,depth;
7938
/* Ignore IPC commands while paused! */
7939
if( IsPaused ) return 0;
7944
*NameStack = "IPC Error";
7946
/* Save command line */
7947
strcpy(buffer,CurLine);
7949
while( *ptr && (*ptr==' ') )
7953
{ while( *ptr++ == '[' )
7964
} else if( *ptr=='[' )
7967
if( len < MAXBUFFLEN-1 )
7974
if( len < MAXBUFFLEN-1 )
7975
{ stat = ExecuteCommand();
7976
if( stat == QuitTok )
7977
{ result = IPC_Quit;
7981
{ InvalidateCmndLine();
7982
WriteString(MsgStrs[StrRCLong]);
7985
while( *ptr && ((*ptr==' ')||(*ptr==';')) )
7992
{ if( len < MAXBUFFLEN-1 )
7999
if( len < MAXBUFFLEN-1 )
8000
{ stat = ExecuteCommand();
8001
if( stat == QuitTok )
8002
{ result = IPC_Quit;
8006
{ InvalidateCmndLine();
8007
WriteString(MsgStrs[StrRCLong]);
8013
{ strcpy(CurLine,buffer);
8014
if( !result ) result = IPC_Error;
8020
void InitialiseCommand( void )
8024
for (ii=0; ii < 256; ii++) Defer_Symbols[ii] = (Symbol __far *)NULL;
8025
FreeSymbol = (Symbol __far *)NULL;
8026
HelpFileName = NULL;
8027
FreeInfo = (void __far*)0;
8028
HelpInfo = (void __far*)0;
8037
/* Movie and animation intialization */
8039
play_fps = record_fps = 24.; /* default to 24 fps */;
8040
record_aps = 10.; /* default to 10 Angstroms per second */
8041
record_on[0] = record_on[1] = False;
8042
/* default, not recording motion or appearance */
8043
record_frame[0] = record_frame[1] = 0;
8044
/* start the overall and dwell frame counts at 0 */
8045
play_frame[0] = play_frame[1] = 0;
8047
record_dwell = 0.5; /* dwell half second per command (12 frames) */
8048
RecordTemplate[0] = 0; /* no initial recording */
8049
PlayTemplate[0] = 0; /* no initial playback */
8050
RecordCurrent = RecordFrom = RecordUntil
8051
= PlayCurrent = PlayFrom = PlayUntil = RecordMaxMS = PlayMaxMS = 0.;