示例#1
0
int main( int ac, char** av )
{
    try
    {
        comma::command_line_options options( ac, av, usage );
        const std::vector< std::string >& unnamed = options.unnamed( "--verbose,-v,--have-css,--loop" , "-.*" );
        if( unnamed.size() != 1 ) { std::cerr << "csv-to-svg: expected one operation name" << ( unnamed.size() ? "; got " + comma::join( unnamed, ' ' ) : "" ) << std::endl; return 1; }
        std::string what = unnamed[0];

        comma::csv::options csv( options );
        snark::render::colour_map colour_map;
        bool parse_colour = true;
        if( ( what == "point" || what == "circle" || what == "line" || what == "lines" ) && csv.has_field( "scalar" ) )
        {
            colour_map = parse_colour_map( options.value< std::string >( "--colour,--color,-c", "" ) );
            parse_colour = false;
        }

        if( options.exists( "--class" ) ) { snark::render::svg::element::DEFAULT_ATTRIBUTES += " class=\"" + options.value< std::string >( "--class" ) + "\""; }
        if( options.exists( "--id" ) ) { snark::render::svg::element::DEFAULT_ATTRIBUTES += " id=\"" + options.value< std::string >( "--id" ) + "\""; }
        if( options.exists( "--transform" ) ) { snark::render::svg::element::DEFAULT_ATTRIBUTES += " transform=\"" + options.value< std::string >( "--transform" ) + "\""; }
        if( options.exists( "--attributes" ) ) { snark::render::svg::element::DEFAULT_ATTRIBUTES += " " + options.value< std::string >( "--attributes" ); }
        snark::render::svg::element::DEFAULT_STYLE = make_style( options, what, parse_colour );

        if( what == "header" )
        {
            std::cout << snark::render::svg::header(
                  options.value< std::string >( "--width" )
                , options.value< std::string >( "--height" )
                , options.value< std::string >( "--viewbox" )
                , options.optional< std::string >( "--css" )
                ) << std::endl;
        }
        else if( what == "footer" ) { std::cout << snark::render::svg::footer() << std::endl; }
        else if( what == "script" ) { std::cout << snark::render::svg::script( options.value< std::string >( "--file" ) ) << std::endl; }
        else if( what == "script_begin" ) { std::cout << snark::render::svg::script::begin() << std::endl; }
        else if( what == "script_end" ) { std::cout << snark::render::svg::script::end() << std::endl; }
        else if( what == "style_begin" ) { std::cout << snark::render::svg::style::begin() << std::endl; }
        else if( what == "style_end" ) { std::cout << snark::render::svg::style::end() << std::endl; }
        else if( what == "group_begin" ) { std::cout << snark::render::svg::g() << std::endl; }
        else if( what == "group_end" ) { std::cout << snark::render::svg::g::end() << std::endl; }
        else if( what == "point" || what == "circle" )
        { 
            boost::optional< double > r = options.optional< double >( "--point-size,--weight,--radius,-r" );
            if( r ) { snark::render::svg::circle::DEFAULT_RADIUS = *r; }
            if( csv.has_field( "scalar" ) )
            {
                if( options.exists( "--binary,-b" ) ) { csv.format( comma::csv::format::value< coloured< snark::render::svg::circle > >( csv.fields, true ) ); }
                comma::csv::input_stream< coloured< snark::render::svg::circle > > istream( std::cin, csv );
                while( std::cin.good() )
                {
                    const coloured< snark::render::svg::circle >* c = istream.read();
                    if( !c ) { break; }
                    std::cout << snark::render::svg::circle( *c, colour_map( c->scalar ).hex() ) << std::endl;
                }
            }
            else
            {
                if( csv.fields.empty() ) { csv.fields = what == "point" ? "x,y" : comma::join( comma::csv::names< snark::render::svg::circle >(), ',' ); }
                if( options.exists( "--binary,-b" ) ) { csv.format( comma::csv::format::value< snark::render::svg::circle >( csv.fields, true ) ); }
                comma::csv::input_stream< snark::render::svg::circle > istream( std::cin, csv );
                while( std::cin.good() )
                {
                    const snark::render::svg::circle* c = istream.read();
                    if( !c ) { break; }
                    std::cout << *c << std::endl;
                }
            }
        }
        else if( what == "line" )
        {
            if( csv.has_field( "scalar" ) )
            {
                if( options.exists( "--binary,-b" ) ) { csv.format( options.value< std::string >( "--binary,-b", comma::csv::format::value< coloured< snark::render::svg::line > >( csv.fields, true ) ) ); }
                comma::csv::input_stream< coloured< snark::render::svg::line > > istream( std::cin, csv );
                while( std::cin.good() )
                {
                    const coloured< snark::render::svg::line >* l = istream.read();
                    if( !l ) { break; }
                    std::cout << snark::render::svg::line( *l, colour_map( l->scalar ).hex() ) << std::endl;
                }
            }
            else
            {
                if( csv.fields.empty() ) { csv.fields = comma::join( comma::csv::names< snark::render::svg::line >(), ',' ); }
                if( options.exists( "--binary,-b" ) ) { csv.format( comma::csv::format::value< snark::render::svg::line >( csv.fields, true ) ); }
                comma::csv::input_stream< snark::render::svg::line > istream( std::cin, csv );
                while( std::cin.good() )
                {
                    const snark::render::svg::line* l = istream.read();
                    if( !l ) { break; }
                    std::cout << *l << std::endl;
                }
            }
        }
        else if( what == "lines" )
        {
            if( csv.has_field( "scalar" ) )
            {
                if( options.exists( "--binary,-b" ) ) { csv.format( comma::csv::format::value< coloured< snark::render::svg::point > >( csv.fields, true ) ); }
                comma::csv::input_stream< coloured< snark::render::svg::point > > istream( std::cin, csv );
                boost::optional< coloured< snark::render::svg::point > > prev;
                while( std::cin.good() )
                {
                    const coloured< snark::render::svg::point >* p = istream.read();
                    if( !p ) { break; }
                    if( prev ) { std::cout << snark::render::svg::line( prev->x, prev->y, p->x, p->y, colour_map( prev->scalar ).hex() ) << std::endl; }
                    prev = *p;
                }
            }
            else
            {
                if( csv.fields.empty() ) { csv.fields = comma::join( comma::csv::names< snark::render::svg::point >(), ',' ); }
                if( options.exists( "--binary,-b" ) ) { csv.format( comma::csv::format::value< snark::render::svg::point >( csv.fields, true ) ); }
                comma::csv::input_stream< snark::render::svg::point > istream( std::cin, csv );
                boost::optional< snark::render::svg::point > prev;
                while( std::cin.good() )
                {
                    const snark::render::svg::point* p = istream.read();
                    if( !p ) { break; }
                    if( prev ) { std::cout << snark::render::svg::line( prev->x, prev->y, p->x, p->y ) << std::endl; }
                    prev = *p;
                }
            }
        }
        else if( what == "polyline" )
        {
            if( csv.fields.empty() ) { csv.fields = comma::join( comma::csv::names< snark::render::svg::point >(), ',' ); }
            if( options.exists( "--binary,-b" ) ) { csv.format( comma::csv::format::value< snark::render::svg::point >( csv.fields, true ) ); }
            comma::csv::input_stream< snark::render::svg::point > istream( std::cin, csv );
            snark::render::svg::polyline polyline;
            while( std::cin.good() )
            {
                const snark::render::svg::point* p = istream.read();
                if( !p ) { break; }
                polyline.points.push_back( *p );
            }
            if( polyline.points.size() )
            {
                if( options.exists( "--loop" ) ) { polyline.points.push_back( polyline.points[0] ); }
                std::cout << polyline << std::endl;
            }
        }
        else if( what == "polygon" )
        {
            if( csv.fields.empty() ) { csv.fields = comma::join( comma::csv::names< snark::render::svg::point >(), ',' ); }
            if( options.exists( "--binary,-b" ) ) { csv.format( comma::csv::format::value< snark::render::svg::point >( csv.fields, true ) ); }
            comma::csv::input_stream< snark::render::svg::point > istream( std::cin, csv );
            snark::render::svg::polygon polygon;
            boost::optional< snark::render::svg::point > first;
            boost::optional< snark::render::svg::point > prev;
            while( std::cin.good() )
            {
                const snark::render::svg::point* p = istream.read();
                if( !p ) { break; }
                if( !first ) { first = *p; }
                polygon.points.push_back( *p );
                prev = *p;
            }
            if( polygon.points.size() ) { std::cout << polygon << std::endl; }
        }
        else if( what == "text" )
        {
            if( csv.has_field( "scalar" ) )
            {
                comma::csv::input_stream< coloured< snark::render::svg::text > > istream( std::cin, csv );
                while( std::cin.good() )
                {
                    const coloured< snark::render::svg::text >* t = istream.read();
                    if( !t ) { break; }
                    std::cout << snark::render::svg::text( *t, colour_map( t->scalar ).hex() ) << std::endl;
                }
            }
            else
            {
                if( csv.fields.empty() ) { csv.fields = comma::join( comma::csv::names< snark::render::svg::text >(), ',' ); }
                comma::csv::input_stream< snark::render::svg::text > istream( std::cin, csv );
                while( std::cin.good() )
                {
                    const snark::render::svg::text* t = istream.read();
                    if( !t ) { break; }
                    std::cout << *t << std::endl;
                }
            }
        }
        else
        {
            std::cerr << "csv-to-svg: unrecognized operation: \"" << what << "\"" << std::endl;
            return 1;
        }

        return 0;
    }
    catch( std::exception& ex )
    {
        std::cerr << "csv-to-svg: " << ex.what() << std::endl;
    }
    catch( ... )
    {
        std::cerr << "csv-to-svg: unknown exception" << std::endl;
    }
    return 1;
}
// ---------------------------------------------------------------------------
// Constructeur::crŽation
// ------------
bMacMapType::bMacMapType(	const char* hname, 
							const char* hpath,
							const char* data,
							int hkind,
							int ttype, 
							int* status)
			:_bse(this){
_bTrace_("bMacMapType::bMacMapType(char*,char*,char*,int,int*)",true);
	_iter=NULL;
	_styles=NULL;
	_idx=_MMAPP_->typesMgr()->count()+1;
	_kind=hkind;
	_rmv=0;
    read_load_area();
                
int	xtype=get_sign(ttype);

_tm_("creating type with "+(UInt32*)&xtype+" storage");
_tm_("creating type hname="+hname);
_tm_("creating type hpath="+hpath);
//_tm_("creating type data="+data);
_tm_("creating type hkind="+hkind);
_tm_("creating type ttype="+ttype);
	
	_id=time(NULL);
	_state=0;
	_kind=hkind;
	_bounds.top=-__BOUNDS_MAX__;
	_bounds.left=-__BOUNDS_MAX__;
	_bounds.bottom=__BOUNDS_MAX__;
	_bounds.right=__BOUNDS_MAX__;
//	snprintf(_name,256,hname);
//_tm_("avant strncpy");
	strncpy(_name,hname,sizeof(_name)-1);

bGenericUnit*	u=map_doc->dist_resolution_unit();

	_precs=map_doc->dist_resolution();
	_unit2m=u->coef();
	_srid=map_doc->srid();
	_nbalive=0;
	_nbkilled=0;
	_nsel=0;
	_ncnt=0;

//_tm_("avant _bse.create");
	*status=_bse.create(hpath,xtype,_srid,_precs,_unit2m,_name,data,_kind);
	if(*status){
_te_("status = "+(*status)+" at _bse.create");
		return;
	}
		
//_tm_("avant make_style");
	if(!make_style()){
		(*status)=-1;
_te_("make_style == false");
		return;
	}

	if(((*status)=_bse.h_read(1,kHDR_id_,&_id))){
_te_("status = "+(*status)+" at _bse.h_read kHDR_id_");
		return;
	}
	if(((*status)=_bse.h_read(1,kHDR_state_,&_state))){
_te_("status = "+(*status)+" at _bse.h_read kHDR_state_");
		return;
	}
	if(((*status)=_bse.h_read(1,kHDR_kind_,&_kind))){
_te_("status = "+(*status)+" at _bse.h_read kHDR_kind_");
		return;
	}
	if(((*status)=_bse.h_read(1,kHDR_bounds_,&_bounds))){
_te_("status = "+(*status)+" at _bse.h_read kHDR_bounds_");
		return;
	}
	if(((*status)=_bse.h_read(1,kHDR_name_,_name))){
_te_("status = % atd _bse.h_read kHDR_name_");
		return;
	}
	if(((*status)=_bse.h_read(1,kHDR_precs_,&_precs))){
_te_("status = "+(*status)+" at _bse.h_read kHDR_precs_");
		return;
	}
	if(((*status)=_bse.h_read(1,kHDR_unit2m_,&_unit2m))){
_te_("status = "+(*status)+" at _bse.h_read kHDR_unit2m_");
		return;
	}
	if(((*status)=_bse.h_read(1,kHDR_srid_,&_srid))){
_te_("status = "+(*status)+" at _bse.h_read kHDR_srid_");
		return;
	}

_tm_("bounds are ("+_trrect_(_bounds));

gi_init_p gp={&_bounds,status,SetFlag,GetFlag,GetBounds,ObjIDComp};
	_iter=(bGenericGeoIterator*)(extmgr->get_component(kComponentGeoIterator)->i_allocate(xtype,_MMAPP_,&gp));
	if(!_iter){
		(*status)=-1;
		return;
	}
		
	_styles=new bStyleMgr(this,status);
	if((*status)){
_te_("status = "+(*status)+" at new bStyleMgr");
		return;
	}
	
	(*status)=noErr;
}