From 656ff21b71b96d4e611f0e08165b26a62d44ae1c Mon Sep 17 00:00:00 2001 From: Ted Moore Date: Thu, 28 Oct 2021 19:13:10 +0100 Subject: [PATCH] FluidPlotter is beta --- release-packaging/Classes/FluidPlotter.sc | 118 +++++++++++++++------- test/FluidPlotter_test.scd | 53 ++++++++-- 2 files changed, 124 insertions(+), 47 deletions(-) diff --git a/release-packaging/Classes/FluidPlotter.sc b/release-packaging/Classes/FluidPlotter.sc index f9fa27e..2be0860 100644 --- a/release-packaging/Classes/FluidPlotter.sc +++ b/release-packaging/Classes/FluidPlotter.sc @@ -1,5 +1,23 @@ +FluidPlotterPoint { + var id, color, <>sizeMultiplier = 1; + + *new { + arg id, x, y, color, sizeMultiplier = 1; + ^super.new.init(id,x,y,color,sizeMultiplier); + } + + init { + arg id_, x_, y_, color_, sizeMultiplier_ = 1; + id = id_; + x = x_; + y = y_; + color = color_ ? Color.black; + sizeMultiplier = sizeMultiplier_; + } +} + FluidPlotter { - var (catColors.size-1),{"FluidPlotter:setCategories_ FluidPlotter doesn't have that many category colors. You can use the method 'setColor_' to set colors for individual points.".warn}); + col = catColors[cat]; + pt.color_(col); + }); + this.refresh; + } + + setSizeMultiplier_ { + arg identifier, sizeMultiplier; + if(dict_internal.at(identifier).notNil,{ + dict_internal.at(identifier).sizeMultiplier_(sizeMultiplier); + this.refresh; + },{ + "FluidPlotter::setSizeMultiplier_ identifier not found".warn; + }); + } + + setPoint_ { + arg identifier, x, y, sizeMultiplier = 1, color; + dict_internal.put(identifier,FluidPlotterPoint(identifier,x,y,color ? Color.black,sizeMultiplier)); + this.refresh; } setColor_ { arg identifier, color; - if(dict.at("data").at(identifier).notNil,{ - colors.put(identifier,color); + if(dict_internal.at(identifier).notNil,{ + dict_internal.at(identifier).color_(color); this.refresh; },{ "FluidPlotter::setColor_ identifier not found".warn; @@ -56,7 +98,7 @@ FluidPlotter { background_ { arg bg; - + userView.background_(bg); } refresh { @@ -72,11 +114,16 @@ FluidPlotter { dict_ { arg d; dict = d; - colors = Dictionary.newFrom(dict.at("data").keys.collect({ - arg key; - [key,Color.black]; - }).asArray.flatten); - this.refresh; + dict_internal = Dictionary.new; + dict.at("data").keysValuesDo({ + arg k, v; +/* k.postln; + v.postln;*/ + dict_internal.put(k,FluidPlotterPoint(k,v[0],v[1],Color.black,1)); + }); + if(userView.notNil,{ + this.refresh; + }); } xmin_ { @@ -104,22 +151,9 @@ FluidPlotter { } highlight_ { - arg identifier, color; - var found = false; - colors.keys.do{ - arg key; - if(key == identifier,{ - colors.put(key,color); - found = true; - },{ - colors.put(key,Color.black); - }); - }; - if(found,{ - this.refresh; - },{ - "FluidPlotter::highlight_ identifier not found".warn; - }); + arg identifier; + highlightIdentifier = identifier; + this.refresh; } dictNotProperlyFormatted { @@ -136,18 +170,30 @@ FluidPlotter { userView = UserView(parent,Rect(xpos,ypos,bounds.width,bounds.height)); userView.drawFunc_({ - dict.at("data").keysValuesDo({ + dict_internal.keysValuesDo({ arg key, pt; - var scaledx = pt[0].linlin(xmin,xmax,0,userView.bounds.width) - (pointSize/2); - var scaledy = pt[1].linlin(ymin,ymax,0,userView.bounds.height) - (pointSize/2); - var color = colors.at(key); + var pointSize_, scaledx, scaledy, color; + +/* key.postln; + pt.postln; + pt.x.postln; + pt.y.postln;*/ + + if(key == highlightIdentifier,{ + pointSize_ = pointSize * 2.3 * pt.sizeMultiplier + },{ + pointSize_ = pointSize * pt.sizeMultiplier + }); + + scaledx = pt.x.linlin(xmin,xmax,0,userView.bounds.width,nil) - (pointSize_/2); + scaledy = pt.y.linlin(ymax,ymin,0,userView.bounds.height,nil) - (pointSize_/2); shape.switch( - \square,{Pen.addRect(Rect(scaledx,scaledy,pointSize,pointSize))}, - \circle,{Pen.addOval(Rect(scaledx,scaledy,pointSize,pointSize))} + \square,{Pen.addRect(Rect(scaledx,scaledy,pointSize_,pointSize_))}, + \circle,{Pen.addOval(Rect(scaledx,scaledy,pointSize_,pointSize_))} ); - Pen.color_(color); + Pen.color_(pt.color); Pen.draw; }); }); @@ -160,8 +206,6 @@ FluidPlotter { }); if(parent_.isNil,{parent.front;}); - - this.dict_(dict_); } close { diff --git a/test/FluidPlotter_test.scd b/test/FluidPlotter_test.scd index 904f3b6..0657c85 100644 --- a/test/FluidPlotter_test.scd +++ b/test/FluidPlotter_test.scd @@ -15,9 +15,7 @@ })) ]); }; -) -( Window.closeAll; // self window d = ~dummy_data.value; @@ -29,7 +27,7 @@ d = ~dummy_data.value; },xmin:20,xmax:20000,ymin:-130,ymax:0); ) -~fp.pointSize_(6) +~fp.pointSize_(10); ( 10.do({ @@ -37,13 +35,50 @@ d = ~dummy_data.value; }); ) -~fp.highlight_("example-90",Color.red); +~fp.highlight_("example-95"); +~fp.highlight_(nil); ~fp.dict_(~dummy_data.value); -~fp.ymin_(-50) +( +~fp.ymin_(-140); +~fp.ymax_(10); +~fp.xmin_(-200); +~fp.xmax_(21000); +) + +~fp.shape_(\square); -~fp.shape_(\square) +~fp.setSizeMultiplier_("example-0",10); +~fp.setSizeMultiplier_("example-0",1); + +~fp.setColor_("example-7",Color.red); + +~fp.background_(Color.red) + +~fp.close; + +( +s.waitForBoot{ + Routine{ + var labelset = FluidLabelSet(s); + var kmeans = FluidKMeans(s); + var ds = FluidDataSet(s); + + s.sync; + + ds.load(~fp.dict,{ + kmeans.fitPredict(ds,labelset,{ + labelset.dump({ + arg lsdict; + defer{~fp.setCategories_(lsdict)}; + "done".postln; + }); + }); + }); + }.play; +} +) // with parent @@ -55,7 +90,7 @@ d = Dictionary.newFrom([ arg i; var return; if((i%2) == 0,{ - return = "exmaple-%".format((i/2).asInteger); + return = "example-%".format((i/2).asInteger); },{ return = [exprand(20,20000),rrand(-130,0)]; }); @@ -68,6 +103,4 @@ w = Window("test",Rect(50,50,800,600)).front; [view, x, y, modifiers].dopostln; "".postln; },xmin:20,xmax:20000,ymin:-130,ymax:0); -) - -~fp.setColor_("example-7",Color.red); \ No newline at end of file +) \ No newline at end of file