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

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: display_with_tv.cpp,v $
  4.  * PRODUCTION Revision 1000.1  2004/06/01 20:57:03  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.3
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. /*  $Id: display_with_tv.cpp,v 1000.1 2004/06/01 20:57:03 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:  Josh Cherry
  35.  *
  36.  * File Description:  gbench plugin for displaying a phylogenetic tree
  37.  *                    using the tv application
  38.  *
  39.  */
  40. #include <ncbi_pch.hpp>
  41. #include "display_with_tv.hpp"
  42. #include <gui/core/idocument.hpp>
  43. #include <gui/core/plugin_utils.hpp>
  44. #include <gui/plugin/PluginCommandSet.hpp>
  45. #include <gui/plugin/PluginValue.hpp>
  46. #include <gui/plugin/PluginInfo.hpp>
  47. #include <gui/plugin/PluginReply.hpp>
  48. #include <gui/plugin/PluginRequest.hpp>
  49. #include <gui/plugin/PluginValueConstraint.hpp>
  50. #include <gui/core/version.hpp>
  51. #include <gui/core/doc_manager.hpp>
  52. #include <gui/objutils/utils.hpp>
  53. #include <gui/utils/message_box.hpp>
  54. #include <util/random_gen.hpp>
  55. #include <gui/utils/file_deletion.hpp>
  56. #include <corelib/ncbifile.hpp>
  57. #include <corelib/ncbiexec.hpp>
  58. #include <algo/phy_tree/phy_tree_serial.hpp>
  59. BEGIN_NCBI_SCOPE
  60. USING_SCOPE(objects);
  61. // standard info boilerplate
  62. void CAlgoPlugin_DisplayWithTv::GetInfo(CPluginInfo& info)
  63. {
  64.     info.Reset();
  65.     // version info macro
  66.     info.SetInfo(CPluginVersion::eMajor, CPluginVersion::eMinor, 0,
  67.                  string(__DATE__) + " " + string(__TIME__),
  68.                  "CAlgoPlugin_DisplayWithTv",
  69.                  "Phylogenetic trees/Display using tv",
  70.                  "Display phylogenetic tree using the tv program",
  71.                  "");
  72.     // command info
  73.     CPluginCommandSet& cmds = info.SetCommands();
  74.     CPluginCommand&    args = cmds.AddAlgoCommand(eAlgoCommand_run);
  75.     args.AddArgument("tree", "Tree", CPhyTreeSerial::GetTypeInfo());
  76. }
  77. void CAlgoPlugin_DisplayWithTv::RunCommand(CPluginMessage& msg)
  78. {
  79.     const CPluginCommand& args = msg.GetRequest().GetCommand();
  80.     CPluginReply& reply = msg.SetReply();
  81.     _TRACE("CAlgoPlugin_DisplayWithTv::Run()");
  82.     const CPhyTreeSerial *tree =
  83.         dynamic_cast<const CPhyTreeSerial *>(&args["tree"].AsObject());
  84.     if (!tree) {
  85.         throw runtime_error("CAlgoPlugin_DisplayWithTv::Save: not a tree");
  86.     }
  87.     // make the file name end in appropriate extension
  88.     CRandom r(time(0));
  89.     string fname;
  90.     const int max_tries = 100;
  91.     int i;
  92.     for (i = 0;  i < max_tries;  i++) {
  93.         fname = CFile::GetTmpName();
  94.         fname += NStr::IntToString(r.GetRand()) + ".tre";
  95.         CFile file(fname);
  96.         if (!file.Exists()) {
  97.             break;
  98.         }
  99.     }
  100.     if (i == max_tries) {
  101.         LOG_POST(Error << "Couldn't create temporary file");
  102.         return;
  103.     }
  104.     CNcbiOfstream tmpfile(fname.c_str());
  105.     WriteNexusTree(tmpfile, tree->GetTree());
  106.     tmpfile.close();
  107.     CDeleteAtExit::Add(fname);
  108.     int exit_status = CExec::SpawnLP(CExec::eDetach, "tv",
  109.                                      fname.c_str(), 0);
  110.     if (exit_status != -1) {
  111.         reply.SetStatus(eMessageStatus_success);
  112.     } else {
  113.         NcbiMessageBox("Error launching tv; make sure tv is installed"
  114.                        " and on your path");
  115.     }
  116. }
  117. END_NCBI_SCOPE
  118. /*
  119.  * ===========================================================================
  120.  * $Log
  121.  * ===========================================================================
  122.  */