24
24
#include "PreCompiled.h"
27
27
# include <Inventor/SoDB.h>
28
28
# include <Inventor/SoInput.h>
29
29
# include <Inventor/nodes/SoSeparator.h>
32
33
#include "ViewProviderInventorObject.h"
33
#include <App/InventorObject.h>
34
#include <Gui/SoFCSelection.h>
35
#include <App/InventorObject.h>
36
#include <App/Document.h>
34
37
#include <Base/FileInfo.h>
35
38
#include <Base/Stream.h>
40
43
PROPERTY_SOURCE(Gui::ViewProviderInventorObject, Gui::ViewProviderDocumentObject)
42
45
ViewProviderInventorObject::ViewProviderInventorObject()
44
pcBuffer = new SoSeparator();
47
pcBuffer = new SoSeparator();
46
pcFile = new SoSeparator();
49
pcFile = new SoSeparator();
50
53
ViewProviderInventorObject::~ViewProviderInventorObject()
56
59
void ViewProviderInventorObject::attach(App::DocumentObject *pcObj)
58
61
ViewProviderDocumentObject::attach(pcObj);
59
SoGroup* pcFileBuf = new SoGroup();
60
pcFileBuf->addChild(pcBuffer);
61
pcFileBuf->addChild(pcFile);
62
addDisplayMaskMode(pcFileBuf, "FileBuffer");
63
addDisplayMaskMode(pcBuffer, "Buffer");
64
addDisplayMaskMode(pcFile, "File");
67
void ViewProviderInventorObject::setDisplayMode(const char* ModeName)
69
if ( strcmp("File+Buffer",ModeName)==0 )
70
setDisplayMaskMode("FileBuffer");
71
else if ( strcmp("Buffer",ModeName)==0 )
72
setDisplayMaskMode("Buffer");
73
else if ( strcmp("File",ModeName)==0 )
74
setDisplayMaskMode("File");
75
ViewProviderDocumentObject::setDisplayMode( ModeName );
78
std::vector<std::string> ViewProviderInventorObject::getDisplayModes(void) const
80
std::vector<std::string> StrList;
81
StrList.push_back("File+Buffer");
82
StrList.push_back("Buffer");
83
StrList.push_back("File");
62
SoGroup* pcFileBuf = new SoGroup();
63
pcFileBuf->addChild(pcBuffer);
64
pcFileBuf->addChild(pcFile);
65
addDisplayMaskMode(pcFileBuf, "FileBuffer");
66
addDisplayMaskMode(pcBuffer, "Buffer");
67
addDisplayMaskMode(pcFile, "File");
70
void ViewProviderInventorObject::setDisplayMode(const char* ModeName)
72
if (strcmp("File+Buffer",ModeName)==0)
73
setDisplayMaskMode("FileBuffer");
74
else if (strcmp("Buffer",ModeName)==0)
75
setDisplayMaskMode("Buffer");
76
else if (strcmp("File",ModeName)==0)
77
setDisplayMaskMode("File");
78
ViewProviderDocumentObject::setDisplayMode(ModeName);
81
std::vector<std::string> ViewProviderInventorObject::getDisplayModes(void) const
83
std::vector<std::string> StrList;
84
StrList.push_back("File+Buffer");
85
StrList.push_back("Buffer");
86
StrList.push_back("File");
87
90
void ViewProviderInventorObject::updateData(const App::Property* prop)
95
98
if (buffer.empty()) return;
96
99
in.setBuffer((void *)buffer.c_str(), buffer.size());
97
100
SoSeparator * node = SoDB::readAll(&in);
98
if (node) pcBuffer->addChild(node);
102
const char* doc = this->pcObject->getDocument()->getName();
103
const char* obj = this->pcObject->getNameInDocument();
104
adjustSelectionNodes(node, doc, obj);
105
pcBuffer->addChild(node);
100
108
if (prop == &ivObj->FileName) {
101
// read also from file
102
const char* filename = ivObj->FileName.getValue();
103
QFile file(QString::fromUtf8(filename));
109
// read also from file
110
const char* filename = ivObj->FileName.getValue();
111
QString fn = QString::fromUtf8(filename);
105
114
pcFile->removeAllChildren();
106
if (file.open(QFile::ReadOnly)) {
115
if (!fn.isEmpty() && file.open(QFile::ReadOnly)) {
107
116
QByteArray buffer = file.readAll();
108
in.setBuffer((void *)buffer.constData(), buffer.length());
117
in.setBuffer((void *)buffer.constData(), buffer.length());
109
118
SoSeparator * node = SoDB::readAll(&in);
110
if (node) pcFile->addChild(node);
120
const char* doc = this->pcObject->getDocument()->getName();
121
const char* obj = this->pcObject->getNameInDocument();
122
adjustSelectionNodes(node, doc, obj);
123
pcFile->addChild(node);
129
void ViewProviderInventorObject::adjustSelectionNodes(SoNode* child, const char* docname,
132
if (child->getTypeId().isDerivedFrom(SoFCSelection::getClassTypeId())) {
133
static_cast<SoFCSelection*>(child)->documentName = docname;
134
static_cast<SoFCSelection*>(child)->objectName = objname;
136
else if (child->getTypeId().isDerivedFrom(SoGroup::getClassTypeId())) {
137
SoGroup* group = static_cast<SoGroup*>(child);
138
for (int i=0; i<group->getNumChildren(); i++) {
139
SoNode* subchild = group->getChild(i);
140
adjustSelectionNodes(subchild, docname, objname);