cmdln_demo.cpp

来自「ncbi源码」· C++ 代码 · 共 309 行

CPP
309
字号
/* * =========================================================================== * PRODUCTION $Log: cmdln_demo.cpp,v $ * PRODUCTION Revision 1000.2  2004/06/01 20:49:44  gouriano * PRODUCTION PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.6 * PRODUCTION * =========================================================================== *//*  $Id: cmdln_demo.cpp,v 1000.2 2004/06/01 20:49:44 gouriano Exp $ * =========================================================================== * *                            PUBLIC DOMAIN NOTICE *               National Center for Biotechnology Information * *  This software/database is a "United States Government Work" under the *  terms of the United States Copyright Act.  It was written as part of *  the author's official duties as a United States Government employee and *  thus cannot be copyrighted.  This software/database is freely available *  to the public for use. The National Library of Medicine and the U.S. *  Government have not placed any restriction on its use or reproduction. * *  Although all reasonable efforts have been taken to ensure the accuracy *  and reliability of the software and data, the NLM and the U.S. *  Government do not and cannot warrant the performance or results that *  may be obtained by using this software or data. The NLM and the U.S. *  Government disclaim all warranties, express or implied, including *  warranties of performance, merchantability or fitness for any particular *  purpose. * *  Please cite the author in any work or product based on this material. * * =========================================================================== * * Authors:  Andrey Yazhuk * * File Description: * Class CCmdLineGraphDemoApp is a command line demo application using  * "gui_graph" library to render Chart graph and saving it in a file.  */ #include <ncbi_pch.hpp>#include <gui/opengl.h>#include <corelib/ncbiapp.hpp>#include <corelib/ncbiargs.hpp>#include <util/image/image_io.hpp>#include <gui/opengl/mesa/glcgi_image.hpp>#include <gui/opengl/mesa/gloscontext.hpp>#include <gui/opengl/glcolortable.hpp>#include <util/image/image.hpp>#include <util/image/image_io.hpp>#include <gui/opengl/glpane.hpp>#include <gui/graph/combo_chart.hpp>#include <gui/graph/graph_panel.hpp>#include <gui/graph/legend.hpp>#include <math.h>#include <stdio.h>USING_NCBI_SCOPE;//// content-type headers for images//struct SContentType{    CImageIO::EType m_Type;    const char* m_Encoding;};static const SContentType kContentTypes[] = {    { CImageIO::eBmp,  "bmp" },    { CImageIO::eGif,  "gif" },    { CImageIO::eJpeg, "jpeg" },    { CImageIO::ePng,  "png" },    { CImageIO::eSgi,  "sgi" },    { CImageIO::eTiff, "tiff" },    { CImageIO::eXpm,  "xmp" },    // must be last    { CImageIO::eUnknown, NULL }};///////////////////////////////////////////////////////////////////////////////  CCmdLineGraphDemoApp::class CCmdLineGraphDemoApp : public CNcbiApplication{public:	CCmdLineGraphDemoApp();protected:    virtual void Init(void);    virtual int  Run(void);    virtual void Exit(void);    bool 	GenerateImage();	void	Render();protected:    // dimensions of our virtual frame buffer    size_t m_Width;    size_t m_Height;    // the image format we will emit - default is PNG    CImageIO::EType m_Format;    // our off-screen renderer    CRef<CGlOsContext> m_Context;};/////////////////////////////////////////////////////////////////////////////// CCmdLineGraphDemoApp constructorCCmdLineGraphDemoApp::CCmdLineGraphDemoApp():	m_Width(640),	m_Height(480),	m_Format(CImageIO::eUnknown){}///////////////////////////////////////////////////////////////////////////////  Init test for all different types of argumentsvoid CCmdLineGraphDemoApp::Init(void){    // Create command-line argument descriptions class    auto_ptr<CArgDescriptions> arg_desc(new CArgDescriptions);    arg_desc->SetUsageContext(GetArguments().GetProgramBasename(),                              "CCmdLineGraphDemoApp demo program");    arg_desc->AddPositional        ("filename",         "Output file name",         CArgDescriptions::eOutputFile,		 CArgDescriptions::fPreOpen | CArgDescriptions::fBinary);    arg_desc->AddOptionalPositional        ("fmt",         "Graphical format - one of the following: bmp, gif, jpeg, png, sgi, tiff, xmp",         CArgDescriptions::eString);    // Setup arg.descriptions for this application    SetupArgDescriptions(arg_desc.release());}///////////////////////////////////////////////////////////////////////////////  Run test (printout arguments obtained from command-line)int CCmdLineGraphDemoApp::Run(void){    // Get arguments	CArgs args = GetArgs();	string sFilename = args["filename"].AsString();	if (args["fmt"]) {		string sFormat = args["fmt"].AsString();		for( int i = 0; ;i++ ) {			const SContentType& Type = kContentTypes[i];			if (Type.m_Encoding == NULL  ||  sFormat == Type.m_Encoding) {				m_Format = Type.m_Type;				break;			}		}		if(m_Format == CImageIO::eUnknown) {			cout << "Unknown graphical format: " << sFormat << endl;			return 1;		}	} else m_Format = CImageIO::ePng;	//select image format		if (GenerateImage())        cout << "Done." << endl;	CImageIO::WriteImage(m_Context->GetBuffer(), sFilename, m_Format);	return 0;}/////////////////////////////////////////////////////////////////////////////// InitContextbool CCmdLineGraphDemoApp::GenerateImage(){	// initalizing drawing context with specified Width and Height	m_Context.Reset(new CGlOsContext(m_Width, m_Height));	if (m_Context  &&  m_Context->MakeCurrent() ) {		// call the rendering fucntion		Render();			// call glFinish() - VERY IMPORTANT FOR OFF_SCREEN RENDERING		// this forces any buffered OpenGL requests to complete now.		glFinish();		// final image preparation		// the image is upside-down because frame buffers are, in general,		// upside-down.  Also, we have an alpha channel we need to flatten.		m_Context->SetBuffer().SetDepth(3);		m_Context->SetBuffer().Flip();		return true;	} else {		LOG_POST(Error << "CCmdLineGraphDemoApp::GenerateImage(): "		"Failed to initialized drawing context.");		return false;	}	}void CCmdLineGraphDemoApp::Render(){    //Create graph	int ElemsN = 20;	int SeriesN = 4;	CComboChartDataSource *pChartDS = new CComboChartDataSource(SeriesN, ElemsN);	pChartDS->CreateArrays();	// generating data for the Data Source	for( int i = 0;  i< SeriesN;  i++ ) {		CComboChartDataSource::TValueCont& Cont = pChartDS->GetValueContainer(i);		char S[30];		sprintf(S, "Series %d", i);		pChartDS->GetLabelContainer()[i] = S; // graph name		for( int j = 0; j < ElemsN; j++ ) {    		Cont[j] = sin(i + (i/10 + 0.05)*j) + j * 0.01;		}	}	CComboChart* pChart = new CComboChart();	//pChart->SetStyle(CComboChart::eBarChart);  //optional style	pChart->SetDataSource(pChartDS);	pChart->AssignAutoMarkers();	pChart->AssignAutoColors();	// create and setup Graph Panel	CGraphPanel Panel;	Panel.Create();	Panel.SetRect(TVPRect(0, 0, m_Width - 1, m_Height - 1));	Panel.SetLayout(100, 25, 100, 45);	Panel.AddGraph(static_cast<IGraph*>(pChart));	Panel.GetLegend()->SetDataSource(static_cast<IGraphDataSource*>(pChart));		Panel.GetGraphPane().ZoomAll();	Panel.Render();	delete pChartDS;	delete pChart;}///////////////////////////////////////////////////////////////////////////////  Cleanupvoid CCmdLineGraphDemoApp::Exit(void){    SetDiagStream(0);}///////////////////////////////////////////////////////////////////////////////  MAINint main(int argc, const char* argv[]){    // Execute main application function    return CCmdLineGraphDemoApp().AppMain(argc, argv, 0, eDS_Default, 0);}/* * =========================================================================== * $Log: cmdln_demo.cpp,v $ * Revision 1000.2  2004/06/01 20:49:44  gouriano * PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.6 * * Revision 1.6  2004/05/21 22:27:43  gorelenk * Added PCH ncbi_pch.hpp * * Revision 1.5  2004/03/16 17:16:18  yazhuk * Updated include to glpane.hpp * * Revision 1.4  2003/12/10 21:32:30  ucko * +<stdio.h> for sprintf() * * Revision 1.3  2003/08/15 17:38:46  ucko * Fixed CVS keywords so they'll actually expand. * * =========================================================================== */

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?