From ba95a534d5e622721db45b48d20b933e85f01138 Mon Sep 17 00:00:00 2001 From: wmayer Date: Wed, 8 Nov 2023 20:06:54 +0100 Subject: [PATCH] Base: extend ShapeHintsItem to allow to set vertex ordering and shape type --- src/Base/Builder3D.cpp | 44 +++++++++++++++++++++++++++++++++++++++++- src/Base/Builder3D.h | 39 +++++++++++++++++++++++++++++++++++-- 2 files changed, 80 insertions(+), 3 deletions(-) diff --git a/src/Base/Builder3D.cpp b/src/Base/Builder3D.cpp index e2ab5b4673..4c7c816367 100644 --- a/src/Base/Builder3D.cpp +++ b/src/Base/Builder3D.cpp @@ -89,6 +89,30 @@ std::string DrawStyle::patternAsString() const return str.str(); } +const char* VertexOrdering::toString() const +{ + switch (ordering) { + case Ordering::UnknownOrdering: + return "UNKNOWN_ORDERING"; + case Ordering::Clockwise: + return "CLOCKWISE"; + case Ordering::CounterClockwise: + return "COUNTERCLOCKWISE"; + } + return "UNKNOWN_ORDERING"; +} + +const char* ShapeType::toString() const +{ + switch (type) { + case Type::UnknownShapeType: + return "UNKNOWN_SHAPE_TYPE"; + case Type::Convex: + return "SOLID"; + } + return "UNKNOWN_SHAPE_TYPE"; +} + const char* BindingElement::bindingAsString() const { switch (value) { @@ -631,10 +655,23 @@ ShapeHintsItem::ShapeHintsItem(float creaseAngle) : creaseAngle(creaseAngle) } +void ShapeHintsItem::setVertexOrdering(VertexOrdering::Ordering value) +{ + vertexOrdering.ordering = value; +} + +void ShapeHintsItem::setShapeType(ShapeType::Type value) +{ + shapeType.type = value; +} + + void ShapeHintsItem::write(InventorOutput& out) const { out.write() << "ShapeHints {\n"; out.write() << " creaseAngle " << creaseAngle << '\n'; + out.write() << " vertexOrdering " << vertexOrdering.toString() << '\n'; + out.write() << " shapeType " << shapeType.toString() << '\n'; out.write() << "}\n"; } @@ -915,11 +952,16 @@ void TransformItem::write(InventorOutput& out) const InventorBuilder::InventorBuilder(std::ostream& output) : result(output) { - result << "#Inventor V2.1 ascii \n\n"; + addHeader(); } InventorBuilder:: ~InventorBuilder() = default; +void InventorBuilder::addHeader() +{ + result << "#Inventor V2.1 ascii \n\n"; +} + void InventorBuilder::increaseIndent() { indent.increaseIndent(); diff --git a/src/Base/Builder3D.h b/src/Base/Builder3D.h index 6ba785d179..1968f0b403 100644 --- a/src/Base/Builder3D.h +++ b/src/Base/Builder3D.h @@ -88,6 +88,33 @@ public: unsigned short linePattern = 0xffff; }; +class BaseExport VertexOrdering +{ +public: + enum class Ordering { + UnknownOrdering, + Clockwise, + CounterClockwise + }; + + const char* toString() const; + + Ordering ordering = Ordering::UnknownOrdering; +}; + +class BaseExport ShapeType +{ +public: + enum class Type { + UnknownShapeType, + Convex + }; + + const char* toString() const; + + Type type = Type::UnknownShapeType; +}; + class BaseExport BindingElement { public: @@ -367,11 +394,15 @@ private: class BaseExport ShapeHintsItem : public NodeItem { public: - explicit ShapeHintsItem(float creaseAngle); + explicit ShapeHintsItem(float creaseAngle = 0.0F); + void setVertexOrdering(VertexOrdering::Ordering); + void setShapeType(ShapeType::Type); void write(InventorOutput& out) const override; private: - float creaseAngle; + float creaseAngle = 0.0F; + VertexOrdering vertexOrdering; + ShapeType shapeType; }; /*! @@ -591,6 +622,10 @@ public: * \param str - stream to write the content into */ explicit InventorBuilder(std::ostream& str); + /*! + * \brief Adds the OpenInventor header. + */ + void addHeader(); /*! * \brief Destruction of an InventorBuilder instance */