From b24f0efbc1ca4e0fc4a2a3dbdf6005ac262511ef Mon Sep 17 00:00:00 2001 From: wmayer Date: Fri, 29 Mar 2013 15:23:51 +0100 Subject: [PATCH] Remove FileVersion from RestoreDocFile, convert point data back to floats --- src/App/PropertyFile.cpp | 2 +- src/App/PropertyFile.h | 2 +- src/App/PropertyGeo.cpp | 15 +- src/App/PropertyGeo.h | 2 +- src/App/PropertyPythonObject.cpp | 2 +- src/App/PropertyPythonObject.h | 2 +- src/App/PropertyStandard.cpp | 13 +- src/App/PropertyStandard.h | 4 +- src/Base/Persistence.cpp | 2 +- src/Base/Persistence.h | 4 +- src/Base/Reader.cpp | 22 +- src/Base/Reader.h | 12 + src/Gui/Document.cpp | 5 +- src/Gui/Document.h | 2 +- src/Gui/MergeDocuments.cpp | 4 +- src/Gui/MergeDocuments.h | 2 +- src/Gui/Thumbnail.cpp | 2 +- src/Gui/Thumbnail.h | 2 +- src/Mod/Fem/App/FemMesh.cpp | 2 +- src/Mod/Fem/App/FemMesh.h | 2 +- src/Mod/Fem/App/FemMeshProperty.cpp | 4 +- src/Mod/Fem/App/FemMeshProperty.h | 2 +- src/Mod/Inspection/App/AppInspection.cpp | 5 +- src/Mod/Inspection/App/InspectionFeature.cpp | 149 ++++++++- src/Mod/Inspection/App/InspectionFeature.h | 52 ++- .../Inspection/Gui/ViewProviderInspection.cpp | 18 +- src/Mod/Mesh/App/Mesh.cpp | 2 +- src/Mod/Mesh/App/Mesh.h | 2 +- src/Mod/Mesh/App/MeshProperties.cpp | 152 ++++++++- src/Mod/Mesh/App/MeshProperties.h | 48 ++- src/Mod/Part/App/PropertyTopoShape.cpp | 6 +- src/Mod/Part/App/PropertyTopoShape.h | 6 +- src/Mod/Part/App/TopoShape.cpp | 2 +- src/Mod/Part/App/TopoShape.h | 2 +- src/Mod/Points/App/Points.cpp | 22 +- src/Mod/Points/App/Points.h | 39 ++- src/Mod/Points/App/PointsFeature.cpp | 4 +- src/Mod/Points/App/PointsFeature.h | 2 +- src/Mod/Points/App/Properties.cpp | 307 +++++++++++++++++- src/Mod/Points/App/Properties.h | 92 ++++-- src/Mod/Points/App/PropertyPointKernel.cpp | 4 +- src/Mod/Points/App/PropertyPointKernel.h | 2 +- src/Mod/Points/Gui/ViewProvider.cpp | 12 +- 43 files changed, 896 insertions(+), 141 deletions(-) diff --git a/src/App/PropertyFile.cpp b/src/App/PropertyFile.cpp index 269d17902..934023272 100644 --- a/src/App/PropertyFile.cpp +++ b/src/App/PropertyFile.cpp @@ -327,7 +327,7 @@ void PropertyFileIncluded::SaveDocFile (Base::Writer &writer) const } } -void PropertyFileIncluded::RestoreDocFile(Base::Reader &reader, const int FileVersion) +void PropertyFileIncluded::RestoreDocFile(Base::Reader &reader) { Base::ofstream to(Base::FileInfo(_cValue.c_str())); if (!to) diff --git a/src/App/PropertyFile.h b/src/App/PropertyFile.h index b68ba80da..b48bec3b2 100644 --- a/src/App/PropertyFile.h +++ b/src/App/PropertyFile.h @@ -91,7 +91,7 @@ public: virtual void Restore(Base::XMLReader &reader); virtual void SaveDocFile (Base::Writer &writer) const; - virtual void RestoreDocFile(Base::Reader &reader, const int FileVersion); + virtual void RestoreDocFile(Base::Reader &reader); virtual Property *Copy(void) const; virtual void Paste(const Property &from); diff --git a/src/App/PropertyGeo.cpp b/src/App/PropertyGeo.cpp index 0da1d83d4..3e025c10a 100644 --- a/src/App/PropertyGeo.cpp +++ b/src/App/PropertyGeo.cpp @@ -301,14 +301,23 @@ void PropertyVectorList::SaveDocFile (Base::Writer &writer) const } } -void PropertyVectorList::RestoreDocFile(Base::Reader &reader, const int FileVersion) +void PropertyVectorList::RestoreDocFile(Base::Reader &reader) { Base::InputStream str(reader); uint32_t uCt=0; str >> uCt; std::vector values(uCt); - for (std::vector::iterator it = values.begin(); it != values.end(); ++it) { - str >> it->x >> it->y >> it->z; + if (reader.getFileVersion() > 0) { + for (std::vector::iterator it = values.begin(); it != values.end(); ++it) { + str >> it->x >> it->y >> it->z; + } + } + else { + float x,y,z; + for (std::vector::iterator it = values.begin(); it != values.end(); ++it) { + str >> x >> y >> z; + it->Set(x, y, z); + } } setValues(values); } diff --git a/src/App/PropertyGeo.h b/src/App/PropertyGeo.h index 53c972573..9aa9ac178 100644 --- a/src/App/PropertyGeo.h +++ b/src/App/PropertyGeo.h @@ -147,7 +147,7 @@ public: virtual void Restore(Base::XMLReader &reader); virtual void SaveDocFile (Base::Writer &writer) const; - virtual void RestoreDocFile(Base::Reader &reader, const int FileVersion); + virtual void RestoreDocFile(Base::Reader &reader); virtual Property *Copy(void) const; virtual void Paste(const Property &from); diff --git a/src/App/PropertyPythonObject.cpp b/src/App/PropertyPythonObject.cpp index 0c916833d..455ea65f6 100644 --- a/src/App/PropertyPythonObject.cpp +++ b/src/App/PropertyPythonObject.cpp @@ -372,7 +372,7 @@ void PropertyPythonObject::SaveDocFile (Base::Writer &writer) const writer.Stream().put(*it); } -void PropertyPythonObject::RestoreDocFile(Base::Reader &reader, const int FileVersion) +void PropertyPythonObject::RestoreDocFile(Base::Reader &reader) { aboutToSetValue(); std::string buffer; diff --git a/src/App/PropertyPythonObject.h b/src/App/PropertyPythonObject.h index 76608e800..bd4bec933 100644 --- a/src/App/PropertyPythonObject.h +++ b/src/App/PropertyPythonObject.h @@ -63,7 +63,7 @@ public: /** Use Python's pickle module to restore the object */ virtual void Restore(Base::XMLReader &reader); virtual void SaveDocFile (Base::Writer &writer) const; - virtual void RestoreDocFile(Base::Reader &reader, const int FileVersion); + virtual void RestoreDocFile(Base::Reader &reader); virtual unsigned int getMemSize (void) const; virtual Property *Copy(void) const; diff --git a/src/App/PropertyStandard.cpp b/src/App/PropertyStandard.cpp index 5d6eaba7e..2b2f4846e 100644 --- a/src/App/PropertyStandard.cpp +++ b/src/App/PropertyStandard.cpp @@ -1127,16 +1127,19 @@ void PropertyFloatList::SaveDocFile (Base::Writer &writer) const } } -void PropertyFloatList::RestoreDocFile(Base::Reader &reader, const int FileVersion) +void PropertyFloatList::RestoreDocFile(Base::Reader &reader) { Base::InputStream str(reader); uint32_t uCt=0; str >> uCt; std::vector values(uCt); - for (std::vector::iterator it = values.begin(); it != values.end(); ++it) { - if (FileVersion > 0) { + if (reader.getFileVersion() > 0) { + for (std::vector::iterator it = values.begin(); it != values.end(); ++it) { str >> *it; - } else { + } + } + else { + for (std::vector::iterator it = values.begin(); it != values.end(); ++it) { float val; str >> val; (*it) = val; @@ -2090,7 +2093,7 @@ void PropertyColorList::SaveDocFile (Base::Writer &writer) const } } -void PropertyColorList::RestoreDocFile(Base::Reader &reader, const int FileVersion) +void PropertyColorList::RestoreDocFile(Base::Reader &reader) { Base::InputStream str(reader); uint32_t uCt=0; diff --git a/src/App/PropertyStandard.h b/src/App/PropertyStandard.h index ef6936711..c26688258 100644 --- a/src/App/PropertyStandard.h +++ b/src/App/PropertyStandard.h @@ -537,7 +537,7 @@ public: virtual void Restore(Base::XMLReader &reader); virtual void SaveDocFile (Base::Writer &writer) const; - virtual void RestoreDocFile(Base::Reader &reader, const int FileVersion); + virtual void RestoreDocFile(Base::Reader &reader); virtual Property *Copy(void) const; virtual void Paste(const Property &from); @@ -830,7 +830,7 @@ public: virtual void Restore(Base::XMLReader &reader); virtual void SaveDocFile (Base::Writer &writer) const; - virtual void RestoreDocFile(Base::Reader &reader, const int FileVersion); + virtual void RestoreDocFile(Base::Reader &reader); virtual Property *Copy(void) const; virtual void Paste(const Property &from); diff --git a/src/Base/Persistence.cpp b/src/Base/Persistence.cpp index 141512c8d..7054d6acb 100644 --- a/src/Base/Persistence.cpp +++ b/src/Base/Persistence.cpp @@ -65,6 +65,6 @@ void Persistence::SaveDocFile (Writer &/*writer*/) const { } -void Persistence::RestoreDocFile(Reader &/*reader*/, const int FileVersion) +void Persistence::RestoreDocFile(Reader &/*reader*/) { } diff --git a/src/Base/Persistence.h b/src/Base/Persistence.h index 1bc7a7977..dfa857b09 100644 --- a/src/Base/Persistence.h +++ b/src/Base/Persistence.h @@ -33,7 +33,7 @@ namespace Base { -typedef std::istream Reader; +class Reader; class Writer; class XMLReader; @@ -145,7 +145,7 @@ public: * \endcode * @see Base::Reader,Base::XMLReader */ - virtual void RestoreDocFile(Reader &/*reader*/, const int FileVersion); + virtual void RestoreDocFile(Reader &/*reader*/); }; } //namespace Base diff --git a/src/Base/Reader.cpp b/src/Base/Reader.cpp index 8aa12776a..79eb81c2b 100644 --- a/src/Base/Reader.cpp +++ b/src/Base/Reader.cpp @@ -60,7 +60,7 @@ using namespace std; // --------------------------------------------------------------------------- Base::XMLReader::XMLReader(const char* FileName, std::istream& str) - : DocumentSchema(0), Level(0), _File(FileName) + : DocumentSchema(0), ProgramVersion(""), FileVersion(0), Level(0), _File(FileName) { #ifdef _MSC_VER str.imbue(std::locale::empty()); @@ -304,7 +304,7 @@ void Base::XMLReader::readFiles(zipios::ZipInputStream &zipstream) const // no file name for the current entry in the zip was registered. if (jt != FileList.end()) { try { - jt->Object->RestoreDocFile(zipstream, FileVersion); + jt->Object->RestoreDocFile(Base::Reader(zipstream, FileVersion)); } catch(...) { // For any exception we just continue with the next file. @@ -472,3 +472,21 @@ void Base::XMLReader::warning(const XERCES_CPP_NAMESPACE_QUALIFIER SAXParseExcep void Base::XMLReader::resetErrors() { } + +// ---------------------------------------------------------- + +Base::Reader::Reader(std::istream& str, int version) + : std::istream(str.rdbuf()), _str(str), fileVersion(version) +{ +} + +int Base::Reader::getFileVersion() const +{ + return fileVersion; +} + +std::istream& Base::Reader::getStream() +{ + return this->_str; +} + diff --git a/src/Base/Reader.h b/src/Base/Reader.h index 9a5291fe9..df82a5653 100644 --- a/src/Base/Reader.h +++ b/src/Base/Reader.h @@ -232,6 +232,18 @@ protected: std::vector FileNames; }; +class BaseExport Reader : public std::istream +{ +public: + Reader(std::istream&, int version); + int getFileVersion() const; + std::istream& getStream(); + +private: + std::istream& _str; + int fileVersion; +}; + } diff --git a/src/Gui/Document.cpp b/src/Gui/Document.cpp index a129ff893..23c4d63cd 100644 --- a/src/Gui/Document.cpp +++ b/src/Gui/Document.cpp @@ -674,10 +674,11 @@ void Document::Restore(Base::XMLReader &reader) /** * Restores the properties of the view providers. */ -void Document::RestoreDocFile(Base::Reader &reader, const int FileVersion) +void Document::RestoreDocFile(Base::Reader &reader) { // We must create an XML parser to read from the input stream Base::XMLReader xmlReader("GuiDocument.xml", reader); + xmlReader.FileVersion = reader.getFileVersion(); int i,Cnt; @@ -722,7 +723,7 @@ void Document::RestoreDocFile(Base::Reader &reader, const int FileVersion) // In the file GuiDocument.xml new data files might be added if (!xmlReader.getFilenames().empty()) - xmlReader.readFiles(static_cast(reader)); + xmlReader.readFiles(static_cast(reader.getStream())); // reset modified flag setModified(false); diff --git a/src/Gui/Document.h b/src/Gui/Document.h index 07fffccf8..85736c6b9 100644 --- a/src/Gui/Document.h +++ b/src/Gui/Document.h @@ -119,7 +119,7 @@ public: /// This method is used to save large amounts of data to a binary file. virtual void SaveDocFile (Base::Writer &writer) const; /// This method is used to restore large amounts of data from a binary file. - virtual void RestoreDocFile(Base::Reader &reader, const int FileVersion); + virtual void RestoreDocFile(Base::Reader &reader); void exportObjects(const std::vector&, Base::Writer&); void importObjects(const std::vector&, Base::Reader&); //@} diff --git a/src/Gui/MergeDocuments.cpp b/src/Gui/MergeDocuments.cpp index be0d571be..9bcb9ecb5 100644 --- a/src/Gui/MergeDocuments.cpp +++ b/src/Gui/MergeDocuments.cpp @@ -160,7 +160,7 @@ void MergeDocuments::SaveDocFile (Base::Writer & w) const document->exportObjects(objects, w); } -void MergeDocuments::RestoreDocFile(Base::Reader & reader, const int FileVersion) +void MergeDocuments::RestoreDocFile(Base::Reader & reader) { std::vector obj = objects; // We must create an XML parser to read from the input stream @@ -199,5 +199,5 @@ void MergeDocuments::RestoreDocFile(Base::Reader & reader, const int FileVersion // In the file GuiDocument.xml new data files might be added if (!xmlReader.getFilenames().empty()) - xmlReader.readFiles(static_cast(reader)); + xmlReader.readFiles(static_cast(reader.getStream())); } diff --git a/src/Gui/MergeDocuments.h b/src/Gui/MergeDocuments.h index e4ee90d50..42bc252e0 100644 --- a/src/Gui/MergeDocuments.h +++ b/src/Gui/MergeDocuments.h @@ -49,7 +49,7 @@ public: void Save (Base::Writer & w) const; void Restore(Base::XMLReader &r); void SaveDocFile (Base::Writer & w) const; - void RestoreDocFile(Base::Reader & r, const int FileVersion); + void RestoreDocFile(Base::Reader & r); private: zipios::ZipInputStream* stream; diff --git a/src/Gui/Thumbnail.cpp b/src/Gui/Thumbnail.cpp index 34e2b3de6..df5cbdf3a 100644 --- a/src/Gui/Thumbnail.cpp +++ b/src/Gui/Thumbnail.cpp @@ -110,6 +110,6 @@ void Thumbnail::SaveDocFile (Base::Writer &writer) const writer.Stream().write(ba.constData(), ba.length()); } -void Thumbnail::RestoreDocFile(Base::Reader &reader, const int FileVersion) +void Thumbnail::RestoreDocFile(Base::Reader &reader) { } diff --git a/src/Gui/Thumbnail.h b/src/Gui/Thumbnail.h index 11b0c1b4d..daa66ad11 100644 --- a/src/Gui/Thumbnail.h +++ b/src/Gui/Thumbnail.h @@ -50,7 +50,7 @@ public: /// This method is used to save large amounts of data to a binary file. void SaveDocFile (Base::Writer &writer) const; /// This method is used to restore large amounts of data from a binary file. - void RestoreDocFile(Base::Reader &reader, const int FileVersion); + void RestoreDocFile(Base::Reader &reader); //@} private: diff --git a/src/Mod/Fem/App/FemMesh.cpp b/src/Mod/Fem/App/FemMesh.cpp index e2d5dca10..759b72bf7 100755 --- a/src/Mod/Fem/App/FemMesh.cpp +++ b/src/Mod/Fem/App/FemMesh.cpp @@ -744,7 +744,7 @@ void FemMesh::SaveDocFile (Base::Writer &writer) const fi.deleteFile(); } -void FemMesh::RestoreDocFile(Base::Reader &reader, const int FileVersion) +void FemMesh::RestoreDocFile(Base::Reader &reader) { // create a temporary file and copy the content from the zip stream Base::FileInfo fi(Base::FileInfo::getTempFileName().c_str()); diff --git a/src/Mod/Fem/App/FemMesh.h b/src/Mod/Fem/App/FemMesh.h index 15b1904a8..79733fc95 100755 --- a/src/Mod/Fem/App/FemMesh.h +++ b/src/Mod/Fem/App/FemMesh.h @@ -65,7 +65,7 @@ public: virtual void Save (Base::Writer &/*writer*/) const; virtual void Restore(Base::XMLReader &/*reader*/); void SaveDocFile (Base::Writer &writer) const; - void RestoreDocFile(Base::Reader &reader, const int FileVersion); + void RestoreDocFile(Base::Reader &reader); /** @name Subelement management */ //@{ diff --git a/src/Mod/Fem/App/FemMeshProperty.cpp b/src/Mod/Fem/App/FemMeshProperty.cpp index 5221a3af2..10e01fa9f 100755 --- a/src/Mod/Fem/App/FemMeshProperty.cpp +++ b/src/Mod/Fem/App/FemMeshProperty.cpp @@ -162,9 +162,9 @@ void PropertyFemMesh::SaveDocFile (Base::Writer &writer) const _FemMesh->SaveDocFile(writer); } -void PropertyFemMesh::RestoreDocFile(Base::Reader &reader, const int FileVersion) +void PropertyFemMesh::RestoreDocFile(Base::Reader &reader) { aboutToSetValue(); - _FemMesh->RestoreDocFile(reader, FileVersion); + _FemMesh->RestoreDocFile(reader); hasSetValue(); } diff --git a/src/Mod/Fem/App/FemMeshProperty.h b/src/Mod/Fem/App/FemMeshProperty.h index a4ac334ce..7b350ddc4 100755 --- a/src/Mod/Fem/App/FemMeshProperty.h +++ b/src/Mod/Fem/App/FemMeshProperty.h @@ -77,7 +77,7 @@ public: void Save (Base::Writer &writer) const; void Restore(Base::XMLReader &reader); void SaveDocFile (Base::Writer &writer) const; - void RestoreDocFile(Base::Reader &reader, const int FileVersion); + void RestoreDocFile(Base::Reader &reader); App::Property *Copy(void) const; void Paste(const App::Property &from); diff --git a/src/Mod/Inspection/App/AppInspection.cpp b/src/Mod/Inspection/App/AppInspection.cpp index 0c306f6d0..b8d5819cd 100644 --- a/src/Mod/Inspection/App/AppInspection.cpp +++ b/src/Mod/Inspection/App/AppInspection.cpp @@ -47,8 +47,9 @@ void InspectionExport initInspection() { (void) Py_InitModule3("Inspection", Inspection_methods, module_Inspection_doc); /* mod name, table ptr */ Base::Console().Log("Loading Inspection module... done\n"); - Inspection::Feature ::init(); - Inspection::Group ::init(); + Inspection::PropertyDistanceList ::init(); + Inspection::Feature ::init(); + Inspection::Group ::init(); } } // extern "C" diff --git a/src/Mod/Inspection/App/InspectionFeature.cpp b/src/Mod/Inspection/App/InspectionFeature.cpp index b0783ad43..f8cd42774 100644 --- a/src/Mod/Inspection/App/InspectionFeature.cpp +++ b/src/Mod/Inspection/App/InspectionFeature.cpp @@ -442,6 +442,151 @@ float InspectNominalShape::getDistance(const Base::Vector3f& point) // ---------------------------------------------------------------- +TYPESYSTEM_SOURCE(Inspection::PropertyDistanceList, App::PropertyLists); + +PropertyDistanceList::PropertyDistanceList() +{ + +} + +PropertyDistanceList::~PropertyDistanceList() +{ + +} + +void PropertyDistanceList::setSize(int newSize) +{ + _lValueList.resize(newSize); +} + +int PropertyDistanceList::getSize(void) const +{ + return static_cast(_lValueList.size()); +} + +void PropertyDistanceList::setValue(float lValue) +{ + aboutToSetValue(); + _lValueList.resize(1); + _lValueList[0]=lValue; + hasSetValue(); +} + +void PropertyDistanceList::setValues(const std::vector& values) +{ + aboutToSetValue(); + _lValueList = values; + hasSetValue(); +} + +PyObject *PropertyDistanceList::getPyObject(void) +{ + PyObject* list = PyList_New(getSize()); + for (int i = 0;i values; + values.resize(nSize); + + for (Py_ssize_t i=0; iob_type->tp_name; + throw Py::TypeError(error); + } + + values[i] = (float)PyFloat_AsDouble(item); + } + + setValues(values); + } + else if (PyFloat_Check(value)) { + setValue((float)PyFloat_AsDouble(value)); + } + else { + std::string error = std::string("type must be float or list of float, not "); + error += value->ob_type->tp_name; + throw Py::TypeError(error); + } +} + +void PropertyDistanceList::Save (Base::Writer &writer) const +{ + if (writer.isForceXML()) { + writer.Stream() << writer.ind() << "" << endl; + writer.incInd(); + for(int i = 0;i" << endl; ; + writer.decInd(); + writer.Stream() << writer.ind() <<"" << endl ; + } + else { + writer.Stream() << writer.ind() << "" << std::endl; + } +} + +void PropertyDistanceList::Restore(Base::XMLReader &reader) +{ + reader.readElement("FloatList"); + std::string file (reader.getAttribute("file") ); + + if (!file.empty()) { + // initate a file read + reader.addFile(file.c_str(),this); + } +} + +void PropertyDistanceList::SaveDocFile (Base::Writer &writer) const +{ + Base::OutputStream str(writer.Stream()); + uint32_t uCt = (uint32_t)getSize(); + str << uCt; + for (std::vector::const_iterator it = _lValueList.begin(); it != _lValueList.end(); ++it) { + str << *it; + } +} + +void PropertyDistanceList::RestoreDocFile(Base::Reader &reader) +{ + Base::InputStream str(reader); + uint32_t uCt=0; + str >> uCt; + std::vector values(uCt); + for (std::vector::iterator it = values.begin(); it != values.end(); ++it) { + str >> *it; + } + setValues(values); +} + +App::Property *PropertyDistanceList::Copy(void) const +{ + PropertyDistanceList *p= new PropertyDistanceList(); + p->_lValueList = _lValueList; + return p; +} + +void PropertyDistanceList::Paste(const App::Property &from) +{ + aboutToSetValue(); + _lValueList = dynamic_cast(from)._lValueList; + hasSetValue(); +} + +unsigned int PropertyDistanceList::getMemSize (void) const +{ + return static_cast(_lValueList.size() * sizeof(float)); +} + +// ---------------------------------------------------------------- + // helper class to use Qt's concurrent framework struct DistanceInspection { @@ -575,7 +720,7 @@ App::DocumentObjectExecReturn* Feature::execute(void) str << "Inspecting " << this->Label.getValue() << "..."; Base::SequencerLauncher seq(str.str().c_str(), count); - std::vector vals(count); + std::vector vals(count); for (unsigned long index = 0; index < count; index++) { Base::Vector3f pnt = actual->getPoint(index); @@ -599,7 +744,7 @@ App::DocumentObjectExecReturn* Feature::execute(void) float fRMS = 0; int countRMS = 0; - for (std::vector::iterator it = vals.begin(); it != vals.end(); ++it) { + for (std::vector::iterator it = vals.begin(); it != vals.end(); ++it) { if (fabs(*it) < FLT_MAX) { fRMS += (*it) * (*it); countRMS++; diff --git a/src/Mod/Inspection/App/InspectionFeature.h b/src/Mod/Inspection/App/InspectionFeature.h index 9efad3d89..d859b7b80 100644 --- a/src/Mod/Inspection/App/InspectionFeature.h +++ b/src/Mod/Inspection/App/InspectionFeature.h @@ -153,6 +153,56 @@ private: const TopoDS_Shape& _rShape; }; +class InspectionExport PropertyDistanceList: public App::PropertyLists +{ + TYPESYSTEM_HEADER(); + +public: + + /** + * A constructor. + * A more elaborate description of the constructor. + */ + PropertyDistanceList(); + + /** + * A destructor. + * A more elaborate description of the destructor. + */ + virtual ~PropertyDistanceList(); + + virtual void setSize(int newSize); + virtual int getSize(void) const; + + /** Sets the property + */ + void setValue(float); + + /// index operator + float operator[] (const int idx) const {return _lValueList.operator[] (idx);} + + void set1Value (const int idx, float value){_lValueList.operator[] (idx) = value;} + void setValues (const std::vector& values); + + const std::vector &getValues(void) const{return _lValueList;} + + virtual PyObject *getPyObject(void); + virtual void setPyObject(PyObject *); + + virtual void Save (Base::Writer &writer) const; + virtual void Restore(Base::XMLReader &reader); + + virtual void SaveDocFile (Base::Writer &writer) const; + virtual void RestoreDocFile(Base::Reader &reader); + + virtual Property *Copy(void) const; + virtual void Paste(const Property &from); + virtual unsigned int getMemSize (void) const; + +private: + std::vector _lValueList; +}; + // ---------------------------------------------------------------- /** The inspection feature. @@ -173,7 +223,7 @@ public: App::PropertyFloat Thickness; App::PropertyLink Actual; App::PropertyLinkList Nominals; - App::PropertyFloatList Distances; + PropertyDistanceList Distances; //@} /** @name Actions */ diff --git a/src/Mod/Inspection/Gui/ViewProviderInspection.cpp b/src/Mod/Inspection/Gui/ViewProviderInspection.cpp index be8d258c7..f890b6daf 100644 --- a/src/Mod/Inspection/Gui/ViewProviderInspection.cpp +++ b/src/Mod/Inspection/Gui/ViewProviderInspection.cpp @@ -256,7 +256,7 @@ void ViewProviderInspection::updateData(const App::Property* prop) } } } - else if (prop->getTypeId() == App::PropertyFloatList::getClassTypeId()) { + else if (prop->getTypeId() == Inspection::PropertyDistanceList::getClassTypeId()) { // force an update of the Inventor data nodes if (this->pcObject) { App::Property* link = this->pcObject->getPropertyByName("Actual"); @@ -286,14 +286,14 @@ void ViewProviderInspection::setDistances() SoDebugError::post("ViewProviderInspection::setDistances", "Unknown property 'Distances'"); return; } - if (pDistances->getTypeId() != App::PropertyFloatList::getClassTypeId()) { + if (pDistances->getTypeId() != Inspection::PropertyDistanceList::getClassTypeId()) { SoDebugError::post("ViewProviderInspection::setDistances", - "Property 'Distances' has type %s (App::PropertyFloatList was expected)", pDistances->getTypeId().getName()); + "Property 'Distances' has type %s (Inspection::PropertyDistanceList was expected)", pDistances->getTypeId().getName()); return; } // distance values - const std::vector& fValues = ((App::PropertyFloatList*)pDistances)->getValues(); + const std::vector& fValues = static_cast(pDistances)->getValues(); if ((int)fValues.size() != this->pcCoords->point.getNum()) { pcMatBinding->value = SoMaterialBinding::OVERALL; return; @@ -308,7 +308,7 @@ void ViewProviderInspection::setDistances() float * tran = pcColorMat->transparency.startEditing(); unsigned long j=0; - for (std::vector::const_iterator jt = fValues.begin(); jt != fValues.end(); ++jt, j++) { + for (std::vector::const_iterator jt = fValues.begin(); jt != fValues.end(); ++jt, j++) { App::Color col = pcColorBar->getColor(*jt); cols[j] = SbColor(col.r, col.g, col.b); if (pcColorBar->isVisible(*jt)) @@ -528,8 +528,8 @@ QString ViewProviderInspection::inspectDistance(const SoPickedPoint* pp) const // get the distances of the three points of the picked facet const SoFaceDetail * facedetail = static_cast(detail); App::Property* pDistance = this->pcObject->getPropertyByName("Distances"); - if (pDistance && pDistance->getTypeId() == App::PropertyFloatList::getClassTypeId()) { - App::PropertyFloatList* dist = (App::PropertyFloatList*)pDistance; + if (pDistance && pDistance->getTypeId() == Inspection::PropertyDistanceList::getClassTypeId()) { + Inspection::PropertyDistanceList* dist = static_cast(pDistance); int index1 = facedetail->getPoint(0)->getCoordinateIndex(); int index2 = facedetail->getPoint(1)->getCoordinateIndex(); int index3 = facedetail->getPoint(2)->getCoordinateIndex(); @@ -567,8 +567,8 @@ QString ViewProviderInspection::inspectDistance(const SoPickedPoint* pp) const // get the distance of the picked point int index = pointdetail->getCoordinateIndex(); App::Property* prop = this->pcObject->getPropertyByName("Distances"); - if ( prop && prop->getTypeId() == App::PropertyFloatList::getClassTypeId() ) { - App::PropertyFloatList* dist = (App::PropertyFloatList*)prop; + if (prop && prop->getTypeId() == Inspection::PropertyDistanceList::getClassTypeId()) { + Inspection::PropertyDistanceList* dist = static_cast(prop); float fVal = (*dist)[index]; info = QObject::tr("Distance: %1").arg(fVal); } diff --git a/src/Mod/Mesh/App/Mesh.cpp b/src/Mod/Mesh/App/Mesh.cpp index 7a773779f..aa14ccf10 100644 --- a/src/Mod/Mesh/App/Mesh.cpp +++ b/src/Mod/Mesh/App/Mesh.cpp @@ -297,7 +297,7 @@ void MeshObject::Restore(Base::XMLReader &reader) // this is handled by the property class } -void MeshObject::RestoreDocFile(Base::Reader &reader, const int FileVersion) +void MeshObject::RestoreDocFile(Base::Reader &reader) { load(reader); } diff --git a/src/Mod/Mesh/App/Mesh.h b/src/Mod/Mesh/App/Mesh.h index 2b40bc56e..3477556cd 100644 --- a/src/Mod/Mesh/App/Mesh.h +++ b/src/Mod/Mesh/App/Mesh.h @@ -141,7 +141,7 @@ public: void Save (Base::Writer &writer) const; void SaveDocFile (Base::Writer &writer) const; void Restore(Base::XMLReader &reader); - void RestoreDocFile(Base::Reader &reader, const int FileVersion); + void RestoreDocFile(Base::Reader &reader); void save(const char* file,MeshCore::MeshIO::Format f=MeshCore::MeshIO::Undefined, const MeshCore::Material* mat = 0) const; void save(std::ostream&) const; diff --git a/src/Mod/Mesh/App/MeshProperties.cpp b/src/Mod/Mesh/App/MeshProperties.cpp index e9f3a3e3e..a89087c54 100644 --- a/src/Mod/Mesh/App/MeshProperties.cpp +++ b/src/Mod/Mesh/App/MeshProperties.cpp @@ -31,6 +31,7 @@ #include #include #include +#include #include "Core/MeshKernel.h" #include "Core/MeshIO.h" @@ -42,10 +43,155 @@ using namespace Mesh; -TYPESYSTEM_SOURCE(Mesh::PropertyNormalList, App::PropertyVectorList); +TYPESYSTEM_SOURCE(Mesh::PropertyNormalList, App::PropertyLists); TYPESYSTEM_SOURCE(Mesh::PropertyCurvatureList , App::PropertyLists); TYPESYSTEM_SOURCE(Mesh::PropertyMeshKernel , App::PropertyComplexGeoData); +PropertyNormalList::PropertyNormalList() +{ + +} + +PropertyNormalList::~PropertyNormalList() +{ + +} + +void PropertyNormalList::setSize(int newSize) +{ + _lValueList.resize(newSize); +} + +int PropertyNormalList::getSize(void) const +{ + return static_cast(_lValueList.size()); +} + +void PropertyNormalList::setValue(const Base::Vector3f& lValue) +{ + aboutToSetValue(); + _lValueList.resize(1); + _lValueList[0]=lValue; + hasSetValue(); +} + +void PropertyNormalList::setValue(float x, float y, float z) +{ + aboutToSetValue(); + _lValueList.resize(1); + _lValueList[0].Set(x,y,z); + hasSetValue(); +} + +void PropertyNormalList::setValues(const std::vector& values) +{ + aboutToSetValue(); + _lValueList = values; + hasSetValue(); +} + +PyObject *PropertyNormalList::getPyObject(void) +{ + PyObject* list = PyList_New(getSize()); + + for (int i = 0;i values; + values.resize(nSize); + + for (Py_ssize_t i=0; i(val.getValue()); + } + + setValues(values); + } + else if (PyObject_TypeCheck(value, &(Base::VectorPy::Type))) { + Base::VectorPy *pcObject = static_cast(value); + Base::Vector3d* val = pcObject->getVectorPtr(); + setValue(Base::convertTo(*val)); + } + else if (PyTuple_Check(value) && PyTuple_Size(value) == 3) { + App::PropertyVector val; + val.setPyObject( value ); + setValue(Base::convertTo(val.getValue())); + } + else { + std::string error = std::string("type must be 'Vector' or list of 'Vector', not "); + error += value->ob_type->tp_name; + throw Py::TypeError(error); + } +} + +void PropertyNormalList::Save (Base::Writer &writer) const +{ + if (!writer.isForceXML()) { + writer.Stream() << writer.ind() << "" << std::endl; + } +} + +void PropertyNormalList::Restore(Base::XMLReader &reader) +{ + reader.readElement("VectorList"); + std::string file (reader.getAttribute("file") ); + + if (!file.empty()) { + // initate a file read + reader.addFile(file.c_str(),this); + } +} + +void PropertyNormalList::SaveDocFile (Base::Writer &writer) const +{ + Base::OutputStream str(writer.Stream()); + uint32_t uCt = (uint32_t)getSize(); + str << uCt; + for (std::vector::const_iterator it = _lValueList.begin(); it != _lValueList.end(); ++it) { + str << it->x << it->y << it->z; + } +} + +void PropertyNormalList::RestoreDocFile(Base::Reader &reader) +{ + Base::InputStream str(reader); + uint32_t uCt=0; + str >> uCt; + std::vector values(uCt); + for (std::vector::iterator it = values.begin(); it != values.end(); ++it) { + str >> it->x >> it->y >> it->z; + } + setValues(values); +} + +App::Property *PropertyNormalList::Copy(void) const +{ + PropertyNormalList *p= new PropertyNormalList(); + p->_lValueList = _lValueList; + return p; +} + +void PropertyNormalList::Paste(const App::Property &from) +{ + aboutToSetValue(); + _lValueList = dynamic_cast(from)._lValueList; + hasSetValue(); +} + +unsigned int PropertyNormalList::getMemSize (void) const +{ + return static_cast(_lValueList.size() * sizeof(Base::Vector3f)); +} + void PropertyNormalList::transform(const Base::Matrix4D &mat) { // A normal vector is only a direction with unit length, so we only need to rotate it @@ -221,7 +367,7 @@ void PropertyCurvatureList::SaveDocFile (Base::Writer &writer) const } } -void PropertyCurvatureList::RestoreDocFile(Base::Reader &reader, const int FileVersion) +void PropertyCurvatureList::RestoreDocFile(Base::Reader &reader) { Base::InputStream str(reader); uint32_t uCt=0; @@ -478,7 +624,7 @@ void PropertyMeshKernel::SaveDocFile (Base::Writer &writer) const _meshObject->save(writer.Stream()); } -void PropertyMeshKernel::RestoreDocFile(Base::Reader &reader, const int FileVersion) +void PropertyMeshKernel::RestoreDocFile(Base::Reader &reader) { aboutToSetValue(); _meshObject->load(reader); diff --git a/src/Mod/Mesh/App/MeshProperties.h b/src/Mod/Mesh/App/MeshProperties.h index 1552fbab7..94efa5786 100644 --- a/src/Mod/Mesh/App/MeshProperties.h +++ b/src/Mod/Mesh/App/MeshProperties.h @@ -50,18 +50,52 @@ class MeshPy; * Note: We need an own class for that to distinguish from the base vector list. * @author Werner Mayer */ -class MeshExport PropertyNormalList : public App::PropertyVectorList +class MeshExport PropertyNormalList: public App::PropertyLists { TYPESYSTEM_HEADER(); public: - PropertyNormalList() - { + PropertyNormalList(); + ~PropertyNormalList(); + + virtual void setSize(int newSize); + virtual int getSize(void) const; + + void setValue(const Base::Vector3f&); + void setValue(float x, float y, float z); + + const Base::Vector3f& operator[] (const int idx) const { + return _lValueList.operator[] (idx); } - virtual ~PropertyNormalList() - { + + void set1Value (const int idx, const Base::Vector3f& value) { + _lValueList.operator[] (idx) = value; } + + void setValues (const std::vector& values); + + const std::vector &getValues(void) const { + return _lValueList; + } + + virtual PyObject *getPyObject(void); + virtual void setPyObject(PyObject *); + + virtual void Save (Base::Writer &writer) const; + virtual void Restore(Base::XMLReader &reader); + + virtual void SaveDocFile (Base::Writer &writer) const; + virtual void RestoreDocFile(Base::Reader &reader); + + virtual App::Property *Copy(void) const; + virtual void Paste(const App::Property &from); + + virtual unsigned int getMemSize (void) const; + void transform(const Base::Matrix4D &rclMat); + +private: + std::vector _lValueList; }; /** Curvature information. */ @@ -107,7 +141,7 @@ public: void Restore(Base::XMLReader &reader); void SaveDocFile (Base::Writer &writer) const; - void RestoreDocFile(Base::Reader &reader, const int FileVersion); + void RestoreDocFile(Base::Reader &reader); /** @name Python interface */ //@{ @@ -205,7 +239,7 @@ public: void Restore(Base::XMLReader &reader); void SaveDocFile (Base::Writer &writer) const; - void RestoreDocFile(Base::Reader &reader, const int FileVersion); + void RestoreDocFile(Base::Reader &reader); App::Property *Copy(void) const; void Paste(const App::Property &from); diff --git a/src/Mod/Part/App/PropertyTopoShape.cpp b/src/Mod/Part/App/PropertyTopoShape.cpp index 34add8d0c..6b4b65392 100644 --- a/src/Mod/Part/App/PropertyTopoShape.cpp +++ b/src/Mod/Part/App/PropertyTopoShape.cpp @@ -304,7 +304,7 @@ void PropertyPartShape::SaveDocFile (Base::Writer &writer) const fi.deleteFile(); } -void PropertyPartShape::RestoreDocFile(Base::Reader &reader, const int FileVersion) +void PropertyPartShape::RestoreDocFile(Base::Reader &reader) { BRep_Builder builder; @@ -397,7 +397,7 @@ void PropertyShapeHistory::SaveDocFile (Base::Writer &writer) const { } -void PropertyShapeHistory::RestoreDocFile(Base::Reader &reader, const int FileVersion) +void PropertyShapeHistory::RestoreDocFile(Base::Reader &reader) { } @@ -505,7 +505,7 @@ void PropertyFilletEdges::SaveDocFile (Base::Writer &writer) const } } -void PropertyFilletEdges::RestoreDocFile(Base::Reader &reader, const int FileVersion) +void PropertyFilletEdges::RestoreDocFile(Base::Reader &reader) { Base::InputStream str(reader); uint32_t uCt=0; diff --git a/src/Mod/Part/App/PropertyTopoShape.h b/src/Mod/Part/App/PropertyTopoShape.h index 0adb189da..a75c85ccd 100644 --- a/src/Mod/Part/App/PropertyTopoShape.h +++ b/src/Mod/Part/App/PropertyTopoShape.h @@ -87,7 +87,7 @@ public: void Restore(Base::XMLReader &reader); void SaveDocFile (Base::Writer &writer) const; - void RestoreDocFile(Base::Reader &reader, const int FileVersion); + void RestoreDocFile(Base::Reader &reader); App::Property *Copy(void) const; void Paste(const App::Property &from); @@ -138,7 +138,7 @@ public: virtual void Restore(Base::XMLReader &reader); virtual void SaveDocFile (Base::Writer &writer) const; - virtual void RestoreDocFile(Base::Reader &reader, const int FileVersion); + virtual void RestoreDocFile(Base::Reader &reader); virtual Property *Copy(void) const; virtual void Paste(const Property &from); @@ -191,7 +191,7 @@ public: virtual void Restore(Base::XMLReader &reader); virtual void SaveDocFile (Base::Writer &writer) const; - virtual void RestoreDocFile(Base::Reader &reader, const int FileVersion); + virtual void RestoreDocFile(Base::Reader &reader); virtual Property *Copy(void) const; virtual void Paste(const Property &from); diff --git a/src/Mod/Part/App/TopoShape.cpp b/src/Mod/Part/App/TopoShape.cpp index a6068cd0e..bd3746a26 100644 --- a/src/Mod/Part/App/TopoShape.cpp +++ b/src/Mod/Part/App/TopoShape.cpp @@ -939,7 +939,7 @@ void TopoShape::SaveDocFile (Base::Writer &writer) const { } -void TopoShape::RestoreDocFile(Base::Reader &reader, const int FileVersion) +void TopoShape::RestoreDocFile(Base::Reader &reader) { } diff --git a/src/Mod/Part/App/TopoShape.h b/src/Mod/Part/App/TopoShape.h index 777084e4f..0369682ff 100644 --- a/src/Mod/Part/App/TopoShape.h +++ b/src/Mod/Part/App/TopoShape.h @@ -111,7 +111,7 @@ public: void Restore(Base::XMLReader &reader); void SaveDocFile (Base::Writer &writer) const; - void RestoreDocFile(Base::Reader &reader, const int FileVersion); + void RestoreDocFile(Base::Reader &reader); unsigned int getMemSize (void) const; //@} diff --git a/src/Mod/Points/App/Points.cpp b/src/Mod/Points/App/Points.cpp index d2735f8f5..28083b132 100644 --- a/src/Mod/Points/App/Points.cpp +++ b/src/Mod/Points/App/Points.cpp @@ -70,8 +70,8 @@ Data::Segment* PointKernel::getSubElement(const char* Type, unsigned long n) con void PointKernel::transformGeometry(const Base::Matrix4D &rclMat) { - std::vector& kernel = getBasicPoints(); - for (std::vector::iterator it = kernel.begin(); it != kernel.end(); ++it) + std::vector& kernel = getBasicPoints(); + for (std::vector::iterator it = kernel.begin(); it != kernel.end(); ++it) *it = rclMat * (*it); } @@ -112,7 +112,7 @@ void PointKernel::SaveDocFile (Base::Writer &writer) const uint32_t uCt = (uint32_t)size(); str << uCt; // store the data without transforming it - for (std::vector::const_iterator it = _Points.begin(); it != _Points.end(); ++it) { + for (std::vector::const_iterator it = _Points.begin(); it != _Points.end(); ++it) { str << it->x << it->y << it->z; } } @@ -134,22 +134,16 @@ void PointKernel::Restore(Base::XMLReader &reader) } } -void PointKernel::RestoreDocFile(Base::Reader &reader, const int FileVersion) +void PointKernel::RestoreDocFile(Base::Reader &reader) { Base::InputStream str(reader); uint32_t uCt = 0; str >> uCt; _Points.resize(uCt); for (unsigned long i=0; i < uCt; i++) { - if (FileVersion > 0) { - double x, y, z; - str >> x >> y >> z; - _Points[i].Set(x,y,z); - } else { - float x, y, z; - str >> x >> y >> z; - _Points[i].Set(x,y,z); - } + float x, y, z; + str >> x >> y >> z; + _Points[i].Set(x,y,z); } } @@ -182,7 +176,7 @@ void PointKernel::getFaces(std::vector &Points,std::vector::const_iterator index) +(const PointKernel* kernel, std::vector::const_iterator index) : _kernel(kernel), _p_it(index) { if(_p_it != kernel->_Points.end()) diff --git a/src/Mod/Points/App/Points.h b/src/Mod/Points/App/Points.h index cec019cd5..ae48d841d 100644 --- a/src/Mod/Points/App/Points.h +++ b/src/Mod/Points/App/Points.h @@ -46,6 +46,8 @@ class PointsExport PointKernel : public Data::ComplexGeoData TYPESYSTEM_HEADER(); public: + typedef Base::Vector3f value_type; + PointKernel(void) { } @@ -73,9 +75,9 @@ public: inline void setTransform(const Base::Matrix4D& rclTrf){_Mtrx = rclTrf;} inline Base::Matrix4D getTransform(void) const{return _Mtrx;} - std::vector& getBasicPoints() + std::vector& getBasicPoints() { return this->_Points; } - const std::vector& getBasicPoints() const + const std::vector& getBasicPoints() const { return this->_Points; } void getFaces(std::vector &Points,std::vector &Topo, float Accuracy, uint16_t flags=0) const; @@ -90,7 +92,7 @@ public: void Save (Base::Writer &writer) const; void SaveDocFile (Base::Writer &writer) const; void Restore(Base::XMLReader &reader); - void RestoreDocFile(Base::Reader &reader, const int FileVersion); + void RestoreDocFile(Base::Reader &reader); void save(const char* file) const; void save(std::ostream&) const; void load(const char* file); @@ -99,11 +101,11 @@ public: private: Base::Matrix4D _Mtrx; - std::vector _Points; + std::vector _Points; public: - typedef std::vector::difference_type difference_type; - typedef std::vector::size_type size_type; + typedef std::vector::difference_type difference_type; + typedef std::vector::size_type size_type; /// number of points stored size_type size(void) const {return this->_Points.size();} @@ -118,34 +120,35 @@ public: /// get the points inline const Base::Vector3d getPoint(const int idx) const { - return transformToOutside3d(_Points[idx]); + return transformToOutside(_Points[idx]); } /// set the points inline void setPoint(const int idx,const Base::Vector3d& point) { - _Points[idx] = transformToInside3d(point); + _Points[idx] = transformToInside(point); } /// insert the points inline void push_back(const Base::Vector3d& point) { - _Points.push_back(transformToInside3d(point)); + _Points.push_back(transformToInside(point)); } class PointsExport const_point_iterator { public: - typedef std::vector::const_iterator iter_type; + typedef Base::Vector3f value_single; + typedef Base::Vector3d value_type; + typedef std::vector::const_iterator iter_type; typedef iter_type::difference_type difference_type; typedef iter_type::iterator_category iterator_category; - typedef const Base::Vector3d* pointer; - typedef const Base::Vector3d& reference; - typedef Base::Vector3d value_type; + typedef const value_type* pointer; + typedef const value_type& reference; - const_point_iterator(const PointKernel*, std::vector::const_iterator index); + const_point_iterator(const PointKernel*, std::vector::const_iterator index); const_point_iterator(const const_point_iterator& pi); //~const_point_iterator(); const_point_iterator& operator=(const const_point_iterator& fi); - const Base::Vector3d& operator*(); - const Base::Vector3d* operator->(); + const value_type& operator*(); + const value_type* operator->(); bool operator==(const const_point_iterator& fi) const; bool operator!=(const const_point_iterator& fi) const; const_point_iterator& operator++(); @@ -160,8 +163,8 @@ public: private: void dereference(); const PointKernel* _kernel; - Base::Vector3d _point; - std::vector::const_iterator _p_it; + value_type _point; + std::vector::const_iterator _p_it; }; typedef const_point_iterator const_iterator; diff --git a/src/Mod/Points/App/PointsFeature.cpp b/src/Mod/Points/App/PointsFeature.cpp index bc84a8321..d7fb7eb94 100644 --- a/src/Mod/Points/App/PointsFeature.cpp +++ b/src/Mod/Points/App/PointsFeature.cpp @@ -64,10 +64,10 @@ void Feature::Restore(Base::XMLReader &reader) GeoFeature::Restore(reader); } -void Feature::RestoreDocFile(Base::Reader &reader, const int FileVersion) +void Feature::RestoreDocFile(Base::Reader &reader) { // This gets only invoked if a points file has been added from Restore() - Points.RestoreDocFile(reader, FileVersion); + Points.RestoreDocFile(reader); } void Feature::onChanged(const App::Property* prop) diff --git a/src/Mod/Points/App/PointsFeature.h b/src/Mod/Points/App/PointsFeature.h index 8e2bae02b..67f0cc9cc 100644 --- a/src/Mod/Points/App/PointsFeature.h +++ b/src/Mod/Points/App/PointsFeature.h @@ -60,7 +60,7 @@ public: /** @name methods overide Feature */ //@{ void Restore(Base::XMLReader &reader); - void RestoreDocFile(Base::Reader &reader, const int FileVersion); + void RestoreDocFile(Base::Reader &reader); /// recalculate the Feature virtual App::DocumentObjectExecReturn *execute(void); /// returns the type name of the ViewProvider diff --git a/src/Mod/Points/App/Properties.cpp b/src/Mod/Points/App/Properties.cpp index 99f71abef..b2e195272 100644 --- a/src/Mod/Points/App/Properties.cpp +++ b/src/Mod/Points/App/Properties.cpp @@ -33,6 +33,7 @@ #include #include #include +#include #include "Points.h" #include "Properties.h" @@ -42,28 +43,168 @@ using namespace Points; using namespace std; TYPESYSTEM_SOURCE(Points::PropertyGreyValue, App::PropertyFloat); -TYPESYSTEM_SOURCE(Points::PropertyGreyValueList, App::PropertyFloatList); -TYPESYSTEM_SOURCE(Points::PropertyNormalList, App::PropertyVectorList); +TYPESYSTEM_SOURCE(Points::PropertyGreyValueList, App::PropertyLists); +TYPESYSTEM_SOURCE(Points::PropertyNormalList, App::PropertyLists); TYPESYSTEM_SOURCE(Points::PropertyCurvatureList , App::PropertyLists); +PropertyGreyValueList::PropertyGreyValueList() +{ + +} + +PropertyGreyValueList::~PropertyGreyValueList() +{ + +} + +void PropertyGreyValueList::setSize(int newSize) +{ + _lValueList.resize(newSize); +} + +int PropertyGreyValueList::getSize(void) const +{ + return static_cast(_lValueList.size()); +} + +void PropertyGreyValueList::setValue(float lValue) +{ + aboutToSetValue(); + _lValueList.resize(1); + _lValueList[0]=lValue; + hasSetValue(); +} + +void PropertyGreyValueList::setValues(const std::vector& values) +{ + aboutToSetValue(); + _lValueList = values; + hasSetValue(); +} + +PyObject *PropertyGreyValueList::getPyObject(void) +{ + PyObject* list = PyList_New(getSize()); + for (int i = 0;i values; + values.resize(nSize); + + for (Py_ssize_t i=0; iob_type->tp_name; + throw Py::TypeError(error); + } + + values[i] = (float)PyFloat_AsDouble(item); + } + + setValues(values); + } + else if (PyFloat_Check(value)) { + setValue((float)PyFloat_AsDouble(value)); + } + else { + std::string error = std::string("type must be float or list of float, not "); + error += value->ob_type->tp_name; + throw Py::TypeError(error); + } +} + +void PropertyGreyValueList::Save (Base::Writer &writer) const +{ + if (writer.isForceXML()) { + writer.Stream() << writer.ind() << "" << endl; + writer.incInd(); + for(int i = 0;i" << endl; ; + writer.decInd(); + writer.Stream() << writer.ind() <<"" << endl ; + } + else { + writer.Stream() << writer.ind() << "" << std::endl; + } +} + +void PropertyGreyValueList::Restore(Base::XMLReader &reader) +{ + reader.readElement("FloatList"); + string file (reader.getAttribute("file") ); + + if (!file.empty()) { + // initate a file read + reader.addFile(file.c_str(),this); + } +} + +void PropertyGreyValueList::SaveDocFile (Base::Writer &writer) const +{ + Base::OutputStream str(writer.Stream()); + uint32_t uCt = (uint32_t)getSize(); + str << uCt; + for (std::vector::const_iterator it = _lValueList.begin(); it != _lValueList.end(); ++it) { + str << *it; + } +} + +void PropertyGreyValueList::RestoreDocFile(Base::Reader &reader) +{ + Base::InputStream str(reader); + uint32_t uCt=0; + str >> uCt; + std::vector values(uCt); + for (std::vector::iterator it = values.begin(); it != values.end(); ++it) { + str >> *it; + } + setValues(values); +} + +App::Property *PropertyGreyValueList::Copy(void) const +{ + PropertyGreyValueList *p= new PropertyGreyValueList(); + p->_lValueList = _lValueList; + return p; +} + +void PropertyGreyValueList::Paste(const App::Property &from) +{ + aboutToSetValue(); + _lValueList = dynamic_cast(from)._lValueList; + hasSetValue(); +} + +unsigned int PropertyGreyValueList::getMemSize (void) const +{ + return static_cast(_lValueList.size() * sizeof(float)); +} + void PropertyGreyValueList::removeIndices( const std::vector& uIndices ) { -#if 0 // We need a sorted array std::vector uSortedInds = uIndices; std::sort(uSortedInds.begin(), uSortedInds.end()); - const std::vector& rValueList = getValues(); + const std::vector& rValueList = getValues(); assert( uSortedInds.size() <= rValueList.size() ); if ( uSortedInds.size() > rValueList.size() ) return; - std::vector remainValue; + std::vector remainValue; remainValue.reserve(rValueList.size() - uSortedInds.size()); std::vector::iterator pos = uSortedInds.begin(); - for ( std::vector::const_iterator it = rValueList.begin(); it != rValueList.end(); ++it ) { + for ( std::vector::const_iterator it = rValueList.begin(); it != rValueList.end(); ++it ) { unsigned long index = it - rValueList.begin(); if (pos == uSortedInds.end()) remainValue.push_back( *it ); @@ -74,7 +215,151 @@ void PropertyGreyValueList::removeIndices( const std::vector& uIn } setValues(remainValue); -#endif +} + +PropertyNormalList::PropertyNormalList() +{ + +} + +PropertyNormalList::~PropertyNormalList() +{ + +} + +void PropertyNormalList::setSize(int newSize) +{ + _lValueList.resize(newSize); +} + +int PropertyNormalList::getSize(void) const +{ + return static_cast(_lValueList.size()); +} + +void PropertyNormalList::setValue(const Base::Vector3f& lValue) +{ + aboutToSetValue(); + _lValueList.resize(1); + _lValueList[0]=lValue; + hasSetValue(); +} + +void PropertyNormalList::setValue(float x, float y, float z) +{ + aboutToSetValue(); + _lValueList.resize(1); + _lValueList[0].Set(x,y,z); + hasSetValue(); +} + +void PropertyNormalList::setValues(const std::vector& values) +{ + aboutToSetValue(); + _lValueList = values; + hasSetValue(); +} + +PyObject *PropertyNormalList::getPyObject(void) +{ + PyObject* list = PyList_New(getSize()); + + for (int i = 0;i values; + values.resize(nSize); + + for (Py_ssize_t i=0; i(val.getValue()); + } + + setValues(values); + } + else if (PyObject_TypeCheck(value, &(Base::VectorPy::Type))) { + Base::VectorPy *pcObject = static_cast(value); + Base::Vector3d* val = pcObject->getVectorPtr(); + setValue(Base::convertTo(*val)); + } + else if (PyTuple_Check(value) && PyTuple_Size(value) == 3) { + App::PropertyVector val; + val.setPyObject( value ); + setValue(Base::convertTo(val.getValue())); + } + else { + std::string error = std::string("type must be 'Vector' or list of 'Vector', not "); + error += value->ob_type->tp_name; + throw Py::TypeError(error); + } +} + +void PropertyNormalList::Save (Base::Writer &writer) const +{ + if (!writer.isForceXML()) { + writer.Stream() << writer.ind() << "" << std::endl; + } +} + +void PropertyNormalList::Restore(Base::XMLReader &reader) +{ + reader.readElement("VectorList"); + std::string file (reader.getAttribute("file") ); + + if (!file.empty()) { + // initate a file read + reader.addFile(file.c_str(),this); + } +} + +void PropertyNormalList::SaveDocFile (Base::Writer &writer) const +{ + Base::OutputStream str(writer.Stream()); + uint32_t uCt = (uint32_t)getSize(); + str << uCt; + for (std::vector::const_iterator it = _lValueList.begin(); it != _lValueList.end(); ++it) { + str << it->x << it->y << it->z; + } +} + +void PropertyNormalList::RestoreDocFile(Base::Reader &reader) +{ + Base::InputStream str(reader); + uint32_t uCt=0; + str >> uCt; + std::vector values(uCt); + for (std::vector::iterator it = values.begin(); it != values.end(); ++it) { + str >> it->x >> it->y >> it->z; + } + setValues(values); +} + +App::Property *PropertyNormalList::Copy(void) const +{ + PropertyNormalList *p= new PropertyNormalList(); + p->_lValueList = _lValueList; + return p; +} + +void PropertyNormalList::Paste(const App::Property &from) +{ + aboutToSetValue(); + _lValueList = dynamic_cast(from)._lValueList; + hasSetValue(); +} + +unsigned int PropertyNormalList::getMemSize (void) const +{ + return static_cast(_lValueList.size() * sizeof(Base::Vector3f)); } void PropertyNormalList::transform(const Base::Matrix4D &mat) @@ -111,17 +396,17 @@ void PropertyNormalList::removeIndices( const std::vector& uIndic std::vector uSortedInds = uIndices; std::sort(uSortedInds.begin(), uSortedInds.end()); - const std::vector& rValueList = getValues(); + const std::vector& rValueList = getValues(); assert( uSortedInds.size() <= rValueList.size() ); if ( uSortedInds.size() > rValueList.size() ) return; - std::vector remainValue; + std::vector remainValue; remainValue.reserve(rValueList.size() - uSortedInds.size()); std::vector::iterator pos = uSortedInds.begin(); - for ( std::vector::const_iterator it = rValueList.begin(); it != rValueList.end(); ++it ) { + for ( std::vector::const_iterator it = rValueList.begin(); it != rValueList.end(); ++it ) { unsigned long index = it - rValueList.begin(); if (pos == uSortedInds.end()) remainValue.push_back( *it ); @@ -291,7 +576,7 @@ void PropertyCurvatureList::SaveDocFile (Base::Writer &writer) const } } -void PropertyCurvatureList::RestoreDocFile(Base::Reader &reader, const int FileVersion) +void PropertyCurvatureList::RestoreDocFile(Base::Reader &reader) { Base::InputStream str(reader); uint32_t uCt=0; diff --git a/src/Mod/Points/App/Properties.h b/src/Mod/Points/App/Properties.h index a48d6469d..004cfecf5 100644 --- a/src/Mod/Points/App/Properties.h +++ b/src/Mod/Points/App/Properties.h @@ -55,47 +55,101 @@ public: } }; -/** - * Own class to distinguish from real float list - */ -class PointsExport PropertyGreyValueList : public App::PropertyFloatList +class PointsExport PropertyGreyValueList: public App::PropertyLists { TYPESYSTEM_HEADER(); public: - PropertyGreyValueList() - { - } - virtual ~PropertyGreyValueList() - { - } + PropertyGreyValueList(); + virtual ~PropertyGreyValueList(); + + virtual void setSize(int newSize); + virtual int getSize(void) const; + + /** Sets the property + */ + void setValue(float); + + /// index operator + float operator[] (const int idx) const {return _lValueList.operator[] (idx);} + + void set1Value (const int idx, float value){_lValueList.operator[] (idx) = value;} + void setValues (const std::vector& values); + + const std::vector &getValues(void) const{return _lValueList;} + + virtual PyObject *getPyObject(void); + virtual void setPyObject(PyObject *); + + virtual void Save (Base::Writer &writer) const; + virtual void Restore(Base::XMLReader &reader); + + virtual void SaveDocFile (Base::Writer &writer) const; + virtual void RestoreDocFile(Base::Reader &reader); + + virtual App::Property *Copy(void) const; + virtual void Paste(const App::Property &from); + virtual unsigned int getMemSize (void) const; /** @name Modify */ //@{ void removeIndices( const std::vector& ); //@} + +private: + std::vector _lValueList; }; -/** - * Own class to distinguish from real vector list - */ -class PointsExport PropertyNormalList : public App::PropertyVectorList +class PointsExport PropertyNormalList: public App::PropertyLists { TYPESYSTEM_HEADER(); public: - PropertyNormalList() - { + PropertyNormalList(); + ~PropertyNormalList(); + + virtual void setSize(int newSize); + virtual int getSize(void) const; + + void setValue(const Base::Vector3f&); + void setValue(float x, float y, float z); + + const Base::Vector3f& operator[] (const int idx) const { + return _lValueList.operator[] (idx); } - virtual ~PropertyNormalList() - { + + void set1Value (const int idx, const Base::Vector3f& value) { + _lValueList.operator[] (idx) = value; } + void setValues (const std::vector& values); + + const std::vector &getValues(void) const { + return _lValueList; + } + + virtual PyObject *getPyObject(void); + virtual void setPyObject(PyObject *); + + virtual void Save (Base::Writer &writer) const; + virtual void Restore(Base::XMLReader &reader); + + virtual void SaveDocFile (Base::Writer &writer) const; + virtual void RestoreDocFile(Base::Reader &reader); + + virtual App::Property *Copy(void) const; + virtual void Paste(const App::Property &from); + + virtual unsigned int getMemSize (void) const; + /** @name Modify */ //@{ void transform(const Base::Matrix4D &rclMat); void removeIndices( const std::vector& ); //@} + +private: + std::vector _lValueList; }; /** Curvature information. */ @@ -141,7 +195,7 @@ public: void Restore(Base::XMLReader &reader); void SaveDocFile (Base::Writer &writer) const; - void RestoreDocFile(Base::Reader &reader, const int FileVersion); + void RestoreDocFile(Base::Reader &reader); //@} /** @name Undo/Redo */ diff --git a/src/Mod/Points/App/PropertyPointKernel.cpp b/src/Mod/Points/App/PropertyPointKernel.cpp index 624e4c210..f0dcf9498 100644 --- a/src/Mod/Points/App/PropertyPointKernel.cpp +++ b/src/Mod/Points/App/PropertyPointKernel.cpp @@ -134,10 +134,10 @@ void PropertyPointKernel::SaveDocFile (Base::Writer &writer) const // does nothing } -void PropertyPointKernel::RestoreDocFile(Base::Reader &reader, const int FileVersion) +void PropertyPointKernel::RestoreDocFile(Base::Reader &reader) { aboutToSetValue(); - _cPoints->RestoreDocFile(reader, FileVersion); + _cPoints->RestoreDocFile(reader); hasSetValue(); } diff --git a/src/Mod/Points/App/PropertyPointKernel.h b/src/Mod/Points/App/PropertyPointKernel.h index ee8fe9977..6f08944b5 100644 --- a/src/Mod/Points/App/PropertyPointKernel.h +++ b/src/Mod/Points/App/PropertyPointKernel.h @@ -78,7 +78,7 @@ public: void Save (Base::Writer &writer) const; void Restore(Base::XMLReader &reader); void SaveDocFile (Base::Writer &writer) const; - void RestoreDocFile(Base::Reader &reader, const int FileVersion); + void RestoreDocFile(Base::Reader &reader); //@} /** @name Modification */ diff --git a/src/Mod/Points/Gui/ViewProvider.cpp b/src/Mod/Points/Gui/ViewProvider.cpp index bc0cb3040..1a28a7ae6 100644 --- a/src/Mod/Points/Gui/ViewProvider.cpp +++ b/src/Mod/Points/Gui/ViewProvider.cpp @@ -125,14 +125,14 @@ void ViewProviderPoints::setVertexColorMode(App::PropertyColorList* pcProperty) void ViewProviderPoints::setVertexGreyvalueMode(Points::PropertyGreyValueList* pcProperty) { - const std::vector& val = pcProperty->getValues(); + const std::vector& val = pcProperty->getValues(); unsigned long i=0; pcColorMat->enableNotify(false); pcColorMat->diffuseColor.deleteValues(0); pcColorMat->diffuseColor.setNum(val.size()); - for ( std::vector::const_iterator it = val.begin(); it != val.end(); ++it ) { + for ( std::vector::const_iterator it = val.begin(); it != val.end(); ++it ) { pcColorMat->diffuseColor.set1Value(i++, SbColor(*it, *it, *it)); } @@ -142,14 +142,14 @@ void ViewProviderPoints::setVertexGreyvalueMode(Points::PropertyGreyValueList* p void ViewProviderPoints::setVertexNormalMode(Points::PropertyNormalList* pcProperty) { - const std::vector& val = pcProperty->getValues(); + const std::vector& val = pcProperty->getValues(); unsigned long i=0; pcPointsNormal->enableNotify(false); pcPointsNormal->vector.deleteValues(0); pcPointsNormal->vector.setNum(val.size()); - for ( std::vector::const_iterator it = val.begin(); it != val.end(); ++it ) { + for ( std::vector::const_iterator it = val.begin(); it != val.end(); ++it ) { pcPointsNormal->vector.set1Value(i++, it->x, it->y, it->z); } @@ -469,8 +469,8 @@ void ViewProviderPointsBuilder::createPoints(const App::Property* prop, SoCoordi // get all points int idx=0; - const std::vector& kernel = cPts.getBasicPoints(); - for (std::vector::const_iterator it = kernel.begin(); it != kernel.end(); ++it, idx++) { + const std::vector& kernel = cPts.getBasicPoints(); + for (std::vector::const_iterator it = kernel.begin(); it != kernel.end(); ++it, idx++) { coords->point.set1Value(idx, (float)it->x, (float)it->y, (float)it->z); }