1- use std:: ops:: { Deref , DerefMut } ;
1+ use std:: {
2+ cell:: Cell ,
3+ ops:: { Deref , DerefMut } ,
4+ } ;
25
36use altium:: draw:: {
47 Canvas ,
@@ -15,10 +18,22 @@ use eframe::egui;
1518use egui:: { Align2 , Color32 , RichText , Stroke } ;
1619use egui_plot:: { Line , PlotPoint , PlotPoints , PlotUi , Polygon , Text } ;
1720
18- pub struct PlotUiWrapper < ' a > ( pub & ' a mut PlotUi ) ;
21+ /// Names must be unique, so just use a counter.
22+ macro_rules! inc_id {
23+ ( $name: literal) => { {
24+ thread_local! {
25+ static INDEX : Cell <u64 > = Cell :: new( 0 ) ;
26+ }
27+ let idx = INDEX . get( ) ;
28+ INDEX . set( idx + 1 ) ;
29+ format!( "{}{idx:06}" , $name)
30+ } } ;
31+ }
32+
33+ pub struct PlotUiWrapper < ' a > ( pub & ' a mut PlotUi < ' a > ) ;
1934
20- impl Deref for PlotUiWrapper < ' _ > {
21- type Target = PlotUi ;
35+ impl < ' a > Deref for PlotUiWrapper < ' a > {
36+ type Target = PlotUi < ' a > ;
2237
2338 fn deref ( & self ) -> & Self :: Target {
2439 self . 0
@@ -36,36 +51,42 @@ impl altium::sealed::Sealed for PlotUiWrapper<'_> {}
3651impl Canvas for PlotUiWrapper < ' _ > {
3752 fn draw_text ( & mut self , item : DrawText ) {
3853 let txt = RichText :: new ( item. text ) . size ( f32:: from ( item. font . size ( ) ) * 2.0 ) ;
39- // let txt = RichText::new(item.text).size(f32::from(item.font.size()) * 13.8);
54+ let txt = RichText :: new ( item. text ) . size ( f32:: from ( item. font . size ( ) ) * 13.8 ) ;
4055 self . text (
41- Text :: new ( PlotPoint :: new ( item. x , item. y ) , txt)
56+ Text :: new ( inc_id ! ( "canvas.text" ) , PlotPoint :: new ( item. x , item. y ) , txt)
4257 . anchor ( to_align2 ( item. anchor_v , item. anchor_h ) )
4358 . color ( to_c32 ( item. color ) ) ,
4459 ) ;
4560 }
4661
4762 fn draw_line ( & mut self , item : DrawLine ) {
4863 self . line (
49- Line :: new ( vec ! [
50- [ f64 :: from( item. start. x( ) ) , f64 :: from( item. start. y( ) ) ] ,
51- [ f64 :: from( item. end. x( ) ) , f64 :: from( item. end. y( ) ) ] ,
52- ] )
64+ Line :: new (
65+ inc_id ! ( "canvas.line" ) ,
66+ vec ! [
67+ [ f64 :: from( item. start. x( ) ) , f64 :: from( item. start. y( ) ) ] ,
68+ [ f64 :: from( item. end. x( ) ) , f64 :: from( item. end. y( ) ) ] ,
69+ ] ,
70+ )
5371 . color ( to_c32 ( item. color ) )
5472 . width ( item. width as f32 ) ,
5573 ) ;
5674 }
5775
5876 fn draw_rectangle ( & mut self , item : DrawRectangle ) {
59- let poly = Polygon :: new ( vec ! [
60- [ f64 :: from( item. x) , f64 :: from( item. y) ] ,
61- [ f64 :: from( item. x + item. width) , f64 :: from( item. y) ] ,
62- [
63- f64 :: from( item. x + item. width) ,
64- f64 :: from( item. y + item. height) ,
77+ let poly = Polygon :: new (
78+ inc_id ! ( "canvas.rect" ) ,
79+ vec ! [
80+ [ f64 :: from( item. x) , f64 :: from( item. y) ] ,
81+ [ f64 :: from( item. x + item. width) , f64 :: from( item. y) ] ,
82+ [
83+ f64 :: from( item. x + item. width) ,
84+ f64 :: from( item. y + item. height) ,
85+ ] ,
86+ [ f64 :: from( item. x) , f64 :: from( item. y + item. height) ] ,
87+ [ f64 :: from( item. x) , f64 :: from( item. y) ] ,
6588 ] ,
66- [ f64 :: from( item. x) , f64 :: from( item. y + item. height) ] ,
67- [ f64 :: from( item. x) , f64 :: from( item. y) ] ,
68- ] )
89+ )
6990 . stroke ( Stroke {
7091 // width: f32::from(item.stroke_width) * 20.0,
7192 width : 10.0 ,
@@ -80,6 +101,7 @@ impl Canvas for PlotUiWrapper<'_> {
80101
81102 fn draw_polygon ( & mut self , item : DrawPolygon ) {
82103 let poly = Polygon :: new (
104+ inc_id ! ( "canvas.poly" ) ,
83105 item. locations
84106 . iter ( )
85107 . map ( |loc| [ f64:: from ( loc. x ( ) ) , f64:: from ( loc. y ( ) ) ] )
0 commit comments