📄 structure_window.cpp
字号:
if (force) { fileMenu->Enable(MID_OPEN, false); fileMenu->Enable(MID_SAVE_AS, false); } // clear old data if (glCanvas->structureSet) { DestroyNonModalDialogs(); GlobalMessenger()->RemoveAllHighlights(false); delete glCanvas->structureSet; glCanvas->structureSet = NULL; glCanvas->renderer->AttachStructureSet(NULL); glCanvas->Refresh(false); } // get current structure limit int structureLimit = kMax_Int; if (!RegistryGetInteger(REG_ADVANCED_SECTION, REG_MAX_N_STRUCTS, &structureLimit)) WARNINGMSG("Can't get structure limit from registry"); // use passed-in data if present, otherwise load from file if (mimeData) { glCanvas->structureSet = new StructureSet(mimeData, structureLimit, glCanvas->renderer); userDir = GetWorkingDir(); currentFile = ""; } else { // set up various paths relative to given filename if (wxIsAbsolutePath(filename)) userDir = string(wxPathOnly(filename).c_str()) + wxFILE_SEP_PATH; else if (wxPathOnly(filename) == "") userDir = GetWorkingDir(); else userDir = GetWorkingDir() + wxPathOnly(filename).c_str() + wxFILE_SEP_PATH; INFOMSG("user dir: " << userDir.c_str()); // try to decide if what ASN type this is, and if it's binary or ascii CNcbiIstream *inStream = new CNcbiIfstream(filename, IOS_BASE::in | IOS_BASE::binary); if (!(*inStream)) { ERRORMSG("Cannot open file '" << filename << "' for reading"); SetCursor(wxNullCursor); delete inStream; return false; } currentFile = wxFileNameFromPath(filename); string firstWord; *inStream >> firstWord; delete inStream; static const string asciiMimeFirstWord = "Ncbi-mime-asn1", asciiCDDFirstWord = "Cdd"; bool isMime = false, isCDD = false, isBinary = true; if (firstWord == asciiMimeFirstWord) { isMime = true; isBinary = false; } else if (firstWord == asciiCDDFirstWord) { isCDD = true; isBinary = false; } // try to read the file as various ASN types (if it's not clear from the first ascii word). // If read is successful, the StructureSet will own the asn data object, to keep it // around for output later on bool readOK = false; string err; if (!isCDD) { TRACEMSG("trying to read file '" << filename << "' as " << ((isBinary) ? "binary" : "ascii") << " mime"); CNcbi_mime_asn1 *mime = new CNcbi_mime_asn1(); SetDiagPostLevel(eDiag_Fatal); // ignore all but Fatal errors while reading data readOK = ReadASNFromFile(filename, mime, isBinary, &err); SetDiagPostLevel(eDiag_Info); if (readOK) { glCanvas->structureSet = new StructureSet(mime, structureLimit, glCanvas->renderer); // if CDD is contained in a mime, then show CDD splash screen if (glCanvas->structureSet->IsCDD()) ShowCDDOverview(); } else { TRACEMSG("error: " << err); delete mime; } } if (!readOK) { TRACEMSG("trying to read file '" << filename << "' as " << ((isBinary) ? "binary" : "ascii") << " cdd"); CCdd *cdd = new CCdd(); SetDiagPostLevel(eDiag_Fatal); // ignore all but Fatal errors while reading data readOK = ReadASNFromFile(filename, cdd, isBinary, &err); SetDiagPostLevel(eDiag_Info); if (readOK) { glCanvas->structureSet = new StructureSet(cdd, structureLimit, glCanvas->renderer); } else { TRACEMSG("error: " << err); delete cdd; } } if (!readOK) { ERRORMSG("File not found, not readable, or is not a recognized data type"); SetCursor(wxNullCursor); return false; } } SetWorkingTitle(glCanvas->structureSet); GlobalMessenger()->SetAllWindowTitles(); // use a default style if no global style stored in asn data if (glCanvas->structureSet->hasUserStyle) { SetRenderingMenuFlag(0); SetColoringMenuFlag(0); } else { // set default rendering style and view, and turn on corresponding style menu flags if (glCanvas->structureSet->alignmentSet) { glCanvas->structureSet->styleManager->SetGlobalRenderingStyle(StyleSettings::eTubeShortcut); SetRenderingMenuFlag(MID_TUBE); if (glCanvas->structureSet->IsCDD()) { glCanvas->structureSet->styleManager->SetGlobalColorScheme(StyleSettings::eInformationContentShortcut); SetColoringMenuFlag(MID_INFO); } else { glCanvas->structureSet->styleManager->SetGlobalColorScheme(StyleSettings::eIdentityShortcut); SetColoringMenuFlag(MID_IDENTITY); } } else { glCanvas->structureSet->styleManager->SetGlobalRenderingStyle(StyleSettings::eWormShortcut); SetRenderingMenuFlag(MID_WORM); glCanvas->structureSet->styleManager->SetGlobalColorScheme(StyleSettings::eSecondaryStructureShortcut); SetColoringMenuFlag(MID_SECSTRUC); } } menuBar->EnableTop(menuBar->FindMenu("CDD"), glCanvas->structureSet->IsCDD()); glCanvas->renderer->AttachStructureSet(glCanvas->structureSet); if (!glCanvas->renderer->HasASNViewSettings()) glCanvas->structureSet->CenterViewOnAlignedResidues(); glCanvas->Refresh(false); glCanvas->structureSet->alignmentManager->ShowSequenceViewer(); SetCursor(wxNullCursor); return true;}void StructureWindow::OnOpen(wxCommandEvent& event){ if (glCanvas->structureSet) { GlobalMessenger()->SequenceWindowsSave(true); // give sequence window a chance to save SaveDialog(true, false); // give structure window a chance to save data } if (event.GetId() == MID_OPEN) { const wxString& filestr = wxFileSelector("Choose a text or binary ASN1 file to open", userDir.c_str(), "", "", "All Files|*.*|CDD (*.acd)|*.acd|Binary ASN (*.val)|*.val|ASCII ASN (*.prt)|*.prt", wxOPEN | wxFILE_MUST_EXIST); if (!filestr.IsEmpty()) LoadData(filestr.c_str(), false); } else if (event.GetId() == MID_NETWORK_OPEN) { wxString id = wxGetTextFromUser("Please enter a PDB or MMDB id", "Input id"); if (id.size() == 0) return; wxArrayString choiceStrs; choiceStrs.Add("single"); choiceStrs.Add("alpha"); choiceStrs.Add("PDB"); wxString modelStr = wxGetSingleChoice( "Please select which type of model you'd like to load", "Select model", choiceStrs); if (modelStr.size() == 0) return; EModel_type model = eModel_type_ncbi_all_atom; if (modelStr == "alpha") model = eModel_type_ncbi_backbone; else if (modelStr == "PDB") model = eModel_type_pdb_model; CNcbi_mime_asn1 *mime = LoadStructureViaCache(id.c_str(), model); if (mime) LoadData(NULL, false, mime); }}void StructureWindow::OnSave(wxCommandEvent& event){ if (!glCanvas->structureSet) return; // determine whether to prompt user for filename bool prompt = (event.GetId() == MID_SAVE_AS); if (!prompt) { wxString dir = wxString(userDir.c_str()).MakeLower(); // always prompt if this file is stored in some temp folder (e.g. browser cache) if (dir.Contains("cache") || dir.Contains("temp") || dir.Contains("tmp")) prompt = true; } // force a save of any edits to alignment and updates first GlobalMessenger()->SequenceWindowsSave(prompt); wxString outputFolder = wxString(userDir.c_str(), userDir.size() - 1); // remove trailing / wxString outputFilename; bool outputBinary; // don't ask for filename if Save As is disabled if ((prompt && fileMenu->IsEnabled(MID_SAVE_AS)) || currentFile.size() == 0) { wxFileName fn(currentFile.c_str()); wxFileDialog dialog(this, "Choose a filename for output", outputFolder,#ifdef __WXGTK__ fn.GetFullName(),#else fn.GetName(),#endif "All Files|*.*|Binary ASN (*.val)|*.val|ASCII CDD (*.acd)|*.acd|ASCII ASN (*.prt)|*.prt", wxSAVE | wxOVERWRITE_PROMPT); dialog.SetFilterIndex(fn.GetExt() == "val" ? 1 : (fn.GetExt() == "acd" ? 2 : (fn.GetExt() == "prt" ? 3 : 0))); if (dialog.ShowModal() == wxID_OK) outputFilename = dialog.GetPath(); outputBinary = (dialog.GetFilterIndex() == 1); } else { outputFilename = (userDir + currentFile).c_str(); outputBinary = (outputFilename.Right(4) == ".val"); } INFOMSG("save file: '" << outputFilename.c_str() << "'"); if (!outputFilename.IsEmpty()) { // convert mime to cdd if specified if (outputFilename.Right(4) == ".acd" && (!glCanvas->structureSet->IsCDD() || glCanvas->structureSet->IsCDDInMime())) { string cddName; if (glCanvas->structureSet->IsCDDInMime() && glCanvas->structureSet->GetCDDName().size() > 0) cddName = glCanvas->structureSet->GetCDDName(); else cddName = wxGetTextFromUser("Enter a name for this CD", "Input Name"); if (cddName.size() == 0 || !glCanvas->structureSet->ConvertMimeDataToCDD(cddName.c_str())) { ERRORMSG("Conversion to Cdd failed"); return; } } // save and send FileSaved command unsigned int changeFlags; if (glCanvas->structureSet->SaveASNData(outputFilename.c_str(), outputBinary, &changeFlags) && IsFileMessengerActive()) { string data(outputFilename.c_str()); data += '\n'; TRACEMSG("changeFlags: " << changeFlags); if ((changeFlags & StructureSet::eAnyAlignmentData) > 0) data += "AlignmentChanged\n"; if ((changeFlags & StructureSet::eRowOrderData) > 0) data += "RowOrderChanged\n"; if ((changeFlags & StructureSet::ePSSMData) > 0) data += "PSSMChanged\n"; if ((changeFlags & StructureSet::eCDDData) > 0) data += "DescriptionChanged\n"; if ((changeFlags & StructureSet::eUpdateData) > 0) data += "PendingAlignmentsChanged\n"; SendCommand(messageTargetApp, "FileSaved", data); }#ifdef __WXMAC__ // set mac file type and creator wxFileName wxfn(outputFilename); if (wxfn.FileExists()) if (!wxfn.MacSetTypeAndCreator('TEXT', 'Cn3D')) WARNINGMSG("Unable to set Mac file type/creator");#endif // set path/name/title if (wxIsAbsolutePath(outputFilename)) userDir = string(wxPathOnly(outputFilename).c_str()) + wxFILE_SEP_PATH; else if (wxPathOnly(outputFilename) == "") userDir = GetWorkingDir(); else userDir = GetWorkingDir() + wxPathOnly(outputFilename).c_str() + wxFILE_SEP_PATH; currentFile = wxFileNameFromPath(outputFilename); SetWorkingTitle(glCanvas->structureSet); GlobalMessenger()->SetAllWindowTitles(); }}END_SCOPE(Cn3D)/** ---------------------------------------------------------------------------* $Log: structure_window.cpp,v $* Revision 1000.3 2004/06/01 18:29:33 gouriano* PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.33** Revision 1.33 2004/05/31 13:15:09 thiessen* make select molecule take PDB chain/het name** Revision 1.32 2004/05/21 21:41:40 gorelenk* Added PCH ncbi_pch.hpp** Revision 1.31 2004/05/21 17:29:51 thiessen* allow conversion of mime to cdd data** Revision 1.30 2004/04/22 00:05:03 thiessen* add seclect molecule** Revision 1.29 2004/03/15 18:38:52 thiessen* prefer prefix vs. postfix ++/-- operators** Revision 1.28 2004/03/09 14:30:47 thiessen* change network load type choice order** Revision 1.27 2004/02/19 17:05:16 thiessen* remove cn3d/ from include paths; add pragma to disable annoying msvc warning** Revision 1.26 2004/01/17 01:47:26 thiessen* add network load** Revision 1.25 2004/01/17 00:17:31 thiessen* add Biostruc and network structure load** Revision 1.24 2004/01/08 15:31:03 thiessen* remove hard-coded CDTree references in messaging; add Cn3DTerminated message upon exit** Revision
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -