command_processor.cpp
上传用户:yhdzpy8989
上传日期:2007-06-13
资源大小:13604k
文件大小:10k
源码类别:

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: command_processor.cpp,v $
  4.  * PRODUCTION Revision 1000.2  2004/06/01 18:28:27  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.11
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. /*  $Id: command_processor.cpp,v 1000.2 2004/06/01 18:28:27 gouriano Exp $
  10. * ===========================================================================
  11. *
  12. *                            PUBLIC DOMAIN NOTICE
  13. *               National Center for Biotechnology Information
  14. *
  15. *  This software/database is a "United States Government Work" under the
  16. *  terms of the United States Copyright Act.  It was written as part of
  17. *  the author's official duties as a United States Government employee and
  18. *  thus cannot be copyrighted.  This software/database is freely available
  19. *  to the public for use. The National Library of Medicine and the U.S.
  20. *  Government have not placed any restriction on its use or reproduction.
  21. *
  22. *  Although all reasonable efforts have been taken to ensure the accuracy
  23. *  and reliability of the software and data, the NLM and the U.S.
  24. *  Government do not and cannot warrant the performance or results that
  25. *  may be obtained by using this software or data. The NLM and the U.S.
  26. *  Government disclaim all warranties, express or implied, including
  27. *  warranties of performance, merchantability or fitness for any particular
  28. *  purpose.
  29. *
  30. *  Please cite the author in any work or product based on this material.
  31. *
  32. * ===========================================================================
  33. *
  34. * Authors:  Paul Thiessen
  35. *
  36. * File Description:
  37. *       module to process external commands (e.g. from file messenger)
  38. *
  39. *   Commands:
  40. *
  41. *       Highlight:
  42. *           data is any number of the following, one per line separated by 'n':
  43. *               gi [#] [ranges]
  44. *               pdb [pdb_id] [ranges]
  45. *               acc [accession] [ranges]
  46. *           where pdb_id is 4 or 6-letters, e.g. 1abc or 1def_a
  47. *           where ranges is sequence of zero-numbered numerical positions or ranges,
  48. *               e.g. "1-100, 102, 105-192"
  49. *
  50. *       LoadFile:
  51. *           data is the name of the file to load
  52. *
  53. *       Exit:
  54. *           quit the program, same behaviour as hitting File:Exit or 'X' icon
  55. *
  56. * ===========================================================================
  57. */
  58. #ifdef _MSC_VER
  59. #pragma warning(disable:4018)   // disable signed/unsigned mismatch warning in MSVC
  60. #endif
  61. #include <ncbi_pch.hpp>
  62. #include <corelib/ncbistd.hpp>
  63. #include <list>
  64. #include "command_processor.hpp"
  65. #include "structure_window.hpp"
  66. #include "cn3d_glcanvas.hpp"
  67. #include "structure_set.hpp"
  68. #include "cn3d_tools.hpp"
  69. #include "messenger.hpp"
  70. #include "sequence_set.hpp"
  71. #include "molecule_identifier.hpp"
  72. #include <wx/tokenzr.h>
  73. USING_NCBI_SCOPE;
  74. BEGIN_SCOPE(Cn3D)
  75. // splits single string into multiple; assumes 'n'-terminated lines
  76. static void SplitString(const string& inStr, list<string> *outList)
  77. {
  78.     outList->clear();
  79.     int firstPos = 0, size = 0;
  80.     for (int i=0; i<inStr.size(); ++i) {
  81.         if (inStr[i] == 'n') {
  82.             outList->resize(outList->size() + 1);
  83.             outList->back() = inStr.substr(firstPos, size);
  84.             firstPos = i + 1;
  85.             size = 0;
  86. //            TRACEMSG("outList: '" << outList->back() << "'");
  87.         } else if (i == inStr.size() - 1) {
  88.             ERRORMSG("SplitString() - input multi-line string doesn't end with n!");
  89.         } else {
  90.             ++size;
  91.         }
  92.     }
  93. }
  94. #define SPLIT_DATAIN_INTO_LINES 
  95.     list<string> lines; 
  96.     SplitString(dataIn, &lines); 
  97.     list<string>::const_iterator l, le = lines.end()
  98. void CommandProcessor::ProcessCommand(DECLARE_PARAMS)
  99. {
  100.     TRACEMSG("processing " << command);
  101.     if (dataIn.size() > 0)
  102.         TRACEMSG("data:n" << dataIn.substr(0, dataIn.size() - 1));
  103.     else
  104.         TRACEMSG("data: (none)");
  105.     // process known commands
  106.     PROCESS_IF_COMMAND_IS(Highlight);
  107.     PROCESS_IF_COMMAND_IS(LoadFile);
  108.     PROCESS_IF_COMMAND_IS(Exit);
  109.     // will only get here if command isn't recognized
  110.     ADD_REPLY_ERROR("Unrecognized command");
  111. }
  112. IMPLEMENT_COMMAND_FUNCTION(Highlight)
  113. {
  114.     if (dataIn.size() == 0) {
  115.         ADD_REPLY_ERROR("no identifiers given");
  116.         return;
  117.     }
  118.     // default response
  119.     *status = MessageResponder::REPLY_OKAY;
  120.     dataOut->erase();
  121.     GlobalMessenger()->RemoveAllHighlights(true);
  122.     SPLIT_DATAIN_INTO_LINES;
  123.     for (l=lines.begin(); l!=le; ++l) {
  124.         wxStringTokenizer tkz(l->c_str(), ":, t", wxTOKEN_STRTOK);
  125.         if (tkz.CountTokens() < 3) {
  126.             ADD_REPLY_ERROR(string("incomplete line: ") + *l);
  127.             continue;
  128.         }
  129. SequenceSet::SequenceList::const_iterator
  130.             s = structureWindow->glCanvas->structureSet->sequenceSet->sequences.begin(),
  131.             se = structureWindow->glCanvas->structureSet->sequenceSet->sequences.end();
  132.         // get identifier
  133.         const wxString
  134.             idType = tkz.GetNextToken(),
  135.             id = tkz.GetNextToken();
  136.         // parse gi
  137.         if (idType == "gi") {
  138.             unsigned long gi;
  139.             if (!id.ToULong(&gi)) {
  140.                 ADD_REPLY_ERROR(string("bad gi: ") + id.c_str());
  141.                 continue;
  142.             }
  143.             for (; s!=se; ++s)
  144.                 if ((*s)->identifier->gi == (int) gi)
  145.                     break;
  146.         }
  147.         // parse pdb
  148.         else if (idType == "pdb") {
  149.             if (id.size() == 4 || (id.size() == 6 && id[4] == '_')) {
  150.                 string pdbID = id.substr(0, 4).c_str();
  151.                 int pdbChain = ((id.size() == 6) ? id[5] : ' ');
  152.                 for (; s!=se; ++s)
  153.                     if ((*s)->identifier->pdbID == pdbID && (*s)->identifier->pdbChain == pdbChain)
  154.                         break;
  155.             } else {
  156.                 ADD_REPLY_ERROR(string("bad pdb id: ") + id.c_str());
  157.                 continue;
  158.             }
  159.         }
  160.         // parse accession
  161.         else if (idType == "acc") {
  162.             for (; s!=se; ++s)
  163.                 if ((*s)->identifier->accession == id.c_str())
  164.                     break;
  165.         }
  166.         else {
  167.             ADD_REPLY_ERROR(string("unrecognized id type: ") + idType.c_str());
  168.             continue;
  169.         }
  170.         if (s == se) {
  171.             ADD_REPLY_ERROR(string("sequence not found: ") + idType.c_str() + ' ' + id.c_str());
  172.             continue;
  173.         }
  174.         // now parse ranges and highlight
  175.         while (tkz.HasMoreTokens()) {
  176.             wxString range = tkz.GetNextToken();
  177.             wxStringTokenizer rangeToks(range, "-", wxTOKEN_RET_EMPTY);
  178.             if (rangeToks.CountTokens() < 1 || rangeToks.CountTokens() > 2) {
  179.                 ADD_REPLY_ERROR(string("bad range: ") + range.c_str());
  180.                 continue;
  181.             }
  182.             unsigned long from, to;
  183.             bool okay;
  184.             if (rangeToks.CountTokens() == 1) {
  185.                 okay = rangeToks.GetNextToken().ToULong(&from);
  186.                 to = from;
  187.             } else {
  188.                 okay = (rangeToks.GetNextToken().ToULong(&from) &&
  189.                             rangeToks.GetNextToken().ToULong(&to));
  190.             }
  191.             if (!okay ||
  192.                     from < 0 || from >= (*s)->Length() || to < 0 || to >= (*s)->Length() || from > to) {
  193.                 ADD_REPLY_ERROR(string("bad range value(s): ") + range.c_str());
  194.                 continue;
  195.             }
  196.             // actually do the highlighting, finally!
  197.             GlobalMessenger()->AddHighlights(*s, from, to);
  198.         }
  199.     }
  200. }
  201. IMPLEMENT_COMMAND_FUNCTION(LoadFile)
  202. {
  203.     if (dataIn.size() == 0) {
  204.         ADD_REPLY_ERROR("no file name given");
  205.         return;
  206.     }
  207.     // default response
  208.     *status = MessageResponder::REPLY_OKAY;
  209.     dataOut->erase();
  210.     // give sequence and structure windows a chance to save data
  211.     if (structureWindow->glCanvas->structureSet) {
  212.         GlobalMessenger()->SequenceWindowsSave(true);
  213.         structureWindow->SaveDialog(true, false);   // can't cancel
  214.     }
  215.     wxString stripped(wxString(dataIn.c_str()).Strip(wxString::both));
  216.     if (!structureWindow->LoadData(stripped.c_str(), true))
  217.         ADD_REPLY_ERROR(string("Error loading file '") + stripped.c_str() + "'");
  218. }
  219. IMPLEMENT_COMMAND_FUNCTION(Exit)
  220. {
  221.     // default response
  222.     *status = MessageResponder::REPLY_OKAY;
  223.     dataOut->erase();
  224.     structureWindow->Command(StructureWindow::MID_EXIT);
  225. }
  226. END_SCOPE(Cn3D)
  227. /*
  228. * ---------------------------------------------------------------------------
  229. * $Log: command_processor.cpp,v $
  230. * Revision 1000.2  2004/06/01 18:28:27  gouriano
  231. * PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.11
  232. *
  233. * Revision 1.11  2004/05/21 21:41:39  gorelenk
  234. * Added PCH ncbi_pch.hpp
  235. *
  236. * Revision 1.10  2004/03/15 18:23:01  thiessen
  237. * prefer prefix vs. postfix ++/-- operators
  238. *
  239. * Revision 1.9  2004/02/19 17:04:53  thiessen
  240. * remove cn3d/ from include paths; add pragma to disable annoying msvc warning
  241. *
  242. * Revision 1.8  2004/01/17 01:47:26  thiessen
  243. * add network load
  244. *
  245. * Revision 1.7  2004/01/17 00:17:31  thiessen
  246. * add Biostruc and network structure load
  247. *
  248. * Revision 1.6  2003/09/02 19:34:52  thiessen
  249. * implement Exit message
  250. *
  251. * Revision 1.5  2003/07/10 18:47:29  thiessen
  252. * add CDTree->Select command
  253. *
  254. * Revision 1.4  2003/07/10 13:47:22  thiessen
  255. * add LoadFile command
  256. *
  257. * Revision 1.3  2003/03/20 20:45:45  thiessen
  258. * fix wxString overload ambiguity
  259. *
  260. * Revision 1.2  2003/03/20 20:33:51  thiessen
  261. * implement Highlight command
  262. *
  263. * Revision 1.1  2003/03/14 19:23:06  thiessen
  264. * add CommandProcessor to handle file-message commands; fixes for GCC 2.9
  265. *
  266. */