~ubuntu-branches/debian/squeeze/gmsh/squeeze

« back to all changes in this revision

Viewing changes to Common/Visibility.cpp

  • Committer: Bazaar Package Importer
  • Author(s): Christophe Prud'homme
  • Date: 2009-02-17 10:12:27 UTC
  • mfrom: (1.2.6 upstream)
  • Revision ID: james.westby@ubuntu.com-20090217101227-mdrolkldak2pgd2i
Tags: 2.3.0.dfsg-1
* New upstream release
  + major graphics and GUI code refactoring; 
  + new full-quad/hexa subdivision algorithm (removed 
    Mesh.RecombineAlgo);
  + improved automatic transfinite corner selection (now also 
    for volumes); 
  + improved visibility browser; new automatic adaptive visualization
    for high-order simplices;
  + modified arrow size, clipping planes and transform options; many
    improvements and
  + bug fixes all over the place.

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
// Gmsh - Copyright (C) 1997-2008 C. Geuzaine, J.-F. Remacle
2
 
//
3
 
// See the LICENSE.txt file for license information. Please report all
4
 
// bugs and problems to <gmsh@geuz.org>.
5
 
 
6
 
#include <string.h>
7
 
#include "Visibility.h"
8
 
#include "GModel.h"
9
 
#include "MElement.h"
10
 
 
11
 
#if !defined(HAVE_NO_PARSER)
12
 
#include "Parser.h"
13
 
#endif
14
 
 
15
 
VisibilityManager *VisibilityManager::manager = 0;
16
 
 
17
 
class VisLessThan{
18
 
 public:
19
 
  bool operator()(const Vis *v1, const Vis *v2) const
20
 
  {
21
 
    switch(VisibilityManager::instance()->getSortMode()){
22
 
    case  1: return v1->getDim() < v2->getDim() ? true : false;
23
 
    case -1: return v1->getDim() > v2->getDim() ? true : false;
24
 
    case  2: return v1->getTag() < v2->getTag() ? true : false;
25
 
    case -2: return v1->getTag() > v2->getTag() ? true : false;
26
 
    case  3: 
27
 
      return strcmp(VisibilityManager::instance()->getLabel(v1->getTag()).c_str(), 
28
 
                    VisibilityManager::instance()->getLabel(v2->getTag()).c_str()) < 0 ? 
29
 
        true : false;
30
 
    default: 
31
 
      return strcmp(VisibilityManager::instance()->getLabel(v1->getTag()).c_str(), 
32
 
                    VisibilityManager::instance()->getLabel(v2->getTag()).c_str()) > 0 ? 
33
 
        true : false;
34
 
    }
35
 
  }
36
 
};
37
 
 
38
 
void VisibilityManager::update(int type)
39
 
{
40
 
  _labels.clear();
41
 
  for(unsigned int i = 0; i < _entities.size(); i++)
42
 
    delete _entities[i];
43
 
  _entities.clear();
44
 
 
45
 
  GModel *m = GModel::current();
46
 
 
47
 
#if !defined(HAVE_NO_PARSER)
48
 
  for(std::map<std::string, std::vector<double> >::iterator it = gmsh_yysymbols.begin();
49
 
      it != gmsh_yysymbols.end(); ++it)
50
 
    for(unsigned int i = 0; i < it->second.size(); i++)
51
 
      VisibilityManager::instance()->setLabel((int)it->second[i], it->first, 0);
52
 
#endif
53
 
  
54
 
  if(type == 0){ // elementary entities
55
 
    for(GModel::piter it = m->firstElementaryName(); it != m->lastElementaryName(); ++it)
56
 
      setLabel(it->first, it->second);
57
 
    for(GModel::viter it = m->firstVertex(); it != m->lastVertex(); it++)
58
 
      _entities.push_back(new VisElementary(*it));
59
 
    for(GModel::eiter it = m->firstEdge(); it != m->lastEdge(); it++)
60
 
      _entities.push_back(new VisElementary(*it));
61
 
    for(GModel::fiter it = m->firstFace(); it != m->lastFace(); it++)
62
 
      _entities.push_back(new VisElementary(*it));
63
 
    for(GModel::riter it = m->firstRegion(); it != m->lastRegion(); it++)
64
 
      _entities.push_back(new VisElementary(*it));
65
 
  }
66
 
  else if(type == 1){ // physical entities
67
 
    for(GModel::piter it = m->firstPhysicalName(); it != m->lastPhysicalName(); ++it)
68
 
      setLabel(it->first, it->second);
69
 
    std::map<int, std::vector<GEntity*> > groups[4];
70
 
    m->getPhysicalGroups(groups);
71
 
    for(int i = 0; i < 4; i++){
72
 
      std::map<int, std::vector<GEntity*> >::const_iterator it = groups[i].begin();
73
 
      for(; it != groups[i].end(); ++it)
74
 
        _entities.push_back(new VisPhysical(it->first, i, it->second));
75
 
    }
76
 
  }
77
 
  else if(type == 2){ // partitions
78
 
    std::set<int> part = m->getMeshPartitions();
79
 
    for(std::set<int>::const_iterator it = part.begin(); it != part.end(); ++it)
80
 
      _entities.push_back(new VisPartition(*it));
81
 
  }
82
 
  std::sort(_entities.begin(), _entities.end(), VisLessThan());
83
 
}
84
 
 
85
 
