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:
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user