|
NCBI Home IEB Home C Toolkit docs C++ Toolkit source browser C Toolkit source browser (2) |
NCBI C Toolkit Cross ReferenceC/cn3d/cn3dsave.c |
source navigation diff markup identifier search freetext search file search |
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 |
This page was automatically generated by the
LXR engine.
Visit the LXR main site for more information. |