00001
00002
00003
00004
00005 #include <CompuCell3D/Simulator.h>
00006 #include <CompuCell3D/Potts3D/Potts3D.h>
00007 #include <CompuCell3D/Field3D/Dim3D.h>
00008 #include <CompuCell3D/Field3D/Field3D.h>
00009
00010
00011 #include <BasicUtils/BasicString.h>
00012 #include <BasicUtils/BasicException.h>
00013 #include <PublicUtilities/StringUtils.h>
00014 #include <iostream>
00015 #include <algorithm>
00016
00017 using namespace std;
00018
00019 #define EXP_STL
00020 #include "PlayerSettingsPlugin.h"
00021 using namespace CompuCell3D;
00022
00023
00024 std::string PlayerSettingsPlugin::toString(){
00025 return "PlayerSettings";
00026 }
00027
00028 std::string PlayerSettingsPlugin::steerableName(){
00029 return toString();
00030 }
00031
00032 PlayerSettingsPlugin::PlayerSettingsPlugin():xmlData(0), playerSettingsPtr(0) {
00033 playerSettingsPtr=&playerSettings;
00034 }
00035
00036 PlayerSettingsPlugin::~PlayerSettingsPlugin() {}
00037
00038
00039 void PlayerSettingsPlugin::init(Simulator *simulator, CC3DXMLElement *_xmlData){
00040 xmlData=_xmlData;
00041 }
00042
00043 void PlayerSettingsPlugin::extraInit(Simulator *simulator) {
00044 update(xmlData,true);
00045
00046 Potts3D *potts=simulator->getPotts();
00047 Dim3D fieldDim = potts->getCellFieldG()->getDim();
00048
00049 cerr<<"\n\n\\t\t\tPlayer Settings \n\n";
00050 cerr<<"playerSettingsPtr->xyProjFlag="<<playerSettingsPtr->xyProjFlag<<endl;
00051 cerr<<"playerSettingsPtr->xyProj="<<playerSettingsPtr->xyProj<<endl;
00052 cerr<<"This is field dim="<<fieldDim<<endl;
00054 if(playerSettingsPtr->xyProjFlag){
00055
00056 ASSERT_OR_THROW("Value of XYProj has to be within limits for z dimension of the field",
00057 playerSettingsPtr->xyProj>=0 && playerSettingsPtr->xyProj<fieldDim.z
00058 );
00059
00060 }
00061
00062 if(playerSettingsPtr->xzProjFlag){
00063 ASSERT_OR_THROW("Value of XZProj has to be within limits for y dimension of the field",
00064 playerSettingsPtr->xzProj>=0 && playerSettingsPtr->xyProj<fieldDim.y
00065 );
00066 }
00067
00068 if(playerSettingsPtr->yzProjFlag){
00069 ASSERT_OR_THROW("Value of YZProj has to be within limits for x dimension of the field",
00070 playerSettingsPtr->yzProj>=0 && playerSettingsPtr->yzProj<fieldDim.x
00071 );
00072 }
00073
00074 if(playerSettingsPtr->rotationXFlag){
00075 ASSERT_OR_THROW("Value of XRot must be between -180 and 180",
00076 playerSettingsPtr->rotationX>=-180 && playerSettingsPtr->rotationX<=180
00077 );
00078 }
00079
00080 if(playerSettingsPtr->rotationYFlag){
00081 ASSERT_OR_THROW("Value of YRot must be between -180 and 180",
00082 playerSettingsPtr->rotationY>=-180 && playerSettingsPtr->rotationY<=180
00083 );
00084 }
00085
00086 if(playerSettingsPtr->rotationZFlag){
00087 ASSERT_OR_THROW("Value of ZRot must be between -180 and 180",
00088 playerSettingsPtr->rotationZ>=-180 && playerSettingsPtr->rotationZ<=180
00089 );
00090 }
00091
00092
00093
00094
00095 }
00096
00097 void PlayerSettingsPlugin::update(CC3DXMLElement *_xmlData, bool _fullInitFlag){
00098
00099 cerr<<"_xmlData="<<_xmlData<<endl;
00100
00101 CC3DXMLElement *proj2DElement;
00102 proj2DElement=_xmlData->getFirstElement("Project2D");
00103 if(proj2DElement){
00104
00106 if(proj2DElement->findAttribute("XYProj")){
00107 playerSettings.xyProj=proj2DElement->getAttributeAsUInt("XYProj");
00108 playerSettings.xyProjFlag=true;
00109 }
00110
00111 if(proj2DElement->findAttribute("XZProj")){
00112 playerSettings.xzProj=proj2DElement->getAttributeAsUInt("XZProj");
00113 playerSettings.xzProjFlag=true;
00114 }
00115
00116 if(proj2DElement->findAttribute("YZProj")){
00117 playerSettings.yzProj=proj2DElement->getAttributeAsUInt("YZProj");
00118 playerSettings.yzProjFlag=true;
00119 }
00120 }
00121
00122
00123 CC3DXMLElement *rot3DElement;
00124 rot3DElement=_xmlData->getFirstElement("Rotate3D");
00125 if(rot3DElement){
00126
00128 if(rot3DElement->findAttribute("XRot")){
00129 playerSettings.rotationX=rot3DElement->getAttributeAsUInt("XRot");
00130 playerSettings.rotationXFlag=true;
00131 }
00132
00133 if(rot3DElement->findAttribute("YRot")){
00134 playerSettings.rotationY=rot3DElement->getAttributeAsUInt("YRot");
00135 playerSettings.rotationYFlag=true;
00136 }
00137
00138 if(rot3DElement->findAttribute("ZRot")){
00139 playerSettings.rotationZ=rot3DElement->getAttributeAsUInt("ZRot");
00140 playerSettings.rotationZFlag=true;
00141 }
00142
00143 }
00144
00145 CC3DXMLElement *resize3DElement;
00146 resize3DElement=_xmlData->getFirstElement("Resize3D");
00147 if(resize3DElement){
00149
00150 if(resize3DElement->findAttribute("X")){
00151 playerSettings.sizeX3D=resize3DElement->getAttributeAsUInt("X");
00152 playerSettings.sizeX3DFlag=true;
00153 }
00154
00155 if(resize3DElement->findAttribute("Y")){
00156 playerSettings.sizeY3D=resize3DElement->getAttributeAsUInt("Y");
00157 playerSettings.sizeY3DFlag=true;
00158 }
00159
00160 if(resize3DElement->findAttribute("Z")){
00161 playerSettings.sizeZ3D=resize3DElement->getAttributeAsUInt("Z");
00162 playerSettings.sizeZ3DFlag=true;
00163 }
00164
00165 }
00166
00167 CC3DXMLElement *initProjXMLElement=_xmlData->getFirstElement("InitialProjection");
00168 if(initProjXMLElement){
00169 if(initProjXMLElement->findAttribute("Projection")){
00170 playerSettings.initialProjection=initProjXMLElement->getAttribute("Projection");
00171
00172 changeToLower(playerSettings.initialProjection);
00173 ASSERT_OR_THROW("InitialProjection has have a value of xy or xz or yz",
00174 playerSettings.initialProjection=="xy" || playerSettings.initialProjection=="xz" || playerSettings.initialProjection=="yz"
00175 );
00176 }
00177
00178 }
00179
00180 CC3DXMLElement *concXMLElement;
00181 concXMLElement=_xmlData->getFirstElement("Concentration");
00182 if(concXMLElement){
00184
00185 playerSettings.advancedSettingsOn=true;
00186
00187 if(concXMLElement->findAttribute("Min")){
00188 playerSettings.minConcentration=concXMLElement->getAttributeAsDouble("Min");
00189 playerSettings.minConcentrationFlag=true;
00190
00191 playerSettings.minConcentrationFixed=true;
00192 playerSettings.minConcentrationFixedFlag=true;
00193
00194 }
00195
00196 if(concXMLElement->findAttribute("Max")){
00197 playerSettings.maxConcentration=concXMLElement->getAttributeAsDouble("Max");
00198 playerSettings.maxConcentrationFlag=true;
00199 playerSettings.maxConcentrationFixed=true;
00200 playerSettings.maxConcentrationFixedFlag=true;
00201
00202 }
00203
00204
00205 if(concXMLElement->findAttribute("MinFixed")){
00206 playerSettings.minConcentrationFixed=concXMLElement->getAttributeAsBool("MinFixed");
00207 playerSettings.minConcentrationFixedFlag=true;
00208 }
00209
00210 if(concXMLElement->findAttribute("MaxFixed")){
00211 playerSettings.maxConcentrationFixed=concXMLElement->getAttributeAsBool("MaxFixed");
00212 playerSettings.maxConcentrationFixedFlag=true;
00213 }
00214
00215 if(concXMLElement->findAttribute("LegendEnable")){
00216 playerSettings.legendEnable=concXMLElement->getAttributeAsBool("LegendEnable");
00217 playerSettings.legendEnableFlag=true;
00218 }
00219
00220 if(concXMLElement->findAttribute("NumberOfLegendBoxes")){
00221 playerSettings.numberOfLegendBoxes=concXMLElement->getAttributeAsUInt("NumberOfLegendBoxes");
00222 playerSettings.numberOfLegendBoxesFlag=true;
00223 }
00224
00225 if(concXMLElement->findAttribute("NumberAccuracy")){
00226 playerSettings.numberAccuracy=concXMLElement->getAttributeAsUInt("NumberAccuracy");
00227 playerSettings.numberAccuracyFlag=true;
00228 }
00229
00230 if(concXMLElement->findAttribute("ConcentrationLimitsOn")){
00231 playerSettings.concentrationLimitsOn=concXMLElement->getAttributeAsBool("ConcentrationLimitsOn");
00232 playerSettings.concentrationLimitsOnFlag=true;
00233 }
00234
00235
00236 }
00237
00238
00239 CC3DXMLElement *magnitudeXMLElement;
00240 magnitudeXMLElement=_xmlData->getFirstElement("Magnitude");
00241 if(magnitudeXMLElement){
00243
00244 playerSettings.advancedSettingsOn=true;
00245
00246 if(magnitudeXMLElement->findAttribute("Min")){
00247 playerSettings.minMagnitude=magnitudeXMLElement->getAttributeAsDouble("Min");
00248 playerSettings.minMagnitudeFlag=true;
00249
00250 playerSettings.minMagnitudeFixed=true;
00251 playerSettings.minMagnitudeFixedFlag=true;
00252 }
00253
00254 if(magnitudeXMLElement->findAttribute("Max")){
00255 playerSettings.maxMagnitude=magnitudeXMLElement->getAttributeAsDouble("Max");
00256 playerSettings.maxMagnitudeFlag=true;
00257
00258 playerSettings.maxMagnitudeFixed=true;
00259 playerSettings.maxMagnitudeFixedFlag=true;
00260 }
00261
00262
00263 if(magnitudeXMLElement->findAttribute("MinFixed")){
00264 playerSettings.minMagnitudeFixed=magnitudeXMLElement->getAttributeAsBool("MinFixed");
00265 playerSettings.minMagnitudeFixedFlag=true;
00266 }
00267
00268 if(magnitudeXMLElement->findAttribute("MaxFixed")){
00269 playerSettings.maxMagnitudeFixed=magnitudeXMLElement->getAttributeAsBool("MaxFixed");
00270 playerSettings.maxMagnitudeFixedFlag=true;
00271 }
00272
00273
00274
00275
00276 if(magnitudeXMLElement->findAttribute("LegendEnable")){
00277 playerSettings.legendEnableVector=magnitudeXMLElement->getAttributeAsBool("LegendEnable");
00278 playerSettings.legendEnableVectorFlag=true;
00279 }
00280
00281
00282 if(magnitudeXMLElement->findAttribute("NumberOfLegendBoxes")){
00283 playerSettings.numberOfLegendBoxesVector=magnitudeXMLElement->getAttributeAsUInt("NumberOfLegendBoxes");
00284 playerSettings.numberOfLegendBoxesVectorFlag=true;
00285 }
00286
00287 if(magnitudeXMLElement->findAttribute("NumberAccuracy")){
00288 playerSettings.numberAccuracyVector=magnitudeXMLElement->getAttributeAsUInt("NumberAccuracy");
00289 playerSettings.numberAccuracyVectorFlag=true;
00290 }
00291
00292 if(magnitudeXMLElement->findAttribute("OverlayVectorAndCellFields")){
00293 playerSettings.overlayVectorCellFields=magnitudeXMLElement->getAttributeAsBool("OverlayVectorAndCellFields");
00294 playerSettings.overlayVectorCellFieldsFlag=true;
00295 }
00296
00297 if(magnitudeXMLElement->findAttribute("ScaleArrows")){
00298 playerSettings.scaleArrows=magnitudeXMLElement->getAttributeAsBool("ScaleArrows");
00299 playerSettings.scaleArrowsFlag=true;
00300 }
00301
00302 if(magnitudeXMLElement->findAttribute("FixedArrowColorFlag")){
00303 playerSettings.fixedArrowColorFlag=magnitudeXMLElement->getAttributeAsBool("FixedArrowColorFlag");
00304 playerSettings.fixedArrowColorFlagFlag=true;
00305 }
00306
00307 if(magnitudeXMLElement->findAttribute("ArrowColor")){
00308 playerSettings.arrowColorName=magnitudeXMLElement->getAttribute("ArrowColor");
00309 changeToLower(playerSettings.arrowColorName);
00310 playerSettings.arrowColorNameFlag=true;
00311 }
00312
00313 }
00314
00315 CC3DXMLElement *borderXMLElement=_xmlData->getFirstElement("Border");
00316 if(borderXMLElement){
00317
00318 playerSettings.advancedSettingsOn=true;
00319
00320 if(borderXMLElement->findAttribute("Color")){
00321 playerSettings.borderColorName=borderXMLElement->getAttribute("Color");
00322
00323 changeToLower(playerSettings.borderColorName);
00324 playerSettings.borderColorNameFlag=true;
00325 }
00326 if(borderXMLElement->findAttribute("BorderOn")){
00327 playerSettings.borderOn=borderXMLElement->getAttributeAsBool("BorderOn");
00328 playerSettings.borderOnFlag=true;
00329 }
00330 }
00331
00332 CC3DXMLElement *contourXMLElement=_xmlData->getFirstElement("Contour");
00333 if(contourXMLElement){
00334
00335 playerSettings.advancedSettingsOn=true;
00336
00337 if(contourXMLElement->findAttribute("Color")){
00338
00339 playerSettings.contourColorName=contourXMLElement->getAttribute("Color");
00340
00341
00342 changeToLower(playerSettings.contourColorName);
00343 playerSettings.contourColorNameFlag=true;
00344 }
00345
00346 if(contourXMLElement->findAttribute("ContourOn")){
00347 playerSettings.contourOn=contourXMLElement->getAttributeAsBool("ContourOn");
00348 playerSettings.contourOnFlag=true;
00349 }
00350 }
00351
00352 CC3DXMLElementList cellColorVecXML=_xmlData->getElements("Cell");
00353 for(int i = 0 ; i < cellColorVecXML.size() ; ++i ){
00354 playerSettings.advancedSettingsOn=true;
00355
00356 std::string color;
00357 unsigned short type;
00358
00359 type=(unsigned short)cellColorVecXML[i]->getAttributeAsUInt("Type");
00360 color=cellColorVecXML[i]->getAttributeAsUInt("Color");
00361
00362 playerSettings.typeToColorNameMap[type]=color;
00363 playerSettings.typeToColorNameMapFlag=true;
00364
00365 }
00366
00367 CC3DXMLElement *visContrXMLElement=_xmlData->getFirstElement("VisualControl");
00368 if(visContrXMLElement){
00369
00370 playerSettings.advancedSettingsOn=true;
00371
00372 if(visContrXMLElement->findAttribute("ZoomFactor")){
00373 playerSettings.zoomFactor=visContrXMLElement->getAttributeAsUInt("ZoomFactor");
00374 playerSettings.zoomFactorFlag=true;
00375 }
00376
00377 if(visContrXMLElement->findAttribute("ScreenshotFrequency")){
00378 playerSettings.screenshotFrequency=visContrXMLElement->getAttributeAsUInt("ScreenshotFrequency");
00379 playerSettings.screenshotFrequencyFlag=true;
00380 }
00381
00382 if(visContrXMLElement->findAttribute("ScreenUpdateFrequency")){
00383 playerSettings.screenUpdateFrequency=visContrXMLElement->getAttributeAsUInt("ScreenUpdateFrequency");
00384 playerSettings.screenUpdateFrequencyFlag=true;
00385 }
00386
00387 if(visContrXMLElement->findAttribute("NoOutput")){
00388 playerSettings.noOutputFlag=visContrXMLElement->getAttributeAsBool("NoOutput");
00389 playerSettings.noOutputFlagFlag=true;
00390 }
00391 }
00392
00393
00394 CC3DXMLElement *types3DInvisElement=_xmlData->getFirstElement("TypesInvisibleIn3D");
00395 if(types3DInvisElement){
00396
00397 playerSettings.advancedSettingsOn=true;
00398
00399 std::string typesInvisibleIn3DString=types3DInvisElement->getAttribute("Types");
00400 vector<string> typesInvisiblein3DVector;
00401 parseStringIntoList(typesInvisibleIn3DString,typesInvisiblein3DVector,",");
00402
00403 for(unsigned int i = 0 ; i < typesInvisiblein3DVector.size() ; ++i){
00404 playerSettings.types3DInvisible.push_back((unsigned short)BasicString::parseUInteger(typesInvisiblein3DVector[i]));
00405 }
00406
00407 playerSettings.types3DInvisibleFlag=true;
00408
00409 }
00410
00411 CC3DXMLElement *settingsXMLElement=_xmlData->getFirstElement("Settings");
00412 if(settingsXMLElement){
00413 if(settingsXMLElement->findAttribute("SaveSettings")){
00414 playerSettings.saveSettings=settingsXMLElement->getAttributeAsBool("SaveSettings");
00415 playerSettings.saveSettingsFlag=true;
00416
00417 }
00418 }
00419
00420 }
00421
00422
00423
00424