Go to the documentation of this file.00001
00022 #include "DGVLatticeVTK.h"
00023
00024 #include <QFileInfo>
00025
00026 #include "vtkTransform.h"
00027
00028 DGVLatticeVTK::DGVLatticeVTK(QWidget *parent) : QVTKWidget(parent)
00029 {
00030 unit = 10.0;
00031 defaultSize = 13;
00032 setDimensions(2);
00033 defaultRadius = 1.0;
00034 generatedBefore = false;
00035 rightHanded = true;
00036 axesEnabledBefore = false;
00037
00038 property = vtkProperty::New();
00039 }
00040
00041 DGVLatticeVTK::~DGVLatticeVTK()
00042 {
00043 if(generatedBefore)
00044 {
00046 sphere->Delete();
00047 mapper->Delete();
00048 if(dimension == 1 || dimension == 2 || dimension == 3)
00049 {
00050 for(int j = 0; j < latticePoints.size(); j ++)
00051 latticePoints(j)->Delete();
00052 }
00053 renderer->Delete();
00054 renderWin->Delete();
00055 if(axesEnabledBefore)
00056 axes->Delete();
00057 }
00058
00059 property->Delete();
00060 }
00061
00062 void DGVLatticeVTK::setName(QString filename)
00063 {
00064 name = filename;
00065 setWindowTitle(strippedNamePrefix());
00066 }
00067
00068 void DGVLatticeVTK::setDimensions(int dimensions)
00069 {
00070 dimension = dimensions;
00071 latticeParameters.resize(dimension);
00072 latticeParameters = unit;
00073 latticeSize.resize(dimension);
00074 latticeSize = defaultSize;
00075 }
00076
00077 void DGVLatticeVTK::setDefaultSize(int value)
00078 {
00079 defaultSize = value;
00080 latticeSize = defaultSize;
00081 }
00082
00083 void DGVLatticeVTK::setBackgroundColour(double red, double green, double blue)
00084 {
00085 renderer->SetBackground(red/256,green/256,blue/256);
00086 renderWin->Render();
00087 }
00088
00089 void DGVLatticeVTK::setLatticeColour(double red, double green, double blue)
00090 {
00091 int count = 0;
00092
00093 if(generatedBefore)
00094 {
00095 if(dimension == 2)
00096 {
00097 for(int j = 0; j < latticeSize(0); j ++)
00098 {
00099 for(int k = 0; k < latticeSize(1); k ++)
00100 {
00101 latticePoints(count)->GetProperty()->SetColor(red,green,blue);
00102 count ++;
00103 }
00104 }
00105 }
00106 }
00107 else
00108 property->SetColor(red,green,blue);
00109 }
00110
00111 void DGVLatticeVTK::setLatticePointColour(int x, int y, double red, double green, double blue)
00112 {
00113 if(generatedBefore)
00114 {
00115 if(dimension == 2)
00116 latticePoints((y+x*latticeSize(1))%latticePoints.size())->GetProperty()->SetColor(red,green,blue);
00117 }
00118 }
00119
00120 void DGVLatticeVTK::viewAsRightHanded()
00121 {
00122 if(!rightHanded)
00123 {
00124 vtkCamera *camera = renderer->GetActiveCamera();
00125
00126 camera->Roll(90);
00127
00128 rightHanded = true;
00129 }
00130 }
00131
00132 void DGVLatticeVTK::viewAsMatrix()
00133 {
00134 if(rightHanded)
00135 {
00136 vtkCamera *camera = renderer->GetActiveCamera();
00137
00138 camera->Roll(-90);
00139
00140 rightHanded = false;
00141 }
00142 }
00143
00144 void DGVLatticeVTK::enableAxes()
00145 {
00146 if(!axesEnabledBefore)
00147 {
00148 axes = vtkAxesActor::New();
00149 axesEnabledBefore = true;
00150 }
00151
00152
00153 axes->SetTotalLength(latticeParameters(0)*0.75,latticeParameters(1)*0.75,0);
00154 axes->AxisLabelsOff();
00155 renderer->AddActor(axes);
00156 }
00157
00158 void DGVLatticeVTK::disableAxes()
00159 {
00160 if(!axesEnabledBefore)
00161 {
00162 axes = vtkAxesActor::New();
00163 axesEnabledBefore = true;
00164 }
00165
00166 renderer->RemoveActor(axes);
00167 }
00168
00169 void DGVLatticeVTK::addActorToLattice(vtkActor *actorToAdd)
00170 {
00171 renderer->AddActor(actorToAdd);
00172
00173 renderWin->Render();
00174 }
00175
00176 void DGVLatticeVTK::generateLattice()
00177 {
00178 int totalPoints = 1;
00179
00180 if(!generatedBefore)
00181 {
00182 sphere = vtkSphereSource::New();
00183 mapper = vtkPolyDataMapper::New();
00184 renderer = vtkRenderer::New();
00185 renderWin = vtkRenderWindow::New();
00186 generatedBefore = true;
00187 }
00188
00189 sphere->SetRadius(defaultRadius);
00190 sphere->SetCenter(0,0,0);
00191 sphere->Update();
00192
00193 mapper->SetInput(sphere->GetOutput());
00194
00195 mapper->Update();
00196
00197 for(int j = 0; j < dimension; j ++)
00198 totalPoints *= latticeSize(j);
00199
00200 int count = 0;
00201 vtkTransform *transform;
00202 latticePoints.resizeAndPreserve(totalPoints);
00203 if(dimension == 1)
00204 {
00205 for(int j = 0; j < latticeSize(0); j ++)
00206 {
00207 transform = vtkTransform::New();
00208 latticePoints(count) = vtkActor::New();
00209 latticePoints(count)->SetMapper(mapper);
00210 transform->SetMatrix(latticePoints(count)->GetMatrix());
00211 transform->Translate(latticeParameters(0)*j,0,0);
00212 transform->Update();
00213 latticePoints(count)->PokeMatrix(transform->GetMatrix());
00214 latticePoints(count)->GetProperty()->SetColor(property->GetColor()[0],property->GetColor()[1],property->GetColor()[2]);
00215 renderer->AddActor(latticePoints(count));
00216 transform->Delete();
00217 count ++;
00218 }
00219 }
00220 else if(dimension == 2)
00221 {
00222 for(int j = 0; j < latticeSize(0); j ++)
00223 {
00224 for(int k = 0; k < latticeSize(1); k ++)
00225 {
00226 transform = vtkTransform::New();
00227 latticePoints(count) = vtkActor::New();
00228 latticePoints(count)->SetMapper(mapper);
00229 transform->SetMatrix(latticePoints(count)->GetMatrix());
00230 transform->Translate(latticeParameters(0)*j,latticeParameters(1)*k,0);
00231 transform->Update();
00232 latticePoints(count)->PokeMatrix(transform->GetMatrix());
00233 latticePoints(count)->GetProperty()->SetColor(property->GetColor()[0],property->GetColor()[1],property->GetColor()[2]);
00234 renderer->AddActor(latticePoints(count));
00235 transform->Delete();
00236 count ++;
00237 }
00238 }
00239 }
00240 else if(dimension == 3)
00241 {
00242 for(int j = 0; j < latticeSize(0); j ++)
00243 {
00244 for(int k = 0; k < latticeSize(1); k ++)
00245 {
00246 for(int l = 0; l < latticeSize(2); l ++)
00247 {
00248 transform = vtkTransform::New();
00249 latticePoints(count) = vtkActor::New();
00250 latticePoints(count)->SetMapper(mapper);
00251 transform->SetMatrix(latticePoints(count)->GetMatrix());
00252 transform->Translate(latticeParameters(0)*j,latticeParameters(1)*k,latticeParameters(2)*l);
00253 transform->Update();
00254 latticePoints(count)->PokeMatrix(transform->GetMatrix());
00255 latticePoints(count)->GetProperty()->SetColor(property->GetColor()[0],property->GetColor()[1],property->GetColor()[2]);
00256 renderer->AddActor(latticePoints(count));
00257 transform->Delete();
00258 count ++;
00259 }
00260 }
00261 }
00262 }
00263 else
00264 {
00265 cerr << "ERROR: Lattice Dimension Not Supported!" << endl;
00266 return;
00267 }
00268
00269 renderer->ResetCamera();
00270 renderer->SetBackground(0.1, 0.2, 0.4);
00271 renderer->ResetCameraClippingRange();
00272 renderWin->AddRenderer(renderer);
00273 SetRenderWindow(renderWin);
00274 renderWin->Render();
00275 }
00276
00277 QString DGVLatticeVTK::strippedName()
00278 {
00279 return QFileInfo(name).fileName();
00280 }
00281
00282 QString DGVLatticeVTK::strippedNamePrefix()
00283 {
00284 return "Lattice: " + QFileInfo(name).fileName();
00285 }