Methods to support Toponaming element maps

This commit is contained in:
Zheng, Lei
2024-05-01 18:02:04 -04:00
committed by bgbsww
parent b17f744ed7
commit 56e32b9c98
6 changed files with 473 additions and 23 deletions

View File

@@ -26,6 +26,7 @@
#include <App/GeoFeaturePy.h>
#include "ComplexGeoData.h"
#include "Document.h"
#include "GeoFeature.h"
#include "GeoFeatureGroupExtension.h"
#include "ElementNamingUtils.h"
@@ -146,12 +147,27 @@ DocumentObject *GeoFeature::resolveElement(DocumentObject *obj, const char *subn
subname = "";
const char *element = Data::findElementName(subname);
if(_element) *_element = element;
#ifdef FC_USE_TNP_FIX
elementName.first.clear();
elementName.second.clear();
auto sobj = obj->getSubObject(std::string(subname, element).c_str());
if(!sobj)
return nullptr;
auto linked = sobj->getLinkedObject(true);
auto geo = Base::freecad_dynamic_cast<GeoFeature>(linked);
// if(!geo && linked) {
// auto ext = linked->getExtensionByType<LinkBaseExtension>(true);
// if(ext)
// geo = Base::freecad_dynamic_cast<GeoFeature>(ext->getTrueLinkedObject(true));
// }
#else
auto sobj = obj->getSubObject(subname);
if(!sobj)
return nullptr;
obj = sobj->getLinkedObject(true);
auto geo = dynamic_cast<GeoFeature*>(obj);
if(geoFeature)
#endif
if(geoFeature)
*geoFeature = geo;
if(!obj || (filter && obj!=filter))
return nullptr;
@@ -189,3 +205,81 @@ void GeoFeature::setMaterialAppearance(const App::Material& material)
{
Q_UNUSED(material)
}
#ifdef FC_USE_TNP_FIX
bool GeoFeature::hasMissingElement(const char *subname) {
return Data::hasMissingElement(subname);
if(!subname)
return false;
auto dot = strrchr(subname,'.');
if(!dot)
return subname[0]=='?';
return dot[1]=='?';
}
void GeoFeature::updateElementReference() {
auto prop = getPropertyOfGeometry();
if(!prop) return;
auto geo = prop->getComplexData();
if(!geo) return;
bool reset = false;
// auto version = getElementMapVersion(prop);
// if(_ElementMapVersion.getStrValue().empty())
// _ElementMapVersion.setValue(version);
// else if(_ElementMapVersion.getStrValue()!=version) {
// reset = true;
// _ElementMapVersion.setValue(version);
// }
PropertyLinkBase::updateElementReferences(this,reset);
}
void GeoFeature::onChanged(const Property *prop) {
if(prop==getPropertyOfGeometry()) {
if(getDocument() && !getDocument()->testStatus(Document::Restoring)
&& !getDocument()->isPerformingTransaction())
{
updateElementReference();
}
}
DocumentObject::onChanged(prop);
}
//void GeoFeature::onDocumentRestored() {
// if(!getDocument()->testStatus(Document::Status::Importing))
// _ElementMapVersion.setValue(getElementMapVersion(getPropertyOfGeometry(),true));
// DocumentObject::onDocumentRestored();
//}
//const std::vector<std::string>&
//GeoFeature::searchElementCache(const std::string &element,
// Data::SearchOptions options,
// double tol,
// double atol) const
//{
// static std::vector<std::string> none;
// (void)element;
// (void)options;
// (void)tol;
// (void)atol;
// return none;
//}
//const std::vector<const char *>&
//GeoFeature::getElementTypes(bool /*all*/) const
//{
// static std::vector<const char *> nil;
// auto prop = getPropertyOfGeometry();
// if (!prop)
// return nil;
// return prop->getComplexData()->getElementTypes();
//}
std::vector<Data::IndexedName>
GeoFeature::getHigherElements(const char *element, bool silent) const
{
auto prop = getPropertyOfGeometry();
if (!prop)
return {};
return prop->getComplexData()->getHigherElements(element, silent);
}
#endif