void VisibilityManager::setAllInvisible(int type)
86
 
{
87
 
  GModel *m = GModel::current();
88
 
 
89
 
  if(type == 0 || type == 1){
90
 
    // elementary or physical mode: set all entities in the model invisible
91
 
    for(GModel::viter it = m->firstVertex(); it != m->lastVertex(); it++)
92
 
      (*it)->setVisibility(false);
93
 
    for(GModel::eiter it = m->firstEdge(); it != m->lastEdge(); it++)
94
 
      (*it)->setVisibility(false);
95
 
    for(GModel::fiter it = m->firstFace(); it != m->lastFace(); it++)
96
 
      (*it)->setVisibility(false);
97
 
    for(GModel::riter it = m->firstRegion(); it != m->lastRegion(); it++)
98
 
      (*it)->setVisibility(false);
99
 
  }
100
 
 
101
 
  // this is superfluous in elementary mode, but we don't care
102
 
  for(int i = 0; i < getNumEntities(); i++) setVisibility(i, false);
103
 
}
104
 
 
105
 
std::string VisibilityManager::getBrowserLine(int n)
106
 
{
107
 
  int tag = _entities[n]->getTag();
108
 
  char str[256];
109
 
  bool label_exists = _labels.count(tag);
110
 
  const char *label_color = (label_exists && _labels[tag].second) ? "@b" : "";
111
 
  sprintf(str, "\t%s\t%d\t%s%s", _entities[n]->getName().c_str(), tag, 
112
 
          label_color, label_exists ? _labels[tag].first.c_str() : "");
113
 
  return std::string(str);
114
 
}
115
 
 
116
 
std::string VisibilityManager::getStringForGEO()
117
 
{
118
 
  std::vector<int> state[4][2];
119
 
 
120
 
  GModel *m = GModel::current();
121
 
 
122
 
  for(GModel::viter it = m->firstVertex(); it != m->lastVertex(); it++)
123
 
    (*it)->getVisibility() ?
124
 
      state[0][1].push_back((*it)->tag()) : state[0][0].push_back((*it)->tag());
125
 
  for(GModel::eiter it = m->firstEdge(); it != m->lastEdge(); it++)
126
 
    (*it)->getVisibility() ? 
127
 
      state[1][1].push_back((*it)->tag()) : state[1][0].push_back((*it)->tag());
128
 
  for(GModel::fiter it = m->firstFace(); it != m->lastFace(); it++)
129
 
    (*it)->getVisibility() ? 
130
 
      state[2][1].push_back((*it)->tag()) : state[2][0].push_back((*it)->tag());
131
 
  for(GModel::riter it = m->firstRegion(); it != m->lastRegion(); it++)
132
 
    (*it)->getVisibility() ? 
133
 
      state[3][1].push_back((*it)->tag()) : state[3][0].push_back((*it)->tag());
134
 
  
135
 
  char tmp[256];
136
 
  const char *labels[4] = {"Point", "Line", "Surface", "Volume"};
137
 
  std::string str;
138
 
  int mode;
139
 
 
140
 
  int on = 0, off = 0;
141
 
  for(int i = 0; i < 4; i++){
142
 
    on += state[i][1].size();
143
 
    off += state[i][0].size();
144
 
  }
145
 
 
146
 
  if(on > off){
147
 
    str = "Show \"*\";\n";
148
 
    if(!off) return str;
149
 
    str += "Hide {\n";
150
 
    mode = 0;
151
 
  }
152
 
  else{
153
 
    str = "Hide \"*\";\n";
154
 
    if(!on) return str;
155
 
    str += "Show {\n";
156
 
    mode = 1;
157
 
  }
158
 
 
159
 
  for(int i = 0; i < 4; i++){
160
 
    if(state[i][mode].size()){
161
 
      str += labels[i];
162
 
      str += "{";
163
 
      for(unsigned int j = 0; j < state[i][mode].size(); j++){
164
 
        if(j) str += ",";
165
 
        sprintf(tmp, "%d", state[i][mode][j]);
166
 
        str += tmp;
167
 
      }
168
 
      str += "};\n";
169
 
    }
170
 
  }
171
 
  str += "}\n";
172
 
  return str;
173
 
}
174
 
 
175
 
