source: src/Shapes/ShapeFactory.cpp@ ff4fff9

CombiningParticlePotentialParsing
Last change on this file since ff4fff9 was 99db9b, checked in by Frederik Heber <heber@…>, 9 years ago

Replaced all World::getSelected...() to const version where possible.

  • also added const version of World::getSelectedAtoms().
  • Property mode set to 100644
File size: 4.9 KB
Line 
1/*
2 * Project: MoleCuilder
3 * Description: creates and alters molecular systems
4 * Copyright (C) 2010-2012 University of Bonn. All rights reserved.
5 *
6 *
7 * This file is part of MoleCuilder.
8 *
9 * MoleCuilder is free software: you can redistribute it and/or modify
10 * it under the terms of the GNU General Public License as published by
11 * the Free Software Foundation, either version 2 of the License, or
12 * (at your option) any later version.
13 *
14 * MoleCuilder is distributed in the hope that it will be useful,
15 * but WITHOUT ANY WARRANTY; without even the implied warranty of
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 * GNU General Public License for more details.
18 *
19 * You should have received a copy of the GNU General Public License
20 * along with MoleCuilder. If not, see <http://www.gnu.org/licenses/>.
21 */
22
23/*
24 * ShapeFactory.cpp
25 *
26 * Created on: Sep 5, 2012
27 * Author: ankele
28 */
29
30// include config.h
31#ifdef HAVE_CONFIG_H
32#include <config.h>
33#endif
34
35#include "CodePatterns/MemDebug.hpp"
36
37#include "ShapeFactory.hpp"
38
39#include "CodePatterns/Log.hpp"
40
41#include "BaseShapes.hpp"
42#include "ShapeOps.hpp"
43
44#include "CodePatterns/Singleton_impl.hpp"
45#include "LinearAlgebra/Vector.hpp"
46#include "LinearAlgebra/RealSpaceMatrix.hpp"
47#include "molecule.hpp"
48#include "World.hpp"
49
50ShapeFactory::ShapeFactory()
51{
52 // Create map (type -> name).
53 shapeNameMap[NowhereType] = "nowhere";
54 shapeNameMap[EverywhereType] = "everywhere";
55 shapeNameMap[SphereType] = "sphere";
56 shapeNameMap[CuboidType] = "cube";
57 shapeNameMap[PolygonType] = "polygon";
58 shapeNameMap[CombinedType] = "combined";
59 shapeNameMap[CylinderType] = "cylinder";
60 shapeNameMap[MoleculeSurfaceType] = "molecule-surface";
61
62 // Create inverse map.
63 for (ShapeNameMap::iterator iter = shapeNameMap.begin(); iter != shapeNameMap.end(); ++ iter)
64 nameShapeMap[iter->second] = iter->first;
65
66 // Create baseShapeName list.
67 for (ShapeNameMap::iterator iter = shapeNameMap.begin(); iter != shapeNameMap.end(); ++ iter)
68 if (iter->first != CombinedType)
69 baseShapeNames.push_back(iter->second);
70}
71
72ShapeType ShapeFactory::getShapeByName(const std::string& name) const
73{
74 NameShapeMap::const_iterator iter = nameShapeMap.find(name);
75 ASSERT(iter != nameShapeMap.end(),
76 "ShapeFactory::getShapeByName() - unknown name: "+name+".");
77 return iter->second;
78}
79
80std::string ShapeFactory::getShapeName(ShapeType type) const
81{
82 ShapeNameMap::const_iterator iter = shapeNameMap.find(type);
83 ASSERT(iter != shapeNameMap.end(),
84 "ShapeFactory::getShapeName() - unknown type: "+toString(type)+".");
85 return iter->second;
86}
87
88bool ShapeFactory::isValidShapeName(const std::string& name) const
89{
90 NameShapeMap::const_iterator iter = nameShapeMap.find(name);
91 return (iter != nameShapeMap.end());
92}
93
94bool ShapeFactory::isSimpleShape(const ShapeType type) const
95{
96 return ((type != CombinedType) && (type != MoleculeSurfaceType) );
97}
98
99bool ShapeFactory::isSimpleShape(const std::string &name) const
100{
101 return isSimpleShape(getShapeByName(name));
102}
103
104const std::vector<std::string> &ShapeFactory::getBaseShapeNames() const
105{
106 return baseShapeNames;
107}
108
109ShapeFactory::~ShapeFactory()
110{
111}
112
113Shape ShapeFactory::produce(ShapeType type, const Vector &translation, const Vector &stretch, double angleX, double angleY, double angleZ) const
114{
115 for (int i=0; i<NDIM; i++){
116 ASSERT(stretch[i] > 0,
117 "ShapeFactory::setStretch() - non positive component.");
118 }
119
120 // Create the basic shape.
121 Shape s = Nowhere();
122 switch(type){
123 case NowhereType:
124 s = Nowhere();
125 break;
126 case EverywhereType:
127 s = Everywhere();
128 break;
129 case CuboidType:
130 s = Cuboid();
131 break;
132 case SphereType:
133 s = Sphere();
134 break;
135 case CylinderType:
136 s = Cylinder();
137 break;
138 case MoleculeSurfaceType:
139 {
140 const std::vector<const molecule *> molecules =
141 const_cast<const World &>(World::getInstance()).getSelectedMolecules();
142 if (molecules.empty()) {
143 ELOG(2, "No molecule is selected, cannot factorize its bounding shape.");
144 s = Nowhere();
145 } else {
146 const molecule * const mol = (*molecules.begin());
147 LOG(2, "DEBUG: Factoring shape from bounding box of molecule " << mol->getName() << ".");
148 s = mol->getBoundingShape(stretch[0]);
149 }
150 break;
151 }
152 default:
153 ASSERT(false,
154 "ShapeFactory::produce - unhandled shape type: "+toString(type)+".");
155 }
156
157 if (type != MoleculeSurfaceType) {
158 // Transform (if necessary).
159 if (stretch != Vector(1., 1., 1.))
160 s = ::stretch(s, stretch);
161 if ((angleX != 0) || (angleY != 0) || (angleZ != 0)){
162 RealSpaceMatrix rotation;
163 rotation.setRotation(angleX, angleY, angleZ);
164 s = transform(s, rotation);
165 }
166 if (!translation.IsZero())
167 s = translate(s, translation);
168 }
169
170 return s;
171}
172
173CONSTRUCT_SINGLETON(ShapeFactory)
Note: See TracBrowser for help on using the repository browser.