44#ifndef LASS_GUARDIAN_OF_INCLUSION_PYTHON_EXPORT_TRAITS_PRIM_H
45#define LASS_GUARDIAN_OF_INCLUSION_PYTHON_EXPORT_TRAITS_PRIM_H
58template <
typename ObjectType,
typename ExportTraits,
size_t dimension = ObjectType::dimension>
59struct PyExportTraitsVectorPoint
61 static PyObject* build(
const ObjectType& v)
68 for (
size_t i = 0; i < dimension; ++i)
70 PyObject* x = pyBuildSimpleObject(v[i]);
71 if (!x || PyTuple_SetItem(tuple.get(),
static_cast<Py_ssize_t
>(i), x) != 0)
79 static int get(PyObject* obj, ObjectType& v)
81 const TPyObjPtr tuple = impl::checkedFastSequence(obj, dimension);
87 PyObject** objects = PySequence_Fast_ITEMS(tuple.get());
89 for (
size_t k = 0; k < dimension; ++k)
91 if (!impl::decodeObject(objects[k],
static_cast<Py_ssize_t
>(k), result[k]))
102template <
typename AabbType,
typename ExportTraits >
103struct PyExportTraitsPrimAabb
105 typedef AabbType TAabb;
106 static PyObject* build(
const TAabb& aabb)
110 static int get(PyObject* obj, TAabb& aabb)
112 typename TAabb::TPoint min, max;
113 if (decodeTuple(obj, min, max) != 0)
120 aabb = TAabb(min, max);
122 catch (util::Exception& error)
124 std::ostringstream buffer;
125 buffer << ExportTraits::className() <<
": " << error.message();
126 PyErr_SetString(PyExc_ValueError, buffer.str().c_str());
133template <
typename LineSegmentType,
typename ExportTraits >
134struct PyExportTraitsPrimLineSegment
136 typedef LineSegmentType TLineSegment;
137 static PyObject* build(
const TLineSegment& seg)
141 static int get(PyObject* obj, TLineSegment& seg)
143 typename TLineSegment::TPoint tail, head;
144 if (decodeTuple(obj, tail, head) != 0)
149 seg = TLineSegment(tail, head);
154template <
typename TransformationType,
typename ExporTraits>
155struct PyExportTraitsPrimTransformation
157 typedef TransformationType TTransformation;
158 typedef typename TransformationType::TValue TValue;
159 enum { size = TransformationType::dimension + 1 };
161 static PyObject* build(
const TTransformation& transfo)
163 const TValue*
const values = transfo.matrix();
169 for (
int i = 0; i < size; ++i)
176 for (
int j = 0; j < size; ++j)
178 PyObject* x = pyBuildSimpleObject(values[i * size + j]);
179 if (!x || PyTuple_SetItem(row.get(), j, x) != 0)
192 static int get(PyObject* obj, TTransformation& transfo)
194 TPyObjPtr tuple = impl::checkedFastSequence(obj, size);
200 PyObject** rows = PySequence_Fast_ITEMS(tuple.get());
201 TValue values[size * size];
202 for (
int i = 0; i < size; ++i)
204 TPyObjPtr row = impl::checkedFastSequence(rows[i], size);
207 std::ostringstream buffer;
208 buffer << ExporTraits::className() <<
": row " << i;
212 PyObject** objects = PySequence_Fast_ITEMS(row.get());
213 for (
int j = 0; j < size; ++j)
215 if (pyGetSimpleObject(objects[j], values[size * i + j]) != 0)
217 std::ostringstream buffer;
218 buffer << ExporTraits::className() <<
": row " << i <<
", column " << j;
224 transfo = TTransformation(values, values + size * size);
229template <
typename PolygonType,
typename ExportTraits>
230struct PyExportTraitsPrimSimplePolygon
232 typedef PolygonType TPolygon;
233 typedef typename PolygonType::TPoint TPoint;
234 static PyObject* build(
const TPolygon& poly)
236 std::vector<TPoint> points;
237 for (
unsigned i = 0; i < poly.size(); ++i)
238 points.push_back(poly[i]);
239 return pyBuildSimpleObject( points );
241 static int get(PyObject* obj, TPolygon& poly)
243 std::vector<TPoint> points;
244 if (pyGetSimpleObject(obj, points) != 0)
249 poly = TPolygon(points.begin(), points.end());
254template <
typename AxisType,
typename ExportTraits>
255struct PyExportTraitsPrimAxis
257 typedef AxisType TAxis;
258 static PyObject* build(
const TAxis& axis)
260 return pyBuildSimpleObject(std::string(1, axis.axis()));
262 static int get(PyObject* obj, TAxis& axis)
265 if (pyGetSimpleObject(obj, s) != 0)
274 catch (util::Exception& error)
276 std::ostringstream buffer;
277 buffer << ExportTraits::className() <<
": " << error.message();
278 PyErr_SetString(PyExc_ValueError, buffer.str().c_str());
285LASS_PYTHON_DLL PyObject* LASS_CALL buildIndexVertex(
size_t vertex,
size_t normal,
size_t uv);
286LASS_PYTHON_DLL
int LASS_CALL getIndexVertex(PyObject* iIndices,
size_t& vertex,
size_t& normal,
size_t& uv);
301#if defined(LASS_PRIM_HAVE_PY_EXPORT_TRAITS_VECTOR_2D)
302# ifndef LASS_GUARDIAN_OF_INCLUSION_PYTHON_EXPORT_TRAITS_PRIM_H_VECTOR_2D
303# define LASS_GUARDIAN_OF_INCLUSION_PYTHON_EXPORT_TRAITS_PRIM_H_VECTOR_2D
310 public impl::PyExportTraitsVectorPoint< prim::Vector2D<T>, PyExportTraits< prim::Vector2D<T> > >
312 constexpr static const char* py_typing =
"_Vector2D[T]";
313 constexpr static const char* py_typing_preamble =
"type _Vector2D[T] = tuple[T, T]";
315 static const char* className() {
return "Vector2D"; }
323#if defined(LASS_PRIM_HAVE_PY_EXPORT_TRAITS_VECTOR_3D)
324# ifndef LASS_GUARDIAN_OF_INCLUSION_PYTHON_EXPORT_TRAITS_PRIM_H_VECTOR_3D
325# define LASS_GUARDIAN_OF_INCLUSION_PYTHON_EXPORT_TRAITS_PRIM_H_VECTOR_3D
332 public impl::PyExportTraitsVectorPoint< prim::Vector3D<T>, PyExportTraits< prim::Vector3D<T> > >
334 constexpr static const char* py_typing =
"_Vector3D[T]";
335 constexpr static const char* py_typing_preamble =
"type _Vector3D[T] = tuple[T, T, T]";
337 static const char* className() {
return "Vector3D"; }
344#if defined(LASS_PRIM_HAVE_PY_EXPORT_TRAITS_VECTOR_4D)
345# ifndef LASS_GUARDIAN_OF_INCLUSION_PYTHON_EXPORT_TRAITS_PRIM_H_VECTOR_4D
346# define LASS_GUARDIAN_OF_INCLUSION_PYTHON_EXPORT_TRAITS_PRIM_H_VECTOR_4D
353 public impl::PyExportTraitsVectorPoint< prim::Vector4D<T>, PyExportTraits< prim::Vector4D<T> > >
355 constexpr static const char* py_typing =
"_Vector4D[T]";
356 constexpr static const char* py_typing_preamble =
"type _Vector4D[T] = tuple[T, T, T, T]";
358 static const char* className() {
return "Vector4D"; }
368#if defined(LASS_PRIM_HAVE_PY_EXPORT_TRAITS_POINT_2D)
369# ifndef LASS_GUARDIAN_OF_INCLUSION_PYTHON_EXPORT_TRAITS_PRIM_H_POINT_2D
370# define LASS_GUARDIAN_OF_INCLUSION_PYTHON_EXPORT_TRAITS_PRIM_H_POINT_2D
377 public impl::PyExportTraitsVectorPoint< prim::Point2D<T>, PyExportTraits< prim::Point2D<T> > >
379 constexpr static const char* py_typing =
"_Point2D[T]";
380 constexpr static const char* py_typing_preamble =
"type _Point2D[T] = tuple[T, T]";
382 static const char* className() {
return "Point2D"; }
390#if defined(LASS_PRIM_HAVE_PY_EXPORT_TRAITS_POINT_3D)
391# ifndef LASS_GUARDIAN_OF_INCLUSION_PYTHON_EXPORT_TRAITS_PRIM_H_POINT_3D
392# define LASS_GUARDIAN_OF_INCLUSION_PYTHON_EXPORT_TRAITS_PRIM_H_POINT_3D
399 public impl::PyExportTraitsVectorPoint< prim::Point3D<T>, PyExportTraits< prim::Point3D<T> > >
401 constexpr static const char* py_typing =
"_Point3D[T]";
402 constexpr static const char* py_typing_preamble =
"type _Point3D[T] = tuple[T, T, T]";
404 static const char* className() {
return "Point3D"; }
414#if defined(LASS_PRIM_HAVE_PY_EXPORT_TRAITS_AABB_2D)
415# ifndef LASS_GUARDIAN_OF_INCLUSION_PYTHON_EXPORT_TRAITS_PRIM_H_AABB_2D
416# define LASS_GUARDIAN_OF_INCLUSION_PYTHON_EXPORT_TRAITS_PRIM_H_AABB_2D
421template <
typename T,
typename MMP>
423 public impl::PyExportTraitsPrimAabb< prim::Aabb2D<T, MMP>, PyExportTraits< prim::Aabb2D<T, MMP> > >
425 constexpr static const char* py_typing =
"_Aabb2D[T]";
426 constexpr static const char* py_typing_preamble =
427 "type _Point2D[T] = tuple[T, T]\n"
428 "type _Aabb2D[T] = tuple[_Point2D[T], _Point2D[T]]";
430 static const char* className() {
return "Aabb2D"; }
436#if defined(LASS_PRIM_HAVE_PY_EXPORT_TRAITS_AABB_3D)
437# ifndef LASS_GUARDIAN_OF_INCLUSION_PYTHON_EXPORT_TRAITS_PRIM_H_AABB_3D
438# define LASS_GUARDIAN_OF_INCLUSION_PYTHON_EXPORT_TRAITS_PRIM_H_AABB_3D
443template <
typename T,
typename MMP>
445 public impl::PyExportTraitsPrimAabb< prim::Aabb3D<T, MMP>, PyExportTraits< prim::Aabb3D<T, MMP> > >
447 constexpr static const char* py_typing =
"_Aabb3D[T]";
448 constexpr static const char* py_typing_preamble =
449 "type _Point3D[T] = tuple[T, T, T]\n"
450 "type _Aabb3D[T] = tuple[_Point3D[T], _Point3D[T]]";
452 static const char* className() {
return "Aabb3D"; }
462#if defined(LASS_PRIM_HAVE_PY_EXPORT_TRAITS_LINE_SEGMENT_2D)
463# ifndef LASS_GUARDIAN_OF_INCLUSION_PYTHON_EXPORT_TRAITS_PRIM_H_LINE_SEGMENT_2D
464# define LASS_GUARDIAN_OF_INCLUSION_PYTHON_EXPORT_TRAITS_PRIM_H_LINE_SEGMENT_2D
469template <
typename T,
typename PP>
471 public impl::PyExportTraitsPrimLineSegment< prim::LineSegment2D<T, PP>, PyExportTraits< prim::LineSegment2D<T, PP> > >
473 constexpr static const char* py_typing =
"_LineSegment2D[T]";
474 constexpr static const char* py_typing_preamble =
475 "type _Point2D[T] = tuple[T, T]\n"
476 "type _LineSegment2D[T] = tuple[_Point2D[T], _Point2D[T]]";
478 static const char* className() {
return "LineSegment2D"; }
484#if defined(LASS_PRIM_HAVE_PY_EXPORT_TRAITS_LINE_SEGMENT_3D)
485# ifndef LASS_GUARDIAN_OF_INCLUSION_PYTHON_EXPORT_TRAITS_PRIM_H_LINE_SEGMENT_3D
486# define LASS_GUARDIAN_OF_INCLUSION_PYTHON_EXPORT_TRAITS_PRIM_H_LINE_SEGMENT_3D
491template <
typename T,
typename PP>
493 public impl::PyExportTraitsPrimLineSegment< prim::LineSegment3D<T, PP>, PyExportTraits< prim::LineSegment3D<T, PP> > >
495 constexpr static const char* py_typing =
"_LineSegment3D[T]";
496 constexpr static const char* py_typing_preamble =
497 "type _Point3D[T] = tuple[T, T, T]\n"
498 "type _LineSegment3D[T] = tuple[_Point3D[T], _Point3D[T]]";
500 static const char* className() {
return "LineSegment3D"; }
510#if defined(LASS_PRIM_HAVE_PY_EXPORT_TRAITS_TRANSFORMATION_2D)
511# ifndef LASS_GUARDIAN_OF_INCLUSION_PYTHON_EXPORT_TRAITS_PRIM_H_TRANSFORMATION_2D
512# define LASS_GUARDIAN_OF_INCLUSION_PYTHON_EXPORT_TRAITS_PRIM_H_TRANSFORMATION_2D
519 public impl::PyExportTraitsPrimTransformation< prim::Transformation2D<T>, PyExportTraits< prim::Transformation2D<T> > >
521 constexpr static const char* py_typing =
"_Transformation2D[T]";
522 constexpr static const char* py_typing_preamble =
"type _Transformation2D[T] = tuple[tuple[T, T, T], tuple[T, T, T], tuple[T, T, T]]";
524 static const char* className() {
return "Transformation2D"; }
530#if defined(LASS_PRIM_HAVE_PY_EXPORT_TRAITS_TRANSFORMATION_3D)
531# ifndef LASS_GUARDIAN_OF_INCLUSION_PYTHON_EXPORT_TRAITS_PRIM_H_TRANSFORMATION_3D
532# define LASS_GUARDIAN_OF_INCLUSION_PYTHON_EXPORT_TRAITS_PRIM_H_TRANSFORMATION_3D
539 public impl::PyExportTraitsPrimTransformation< prim::Transformation3D<T>, PyExportTraits< prim::Transformation3D<T> > >
541 constexpr static const char* py_typing =
"_Transformation3D[T]";
542 constexpr static const char* py_typing_preamble =
"type _Transformation3D[T] = tuple[tuple[T, T, T, T], tuple[T, T, T, T], tuple[T, T, T, T], tuple[T, T, T, T]]";
544 static const char* className() {
return "Transformation3D"; }
554#ifndef LASS_GUARDIAN_OF_INCLUSION_PYTHON_EXPORT_TRAITS_PRIM_H_SIMPLE_POLYGON
555#define LASS_GUARDIAN_OF_INCLUSION_PYTHON_EXPORT_TRAITS_PRIM_H_SIMPLE_POLYGON
560#if defined(LASS_PRIM_HAVE_PY_EXPORT_TRAITS_SIMPLE_POLYGON_2D)
561# ifndef LASS_GUARDIAN_OF_INCLUSION_PYTHON_EXPORT_TRAITS_PRIM_H_SIMPLE_POLYGON_2D
562# define LASS_GUARDIAN_OF_INCLUSION_PYTHON_EXPORT_TRAITS_PRIM_H_SIMPLE_POLYGON_2D
567template <
typename T,
typename DP>
569 public impl::PyExportTraitsPrimSimplePolygon< prim::SimplePolygon2D<T, DP>, PyExportTraits< prim::SimplePolygon2D<T, DP> > >
571 constexpr static const char* py_typing =
"_SimplePolygon2D[T]";
572 constexpr static const char* py_typing_preamble =
573 "type _Point2D[T] = tuple[T, T]\n"
574 "type _SimplePolygon2D[T] = Sequence[_Point2D[T]]";
576 static const char* className() {
return "SimplePolygon2D"; }
583#if defined(LASS_PRIM_HAVE_PY_EXPORT_TRAITS_SIMPLE_POLYGON_3D)
584# ifndef LASS_GUARDIAN_OF_INCLUSION_PYTHON_EXPORT_TRAITS_PRIM_H_SIMPLE_POLYGON_3D
585# define LASS_GUARDIAN_OF_INCLUSION_PYTHON_EXPORT_TRAITS_PRIM_H_SIMPLE_POLYGON_3D
590template <
typename T,
typename DP>
592 public impl::PyExportTraitsPrimSimplePolygon< prim::SimplePolygon3D<T, DP>, PyExportTraits< prim::SimplePolygon3D<T, DP> > >
594 constexpr static const char* py_typing =
"_SimplePolygon3D[T]";
595 constexpr static const char* py_typing_preamble =
596 "type _Point3D[T] = tuple[T, T, T]\n"
597 "type _SimplePolygon3D[T] = Sequence[_Point3D[T]]";
599 static const char* className() {
return "SimplePolygon3D"; }
607#ifndef LASS_GUARDIAN_OF_INCLUSION_PYTHON_EXPORT_TRAITS_PRIM_H_AXIS
608#define LASS_GUARDIAN_OF_INCLUSION_PYTHON_EXPORT_TRAITS_PRIM_H_AXIS
613#if defined(LASS_PRIM_HAVE_PY_EXPORT_TRAITS_XY)
614# ifndef LASS_GUARDIAN_OF_INCLUSION_PYTHON_EXPORT_TRAITS_PRIM_H_XY
615# define LASS_GUARDIAN_OF_INCLUSION_PYTHON_EXPORT_TRAITS_PRIM_H_XY
622 public impl::PyExportTraitsPrimAxis<prim::XY, PyExportTraits<prim::XY> >
624 constexpr static const char* py_typing =
"Literal['x', 'X', 'y', 'Y']";
625 static const char* className() {
return "XY"; }
631#if defined(LASS_PRIM_HAVE_PY_EXPORT_TRAITS_XYZ)
632# ifndef LASS_GUARDIAN_OF_INCLUSION_PYTHON_EXPORT_TRAITS_PRIM_H_XYZ
633# define LASS_GUARDIAN_OF_INCLUSION_PYTHON_EXPORT_TRAITS_PRIM_H_XYZ
640 public impl::PyExportTraitsPrimAxis<prim::XYZ, PyExportTraits<prim::XYZ> >
642 constexpr static const char* py_typing =
"Literal['x', 'X', 'y', 'Y', 'z', 'Z']";
643 static const char* className() {
return "XYZ"; }
649#if defined(LASS_PRIM_HAVE_PY_EXPORT_TRAITS_XYZW)
650# ifndef LASS_GUARDIAN_OF_INCLUSION_PYTHON_EXPORT_TRAITS_PRIM_H_XYZW
651# define LASS_GUARDIAN_OF_INCLUSION_PYTHON_EXPORT_TRAITS_PRIM_H_XYZW
658 public impl::PyExportTraitsPrimAxis<prim::XYZW, PyExportTraits<prim::XYZW> >
660 constexpr static const char* py_typing =
"Literal['x', 'X', 'y', 'Y', 'z', 'Z', 'w', 'W']";
661 static const char* className() {
return "XYZW"; }
669#if defined(LASS_PRIM_HAVE_PY_EXPORT_TRAITS_COLOR_RGBA)
670# ifndef LASS_GUARDIAN_OF_INCLUSION_PYTHON_EXPORT_TRAITS_PRIM_H_COLOR_RGBA
671# define LASS_GUARDIAN_OF_INCLUSION_PYTHON_EXPORT_TRAITS_PRIM_H_COLOR_RGBA
679 constexpr static const char* py_typing =
"_RGBA";
680 constexpr static const char* py_typing_param =
"_RGBA | _RGB";
681 constexpr static const char* py_typing_preamble =
682 "type _RGBA = tuple[float, float, float, float]\n"
683 "type _RGB = tuple[float, float, float]";
687 return pyBuildSimpleObject(v.vector());
692 if (decodeTupleMinimum(obj, 3, x.r, x.g, x.b, x.a))
707#if defined(LASS_PRIM_HAVE_PY_EXPORT_TRAITS_TRIANGLE_MESH_3D)
708# ifndef LASS_GUARDIAN_OF_INCLUSION_PYTHON_EXPORT_TRAITS_PRIM_H_INDEX_TRIANGLE
709# define LASS_GUARDIAN_OF_INCLUSION_PYTHON_EXPORT_TRAITS_PRIM_H_INDEX_TRIANGLE
732 constexpr static const char* py_typing =
"_IndexTriangle";
733 constexpr static const char* py_typing_preamble =
734 "type _IndexVertex = tuple[int] | tuple[int, int | None] | tuple[int, int | None, int | None]\n"
735 "type _IndexTriangle = tuple[_IndexVertex, _IndexVertex, _IndexVertex]";
737 static PyObject* build(
const prim::IndexTriangle& iTriangle)
740 if (!triangle)
return 0;
741 for (
int k = 0; k < 3; ++k)
743 PyObject* vertex = impl::buildIndexVertex(
744 iTriangle.vertices[k], iTriangle.normals[k], iTriangle.uvs[k]);
745 if (!vertex)
return 0;
746 if (PyTuple_SetItem(triangle.get(), k, vertex) != 0)
return 0;
750 static int get(PyObject* obj, prim::IndexTriangle& oTriangle)
752 const TPyObjPtr tuple(impl::checkedFastSequence(obj, 3));
758 PyObject** objects = PySequence_Fast_ITEMS(tuple.get());
759 prim::IndexTriangle result = {{0, 0, 0}, {0, 0, 0}, {0, 0, 0}};
760 for (
int k = 0; k < 3; ++k)
762 if (impl::getIndexVertex(objects[k], result.vertices[k], result.normals[k], result.uvs[k]) != 0)
764 std::ostringstream buffer;
765 buffer <<
"IndexTriangle: " << (k + 1) <<
"th vertex";
an [0, 1] floating point RGB colour with Alpha channel.
void addMessageHeader(const char *header)
Prepend a message to the current Python exception value.
PyObjectPtr< PyObject >::Type TPyObjPtr
PyObjectPtr to a PyObject.
PyObject * fromSharedPtrToNakedCast(const util::SharedPtr< T, PyObjectStorage, PyObjectCounter > &object)
fromSharedPtrToNakedCast.
set of geometrical primitives
Comprehensive C++ to Python binding library.
Library for Assembled Shared Sources.
by copy, general case assumes shadow type or PyObjectPlus based type.