Squashed commit of the following:

commit 89eb699e69c05dda0ebecf4aa22acc85386ede8f
Author: looooo <sppedflyer@gmail.com>
Date:   Wed Apr 27 21:43:16 2016 +0200

    added close function

commit 2acc25adbc9df47194934ef4db18383919248c7d
Author: looooo <sppedflyer@gmail.com>
Date:   Wed Apr 27 21:12:18 2016 +0200

    some additions to the split-view-bindings

commit ec366d154a96a71c7716900f4de1c109a9160df8
Author: looooo <sppedflyer@gmail.com>
Date:   Sun Apr 24 20:55:26 2016 +0200

    SplitView: Antia-Aliasing, getViewer, handlinging of deletion
    added anti-aliasing for the SplitView3DInventor class
    added method getViewer to the AbstractSplitView
    delete python-object when c++ object gets deleted

commit 7225cd836b0001d302c9e14328b5eb7dd489cdb1
Author: looooo <sppedflyer@gmail.com>
Date:   Sun Apr 24 15:28:57 2016 +0200

    added function Gui.createViewer([int])->Viewer/SplitViewer
This commit is contained in:
wmayer
2016-05-01 15:46:53 +02:00
parent e50950f070
commit e331bdbc5d
6 changed files with 217 additions and 21 deletions

View File

