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