Types.cc 9.14 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41
/*===========================================================================*\
 *                                                                           *
 *                              OpenFlipper                                  *
 *      Copyright (C) 2001-2009 by Computer Graphics Group, RWTH Aachen      *
 *                           www.openflipper.org                             *
 *                                                                           *
 *---------------------------------------------------------------------------*
 *  This file is part of OpenFlipper.                                        *
 *                                                                           *
 *  OpenFlipper 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 with the              *
 *  following exceptions:                                                    *
 *                                                                           *
 *  If other files instantiate templates or use macros                       *
 *  or inline functions from this file, or you compile this file and         *
 *  link it with other files to produce an executable, this file does        *
 *  not by itself cause the resulting executable to be covered by the        *
 *  GNU Lesser General Public License. This exception does not however       *
 *  invalidate any other reasons why the executable file might be            *
 *  covered by the GNU Lesser General Public License.                        *
 *                                                                           *
 *  OpenFlipper 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 LesserGeneral Public          *
 *  License along with OpenFlipper. If not,                                  *
 *  see <http://www.gnu.org/licenses/>.                                      *
 *                                                                           *
\*===========================================================================*/

/*===========================================================================*\
 *                                                                           *
 *   $Revision$                                                         *
 *   $Author$                                                      *
 *   $Date$                   *
 *                                                                           *
\*===========================================================================*/
42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66




//=============================================================================
//
//  Types
//
//=============================================================================

/**
 * \file Types.cc
 * This File contains the basic functions to handle datatypes
 */


//== INCLUDES =================================================================

#include "Types.hh"
#include <map>


/** This field defines the start id for custom datatypes. It starts high to avoid conflicts with previously
 * hardcoded versions.
 */
67
static int nextTypeId_ = 128;
68 69 70 71 72 73

/// Variable used to automatically initialize the maps
static bool initialized_ = false;

/** This map maps an dataType id to an typeName
 */
74
static std::map< unsigned int, QString > typeToString;
75

76
/** This map maps an dataType name to its id in the types vector
77
 */
78 79 80 81 82
static std::map< QString , unsigned int > stringToTypeInfo;

/** This map maps an dataType id to its id in the types vector
 */
static std::map< unsigned int , unsigned int > typeToTypeInfo;
83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109

class TypeInfo {

  public:

  TypeInfo(DataType _type, QString _name, QString _iconName) :
    type(_type),
    name(_name),
    iconName(_iconName)
  {}

  /// The id of the datatype
  DataType type;

  /// The name of the datatype
  QString  name;

  /// The icon of the datatype
  QString  iconName;
};

static std::vector< TypeInfo > types;

//== Functions =========================================================

void initialize() {
  if ( !initialized_ ) {
110 111
    stringToTypeInfo["Unknown"] = types.size();
    typeToTypeInfo[DATA_NONE]   = types.size();
112
    types.push_back( TypeInfo(DATA_NONE            ,"Unknown"        ,"Unknown.png") );
113

114 115
    stringToTypeInfo["Group"]  = types.size();
    typeToTypeInfo[DATA_GROUP] = types.size();
116
    types.push_back( TypeInfo(DATA_GROUP           ,"Group"          ,"Unknown.png") );
117 118 119 120 121 122 123 124 125

    stringToTypeInfo["TriangleMesh"]   = types.size();
    typeToTypeInfo[DATA_TRIANGLE_MESH_CONST_ID] = types.size();
    types.push_back( TypeInfo(DATA_TRIANGLE_MESH_CONST_ID   ,"TriangleMesh"   ,"TriangleType.png") );

    stringToTypeInfo["PolyMesh"]   = types.size();
    typeToTypeInfo[DATA_POLY_MESH_CONST_ID] = types.size();
    types.push_back( TypeInfo(DATA_POLY_MESH_CONST_ID       ,"PolyMesh"       ,"PolyType.png") );

126 127
    stringToTypeInfo["BSplineCurve"]   = types.size();
    typeToTypeInfo[DATA_BSPLINE_CURVE] = types.size();
128
    types.push_back( TypeInfo(DATA_BSPLINE_CURVE   ,"BSplineCurve"   ,"BSplineCurveType.png") );
129

130 131
    stringToTypeInfo["BSplineSurface"]   = types.size();
    typeToTypeInfo[DATA_BSPLINE_SURFACE] = types.size();
132 133
    types.push_back( TypeInfo(DATA_BSPLINE_SURFACE ,"BSplineSurface" ,"Unknown.png") );

134 135
    stringToTypeInfo["Skeleton"]  = types.size();
    typeToTypeInfo[DATA_SKELETON] = types.size();
136
    types.push_back( TypeInfo(DATA_SKELETON        ,"Skeleton"       ,"Unknown.png") );
137

138 139
    stringToTypeInfo["GIS"]  = types.size();
    typeToTypeInfo[DATA_GIS] = types.size();
140
    types.push_back( TypeInfo(DATA_GIS             ,"GIS"            ,"Unknown.png") );
141

142 143
    stringToTypeInfo["All"]  = types.size();
    typeToTypeInfo[DATA_ALL] = types.size();
144 145
    types.push_back( TypeInfo(DATA_ALL             ,"All"            ,"Unknown.png") );

146 147
    typeToString[DATA_NONE] = "Unknown";
    typeToString[DATA_GROUP] = "Group";
148 149
    typeToString[DATA_TRIANGLE_MESH_CONST_ID] = "TriangleMesh";
    typeToString[DATA_POLY_MESH_CONST_ID] = "PolyMesh";
150 151 152 153 154 155
    typeToString[DATA_BSPLINE_CURVE] = "BSplineCurve";
    typeToString[DATA_BSPLINE_SURFACE] = "BSplineSurface";
    typeToString[DATA_SKELETON] = "Skeleton";
    typeToString[DATA_GIS] = "GIS";
    typeToString[DATA_ALL] = "All";

156 157 158 159
    initialized_ = true;
  }
}