@@ -46,6 +46,7 @@ TYPESYSTEM_SOURCE_ABSTRACT(Gui::AbstractSplitView,Gui::MDIView);
AbstractSplitView::AbstractSplitView(Gui::Document* pcDocument, QWidget* parent, Qt::WindowFlags wflags)
: MDIView(pcDocument,parent, wflags)
{
_viewerPy = 0;
// important for highlighting
setMouseTracking(true);
}
@@ -56,6 +57,10 @@ AbstractSplitView::~AbstractSplitView()
for (std::vector<View3DInventorViewer*>::iterator it = _viewer.begin(); it != _viewer.end(); ++it) {
delete *it;
}
if (_viewerPy) {
static_cast<AbstractSplitViewPy*>(_viewerPy)->_view = 0;
Py_DECREF(_viewerPy);
}
}
void AbstractSplitView::deleteSelf()
@@ -374,8 +379,10 @@ PyObject *AbstractSplitView::getPyObject(void)
init = true;
AbstractSplitViewPy::init_type();
}
return new AbstractSplitViewPy(this);
if (!_viewerPy)
_viewerPy = new AbstractSplitViewPy(this);
Py_INCREF(_viewerPy);
return _viewerPy;
}
void AbstractSplitView::setPyObject(PyObject *)
@@ -383,6 +390,11 @@ void AbstractSplitView::setPyObject(PyObject *)
throw Base::AttributeError("Attribute is read-only");
}
int AbstractSplitView::getSize()
{
return _viewer.size();
}
// ------------------------------------------------------
void AbstractSplitViewPy::init_type()
@@ -391,6 +403,7 @@ void AbstractSplitViewPy::init_type()
behaviors().doc("Python binding class for the Inventor viewer class");
// you must have overwritten the virtual functions
behaviors().supportRepr();
behaviors().supportSequenceType();
add_varargs_method("fitAll",&AbstractSplitViewPy::fitAll,"fitAll()");
add_varargs_method("viewBottom",&AbstractSplitViewPy::viewBottom,"viewBottom()");
@@ -400,6 +413,8 @@ void AbstractSplitViewPy::init_type()
add_varargs_method("viewRight",&AbstractSplitViewPy::viewRight,"viewRight()");
add_varargs_method("viewTop",&AbstractSplitViewPy::viewTop,"viewTop()");
add_varargs_method("viewAxometric",&AbstractSplitViewPy::viewAxometric,"viewAxometric()");
add_varargs_method("getViewer",&AbstractSplitViewPy::getViewer,"getViewer(index)");
add_varargs_method("close",&AbstractSplitViewPy::close,"close()");
}
AbstractSplitViewPy::AbstractSplitViewPy(AbstractSplitView *vi)
@@ -411,6 +426,12 @@ AbstractSplitViewPy::~AbstractSplitViewPy()
{
}
void AbstractSplitViewPy::testExistence()
{
if (!(_view and _view->getViewer(0)))
throw Py::Exception("Object already deleted");
}
Py::Object AbstractSplitViewPy::repr()
{
std::string s;
@@ -425,7 +446,7 @@ Py::Object AbstractSplitViewPy::fitAll(const Py::Tuple& args)
{
if (!PyArg_ParseTuple(args.ptr(), ""))
throw Py::Exception();
testExistence();
try {
_view->onMsg("ViewFit", 0);
}
@@ -445,7 +466,7 @@ Py::Object AbstractSplitViewPy::viewBottom(const Py::Tuple& args)
{
if (!PyArg_ParseTuple(args.ptr(), ""))
throw Py::Exception();
testExistence();
try {
_view->onMsg("ViewBottom", 0);
}
@@ -466,7 +487,7 @@ Py::Object AbstractSplitViewPy::viewFront(const Py::Tuple& args)
{
if (!PyArg_ParseTuple(args.ptr(), ""))
throw Py::Exception();
testExistence();
try {
_view->onMsg("ViewFront", 0);
}
@@ -487,7 +508,7 @@ Py::Object AbstractSplitViewPy::viewLeft(const Py::Tuple& args)
{
if (!PyArg_ParseTuple(args.ptr(), ""))
throw Py::Exception();
testExistence();
try {
_view->onMsg("ViewLeft", 0);
}
@@ -508,7 +529,7 @@ Py::Object AbstractSplitViewPy::viewRear(const Py::Tuple& args)
{
if (!PyArg_ParseTuple(args.ptr(), ""))
throw Py::Exception();
testExistence();
try {
_view->onMsg("ViewRear", 0);
}
@@ -529,7 +550,7 @@ Py::Object AbstractSplitViewPy::viewRight(const Py::Tuple& args)
{
if (!PyArg_ParseTuple(args.ptr(), ""))
throw Py::Exception();
testExistence();
try {
_view->onMsg("ViewRight", 0);
}
@@ -550,7 +571,7 @@ Py::Object AbstractSplitViewPy::viewTop(const Py::Tuple& args)
{
if (!PyArg_ParseTuple(args.ptr(), ""))
throw Py::Exception();
testExistence();
try {
_view->onMsg("ViewTop", 0);
}
@@ -571,7 +592,7 @@ Py::Object AbstractSplitViewPy::viewAxometric(const Py::Tuple& args)
{
if (!PyArg_ParseTuple(args.ptr(), ""))
throw Py::Exception();
testExistence();
try {
_view->onMsg("ViewAxo", 0);
}
@@ -588,6 +609,55 @@ Py::Object AbstractSplitViewPy::viewAxometric(const Py::Tuple& args)
return Py::None();
}
Py::Object AbstractSplitViewPy::getViewer(const Py::Tuple& args)
{
int viewIndex;
if (!PyArg_ParseTuple(args.ptr(), "i", &viewIndex))
throw Py::Exception();
testExistence();
try {
return Py::Object(_view->getViewer(viewIndex)->getPyObject());
}
catch (const Base::Exception& e) {
throw Py::Exception(e.what());
}
catch (const std::exception& e) {
throw Py::Exception(e.what());
}
catch(...) {
throw Py::Exception("Unknown C++ exception");
}
return Py::None();
}
Py::Object AbstractSplitViewPy::sequence_item(ssize_t viewIndex)
{
testExistence();
if (viewIndex >= _view->getSize() or viewIndex < 0)
throw Py::Exception("Index out of range");
PyObject* viewer = _view->getViewer(viewIndex)->getPyObject();
return Py::Object(viewer);
}
int AbstractSplitViewPy::sequence_length()
{
return _view->getSize();
}
Py::Object AbstractSplitViewPy::close(const Py::Tuple& args)
{
if (!PyArg_ParseTuple(args.ptr(), ""))
throw Py::Exception();
testExistence();
_view->close();
if (_view->parentWidget())
_view->parentWidget()->deleteLater();
_view = 0;
return Py::None();
}
// ------------------------------------------------------
TYPESYSTEM_SOURCE_ABSTRACT(Gui::SplitView3DInventor, Gui::AbstractSplitView);
@@ -595,26 +665,86 @@ TYPESYSTEM_SOURCE_ABSTRACT(Gui::SplitView3DInventor, Gui::AbstractSplitView);
SplitView3DInventor::SplitView3DInventor(int views, Gui::Document* pcDocument, QWidget* parent, Qt::WindowFlags wflags)
: AbstractSplitView(pcDocument,parent, wflags)
{
QSplitter* mainSplitter=0;
// attach parameter Observer
hGrp = App::GetApplication().GetParameterGroupByPath("User parameter:BaseApp/Preferences/View");
hGrp->Attach(this);
if (views <= 3) {
//anti-aliasing settings
QGLFormat f;
bool smoothing = false;
bool glformat = false;
switch( hGrp->GetInt("AntiAliasing",0) ) {
case View3DInventorViewer::MSAA2x:
glformat = true;
f.setSampleBuffers(true);
f.setSamples(2);
break;
case View3DInventorViewer::MSAA4x:
glformat = true;
f.setSampleBuffers(true);
f.setSamples(4);
break;
case View3DInventorViewer::MSAA8x:
glformat = true;
f.setSampleBuffers(true);
f.setSamples(8);
break;
case View3DInventorViewer::Smoothing:
smoothing = true;
break;
case View3DInventorViewer::None:
default:
break;
}
QSplitter* mainSplitter=0;
// minimal 2 views
while (views < 2)
views ++;
// if views < 3 show them as a row
if (views <= 3)
{
mainSplitter = new QSplitter(Qt::Horizontal, this);
_viewer.push_back(new View3DInventorViewer(mainSplitter));
_viewer.push_back(new View3DInventorViewer(mainSplitter));
if (views==3)
_viewer.push_back(new View3DInventorViewer(mainSplitter));
for (int i=0; i < views; i++)
{
if (glformat)
_viewer.push_back(new View3DInventorViewer(f, mainSplitter));
else
_viewer.push_back(new View3DInventorViewer(mainSplitter));
}
}
else {
mainSplitter = new QSplitter(Qt::Vertical, this);
QSplitter *topSplitter = new QSplitter(Qt::Horizontal, mainSplitter);
QSplitter *botSplitter = new QSplitter(Qt::Horizontal, mainSplitter);
_viewer.push_back(new View3DInventorViewer(topSplitter));
_viewer.push_back(new View3DInventorViewer(topSplitter));
if (glformat)
{
_viewer.push_back(new View3DInventorViewer(f, mainSplitter));
_viewer.push_back(new View3DInventorViewer(f, topSplitter));
_viewer.push_back(new View3DInventorViewer(f, topSplitter));
}
else
{
_viewer.push_back(new View3DInventorViewer(mainSplitter));
_viewer.push_back(new View3DInventorViewer(topSplitter));
_viewer.push_back(new View3DInventorViewer(topSplitter));
}
for (int i=2;i<views;i++)
_viewer.push_back(new View3DInventorViewer(botSplitter));
{
if (glformat)
_viewer.push_back(new View3DInventorViewer(f, botSplitter));
else
_viewer.push_back(new View3DInventorViewer(botSplitter));
}
topSplitter->setOpaqueResize( true );
botSplitter->setOpaqueResize( true );
}
if (smoothing)
{
for (std::vector<int>::size_type i = 0; i != _viewer.size(); i++)
_viewer[i]->getSoRenderManager()->getGLRenderAction()->setSmoothing(true);
}
mainSplitter->show();
setCentralWidget(mainSplitter);