SECObjectRelations.cpp
Go to the documentation of this file.
1/*
2* This file is part of ArmarX.
3*
4* ArmarX is free software; you can redistribute it and/or modify
5* it under the terms of the GNU General Public License version 2 as
6* published by the Free Software Foundation.
7*
8* ArmarX is distributed in the hope that it will be useful, but
9* WITHOUT ANY WARRANTY; without even the implied warranty of
10* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11* GNU General Public License for more details.
12*
13* You should have received a copy of the GNU General Public License
14* along with this program. If not, see <http://www.gnu.org/licenses/>.
15*
16* @package MemoryX::
17* @author Mirko Waechter ( mirko.waechter at kit dot edu)
18* @date 2013
19* @copyright http://www.gnu.org/licenses/gpl-2.0.txt
20* GNU General Public License
21*/
22
23#include "SECObjectRelations.h"
24
26
28#include "SECRelation.h"
29
30namespace memoryx
31{
32
36
37 armarx::VariantDataClassPtr
38 SECObjectRelations::clone(const Ice::Current&) const
39 {
41
42 for (SECRelationList::const_iterator it = relations.begin(); it != relations.end(); it++)
43 {
44 result->relations.push_back(SECRelationBasePtr::dynamicCast((*it)->ice_clone()));
45 }
46
47 return result;
48 }
49
50 Ice::ObjectPtr
52 {
53 return clone();
54 }
55
56 Ice::Float
57 SECObjectRelations::contains(const SECObjectRelationsBasePtr& other, const Ice::Current&) const
58 {
59 float matchingRelationCount = 0;
60
61 for (SECRelationList::const_iterator itOther = other->relations.begin();
62 itOther != other->relations.end();
63 itOther++)
64 {
65 bool foundMatch = false;
66 SECRelationBasePtr otherRel = *itOther;
67
68 for (SECRelationList::const_iterator it = relations.begin(); it != relations.end();
69 it++)
70 {
71 if (otherRel->isEqual(*it))
72 {
73 foundMatch = true;
74 break;
75 }
76 }
77
78 if (foundMatch)
79 {
80 matchingRelationCount++;
81 }
82 }
83
84 return matchingRelationCount / (float)relations.size();
85 }
86
87 bool
88 SECObjectRelations::containsRelation(const SECRelationBasePtr& relation,
89 const Ice::Current&) const
90 {
91 for (SECRelationList::const_iterator it = relations.begin(); it != relations.end(); it++)
92 {
93 if (relation->isEqual(*it))
94 {
95 return true;
96 }
97 }
98
99 return false;
100 }
101
102 Ice::Int
103 SECObjectRelations::addRelations(const SECRelationList& newRelations, const Ice::Current&)
104 {
105 int insertCount = 0;
106
107 for (unsigned int i = 0; i < newRelations.size(); i++)
108 {
109 SECRelationBasePtr rel = containsRelationBetweenObjects(newRelations.at(i)->objects1,
110 newRelations.at(i)->objects2);
111
112 // ARMARX_VERBOSE_S << "Adding relation: " << newRelations.at(i)->output();
113 if (rel)
114 {
115 rel->setName(newRelations.at(i)->getName());
116 }
117 else
118 {
119 relations.push_back(newRelations.at(i));
120 insertCount++;
121 }
122 }
123
124 return insertCount;
125 }
126
127 bool
128 SECObjectRelations::addRelation(const SECRelationBasePtr& newRelation, const Ice::Current& c)
129 {
130 SECRelationList list;
131 list.push_back(newRelation);
132 return (addRelations(list) != 0);
133 }
134
135 SECRelationBasePtr
137 const ObjectClassList& objects2,
138 const Ice::Current&) const
139 {
140 SECRelation relation("", objects1, objects2);
141
142 for (SECRelationList::const_iterator it = relations.begin(); it != relations.end(); it++)
143 {
144 if (relation.hasEqualObjects(*it))
145 {
146 return *it;
147 }
148 }
149
150 return NULL;
151 }
152
153 ObjectClassList
154 SECObjectRelations::getObjectsInRelation(const SECRelationBasePtr& relation,
155 ObjectClassBasePtr object1)
156 {
157
158 ObjectClassList result;
159
160 for (SECRelationList::const_iterator it = relations.begin(); it != relations.end(); it++)
161 {
162 if ((*it)->getName() == relation->getName() &&
163 ObjectClassMemorySegment::ListContainsObject((*it)->objects1, object1))
164 {
165 result.insert(result.end(), (*it)->objects2.begin(), (*it)->objects2.end());
166 }
167 }
168
169 return result;
170 }
171
172 bool
173 SECObjectRelations::isEqual(const SECObjectRelations& compareRelations) const
174 {
175 bool result = true;
176
177 for (const SECRelationBasePtr& relation : compareRelations.relations)
178 {
179 result &= this->containsRelation(relation);
180 }
181
182 return result;
183 }
184
185 std::string
186 SECObjectRelations::output(const Ice::Current&) const
187 {
188 std::stringstream result;
189
190 for (size_t i = 0; i < relations.size(); i++)
191 {
192 result << "#" << i << ": " << relations.at(i)->output() << "\n";
193 }
194
195 return result.str();
196 }
197
198 Ice::Int
199 SECObjectRelations::getType(const Ice::Current&) const
200 {
202 }
203
204 bool
205 SECObjectRelations::validate(const Ice::Current&)
206 {
207 return true;
208 }
209
210 void
211 SECObjectRelations::serialize(const armarx::ObjectSerializerBasePtr& serializer,
212 const Ice::Current&) const
213 {
215 armarx::AbstractObjectSerializerPtr::dynamicCast(serializer);
216 std::vector<armarx::VariantBasePtr> variants;
217
218 for (unsigned int i = 0; i < relations.size(); i++)
219 {
220 armarx::VariantPtr var = new armarx::Variant(relations.at(i));
221 variants.push_back(var);
222 }
223
224 obj->setVariantArray("relations", variants);
225 }
226
227 void
228 SECObjectRelations::deserialize(const armarx::ObjectSerializerBasePtr& serializer,
229 const Ice::Current&)
230 {
232 armarx::AbstractObjectSerializerPtr::dynamicCast(serializer);
233 std::vector<armarx::VariantPtr> variants;
234
235 obj->getVariantArray("relations", variants);
236 relations.resize(variants.size());
237
238 for (unsigned int i = 0; i < variants.size(); i++)
239 {
240
241 relations.at(i) = armarx::VariantPtr::dynamicCast(variants.at(i))->get<SECRelation>();
242 }
243 }
244} // namespace memoryx
#define float
Definition 16_Level.h:22
constexpr T c
The Variant class is described here: Variants.
Definition Variant.h:224
static bool ListContainsObject(const ObjectClassList &objects, ObjectClassBasePtr object)
std::string output(const Ice::Current &c=Ice::emptyCurrent) const override
ObjectClassList getObjectsInRelation(const SECRelationBasePtr &relation, ObjectClassBasePtr object1)
bool isEqual(const SECObjectRelations &relations) const
bool containsRelation(const SECRelationBasePtr &relation, const Ice::Current &c=Ice::emptyCurrent) const override
void deserialize(const armarx::ObjectSerializerBasePtr &serializer, const Ice::Current &c=Ice::emptyCurrent) override
void serialize(const armarx::ObjectSerializerBasePtr &serializer, const Ice::Current &c=Ice::emptyCurrent) const override
bool validate(const Ice::Current &c=Ice::emptyCurrent) override
armarx::VariantDataClassPtr clone(const Ice::Current &c=Ice::emptyCurrent) const override
Ice::Int getType(const Ice::Current &c=Ice::emptyCurrent) const override
Ice::ObjectPtr ice_clone() const override
Ice::Int addRelations(const SECRelationList &newRelations, const Ice::Current &c=Ice::emptyCurrent) override
bool addRelation(const SECRelationBasePtr &newRelation, const Ice::Current &c=Ice::emptyCurrent) override
Ice::Float contains(const SECObjectRelationsBasePtr &other, const Ice::Current &c=Ice::emptyCurrent) const override
SECRelationBasePtr containsRelationBetweenObjects(const ObjectClassList &objects1, const ObjectClassList &objects2, const Ice::Current &c=Ice::emptyCurrent) const override
bool hasEqualObjects(const SECRelationBasePtr &other, const Ice::Current &c=Ice::emptyCurrent) override
IceInternal::Handle< Variant > VariantPtr
Definition Variant.h:41
IceInternal::Handle< AbstractObjectSerializer > AbstractObjectSerializerPtr
const armarx::VariantTypeId SECObjectRelations
VirtualRobot headers.
IceInternal::Handle< SECObjectRelations > SECObjectRelationsPtr