Changeset 1342

Show
Ignore:
Timestamp:
10/19/09 10:22:11 (9 months ago)
Author:
artem
Message:

+ patch from Dane Springmeyer improves pickling support

for mapnik.Map object ( needs some more work!!)


Location:
trunk/bindings/python
Files:
1 added
3 modified

Legend:

Unmodified
Added
Removed
  • trunk/bindings/python/mapnik/__init__.py

    r1319 r1342  
    241241            attr[prop[0]] = prop[1] 
    242242        return attr 
     243 
     244class _Symbolizer(Symbolizer,_injector): 
     245    def symbol(self): 
     246        return getattr(self,self.type())() 
    243247 
    244248#class _Filter(Filter,_injector): 
  • trunk/bindings/python/mapnik_python.cpp

    r1278 r1342  
    4747void export_datasource(); 
    4848void export_datasource_cache(); 
     49void export_symbolizer(); 
    4950void export_point_symbolizer(); 
    5051void export_line_symbolizer(); 
     
    295296    export_stroke(); 
    296297    export_datasource_cache(); 
     298    export_symbolizer(); 
    297299    export_point_symbolizer(); 
    298300    export_line_symbolizer(); 
     
    471473    def("has_cairo", &has_cairo, "Get cairo library status"); 
    472474    def("has_pycairo", &has_pycairo, "Get pycairo module status"); 
    473          
    474     using mapnik::symbolizer; 
    475     class_<symbolizer>("Symbolizer",no_init) 
    476        ; 
    477      
     475 
    478476    register_ptr_to_python<mapnik::filter_ptr>(); 
    479477} 
  • trunk/bindings/python/mapnik_rule.cpp

    r997 r1342  
    4444using mapnik::text_symbolizer; 
    4545using mapnik::building_symbolizer; 
     46using mapnik::markers_symbolizer; 
    4647using mapnik::symbolizer; 
    4748using mapnik::symbolizers; 
     49 
     50struct pickle_symbolizer : public boost::static_visitor<> 
     51{ 
     52    public: 
     53        pickle_symbolizer( boost::python::list syms):  
     54        syms_(syms) {} 
     55         
     56        void operator () ( const  point_symbolizer & sym ) 
     57        { 
     58            syms_.append(sym); 
     59        } 
     60     
     61        void operator () ( const line_symbolizer & sym ) 
     62        { 
     63            syms_.append(sym); 
     64        } 
     65     
     66        void operator () ( const line_pattern_symbolizer & sym ) 
     67        { 
     68            syms_.append(sym); 
     69        } 
     70     
     71        void operator () ( const polygon_symbolizer & sym ) 
     72        { 
     73            syms_.append(sym); 
     74        } 
     75     
     76        void operator () ( const polygon_pattern_symbolizer & sym ) 
     77        { 
     78            syms_.append(sym); 
     79        } 
     80     
     81        void operator () ( const raster_symbolizer & sym ) 
     82        { 
     83            syms_.append(sym); 
     84        } 
     85     
     86        void operator () ( const shield_symbolizer & sym ) 
     87        { 
     88            syms_.append(sym); 
     89        } 
     90     
     91        void operator () ( const text_symbolizer & sym ) 
     92        { 
     93            syms_.append(sym); 
     94        } 
     95     
     96        void operator () ( const building_symbolizer & sym ) 
     97        { 
     98            syms_.append(sym); 
     99        } 
     100     
     101        void operator () ( markers_symbolizer const& ) 
     102        { 
     103            //TODO 
     104        } 
     105 
     106    private: 
     107        boost::python::list syms_; 
     108 
     109}; 
     110 
     111struct extract_symbolizer : public boost::static_visitor<> 
     112{ 
     113    public: 
     114        extract_symbolizer( rule_type& r):  
     115        r_(r) {} 
     116         
     117        void operator () ( const  point_symbolizer & sym ) 
     118        { 
     119             
     120            r_.append(sym); 
     121        } 
     122     
     123        void operator () ( const line_symbolizer & sym ) 
     124        { 
     125            r_.append(sym); 
     126        } 
     127     
     128        void operator () ( const line_pattern_symbolizer & sym ) 
     129        { 
     130            r_.append(sym); 
     131        } 
     132     
     133        void operator () ( const polygon_symbolizer & sym ) 
     134        { 
     135            r_.append(sym); 
     136        } 
     137     
     138        void operator () ( const polygon_pattern_symbolizer & sym ) 
     139        { 
     140            r_.append(sym); 
     141        } 
     142     
     143        void operator () ( const raster_symbolizer & sym ) 
     144        { 
     145            r_.append(sym); 
     146        } 
     147     
     148        void operator () ( const shield_symbolizer & sym ) 
     149        { 
     150            r_.append(sym); 
     151        } 
     152     
     153        void operator () ( const text_symbolizer & sym ) 
     154        { 
     155            r_.append(sym); 
     156        } 
     157     
     158        void operator () ( const building_symbolizer & sym ) 
     159        { 
     160            r_.append(sym); 
     161        } 
     162     
     163        void operator () ( markers_symbolizer const& ) 
     164        { 
     165            //TODO 
     166        } 
     167 
     168    private: 
     169        rule_type& r_; 
     170 
     171}; 
    48172 
    49173struct rule_pickle_suite : boost::python::pickle_suite 
     
    59183   { 
    60184        boost::python::list syms; 
    61         symbolizers::const_iterator it = r.begin(); 
    62         symbolizers::const_iterator end = r.end(); 
    63         for (; it != end; ++it) 
    64         { 
    65             syms.append( *it );     
    66         } 
     185         
     186        symbolizers::const_iterator begin = r.get_symbolizers().begin(); 
     187        symbolizers::const_iterator end = r.get_symbolizers().end();         
     188        pickle_symbolizer serializer( syms ); 
     189        std::for_each( begin, end , boost::apply_visitor( serializer )); 
    67190         
    68191        // Here the filter string is used rather than the actual Filter object 
     
    92215        if (state[1]) 
    93216        { 
    94             std::string filter_expr=extract<std::string>(state[1]); 
    95             r.set_filter(mapnik::create_filter(filter_expr,"utf8")); 
     217            rule_type dfl; 
     218            std::string filter = extract<std::string>(state[1]); 
     219            std::string default_filter = dfl.get_filter()->to_string(); 
     220            if ( filter != default_filter) 
     221            { 
     222                r.set_filter(mapnik::create_filter(filter,"utf8")); 
     223            } 
    96224        }     
    97225 
     
    102230         
    103231        boost::python::list syms=extract<boost::python::list>(state[3]); 
     232        extract_symbolizer serializer( r ); 
    104233        for (int i=0;i<len(syms);++i) 
    105234        { 
    106             r.append(extract<symbolizer>(syms[i])); 
    107         } 
    108          
     235            symbolizer symbol = extract<symbolizer>(syms[i]); 
     236            boost::apply_visitor( serializer, symbol ); 
     237        }         
    109238   } 
    110239 
     
    131260        .def(init<std::string const&, 
    132261             boost::python::optional<std::string const&,double,double> >()) 
    133         .def_pickle(rule_pickle_suite() 
    134            ) 
     262        .def_pickle(rule_pickle_suite()) 
    135263        .add_property("name",make_function 
    136264                      (&rule_type::get_name,