From cf499792e602ff3eda2732f7eb4b0381fd801f9b Mon Sep 17 00:00:00 2001 From: wmayer Date: Tue, 20 Nov 2012 13:16:15 +0100 Subject: [PATCH] 0000827: Sketch copy deletes all constraints --- src/App/Document.cpp | 46 +++++++++++++--------- src/App/Document.h | 3 +- src/Base/Reader.cpp | 9 +++++ src/Base/Reader.h | 2 + src/Gui/MergeDocuments.cpp | 80 +++++++++++--------------------------- src/Gui/MergeDocuments.h | 4 ++ 6 files changed, 67 insertions(+), 77 deletions(-) diff --git a/src/App/Document.cpp b/src/App/Document.cpp index 3ab7c2cae..7f267da34 100644 --- a/src/App/Document.cpp +++ b/src/App/Document.cpp @@ -771,32 +771,28 @@ void Document::exportObjects(const std::vector& obj, } std::vector -Document::importObjects(std::istream& input) +Document::readObjects(Base::XMLReader& reader) { std::vector objs; - zipios::ZipInputStream zipstream(input); - Base::XMLReader reader("", zipstream); - - int i,Cnt; - reader.readElement("Document"); - long scheme = reader.getAttributeAsInteger("SchemaVersion"); - reader.DocumentSchema = scheme; // read the object types - std::map nameMap; reader.readElement("Objects"); - Cnt = reader.getAttributeAsInteger("Count"); - for (i=0 ;igetNameInDocument(); + reader.addName(name.c_str(), o->getNameInDocument()); } catch (Base::Exception&) { Base::Console().Message("Cannot create object '%s'\n", name.c_str()); @@ -807,9 +803,9 @@ Document::importObjects(std::istream& input) // read the features itself reader.readElement("ObjectData"); Cnt = reader.getAttributeAsInteger("Count"); - for (i=0 ;iStatusBits.set(4); @@ -820,12 +816,26 @@ Document::importObjects(std::istream& input) } reader.readEndElement("ObjectData"); + return objs; +} + +std::vector +Document::importObjects(Base::XMLReader& reader) +{ + reader.readElement("Document"); + long scheme = reader.getAttributeAsInteger("SchemaVersion"); + reader.DocumentSchema = scheme; + + std::vector objs = readObjects(reader); + reader.readEndElement("Document"); signalImportObjects(objs, reader); - reader.readFiles(zipstream); + // reset all touched - for (std::vector::iterator it= objs.begin();it!=objs.end();++it) + for (std::vector::iterator it= objs.begin();it!=objs.end();++it) { + (*it)->onDocumentRestored(); (*it)->purgeTouched(); + } return objs; } diff --git a/src/App/Document.h b/src/App/Document.h index 9b705e8c9..740ab75ba 100644 --- a/src/App/Document.h +++ b/src/App/Document.h @@ -115,7 +115,7 @@ public: void restore (void); void exportObjects(const std::vector&, std::ostream&); void exportGraphviz(std::ostream&); - std::vector importObjects(std::istream&); + std::vector importObjects(Base::XMLReader& reader); /// Opens the document from its file name //void open (void); /// Is the document already saved to a file @@ -266,6 +266,7 @@ protected: /// checks if a valid transaction is open void _checkTransaction(void); void breakDependency(DocumentObject* pcObject, bool clear); + std::vector readObjects(Base::XMLReader& reader); void onChanged(const Property* prop); /// callback from the Document objects before property will be changed diff --git a/src/Base/Reader.cpp b/src/Base/Reader.cpp index 6791b99f6..496f583da 100644 --- a/src/Base/Reader.cpp +++ b/src/Base/Reader.cpp @@ -360,6 +360,15 @@ bool Base::XMLReader::isRegistered(Base::Persistence *Object) const return false; } +void Base::XMLReader::addName(const char*, const char*) +{ +} + +const char* Base::XMLReader::getName(const char* name) const +{ + return name; +} + // --------------------------------------------------------------------------- // Base::XMLReader: Implementation of the SAX DocumentHandler interface // --------------------------------------------------------------------------- diff --git a/src/Base/Reader.h b/src/Base/Reader.h index 7e55575d4..f35ff379d 100644 --- a/src/Base/Reader.h +++ b/src/Base/Reader.h @@ -159,6 +159,8 @@ public: /// get all registered file names const std::vector& getFilenames() const; bool isRegistered(Base::Persistence *Object) const; + virtual void addName(const char*, const char*); + virtual const char* getName(const char*) const; //@} /// Schema Version of the document diff --git a/src/Gui/MergeDocuments.cpp b/src/Gui/MergeDocuments.cpp index 52713fa47..9b53d960c 100644 --- a/src/Gui/MergeDocuments.cpp +++ b/src/Gui/MergeDocuments.cpp @@ -42,10 +42,22 @@ namespace Gui { class XMLMergeReader : public Base::XMLReader { public: - XMLMergeReader(const std::map& name, const char* FileName, std::istream& str) + XMLMergeReader(std::map& name, const char* FileName, std::istream& str) : Base::XMLReader(FileName, str), nameMap(name) {} + void addName(const char* s1, const char* s2) + { + nameMap[s1] = s2; + } + const char* getName(const char* name) const + { + std::map::const_iterator it = nameMap.find(name); + if (it != nameMap.end()) + return it->second.c_str(); + else + return name; + } protected: void startElement(const XMLCh* const uri, const XMLCh* const localname, const XMLCh* const qname, @@ -75,7 +87,7 @@ protected: } private: - const std::map& nameMap; + std::map& nameMap; typedef std::pair PropertyTag; std::stack propertyStack; }; @@ -104,64 +116,14 @@ unsigned int MergeDocuments::getMemSize (void) const std::vector MergeDocuments::importObjects(std::istream& input) { - //std::map nameMap; - std::vector objs; - zipios::ZipInputStream zipstream(input); - XMLMergeReader reader(nameMap,"", zipstream); + this->nameMap.clear(); + this->stream = new zipios::ZipInputStream(input); + XMLMergeReader reader(this->nameMap,"", *stream); + std::vector objs = appdoc->importObjects(reader); - int i,Cnt; - reader.readElement("Document"); - long scheme = reader.getAttributeAsInteger("SchemaVersion"); - reader.DocumentSchema = scheme; + delete this->stream; + this->stream = 0; - // read the object types - nameMap.clear(); - reader.readElement("Objects"); - Cnt = reader.getAttributeAsInteger("Count"); - for (i=0 ;iaddObject(type.c_str(),name.c_str()); - objs.push_back(o); - // use this name for the later access because an object with - // the given name may already exist - nameMap[name] = o->getNameInDocument(); - } - catch (Base::Exception&) { - Base::Console().Message("Cannot create object '%s'\n", name.c_str()); - } - } - reader.readEndElement("Objects"); - - // read the features itself - reader.readElement("ObjectData"); - Cnt = reader.getAttributeAsInteger("Count"); - for (i=0 ;igetObject(name.c_str()); - if (pObj) { // check if this feature has been registered -// pObj->StatusBits.set(4); - pObj->Restore(reader); -// pObj->StatusBits.reset(4); - } - reader.readEndElement("Object"); - } - reader.readEndElement("ObjectData"); - - reader.readEndElement("Document"); - appdoc->signalImportObjects(objs, reader); - reader.readFiles(zipstream); - // reset all touched - for (std::vector::iterator it= objs.begin();it!=objs.end();++it) - (*it)->purgeTouched(); return objs; } @@ -173,6 +135,8 @@ void MergeDocuments::importObject(const std::vector& o, Ba if (vp) vp->hide(); } Restore(r); + + r.readFiles(*this->stream); } void MergeDocuments::exportObject(const std::vector& o, Base::Writer & w) diff --git a/src/Gui/MergeDocuments.h b/src/Gui/MergeDocuments.h index 817ae9119..42bc252e0 100644 --- a/src/Gui/MergeDocuments.h +++ b/src/Gui/MergeDocuments.h @@ -27,6 +27,9 @@ #include #include +namespace zipios { +class ZipInputStream; +} namespace App { class Document; class DocumentObject; @@ -49,6 +52,7 @@ public: void RestoreDocFile(Base::Reader & r); private: + zipios::ZipInputStream* stream; App::Document* appdoc; Gui::Document* document; std::vector objects;