NCBI C Toolkit Cross Reference

C/cn3d/cn3dsave.c


  1 /*   cn3dsave.c
  2 * ===========================================================================
  3 *
  4 *                            PUBLIC DOMAIN NOTICE
  5 *            National Center for Biotechnology Information (NCBI)
  6 *
  7 *  This software/database is a "United States Government Work" under the
  8 *  terms of the United States Copyright Act.  It was written as part of
  9 *  the author's official duties as a United States Government employee and
 10 *  thus cannot be copyrighted.  This software/database is freely available
 11 *  to the public for use. The National Library of Medicine and the U.S.
 12 *  Government do not place any restriction on its use or reproduction.
 13 *  We would, however, appreciate having the NCBI and the author cited in
 14 *  any work or product based on this material
 15 *
 16 *  Although all reasonable efforts have been taken to ensure the accuracy
 17 *  and reliability of the software and data, the NLM and the U.S.
 18 *  Government do not and cannot warrant the performance or results that
 19 *  may be obtained by using this software or data. The NLM and the U.S.
 20 *  Government disclaim all warranties, express or implied, including
 21 *  warranties of performance, merchantability or fitness for any particular
 22 *  purpose.
 23 *
 24 * ===========================================================================
 25 *
 26 * File Name:  cn3dsave.c
 27 *
 28 * Author:  Christopher Hogue, Yanli Wang, Lewis Geer
 29 *
 30 * First Version Creation Date:   1/31/96
 31 *
 32 * $Revision: 6.32 $
 33 *
 34 * File Description: Cn3d file saving routines 
 35 *                   
 36 *
 37 * Modifications:  
 38 * --------------------------------------------------------------------------
 39 * Date     Name        Description of modification
 40 * -------  ----------  -----------------------------------------------------
 41 * $Log: cn3dsave.c,v $
 42 * Revision 6.32  2001/04/27 20:08:02  juran
 43 * Heed warnings.
 44 *
 45 * Revision 6.31  2000/07/21 18:55:14  thiessen
 46 * allow dynamic slave->master transformation
 47 *
 48 * Revision 6.30  2000/04/19 17:56:48  thiessen
 49 * added background color in OpenGL
 50 *
 51 * Revision 6.29  2000/04/17 15:54:26  thiessen
 52 * add cylinder arrows; misc graphics tweaks
 53 *
 54 * Revision 6.28  2000/04/12 19:53:37  lewisg
 55 * sequence saving uses genbank class
 56 *
 57 * Revision 6.27  2000/04/08 00:37:30  lewisg
 58 * multiple seqentries, NEWSEQ message, etc.
 59 *
 60 * Revision 6.26  2000/03/29 23:38:06  lewisg
 61 * hide/show, fixes to saving and opening
 62 *
 63 * Revision 6.25  2000/03/28 19:28:13  lewisg
 64 * prep new imported sa
 65 *
 66 * Revision 6.24  2000/03/27 22:15:05  lewisg
 67 * add show/hide row dialog
 68 *
 69 * Revision 6.23  2000/03/23 14:53:04  thiessen
 70 * fix bug in viewer3d camera; added conservation color algorithm to ARS
 71 *
 72 * Revision 6.22  2000/03/22 23:17:50  thiessen
 73 * added ability to save ARS in ASN1
 74 *
 75 * Revision 6.21  2000/03/21 21:41:03  lewisg
 76 * enable saving of full cdd's, visual c++ updates
 77 *
 78 * Revision 6.20  2000/03/17 22:48:59  thiessen
 79 * fix for multi-chain / multi-model features ; added feature-move ; misc bug fixes
 80 *
 81 * Revision 6.19  2000/03/08 21:46:14  lewisg
 82 * cn3d saves viewport, misc bugs
 83 *
 84 * Revision 6.18  2000/02/19 21:25:57  thiessen
 85 * split of cn3dmodl into cn3dmodl and cn3dstyl
 86 *
 87 * Revision 6.17  1999/11/22 14:46:44  thiessen
 88 * moved _OPENGL code blocks to only vibrant and ncbicn3d libraries
 89 *
 90 * Revision 6.16  1999/11/11 01:18:40  kans
 91 * cannot valnodeaddpointer to a seqannot - reverting to old instructions for now
 92 *
 93 * Revision 6.15  1999/11/10 23:19:42  lewisg
 94 * rewrite of selection code for ddv
 95 *
 96 * Revision 6.14  1999/10/29 14:15:30  thiessen
 97 * ran all Cn3D source through GNU Indent to prettify
 98 *
 99 * Revision 6.13  1999/10/18 15:32:50  lewisg
100 * move ClearSequences() to cn3dshim.c
101 *
102 * Revision 6.12  1999/10/05 23:18:24  lewisg
103 * add ddv and udv to cn3d with memory management
104 *
105 * Revision 6.11  1999/08/04 21:18:01  lewisg
106 * modularized open operations to allow sequin to launch cn3d
107 *
108 * Revision 6.10  1999/07/01 22:14:47  ywang
109 * back to previous version to use EntrezSeqEntryGet to get sequences for additional loading, before this free existant sequences
110 *
111 * Revision 6.9  1999/07/01 21:44:31  ywang
112 * work around EntrezSeqEntryGet core dump on redunant sequence loading and free existant sequences before additional loading
113 *
114 * Revision 6.8  1999/07/01 14:09:05  ywang
115 * *** empty log message ***
116 *
117 * Revision 6.7  1999/07/01 14:07:25  ywang
118 * cn3dwin.c
119 *
120 * Revision 6.6  1999/06/03 21:31:48  ywang
121 * fix bug for saving structures--get MS coordinates back for the current run after creating ASN.1 for saving
122 *
123 * Revision 6.5  1999/03/19 19:20:11  kans
124 * prototype needed for Cn3DAddUserDefinedFeature
125 *
126 * Revision 6.4  1999/03/18 22:28:58  ywang
127 * add functions for saveout+readin+index user defined features
128 *
129 * Revision 6.3  1999/03/18 21:04:28  lewisg
130 * reverse transform for saving
131 *
132 * Revision 6.2  1999/02/26 15:44:07  kans
133 * boolean initialized to false, not null
134 *
135 * Revision 6.1  1999/02/25 23:13:41  ywang
136 * make cn3d export the entire input mime data
137 *
138  * Revision 6.0  1997/08/25  18:13:42  madden
139  * Revision changed to 6.0
140  *
141 * Revision 5.1  1996/07/22 00:28:11  hogue
142 * Fixed binary ASN.1 saving.
143 *
144  * Revision 5.0  1996/05/28  14:05:44  ostell
145  * Set to revision 5.0
146  *
147  * Revision 1.3  1996/04/18  17:02:20  hogue
148  * removed temporary reference to mmdbapi4.h
149  *
150  * Revision 1.2  1996/02/02  19:40:41  hogue
151  * Initial Revision
152  *
153 *
154 * ==========================================================================
155 */
156 
157 #include <vibrant.h>
158 #include <mmdbapi.h>
159 #include <mmdbapi1.h>
160 #include <cn3dmain.h>
161 #include <algorend.h>
162 #include <cn3dsave.h>
163 #include <cn3dmsel.h>
164 #include <cn3dmsg.h>
165 #include <asnmime.h>
166 #include <objmime.h>
167 #include <cn3dopen.h>
168 #include <cn3dshim.h>
169 #include <cn3dmodl.h>
170 #include <cn3dstyl.h>
171 #include <alignmgr.h>
172 
173 
174 static void Cn3D_AddGlobalRenderSettingsToBiostruc(PDNMS pdnms);
175 static void Cn3D_RemoveGlobalRenderSettingsFromBiostruc(PDNMS pdnms);
176 
177 static Boolean Cn3D_Save_InUse = FALSE;
178 
179 static WindoW Cn3D_wAsnSave;
180 static TexT Cn3D_tAsnSave;
181 static ButtoN Cn3D_bAsnBrowse;
182 static ButtoN Cn3D_bAsnOk;
183 static GrouP Cn3D_gBinAscii;
184 static ButtoN Cn3D_bFeatOn;
185 
186 
187 static void Cn3D_AsnEnableProc(TexT t)
188 {
189     Char str[32];
190     GetTitle(Cn3D_tAsnSave, str, sizeof(str));
191     if (StringLen(str) == 0) {
192         Disable(Cn3D_bAsnOk);
193     } else {
194         Enable(Cn3D_bAsnOk);
195     }
196     return;
197 }
198 
199 #ifdef _OPENGL
200 
201 
202 static void Cn3D_AddMatrix(void)
203 {
204     PMSD pmsdThis;
205     PDNMS pdnmsMaster;
206     BiostrucFeatureSetPtr bsfsp = NULL, bsfsp_new = NULL;
207     BiostrucFeature *bsfp;
208     Camera *camera;
209 
210     pdnmsMaster = GetSelectedModelstruc();
211     if(pdnmsMaster == NULL) return;
212     pmsdThis = pdnmsMaster->data.ptrvalue;
213     bsfp = Cn3D_FindFeature(pmsdThis->pbsBS->features,
214         Feature_type_camera, 1);
215 
216     if(bsfp == NULL) {
217         bsfsp = Cn3D_AddFeatureSet(&pmsdThis->pbsBS->features);
218         if(bsfsp == NULL) return;
219         bsfp = BiostrucFeatureNew();
220         if(bsfp == NULL) return;
221         bsfsp->features = bsfp;
222         bsfp->type = Feature_type_camera;
223         camera = CameraNew();
224         camera->modelview = GLMatrixNew();
225         ValNodeAddPointer(&bsfp->Property_property,
226             Property_property_camera, camera);
227     }
228     else camera = (Camera *)bsfp->Property_property->data.ptrvalue;
229 
230     Cn3D_Matrix2Asn(camera->modelview, Cn3D_ColorData.OGL_Data->ModelMatrix);
231     camera->scale = (Int4)VIEWSCALE;
232     camera->distance = (Int4)(Cn3D_ColorData.OGL_Data->CameraDistance * camera->scale);
233     camera->angle = (Int4)(Cn3D_ColorData.OGL_Data->CameraAngle * camera->scale);
234     camera->x = (Int4)(Cn3D_ColorData.OGL_Data->CameraDirection[0] * camera->scale);
235     camera->y = (Int4)(Cn3D_ColorData.OGL_Data->CameraDirection[1] * camera->scale);
236 }
237 
238 #endif /* _OPENGL */
239 
240 
241 static void Cn3D_AsnBrowseProc(ButtoN b)
242 {
243     Char dfault[32];
244     Char path[256];
245 
246     path[0] = '\0';
247     dfault[0] = '\0';
248     if (GetOutputFileName(path, sizeof(path), dfault)) {
249         SetTitle(Cn3D_tAsnSave, path);
250         Cn3D_AsnEnableProc(NULL);
251     }
252     return;
253 }
254 
255 static ValNode *Cn3D_GetSubSet(ValNode *pvnsep, SeqAnnot *sap)
256 {
257     BioseqSet *bssp;
258     SeqAlign *salp = NULL;
259     Int4 i, n;
260     SeqId *sip = NULL, *isip;
261     SeqEntry *sep = NULL, *isep;
262     ValNode *pvn, *pvnPrev;
263 
264     if(sap == NULL) return NULL;
265     if(sap) salp = sap->data;
266     if(salp) {
267         sep = SeqEntryNew();
268         bssp = BioseqSetNew();
269         if (bssp == NULL) return NULL;
270         bssp->_class = BioseqseqSet_class_genbank;
271         sep->data.ptrvalue = bssp;
272         sep->choice = 2;
273 
274         pvnPrev = NULL;
275         for(pvn = ((BioseqSet *)pvnsep->data.ptrvalue)->seq_set;
276                 pvn != NULL; pvn = pvn->next) {
277             isep = SeqEntryNew();
278             isep->choice = pvn->choice;
279             isep->data.ptrvalue = pvn->data.ptrvalue;
280             if(pvnPrev) pvnPrev->next = isep;
281             else bssp->seq_set = isep;
282             pvnPrev = isep;
283         }
284 
285         salp = ViewMgr_GetBeginIndexed(salp);
286         if(salp == NULL) return NULL;
287         sip = AlnMgrGetUniqueSeqs(salp, &n);
288         for(i = 1, isip = sip->next; i < n; i++, isip = isip->next) {
289             isep->next = SeqEntryNew();
290             isep = isep->next;
291             isep->data.ptrvalue = BioseqLockById(isip);
292             isep->choice = 1;
293             BioseqUnlock((Bioseq *)isep->data.ptrvalue);
294         }
295         SeqIdSetFree(sip);
296         isep->next = NULL;
297         return sep;  /* need cleanup */
298     }
299     return NULL;
300 }
301 
302 static void Cn3D_ClearSubSet(ValNode * sep)
303 {
304     BioseqSet *bssp;
305     
306     if(sep) {
307         if(sep->data.ptrvalue) {
308             bssp = (BioseqSet *)sep->data.ptrvalue;
309             bssp->seq_set = ValNodeFree(bssp->seq_set);
310             sep->data.ptrvalue = BioseqSetFree(bssp);
311         }
312         ValNodeFree(sep);
313     }
314 }
315 
316 static SeqAnnot * Cn3D_MakeSaveAnnot(SeqAnnot *sap)
317 {
318     SeqAlign *salp;
319     SeqAnnot *sapout, *saphead = NULL;
320 
321     /* index the seq aligns */
322     for (; sap != NULL; sap = sap->next) {
323         if (sap->data == NULL) continue;
324         if(saphead == NULL) saphead = sapout = SeqAnnotNew();
325         else {
326             sapout->next = SeqAnnotNew();
327             sapout = sapout->next;
328         }
329         salp = sap->data;
330         sapout->data = ViewMgr_GetBegin(salp);
331         sapout->desc = sap->desc;
332         sapout->type = sap->type;
333     }
334     return saphead;
335 }
336 
337 static void Cn3D_ClearSaveAnnot(SeqAnnot *sap)
338 {
339     SeqAnnot *sapprev;
340 
341     while (sap != NULL) {
342         sap->data = NULL;
343         sap->desc = NULL;
344         sap->type = 0;
345         sapprev = sap;
346         sap = sap->next;
347         SeqAnnotFree(sapprev);
348     }
349 }
350 
351 static void Cn3D_ExportAsnNow(ButtoN b)
352 {
353 
354     Char path[256];
355     Int2 iTest;
356     Int4 iCount = 0;
357     CharPtr pcSave = NULL;
358     Byte bSave = 0;
359 
360     Int2Ptr i2Vec = NULL;
361 
362     Boolean iCn3d = TRUE, FirstSlave = FALSE;
363     CharPtr pcSaveMode = NULL;
364 
365     PDNMS pdnmsMaster = NULL, pdnmsSlave = NULL;
366     PMSD pmsdSlave = NULL, pmsdMaster = NULL;
367     NcbiMimeAsn1Ptr mime = NULL;
368     BiostrucAlignPtr bsap = NULL;
369     BiostrucSeqPtr bssp = NULL;
370     BiostrucSeqsPtr bsssp = NULL;
371     BiostrucPtr bsSlaveHead = NULL, bsSlave = NULL, bsSlaveTail = NULL;
372     BiostrucFeaturePtr pbsfThis;
373     /*PDNTRN pdnTransform = NULL;*/
374     AsnIoPtr aip = NULL;
375     PDNML pdnmlThis = NULL;
376 
377 /*   if (GetStatus(Cn3D_bFeatOn) == FALSE)
378        bSave = (Byte) (bSave | (Byte) NOT_FEATURES);  */
379     /* save feature always for now -yanli */
380 #ifdef _OPENGL
381     Cn3D_AddMatrix();
382 #endif
383     if (GetValue(Cn3D_gBinAscii) == 2)
384         bSave = (Byte) (bSave | (Byte) SAVE_BINARY);
385 
386     if (bSave & (Byte) SAVE_BINARY)
387         pcSaveMode = SAVE_BINARY_STRING;
388     else
389         pcSaveMode = SAVE_ASCII_STRING;
390 
391     i2Vec = PickedModels(&iCount);
392     GetTitle(Cn3D_tAsnSave, path, sizeof(path));
393     pdnmsMaster = GetSelectedModelstruc();
394     iTest =
395         WriteAsnModelList(pdnmsMaster, iCount, i2Vec, path, bSave, iCn3d);
396     if (!iTest) {
397         ErrClear();
398         ErrPostEx(SEV_FATAL, 0, 0,
399                   "Unable to Export\nPossibly Corrupt Data in Memory!\n");
400         ErrShow();
401 
402     }
403     Cn3D_AddGlobalRenderSettingsToBiostruc(pdnmsMaster);
404     Cn3DAddUserDefinedFeatureToBiostruc(pdnmsMaster);
405 
406     pmsdMaster = pdnmsMaster->data.ptrvalue;
407 
408     aip = AsnIoOpen(path, pcSaveMode);
409 
410     mime = (NcbiMimeAsn1Ptr) ValNodeNew(NULL);
411     switch (pmsdMaster->iMimeType) {
412     case NcbiMimeAsn1_entrez:
413         BiostrucAsnWrite(pmsdMaster->pbsBS, aip, NULL);
414         break;
415     case NcbiMimeAsn1_strucseq:
416         mime->choice = NcbiMimeAsn1_strucseq;
417         bssp = BiostrucSeqNew();
418         bssp->structure = pmsdMaster->pbsBS;
419         bssp->sequences = Cn3D_ColorData.pvnsep;
420         mime->data.ptrvalue = bssp;
421         NcbiMimeAsn1AsnWrite(mime, aip, NULL);
422         break;
423     case NcbiMimeAsn1_strucseqs:
424         mime->choice = NcbiMimeAsn1_strucseqs;
425         bsssp = BiostrucSeqsNew();
426         bsssp->structure = pmsdMaster->pbsBS;
427         bsssp->sequences = Cn3D_GetSubSet(Cn3D_ColorData.pvnsep, Cn3D_ColorData.sap);
428         bsssp->seqalign = Cn3D_MakeSaveAnnot(Cn3D_ColorData.sap);
429         mime->data.ptrvalue = bsssp;
430         NcbiMimeAsn1AsnWrite(mime, aip, NULL);
431         Cn3D_ClearSaveAnnot(bsssp->seqalign);
432         Cn3D_ClearSubSet(bsssp->sequences);
433         break;
434     case NcbiMimeAsn1_alignstruc:
435         mime->choice = NcbiMimeAsn1_alignstruc;
436         bsap = BiostrucAlignNew();
437         bsap->master = pmsdMaster->pbsBS;
438         pdnmsSlave = pmsdMaster->pdnmsSlaves;
439         FirstSlave = TRUE;
440 
441         pbsfThis =
442             (BiostrucFeaturePtr) pmsdMaster->psaStrucAlignment->features->
443             features;
444 
445 
446         while (pdnmsSlave) {
447 
448             iTest = WriteAsnModelList(pdnmsSlave, iCount, i2Vec, path, bSave, iCn3d);
449             if (!iTest) {
450                 ErrClear();
451                 ErrPostEx(SEV_FATAL, 0, 0,
452                           "Unable to Export\nPossibly Corrupt Data in Memory!\n");
453                 ErrShow();
454 
455             }
456 
457             if (!bsSlaveHead) {
458                 bsSlaveHead =
459                     (BiostrucPtr) ((PMSD) pdnmsSlave->data.ptrvalue)->
460                     pbsBS;
461                 bsSlaveTail = bsSlaveHead;
462             } else {
463                 bsSlave =
464                     (BiostrucPtr) ((PMSD) pdnmsSlave->data.ptrvalue)->
465                     pbsBS;
466                 bsSlaveTail->next = bsSlave;
467                 bsSlaveTail = bsSlaveTail->next;
468                 bsSlaveTail->next = NULL;
469             }
470             pdnmsSlave = (PDNMS) Cn3DAddUserDefinedFeatureToBiostruc(pdnmsSlave);
471             pdnmsSlave = pdnmsSlave->next;
472         }
473         bsap->slaves = bsSlaveHead;
474         bsap->sequences = Cn3D_GetSubSet(Cn3D_ColorData.pvnsep, Cn3D_ColorData.sap);
475         bsap->alignments = pmsdMaster->psaStrucAlignment;
476         bsap->seqalign = Cn3D_MakeSaveAnnot(Cn3D_ColorData.sap);
477         mime->data.ptrvalue = bsap;
478         NcbiMimeAsn1AsnWrite(mime, aip, NULL);
479         Cn3D_ClearSaveAnnot(bsap->seqalign);
480         Cn3D_ClearSubSet(bsap->sequences);
481         break;
482     }
483 
484     aip = AsnIoClose(aip);
485 
486     Cn3DRemoveUserDefinedFeatureFromBiostruc(pdnmsMaster);
487     Cn3D_RemoveGlobalRenderSettingsFromBiostruc(pdnmsMaster);
488     FreeRedundantAsn(pdnmsMaster);
489     pdnmsSlave = pmsdMaster->pdnmsSlaves;
490     while (pdnmsSlave) {
491         Cn3DRemoveUserDefinedFeatureFromBiostruc(pdnmsSlave);
492         FreeRedundantAsn(pdnmsSlave);
493         pdnmsSlave = pdnmsSlave->next;
494     }
495 
496     if (i2Vec)
497         I2VectorFree(i2Vec, 0);
498     Remove(Cn3D_wAsnSave);
499     Cn3D_EnableFileOps();
500     Cn3D_Save_InUse = FALSE;
501     ArrowCursor();
502     return;
503 }
504 
505 static void Cn3D_CancelAsn(ButtoN b)
506 {
507     Remove(Cn3D_wAsnSave);
508     Cn3D_EnableFileOps();
509     Cn3D_Save_InUse = FALSE;
510     return;
511 }
512 
513 
514 
515 NLM_EXTERN void Cn3D_SaveBiostruc(IteM i)
516 {
517     PDNMS pdnmsThis = NULL;
518     PMSD pmsdThis = NULL;
519     Char pcSavestr[60];
520     Char pcSavename[32];
521     CharPtr Cn3D_pcAsnName;
522     GrouP g, g2, g3, g4, g5, g6;
523     GrouP gMS;
524     ButtoN b;
525 
526     if (Cn3D_Save_InUse)
527         return;
528     else
529         Cn3D_Save_InUse = TRUE;
530 
531     pdnmsThis = GetSelectedModelstruc();
532     if (!pdnmsThis) {
533         Cn3D_Save_InUse = FALSE;
534         return;
535     }
536     pmsdThis = (PMSD) pdnmsThis->data.ptrvalue;
537 
538     Cn3D_wAsnSave = ModalWindow(-20, -13, -10, -10, NULL);
539 
540     /* set up a group encolosing structures - models selection lists and - "info strings" */
541     Cn3D_pcAsnName = StringSave(GetStrucStrings(pdnmsThis, PDB_ACC));
542     sprintf(pcSavestr, "Save Biostruc %s as an Asn.1 File...",
543             Cn3D_pcAsnName);
544     g = HiddenGroup(Cn3D_wAsnSave, 0, 4, NULL);
545     SetGroupMargins(g, 10, 10);
546     SetGroupSpacing(g, 10, 5);
547     StaticPrompt(g, pcSavestr, 0, 0, systemFont, 'l');
548     g2 = HiddenGroup(g, 2, 0, NULL);
549     SetGroupMargins(g2, 10, 10);
550     SetGroupSpacing(g2, 10, 5);
551     StringNCpy(pcSavename, Cn3D_pcAsnName, 8);
552     StringCat(pcSavename, ".prt");
553     Cn3D_tAsnSave =
554         DialogText(g2, pcSavename, 18, (TxtActnProc) Cn3D_AsnEnableProc);
555     MemFree(Cn3D_pcAsnName);
556 
557     Cn3D_bAsnBrowse =
558         PushButton(g2, " browse...", (BtnActnProc) Cn3D_AsnBrowseProc);
559     g3 = HiddenGroup(g, 2, 0, NULL);
560     gMS = Cn3D_ModelSelect(g3, TRUE); /*  vector models OK for Asn file saves */
561     g4 = HiddenGroup(g3, 0, 2, NULL);
562     SetGroupMargins(g4, 10, 10);
563     SetGroupSpacing(g4, 10, 5);
564     Cn3D_bAsnOk = PushButton(g4, "OK", Cn3D_ExportAsnNow);
565     b = PushButton(g4, "Cancel", Cn3D_CancelAsn);
566     g5 = HiddenGroup(g, 2, 0, NULL); /* for bin/ascii and features on/off */
567     Cn3D_gBinAscii = NormalGroup(g5, 2, 0, "file mode", systemFont, NULL);
568     SetGroupMargins(Cn3D_gBinAscii, 10, 0);
569     SetGroupSpacing(Cn3D_gBinAscii, 10, 5);
570     RadioButton(Cn3D_gBinAscii, "Ascii");
571     RadioButton(Cn3D_gBinAscii, "Binary");
572     SetValue(Cn3D_gBinAscii, 1);
573     g6 = HiddenGroup(g5, 0, 2, NULL);
574     SetGroupMargins(g6, 10, 10);
575     StaticPrompt(g6, " ", 0, 0, systemFont, 'l');
576 /*  Cn3D_bFeatOn =  CheckBox(g6, "Include Features", NULL);
577     SetStatus(Cn3D_bFeatOn,TRUE);  */
578     /* save features always for now - yanli */
579     Cn3D_AsnEnableProc(NULL);
580     Select(Cn3D_bAsnOk);
581     /* disable appropriate stuff here */
582     Cn3D_DisableFileOps();
583     Show(Cn3D_wAsnSave);
584 
585     return;
586 }
587 
588 
589 
590 
591 static void Cn3D_ExportDictNow(ButtoN b)
592 {
593 
594     Char path[256];
595     Int2 iTest;
596     Int4 iCount = 0;
597     PDNMS pdnmsMain = NULL;
598     CharPtr pcSave = NULL;
599     Byte bSave = 0;
600 
601     GetTitle(Cn3D_tAsnSave, path, sizeof(path));
602     pdnmsMain = GetSelectedModelstruc();
603     if (GetValue(Cn3D_gBinAscii) == 2)
604         bSave = (Byte) SAVE_BINARY;
605     iTest = WriteAsnLocalDict(pdnmsMain, path, bSave, TRUE);
606     if (!iTest) {
607         ErrClear();
608         ErrPostEx(SEV_FATAL, 0, 0,
609                   "Unable to Export\nPossibly Corrupt Data in Memory!\n");
610         ErrShow();
611     }
612     Remove(Cn3D_wAsnSave);
613     Cn3D_EnableFileOps();
614     Cn3D_Save_InUse = FALSE;
615     ArrowCursor();
616     return;
617 }
618 
619 
620 
621 static void Cn3D_SaveDictionary(IteM i)
622 {
623     PDNMS pdnmsThis = NULL;
624     PMSD pmsdThis = NULL;
625     Char pcSavestr[60];
626     Char pcSavename[32];
627     CharPtr Cn3D_pcAsnName;
628     GrouP g, g2, g3, g4, g5;
629     ButtoN b;
630 
631     if (Cn3D_Save_InUse)
632         return;
633     else
634         Cn3D_Save_InUse = TRUE;
635 
636     pdnmsThis = GetSelectedModelstruc();
637     if (!pdnmsThis) {
638         Cn3D_Save_InUse = FALSE;
639         return;
640     }
641     pmsdThis = (PMSD) pdnmsThis->data.ptrvalue;
642 
643     Cn3D_wAsnSave = ModalWindow(-20, -13, -10, -10, NULL);
644 
645     Cn3D_pcAsnName = StringSave(GetStrucStrings(pdnmsThis, PDB_ACC));
646     sprintf(pcSavestr, "Save Local Dictionary from %s ...",
647             Cn3D_pcAsnName);
648     g = HiddenGroup(Cn3D_wAsnSave, 0, 3, NULL);
649     SetGroupMargins(g, 10, 10);
650     SetGroupSpacing(g, 10, 5);
651     StaticPrompt(g, pcSavestr, 0, 0, systemFont, 'l');
652     g2 = HiddenGroup(g, 2, 0, NULL);
653     SetGroupMargins(g2, 10, 10);
654     SetGroupSpacing(g2, 10, 5);
655     StringNCpy(pcSavename, Cn3D_pcAsnName, 8);
656     StringCat(pcSavename, "dict.prt");
657     Cn3D_tAsnSave =
658         DialogText(g2, pcSavename, 18, (TxtActnProc) Cn3D_AsnEnableProc);
659     MemFree(Cn3D_pcAsnName);
660     Cn3D_bAsnBrowse =
661         PushButton(g2, " browse...", (BtnActnProc) Cn3D_AsnBrowseProc);
662 
663     g3 = HiddenGroup(g, 2, 0, NULL);
664     g4 = HiddenGroup(g3, 2, 0, NULL);
665     SetGroupMargins(g4, 10, 0);
666     Cn3D_gBinAscii = NormalGroup(g4, 2, 1, "file mode", systemFont, NULL);
667     SetGroupMargins(Cn3D_gBinAscii, 10, 10);
668     RadioButton(Cn3D_gBinAscii, "Ascii");
669     RadioButton(Cn3D_gBinAscii, "Binary");
670     SetValue(Cn3D_gBinAscii, 1);
671 
672     g5 = HiddenGroup(g3, 2, 0, NULL);
673     SetGroupMargins(g5, 10, 10);
674     SetGroupSpacing(g5, 10, 5);
675     Cn3D_bAsnOk = PushButton(g5, "OK", Cn3D_ExportDictNow);
676     b = PushButton(g5, "Cancel", Cn3D_CancelAsn);
677 
678     Cn3D_AsnEnableProc(NULL);
679     Select(Cn3D_bAsnOk);
680     Cn3D_DisableFileOps();
681     Show(Cn3D_wAsnSave);
682 
683     return;
684 }
685 
686 MenU LIBCALL Cn3D_SaveSub(MenU m)
687 {
688     IteM i;
689     MenU s;
690 
691     s = SubMenu(m, "Save");
692     i = CommandItem(s, "All/B", Cn3D_SaveBiostruc);
693     /* i = CommandItem (s, "Feature-set/F", NULL); */
694     i = CommandItem(s, "Dictionary/D", Cn3D_SaveDictionary);
695     return s;
696 }
697 
698 /*------------------------------------------------------------------------------
699  * stuff below implements save/read of an ARS structure to/from ASN1
700  *------------------------------------------------------------------------------*/
701 
702 typedef struct _ARSDataFieldInfo {
703     Int1 type;
704     CharPtr description;
705 } ARSDataFieldInfo, PNTR ARSDataFieldInfoPtr;
706 
707 enum { /* possible types for data in PARS structure */
708     TYPE_BOOLEAN = 1,
709     TYPE_INT2,
710     TYPE_UINT1PTR_3 /* pointer to array of 3 Uint1's */
711 };
712 
713 
714 /* map of ARS stucture, with description and type for each field */
715 static ARSDataFieldInfo ARSFieldData[] = {
716     { TYPE_BOOLEAN,     "Display Hydrogens" } ,
717     { TYPE_UINT1PTR_3,  "Background Color" } ,
718     { TYPE_INT2,        "Conservation Color Algorithm" } ,
719     { TYPE_BOOLEAN,     "Display Protein Virtual Backbone" } ,
720     { TYPE_BOOLEAN,     "Display Protein Partial Backbone" } ,
721     { TYPE_BOOLEAN,     "Display Protein Complete Backbone" } ,
722     { TYPE_BOOLEAN,     "Display Protein Residues" } ,
723     { TYPE_INT2,        "Protein Backbone Rendering Style" } ,
724     { TYPE_INT2,        "Protein Backbone Color Scheme" } ,
725     { TYPE_INT2,        "Protein Residue Rendering Style" } ,
726     { TYPE_INT2,        "Protein Residue Color Scheme" } ,
727     { TYPE_UINT1PTR_3,  "Protein Backbone Custom Color" } ,
728     { TYPE_UINT1PTR_3,  "Protein Residue Custom Color" } ,
729     { TYPE_INT2,        "Protein Label Interval" } ,
730     { TYPE_INT2,        "Protein Label Justification" } ,
731     { TYPE_INT2,        "Protein Label Style" } ,
732     { TYPE_INT2,        "Protein Label Scale" } ,
733     { TYPE_BOOLEAN,     "Display Protein Termini Labels" } ,
734     { TYPE_INT2,        "Protein Termini Label Justification" } ,
735     { TYPE_INT2,        "Protein Termini Label Style" } ,
736     { TYPE_INT2,        "Protein Termini Label Scale" } ,
737     { TYPE_BOOLEAN,     "Display Nucleotide Virtual Backbone" } ,
738     { TYPE_BOOLEAN,     "Display Nucleotide Partial Backbone" } ,
739     { TYPE_BOOLEAN,     "Display Nucleotide Complete Backbone" } ,
740     { TYPE_BOOLEAN,     "Display Nucleotide Residues" } ,
741     { TYPE_INT2,        "Nucleotide Backbone Rendering Style" } ,
742     { TYPE_INT2,        "Nucleotide Backbone Color Scheme" } ,
743     { TYPE_INT2,        "Nucleotide Residue Rendering Style" } ,
744     { TYPE_INT2,        "Nucleotide Residue Color Scheme" } ,
745     { TYPE_UINT1PTR_3,  "Nucleotide Backbone Custom Color" } ,
746     { TYPE_UINT1PTR_3,  "Nucleotide Residue Custom Color" } ,
747     { TYPE_INT2,        "Nucleotide Label Interval" } ,
748     { TYPE_INT2,        "Nucleotide Label Justification" } ,
749     { TYPE_INT2,        "Nucleotide Label Style" } ,
750     { TYPE_INT2,        "Nucleotide Label Scale" } ,
751     { TYPE_BOOLEAN,     "Display Nucleotide Termini Labels" } ,
752     { TYPE_INT2,        "Nucleotide Termini Label Justification" } ,
753     { TYPE_INT2,        "Nucleotide Termini Label Style" } ,
754     { TYPE_INT2,        "Nucleotide Termini Label Scale" } ,
755     { TYPE_BOOLEAN,     "Display Heterogens" } ,
756     { TYPE_INT2,        "Heterogen Rendering Style" } ,
757     { TYPE_INT2,        "Heterogen Color Scheme" } ,
758     { TYPE_BOOLEAN,     "Display Ions" } ,
759     { TYPE_INT2,        "Ion Rendering Style" } ,
760     { TYPE_INT2,        "Ion Color Scheme" } ,
761     { TYPE_BOOLEAN,     "Display Ion Labels" } ,
762     { TYPE_BOOLEAN,     "Display Connections" } ,
763     { TYPE_INT2,        "Connection Rendering Style" } ,
764     { TYPE_INT2,        "Connection Color Scheme" } ,
765     { TYPE_BOOLEAN,     "Display Solvent" } ,
766     { TYPE_INT2,        "Solvent Rendering Style" } ,
767     { TYPE_INT2,        "Solvent Color Scheme" } ,
768     { TYPE_BOOLEAN,     "Display 3D Objects" } ,
769     { TYPE_INT2,        "3D Object Color Scheme" } ,
770     { TYPE_INT2,        "3D Object Arrows" } ,
771     { 0,                NULL }
772 };
773 
774 
775 static VoidPtr Cn3D_GetARSFieldAddress(PARS pars, CharPtr descr)
776 {
777     switch (descr[0]) { /* crude hash */
778     case 'D':
779         if (StrCmp(descr, "Display 3D Objects") == 0) return ((VoidPtr) &(pars->ObjectOn));
780         else if (StrCmp(descr, "Display Connections") == 0) return ((VoidPtr) &(pars->ConnectOn));
781         else if (StrCmp(descr, "Display Heterogens") == 0) return ((VoidPtr) &(pars->HeterogensOn));
782         else if (StrCmp(descr, "Display Hydrogens") == 0) return ((VoidPtr) &(pars->HydrogensOn));
783         else if (StrCmp(descr, "Display Ion Labels") == 0) return ((VoidPtr) &(pars->IonLabelOn));
784         else if (StrCmp(descr, "Display Ions") == 0) return ((VoidPtr) &(pars->IonsOn));
785         else if (StrCmp(descr, "Display Nucleotide Complete Backbone") == 0) return ((VoidPtr) &(pars->NTCompleteBBOn));
786         else if (StrCmp(descr, "Display Nucleotide Partial Backbone") == 0) return ((VoidPtr) &(pars->NTPartialBBOn));
787         else if (StrCmp(descr, "Display Nucleotide Residues") == 0) return ((VoidPtr) &(pars->NTResiduesOn));
788         else if (StrCmp(descr, "Display Nucleotide Termini Labels") == 0) return ((VoidPtr) &(pars->NTTermLabelOn));
789         else if (StrCmp(descr, "Display Nucleotide Virtual Backbone") == 0) return ((VoidPtr) &(pars->NTVirtualBBOn));
790         else if (StrCmp(descr, "Display Protein Complete Backbone") == 0) return ((VoidPtr) &(pars->PCompleteBBOn));
791         else if (StrCmp(descr, "Display Protein Partial Backbone") == 0) return ((VoidPtr) &(pars->PPartialBBOn));
792         else if (StrCmp(descr, "Display Protein Residues") == 0) return ((VoidPtr) &(pars->PResiduesOn));
793         else if (StrCmp(descr, "Display Protein Termini Labels") == 0) return ((VoidPtr) &(pars->PTermLabelOn));
794         else if (StrCmp(descr, "Display Protein Virtual Backbone") == 0) return ((VoidPtr) &(pars->PVirtualBBOn));
795         else if (StrCmp(descr, "Display Solvent") == 0) return ((VoidPtr) &(pars->SolventOn));
796         break;
797     case 'P':
798         if (StrCmp(descr, "Protein Backbone Color Scheme") == 0) return ((VoidPtr) &(pars->PBBColor));
799         else if (StrCmp(descr, "Protein Backbone Custom Color") == 0) return ((VoidPtr) &(pars->PBBColRGB));
800         else if (StrCmp(descr, "Protein Backbone Rendering Style") == 0) return ((VoidPtr) &(pars->PBBRender));
801         else if (StrCmp(descr, "Protein Label Interval") == 0) return ((VoidPtr) &(pars->PBBLabelInterval));
802         else if (StrCmp(descr, "Protein Label Justification") == 0) return ((VoidPtr) &(pars->PBBLabelJust));
803         else if (StrCmp(descr, "Protein Label Scale") == 0) return ((VoidPtr) &(pars->PBBLabelScale));
804         else if (StrCmp(descr, "Protein Label Style") == 0) return ((VoidPtr) &(pars->PBBLabelStyle));
805         else if (StrCmp(descr, "Protein Residue Color Scheme") == 0) return ((VoidPtr) &(pars->PResColor));
806         else if (StrCmp(descr, "Protein Residue Custom Color") == 0) return ((VoidPtr) &(pars->PResColRGB));
807         else if (StrCmp(descr, "Protein Residue Rendering Style") == 0) return ((VoidPtr) &(pars->PResRender));
808         else if (StrCmp(descr, "Protein Termini Label Justification") == 0) return ((VoidPtr) &(pars->PTermLabelJust));
809         else if (StrCmp(descr, "Protein Termini Label Scale") == 0) return ((VoidPtr) &(pars->PTermLabelScale));
810         else if (StrCmp(descr, "Protein Termini Label Style") == 0) return ((VoidPtr) &(pars->PTermLabelStyle));
811         break;
812     case 'N':
813         if (StrCmp(descr, "Nucleotide Backbone Color Scheme") == 0) return ((VoidPtr) &(pars->NTBBColor));
814         else if (StrCmp(descr, "Nucleotide Backbone Custom Color") == 0) return ((VoidPtr) &(pars->NTBBColRGB));
815         else if (StrCmp(descr, "Nucleotide Backbone Rendering Style") == 0) return ((VoidPtr) &(pars->NTBBRender));
816         else if (StrCmp(descr, "Nucleotide Label Interval") == 0) return ((VoidPtr) &(pars->NTBBLabelInterval));
817         else if (StrCmp(descr, "Nucleotide Label Justification") == 0) return ((VoidPtr) &(pars->NTBBLabelJust));
818         else if (StrCmp(descr, "Nucleotide Label Scale") == 0) return ((VoidPtr) &(pars->NTBBLabelScale));
819         else if (StrCmp(descr, "Nucleotide Label Style") == 0) return ((VoidPtr) &(pars->NTBBLabelStyle));
820         else if (StrCmp(descr, "Nucleotide Residue Color Scheme") == 0) return ((VoidPtr) &(pars->NTResColor));
821         else if (StrCmp(descr, "Nucleotide Residue Custom Color") == 0) return ((VoidPtr) &(pars->NTResColRGB));
822         else if (StrCmp(descr, "Nucleotide Residue Rendering Style") == 0) return ((VoidPtr) &(pars->NTResRender));
823         else if (StrCmp(descr, "Nucleotide Termini Label Justification") == 0) return ((VoidPtr) &(pars->NTTermLabelJust));
824         else if (StrCmp(descr, "Nucleotide Termini Label Scale") == 0) return ((VoidPtr) &(pars->NTTermLabelScale));
825         else if (StrCmp(descr, "Nucleotide Termini Label Style") == 0) return ((VoidPtr) &(pars->NTTermLabelStyle));
826         break;
827     default:
828         if (StrCmp(descr, "3D Object Color Scheme") == 0) return ((VoidPtr) &(pars->ObjectColor));
829         else if (StrCmp(descr, "3D Object Arrows") == 0) return ((VoidPtr) &(pars->ObjectArrows));
830         else if (StrCmp(descr, "Background Color") == 0) return ((VoidPtr) &(pars->BGColRGB));
831         else if (StrCmp(descr, "Connection Color Scheme") == 0) return ((VoidPtr) &(pars->ConnectColor));
832         else if (StrCmp(descr, "Connection Rendering Style") == 0) return ((VoidPtr) &(pars->ConnectRender));
833         else if (StrCmp(descr, "Conservation Color Algorithm") == 0) return ((VoidPtr) &(pars->ConsColAlg));
834         else if (StrCmp(descr, "Heterogen Color Scheme") == 0) return ((VoidPtr) &(pars->HetColor));
835         else if (StrCmp(descr, "Heterogen Rendering Style") == 0) return ((VoidPtr) &(pars->HetRender));
836         else if (StrCmp(descr, "Ion Color Scheme") == 0) return ((VoidPtr) &(pars->IonColor));
837         else if (StrCmp(descr, "Ion Rendering Style") == 0) return ((VoidPtr) &(pars->IonRender));
838         else if (StrCmp(descr, "Solvent Color Scheme") == 0) return ((VoidPtr) &(pars->SolventColor));
839         else if (StrCmp(descr, "Solvent Rendering Style") == 0) return ((VoidPtr) &(pars->SolventRender));
840     }
841     Message(MSG_POST, "Unrecognized ARS field %s", descr);
842     return NULL;
843 }
844 
845 static int Cn3D_GetARSFieldType(CharPtr descr)
846 {
847     int i;
848     for (i = 0; ARSFieldData[i].description != NULL; i++) {
849         if (StrCmp(descr, ARSFieldData[i].description) == 0)
850             return ARSFieldData[i].type;
851     }
852     Message(MSG_POST, "Unrecognized ARS field %s", descr);
853     return -1;
854 }
855 
856 /* returns field as a new string - should be freed by caller */
857 static CharPtr Cn3D_GetARSFieldContentsAsString(PARS pars, CharPtr descr)
858 {
859     int type;
860     VoidPtr address;
861     Char str[32];
862     CharPtr copy;
863 
864     address = Cn3D_GetARSFieldAddress(pars, descr);
865     type = Cn3D_GetARSFieldType(descr);
866     if (!address || type < 0) {
867         Message(MSG_POST, "Unrecognised ARS field %s", descr);
868         return NULL;
869     }
870 
871     switch (type) {
872     case TYPE_BOOLEAN:
873         if (*((Boolean *) address) == TRUE)
874             StrCpy(str, "True");
875         else
876             StrCpy(str, "False");
877         break;
878     case TYPE_INT2:
879         sprintf(str, "%i", *((Int2 *) address));
880         break;
881     case TYPE_UINT1PTR_3:
882         sprintf(str, "%i %i %i", ((Uint1 *) address)[0],
883             ((Uint1 *) address)[1], ((Uint1 *) address)[2]);
884         break;
885     default:
886         Message(MSG_ERROR, "Invalid ARS type (%i) for %s", type, descr);
887         return NULL;
888     }
889     copy = (CharPtr) MemNew((StrLen(str) + 1) * sizeof(Char));
890     if (!copy) return NULL;
891     StrCpy(copy, str);
892     return copy;
893 }
894 
895 static BiostrucFeatureSetPtr Cn3D_MakeBSFSPFromARS(PARS pars)
896 {
897     BiostrucFeatureSetPtr bsfsp;
898     BiostrucFeaturePtr bsfp;
899     UserObjectPtr pUO;
900     UserFieldPtr pUF, pUFprev;
901     int i;
902 
903     bsfsp = BiostrucFeatureSetNew();
904     bsfp = BiostrucFeatureNew();
905     if (!bsfp || !bsfp) return NULL;
906 
907     /* new BiostrucFeatureSet */
908     bsfsp->id = 0;
909     ValNodeAddPointer(&(bsfsp->descr), BiostrucFeatureSetDescr_name,
910         StringSave("Global Rendering Settings"));
911     bsfsp->next = NULL;
912     bsfsp->features = bsfp;
913 
914     /* new BiostrucFeature */
915     bsfp->id = 0;
916     bsfp->name = NULL;
917     bsfp->Location_location = NULL;
918     bsfp->type = Feature_type_other;
919     bsfp->next = NULL;
920 
921     /* new user property (ValNode with User-object)*/
922     bsfp->Property_property = ValNodeNew(NULL);
923     if (!bsfp->Property_property) return NULL;
924     bsfp->Property_property->choice = Property_property_user;
925     pUO = UserObjectNew();
926     if (!pUO) return NULL;
927     bsfp->Property_property->data.ptrvalue = (VoidPtr) pUO;
928     pUO->_class = NULL;
929     pUO->type = ObjectIdNew();
930     if (!pUO->type) return NULL;
931     pUO->type->id = 0;
932     pUO->type->str = StringSave("Cn3D AgorithmicRenderSet Data");
933 
934     /* fill in User-object data with contents of ARS */
935     for (i = 0; ARSFieldData[i].description != NULL; i++) {
936         pUF = UserFieldNew();
937         if (!pUF) return NULL;
938         pUF->num = 0;
939         pUF->next = NULL;
940         if (i == 0)
941             pUO->data = pUF;
942         else
943             pUFprev->next = pUF;
944         pUFprev = pUF;
945 
946         pUF->label = ObjectIdNew();
947         if (!pUF->label) return NULL;
948         pUF->label->id = 0;
949         pUF->label->str = StringSave(ARSFieldData[i].description);
950         pUF->choice = 1; /* str data */
951         pUF->data.ptrvalue = (VoidPtr)
952             Cn3D_GetARSFieldContentsAsString(pars, ARSFieldData[i].description);
953     }
954 
955     return bsfsp;
956 }
957 
958 static void Cn3D_AddGlobalRenderSettingsToBiostruc(PDNMS pdnms)
959 {
960     BiostrucFeatureSetPtr bsfsp, bsfspNew;
961     PARS pars;
962     PMSD pmsd;
963 
964     if (!pdnms ||
965         !(pmsd = (PMSD) pdnms->data.ptrvalue) ||
966         !(pars = pmsd->pGlobalPARS))
967         return;
968 
969     /* make new feature set and add to end of MSD's feature list */
970     bsfspNew = Cn3D_MakeBSFSPFromARS(pars);
971     if (!bsfspNew) return;
972     bsfsp = pmsd->pbsBS->features;
973     if (bsfsp) {
974         while (bsfsp->next) bsfsp = bsfsp->next;
975         bsfsp->next = bsfspNew;
976     } else {
977         pmsd->pbsBS->features = bsfspNew;
978     }
979 }
980 
981 static void Cn3D_RemoveGlobalRenderSettingsFromBiostruc(PDNMS pdnms)
982 {
983     BiostrucPtr bsp;
984     BiostrucFeatureSetPtr bsfsp, bsfsp_prev = NULL, bsfsp_curr = NULL;
985     ValNodePtr descr = NULL;
986 
987     if (!pdnms || !pdnms->data.ptrvalue ||
988         !(bsp = ((PMSD) pdnms->data.ptrvalue)->pbsBS))
989         return;
990 
991     /* assuming this feature set always occur at the tail end of the feature list,
992        unhook from the biostruc and free */
993     bsfsp = bsp->features;
994     while (bsfsp) {
995         if (bsfsp->descr != NULL) {
996             descr = bsfsp->descr;
997             if (descr->choice == BiostrucFeatureSetDescr_name) {
998                 if (StrCmp(descr->data.ptrvalue, "Global Rendering Settings") == 0) {
999                     if (bsfsp_prev)
1000                         bsfsp_prev->next = NULL;
1001                     bsfsp_curr = bsfsp;
1002                     break;
1003                 }
1004             }
1005         }
1006         bsfsp_prev = bsfsp;
1007         bsfsp = bsfsp->next;
1008     }
1009     BiostrucFeatureSetFree(bsfsp_curr);
1010 }
1011 
1012 /* returns TRUE on success, FALSE on error */
1013 static Boolean Cn3D_SetARSFieldContentsFromString(PARS pars,
1014                                                   CharPtr descr,
1015                                                   CharPtr data)
1016 {
1017     int type, i1, i2, i3;
1018     VoidPtr address;
1019 
1020     if (!pars || !descr || !data ||
1021         (type = Cn3D_GetARSFieldType(descr)) < 0 ||
1022         !(address = Cn3D_GetARSFieldAddress(pars, descr)))
1023         return FALSE;
1024 
1025     switch (type) {
1026     case TYPE_BOOLEAN:
1027         *((Boolean *) address) = (StrCmp(data, "True") == 0);
1028         break;
1029     case TYPE_INT2:
1030         *((Int2 *) address) = atoi(data);
1031         break;
1032     case TYPE_UINT1PTR_3:
1033         if (sscanf(data, "%i %i %i", &i1, &i2, &i3) != 3) return FALSE;
1034         ((Uint1 *) address)[0] = (Uint1) i1;
1035         ((Uint1 *) address)[1] = (Uint1) i2;
1036         ((Uint1 *) address)[2] = (Uint1) i3;
1037         break;
1038     default:
1039         Message(MSG_ERROR, "Invalid ARS type (%i) for %s", type, descr);
1040         return FALSE;
1041     }
1042     return TRUE;
1043 }
1044 
1045 NLM_EXTERN void Cn3D_GetRenderSettingsFromBiostruc(PDNMS pdnms)
1046 {
1047     PMSD pmsd;
1048     BiostrucFeatureSetPtr bsfsp;
1049     UserObjectPtr pUO;
1050     UserFieldPtr pUF;
1051 
1052     if (!pdnms || !(pmsd = (PMSD) pdnms->data.ptrvalue)) return;
1053 
1054     /* find feature set in biostruc */
1055     bsfsp = pmsd->pbsBS->features;
1056     while (bsfsp) {
1057         if (bsfsp->descr && bsfsp->descr->data.ptrvalue &&
1058             bsfsp->descr->choice == BiostrucFeatureSetDescr_name &&
1059             StrCmp(bsfsp->descr->data.ptrvalue, "Global Rendering Settings") == 0)
1060             break;
1061         bsfsp = bsfsp->next;
1062     }
1063     if (!bsfsp) return;
1064 
1065     /* find start of User-field list */
1066     if (!bsfsp->features ||
1067         !bsfsp->features->Property_property ||
1068         bsfsp->features->Property_property->choice != Property_property_user || /* check property type */
1069         !(pUO = (UserObjectPtr) bsfsp->features->Property_property->data.ptrvalue) ||
1070         !pUO->type || !pUO->type->str || /* check object type */
1071         StrCmp(pUO->type->str, "Cn3D AgorithmicRenderSet Data") != 0 ||
1072         !(pUF = pUO->data))
1073         return;
1074 
1075     /* read ARS fields from User-fields */
1076     for (; pUF; pUF = pUF->next) {
1077         if (!pUF->label || !pUF->label->str ||
1078             pUF->choice != 1 || !pUF->data.ptrvalue)
1079             continue;
1080         Cn3D_SetARSFieldContentsFromString(pmsd->pGlobalPARS,
1081             pUF->label->str, (CharPtr) pUF->data.ptrvalue);
1082     }
1083 
1084     /* remove now; locally changed settings re-added upon save */
1085     Cn3D_RemoveGlobalRenderSettingsFromBiostruc(pdnms);
1086 }
1087 

source navigation ]   [ diff markup ]   [ identifier search ]   [ freetext search ]   [ file search ]  

This page was automatically generated by the LXR engine.
Visit the LXR main site for more information.