From fb689040274a93447b25d09b5c0b56adca571b1c Mon Sep 17 00:00:00 2001 From: godardma Date: Thu, 12 Feb 2026 17:29:18 +0100 Subject: [PATCH 1/3] [doc] graphical documentation and example for matlab --- examples/00_graphics/graphic_examples.m | 112 ++++++++++++++++++++++++ 1 file changed, 112 insertions(+) create mode 100644 examples/00_graphics/graphic_examples.m diff --git a/examples/00_graphics/graphic_examples.m b/examples/00_graphics/graphic_examples.m new file mode 100644 index 000000000..2190ec6fe --- /dev/null +++ b/examples/00_graphics/graphic_examples.m @@ -0,0 +1,112 @@ +import py.codac4matlab.* + +% Graphics can be directly called without a Figure2D instanciation, using "DefaultFigure": + +DefaultFigure().set_window_properties(Vector({600,600}),Vector({300,300})); +DefaultFigure().draw_box(IntervalVector({{2.2,2.5},{2.2,2.5}}),StyleProperties({Color().black(),Color().yellow(0.5)})); +DefaultFigure().draw_AUV(Vector({1,1,3.14/2}),1.,StyleProperties({Color().black(),Color().yellow()},"-..")); +DefaultFigure().draw_motor_boat(Vector({0,0,0}),1.,StyleProperties({Color().black(),Color().yellow()})); +DefaultFigure().draw_tank(Vector({2,1,3.14/2}),1.,StyleProperties({Color().black(),Color().yellow()},"vehicles","-.")); +DefaultFigure().draw_pie(Vector({2,2}),Interval(1.5,2.5),Interval((3*3.14/4)-0.5,(3*3.14/4)+0.5),StyleProperties({Color().blue(),Color().cyan()})); +DefaultFigure().draw_polyline({Vector({2,-0.5}),Vector({4,0.5}),Vector({3,1.5}),Vector({4,2.5}),Vector({3,3})},Color().red()); +DefaultFigure().draw_polygon(Polygon({Vector({2,4.5}),Vector({4,4.5}),Vector({4.2,3.5}),Vector({3.5,3})}),StyleProperties({Color().none(),Color().green(0.5)})); +DefaultFigure().draw_polyline({Vector({-0.8,0}),Vector({0,1.5})},0.2,StyleProperties({Color().red(),Color().black(0.3)})); + +% Last argument corresponds to "StyleProperties" with one or two colors: edge color + (optional) fill color +% Predefined Color objects can be configured with a float parameter for opacity (1=opaque, 0=transparent) + +% Custom figures can also be created: + +fig1 = Figure2D("My figure 1", GraphicOutput().VIBES.union(GraphicOutput().IPE)); +% Here, graphics will be rendered by two tools: both VIBES and IPE +% For VIBES, it requires the VIBes viewer to be launched prior to the execution +% For IPE, it generates a file named "My figure 1.xml" that can be edited with IPE, and converted to PDF + +fig1.set_window_properties(Vector({50,50}),Vector({500,500})); % position, window size +fig1.set_axes(axis(1,Interval(-10,10)), axis(2,Interval(-10,10))); % (axis_id,[range_of_values_on_this_axis]) +fig1.draw_box(IntervalVector({{-1,1},{-1,1}}),StyleProperties({Color().green(),Color().red(0.2)})); % drawing a green box with red opacity values inside +fig1.draw_circle(Vector({1,1}),0.5,Color({255,155,5})); % drawing a circle at (1,1) of radius 0.5 with a custom RGB color +fig1.draw_ring(Vector({1,1}),Interval(4,6),Color().red()); % drawing a ring at (1,1) of radius [4,6] with a predefined red color + +fig2 = Figure2D("My figure 2", GraphicOutput().VIBES.union(GraphicOutput().IPE)); +fig2.set_axes(axis(1,Interval(-1,5)), axis(2,Interval(-1,5))); +fig2.set_window_properties(Vector({250,250}),Vector({500,500})); + +% The previously declared figure "fig2" can now be used as a DefaultFigure +DefaultFigure().set(fig2); +DefaultFigure().draw_box(IntervalVector({{2.2,2.5},{2.2,2.5}}),StyleProperties({Color().black(),Color().green(0.8)})); + +DefaultFigure().set(fig1); +DefaultFigure().draw_box(IntervalVector({{2.2,2.5},{2.2,2.5}}),StyleProperties({Color().blue(),Color().cyan(0.8)})); + +fig2.draw_circle(Vector({2,2}),0.5,StyleProperties({Color().red(),Color().red(0.2)},"z:1.")); % will alway be on top despite being "drawn" first + +fig2.draw_AUV(Vector({1,1,3.14/2}),2.,StyleProperties({Color().black(),Color().yellow()},"w:0.1","vehicles")); +fig2.draw_tank(Vector({2,1,3.14/2}),1.5,StyleProperties({Color().black(),Color().yellow()},"vehicles","w:0.1")); +fig2.draw_motor_boat(Vector({0,0,0}),1.,StyleProperties({Color().black(),Color().yellow()},"vehicles")); +fig2.draw_pie(Vector({2,2}),Interval(1.5,2.5),Interval((3*3.14/4)-0.5,(3*3.14/4)+0.5),StyleProperties({Color().blue(),Color().cyan()})); +fig2.draw_polyline({Vector({2,-0.5}),Vector({4,0.5}),Vector({3,1.5}),Vector({4,2.5}),Vector({3,3})},StyleProperties(Color().red(),"..")); +fig2.draw_polygon(Polygon({Vector({2,4.5}),Vector({4,4.5}),Vector({4.2,3.5}),Vector({3.5,3})}),StyleProperties({Color().none(),Color().green(0.5)})); +fig2.draw_polyline({Vector({-0.8,0}),Vector({0,1.5})},0.2,StyleProperties({Color().red(),Color().black(0.3)})); +fig2.draw_ellipse(Vector({1,1}),Vector({0.5,2.}),0.2,StyleProperties({Color().blue(),Color().blue(0.3)})); +fig2.draw_line(Vector({1,1}),Vector({3,3}),Color().blue()); +fig2.draw_arrow(Vector({3,1}),Vector({2.2,2}),0.2,StyleProperties({Color().red(),Color().black(0.3)})); +fig2.draw_parallelepiped(Parallelepiped(Vector({1.5,2.8}),Matrix({{0.5,0.4},{0,0.2}})),StyleProperties({Color().red(),Color().green(0.5)},"parallelepiped","w:0.1")); + +fig2.draw_zonotope(Zonotope(Vector({4,1.5}),Matrix({{-0.2,-0.06,0.2,0.06,0.01,0.08,0}, ... + {0.1,0.04,0.04,-0.04,-0.03,0.18,0}})),StyleProperties({Color().red(),Color().yellow(0.4)},"zonotope","w:0.05")); + +p_3d = Parallelepiped(Vector({1.2,3.5,2.2}),Matrix({{0.5,0.4,0},{0,0.2,0.1},{0,0,0.3}})); +fig2.draw_zonotope(p_3d.proj({1,2}),StyleProperties({Color().green(),Color().yellow(0.4)},"zonotope")); + +fig2.draw_text("Hello, World!",Vector({-0.5,4.5}),0.2, Color().blue()); + +fig2.draw_raster("logo_codac.png", IntervalVector({{2.5,5},{-1,-0.4}}),StyleProperties("raster")); + +fig2.draw_circle(Vector({0.5,0.5}),0.5,StyleProperties({Color().orange(),Color().orange(0.2)},"z:-1.")); % will alway be in the bottom despite being "drawn" last + +% Colors +% predefined colors without and with opacity +fig2.draw_point(Vector({2,2}), StyleProperties({Color().red(),Color().yellow(0.5)})); +% HTML color without and with opacity +fig2.draw_box(IntervalVector({{2.4,2.9},{2.4,2.9}}),StyleProperties({Color("#da3907"),Color("#da390755")})); +% HSV color without and with opacity +fig2.draw_box(IntervalVector({{2.6,3.1},{2.6,3.1}}),StyleProperties({Color({108,90,78},Model().HSV),Color({108,90,78,20},Model().HSV)})); + +fig3 = Figure2D("ColorMap figure", GraphicOutput().VIBES.union(GraphicOutput().IPE)); +fig3.set_window_properties(Vector({800,250}),Vector({500,500})); + +cmap_haxby = ColorMap().haxby(); +cmap_default = ColorMap().basic(); +cmap_blue_tube = ColorMap().blue_tube(); +cmap_red_tube = ColorMap().red_tube(); +cmap_rainbow = ColorMap().rainbow(); + +custom_map = ColorMap(Model().RGB); +custom_map.set_item(0,Color({255,0,0})); +custom_map.set_item(0.5,Color({0,255,0})); +custom_map.set_item(1,Color({0,0,255})); + +subdivisions = 40; +fig3.set_axes(axis(1,Interval(-1,subdivisions+1)), axis(2,Interval(-1.25,0.05))); + +for i = 0:(subdivisions) + ratio = i / subdivisions; + fig3.draw_box(IntervalVector({{i,i+1},{-1./5.,0}}),StyleProperties({Color().black(),cmap_default.color(ratio)})); + fig3.draw_box(IntervalVector({{i,i+1},{-2./5.,-1./5.}}),StyleProperties({Color().black(),cmap_haxby.color(ratio)})); + fig3.draw_box(IntervalVector({{i,i+1},{-3./5.,-2./5.}}),StyleProperties({Color().black(),cmap_rainbow.color(ratio)})); + fig3.draw_box(IntervalVector({{i,i+1},{-4./5.,-3./5.}}),StyleProperties({Color().black(),cmap_blue_tube.color(ratio)})); + fig3.draw_box(IntervalVector({{i,i+1},{-5./5.,-4./5.}}),StyleProperties({Color().black(),cmap_red_tube.color(ratio)})); + fig3.draw_box(IntervalVector({{i,i+1},{-6./5.,-5./5.}}),StyleProperties({Color().black(),custom_map.color(ratio)})); +end + +fig4 = Figure2D("My Figure 4", GraphicOutput().VIBES); +fig4.set_window_properties(Vector({500,50}),Vector({500,500})); +fig4.set_axes(axis(1,Interval(-10,10)), axis(2,Interval(-10,10))); + +a= 0.8; +t = ScalarVar(); +% Fermat's spiral +f1 = AnalyticFunction({t},vec(a*sqrt(t)*cos(t),a*sqrt(t)*sin(t))); +traj4 = AnalyticTraj(f1,Interval(0,100)); +fig4.draw_trajectory(traj4, StyleGradientProperties(ColorMap().rainbow(), "..")); \ No newline at end of file From 8942bf1159fc28e6f391308e3ed39bcc24ec1232 Mon Sep 17 00:00:00 2001 From: godardma Date: Thu, 12 Feb 2026 17:34:23 +0100 Subject: [PATCH 2/3] [doc] graphical documentation and example for matlab --- .../manual/visualization/3d_visualization.rst | 4 + doc/manual/manual/visualization/colors.rst | 85 +++++++++++++++++- doc/manual/manual/visualization/figures.rst | 30 ++++++- doc/manual/manual/visualization/functions.rst | 15 ++++ .../manual/visualization/img/colormaps.png | Bin 16151 -> 9313 bytes examples/00_graphics/graphic_examples.cpp | 5 +- examples/00_graphics/graphic_examples.py | 2 +- .../graphics/figures/codac2_py_Figure2D.cpp | 4 +- .../src/graphics/styles/codac2_py_Color.cpp | 22 ++++- .../graphics/styles/codac2_py_ColorMap.cpp | 1 + 10 files changed, 158 insertions(+), 10 deletions(-) diff --git a/doc/manual/manual/visualization/3d_visualization.rst b/doc/manual/manual/visualization/3d_visualization.rst index d9d632159..bfe22788b 100644 --- a/doc/manual/manual/visualization/3d_visualization.rst +++ b/doc/manual/manual/visualization/3d_visualization.rst @@ -26,6 +26,10 @@ The constructor takes one arguments: the name of the object file. Figure3D fig ("my_object"); // for the object file my_object.obj + .. code-tab:: matlab + + fig = Figure3D("my_object") % for the object file my_object.obj + Drawing functions ----------------- diff --git a/doc/manual/manual/visualization/colors.rst b/doc/manual/manual/visualization/colors.rst index 9cb20760f..c26802cc3 100644 --- a/doc/manual/manual/visualization/colors.rst +++ b/doc/manual/manual/visualization/colors.rst @@ -40,6 +40,20 @@ Predefined colors are available in the ``Color`` class. Each of the static metho Color::light_purple(), Color::purple(), Color::dark_purple() Color::light_pink(), Color::pink(), Color::dark_pink() + .. code-tab:: matlab + + Color().none(), Color().white(), Color().black() + Color().light_gray(), Color().gray(), Color().dark_gray() + Color().light_green(), Color().green(), Color().dark_green() + Color().light_blue(), Color().blue(), Color().dark_blue() + Color().light_cyan(), Color().cyan(), Color().dark_cyan() + Color().light_yellow(), Color().yellow(), Color().dark_yellow() + Color().light_orange(), Color().orange(), Color().dark_orange() + Color().light_red(), Color().red(), Color().dark_red() + Color().light_brown(), Color().brown(), Color().dark_brown() + Color().light_purple(), Color().purple(), Color().dark_purple() + Color().light_pink(), Color().pink(), Color().dark_pink() + Each basic color is available in three shades: ``light_``, normal and ``dark_``: .. figure:: img/codac_colors.png @@ -59,6 +73,11 @@ Custom colors can be defined in the RGB or HSV color spaces. An enumeration ``Mo Model::RGB; // RGB color space Model::HSV; // HSV color space + .. code-tab:: matlab + + Model().RGB % RGB color space + Model().HSV % HSV color space + A getter ``model()`` is available, and the methods ``rgb()`` and ``hsv()`` are used to do the conversion between the two color spaces. If the color is in RGB then the red, green, blue and alpha values are between 0 and 255. @@ -99,6 +118,16 @@ Additionnal methods are available for any useful purpose: // HSV color without and with opacity fig2.draw_box({{2.6,3.1},{2.6,3.1}}, {Color({108,90,78},Model::HSV),Color({108,90,78,20},Model::HSV)}); + .. code-tab:: matlab + + % predefined colors without and with opacity + fig.draw_point(Vector({2,2}), StyleProperties({Color().red(),Color().yellow(0.5)})); + % HTML color without and with opacity + fig.draw_box(IntervalVector({{2.4,2.9},{2.4,2.9}}),StyleProperties({Color("#da3907"),Color("#da390755")})); + % HSV color without and with opacity + fig.draw_box(IntervalVector({{2.6,3.1},{2.6,3.1}}),StyleProperties({Color({108,90,78},Model().HSV),Color({108,90,78,20},Model().HSV)})); + + StyleProperties --------------- @@ -127,6 +156,12 @@ A ``StyleProperties`` object is composed of two ``Color`` objects, one for the e StyleProperties edge_style(Color::red()); // edge only StyleProperties edge_fill_style({Color::blue(),Color::green()}); // edge and fill + .. code-tab:: matlab + + default_style = StyleProperties() % default + edge_style = StyleProperties(Color().red()) % edge only + edge_fill_style = StyleProperties({Color().blue(),Color().green()}) % edge and fill + It can also be deduced from one or two ``Color`` objects. @@ -146,6 +181,13 @@ It can also be deduced from one or two ``Color`` objects. fig.draw_box({{2,5},{2,5}}, Color::red()); // red edge, no fill fig.draw_box({{2,5},{2,5}}, {Color::blue(),Color::green()}); // blue edge, green fill + .. code-tab:: matlab + + fig.draw_box(IntervalVector({{2.2,2.5},{2.2,2.5}})); + fig.draw_box(IntervalVector({{2.2,2.5},{2.2,2.5}}),StyleProperties().inside()); + fig.draw_box(IntervalVector({{2.2,2.5},{2.2,2.5}}),Color().red()); + fig.draw_box(IntervalVector({{2.2,2.5},{2.2,2.5}}),StyleProperties({Color().blue(),Color().green()})); + In addition, optional arguments can be passed to the ``StyleProperties`` object to define line style, line width, layer and Z-value. For more information, see :ref:`subsec-graphics-colors-optional-arguments`. @@ -161,6 +203,11 @@ For more information, see :ref:`subsec-graphics-colors-optional-arguments`. fig.draw_box({{2,5},{2,5}}, StyleProperties(Color::red(), "..", "layer1", "w:0.1", "z:1.5")); // Red edge, dotted line, line width of 0.1, z-value of 1.5 and on layer1 + .. code-tab:: matlab + + fig.draw_box(IntervalVector({{2,5},{2,5}}), StyleProperties(Color().red(), "..", "layer1", "w:0.1", "z:1.5")); + % Red edge, dotted line, line width of 0.1, z-value of 1.5 and on layer1 + Color maps ---------- @@ -185,10 +232,19 @@ Color maps are used to convert a scalar value (between 0 and 1) to a color. The ColorMap::blue_tube(); // blue color map, used mainly for tubes ColorMap::red_tube(); // red color map, used mainly for tubes + .. code-tab:: matlab + + ColorMap().basic(); % default color map + ColorMap().haxby(); % Haxby color map + ColorMap().rainbow(); % rainbow color map + ColorMap().blue_tube(); % blue color map, used mainly for tubes + ColorMap().red_tube(); % red color map, used mainly for tubes + + These five color maps are displayed below: .. figure:: img/colormaps.png - :width: 400px + :width: 600px A paramater ``alpha`` can be passed to the predefined color maps to set the opacity of the colors (between 0 and 1). The default value is 1 (full opacity). @@ -204,6 +260,11 @@ A paramater ``alpha`` can be passed to the predefined color maps to set the opac // Create a haxby color map with 50% opacity ColorMap cmap = ColorMap::haxby(0.5); + .. code-tab:: matlab + + % Create a haxby color map with 50% opacity + cmap = ColorMap.haxby(0.5) + The method ``color()`` is used to get the color corresponding to a scalar value. The argument is a float between 0 and 1. As for the ``Color`` class, the ``ColorMap`` also has a ``Model`` (RGB or HSV) and an associated getter ``model()``. The default ``Model`` is RGB. @@ -228,6 +289,14 @@ You can also create your own color map : custom_map[0.5] = Color({0,255,0}); custom_map[1] = Color({0,0,255}); + .. code-tab:: matlab + + % Create a custom color map + custom_map = ColorMap(Model().RGB); + custom_map.set_item(0,Color({255,0,0})); + custom_map.set_item(0.5,Color({0,255,0})); + custom_map.set_item(1,Color({0,0,255})); + Note that you can add RGB and HSV colors to the same color map. The model of the color map will define the interpolation space. StyleGradientProperties @@ -250,6 +319,10 @@ A ``StyleGradientProperties`` object involves a ``ColorMap``. Two constructors a StyleGradientProperties default_style; // default StyleGradientProperties custom_style(ColorMap::haxby()); // haxby color map + .. code-tab:: matlab + + default_style = StyleGradientProperties() % default + custom_style = StyleGradientProperties(ColorMap().haxby()) % haxby color map It can also be deduced from a ``ColorMap`` object. @@ -265,6 +338,11 @@ It can also be deduced from a ``ColorMap`` object. fig.draw_trajectory(traj); // Default style fig.draw_trajectory(traj,ColorMap::haxby()); // haxby color map + .. code-tab:: matlab + + fig.draw_trajectory(traj) % Default style + fig.draw_trajectory(traj,ColorMap().haxby()) % haxby color map + In addition, optional arguments can be passed to the ``StyleGradientProperties`` object to define line style, line width, layer and Z-value. For more information, see :ref:`subsec-graphics-colors-optional-arguments`. @@ -280,6 +358,11 @@ For more information, see :ref:`subsec-graphics-colors-optional-arguments`. fig.draw_trajectory(traj, StyleGradientProperties(ColorMap::haxby(), "..", "layer1", "w:0.1", "z:1.5")); // haxby color map, dotted line, line width of 0.1, z-value of 1.5 and on layer1 + .. code-tab:: matlab + + fig.draw_trajectory(traj, StyleGradientProperties(ColorMap().haxby(), "..", "layer1", "w:0.1", "z:1.5")) + % haxby color map, dotted line, line width of 0.1, z-value of 1.5 and on layer1 + .. _subsec-graphics-colors-optional-arguments: Optional arguments diff --git a/doc/manual/manual/visualization/figures.rst b/doc/manual/manual/visualization/figures.rst index d34442ca3..7142e7703 100644 --- a/doc/manual/manual/visualization/figures.rst +++ b/doc/manual/manual/visualization/figures.rst @@ -29,6 +29,12 @@ visualization while IPE creates a file that can be edited by the IPE editor. The GraphicOutput::IPE // for IPE GraphicOutput::VIBES | GraphicOutput::IPE // for both + .. code-tab:: matlab + + GraphicOutput().VIBES % for VIBes + GraphicOutput().IPE % for IPE + GraphicOutput().VIBES.union(GraphicOutput().IPE) % for both + Note that for the VIBes output to work, the VIBes viewer must be launched before the program is run. .. _subsec-graphics-2d-figures-figure2d: @@ -50,6 +56,10 @@ DefaultFigure (see :ref:`subsec-graphics-2d-figures-defaultfigure`). Figure2D fig ("My Figure",GraphicOutput::VIBES|GraphicOutput::IPE); + .. code-tab:: matlab + + fig = Figure2D("My figure 1", GraphicOutput().VIBES.union(GraphicOutput().IPE)); + .. _subsec-graphics-2d-figures-defaultfigure: DefaultFigure @@ -74,9 +84,16 @@ Any Figure2D object can be used as DefaultFigure with the set method: DefaultFigure::set(fig); fig->is_default(); // is true -Note that in C++ the figure must be a shared pointer in order to be passed to the `set` method. + .. code-tab:: matlab + + fig = Figure2D("My figure", GraphicOutput().VIBES.union(GraphicOutput().IPE)); + fig.is_default() % is False + DefaultFigure().set(fig); + fig.is_default() % is True +Note that in C++ the figure must be a shared pointer in order to be passed to the `set` method. + .. _subsec-graphics-2d-figures-figure-properties: Figure properties @@ -96,6 +113,11 @@ Once created, the properties of a Figure2D object can be modified using the foll fig.set_window_properties({50,50},{500,500}); // set the window position and size fig.set_axes(axis(0,{-10,10}), axis(1,{-10,10})); // set the x-axis index to 0 and its range to [-10,10], same for y with index 1 + .. code-tab:: matlab + + fig.set_window_properties(Vector({50,50}),Vector({500,500})); % position, window size + fig.set_axes(axis(1,Interval(-10,10)), axis(2,Interval(-10,10))); % (axis_id,[range_of_values_on_this_axis]) + The same methods can be applied on the DefaultFigure object. .. tabs:: @@ -110,6 +132,12 @@ The same methods can be applied on the DefaultFigure object. DefaultFigure::set_window_properties({50,50},{500,500}); // set the window position and size DefaultFigure::set_axes(axis(0,{-10,10}), axis(1,{-10,10})); // set the x-axis index to 0 and its range to [-10,10], same for y with index 1 + .. code-tab:: matlab + + DefaultFigure().set_window_properties(Vector({50,50}),Vector({500,500})); % set the window position and size + DefaultFigure().set_axes(axis(1,Interval(-10,10)), axis(2,Interval(-10,10))); % set the x-axis index to 0 and its range to [-10,10], same for y with index 1 + + Many properties have an associated getter : - size() for the figure size (type is Index) diff --git a/doc/manual/manual/visualization/functions.rst b/doc/manual/manual/visualization/functions.rst index 90216a8b3..afa66ccc2 100644 --- a/doc/manual/manual/visualization/functions.rst +++ b/doc/manual/manual/visualization/functions.rst @@ -28,6 +28,14 @@ For example : // On the DefaultFigure DefaultFigure::draw_box({{2.2,2.5},{2.2,2.5}}); + .. code-tab:: matlab + + % On a figure + fig.draw_box(IntervalVector({{2.2,2.5},{2.2,2.5}})); + + % On the DefaultFigure + DefaultFigure().draw_box(IntervalVector({{2.2,2.5},{2.2,2.5}})); + In addition to the arguments described here for every function, an optionnal argument of type StyleProperties can be added to choose the edge and fill color (by default black edge no fill). This object can be deduced from one or two Color objects, see :ref:`this page ` for more information. @@ -46,6 +54,13 @@ for more information. fig.draw_box({{2.2,2.5},{2.2,2.5}},{Color.red()}); // Red edge fig.draw_box({{2.2,2.5},{2.2,2.5}},{Color.red(),Color.blue()}); // Red edge and blue fill + .. code-tab:: matlab + + DefaultFigure().draw_box(IntervalVector({{2.2,2.5},{2.2,2.5}}),Color().red()); % Red edge + DefaultFigure().draw_box(IntervalVector({{2.2,2.5},{2.2,2.5}}),StyleProperties({Color().red()})); % Red edge + DefaultFigure().draw_box(IntervalVector({{2.2,2.5},{2.2,2.5}}),StyleProperties({Color().red(),Color().blue()})); % Red edge and blue fill + + A line style and a layer can be added to the StyleProperties object, see :ref:`the dedicated page ` for more information. diff --git a/doc/manual/manual/visualization/img/colormaps.png b/doc/manual/manual/visualization/img/colormaps.png index 90efcd242cdda74484b4feba3e4b00faf57693ac..bc687b2d99883e5c217bac61c1343bd1e700e03e 100644 GIT binary patch literal 9313 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 #include +#include using namespace std; using namespace codac2; @@ -98,7 +99,7 @@ int main(){ double subdivisions = 40.; fig3.set_axes(axis(0,{-1,subdivisions+1}), axis(1,{-1.25,0.05})); - for (double i=0.; i()) .def_static("VIBES", [](){ return GraphicOutput::VIBES; }) .def_static("IPE", [](){ return GraphicOutput::IPE; }) - .def(py::self | py::self, GRAPHICOUTPUT_OPERATORUNION_GRAPHICOUTPUT_GRAPHICOUTPUT) + .def("union", [](GraphicOutput a, GraphicOutput b){ return a | b; }, + GRAPHICOUTPUT_OPERATORUNION_GRAPHICOUTPUT_GRAPHICOUTPUT, + "x"_a) ; } diff --git a/python/src/graphics/styles/codac2_py_Color.cpp b/python/src/graphics/styles/codac2_py_Color.cpp index 8bbfa409f..b177fc3c8 100644 --- a/python/src/graphics/styles/codac2_py_Color.cpp +++ b/python/src/graphics/styles/codac2_py_Color.cpp @@ -13,6 +13,7 @@ #include #include #include "codac2_py_Color_docs.h" // Generated file from Doxygen XML (doxygen2docstring.py): +#include "codac2_py_matlab.h" using namespace std; using namespace codac2; @@ -23,10 +24,23 @@ using namespace pybind11::literals; void export_Color(py::module& m) { - py::enum_(m, "Model") - .value("RGB", Model::RGB) - .value("HSV", Model::HSV) - ; + if constexpr(FOR_MATLAB) + { + py::class_(m, "Model") + .def(py::init<>()) + .def_static("RGB", [](){ return Model::RGB; }) + .def_static("HSV", [](){ return Model::HSV; }) + ; + } + + else + { + py::enum_(m, "Model") + .value("RGB", Model::RGB) + .value("HSV", Model::HSV) + ; + } + py::class_ exported_color(m, "Color", COLOR_MAIN); exported_color diff --git a/python/src/graphics/styles/codac2_py_ColorMap.cpp b/python/src/graphics/styles/codac2_py_ColorMap.cpp index 3dac81b40..cd5bc6c81 100644 --- a/python/src/graphics/styles/codac2_py_ColorMap.cpp +++ b/python/src/graphics/styles/codac2_py_ColorMap.cpp @@ -12,6 +12,7 @@ #include #include #include "codac2_py_ColorMap_docs.h" // Generated file from Doxygen XML (doxygen2docstring.py): +#include "codac2_py_matlab.h" using namespace std; using namespace codac2; From d094d784e778867913de65c2c7967d7a62b4b46f Mon Sep 17 00:00:00 2001 From: godardma Date: Thu, 12 Feb 2026 17:51:08 +0100 Subject: [PATCH 3/3] [doc] update on matlab tuto lessonC --- doc/manual/tuto/cp_robotics/src/lesson_C.m | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/manual/tuto/cp_robotics/src/lesson_C.m b/doc/manual/tuto/cp_robotics/src/lesson_C.m index 70a847d5b..21fd07526 100644 --- a/doc/manual/tuto/cp_robotics/src/lesson_C.m +++ b/doc/manual/tuto/cp_robotics/src/lesson_C.m @@ -76,7 +76,7 @@ obs{end+1} = yi; end end - t = t + 0.01; + t = t + 0.01; % for performance, it is advised to increment by steps of 0.1 instead end % [C-q5-end]