Minsky
minsky::PhillipsDiagram Class Reference

#include <phillipsDiagram.h>

Inheritance diagram for minsky::PhillipsDiagram:
Inheritance graph
Collaboration diagram for minsky::PhillipsDiagram:
Collaboration graph

Public Member Functions

void requestRedraw ()
 
void init () override
 populate phillips diagram from Godley tables in model More...
 
void clear ()
 
void mouseDown (float x, float y) override
 
void mouseUp (float x, float y) override
 
void mouseMove (float x, float y) override
 
void moveTo (float x, float y) override
 move this so that (x,y) is centred More...
 
std::vector< float > position () const override
 current centre coordinates More...
 
void startRotatingItem (float x, float y)
 
bool hasScrollBars () const override
 return whether this window has scrollbars (needed for MacOSX). More...
 
- Public Member Functions inherited from minsky::RenderNativeWindow
const RenderFrameArgsframeArgs () const
 
 ~RenderNativeWindow () override
 
void renderFrame (const RenderFrameArgs &args)
 
void destroyFrame ()
 
void draw ()
 
void requestRedraw ()
 
void macOSXRedraw ()
 
RenderNativeWindowoperator= (const RenderNativeWindow &x)
 
 RenderNativeWindow ()=default
 
 RenderNativeWindow (const RenderNativeWindow &)=default
 
- Public Member Functions inherited from minsky::EventInterface
virtual void controlMouseDown (float x, float y)
 
virtual void zoom (double x, double y, double z)
 
virtual double zoomFactor () const
 
virtual bool keyPress (const KeyPressArgs &)
 handle key press over current itemFocus, More...
 
virtual bool getItemAt (float x, float y)
 item or wire obtained by get*At() calls More...
 
virtual bool getWireAt (float x, float y)
 item or wire obtained by get*At() calls More...
 

Public Attributes

std::map< std::string, PhillipsStockstocks
 
std::map< std::pair< std::string, std::string >, PhillipsFlowflows
 
- Public Attributes inherited from minsky::EventInterface
ItemPtr item
 item or wire obtained by get*At() calls More...
 
WirePtr wire
 item or wire obtained by get*At() calls More...
 

Private Member Functions

bool redraw (int, int, int width, int height) override
 
 CLASSDESC_ACCESS (PhillipsDiagram)
 

Private Attributes

PhillipsStockstockBeingMoved =nullptr
 
PhillipsStockstockBeingRotated =nullptr
 
Exclude< PointrotateOrigin
 
PhillipsFlowflowBeingEdited =nullptr
 
int handleSelected =0
 
float x =0
 
float y =0
 position for panning More...
 

Additional Inherited Members

- Static Public Member Functions inherited from minsky::RenderNativeWindow
static double scaleFactor ()
 
- Static Public Attributes inherited from minsky::RenderNativeWindow
static ecolab::cairo::Colour backgroundColour {0.8,0.8,0.8,1}
 

Detailed Description

Definition at line 75 of file phillipsDiagram.h.

Member Function Documentation

◆ CLASSDESC_ACCESS()

minsky::PhillipsDiagram::CLASSDESC_ACCESS ( PhillipsDiagram  )
private

◆ clear()

void minsky::PhillipsDiagram::clear ( )
inline

Definition at line 91 of file phillipsDiagram.h.

References flows, and stocks.

91  {
92  stocks.clear();
93  flows.clear();
94  }
std::map< std::pair< std::string, std::string >, PhillipsFlow > flows
std::map< std::string, PhillipsStock > stocks

◆ hasScrollBars()

bool minsky::PhillipsDiagram::hasScrollBars ( ) const
inlineoverridevirtual

return whether this window has scrollbars (needed for MacOSX).

Reimplemented from minsky::RenderNativeWindow.

Definition at line 102 of file phillipsDiagram.h.

102 {return true;}

◆ init()

void minsky::PhillipsDiagram::init ( )
overridevirtual

populate phillips diagram from Godley tables in model

Reimplemented from minsky::RenderNativeWindow.

Definition at line 97 of file phillipsDiagram.cc.

References minsky::cminsky(), MathDAG::cos(), flows, minsky::GroupItems::items, M_PI, minsky::minsky(), minsky::Minsky::model, minsky::Minsky::pushHistory(), MathDAG::sin(), and stocks.

