28 #include <cairo_base.h> 36 #define M_PI 3.14159265358979323846 40 using ecolab::cairo::CairoSave;
61 void combineInput(
double& x,
double y)
const override {
if (y>x) x=y;}
63 double identity()
const override {
return -std::numeric_limits<double>::max();}
68 void combineInput(
double& x,
double y)
const override {
if (y<x) x=y;}
70 double identity()
const override {
return std::numeric_limits<double>::min();}
74 void combineInput(
double& x,
double y)
const override {x=(x>0.5)&&(y>0.5);}
80 void combineInput(
double& x,
double y)
const override {x=(x>0.5)||(y>0.5);}
85 bool OperationBase::multiWire()
const 89 case add:
case subtract:
90 case multiply:
case divide:
99 void OperationBase::addPorts()
103 m_ports.emplace_back(make_shared<Port>(*
this));
104 for (
size_t i=1; i<numPorts(); ++i)
107 case add:
case subtract:
108 m_ports.emplace_back(make_shared<SumInputPort>(*
this));
110 case multiply:
case divide:
111 m_ports.emplace_back(make_shared<MulInputPort>(*
this));
114 m_ports.emplace_back(make_shared<MinInputPort>(*
this));
117 m_ports.emplace_back(make_shared<MaxInputPort>(*
this));
120 m_ports.emplace_back(make_shared<AndInputPort>(*
this));
123 m_ports.emplace_back(make_shared<OrInputPort>(*
this));
127 m_ports.emplace_back(make_shared<MultiWireInputPort>(*
this));
130 m_ports.emplace_back(make_shared<InputPort>(*
this));
135 float OperationBase::scaleFactor()
const 137 const float z=zoomFactor();
138 const float l=OperationBase::l*z, r=OperationBase::r*z,
139 h=OperationBase::h*z;
140 return std::max(1.0
f,std::min(0.5
f*iWidth()*z/std::max(l,r),0.5
f*iHeight()*z/h));
143 void OperationBase::drawUserFunction(cairo_t* cairo)
const 147 const double angle=rotation() *
M_PI / 180.0;
148 const bool textFlipped=
flipped(rotation());
149 const float z=zoomFactor();
151 auto& c=
dynamic_cast<const NamedOp&
>(*this);
154 pango.setFontSize(10.0*scaleFactor()*z);
156 pango.angle=angle + (textFlipped?
M_PI: 0);
157 const Rotate r(rotation()+ (textFlipped? 180: 0),0,0);
161 w=0.5*pango.width()+2*z;
162 h=0.5*pango.height()+4*z;
166 const cairo::CairoSave cs(cairo);
167 cairo_move_to(cairo,r.x(-w+1,-h-hoffs+2*z), r.y(-w+1,-h-hoffs+2*z));
171 cairo_rotate(cairo, angle);
173 cairo_set_source_rgb(cairo,0,0,1);
174 cairo_move_to(cairo,-w,-h);
175 cairo_line_to(cairo,-w,h);
176 cairo_line_to(cairo,w,h);
178 cairo_line_to(cairo,w+2*z,0);
179 cairo_line_to(cairo,w,-h);
180 cairo_close_path(cairo);
181 cairo::Path clipPath(cairo);
184 cairo_rotate(cairo,-angle);
189 const Rotate rr(rotation(),0,0);
191 m_ports[0]->moveTo(x()+rr.
x(w+2,0), y()+rr.
y(w+2,0));
196 m_ports[1]->moveTo(x()+rr.
x(-w,0), y()+rr.
y(-w,0));
199 m_ports[1]->moveTo(x()+rr.
x(-w,0), y()+rr.
y(-w,textFlipped? h-3: -h+3));
200 m_ports[2]->moveTo(x()+rr.
x(-w,0), y()+rr.
y(-w,textFlipped? -h+3: h-3));
203 if (type()==OperationType::userFunction)
205 cairo_set_source_rgb(cairo,0,0,0);
206 DrawBinOp drawBinOp(cairo, zoomFactor());
213 displayTooltip(cairo,tooltip());
214 if (onResizeHandles) drawResizeHandles(cairo);
216 clipPath.appendToCurrent(cairo);
218 if (selected) drawSelected(cairo);
221 void OperationBase::setCachedText(cairo_t* cairo,
const std::string& text,
double size)
const 223 if (cachedPango && cairo==cachedPango->cairoContext())
return;
224 cachedPango=make_shared<Pango>(cairo);
225 cachedPango->setMarkup(text);
226 cachedPango->setFontSize(size);
230 void OperationBase::draw(cairo_t* cairo)
const 234 const double angle=rotation() *
M_PI / 180.0;
235 const bool textFlipped=
flipped(rotation());
236 const float z=zoomFactor();
239 const CairoSave cs(cairo);
240 cairo_scale(cairo,z,z);
246 cairo_rotate(cairo, angle);
248 float l=OperationBase::l*z, r=OperationBase::r*z,
249 h=OperationBase::h*z;
251 if (fabs(l)<0.5*iWidth()*z) l=-0.5*iWidth()*z;
252 if (r<0.5*iWidth()*z) r=0.5*iWidth()*z;
253 if (h<0.5*iHeight()*z) h=0.5*iHeight()*z;
255 cairo_move_to(cairo,-r,-h);
256 cairo_line_to(cairo,-r,h);
257 cairo_line_to(cairo,r,h);
258 cairo_line_to(cairo,r+2*z,0);
259 cairo_line_to(cairo,r,-h);
261 cairo_close_path(cairo);
263 cairo_set_source_rgb(cairo,0,0,1);
264 cairo_stroke_preserve(cairo);
266 cairo::Path clipPath(cairo);
270 double x0=r, y0=0, x1=l, y1=numPorts() > 2? -h+3: 0,
271 x2=l, y2=numPorts() > 2? h-3: 0;
273 if (textFlipped) swap(y1,y2);
276 const CairoSave cs(cairo);
277 cairo_identity_matrix(cairo);
278 cairo_translate(cairo, x(), y());
279 cairo_rotate(cairo, angle);
280 cairo_user_to_device(cairo, &x0, &y0);
281 cairo_user_to_device(cairo, &x1, &y1);
282 cairo_user_to_device(cairo, &x2, &y2);
286 m_ports[0]->moveTo(x0, y0);
289 #ifdef DISPLAY_POW_UPSIDE_DOWN 291 ports[1]->moveTo(x2, y2);
294 m_ports[1]->moveTo(x1, y1);
299 #ifdef DISPLAY_POW_UPSIDE_DOWN 301 ports[2]->moveTo(x1, y1);
304 m_ports[2]->moveTo(x2, y2);
311 displayTooltip(cairo,tooltip());
312 if (onResizeHandles) drawResizeHandles(cairo);
315 cairo_new_path(cairo);
316 clipPath.appendToCurrent(cairo);
318 if (selected) drawSelected(cairo);
323 const float invZ=1/zoomFactor();
324 moveTo(0.5*(b.
x0+b.
x1), 0.5*(b.
y0+b.
y1));
325 iWidth(std::abs(b.
x1-b.
x0)*invZ);
326 iHeight(std::abs(b.
y1-b.
y0)*invZ);
329 double OperationBase::value()
const 333 unique_ptr<ScalarEvalOp> e(ScalarEvalOp::create(type(),itemPtrFromThis()));
335 switch (e->numArgs())
337 case 0:
return e->evaluate(0,0);
338 case 1:
return e->evaluate(m_ports[1]->value());
339 case 2:
return e->evaluate(m_ports[1]->value(),m_ports[2]->value());
348 vector<string> OperationBase::dimensions()
const 351 for (
size_t i=1; i<m_ports.size(); ++i)
352 if (
auto vv=m_ports[i]->getVariableValue())
353 for (
auto& xv: vv->hypercube().xvectors)
354 names.insert(xv.name);
355 else if (!m_ports[i]->wires().empty())
356 if (
auto f=m_ports[i]->wires()[0]->from())
357 if (
auto r=
f->item().ravelCast())
358 for (
auto& xv: r->hypercube().xvectors)
359 names.insert(xv.name);
361 return {names.begin(), names.end()};
368 return modf(x,&dummy);
376 bool inputFound=
false;
377 for (
size_t i=1; i<item.
portsSize(); ++i)
378 for (
auto w: item.
ports(i).lock()->wires())
381 auto tmp=w->units(
true);
388 Units::operator=(w->units(
true));
394 Units OperationBase::unitsBinOpCase(
bool check)
const 399 case log:
case and_:
case or_:
case polygamma:
case userFunction:
401 if (check && !m_ports[1]->units(check).empty())
402 throw_error(
"function inputs not dimensionless");
406 auto r=m_ports[1]->
units(check);
410 if (!m_ports[2]->wires().empty())
411 if (
auto v=dynamic_cast<VarConstant*>(&m_ports[2]->wires()[0]->from()->item()))
414 for (
auto& i: r) i.second*=v->value();
419 throw_error(
"dimensioned pow only possible if exponent is a constant integer");
424 case le:
case lt:
case eq:
427 CheckConsistent(*
this);
430 case add:
case subtract:
case max:
case min:
433 return CheckConsistent(*
this);
434 if (!m_ports[1]->wires().empty())
435 return m_ports[1]->wires()[0]->units(check);
436 if (!m_ports[2]->wires().empty())
437 return m_ports[2]->wires()[0]->units(check);
441 case multiply:
case divide:
444 for (
auto w: m_ports[1]->wires())
446 auto tmp=w->units(check);
448 units[i.first]+=i.second;
450 const int f=(type()==multiply)? 1: -1;
451 for (
auto w: m_ports[2]->wires())
453 auto tmp=w->units(check);
455 units[i.first]+=
f*i.second;
462 throw_error(
"Operation<"+OperationType::typeName(type())+
">::units() should be overridden");
467 Units OperationBase::units(
bool check)
const 470 switch (classify(type()))
472 case function:
case reduction:
case scan:
case tensor:
474 if (check && !m_ports[1]->units(check).empty())
475 throw_error(
"function input not dimensionless");
480 if (type()==percent && !m_ports[1]->wires().empty()) {
481 auto r=m_ports[1]->units(check);
482 if (
auto vV=dynamic_cast<VariableValue*>(&m_ports[1]->wires()[0]->from()->item()))
484 vV->setUnits(
"%"+r.str());
485 vV->units.normalise();
492 return unitsBinOpCase(check);
496 case mean:
case median:
case stdDev:
497 return m_ports[1]->units(check);
500 auto argUnits=m_ports[1]->units(check);
501 for (
auto& i: argUnits)
509 auto argUnits=m_ports[1]->units(check);
510 for (
auto& i: m_ports[2]->units(check))
512 argUnits.emplace(i.first,1);
513 argUnits[i.first]*=i.second;
517 case linearRegression:
518 return m_ports[1]->units(check);
522 throw_error(
"Statistics operation does not have units() defined");
526 throw_error(
"Operation<"+OperationType::typeName(type())+
">::units() should be overridden");
532 Units Derivative::units(
bool check)
const {
533 Units r=m_ports[1]->units(check);
549 case time:
return new Time;
550 case copy:
return new Copy;
551 case integrate:
return new IntOp;
553 case data:
return new DataOp;
554 case ravel:
return new Ravel;
555 case constant:
throw error(
"Constant deprecated");
561 string OperationBase::portValues()
const 563 string r=
"equations not yet constructed, please reset";
564 if (!m_ports.empty())
565 r=
"[out]="+
str(m_ports[0]->value());
566 if (m_ports.size()>1)
567 r+=
" [in1]="+
str(m_ports[1]->value());
568 if (m_ports.size()>2)
569 r+=
" [in2]="+
str(m_ports[2]->value());
573 string NamedOp::description()
const 575 return m_description;
578 string NamedOp::description(
const std::string& x)
582 return m_description;
601 const double sf = scaleFactor();
602 cairo_translate(cairo,-1,0);
603 cairo_scale(cairo,1.5*sf,0.75*sf);
604 cairo_arc(cairo,0,-3,3,0,2*
M_PI);
605 cairo_arc(cairo,0,3,3,0,
M_PI);
606 cairo_move_to(cairo,-3,3);
607 cairo_line_to(cairo,-3,-3);
608 cairo_move_to(cairo,3,3);
609 cairo_line_to(cairo,3,-3);
610 cairo_identity_matrix(cairo);
611 cairo_set_line_width(cairo,1.0);
617 const double sf = scaleFactor();
618 cairo_scale(cairo,sf,sf);
619 cairo_move_to(cairo,-4,2);
620 cairo_show_text(cairo,
"t");
625 const double sf = scaleFactor();
626 cairo_scale(cairo,sf,sf);
627 cairo_move_to(cairo,-4,2);
628 cairo_show_text(cairo,
"e");
633 const double sf = scaleFactor();
634 cairo_scale(cairo,sf,sf);
635 cairo_move_to(cairo,-4,2);
636 cairo_show_text(cairo,
"π");
641 const double sf = scaleFactor();
642 cairo_scale(cairo,sf,sf);
643 cairo_move_to(cairo,-4,2);
644 cairo_show_text(cairo,
"0");
649 const double sf = scaleFactor();
650 cairo_scale(cairo,sf,sf);
651 cairo_move_to(cairo,-4,2);
652 cairo_show_text(cairo,
"1");
657 const double sf = scaleFactor();
658 cairo_move_to(cairo,-4,-10);
659 setCachedText(cairo,
"∞",9);
660 cairo_scale(cairo,sf,sf);
666 const double sf = scaleFactor();
667 cairo_move_to(cairo,-4,-7);
668 setCachedText(cairo,
"%",7);
669 cairo_scale(cairo,sf,sf);
675 const double sf = scaleFactor();
676 cairo_move_to(cairo,-4,-5);
677 setCachedText(cairo,
"→",7);
678 cairo_scale(cairo,sf,sf);
687 const CairoSave cs(cairo);
688 const double sf = scaleFactor();
689 cairo_scale(cairo,sf,sf);
690 cairo_move_to(cairo,-7,-1);
691 cairo_set_font_size(cairo,8);
692 cairo_show_text(cairo,
"d");
693 cairo_move_to(cairo,-7,0);cairo_line_to(cairo,2,0);
694 cairo_set_line_width(cairo,0.5);cairo_stroke(cairo);
695 cairo_move_to(cairo,-7,7);
696 cairo_show_text(cairo,
"dt");
701 const CairoSave cs(cairo);
702 const double sf = scaleFactor();
703 cairo_scale(cairo,sf,sf);
704 cairo_set_font_size(cairo,10);
705 cairo_move_to(cairo,-7,6);
706 cairo_show_text(cairo,
"\xE2\x88\x9a");
707 cairo_set_line_width(cairo,0.5);
708 cairo_rel_move_to(cairo,0,-9);
709 cairo_rel_line_to(cairo,5,0);
710 cairo_set_source_rgb(cairo,0,0,0);
716 const double sf = scaleFactor();
717 cairo_scale(cairo,sf,sf);
718 cairo_move_to(cairo,-7,3);
719 cairo_show_text(cairo,
"e");
720 cairo_rel_move_to(cairo,0,-4);
721 cairo_set_font_size(cairo,7);
722 cairo_show_text(cairo,
"x");
727 const double sf = scaleFactor();
728 cairo_scale(cairo,sf,sf);
729 cairo_move_to(cairo,-6,3);
730 cairo_show_text(cairo,
"x");
731 cairo_rel_move_to(cairo,0,-4);
732 cairo_set_font_size(cairo,7);
733 cairo_show_text(cairo,
"y");
735 #ifdef DISPLAY_POW_UPSIDE_DOWN 746 const double sf = scaleFactor();
747 cairo_scale(cairo,sf,sf);
748 cairo_move_to(cairo,-9,3);
749 cairo_show_text(cairo,
"x≤y");
757 const double sf = scaleFactor();
758 cairo_scale(cairo,sf,sf);
759 cairo_move_to(cairo,-9,3);
760 cairo_show_text(cairo,
"x<y");
768 const double sf = scaleFactor();
769 cairo_scale(cairo,sf,sf);
770 cairo_move_to(cairo,-9,3);
771 cairo_show_text(cairo,
"x=y");
779 const double sf = scaleFactor();
780 cairo_scale(cairo,sf,sf);
781 cairo_move_to(cairo,-9,3);
782 cairo_show_text(cairo,
"min");
787 const double sf = scaleFactor();
788 cairo_scale(cairo,sf,sf);
789 cairo_move_to(cairo,-9,3);
790 cairo_show_text(cairo,
"max");
795 const CairoSave cs(cairo);
796 const double sf = scaleFactor();
797 cairo_scale(cairo,sf,sf);
798 cairo_set_source_rgb(cairo,0,0,0);
799 cairo_move_to(cairo,-4,3);
800 cairo_line_to(cairo,-1,-3);
801 cairo_line_to(cairo,2,3);
807 const CairoSave cs(cairo);
808 const double sf = scaleFactor();
809 cairo_scale(cairo,sf,sf);
810 cairo_set_source_rgb(cairo,0,0,0);
811 cairo_move_to(cairo,-4,-3);
812 cairo_line_to(cairo,-1,3);
813 cairo_line_to(cairo,2,-3);
819 const double sf = scaleFactor();
820 cairo_scale(cairo,sf,sf);
821 cairo_move_to(cairo,-6,3);
822 cairo_show_text(cairo,
"¬");
827 const double sf = scaleFactor();
828 cairo_scale(cairo,sf*.7,sf);
829 cairo_move_to(cairo,-16,3);
830 cairo_show_text(cairo,
"<ΔxΔy>");
835 const double sf = scaleFactor();
836 cairo_scale(cairo,sf,sf);
837 cairo_move_to(cairo,-3,3);
838 cairo_show_text(cairo,
"ρ");
843 const double sf = scaleFactor();
844 cairo_scale(cairo,sf,sf);
845 cairo_move_to(cairo,-7,7);
846 cairo_line_to(cairo,7,-7);
848 cairo_arc(cairo,-4,0,0.2,0,2*
M_PI);
850 cairo_arc(cairo,3,3,0.2,0,2*
M_PI);
852 cairo_arc(cairo,4,-6,0.2,0,2*
M_PI);
857 const double sf = scaleFactor();
858 cairo_scale(cairo,sf,sf);
859 cairo_move_to(cairo,-9,3);
860 cairo_show_text(cairo,
" ln");
865 const double sf = scaleFactor();
866 cairo_scale(cairo,sf,sf);
867 cairo_move_to(cairo,-9,3);
868 cairo_show_text(cairo,
"log");
876 const double sf = scaleFactor();
877 cairo_scale(cairo,sf,sf);
878 cairo_set_font_size(cairo,10);
879 cairo_move_to(cairo,-9,3);
880 cairo_show_text(cairo,
"sin");
885 const double sf = scaleFactor();
886 cairo_scale(cairo,sf,sf);
887 cairo_set_font_size(cairo,10);
888 cairo_move_to(cairo,-9,3);
889 cairo_show_text(cairo,
"cos");
894 const double sf = scaleFactor();
895 cairo_scale(cairo,sf,sf);
896 cairo_set_font_size(cairo,10);
897 cairo_move_to(cairo,-9,3);
898 cairo_show_text(cairo,
"tan");
903 const double sf = scaleFactor();
904 cairo_scale(cairo,sf,sf);
905 cairo_set_font_size(cairo,9);
906 cairo_move_to(cairo,-9,3);
907 cairo_show_text(cairo,
"sin");
908 cairo_rel_move_to(cairo,0,-3);
909 cairo_set_font_size(cairo,7);
910 cairo_show_text(cairo,
"-1");
911 cairo_rel_move_to(cairo,0,-2);
916 const double sf = scaleFactor();
917 cairo_scale(cairo,sf,sf);
918 cairo_set_font_size(cairo,9);
919 cairo_move_to(cairo,-9,3);
920 cairo_show_text(cairo,
"cos");
921 cairo_rel_move_to(cairo,0,-3);
922 cairo_set_font_size(cairo,7);
923 cairo_show_text(cairo,
"-1");
924 cairo_rel_move_to(cairo,0,-2);
929 const double sf = scaleFactor();
930 cairo_scale(cairo,sf,sf);
931 cairo_set_font_size(cairo,9);
932 cairo_move_to(cairo,-9,3);
933 cairo_show_text(cairo,
"tan");
934 cairo_rel_move_to(cairo,0,-3);
935 cairo_set_font_size(cairo,7);
936 cairo_show_text(cairo,
"-1");
937 cairo_rel_move_to(cairo,0,-2);
942 const double sf = scaleFactor();
943 cairo_scale(cairo,sf,sf);
944 cairo_set_font_size(cairo,8);
945 cairo_move_to(cairo,-9,3);
946 cairo_show_text(cairo,
"sinh");
951 const double sf = scaleFactor();
952 cairo_scale(cairo,sf,sf);
953 cairo_set_font_size(cairo,8);
954 cairo_move_to(cairo,-9,3);
955 cairo_show_text(cairo,
"cosh");
960 const double sf = scaleFactor();
961 cairo_scale(cairo,sf,sf);
962 cairo_set_font_size(cairo,8);
963 cairo_move_to(cairo,-9,3);
964 cairo_show_text(cairo,
"tanh");
969 const double sf = scaleFactor();
970 cairo_scale(cairo,sf,sf);
971 cairo_set_font_size(cairo,9);
972 cairo_move_to(cairo,-6,3);
973 cairo_show_text(cairo,
"|x|");
977 const double sf = scaleFactor();
978 cairo_move_to(cairo,-5,-5);
981 setCachedText(cairo,
"x",7);
982 cairo_scale(cairo,sf,sf);
984 cairo_move_to(cairo,-5,-4);
985 cairo_rel_line_to(cairo,0,cachedPango->height()-2);
986 cairo_rel_line_to(cairo,1,0);
987 cairo_move_to(cairo,-5+cachedPango->width(),-4);
988 cairo_rel_line_to(cairo,0,cachedPango->height()-2);
989 cairo_rel_line_to(cairo,-1,0);
994 const double sf = scaleFactor();
995 cairo_scale(cairo,sf,sf);
996 cairo_set_font_size(cairo,8);
997 cairo_move_to(cairo,-9,3);
998 cairo_show_text(cairo,
"frac");
1002 const double sf = scaleFactor();
1003 cairo_scale(cairo,sf,sf);
1004 cairo_move_to(cairo,-6,3);
1005 cairo_show_text(cairo,
"Γ");
1009 const double sf = scaleFactor();
1010 cairo_scale(cairo,sf,sf);
1011 cairo_move_to(cairo,-7,3);
1012 cairo_show_text(cairo,
"ψ");
1013 cairo_rel_move_to(cairo,0,-3);
1014 cairo_set_font_size(cairo,7);
1016 const std::string order=
"("+
to_string(static_cast<unsigned>(m_ports[2]->value()))+
")";
1017 cairo_show_text(cairo,order.c_str());
1018 cairo_rel_move_to(cairo,0,-2);
1025 const double sf = scaleFactor();
1026 cairo_scale(cairo,sf,sf);
1027 cairo_move_to(cairo,-3,3);
1028 cairo_show_text(cairo,
"!");
1032 const double sf = scaleFactor();
1033 cairo_scale(cairo,sf,sf);
1042 const double sf = scaleFactor();
1043 cairo_scale(cairo,sf,sf);
1052 const double sf = scaleFactor();
1053 cairo_scale(cairo,sf,sf);
1062 const double sf = scaleFactor();
1063 cairo_scale(cairo,sf,sf);
1072 const double sf = scaleFactor();
1073 cairo_move_to(cairo,-4,-7);
1074 setCachedText(cairo,
"∑", 7);
1075 cairo_scale(cairo,sf,sf);
1076 cachedPango->show();
1081 const double sf = scaleFactor();
1082 cairo_move_to(cairo,-4,-7);
1083 setCachedText(cairo,
"∏",7);
1084 cairo_scale(cairo,sf,sf);
1085 cachedPango->show();
1090 const double sf = scaleFactor();
1091 cairo_scale(cairo,sf,sf);
1092 cairo_set_font_size(cairo,10);
1093 cairo_move_to(cairo,-9,3);
1094 cairo_show_text(cairo,
"inf");
1099 const double sf = scaleFactor();
1100 cairo_scale(cairo,sf,sf);
1101 cairo_set_font_size(cairo,10);
1102 cairo_move_to(cairo,-9,3);
1103 cairo_show_text(cairo,
"sup");
1108 const double sf = scaleFactor();
1109 cairo_scale(cairo,sf,sf);
1110 cairo_set_font_size(cairo,10);
1111 cairo_move_to(cairo,-9,3);
1112 cairo_show_text(cairo,
"infi");
1117 const double sf = scaleFactor();
1118 cairo_scale(cairo,sf,sf);
1119 cairo_set_font_size(cairo,10);
1120 cairo_move_to(cairo,-9,3);
1121 cairo_show_text(cairo,
"supi");
1126 const double sf = scaleFactor();
1127 cairo_scale(cairo,sf,sf);
1128 cairo_set_font_size(cairo,10);
1129 cairo_move_to(cairo,-9,3);
1130 cairo_show_text(cairo,
"any");
1135 const double sf = scaleFactor();
1136 cairo_scale(cairo,sf,sf);
1137 cairo_set_font_size(cairo,10);
1138 cairo_move_to(cairo,-9,3);
1139 cairo_show_text(cairo,
"all");
1146 const double sf = scaleFactor();
1147 cairo_scale(cairo,sf,sf);
1148 cairo_set_font_size(cairo,10);
1149 cairo_move_to(cairo,-9,3);
1150 cairo_show_text(cairo,
"nᵢ");
1155 const double sf = scaleFactor();
1156 cairo_scale(cairo,sf,sf);
1157 cairo_set_font_size(cairo,10);
1158 cairo_move_to(cairo,-9,3);
1159 cairo_show_text(cairo,
"{nᵢ}");
1164 const double sf = scaleFactor();
1165 cairo_scale(cairo,sf,sf);
1166 cairo_set_font_size(cairo,10);
1167 cairo_move_to(cairo,-8,3);
1168 cairo_show_text(cairo,
"<x>");
1173 const double sf = scaleFactor();
1174 cairo_scale(cairo,sf,sf);
1175 cairo_set_font_size(cairo,10);
1176 cairo_move_to(cairo,-3,3);
1177 cairo_show_text(cairo,
"x");
1178 cairo_move_to(cairo,-4,-1);
1179 cairo_show_text(cairo,
"~");
1184 const double sf = scaleFactor();
1185 cairo_scale(cairo,sf,sf);
1186 cairo_set_font_size(cairo,10);
1187 cairo_move_to(cairo,-3,3);
1188 cairo_show_text(cairo,
"σ");
1193 const double sf = scaleFactor();
1194 cairo_scale(cairo,sf*.85,sf);
1195 cairo_set_font_size(cairo,10);
1196 cairo_move_to(cairo,-12,3);
1197 cairo_show_text(cairo,
"<Δxᵏ>");
1202 const double sf = scaleFactor();
1203 cairo_translate(cairo,-sf*iWidth(), -sf*iHeight());
1212 const double sf = scaleFactor();
1213 cairo_move_to(cairo,-7,-7);
1214 setCachedText(cairo,
"∑+",7);
1215 cairo_scale(cairo,sf,sf);
1216 cachedPango->show();
1221 const double sf = scaleFactor();
1222 cairo_move_to(cairo,-6,-7);
1223 setCachedText(cairo,
"∏×",7);
1224 cairo_scale(cairo,sf,sf);
1225 cachedPango->show();
1230 const double sf = scaleFactor();
1231 cairo_move_to(cairo,-4,-7);
1232 setCachedText(cairo,
"Δ<sup>-</sup>",7);
1233 cairo_scale(cairo,sf,sf);
1234 cachedPango->show();
1239 const double sf = scaleFactor();
1240 cairo_move_to(cairo,-4,-7);
1241 setCachedText(cairo,
"Δ<sup>+</sup>",7);
1242 cairo_scale(cairo,sf,sf);
1243 cachedPango->show();
1248 const double sf = scaleFactor();
1249 cairo_move_to(cairo,-4,-10);
1250 setCachedText(cairo,
"·",14);
1251 cairo_scale(cairo,sf,sf);
1252 cachedPango->show();
1257 const double sf = scaleFactor();
1258 cairo_move_to(cairo,-4,-10);
1262 cairo_scale(cairo,sf,sf);
1263 constexpr
const double r=6;
1264 static const double d=0.5*r*
std::sqrt(2);
1265 cairo_move_to(cairo,d,d);
1266 cairo_line_to(cairo,-d,-d);
1267 cairo_move_to(cairo,-d,d);
1268 cairo_line_to(cairo,d,-d);
1269 cairo_move_to(cairo,r,0);
1270 cairo_arc(cairo,0,0,r,0,2*
M_PI);
1271 cairo_stroke(cairo);
1276 const double sf = scaleFactor();
1277 cairo_scale(cairo,sf,sf);
1278 cairo_set_font_size(cairo,10);
1279 cairo_move_to(cairo,-9,3);
1280 cairo_show_text(cairo,
"idx");
1285 const double sf = scaleFactor();
1286 cairo_scale(cairo,sf,sf);
1287 cairo_set_font_size(cairo,8);
1288 cairo_move_to(cairo,-7,3);
1289 cairo_show_text(cairo,
"x[i]");
1297 const double sf = scaleFactor();
1298 cairo_move_to(cairo,-4,-5);
1300 cairo_scale(cairo,sf,sf);
1301 cairo_rel_line_to(cairo,4,0);
1302 cairo_rel_line_to(cairo,2,5);
1303 cairo_rel_line_to(cairo,-2,5);
1304 cairo_rel_line_to(cairo,-4,0);
1305 cairo_move_to(cairo,-4,0);
1306 cairo_rel_line_to(cairo,10,0);
1307 cairo_stroke(cairo);
1312 const double sf = scaleFactor();
1313 cairo_move_to(cairo,-4,-3);
1315 cairo_scale(cairo,sf,sf);
1316 cairo_rel_line_to(cairo,8,0);
1317 cairo_move_to(cairo,-4,3);
1318 cairo_rel_line_to(cairo,8,0);
1319 cairo_rel_move_to(cairo,0,-10);
1320 cairo_rel_line_to(cairo,0,14);
1321 cairo_stroke(cairo);
1326 const double sf = scaleFactor();
1327 cairo_move_to(cairo,-10,-10);
1328 setCachedText(cairo,
"[...",10);
1329 cairo_scale(cairo,sf,sf);
1330 cachedPango->show();
1331 cairo_move_to(cairo,-10+cachedPango->width(),-9);
1332 cairo_rel_line_to(cairo,0,cachedPango->height()-2);
1333 cairo_stroke(cairo);
std::string latexToPango(const char *s)
std::size_t portsSize() const
number of ports
Expr polygamma(const Expr &x, const Expr &y)
void drawPort(F f, float x, float y, float rotation) const
UnitsExpressionWalker pow(const UnitsExpressionWalker &x, const UnitsExpressionWalker &y)
represents rectangular region of a lasso operation
float y(float x, float y) const
void drawMultiply() const
rotate (x,y) by rot (in degrees) around the origin (x0, y0) can be used for rotating multiple points ...
OperationFactory< OperationBase, Operation > operationFactory
base class for operations that have names
bool flipped(double rotation)
returns if the angle (in degrees) is in the second or third quadrant
Creation and access to the minskyTCL_obj object, which has code to record whenever Minsky's state cha...
void drawSymbol(const char *s) const
represents the units (in sense of dimensional analysis) of a variable.
double fracPart(double x)
std::string str(T x)
utility function to create a string representation of a numeric type
factory class template, for creating objects of type T<O>. N is the maximum value of O ...
const Minsky & cminsky()
const version to help in const correctness
CheckConsistent(const Item &item)
void throw_error(const std::string &) const
mark item on canvas, then throw
SVGRenderer histogramResource
void render(cairo_t *) const
UnitsExpressionWalker timeUnit
virtual std::weak_ptr< Port > ports(std::size_t i) const
callback to be run when item deleted from group
legacy data importer object
string to_string(CONST84 char *x)
float x(float x, float y) const
helper class to draw port label symbols