void VisibilityManager::setVisibilityByNumber(int type, int num, char val, bool recursive)
176
 
{
177
 
  bool all = (num < 0) ? true : false;
178
 
 
179
 
  GModel *m = GModel::current();
180
 
 
181
 
  switch(type){
182
 
  case 0: // nodes
183
 
    for(GModel::viter it = m->firstVertex(); it != m->lastVertex(); it++)
184
 
      for(unsigned int i = 0; i < (*it)->mesh_vertices.size(); i++)
185
 
        if(all || (*it)->mesh_vertices[i]->getNum() == num) 
186
 
          (*it)->mesh_vertices[i]->setVisibility(val);
187
 
    for(GModel::eiter it = m->firstEdge(); it != m->lastEdge(); it++)
188
 
      for(unsigned int i = 0; i < (*it)->mesh_vertices.size(); i++)
189
 
        if(all || (*it)->mesh_vertices[i]->getNum() == num) 
190
 
          (*it)->mesh_vertices[i]->setVisibility(val);
191
 
    for(GModel::fiter it = m->firstFace(); it != m->lastFace(); it++)
192
 
      for(unsigned int i = 0; i < (*it)->mesh_vertices.size(); i++)
193
 
        if(all || (*it)->mesh_vertices[i]->getNum() == num) 
194
 
          (*it)->mesh_vertices[i]->setVisibility(val);
195
 
    for(GModel::riter it = m->firstRegion(); it != m->lastRegion(); it++)
196
 
      for(unsigned int i = 0; i < (*it)->mesh_vertices.size(); i++)
197
 
        if(all || (*it)->mesh_vertices[i]->getNum() == num) 
198
 
          (*it)->mesh_vertices[i]->setVisibility(val);
199
 
    break;
200
 
  case 1: // elements
201
 
    for(GModel::eiter it = m->firstEdge(); it != m->lastEdge(); it++){
202
 
      for(unsigned int i = 0; i < (*it)->lines.size(); i++)
203
 
        if(all || (*it)->lines[i]->getNum() == num) 
204
 
          (*it)->lines[i]->setVisibility(val);
205
 
    }
206
 
    for(GModel::fiter it = m->firstFace(); it != m->lastFace(); it++){
207
 
      for(unsigned int i = 0; i < (*it)->triangles.size(); i++)
208
 
        if(all || (*it)->triangles[i]->getNum() == num) 
209
 
          (*it)->triangles[i]->setVisibility(val);
210
 
      for(unsigned int i = 0; i < (*it)->quadrangles.size(); i++)
211
 
        if(all || (*it)->quadrangles[i]->getNum() == num) 
212
 
          (*it)->quadrangles[i]->setVisibility(val);
213
 
    }
214
 
    for(GModel::riter it = m->firstRegion(); it != m->lastRegion(); it++){
215
 
      for(unsigned int i = 0; i < (*it)->tetrahedra.size(); i++)
216
 
        if(all || (*it)->tetrahedra[i]->getNum() == num) 
217
 
          (*it)->tetrahedra[i]->setVisibility(val);
218
 
      for(unsigned int i = 0; i < (*it)->hexahedra.size(); i++)
219
 
        if(all || (*it)->hexahedra[i]->getNum() == num) 
220
 
          (*it)->hexahedra[i]->setVisibility(val);
221
 
      for(unsigned int i = 0; i < (*it)->prisms.size(); i++)
222
 
        if(all || (*it)->prisms[i]->getNum() == num) 
223
 
          (*it)->prisms[i]->setVisibility(val);
224
 
      for(unsigned int i = 0; i < (*it)->pyramids.size(); i++)
225
 
        if(all || (*it)->pyramids[i]->getNum() == num) 
226
 
          (*it)->pyramids[i]->setVisibility(val);
227
 
    }
228
 
    break;
229
 
  case 2: // point
230
 
    for(GModel::viter it = m->firstVertex(); it != m->lastVertex(); it++)
231
 
      if(all || (*it)->tag() == num) (*it)->setVisibility(val, recursive);
232
 
    break;
233
 
  case 3: // line
234
 
    for(GModel::eiter it = m->firstEdge(); it != m->lastEdge(); it++)
235
 
      if(all || (*it)->tag() == num) (*it)->setVisibility(val, recursive);
236
 
    break;
237
 
  case 4: // surface
238
 
    for(GModel::fiter it = m->firstFace(); it != m->lastFace(); it++)
239
 
      if(all || (*it)->tag() == num) (*it)->setVisibility(val, recursive);
240
 
    break;
241
 
  case 5: // volume
242
 
    for(GModel::riter it = m->firstRegion(); it != m->lastRegion(); it++)
243
 
      if(all || (*it)->tag() == num) (*it)->setVisibility(val, recursive);
244
 
    break;
245
 
  case 6: // physical point
246
 
    for(GModel::viter it = m->firstVertex(); it != m->lastVertex(); it++)
247
 
      for(unsigned int i = 0; i < (*it)->physicals.size(); i++)
248
 
        if (all || std::abs((*it)->physicals[i]) == num) (*it)->setVisibility(val, recursive);
249
 
    break;
250
 
  case 7: // physical line
251
 
    for(GModel::eiter it = m->firstEdge(); it != m->lastEdge(); it++)
252
 
      for(unsigned int i = 0; i < (*it)->physicals.size(); i++)
253
 
        if (all || std::abs((*it)->physicals[i]) == num) (*it)->setVisibility(val, recursive);
254
 
    break;
255
 
  case 8: // physical surface
256
 
    for(GModel::fiter it = m->firstFace(); it != m->lastFace(); it++)
257
 
      for(unsigned int i = 0; i < (*it)->physicals.size(); i++)
258
 
        if (all || std::abs((*it)->physicals[i]) == num) (*it)->setVisibility(val, recursive);
259
 
    break;
260
 
  case 9: // physical volume
261
 
    for(GModel::riter it = m->firstRegion(); it != m->lastRegion(); it++)
262
 
      for(unsigned int i = 0; i < (*it)->physicals.size(); i++)
263
 
        if (all || std::abs((*it)->physicals[i]) == num) (*it)->setVisibility(val, recursive);
264
 
    break;
265
 
  }
266
 
}
267
 
 
268
 