98  {
99  decltype(stocks) newStocks;
100  decltype(flows) newFlows;
101  cminsky().model->recursiveDo
102  (&GroupItems::items, [&](const Items&,Items::const_iterator it) {
103  if (auto g=dynamic_cast<GodleyIcon*>(it->get())) {
104  for (auto& v: g->stockVars())
105  {
106  auto newStock=newStocks.emplace(v->valueId(), static_cast<Variable<VariableType::stock>&>(*v)).first;
107  auto oldStock=stocks.find(v->valueId());
108  if (oldStock!=stocks.end())
109  {
110  newStock->second.moveTo(oldStock->second.x(), oldStock->second.y());
111  newStock->second.rotation(oldStock->second.rotation());
112  }
113  }
114  for (unsigned r=1; r<g->table.rows(); ++r) {
115  if (g->table.initialConditionRow(r)) continue;
116  map<string, vector<pair<FlowCoef, string>>> sources, destinations;
117  for (size_t c=1; c<g->table.cols(); c++)
118  {
119  const FlowCoef fc(g->table.cell(r,c));
120  if (fc.coef)
121  {
122  auto payload=make_pair(FlowCoef(fc.coef,g->table.cell(0,c)),g->table.cell(r,0));
123  if ((fc.coef>0 && !g->table.signConventionReversed(c))
124  || (fc.coef<0 && g->table.signConventionReversed(c)))
125  sources[fc.name].emplace_back(payload);
126  else
127  destinations[fc.name].emplace_back(payload);
128  }
129  }
130  for (auto& i: sources)
131  for (auto& [s,sd]: i.second)
132  for (auto& [d,description]: destinations[i.first])
133  {
134  auto ss=s, dd=d;
135  if (s.coef*d.coef<0) swap(ss,dd);
136  auto& source=newStocks[g->valueId(ss.name)];
137  auto& dest=newStocks[g->valueId(dd.name)];
138  auto flow=newFlows.emplace(make_pair(g->valueId(dd.name),g->valueId(ss.name)), PhillipsFlow(dest.ports(0), source.ports(1))).first;
139  flow->second.addTerm(abs(s.coef*d.coef), i.first);
140  flow->second.tooltip((!flow->second.tooltip().empty()?";":"")+description);
141  if (auto oldFlow=flows.find(flow->first); oldFlow!=flows.end())
142  flow->second.coords(oldFlow->second.coords());
143  }
144  }
145  }
146  return false;
147  });
148 
149  // now layout the diagram
150  if (newStocks.empty())
151  {
152  stocks.clear();
153  flows.clear();
154  minsky().pushHistory();
155  return;
156  }
157 
158  double angle=0, delta=2*M_PI/newStocks.size();
159 
160 
161  auto h=newStocks.begin()->second.height();
162  auto maxW=newStocks.begin()->second.width();
163  for (auto& i: newStocks) maxW=max(maxW,i.second.width());
164  // calculate radius to ensure vars do not overlap
165  auto r=h/delta + 0.5*maxW;
166 
167  for (auto& i: newStocks)
168  {
169  if (!stocks.contains(i.first))
170  {
171  i.second.moveTo(r*(cos(angle)+1)+maxW+50,r*(sin(angle)+1)+maxW+50);
172  i.second.rotation(angle*180.0/M_PI);
173  }
174  angle+=delta;
175  }
176 
177  flows.swap(newFlows);
178  stocks.swap(newStocks);
179  minsky().pushHistory();
180  }
#define M_PI
some useful geometry types, defined from boost::geometry
Definition: geometry.h:29
Expr sin(const Expr &x)
Definition: expr.h:131
Expr cos(const Expr &x)
Definition: expr.h:137
bool pushHistory()
push current model state onto history if it differs from previous
Definition: minsky.cc:1265
std::vector< ItemPtr > Items
Definition: item.h:366
std::map< std::pair< std::string, std::string >, PhillipsFlow > flows
std::map< std::string, PhillipsStock > stocks
const Minsky & cminsky()
const version to help in const correctness
Definition: minsky.h:549
GroupPtr model
Definition: minsky.h:255
Minsky & minsky()
global minsky object
Definition: minskyTCL.cc:51
Here is the call graph for this function:

