Skip to content

Commit

Permalink
Squashed commit of the following:
Browse files Browse the repository at this point in the history
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
  • Loading branch information
wwmayer committed May 1, 2016
1 parent e50950f commit e331bdb
Show file tree
Hide file tree
Showing 6 changed files with 217 additions and 21 deletions.
3 changes: 3 additions & 0 deletions src/Gui/Application.h
Expand Up @@ -245,6 +245,9 @@ class GuiExport Application
PYFUNCDEF_S(sShowDownloads);
PYFUNCDEF_S(sShowPreferences);


PYFUNCDEF_S(sCreateViewer);

static PyMethodDef Methods[];

private:
Expand Down
30 changes: 30 additions & 0 deletions src/Gui/ApplicationPy.cpp
Expand Up @@ -48,6 +48,7 @@
#include "PythonEditor.h"
#include "SoFCDB.h"
#include "View3DInventor.h"
#include "SplitView3DInventor.h"
#include "ViewProvider.h"
#include "WidgetFactory.h"
#include "Workbench.h"
Expand Down Expand Up @@ -169,6 +170,9 @@ PyMethodDef Application::Methods[] = {
{"showPreferences", (PyCFunction) Application::sShowPreferences,1,
"showPreferences([string,int]) -> None\n\n"
"Shows the preferences window. If string and int are provided, the given page index in the given group is shown."},
{"createViewer", (PyCFunction) Application::sCreateViewer,1,
"createViewer([int]) -> View3DInventor/SplitView3DInventor\n\n"
"shows and returns a viewer. If the integer argument is given and > 1: -> splitViewer"},

{NULL, NULL} /* Sentinel */
};
Expand Down Expand Up @@ -1109,3 +1113,29 @@ PyObject* Application::sShowPreferences(PyObject * /*self*/, PyObject *args,PyOb
Py_INCREF(Py_None);
return Py_None;
}


PyObject* Application::sCreateViewer(PyObject * /*self*/, PyObject *args,PyObject * /*kwd*/)
{

int num_of_views = 1;
// if one argument (int) is given
if (PyArg_ParseTuple(args, "|i", &num_of_views))
{
if (num_of_views < 0)
return NULL;
else if (num_of_views==1)
{
View3DInventor* viewer = new View3DInventor(0, 0);
Gui::getMainWindow()->addWindow(viewer);
return viewer->getPyObject();
}
else
{
SplitView3DInventor* viewer = new SplitView3DInventor(num_of_views, 0, 0);
Gui::getMainWindow()->addWindow(viewer);
return viewer->getPyObject();
}
}
return Py_None;
}
168 changes: 149 additions & 19 deletions src/Gui/SplitView3DInventor.cpp
Expand Up @@ -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);
}
Expand All @@ -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()
Expand Down Expand Up @@ -374,15 +379,22 @@ 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 *)
{
throw Base::AttributeError("Attribute is read-only");
}

int AbstractSplitView::getSize()
{
return _viewer.size();
}

// ------------------------------------------------------

void AbstractSplitViewPy::init_type()
Expand All @@ -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()");
Expand All @@ -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)
Expand All @@ -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;
Expand All @@ -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);
}
Expand All @@ -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);
}
Expand All @@ -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);
}
Expand All @@ -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);
}
Expand All @@ -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);
}
Expand All @@ -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);
}
Expand All @@ -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);
}
Expand All @@ -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);
}
Expand All @@ -588,33 +609,142 @@ 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);

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);

//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;
}

if (views <= 3) {

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);
Expand Down
10 changes: 9 additions & 1 deletion src/Gui/SplitView3DInventor.h
Expand Up @@ -32,7 +32,7 @@

namespace Gui {
class View3DInventorViewer;

class AbstractSplitViewPy;

/** The SplitView3DInventor class allows to create a window with two or more Inventor views.
* \author Werner Mayer
Expand All @@ -59,6 +59,7 @@ class GuiExport AbstractSplitView : public MDIView, public ParameterGrp::Observe

PyObject *getPyObject(void);
void setPyObject(PyObject *);
int getSize();

protected:
void setupSettings();
Expand All @@ -67,6 +68,7 @@ class GuiExport AbstractSplitView : public MDIView, public ParameterGrp::Observe
/// handle to the viewer parameter group
ParameterGrp::handle hGrp;
std::vector<View3DInventorViewer*> _viewer;
PyObject *_viewerPy;
};

class AbstractSplitViewPy : public Py::PythonExtension<AbstractSplitViewPy>
Expand All @@ -87,9 +89,15 @@ class AbstractSplitViewPy : public Py::PythonExtension<AbstractSplitViewPy>
Py::Object viewRight(const Py::Tuple&);
Py::Object viewTop(const Py::Tuple&);
Py::Object viewAxometric(const Py::Tuple&);
Py::Object getViewer(const Py::Tuple&);
Py::Object sequence_item(ssize_t);
Py::Object close(const Py::Tuple&);
int sequence_length();

private:
AbstractSplitView* _view;
friend class AbstractSplitView;
void testExistence();
};

/** The SplitView3DInventor class allows to create a window with two or more Inventor views.
Expand Down

0 comments on commit e331bdb

Please sign in to comment.