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 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 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 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 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128
|
/*****************************************************************************
* $CAMITK_LICENCE_BEGIN$
*
* CamiTK - Computer Assisted Medical Intervention ToolKit
* (c) 2001-2016 Univ. Grenoble Alpes, CNRS, TIMC-IMAG UMR 5525 (GMCAO)
*
* Visit http://camitk.imag.fr for more information
*
* This file is part of CamiTK.
*
* CamiTK is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License version 3
* only, as published by the Free Software Foundation.
*
* CamiTK 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 version 3 for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* version 3 along with CamiTK. If not, see <http://www.gnu.org/licenses/>.
*
* $CAMITK_LICENCE_END$
****************************************************************************/
#include "MultiComponent.h"
// ------------------ default constructor ---------------------
MultiComponent::MultiComponent(PhysicalModel *p) : Component(p) {
components.clear();
}
// ------------------ constructor with name ---------------------
MultiComponent::MultiComponent(PhysicalModel *p, std::string n) : Component(p,n) {
components.clear();
};
// ------------------ destructor ---------------------
MultiComponent::~MultiComponent() {
deleteProperties();
deleteAllSubComponents();
// tell all parents that I am going away to the paradise of pointers
removeFromParents();
}
// ------------------ deleteAllSubComponents ---------------------
void MultiComponent::deleteAllSubComponents() {
for (unsigned int i=0 ; i<components.size() ; i++)
delete components[i];
components.clear();
}
// --------------- xmlPrint ---------------
void MultiComponent::xmlPrint(std::ostream &o) const {
if (getNumberOfSubComponents()>0) {
o << "<multiComponent";
if (getName() != "")
o<< " name=\"" << getName().c_str() << "\"";
// print extra properties
for(unsigned int i=0; i<properties->numberOfFields(); i++)
o << " "<< properties->getField(i) << "=\"" << properties->getString(properties->getField(i)) << "\"";
o << ">" << std::endl;
for (unsigned int i=0; i<components.size(); i++) {
components[i]->xmlPrint(o);
}
o << "</multiComponent>" << std::endl;
}
}
// --------------- getNumberOfCells ---------------
unsigned int MultiComponent::getNumberOfCells() const {
unsigned int nrOfCells = 0;
// add all the cells of all the sub components
for (unsigned int i=0; i<components.size(); i++) {
nrOfCells += components[i]->getNumberOfCells();
}
return nrOfCells;
}
// --------------- getCell ---------------
Cell * MultiComponent::getCell(unsigned int cellOrderNr) const {
bool found;
unsigned int i;
unsigned int startOrderNr;
unsigned int nrOfCells;
if (components.size() == 0)
return NULL;
// check in which component this cell is
i = 0;
startOrderNr = 0;
do {
nrOfCells = components[i]->getNumberOfCells();
found = (cellOrderNr>=startOrderNr && cellOrderNr<(startOrderNr+nrOfCells));
startOrderNr += nrOfCells;
} while (!found && ++i<components.size());
// get it
return components[i]->getCell(cellOrderNr - (startOrderNr - nrOfCells));
}
// --------------- isVisible ---------------
bool MultiComponent::isVisible(const RenderingMode::Mode mode) const {
unsigned int i = 0;
while (i<components.size() && !components[i]->isVisible(mode))
i++;
return (i!=components.size());
}
// --------------- isVisible ---------------
void MultiComponent::setVisible(const RenderingMode::Mode mode, const bool b) {
// set all subcomponents
for (unsigned int i=0; i<components.size(); i++)
components[i]->setVisible(mode, b);
}
// --------------- setPhysicalModel ---------------
void MultiComponent::setPhysicalModel(PhysicalModel* pm) {
Component::setPhysicalModel(pm);
for (unsigned int i=0; i<components.size(); i++)
components[i]->setPhysicalModel(pm);
}
|