◆ mouseDown()

void minsky::PhillipsDiagram::mouseDown ( float  x,
float  y 
)
overridevirtual

Reimplemented from minsky::EventInterface.

Definition at line 182 of file phillipsDiagram.cc.

References flowBeingEdited, flows, handleSelected, minsky::NoteBase::mouseFocus, stockBeingMoved, stockBeingRotated, stocks, x, and y.

183  {
184  if (stockBeingRotated) return;
185  x-=this->x; y-=this->y;
186  for (auto& i: stocks)
187  if (i.second.contains(x,y))
188  {
189  stockBeingMoved=&i.second;
190  return;
191  }
192 
193  for (auto& i: flows)
194  if (i.second.near(x,y))
195  {
196  flowBeingEdited=&i.second;
197  i.second.mouseFocus=true;
198  handleSelected=i.second.nearestHandle(x,y);
199  return;
200  }
201  }
PhillipsFlow * flowBeingEdited
PhillipsStock * stockBeingRotated
std::map< std::pair< std::string, std::string >, PhillipsFlow > flows
std::map< std::string, PhillipsStock > stocks
PhillipsStock * stockBeingMoved
bool mouseFocus
true if target of a mouseover
Definition: noteBase.h:31
float y
position for panning

◆ mouseMove()

void minsky::PhillipsDiagram::mouseMove ( float  x,
float  y 
)
overridevirtual

Reimplemented from minsky::EventInterface.

Definition at line 212 of file phillipsDiagram.cc.

References minsky::Wire::editHandle(), flowBeingEdited, flows, handleSelected, minsky::Item::moveTo(), requestRedraw(), rotateOrigin, stockBeingMoved, stockBeingRotated, x, and y.

Referenced by mouseUp().

213  {
214  x-=this->x; y-=this->y;
215  if (stockBeingRotated)
216  {
218  requestRedraw();
219  return;
220  }
221  if (stockBeingMoved)
222  {
224  requestRedraw();
225  return;
226  }
227  if (flowBeingEdited)
228  {
230  requestRedraw();
231  return;
232  }
233  for (auto& i: flows)
234  {
235  const bool mf=i.second.near(x,y);
236  if (mf!=i.second.mouseFocus)
237  {
238  i.second.mouseFocus=mf;
239  requestRedraw();
240  }
241  }
242  }
PhillipsFlow * flowBeingEdited
PhillipsStock * stockBeingRotated
std::map< std::pair< std::string, std::string >, PhillipsFlow > flows
boost::geometry::model::d2::point_xy< float > Point
Definition: geometry.h:34
PhillipsStock * stockBeingMoved
Exclude< Point > rotateOrigin
void moveTo(float x, float y)
Definition: item.cc:256
void editHandle(unsigned position, float x, float y)
Definition: wire.cc:674
float y
position for panning
Here is the call graph for this function:
Here is the caller graph for this function:

◆ mouseUp()

void minsky::PhillipsDiagram::mouseUp ( float  x,
float  y 
)
overridevirtual

Reimplemented from minsky::EventInterface.

Definition at line 203 of file phillipsDiagram.cc.

References flowBeingEdited, minsky::minsky(), mouseMove(), minsky::Minsky::pushHistory(), stockBeingMoved, stockBeingRotated, x, and y.

204  {
205  mouseMove(x,y);
206  minsky().pushHistory();
207  stockBeingMoved=nullptr;
208  stockBeingRotated=nullptr;
209  flowBeingEdited=nullptr;
210  }
PhillipsFlow * flowBeingEdited
bool pushHistory()
push current model state onto history if it differs from previous
Definition: minsky.cc:1265
PhillipsStock * stockBeingRotated
void mouseMove(float x, float y) override
PhillipsStock * stockBeingMoved
Minsky & minsky()
global minsky object
Definition: minskyTCL.cc:51
float y
position for panning
Here is the call graph for this function:

◆ moveTo()

void minsky::PhillipsDiagram::moveTo ( float  x,
float  y 
)
inlineoverridevirtual

move this so that (x,y) is centred

Reimplemented from minsky::EventInterface.

Definition at line 99 of file phillipsDiagram.h.

