Skip to main content

default_write/
default_write.rs

1#![expect(
2    clippy::print_stdout,
3    reason = "the example intentionally displays the map data it reads"
4)]
5#![expect(
6    clippy::unwrap_used,
7    reason = "the bundled default map is known to contain these symbols and colors"
8)]
9
10use geo_types::{Coord, LineString};
11#[cfg(feature = "geo_ref")]
12use omap::geo_referencing::CrsType;
13use omap::{
14    Code, Error, Omap,
15    colors::Color,
16    objects::LineObject,
17    symbols::{PublicOrPrivateSymbol, Symbol, WeakLinePathSymbol},
18};
19
20fn main() -> Result<(), Error> {
21    #[cfg(feature = "geo_ref")]
22    let mut map = {
23        let proj_center = Coord {
24            x: 463_575.5,
25            y: 6_833_849.6,
26        };
27        let map_center_elevation_meters = 2_469.;
28        let crs_epsg_code = 25832;
29        Omap::default_15_000_geo_referenced(
30            proj_center,
31            CrsType::Epsg(crs_epsg_code),
32            map_center_elevation_meters,
33        )?
34    };
35    #[cfg(not(feature = "geo_ref"))]
36    let mut map = Omap::default_15_000()?;
37
38    for color in map.colors.iter() {
39        match color {
40            Color::SpotColor(ref_cell) => {
41                let b = ref_cell.try_borrow().unwrap();
42                println!("{} with spot name {}", b.color_name, b.spotcolor_name);
43            }
44            Color::MixedColor(ref_cell) => {
45                println!("{}", ref_cell.try_borrow().unwrap().color_name);
46            }
47        }
48    }
49
50    let erosion_gully = map
51        .symbols
52        .get_symbol_by_code(Code::new(107, 0, 0))
53        .unwrap()
54        .downgrade();
55
56    let mut ls = LineObject::new(
57        WeakLinePathSymbol::try_from(erosion_gully).unwrap(),
58        // geometry coordinates are always in mm of paper
59        LineString::new(vec![Coord { x: 0., y: 0. }, Coord { x: 200., y: 100. }]),
60    );
61    ls.tags.insert("Some Key".to_owned(), "My value".to_owned());
62
63    map.parts.0[0].add_object(ls);
64
65    println!("\nCombined Line symbols:");
66    for symbol in map.symbols.iter() {
67        if let Symbol::CombinedLine(s) = symbol {
68            println!("{}", s.borrow().common.name);
69        }
70    }
71    if let Some(s) = map.symbols.get_symbol_by_name("Railway, Olive background") {
72        println!("{s:?}");
73    }
74
75    let mut num = 0;
76    for symbol in map.symbols.iter() {
77        if let Symbol::Line(s) = symbol {
78            let borrowed = s.borrow();
79
80            if let Some(_ss_) = &borrowed.start_symbol {
81                num += 1;
82            }
83            if let Some(_ms_) = &borrowed.mid_symbol {
84                num += 1;
85            }
86            if let Some(_ds_) = &borrowed.dash_symbol {
87                num += 1;
88            }
89            if let Some(_es_) = &borrowed.end_symbol {
90                num += 1;
91            }
92        }
93        if let Symbol::CombinedLine(s) = symbol {
94            let borrowed = s.borrow();
95
96            for part in borrowed.components() {
97                if let PublicOrPrivateSymbol::Private(s) = part {
98                    if let Some(_ss_) = &s.start_symbol {
99                        num += 1;
100                    }
101                    if let Some(_ms_) = &s.mid_symbol {
102                        num += 1;
103                    }
104                    if let Some(_ds_) = &s.dash_symbol {
105                        num += 1;
106                    }
107                    if let Some(_es_) = &s.end_symbol {
108                        num += 1;
109                    }
110                }
111            }
112        }
113    }
114    println!("\nNumber of sub symbols in line symbols: {num}");
115
116    map.write_to_file("./test_write.omap")
117}