Skip to content

Commit ef123a2

Browse files
committed
Add drawFrames, drawLines, drawPoints and an example
1 parent e39feb5 commit ef123a2

File tree

3 files changed

+65
-4
lines changed

3 files changed

+65
-4
lines changed

bindings/Sofa/src/SofaPython3/Sofa/Core/Binding_Controller.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -140,7 +140,7 @@ void moduleAddController(py::module &m) {
140140
f.def("reinit", &Controller::reinit);
141141
f.def("draw", [](Controller& self, sofa::core::visual::VisualParams* params){
142142
self.draw(params);
143-
});
143+
}, pybind11::return_value_policy::reference);
144144
}
145145

146146

bindings/Sofa/src/SofaPython3/Sofa/Core/Binding_VisualParams.cpp

Lines changed: 30 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -30,10 +30,12 @@
3030
#include <SofaPython3/Sofa/Core/Binding_VisualParams_doc.h>
3131

3232
#include <SofaPython3/PythonFactory.h>
33-
34-
#include <sofa/type/RGBAColor.h>;
33+
#include <sofa/core/objectmodel/Data.h>
34+
#include <sofa/type/RGBAColor.h>
3535

3636
namespace py { using namespace pybind11; }
37+
using sofa::core::objectmodel::BaseData;
38+
using sofa::core::objectmodel::Data;
3739
using sofa::core::objectmodel::BaseObject;
3840
using sofa::core::visual::VisualParams;
3941
using sofa::core::visual::DrawTool;
@@ -43,12 +45,37 @@ namespace sofapython3 {
4345
void moduleAddVisualParams(py::module &m)
4446
{
4547
py::class_<VisualParams> vp(m, "VisualParams", sofapython3::doc::visualParams::baseVisualParamsClass);
46-
vp.def("getDrawTool", [](VisualParams *self){ return self->drawTool() ;});
48+
vp.def("getDrawTool", [](VisualParams *self){ return self->drawTool(); },
49+
pybind11::return_value_policy::reference);
4750

4851
py::class_<DrawTool> dt(m, "DrawTool", sofapython3::doc::visualParams::baseVisualParamsClass);
4952
dt.def("drawPoints", [](DrawTool *self, const std::vector<sofa::type::Vec3> &points, float size ){
5053
self->drawPoints(points, size, sofa::type::RGBAColor::white());
5154
});
55+
dt.def("drawPoints", [](DrawTool *self, BaseData* dpositions, float size ){
56+
auto positions = dynamic_cast<Data<sofa::type::vector<sofa::type::Vec3>>*>(dpositions);
57+
if(positions)
58+
self->drawPoints(positions->getValue(), size, sofa::type::RGBAColor::white());
59+
});
60+
dt.def("drawLines", [](DrawTool *self, const std::vector<sofa::type::Vec3> &points, float size ){
61+
self->drawLines(points, size, sofa::type::RGBAColor::white());
62+
});
63+
dt.def("drawFrames", [](DrawTool* self,
64+
const std::vector<sofa::type::Vec3d>& points,
65+
const std::vector<sofa::type::Quatd>& orientations,
66+
const sofa::type::Vec3& size ){
67+
for(unsigned int i=0;i<points.size();i++)
68+
{
69+
self->drawFrame(points[i], orientations[i], size);
70+
}
71+
});
72+
dt.def("draw3DText", [](DrawTool* self,
73+
const sofa::type::Vec3d& point,
74+
const float size,
75+
const std::string& text)
76+
{
77+
self->draw3DText(point, size, sofa::type::RGBAColor::white(), text.c_str());
78+
});
5279
}
5380

5481
} /// namespace sofapython3
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
import Sofa
2+
import SofaTypes
3+
4+
class DrawingExamples(Sofa.Core.Controller):
5+
def __init__(self, *args, **kwargs):
6+
# These are needed (and the normal way to override from a python class)
7+
Sofa.Core.Controller.__init__(self, *args, **kwargs)
8+
9+
self.target = kwargs.get("target", None)
10+
11+
def draw(self, visual_context):
12+
dt = visual_context.getDrawTool()
13+
dt.drawPoints([SofaTypes.Vec3d(-1.5,0,-1)], 5.0)
14+
dt.drawPoints([SofaTypes.Vec3d(-1.3,0,-1), SofaTypes.Vec3d(1.3,0,-1)], 5.0)
15+
dt.drawLines([SofaTypes.Vec3d(-1.3,0,-1), SofaTypes.Vec3d(1.3,0,-1)], 1.0)
16+
dt.drawFrames([SofaTypes.Vec3d(-1.5,0.1,-1)], [SofaTypes.Quat(0.0,0,0,1.0)], SofaTypes.Vec3d(0.1,0.1,0.1))
17+
18+
if self.target is not None:
19+
dt.drawPoints(self.target.position, 2.0)
20+
21+
dt.draw3DText(SofaTypes.Vec3d(-2.0,0.0,0.0), 0.5, "This is not a raptor")
22+
23+
def createScene(root):
24+
root.dt = 0.01
25+
root.bbox = [[-1,-1,-1],[1,1,1]]
26+
root.addObject('DefaultVisualManagerLoop')
27+
root.addObject('DefaultAnimationLoop')
28+
29+
root.addObject("MeshOBJLoader", name="loader", filename="mesh/raptor_35kp.obj")
30+
31+
# Add our python controller in the scene
32+
root.addObject( DrawingExamples(name="DrawingController2", target=root.loader) )
33+
34+

0 commit comments

Comments
 (0)