References requestRedraw(), x, and y.

99 {this->x=x; this->y=y; requestRedraw();}
float y
position for panning
Here is the call graph for this function:

◆ position()

std::vector<float> minsky::PhillipsDiagram::position ( ) const
inlineoverridevirtual

current centre coordinates

Reimplemented from minsky::EventInterface.

Definition at line 100 of file phillipsDiagram.h.

References x, and y.

100 {return {x,y};}
float y
position for panning

◆ redraw()

bool minsky::PhillipsDiagram::redraw ( int  ,
int  ,
int  width,
int  height 
)
overrideprivate

Definition at line 79 of file phillipsDiagram.cc.

References flows, stocks, x, and y.

80  {
81  if (!surface.get()) return false;
82  auto cairo=surface->cairo();
83  const CairoSave cs(cairo);
84  cairo_translate(cairo,x,y);
85  for (auto& i: stocks)
86  {
87  const CairoSave cs(cairo);
88  cairo_identity_matrix(cairo);
89  cairo_translate(cairo,i.second.x()+x, i.second.y()+y);
90  i.second.draw(cairo);
91  }
92  for (auto& i: flows)
93  i.second.draw(cairo);
94  return true;
95  }
std::map< std::pair< std::string, std::string >, PhillipsFlow > flows
std::map< std::string, PhillipsStock > stocks
float y
position for panning

◆ requestRedraw()

void minsky::PhillipsDiagram::requestRedraw ( )
inline

Definition at line 88 of file phillipsDiagram.h.

Referenced by mouseMove(), moveTo(), and startRotatingItem().

88 {if (surface.get()) surface->requestRedraw();}
Here is the caller graph for this function:

◆ startRotatingItem()

void minsky::PhillipsDiagram::startRotatingItem ( float  x,
float  y 
)

Definition at line 244 of file phillipsDiagram.cc.

References requestRedraw(), rotateOrigin, stockBeingRotated, stocks, x, and y.

245  {
246  x-=this->x; y-=this->y;
247  for (auto& i: stocks)
248  if (i.second.contains(x,y))
249  {
250  stockBeingRotated=&i.second;
252  requestRedraw();
253  return;
254  }
255  }
PhillipsStock * stockBeingRotated
std::map< std::string, PhillipsStock > stocks
boost::geometry::model::d2::point_xy< float > Point
Definition: geometry.h:34
Exclude< Point > rotateOrigin
float y
position for panning
Here is the call graph for this function:

Member Data Documentation

◆ flowBeingEdited

PhillipsFlow* minsky::PhillipsDiagram::flowBeingEdited =nullptr
private

Definition at line 82 of file phillipsDiagram.h.

Referenced by mouseDown(), mouseMove(), and mouseUp().

◆ flows

std::map<std::pair<std::string,std::string>, PhillipsFlow> minsky::PhillipsDiagram::flows

◆ handleSelected

int minsky::PhillipsDiagram::handleSelected =0
private

Definition at line 83 of file phillipsDiagram.h.

Referenced by mouseDown(), and mouseMove().

◆ rotateOrigin

Exclude<Point> minsky::PhillipsDiagram::rotateOrigin
private

Definition at line 81 of file phillipsDiagram.h.

Referenced by mouseMove(), and startRotatingItem().

◆ stockBeingMoved

PhillipsStock* minsky::PhillipsDiagram::stockBeingMoved =nullptr
private

Definition at line 79 of file phillipsDiagram.h.

Referenced by mouseDown(), mouseMove(), and mouseUp().

◆ stockBeingRotated

PhillipsStock* minsky::PhillipsDiagram::stockBeingRotated =nullptr
private

Definition at line 80 of file phillipsDiagram.h.

Referenced by mouseDown(), mouseMove(), mouseUp(), and startRotatingItem().

◆ stocks

std::map<std::string, PhillipsStock> minsky::PhillipsDiagram::stocks

◆ x

float minsky::PhillipsDiagram::x =0
private

◆ y

float minsky::PhillipsDiagram::y =0
private

position for panning

Definition at line 84 of file phillipsDiagram.h.

Referenced by mouseDown(), mouseMove(), mouseUp(), moveTo(), position(), redraw(), and startRotatingItem().


The documentation for this class was generated from the following files: