Toponaming/Part: Cleanups, problem fixes, and tests
This commit is contained in:
@@ -398,6 +398,7 @@ PyMOD_INIT_FUNC(Part)
|
||||
Part::PropertyGeometryList ::init();
|
||||
Part::PropertyShapeHistory ::init();
|
||||
Part::PropertyFilletEdges ::init();
|
||||
Part::PropertyShapeCache ::init();
|
||||
Part::PropertyTopoShapeList ::init();
|
||||
|
||||
Part::FaceMaker ::init();
|
||||
|
||||
@@ -771,15 +771,15 @@ void AttachEngine::readLinks(const App::PropertyLinkSubList &references,
|
||||
}
|
||||
App::GeoFeature* geof = static_cast<App::GeoFeature*>(objs[i]);
|
||||
geofs[i] = geof;
|
||||
const Part::TopoShape* shape;
|
||||
Part::TopoShape shape;
|
||||
if (geof->isDerivedFrom(Part::Feature::getClassTypeId())){
|
||||
shape = &(static_cast<Part::Feature*>(geof)->Shape.getShape());
|
||||
if (shape->isNull()){
|
||||
shape = (static_cast<Part::Feature*>(geof)->Shape.getShape());
|
||||
if (shape.isNull()){
|
||||
throw AttachEngineException("AttachEngine3D: Part has null shape");
|
||||
}
|
||||
if (sub[i].length()>0){
|
||||
try{
|
||||
storage.push_back(shape->getSubShape(sub[i].c_str()));
|
||||
storage.push_back(shape.getSubShape(sub[i].c_str()));
|
||||
} catch (Standard_Failure&){
|
||||
throw AttachEngineException("AttachEngine3D: subshape not found");
|
||||
}
|
||||
@@ -787,7 +787,7 @@ void AttachEngine::readLinks(const App::PropertyLinkSubList &references,
|
||||
throw AttachEngineException("AttachEngine3D: null subshape");
|
||||
shapes[i] = &(storage[storage.size()-1]);
|
||||
} else {
|
||||
shapes[i] = &(shape->getShape());
|
||||
shapes[i] = &(shape.getShape());
|
||||
}
|
||||
} else if ( geof->isDerivedFrom(App::Plane::getClassTypeId()) ){
|
||||
//obtain Z axis and origin of placement
|
||||
|
||||
@@ -103,8 +103,10 @@ TopoShape PropertyPartShape::getShape() const
|
||||
{
|
||||
_Shape.initCache(-1);
|
||||
auto res = _Shape;
|
||||
// if (Feature::isElementMappingDisabled(getContainer()))
|
||||
if ( false ) // TODO Implement
|
||||
// March, 2024 Toponaming project: There was originally an unused feature to disable elementMapping
|
||||
// that has not been kept:
|
||||
// if (Feature::isElementMappingDisabled(getContainer()))
|
||||
if ( false )
|
||||
res.Tag = -1;
|
||||
else if (!res.Tag) {
|
||||
if (auto parent = Base::freecad_dynamic_cast<App::DocumentObject>(getContainer()))
|
||||
@@ -184,7 +186,9 @@ void PropertyPartShape::setPyObject(PyObject *value)
|
||||
shape = res;
|
||||
}else{
|
||||
shape.Tag = owner->getID();
|
||||
shape.Hasher->clear(); // reset();
|
||||
if ( shape.Hasher ) { // TODO: This null guard added during TNP transition
|
||||
shape.Hasher->clear();
|
||||
}
|
||||
}
|
||||
}
|
||||
setValue(shape);
|
||||
@@ -200,20 +204,15 @@ App::Property *PropertyPartShape::Copy() const
|
||||
{
|
||||
PropertyPartShape *prop = new PropertyPartShape();
|
||||
|
||||
// March, 2024 Toponaming project: There was originally a feature to enable making an element
|
||||
// copy ( new geometry and map ) that has not been kept:
|
||||
// if (PartParams::getShapePropertyCopy()) {
|
||||
if ( false ) { // TODO: PartParams
|
||||
// makeElementCopy() consume too much memory for complex geometry.
|
||||
prop->_Shape = this->_Shape.makeElementCopy();
|
||||
} else
|
||||
prop->_Shape = this->_Shape;
|
||||
prop->_Ver = this->_Ver;
|
||||
|
||||
// // makeElementCopy() consume too much memory for complex geometry.
|
||||
// prop->_Shape = this->_Shape.makeElementCopy();
|
||||
// } else
|
||||
// prop->_Shape = this->_Shape;
|
||||
prop->_Shape = this->_Shape;
|
||||
if (!_Shape.getShape().IsNull()) {
|
||||
BRepBuilderAPI_Copy copy(_Shape.getShape());
|
||||
prop->_Shape.setShape(copy.Shape());
|
||||
}
|
||||
|
||||
prop->_Ver = this->_Ver;
|
||||
return prop;
|
||||
}
|
||||
|
||||
@@ -348,6 +347,7 @@ void PropertyPartShape::Restore(Base::XMLReader &reader)
|
||||
reader.addFile(file.c_str(),this);
|
||||
}
|
||||
}
|
||||
|
||||
#ifdef NOT_YET_AND_MAYBE_NEVER
|
||||
void PropertyPartShape::Restore(Base::XMLReader &reader)
|
||||
{
|
||||
@@ -433,7 +433,6 @@ void PropertyPartShape::Restore(Base::XMLReader &reader)
|
||||
hasSetValue();
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
void PropertyPartShape::afterRestore()
|
||||
{
|
||||
@@ -447,6 +446,7 @@ void PropertyPartShape::afterRestore()
|
||||
_Shape.Hasher->clear(); //reset();
|
||||
PropertyComplexGeoData::afterRestore();
|
||||
}
|
||||
#endif
|
||||
|
||||
// The following function is copied from OCCT BRepTools.cxx and modified
|
||||
// to disable saving of triangulation
|
||||
@@ -912,6 +912,10 @@ void PropertyShapeCache::Restore(Base::XMLReader &)
|
||||
{
|
||||
}
|
||||
|
||||
/**
|
||||
* Make a new python List with a tuple for each cache entry containing the key and the shape
|
||||
* @return the python list
|
||||
*/
|
||||
PyObject *PropertyShapeCache::getPyObject() {
|
||||
Py::List res;
|
||||
for(auto &v : cache)
|
||||
@@ -919,6 +923,10 @@ PyObject *PropertyShapeCache::getPyObject() {
|
||||
return Py::new_reference_to(res);
|
||||
}
|
||||
|
||||
/**
|
||||
* Remove the cache entries for every element in the list
|
||||
* @param value A python list of entry names
|
||||
*/
|
||||
void PropertyShapeCache::setPyObject(PyObject *value) {
|
||||
if(!value)
|
||||
return;
|
||||
@@ -933,6 +941,12 @@ void PropertyShapeCache::setPyObject(PyObject *value) {
|
||||
}
|
||||
|
||||
#define SHAPE_CACHE_NAME "_Part_ShapeCache"
|
||||
/**
|
||||
* Find or create the shape cache for a document object
|
||||
* @param obj The document object
|
||||
* @param create True if we should create the cache if it doesn't exist
|
||||
* @return The shape cache, or null if we aren't creating and it doesn't exist
|
||||
*/
|
||||
PropertyShapeCache *PropertyShapeCache::get(const App::DocumentObject *obj, bool create) {
|
||||
auto prop = Base::freecad_dynamic_cast<PropertyShapeCache>(
|
||||
obj->getDynamicPropertyByName(SHAPE_CACHE_NAME));
|
||||
@@ -953,9 +967,18 @@ PropertyShapeCache *PropertyShapeCache::get(const App::DocumentObject *obj, bool
|
||||
return prop;
|
||||
}
|
||||
|
||||
/**
|
||||
* Look up and return a shape in the cache
|
||||
* @param obj The document object to look in
|
||||
* @param shape The found shape is returned here
|
||||
* @param subname The key to look up
|
||||
* @return True if the name was found
|
||||
*/
|
||||
bool PropertyShapeCache::getShape(const App::DocumentObject *obj, TopoShape &shape, const char *subname) {
|
||||
// March, 2024 Toponaming project: There was originally a feature to disable shape cache
|
||||
// that has not been kept:
|
||||
// if (PartParams::getDisableShapeCache())
|
||||
// return false; //TODO PartParams
|
||||
// return false;
|
||||
auto prop = get(obj,false);
|
||||
if(!prop)
|
||||
return false;
|
||||
@@ -968,11 +991,19 @@ bool PropertyShapeCache::getShape(const App::DocumentObject *obj, TopoShape &sha
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Find or create the property shape cache in a document object and then add an entry
|
||||
* @param obj The Object
|
||||
* @param shape The shape to cache
|
||||
* @param subname The key to point at that shape
|
||||
*/
|
||||
void PropertyShapeCache::setShape(
|
||||
const App::DocumentObject *obj, const TopoShape &shape, const char *subname)
|
||||
{
|
||||
// March, 2024 Toponaming project: There was originally a feature to disable shape cache
|
||||
// that has not been kept:
|
||||
// if (PartParams::getDisableShapeCache())
|
||||
// return; // TODO: Part Params
|
||||
// return;
|
||||
auto prop = get(obj,true);
|
||||
if(!prop)
|
||||
return;
|
||||
|
||||
@@ -102,7 +102,7 @@ public:
|
||||
virtual std::string getElementMapVersion(bool restored=false) const override;
|
||||
void resetElementMapVersion() {_Ver.clear();}
|
||||
|
||||
virtual void afterRestore() override;
|
||||
// virtual void afterRestore() override;
|
||||
|
||||
friend class Feature;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user