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)
63 PyObject*
const tuple = PyTuple_New(dimension);
64 for (
size_t i = 0; i < dimension; ++i)
66 PyTuple_SetItem(tuple,
static_cast<Py_ssize_t
>(i), pyBuildSimpleObject(v[i]));
71 static int get(PyObject* obj, ObjectType& v)
73 const TPyObjPtr tuple = impl::checkedFastSequence(obj, dimension);
79 PyObject** objects = PySequence_Fast_ITEMS(tuple.get());
81 for (
size_t k = 0; k < dimension; ++k)
83 if (!impl::decodeObject(objects[k],
static_cast<Py_ssize_t
>(k), result[k]))
94template <
typename AabbType,
typename ExportTraits >
95struct PyExportTraitsPrimAabb
97 typedef AabbType TAabb;
98 static PyObject* build(
const TAabb& aabb)
102 static int get(PyObject* obj, TAabb& aabb)
104 typename TAabb::TPoint min, max;
105 if (decodeTuple(obj, min, max) != 0)
112 aabb = TAabb(min, max);
114 catch (util::Exception& error)
116 std::ostringstream buffer;
117 buffer << ExportTraits::className() <<
": " << error.message();
118 PyErr_SetString(PyExc_ValueError, buffer.str().c_str());
125template <
typename LineSegmentType,
typename ExportTraits >
126struct PyExportTraitsPrimLineSegment
128 typedef LineSegmentType TLineSegment;
129 static PyObject* build(
const TLineSegment& seg)
133 static int get(PyObject* obj, TLineSegment& seg)
135 typename TLineSegment::TPoint tail, head;
136 if (decodeTuple(obj, tail, head) != 0)
141 seg = TLineSegment(tail, head);
146template <
typename TransformationType,
typename ExporTraits>
147struct PyExportTraitsPrimTransformation
149 typedef TransformationType TTransformation;
150 typedef typename TransformationType::TValue TValue;
151 enum { size = TransformationType::dimension + 1 };
153 static PyObject* build(
const TTransformation& transfo)
155 const TValue*
const values = transfo.matrix();
156 PyObject*
const matrix = PyTuple_New(size);
157 for (
int i = 0; i < size; ++i)
159 PyObject*
const row = PyTuple_New(size);
160 for (
int j = 0; j < size; ++j)
162 PyTuple_SetItem(row, j, pyBuildSimpleObject(values[i * size + j]));
164 PyTuple_SetItem(matrix, i, row);
169 static int get(PyObject* obj, TTransformation& transfo)
171 TPyObjPtr tuple = impl::checkedFastSequence(obj, size);
177 PyObject** rows = PySequence_Fast_ITEMS(tuple.get());
178 TValue values[size * size];
179 for (
int i = 0; i < size; ++i)
181 TPyObjPtr row = impl::checkedFastSequence(rows[i], size);
184 std::ostringstream buffer;
185 buffer << ExporTraits::className() <<
": row " << i;
189 PyObject** objects = PySequence_Fast_ITEMS(row.get());
190 for (
int j = 0; j < size; ++j)
192 if (pyGetSimpleObject(objects[j], values[size * i + j]) != 0)
194 std::ostringstream buffer;
195 buffer << ExporTraits::className() <<
": row " << i <<
", column " << j;
201 transfo = TTransformation(values, values + size * size);
206template <
typename PolygonType,
typename ExportTraits>
207struct PyExportTraitsPrimSimplePolygon
209 typedef PolygonType TPolygon;
210 typedef typename PolygonType::TPoint TPoint;
211 static PyObject* build(
const TPolygon& poly)
213 std::vector<TPoint> points;
214 for (
unsigned i = 0; i < poly.size(); ++i)
215 points.push_back(poly[i]);
216 return pyBuildSimpleObject( points );
218 static int get(PyObject* obj, TPolygon& poly)
220 std::vector<TPoint> points;
221 if (pyGetSimpleObject(obj, points) != 0)
226 poly = TPolygon(points.begin(), points.end());
231template <
typename AxisType,
typename ExportTraits>
232struct PyExportTraitsPrimAxis
234 typedef AxisType TAxis;
235 static PyObject* build(
const TAxis& axis)
237 return pyBuildSimpleObject(std::string(1, axis.axis()));
239 static int get(PyObject* obj, TAxis& axis)
242 if (pyGetSimpleObject(obj, s) != 0)
251 catch (util::Exception& error)
253 std::ostringstream buffer;
254 buffer << ExportTraits::className() <<
": " << error.message();
255 PyErr_SetString(PyExc_ValueError, buffer.str().c_str());
262LASS_PYTHON_DLL PyObject* LASS_CALL buildIndexVertex(
size_t vertex,
size_t normal,
size_t uv);
263LASS_PYTHON_DLL
int LASS_CALL getIndexVertex(PyObject* iIndices,
size_t& vertex,
size_t& normal,
size_t& uv);
278#if defined(LASS_PRIM_HAVE_PY_EXPORT_TRAITS_VECTOR_2D)
279# ifndef LASS_GUARDIAN_OF_INCLUSION_PYTHON_EXPORT_TRAITS_PRIM_H_VECTOR_2D
280# define LASS_GUARDIAN_OF_INCLUSION_PYTHON_EXPORT_TRAITS_PRIM_H_VECTOR_2D
287 public impl::PyExportTraitsVectorPoint< prim::Vector2D<T>, PyExportTraits< prim::Vector2D<T> > >
289 constexpr static const char* py_typing =
"_Vector2D[T]";
290 constexpr static const char* py_typing_preamble =
"type _Vector2D[T] = tuple[T, T]";
292 static const char* className() {
return "Vector2D"; }
300#if defined(LASS_PRIM_HAVE_PY_EXPORT_TRAITS_VECTOR_3D)
301# ifndef LASS_GUARDIAN_OF_INCLUSION_PYTHON_EXPORT_TRAITS_PRIM_H_VECTOR_3D
302# define LASS_GUARDIAN_OF_INCLUSION_PYTHON_EXPORT_TRAITS_PRIM_H_VECTOR_3D
309 public impl::PyExportTraitsVectorPoint< prim::Vector3D<T>, PyExportTraits< prim::Vector3D<T> > >
311 constexpr static const char* py_typing =
"_Vector3D[T]";
312 constexpr static const char* py_typing_preamble =
"type _Vector3D[T] = tuple[T, T, T]";
314 static const char* className() {
return "Vector3D"; }
321#if defined(LASS_PRIM_HAVE_PY_EXPORT_TRAITS_VECTOR_4D)
322# ifndef LASS_GUARDIAN_OF_INCLUSION_PYTHON_EXPORT_TRAITS_PRIM_H_VECTOR_4D
323# define LASS_GUARDIAN_OF_INCLUSION_PYTHON_EXPORT_TRAITS_PRIM_H_VECTOR_4D
330 public impl::PyExportTraitsVectorPoint< prim::Vector4D<T>, PyExportTraits< prim::Vector4D<T> > >
332 constexpr static const char* py_typing =
"_Vector4D[T]";
333 constexpr static const char* py_typing_preamble =
"type _Vector4D[T] = tuple[T, T, T, T]";
335 static const char* className() {
return "Vector4D"; }
345#if defined(LASS_PRIM_HAVE_PY_EXPORT_TRAITS_POINT_2D)
346# ifndef LASS_GUARDIAN_OF_INCLUSION_PYTHON_EXPORT_TRAITS_PRIM_H_POINT_2D
347# define LASS_GUARDIAN_OF_INCLUSION_PYTHON_EXPORT_TRAITS_PRIM_H_POINT_2D
354 public impl::PyExportTraitsVectorPoint< prim::Point2D<T>, PyExportTraits< prim::Point2D<T> > >
356 constexpr static const char* py_typing =
"_Point2D[T]";
357 constexpr static const char* py_typing_preamble =
"type _Point2D[T] = tuple[T, T]";
359 static const char* className() {
return "Point2D"; }
367#if defined(LASS_PRIM_HAVE_PY_EXPORT_TRAITS_POINT_3D)
368# ifndef LASS_GUARDIAN_OF_INCLUSION_PYTHON_EXPORT_TRAITS_PRIM_H_POINT_3D
369# define LASS_GUARDIAN_OF_INCLUSION_PYTHON_EXPORT_TRAITS_PRIM_H_POINT_3D
376 public impl::PyExportTraitsVectorPoint< prim::Point3D<T>, PyExportTraits< prim::Point3D<T> > >
378 constexpr static const char* py_typing =
"_Point3D[T]";
379 constexpr static const char* py_typing_preamble =
"type _Point3D[T] = tuple[T, T, T]";
381 static const char* className() {
return "Point3D"; }
391#if defined(LASS_PRIM_HAVE_PY_EXPORT_TRAITS_AABB_2D)
392# ifndef LASS_GUARDIAN_OF_INCLUSION_PYTHON_EXPORT_TRAITS_PRIM_H_AABB_2D
393# define LASS_GUARDIAN_OF_INCLUSION_PYTHON_EXPORT_TRAITS_PRIM_H_AABB_2D
398template <
typename T,
typename MMP>
400 public impl::PyExportTraitsPrimAabb< prim::Aabb2D<T, MMP>, PyExportTraits< prim::Aabb2D<T, MMP> > >
402 constexpr static const char* py_typing =
"_Aabb2D[T]";
403 constexpr static const char* py_typing_preamble =
404 "type _Point2D[T] = tuple[T, T]\n"
405 "type _Aabb2D[T] = tuple[_Point2D[T], _Point2D[T]]";
407 static const char* className() {
return "Aabb2D"; }
413#if defined(LASS_PRIM_HAVE_PY_EXPORT_TRAITS_AABB_3D)
414# ifndef LASS_GUARDIAN_OF_INCLUSION_PYTHON_EXPORT_TRAITS_PRIM_H_AABB_3D
415# define LASS_GUARDIAN_OF_INCLUSION_PYTHON_EXPORT_TRAITS_PRIM_H_AABB_3D
420template <
typename T,
typename MMP>
422 public impl::PyExportTraitsPrimAabb< prim::Aabb3D<T, MMP>, PyExportTraits< prim::Aabb3D<T, MMP> > >
424 constexpr static const char* py_typing =
"_Aabb3D[T]";
425 constexpr static const char* py_typing_preamble =
426 "type _Point3D[T] = tuple[T, T, T]\n"
427 "type _Aabb3D[T] = tuple[_Point3D[T], _Point3D[T]]";
429 static const char* className() {
return "Aabb3D"; }
439#if defined(LASS_PRIM_HAVE_PY_EXPORT_TRAITS_LINE_SEGMENT_2D)
440# ifndef LASS_GUARDIAN_OF_INCLUSION_PYTHON_EXPORT_TRAITS_PRIM_H_LINE_SEGMENT_2D
441# define LASS_GUARDIAN_OF_INCLUSION_PYTHON_EXPORT_TRAITS_PRIM_H_LINE_SEGMENT_2D
446template <
typename T,
typename PP>
448 public impl::PyExportTraitsPrimLineSegment< prim::LineSegment2D<T, PP>, PyExportTraits< prim::LineSegment2D<T, PP> > >
450 constexpr static const char* py_typing =
"_LineSegment2D[T]";
451 constexpr static const char* py_typing_preamble =
452 "type _Point2D[T] = tuple[T, T]\n"
453 "type _LineSegment2D[T] = tuple[_Point2D[T], _Point2D[T]]";
455 static const char* className() {
return "LineSegment2D"; }
461#if defined(LASS_PRIM_HAVE_PY_EXPORT_TRAITS_LINE_SEGMENT_3D)
462# ifndef LASS_GUARDIAN_OF_INCLUSION_PYTHON_EXPORT_TRAITS_PRIM_H_LINE_SEGMENT_3D
463# define LASS_GUARDIAN_OF_INCLUSION_PYTHON_EXPORT_TRAITS_PRIM_H_LINE_SEGMENT_3D
468template <
typename T,
typename PP>
470 public impl::PyExportTraitsPrimLineSegment< prim::LineSegment3D<T, PP>, PyExportTraits< prim::LineSegment3D<T, PP> > >
472 constexpr static const char* py_typing =
"_LineSegment3D[T]";
473 constexpr static const char* py_typing_preamble =
474 "type _Point3D[T] = tuple[T, T, T]\n"
475 "type _LineSegment3D[T] = tuple[_Point3D[T], _Point3D[T]]";
477 static const char* className() {
return "LineSegment3D"; }
487#if defined(LASS_PRIM_HAVE_PY_EXPORT_TRAITS_TRANSFORMATION_2D)
488# ifndef LASS_GUARDIAN_OF_INCLUSION_PYTHON_EXPORT_TRAITS_PRIM_H_TRANSFORMATION_2D
489# define LASS_GUARDIAN_OF_INCLUSION_PYTHON_EXPORT_TRAITS_PRIM_H_TRANSFORMATION_2D
496 public impl::PyExportTraitsPrimTransformation< prim::Transformation2D<T>, PyExportTraits< prim::Transformation2D<T> > >
498 constexpr static const char* py_typing =
"_Transformation2D[T]";
499 constexpr static const char* py_typing_preamble =
"type _Transformation2D[T] = tuple[tuple[T, T, T], tuple[T, T, T], tuple[T, T, T]]";
501 static const char* className() {
return "Transformation2D"; }
507#if defined(LASS_PRIM_HAVE_PY_EXPORT_TRAITS_TRANSFORMATION_3D)
508# ifndef LASS_GUARDIAN_OF_INCLUSION_PYTHON_EXPORT_TRAITS_PRIM_H_TRANSFORMATION_3D
509# define LASS_GUARDIAN_OF_INCLUSION_PYTHON_EXPORT_TRAITS_PRIM_H_TRANSFORMATION_3D
516 public impl::PyExportTraitsPrimTransformation< prim::Transformation3D<T>, PyExportTraits< prim::Transformation3D<T> > >
518 constexpr static const char* py_typing =
"_Transformation3D[T]";
519 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]]";
521 static const char* className() {
return "Transformation3D"; }
531#ifndef LASS_GUARDIAN_OF_INCLUSION_PYTHON_EXPORT_TRAITS_PRIM_H_SIMPLE_POLYGON
532#define LASS_GUARDIAN_OF_INCLUSION_PYTHON_EXPORT_TRAITS_PRIM_H_SIMPLE_POLYGON
537#if defined(LASS_PRIM_HAVE_PY_EXPORT_TRAITS_SIMPLE_POLYGON_2D)
538# ifndef LASS_GUARDIAN_OF_INCLUSION_PYTHON_EXPORT_TRAITS_PRIM_H_SIMPLE_POLYGON_2D
539# define LASS_GUARDIAN_OF_INCLUSION_PYTHON_EXPORT_TRAITS_PRIM_H_SIMPLE_POLYGON_2D
544template <
typename T,
typename DP>
546 public impl::PyExportTraitsPrimSimplePolygon< prim::SimplePolygon2D<T, DP>, PyExportTraits< prim::SimplePolygon2D<T, DP> > >
548 constexpr static const char* py_typing =
"_SimplePolygon2D[T]";
549 constexpr static const char* py_typing_preamble =
550 "type _Point2D[T] = tuple[T, T]\n"
551 "type _SimplePolygon2D[T] = Sequence[_Point2D[T]]";
553 static const char* className() {
return "SimplePolygon2D"; }
560#if defined(LASS_PRIM_HAVE_PY_EXPORT_TRAITS_SIMPLE_POLYGON_3D)
561# ifndef LASS_GUARDIAN_OF_INCLUSION_PYTHON_EXPORT_TRAITS_PRIM_H_SIMPLE_POLYGON_3D
562# define LASS_GUARDIAN_OF_INCLUSION_PYTHON_EXPORT_TRAITS_PRIM_H_SIMPLE_POLYGON_3D
567template <
typename T,
typename DP>
569 public impl::PyExportTraitsPrimSimplePolygon< prim::SimplePolygon3D<T, DP>, PyExportTraits< prim::SimplePolygon3D<T, DP> > >
571 constexpr static const char* py_typing =
"_SimplePolygon3D[T]";
572 constexpr static const char* py_typing_preamble =
573 "type _Point3D[T] = tuple[T, T, T]\n"
574 "type _SimplePolygon3D[T] = Sequence[_Point3D[T]]";
576 static const char* className() {
return "SimplePolygon3D"; }
584#ifndef LASS_GUARDIAN_OF_INCLUSION_PYTHON_EXPORT_TRAITS_PRIM_H_AXIS
585#define LASS_GUARDIAN_OF_INCLUSION_PYTHON_EXPORT_TRAITS_PRIM_H_AXIS
590#if defined(LASS_PRIM_HAVE_PY_EXPORT_TRAITS_XY)
591# ifndef LASS_GUARDIAN_OF_INCLUSION_PYTHON_EXPORT_TRAITS_PRIM_H_XY
592# define LASS_GUARDIAN_OF_INCLUSION_PYTHON_EXPORT_TRAITS_PRIM_H_XY
599 public impl::PyExportTraitsPrimAxis<prim::XY, PyExportTraits<prim::XY> >
601 constexpr static const char* py_typing =
"Literal['x', 'X', 'y', 'Y']";
602 static const char* className() {
return "XY"; }
608#if defined(LASS_PRIM_HAVE_PY_EXPORT_TRAITS_XYZ)
609# ifndef LASS_GUARDIAN_OF_INCLUSION_PYTHON_EXPORT_TRAITS_PRIM_H_XYZ
610# define LASS_GUARDIAN_OF_INCLUSION_PYTHON_EXPORT_TRAITS_PRIM_H_XYZ
617 public impl::PyExportTraitsPrimAxis<prim::XYZ, PyExportTraits<prim::XYZ> >
619 constexpr static const char* py_typing =
"Literal['x', 'X', 'y', 'Y', 'z', 'Z']";
620 static const char* className() {
return "XYZ"; }
626#if defined(LASS_PRIM_HAVE_PY_EXPORT_TRAITS_XYZW)
627# ifndef LASS_GUARDIAN_OF_INCLUSION_PYTHON_EXPORT_TRAITS_PRIM_H_XYZW
628# define LASS_GUARDIAN_OF_INCLUSION_PYTHON_EXPORT_TRAITS_PRIM_H_XYZW
635 public impl::PyExportTraitsPrimAxis<prim::XYZW, PyExportTraits<prim::XYZW> >
637 constexpr static const char* py_typing =
"Literal['x', 'X', 'y', 'Y', 'z', 'Z', 'w', 'W']";
638 static const char* className() {
return "XYZW"; }
646#if defined(LASS_PRIM_HAVE_PY_EXPORT_TRAITS_COLOR_RGBA)
647# ifndef LASS_GUARDIAN_OF_INCLUSION_PYTHON_EXPORT_TRAITS_PRIM_H_COLOR_RGBA
648# define LASS_GUARDIAN_OF_INCLUSION_PYTHON_EXPORT_TRAITS_PRIM_H_COLOR_RGBA
656 constexpr static const char* py_typing =
"_RGBA";
657 constexpr static const char* py_typing_param =
"_RGBA | _RGB";
658 constexpr static const char* py_typing_preamble =
659 "type _RGBA = tuple[float, float, float, float]\n"
660 "type _RGB = tuple[float, float, float]";
664 return pyBuildSimpleObject(v.vector());
669 if (decodeTupleMinimum(obj, 3, x.r, x.g, x.b, x.a))
684#if defined(LASS_PRIM_HAVE_PY_EXPORT_TRAITS_TRIANGLE_MESH_3D)
685# ifndef LASS_GUARDIAN_OF_INCLUSION_PYTHON_EXPORT_TRAITS_PRIM_H_INDEX_TRIANGLE
686# define LASS_GUARDIAN_OF_INCLUSION_PYTHON_EXPORT_TRAITS_PRIM_H_INDEX_TRIANGLE
709 constexpr static const char* py_typing =
"_IndexTriangle";
710 constexpr static const char* py_typing_preamble =
711 "type _IndexVertex = tuple[int] | tuple[int, int | None] | tuple[int, int | None, int | None]\n"
712 "type _IndexTriangle = tuple[_IndexVertex, _IndexVertex, _IndexVertex]";
714 static PyObject* build(
const prim::IndexTriangle& iTriangle)
717 if (!triangle)
return 0;
718 for (
int k = 0; k < 3; ++k)
720 PyObject* vertex = impl::buildIndexVertex(
721 iTriangle.vertices[k], iTriangle.normals[k], iTriangle.uvs[k]);
722 if (!vertex)
return 0;
723 if (PyTuple_SetItem(triangle.get(), k, vertex) != 0)
return 0;
727 static int get(PyObject* obj, prim::IndexTriangle& oTriangle)
729 const TPyObjPtr tuple(impl::checkedFastSequence(obj, 3));
735 PyObject** objects = PySequence_Fast_ITEMS(tuple.get());
736 prim::IndexTriangle result = {{0, 0, 0}, {0, 0, 0}, {0, 0, 0}};
737 for (
int k = 0; k < 3; ++k)
739 if (impl::getIndexVertex(objects[k], result.vertices[k], result.normals[k], result.uvs[k]) != 0)
741 std::ostringstream buffer;
742 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.