14 properties(
std::move(properties)),
16 pushToMemory(
std::move(pushToMemory)),
17 pullFromMemory(
std::move(pullFromMemory)),
18 isCommitRequired(false),
19 isUpdateRequired(true),
20 isMemoryVizRequired(true),
21 isMetaVizRequired(true)
23 placeholderOptions.emplace_back(
"Remove");
24 placeholderOptions.emplace_back(lineString);
39 storedPoses = update();
41 isUpdateRequired =
false;
48 isResetRequired =
false;
51 if (isMemoryVizRequired)
54 stage.
add(memoryLayer);
56 isMemoryVizRequired =
false;
59 if (isMetaVizRequired)
64 isMetaVizRequired =
false;
71 isCommitRequired =
false;
86 isMemoryVizRequired =
true;
88 return newRequestedPoses;
96 isMemoryVizRequired =
true;
107 remainingPoses.reserve(storedPoses.size());
108 for (objpose::ObjectPose& current : storedPoses)
110 bool isChanged = changes.
applyTo(current);
114 providingPoses.push_back(current.toProvidedObjectPoseGlobal());
115 objpose::ProvidedObjectPose& providing = providingPoses.back();
123 remainingPoses.push_back(current);
127 pushToMemory(providingPoses);
130 storedPoses = remainingPoses;
132 isMemoryVizRequired =
true;
136 Editor::visualizeMemory()
140 for (objpose::ObjectPose& objectPose : storedPoses)
144 visualizeObject(objectPose);
152 Editor::visualizeObject(objpose::ObjectPose& objectPose)
158 if (description.allowTransforming)
163 if (not description.options.empty())
169 .
pose(description.transform * objectPose.objectPoseGlobal)
174 if (description.alpha.has_value())
176 object.
alpha(description.alpha.value());
179 if (description.color.has_value())
188 changes.cloneObject(objectPose);
189 isMemoryVizRequired = true;
194 changes.deleteObject(objectPose);
195 isMemoryVizRequired = true;
200 changes.resetObject(objectPose);
201 isMemoryVizRequired = true;
206 const float defaultExtents = 100;
207 simox::OrientedBoxf box(
208 objectPose.objectPoseGlobal,
209 Eigen::Vector3f(defaultExtents, defaultExtents, defaultExtents));
211 box = objectPose.oobbGlobal().value_or(box);
212 box = box.transformed(changes.getTransform(objectPose));
214 placeholders.addPlaceholder(box);
215 isMetaVizRequired = true;
217 .
onContextMenu(description.commitIndex, [
this] { isCommitRequired = true; })
218 .
onContextMenu(description.updateIndex, [
this] { isUpdateRequired = true; })
219 .
onContextMenu(description.resetAllIndex, [
this] { isResetRequired = true; })
224 isMemoryVizRequired =
true;
229 Editor::visualizeMeta()
237 Editor::visualizePlaceholder(PlaceholderState::Placeholder
const& placeholder,
size_t id)
244 .
set(placeholder.box.transformed(placeholder.transform))
245 .
color(simox::Color::yellow(255, 128))
248 auto& observation = observer.
addObserved(metaLayer, box)
253 isMetaVizRequired =
true;
259 isMetaVizRequired =
true;
264 std::string
const&
object = placeholderOptions[
index];
266 observation.onContextMenu(
index,
271 isMetaVizRequired =
true;
272 isMemoryVizRequired =
true;
287 seq.insert(seq.begin(), newPoses.begin(), newPoses.end());
295 bool isChanged = iterator != changed.end();
299 auto& [name, change] = *iterator;
301 if (change.kind == DELETE)
317 editor->visualizeObject(objectPose);
326 auto iterator = changed.find(
object.objectID.str());
327 bool isChanged = iterator != changed.end();
329 ChangeKind kind = MOVE;
332 auto& [name, change] = *iterator;
338 size_t currentIndex = 0;
342 description.
options.emplace_back(
"Clone");
345 description.
options.emplace_back(
"Delete");
351 auto& [name, change] = *iterator;
353 description.
options.emplace_back(
"Reset");
356 description.
transform = change.transform;
358 const float alpha = 0.5;
363 description.
alpha = alpha;
376 description.
options.emplace_back(
"Create Placeholder");
379 description.
options.emplace_back(Editor::lineString);
382 description.
options.emplace_back(
"Commit All Changes");
385 description.
options.emplace_back(
"Update Unchanged");
388 description.
options.emplace_back(
"Reset All");
397 std::string suffix =
std::to_string(std::chrono::duration_cast<std::chrono::seconds>(
398 std::chrono::system_clock::now().time_since_epoch())
405 const float minOffset = 100;
406 float offset = minOffset;
407 if (
object.localOOBB.has_value())
409 Eigen::Vector3f size =
410 object.localOOBB.value().corner_max() -
object.localOOBB.value().corner_min();
411 float objectOffset = size.maxCoeff() / 2;
413 offset =
std::max(minOffset, objectOffset);
416 Change& clonedChange = changed[newPose.
objectID.
str()];
417 clonedChange.kind = CREATE;
419 clonedChange.transform = Eigen::Affine3f(Eigen::Translation3f(offset, offset, 0)).matrix();
420 clonedChange.iterator = std::prev(newPoses.end());
422 auto iterator = changed.find(
object.objectID.str());
423 if (iterator != changed.end())
425 auto& [name, originalChange] = *iterator;
426 clonedChange.transform *= originalChange.transform;
433 std::string suffix =
std::to_string(std::chrono::duration_cast<std::chrono::seconds>(
434 std::chrono::system_clock::now().time_since_epoch())
443 newPose.
objectType = objpose::ObjectType::KnownObject;
450 std::optional<armarx::ObjectInfo> info = editor->objectFinder.
findObject(
id);
451 if (info.has_value())
458 pose * newPose.
localOOBB->transformation_centered().inverse();
462 Change& createdChange = changed[newPose.
objectID.
str()];
463 createdChange.kind = CREATE;
465 createdChange.iterator = std::prev(newPoses.end());
471 changed[
object.objectID.str()].kind = DELETE;
477 auto iterator = changed.find(
object.objectID.str());
478 if (iterator != changed.end())
480 auto& [name, change] = *iterator;
482 if (change.kind == CREATE)
484 newPoses.erase(change.iterator);
487 changed.erase(iterator);
494 Change& change = changed[
object.objectID.str()];
495 change.transform =
transform * change.transform;
503 auto iterator = changed.find(
object.objectID.str());
504 if (iterator != changed.end())
506 auto& [name, change] = *iterator;
518 auto& entry = placeholders[id];
520 entry.isActive =
true;
526 for (
size_t id = 0;
id < placeholders.size();
id++)
528 auto& entry = placeholders[id];
532 editor->visualizePlaceholder(entry.placeholder,
id);
540 auto& placeholder = placeholders[id].placeholder;
541 placeholder.transform =
transform * placeholder.transform;
547 placeholders[id].isActive =
false;
553 PlaceholderState::getID()
555 if (unusedIDs.empty())
557 size_t id = placeholders.size();
558 placeholders.push_back({Placeholder(),
false});
562 size_t id = unusedIDs.top();
569 std::string
const& objectID,
572 auto& placeholder = placeholders[id].placeholder;
575 placeholder.box.transformed(placeholder.transform).transformation_centered();