void VisElementary::setVisibility(char val, bool recursive)
269
 
{
270
 
  _e->setVisibility(val, recursive);
271
 
}
272
 
 
273
 
void VisPhysical::setVisibility(char val, bool recursive)
274
 
{
275
 
  _visible = val;
276
 
  for(unsigned int i = 0; i < _list.size(); i++)
277
 
    _list[i]->setVisibility(val, recursive);
278
 
}
279
 
 
280
 
void VisPartition::setVisibility(char val, bool recursive)
281
 
{
282
 
  GModel *m = GModel::current();
283
 
 
284
 
  _visible = val;
285
 
  for(GModel::eiter it = m->firstEdge(); it != m->lastEdge(); it++){
286
 
    for(unsigned int i = 0; i < (*it)->lines.size(); i++)
287
 
      if((*it)->lines[i]->getPartition() == _tag) 
288
 
        (*it)->lines[i]->setVisibility(val);
289
 
  }
290
 
  for(GModel::fiter it = m->firstFace(); it != m->lastFace(); it++){
291
 
    for(unsigned int i = 0; i < (*it)->triangles.size(); i++)
292
 
      if((*it)->triangles[i]->getPartition() == _tag) 
293
 
        (*it)->triangles[i]->setVisibility(val);
294
 
    for(unsigned int i = 0; i < (*it)->quadrangles.size(); i++)
295
 
      if((*it)->quadrangles[i]->getPartition() == _tag) 
296
 
        (*it)->quadrangles[i]->setVisibility(val);
297
 
  }
298
 
  for(GModel::riter it = m->firstRegion(); it != m->lastRegion(); it++){
299
 
    for(unsigned int i = 0; i < (*it)->tetrahedra.size(); i++)
300
 
      if((*it)->tetrahedra[i]->getPartition() == _tag) 
301
 
        (*it)->tetrahedra[i]->setVisibility(val);
302
 
    for(unsigned int i = 0; i < (*it)->hexahedra.size(); i++)
303
 
      if((*it)->hexahedra[i]->getPartition() == _tag) 
304
 
        (*it)->hexahedra[i]->setVisibility(val);
305
 
    for(unsigned int i = 0; i < (*it)->prisms.size(); i++)
306
 
      if((*it)->prisms[i]->getPartition() == _tag) 
307
 
        (*it)->prisms[i]->setVisibility(val);
308
 
    for(unsigned int i = 0; i < (*it)->pyramids.size(); i++)
309
 
      if((*it)->pyramids[i]->getPartition() == _tag) 
310
 
        (*it)->pyramids[i]->setVisibility(val);
311
 
  }
312
 
}