38 m_structure(structure),
39 m_buildSpec(buildSpec)
41 createTree(*
this, structure);
47 m_structure(structure),
48 m_buildSpec(buildSpec)
50 createTree(*
this, structure);
53 tgStructureInfo::~tgStructureInfo()
56 for (std::size_t i = 0; i < m_compounded.size(); i++)
58 const tgRigidInfo *
const pRigidInfo = m_compounded[i];
59 assert(pRigidInfo != NULL);
68 for (std::size_t i = 0; i < m_rigids.size(); i++)
73 for (std::size_t i = 0; i < m_connectors.size(); i++)
75 delete m_connectors[i];
78 for (std::size_t i = 0; i < m_children.size(); i++)
87 const std::vector<tgStructure*> children = structure.
getChildren();
88 for (
int i = 0; i < children.size(); i++)
91 assert(pStructure != NULL);
94 structureInfo.addChild(pStructureInfo);
95 createTree(*pStructureInfo, *pStructure);
99 std::vector<tgRigidInfo*> tgStructureInfo::getAllRigids()
const
101 std::vector<tgRigidInfo*> result;
102 result.insert(result.end(), m_rigids.begin(), m_rigids.end());
105 for (
int i = 0; i < m_children.size(); i++)
108 assert(pStructureInfo != NULL);
109 std::vector<tgRigidInfo*> childRigids = pStructureInfo->getAllRigids();
110 result.insert(result.end(), childRigids.begin(), childRigids.end());
120 void tgStructureInfo::initRigidInfo()
124 const std::vector<tgBuildSpec::RigidAgent*> rigidAgents = m_buildSpec.getRigidAgents();
126 for (
int i = 0; i < rigidAgents.size(); i++)
129 assert(pRigidAgent != NULL);
131 tgRigidInfo* pRigidInfo = pRigidAgent->infoFactory;
132 assert(pRigidInfo != NULL);
135 std::vector<tgRigidInfo*> nodeRigids =
136 pRigidInfo->createRigidInfos(m_structure.
getNodes(), tagSearch);
137 m_rigids.insert(m_rigids.end(), nodeRigids.begin(), nodeRigids.end());
140 std::vector<tgRigidInfo*> pairRigids =
141 pRigidInfo->createRigidInfos(m_structure.
getPairs(), tagSearch);
142 m_rigids.insert(m_rigids.end(), pairRigids.begin(), pairRigids.end());
147 for (
int i = 0; i < m_children.size(); i++)
150 assert(pStructureInfo != NULL);
151 pStructureInfo->initRigidInfo();
155 void tgStructureInfo::autoCompoundRigids()
158 m_compounded = c.execute();
161 void tgStructureInfo::initConnectorInfo()
166 const std::vector<tgBuildSpec::ConnectorAgent*> connectorAgents =
167 m_buildSpec.getConnectorAgents();
169 for (
int i = 0; i < connectorAgents.size(); i++)
172 assert(pConnectorAgent != NULL);
173 tgTagSearch& tagSearch = pConnectorAgent->tagSearch;
175 assert(pConnectorInfo != NULL);
180 std::vector<tgConnectorInfo*> pairConnectors =
181 pConnectorInfo->createConnectorInfos(m_structure.
getPairs(), tagSearch);
182 m_connectors.insert(m_connectors.end(), pairConnectors.begin(),
183 pairConnectors.end());
188 for (
int i = 0; i < m_children.size(); i++)
191 assert(pStructureInfo != NULL);
192 pStructureInfo->initConnectorInfo();
196 void tgStructureInfo::chooseConnectorRigids()
198 chooseConnectorRigids(getAllRigids());
201 void tgStructureInfo::chooseConnectorRigids(std::vector<tgRigidInfo*> allRigids)
203 for (
int i = 0; i < m_connectors.size(); i++)
206 assert(pConnectorInfo != NULL);
207 pConnectorInfo->chooseRigids(allRigids);
211 for (
int i = 0; i < m_children.size(); i++)
214 assert(pStructureInfo != NULL);
215 pStructureInfo->chooseConnectorRigids(allRigids);
219 void tgStructureInfo::initRigidBodies(
tgWorld& world)
222 for (
int i = 0; i < m_rigids.size(); i++)
225 assert(pRigidInfo != NULL);
226 pRigidInfo->initRigidBody(world);
230 for (
int i = 0; i < m_children.size(); i++)
233 assert(pStructureInfo != NULL);
234 pStructureInfo->initRigidBodies(world);
238 void tgStructureInfo::initConnectors(
tgWorld& world)
241 for (
int i = 0; i < m_connectors.size(); i++)
244 assert(pConnectorInfo != NULL);
245 pConnectorInfo->initConnector(world);
249 for (
int i = 0; i < m_children.size(); i++)
252 assert(pStructureInfo != NULL);
253 pStructureInfo->initConnectors(world);
261 autoCompoundRigids();
263 chooseConnectorRigids();
264 initRigidBodies(world);
267 initConnectors(world);
269 buildIntoHelper(model, world, *
this);
272 void tgStructureInfo::buildIntoHelper(
tgModel& model,
tgWorld& world,
276 const std::vector<tgRigidInfo*> rigids = structureInfo.getRigids();
277 for (
int i = 0; i < rigids.size(); i++)
280 assert(pRigidInfo != NULL);
281 tgModel*
const pModel = pRigidInfo->createModel(world);
284 pModel->setTags(pRigidInfo->getTags());
289 const std::vector<tgConnectorInfo*> connectors = structureInfo.getConnectors();
290 for (
int i = 0; i < connectors.size(); i++)
293 assert(pConnectorInfo != NULL);
294 tgModel*
const pModel = pConnectorInfo->createModel(world);
297 pModel->setTags(pConnectorInfo->getTags());
302 const std::vector<tgStructureInfo*> children = structureInfo.getChildren();
303 for (
int i = 0; i < children.size(); i++)
306 assert(pStructureInfo != NULL);
308 assert(pModel != NULL);
309 buildIntoHelper(*pModel, world, *pStructureInfo);
313 model.setTags(structureInfo.getTags());
320 throw std::invalid_argument(
"Child is NULL");
324 m_children.push_back(pChild);
328 std::string tgStructureInfo::toString(
const std::string& prefix)
const
331 std::ostringstream os;
332 os << prefix <<
"tgStructureInfo(" << std::endl;
334 os << prefix << p <<
"Rigids:" << std::endl;
335 for (
int i = 0; i < m_rigids.size(); i++) {
336 os << prefix << p << p << *(m_rigids[i]) << std::endl;
339 os << prefix << p <<
"Connectors:" << std::endl;
340 for (
int i = 0; i < m_connectors.size(); i++) {
341 os << prefix << p << p << *(m_connectors[i]) << std::endl;
344 os << prefix << p <<
"Children:" << std::endl;
345 for (
int i = 0; i < m_children.size(); i++) {
346 os << m_children[i]->toString(prefix + p + p) << std::endl;
349 os << prefix << p <<
"Tags: [" << getTags() <<
"]" << std::endl;
351 os << prefix <<
")" << std::endl;
358 os << obj.toString() << std::endl;
const std::vector< tgStructure * > & getChildren() const
void addChild(tgModel *pChild)
virtual tgRigidInfo * getRigidInfoGroup()
const tgNodes & getNodes() const
const tgPairs & getPairs() const
Definition of class tgConnectorInfo.
Definition of class tgStructure.
Definition of class tgStructureInfo.
std::ostream & operator<<(std::ostream &os, const tgStructureInfo &obj)
Definition of class tgBuildSpec.
Definition of class tgRigidAutoCompound.