1 /*
2  * Copyright (c) 2011-2021, The DART development contributors
3  * All rights reserved.
4  *
5  * The list of contributors can be found at:
6  *   https://github.com/dartsim/dart/blob/master/LICENSE
7  *
8  * This file is provided under the following "BSD-style" License:
9  *   Redistribution and use in source and binary forms, with or
10  *   without modification, are permitted provided that the following
11  *   conditions are met:
12  *   * Redistributions of source code must retain the above copyright
13  *     notice, this list of conditions and the following disclaimer.
14  *   * Redistributions in binary form must reproduce the above
15  *     copyright notice, this list of conditions and the following
16  *     disclaimer in the documentation and/or other materials provided
17  *     with the distribution.
18  *   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
19  *   CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
20  *   INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
21  *   MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
22  *   DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
23  *   CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
24  *   SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
25  *   LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
26  *   USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
27  *   AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
28  *   LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
29  *   ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
30  *   POSSIBILITY OF SUCH DAMAGE.
31  */
32 
33 #include <dart/dart.hpp>
34 #include <pybind11/pybind11.h>
35 #include "eigen_geometry_pybind.h"
36 #include "eigen_pybind.h"
37 
38 namespace py = pybind11;
39 
40 #define DARTPY_DEFINE_SPECIALIZED_ASPECT(name)                                 \
41   .def(                                                                        \
42       "has" #name,                                                             \
43       +[](const dart::dynamics::ShapeFrame* self) -> bool {                    \
44         return self->has##name();                                              \
45       })                                                                       \
46       .def(                                                                    \
47           "get" #name,                                                         \
48           +[](dart::dynamics::ShapeFrame* self) -> dart::dynamics::name* {     \
49             return self->get##name();                                          \
50           },                                                                   \
51           py::return_value_policy::reference_internal)                         \
52       .def(                                                                    \
53           "get" #name,                                                         \
54           +[](dart::dynamics::ShapeFrame* self,                                \
55               bool createIfNull) -> dart::dynamics::name* {                    \
56             return self->get##name(createIfNull);                              \
57           },                                                                   \
58           py::return_value_policy::reference_internal,                         \
59           ::py::arg("createIfNull"))                                           \
60       .def(                                                                    \
61           "set" #name,                                                         \
62           +[](dart::dynamics::ShapeFrame* self,                                \
63               const dart::dynamics::name* aspect) {                            \
64             self->set##name(aspect);                                           \
65           },                                                                   \
66           ::py::arg("aspect"))                                                 \
67       .def(                                                                    \
68           "create" #name,                                                      \
69           +[](dart::dynamics::ShapeFrame* self) -> dart::dynamics::name* {     \
70             return self->create##name();                                       \
71           },                                                                   \
72           py::return_value_policy::reference_internal)                         \
73       .def(                                                                    \
74           "remove" #name,                                                      \
75           +[](dart::dynamics::ShapeFrame* self) { self->remove##name(); })     \
76       .def(                                                                    \
77           "release" #name,                                                     \
78           +[](dart::dynamics::ShapeFrame* self)                                \
79               -> std::unique_ptr<dart::dynamics::name> {                       \
80             return self->release##name();                                      \
81           })
82 
83 namespace dart {
84 namespace python {
85 
ShapeFrame(py::module & m)86 void ShapeFrame(py::module& m)
87 {
88   ::py::class_<
89       dart::dynamics::ShapeFrame,
90       // dart::common::EmbedPropertiesOnTopOf<
91       //     dart::dynamics::ShapeFrame,
92       //     dart::dynamics::detail::ShapeFrameProperties,
93       //     dart::common::SpecializedForAspect<
94       //         dart::dynamics::VisualAspect,
95       //         dart::dynamics::CollisionAspect,
96       //         dart::dynamics::DynamicsAspect> >,
97       dart::dynamics::Frame,
98       std::shared_ptr<dart::dynamics::ShapeFrame>>(m, "ShapeFrame")
99       .def(
100           "setProperties",
101           +[](dart::dynamics::ShapeFrame* self,
102               const dart::dynamics::ShapeFrame::UniqueProperties& properties) {
103             self->setProperties(properties);
104           },
105           ::py::arg("properties"))
106       .def(
107           "setAspectProperties",
108           +[](dart::dynamics::ShapeFrame* self,
109               const dart::common::EmbedPropertiesOnTopOf<
110                   dart::dynamics::ShapeFrame,
111                   dart::dynamics::detail::ShapeFrameProperties,
112                   dart::common::SpecializedForAspect<
113                       dart::dynamics::VisualAspect,
114                       dart::dynamics::CollisionAspect,
115                       dart::dynamics::DynamicsAspect>>::AspectProperties&
116                   properties) { self->setAspectProperties(properties); },
117           ::py::arg("properties"))
118       .def(
119           "setShape",
120           +[](dart::dynamics::ShapeFrame* self,
121               const dart::dynamics::ShapePtr& shape) { self->setShape(shape); },
122           ::py::arg("shape"))
123       .def(
124           "getShape",
125           +[](dart::dynamics::ShapeFrame* self) -> dart::dynamics::ShapePtr {
126             return self->getShape();
127           })
128       .def(
129           "getShape",
130           +[](const dart::dynamics::ShapeFrame* self)
131               -> dart::dynamics::ConstShapePtr { return self->getShape(); })
132       // clang-format off
133       DARTPY_DEFINE_SPECIALIZED_ASPECT(VisualAspect)
134       DARTPY_DEFINE_SPECIALIZED_ASPECT(CollisionAspect)
135       DARTPY_DEFINE_SPECIALIZED_ASPECT(DynamicsAspect)
136       // clang-format on
137       .def(
138           "isShapeNode",
139           +[](const dart::dynamics::ShapeFrame* self) -> bool {
140             return self->isShapeNode();
141           })
142       .def(
143           "asShapeNode",
144           +[](dart::dynamics::ShapeFrame* self) -> dart::dynamics::ShapeNode* {
145             return self->asShapeNode();
146           },
147           ::py::return_value_policy::reference,
148           "Convert to a ShapeNode pointer if ShapeFrame is a ShapeNode, "
149           "otherwise return None.")
150       .def(
151           "asShapeNode",
152           +[](const dart::dynamics::ShapeFrame* self)
153               -> const dart::dynamics::ShapeNode* {
154             return self->asShapeNode();
155           },
156           ::py::return_value_policy::reference,
157           "Convert to a ShapeNode pointer if ShapeFrame is a ShapeNode, "
158           "otherwise return None.");
159 
160   ::py::class_<dart::dynamics::VisualAspect>(m, "VisualAspect")
161       .def(::py::init<>())
162       .def(
163           ::py::init<const dart::common::detail::AspectWithVersionedProperties<
164               dart::common::CompositeTrackingAspect<dart::dynamics::ShapeFrame>,
165               dart::dynamics::VisualAspect,
166               dart::dynamics::detail::VisualAspectProperties,
167               dart::dynamics::ShapeFrame,
168               &dart::common::detail::NoOp>::PropertiesData&>(),
169           ::py::arg("properties"))
170       .def(
171           "setRGBA",
172           +[](dart::dynamics::VisualAspect* self,
173               const Eigen::Vector4d& color) { self->setRGBA(color); },
174           ::py::arg("color"))
175       .def(
176           "getRGBA",
177           +[](dart::dynamics::VisualAspect* self) -> const Eigen::Vector4d& {
178             return self->getRGBA();
179           })
180       .def(
181           "setHidden",
182           +[](dart::dynamics::VisualAspect* self, const bool& value) {
183             self->setHidden(value);
184           },
185           ::py::arg("value"))
186       .def(
187           "getHidden",
188           +[](dart::dynamics::VisualAspect* self) -> bool {
189             return self->getHidden();
190           })
191       .def(
192           "setShadowed",
193           +[](dart::dynamics::VisualAspect* self, const bool& value) {
194             self->setShadowed(value);
195           },
196           ::py::arg("value"))
197       .def(
198           "getShadowed",
199           +[](dart::dynamics::VisualAspect* self) -> bool {
200             return self->getShadowed();
201           })
202       .def(
203           "setColor",
204           +[](dart::dynamics::VisualAspect* self,
205               const Eigen::Vector3d& color) { self->setColor(color); },
206           ::py::arg("color"))
207       .def(
208           "setColor",
209           +[](dart::dynamics::VisualAspect* self,
210               const Eigen::Vector4d& color) { self->setColor(color); },
211           ::py::arg("color"))
212       .def(
213           "setRGB",
214           +[](dart::dynamics::VisualAspect* self, const Eigen::Vector3d& rgb) {
215             self->setRGB(rgb);
216           },
217           ::py::arg("rgb"))
218       .def(
219           "setAlpha",
220           +[](dart::dynamics::VisualAspect* self, const double alpha) {
221             self->setAlpha(alpha);
222           },
223           ::py::arg("alpha"))
224       .def(
225           "getColor",
226           +[](const dart::dynamics::VisualAspect* self) -> Eigen::Vector3d {
227             return self->getColor();
228           })
229       .def(
230           "getRGB",
231           +[](const dart::dynamics::VisualAspect* self) -> Eigen::Vector3d {
232             return self->getRGB();
233           })
234       .def(
235           "getAlpha",
236           +[](const dart::dynamics::VisualAspect* self) -> double {
237             return self->getAlpha();
238           })
239       .def("hide", +[](dart::dynamics::VisualAspect* self) { self->hide(); })
240       .def("show", +[](dart::dynamics::VisualAspect* self) { self->show(); })
241       .def("isHidden", +[](const dart::dynamics::VisualAspect* self) -> bool {
242         return self->isHidden();
243       });
244 
245   ::py::class_<dart::dynamics::CollisionAspect>(m, "CollisionAspect")
246       .def(::py::init<>())
247       .def(
248           ::py::init<const dart::common::detail::AspectWithVersionedProperties<
249               dart::common::CompositeTrackingAspect<dart::dynamics::ShapeFrame>,
250               dart::dynamics::CollisionAspect,
251               dart::dynamics::detail::CollisionAspectProperties,
252               dart::dynamics::ShapeFrame,
253               &dart::common::detail::NoOp>::PropertiesData&>(),
254           ::py::arg("properties"))
255       .def(
256           "setCollidable",
257           +[](dart::dynamics::CollisionAspect* self, const bool& value) {
258             self->setCollidable(value);
259           },
260           ::py::arg("value"))
261       .def(
262           "getCollidable",
263           +[](const dart::dynamics::CollisionAspect* self) -> bool {
264             return self->getCollidable();
265           })
266       .def(
267           "isCollidable",
268           +[](const dart::dynamics::CollisionAspect* self) -> bool {
269             return self->isCollidable();
270           });
271 
272   ::py::class_<dart::dynamics::DynamicsAspect>(m, "DynamicsAspect")
273       .def(::py::init<>())
274       .def(
275           ::py::init<const dart::common::detail::AspectWithVersionedProperties<
276               dart::common::CompositeTrackingAspect<dart::dynamics::ShapeFrame>,
277               dart::dynamics::DynamicsAspect,
278               dart::dynamics::detail::DynamicsAspectProperties,
279               dart::dynamics::ShapeFrame,
280               &dart::common::detail::NoOp>::PropertiesData&>(),
281           ::py::arg("properties"))
282       .def(
283           "setFrictionCoeff",
284           +[](dart::dynamics::DynamicsAspect* self, const double& value) {
285             self->setFrictionCoeff(value);
286           },
287           ::py::arg("value"))
288       .def(
289           "getFrictionCoeff",
290           +[](const dart::dynamics::DynamicsAspect* self) -> double {
291             return self->getFrictionCoeff();
292           })
293       .def(
294           "setRestitutionCoeff",
295           +[](dart::dynamics::DynamicsAspect* self, const double& value) {
296             self->setRestitutionCoeff(value);
297           },
298           ::py::arg("value"))
299       .def(
300           "getRestitutionCoeff",
301           +[](const dart::dynamics::DynamicsAspect* self) -> double {
302             return self->getRestitutionCoeff();
303           });
304 }
305 
306 } // namespace python
307 } // namespace dart
308