Measure: Reduce boilerplate code by adding some helper methods

This commit is contained in:
hlorus
2024-07-17 17:53:12 +02:00
parent e4c707b989
commit bb7f84c32a
10 changed files with 93 additions and 190 deletions

View File

@@ -58,19 +58,7 @@ bool MeasureLength::isValidSelection(const App::MeasureSelection& selection){
}
for (auto element : selection) {
auto objT = element.object;
App::DocumentObject* ob = objT.getObject();
const std::string& subName = objT.getSubName();
const char* className = objT.getSubObject()->getTypeId().getName();
std::string mod = Base::Type::getModuleName(className);
if (!hasGeometryHandler(mod)) {
return false;
}
App::MeasureHandler handler = App::MeasureManager::getMeasureHandler(mod.c_str());
App::MeasureElementType type = handler.typeCb(ob, subName.c_str());
auto type = App::MeasureManager::getMeasureElementType(element);
if (type == App::MeasureElementType::INVALID) {
return false;
@@ -91,7 +79,7 @@ void MeasureLength::parseSelection(const App::MeasureSelection& selection) {
std::vector<std::string> subElements;
for (auto element : selection) {
auto objT = element.object;
auto objT = element.object;
objects.push_back(objT.getObject());
subElements.push_back(objT.getSubName());
@@ -116,19 +104,13 @@ void MeasureLength::recalculateLength()
// Loop through Elements and call the valid geometry handler
for (std::vector<App::DocumentObject*>::size_type i=0; i<objects.size(); i++) {
App::DocumentObject *object = objects.at(i);
std::string subElement = subElements.at(i);
// Get the Geometry handler based on the module
const char* className = object->getSubObject(subElement.c_str())->getTypeId().getName();
const std::string& mod = Base::Type::getModuleName(className);
auto handler = getGeometryHandler(mod);
if (!handler) {
throw Base::RuntimeError("No geometry handler available for submitted element type");
App::SubObjectT subject{objects.at(i), subElements.at(i).c_str()};
auto info = getMeasureInfo(subject);
if (!info || !info->valid) {
continue;
}
App::SubObjectT subject{object, subElement.c_str()};
auto info = handler(subject);
auto lengthInfo = std::dynamic_pointer_cast<Part::MeasureLengthInfo>(info);
result += lengthInfo->length;
}
@@ -158,18 +140,12 @@ Base::Placement MeasureLength::getPlacement() {
return Base::Placement();
}
App::DocumentObject* object = objects.front();
std::string subElement = subElements.front();
const char* className = object->getSubObject(subElement.c_str())->getTypeId().getName();
const std::string& mod = Base::Type::getModuleName(className);
auto handler = getGeometryHandler(mod);
if (!handler) {
throw Base::RuntimeError("No geometry handler available for submitted element type");
App::SubObjectT subject{objects.front(), subElements.front().c_str()};
auto info = getMeasureInfo(subject);
if (!info || !info->valid) {
return {};
}
App::SubObjectT subject{object, subElement.c_str()};
auto info = handler(subject);
auto lengthInfo = std::dynamic_pointer_cast<Part::MeasureLengthInfo>(info);
return lengthInfo->placement;
}