160
/// Adds a datatype and returns the id for the new type
161 162
DataType addDataType(QString _name) {
  initialize();
163 164 165 166 167 168 169 170 171

  int type = nextTypeId_;

  stringToTypeInfo[ _name ] = types.size();
  typeToTypeInfo[ type ] = types.size();
  types.push_back( TypeInfo(type, _name, "Unknown.png") );

  typeToString[type] = _name;

172
  nextTypeId_ *= 2;
173
  return( type );
174 175
}

176
/// Get the id of a type with given name
177 178
DataType typeId(QString _name) {
  initialize();
179 180 181 182 183

  std::map<QString, unsigned int>::iterator index = stringToTypeInfo.find( _name );

  if ( index != stringToTypeInfo.end() )
    return types[ index->second ].type;
184 185
  else {
    std::cerr << "Unknown Data type with name " << _name.toStdString() << std::endl;
186
    return -1;
187
  }
188 189 190 191 192 193 194 195 196 197
}

/// Get the name of a type with given id
QString typeName(DataType _id) {
  initialize();

  std::map<unsigned int, QString>::iterator name = typeToString.find(_id);

  if ( name != typeToString.end() )
    return name->second;
198 199
  else {
    std::cerr << "Unable to retrieve typeName for id " << _id << std::endl;
200
    return "Unknown";
201
  }
202 203
}

204
/// Get the icon of a given dataType
205 206
QString typeIcon(QString  _name) {
  initialize();
207 208 209 210 211 212 213

  std::map<QString, unsigned int>::iterator index = stringToTypeInfo.find( _name );

  if ( index != stringToTypeInfo.end() )
    return types[ index->second ].iconName;
  else
    return "Unknown.png";
214 215
}

216
/// get the icon of a given dataType
217 218
QString typeIcon(DataType _id) {
  initialize();
219 220 221 222 223 224 225

  std::map<unsigned int, unsigned int>::iterator index = typeToTypeInfo.find(_id);

  if ( index != typeToTypeInfo.end() )
    return types[ index->second ].iconName;
  else
    return "Unknown.png";
226 227
}

228
/// Set the icon for a given dataType
229 230 231
void setTypeIcon( DataType _id   , QString _icon ) {
  initialize();

232 233 234 235 236 237
  std::map<unsigned int, unsigned int>::iterator index = typeToTypeInfo.find(_id);

  if ( index != typeToTypeInfo.end() )
    types[ index->second ].iconName = _icon;
  else
    std::cerr << "Could not set icon for DataType. Type not found!" << std::endl;
238 239
}

240
/// Set the icon for a given dataType
241 242 243
void setTypeIcon( QString  _name , QString _icon ) {
  initialize();

244 245 246 247 248 249
  std::map<QString, unsigned int>::iterator index = stringToTypeInfo.find( _name );

  if ( index != stringToTypeInfo.end() )
    types[ index->second ].iconName = _icon;
  else
    std::cerr << "Could not set icon for DataType. Type not found!" << std::endl;
250 251 252 253
}

//=============================================================================
//=============================================================================