/* * Copyright (C) 2011 Thorsten Liebig (Thorsten.Liebig@gmx.de) * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ #ifndef CSTRANSFORM_H #define CSTRANSFORM_H #include #include #include #include #include #include #include "ParameterObjects.h" class CSXCAD_EXPORT CSTransform { public: CSTransform(); CSTransform(CSTransform* transform); CSTransform(ParameterSet* paraSet); virtual ~CSTransform(); void SetParameterSet(ParameterSet* paraset) {m_ParaSet=paraset;} enum TransformType { SCALE, SCALE3, TRANSLATE, ROTATE_ORIGIN, ROTATE_X, ROTATE_Y, ROTATE_Z, MATRIX }; //Keep this in sync with GetNameByType and GetTypeByName and TransformByType methods!!! double* Transform(const double inCoords[3], double outCoords[3]) const; double* InvertTransform(const double inCoords[3], double outCoords[3]) const; void Invert(); double* GetMatrix() {return m_TMatrix;} //! Apply a matrix directly void SetMatrix(const double matrix[16], bool concatenate=true); bool SetMatrix(std::string matrix, bool concatenate=true); //! Create and apply a translation matrix void Translate(const double translate[3], bool concatenate=true); bool Translate(std::string translate, bool concatenate=true); //! Create and apply a rotation matrix around the given vector and angle void RotateOrigin(const double vector[3], double angle, bool concatenate=true); bool RotateOrigin(std::string XYZ_A, bool concatenate=true); void RotateX(double angle, bool concatenate=true); bool RotateX(std::string angle, bool concatenate=true); void RotateY(double angle, bool concatenate=true); bool RotateY(std::string angle, bool concatenate=true); void RotateZ(double angle, bool concatenate=true); bool RotateZ(std::string angle, bool concatenate=true); void RotateXYZ(int dir, double angle, bool concatenate=true); bool RotateXYZ(int dir, std::string angle, bool concatenate=true); void Scale(double scale, bool concatenate=true); void Scale(const double scale[3], bool concatenate=true); bool Scale(std::string scale, bool concatenate=true); bool TransformByString(std::string operation, std::string argument, bool concatenate=true); void TransformByType(TransformType type, std::vector args, bool concatenate=true); void TransformByType(TransformType type, const double* args, bool concatenate=true); bool TransformByType(TransformType type, std::string args, bool concatenate=true); void Reset(); //! Check if this CSTransform has any transformations bool HasTransform(); //! All subsequent operations will be occur before the previous operations (not the default). void SetPreMultiply() {m_PostMultiply=false;} //! All subsequent operations will be after the previous operations (default). void SetPostMultiply() {m_PostMultiply=true;} void SetAngleDegree() {m_AngleRadian=false;} void SetAngleRadian() {m_AngleRadian=true;} double* MakeUnitMatrix(double matrix[16]) const; std::string GetNameByType(TransformType type) const; std::string GetNameByType(TransformType type, unsigned int &numArgs) const; int GetTypeByName(std::string name, unsigned int &numArgs) const; void PrintMatrix(std::ostream& stream); void PrintTransformations(std::ostream& stream, std::string prefix=""); //! Write this transformations to a xml-node. \param parameterised Use false if parameters should be written as values. Parameters are lost! virtual bool Write2XML(TiXmlNode* root, bool parameterised=true, bool sparse=false); //! Read transformations from xml-node. \return Successful read-operation. virtual bool ReadFromXML(TiXmlNode* root); static CSTransform* New(TiXmlNode* root, ParameterSet* paraSet=NULL); static CSTransform* New(CSTransform* cst, ParameterSet* paraSet=NULL); protected: //transform matrix double m_TMatrix[16]; //inverse transform matrix double m_Inv_TMatrix[16]; void UpdateInverse(); bool m_PostMultiply; bool m_AngleRadian; ParameterSet* m_ParaSet; void ApplyMatrix(const double matrix[16], bool concatenate); bool RotateOriginMatrix(double matrix[16], const double XYZ_A[4]); bool ScaleMatrix(double matrix[16], double scale); bool ScaleMatrix(double matrix[16], const double scale[3]); bool TranslateMatrix(double matrix[16], const double translate[3]); void AppendList(TransformType type, const double* args, size_t numArgs ); void AppendList(TransformType type, const ParameterScalar* args, size_t numArgs ); std::vector m_TransformList; std::vector > m_TransformArguments; }; #endif // CSTRANSFORM_H