summaryrefslogtreecommitdiff
path: root/CSXCAD/src/CSRectGrid.h
diff options
context:
space:
mode:
Diffstat (limited to 'CSXCAD/src/CSRectGrid.h')
-rw-r--r--CSXCAD/src/CSRectGrid.h120
1 files changed, 120 insertions, 0 deletions
diff --git a/CSXCAD/src/CSRectGrid.h b/CSXCAD/src/CSRectGrid.h
new file mode 100644
index 0000000..1b0e03f
--- /dev/null
+++ b/CSXCAD/src/CSRectGrid.h
@@ -0,0 +1,120 @@
+/*
+* Copyright (C) 2008,2009,2010 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 <http://www.gnu.org/licenses/>.
+*/
+
+#pragma once
+/*
+ * Author: Thorsten Liebig
+ * Date: 03-12-2008
+ * Lib: CSXCAD
+ * Version: 0.1a
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string>
+#include <sstream>
+#include <vector>
+#include <algorithm>
+#include "ParameterObjects.h"
+#include "CSXCAD_Global.h"
+
+class TiXmlNode;
+
+//! CSRectGrid is managing a rectilinear graded mesh.
+class CSXCAD_EXPORT CSRectGrid
+{
+public:
+ //! Create an empty grid.
+ CSRectGrid(void);
+ //! Deconstruct the grid.
+ ~CSRectGrid(void);
+
+ static CSRectGrid* Clone(CSRectGrid* original);
+
+ //! Add a disc-line in the given direction.
+ void AddDiscLine(int direct, double val);
+ void AddDiscLines(int direct, int numLines, double* vals);
+ std::string AddDiscLines(int direct, int numLines, double* vals, std::string DistFunction);
+
+ //! Remove the disc-line at certain index and direction.
+ bool RemoveDiscLine(int direct, int index);
+ //! Remove the disc-line at certain value and direction.
+ bool RemoveDiscLine(int direct, double val);
+
+ //! Remove all lines and reset to an empty grid.
+ void clear();
+ //! Clear all lines in a given direction.
+ void ClearLines(int direct);
+
+ //! Set the drawing unit. e.g. 1e-3 for mm as drawing unit.
+ void SetDeltaUnit(double val) {dDeltaUnit=val;}
+ //! Get the current drawing unit.
+ double GetDeltaUnit() {return dDeltaUnit;}
+
+ //! Set a disc-line in a certain direction at a given index. Will return true on success.
+ bool SetLine(int direct, size_t Index, double value);
+
+ //! Get an array of discretization lines in a certain direction.
+ /*!
+ \param direct The direction of interest.
+ \param array The array in which the lines will be stored. Can be NULL. Caller has to delete the array.
+ \param qty Methode will return the number of lines in this direction.
+ \param sorted Define here whether the lines shall be in increasing order (default) or as currently stored (unknown order).
+ */
+ double* GetLines(int direct, double *array, unsigned int &qty, bool sorted=true);
+ //! Get quantity of lines in certain direction.
+ size_t GetQtyLines(int direct) {if ((direct>=0) && (direct<3)) return Lines[direct].size(); else return 0;}
+ //! Get a disc-line in a certain direction an at given index.
+ double GetLine(int direct, size_t Index);
+ //! Get disc-lines as a comma-seperated string for given direction
+ std::string GetLinesAsString(int direct);
+
+ //! Snap a given value to a grid line for the given direction
+ unsigned int Snap2LineNumber(int ny, double value, bool &inside) const;
+
+ //! Write the grid to a given XML-node.
+ bool Write2XML(TiXmlNode &root, bool sorted=false);
+ //! Read the grid from a given XML-node.
+ bool ReadFromXML(TiXmlNode &root);
+
+ //! Get the dimension of current grid. \return 0,1,2 or 3. Returns -1 if one or more directions have no disc-line at all.
+ int GetDimension();
+
+ //! Set the type of mesh (e.g. Cartesian or Cylindrical mesh)
+ void SetMeshType(CoordinateSystem type) {m_meshType=type;}
+
+ //! Get the type of mesh (e.g. Cartesian or Cylindrical mesh)
+ CoordinateSystem GetMeshType() {return m_meshType;}
+
+ //! Increase the resolution in the specified direction by the given factor.
+ void IncreaseResolution(int nu, int factor);
+
+ //! Sort the lines in a given direction.
+ void Sort(int direct);
+
+ //! Get the bounding box of the area defined by the disc-lines.
+ double* GetSimArea();
+
+ //! This will check if the given mesh is a valid 3D mesh (at least 2 lines in all directions);
+ bool isValid();
+
+protected:
+ std::vector<double> Lines[3];
+ double dDeltaUnit;
+ double SimBox[6];
+ CoordinateSystem m_meshType;
+};