Commit a393625f by Stefan Philips
parents e6eda76a 32e268bd
Pipeline #348 passed with stages
in 52 minutes 52 seconds
//---------------------------------------------------------------------------
//
// Project: OpenWalnut ( http://www.openwalnut.org )
//
// Copyright 2017 OpenWalnut Community, Hochschule Worms
// For more information see http://www.openwalnut.org/copying
//
// This file is part of OpenWalnut.
//
// OpenWalnut is free software: you can redistribute it and/or modify
// it under the terms of the GNU Lesser General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// OpenWalnut is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU Lesser General Public License for more details.
//
// You should have received a copy of the GNU Lesser General Public License
// along with OpenWalnut. If not, see <http://www.gnu.org/licenses/>.
//
//---------------------------------------------------------------------------
#include "../../common/math/linearAlgebra/WPosition.h"
#include "../../common/WTransferable.h"
#include "WSinglePosition.h"
// The prototype as singleton. Created during first getPrototype() call
boost::shared_ptr< WPrototyped > WSinglePosition::m_prototype = boost::shared_ptr< WPrototyped >();
WSinglePosition::WSinglePosition()
: WTransferable(),
WPosition()
{
}
WSinglePosition::WSinglePosition( const WPosition& position )
: WTransferable(),
WPosition( position )
{
}
WSinglePosition::~WSinglePosition()
{
}
boost::shared_ptr< WPrototyped > WSinglePosition::getPrototype()
{
if( !m_prototype )
{
m_prototype = boost::shared_ptr< WPrototyped >( new WSinglePosition() );
}
return m_prototype;
}
//---------------------------------------------------------------------------
//
// Project: OpenWalnut ( http://www.openwalnut.org )
//
// Copyright 2017 OpenWalnut Community, Hochschule Worms
// For more information see http://www.openwalnut.org/copying
//
// This file is part of OpenWalnut.
//
// OpenWalnut is free software: you can redistribute it and/or modify
// it under the terms of the GNU Lesser General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// OpenWalnut is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU Lesser General Public License for more details.
//
// You should have received a copy of the GNU Lesser General Public License
// along with OpenWalnut. If not, see <http://www.gnu.org/licenses/>.
//
//---------------------------------------------------------------------------
#ifndef WSINGLEPOSITION_H
#define WSINGLEPOSITION_H
#include <string>
#include "../../common/math/linearAlgebra/WPosition.h"
#include "../../common/WTransferable.h"
/**
* Represents a single position that is transferable between modules by connectors.
*/
class WSinglePosition: public WTransferable, public WPosition // NOLINT
{
public:
/**
* Shared pointer abbreviation.
*/
typedef boost::shared_ptr< WSinglePosition > SPtr;
/**
* Const shared pointer abbreviation.
*/
typedef boost::shared_ptr< const WSinglePosition > ConstSPtr;
/**
* Copies the specified \ref WPosition instance.
*
* \param position the instance to clone.
*/
explicit WSinglePosition( const WPosition& position );
/**
* Constructs an empty position.
*/
WSinglePosition();
/**
* Destructs.
*/
virtual ~WSinglePosition();
/**
* The name of this transferable. This is useful information for the users.
*
* \return the name.
*/
virtual const std::string getName() const;
/**
*
* The description of this transferable. This is useful information for the users.
*
* \return A description
*/
virtual const std::string getDescription() const;
/**
* Returns a prototype instantiated with the true type of the deriving class.
*
* \return the prototype.
*/
static boost::shared_ptr< WPrototyped > getPrototype();
protected:
/**
* Prototype for this dataset
*/
static boost::shared_ptr< WPrototyped > m_prototype;
};
inline const std::string WSinglePosition::getName() const
{
return "SinglePosition";
}
inline const std::string WSinglePosition::getDescription() const
{
return "A single 3D position that can be used for module connectors.";
}
#endif // WSINGLEPOSITION_H
......@@ -79,7 +79,7 @@ public:
*
* \return reference to the (i,j) element of the table
*/
T& operator()( size_t i, size_t j ) throw( WOutOfBounds );
T& operator()( size_t i, size_t j );
/**
* Const version of the element access.
......@@ -91,7 +91,7 @@ public:
*
* \return Const reference to the (i,j) element of the table
*/
const T& operator()( size_t i, size_t j ) const throw( WOutOfBounds );
const T& operator()( size_t i, size_t j ) const;
/**
* Returns the number of elements stored in this matrix.
......@@ -117,7 +117,7 @@ public:
*
* \param data new data in row major arrangement
*/
void setData( const std::vector< T > &data ) throw( WOutOfBounds );
void setData( const std::vector< T > &data );
/**
* Renders the matrix to a full nxn matrix, where the main diagonal is set to 0.0 and the m(i,j) == m(j,i).
......@@ -153,7 +153,7 @@ inline WMatrixSym< T >::WMatrixSym()
}
template< typename T >
inline const T& WMatrixSym< T >::operator()( size_t i, size_t j ) const throw( WOutOfBounds )
inline const T& WMatrixSym< T >::operator()( size_t i, size_t j ) const
{
if( i == j || i >= m_n || j >= m_n )
{
......@@ -170,7 +170,7 @@ inline const T& WMatrixSym< T >::operator()( size_t i, size_t j ) const throw( W
template< typename T >
inline T& WMatrixSym< T >::operator()( size_t i, size_t j ) throw( WOutOfBounds )
inline T& WMatrixSym< T >::operator()( size_t i, size_t j )
{
if( i == j || i >= m_n || j >= m_n )
{
......@@ -313,7 +313,7 @@ inline const typename std::vector< T >& WMatrixSym< T >::getData() const
}
template< typename T >
inline void WMatrixSym< T >::setData( const std::vector< T > &data ) throw( WOutOfBounds )
inline void WMatrixSym< T >::setData( const std::vector< T > &data )
{
if( m_n * ( m_n - 1 ) / 2 != data.size() )
{
......
......@@ -1000,7 +1000,7 @@ public:
*
* \throw WOutOfBounds if the specified index is invalid
*/
ValueT& at( size_t row, size_t col ) throw( WOutOfBounds )
ValueT& at( size_t row, size_t col )
{
if( ( row >= Rows ) || ( col >= Cols ) )
{
......@@ -1023,7 +1023,7 @@ public:
*
* \throw WOutOfBounds if the specified index is invalid
*/
const ValueT& at( size_t row, size_t col ) const throw( WOutOfBounds )
const ValueT& at( size_t row, size_t col ) const
{
if( ( row >= Rows ) || ( col >= Cols ) )
{
......
......@@ -60,9 +60,9 @@ public:
/**
* Another helper class derived from WPrototyped. Used to check against \ref SomePrototypeClass1.
* Another helper class derived from \ref SomePrototypeClass1. Used to check against \ref SomePrototypeClass1.
*/
class SomePrototypeClass2: public WPrototyped
class SomePrototypeClass2: public SomePrototypeClass1
{
public:
/**
......@@ -87,6 +87,33 @@ public:
};
/**
* Another helper class derived from WPrototyped. Used to check against \ref SomePrototypeClass1.
*/
class SomePrototypeClass3: public WPrototyped
{
public:
/**
* Gets the name of this prototype.
*
* \return the name.
*/
virtual const std::string getName() const
{
return "test3";
};
/**
* Gets the description for this prototype.
*
* \return the description
*/
virtual const std::string getDescription() const
{
return "test3";
};
};
/**
* Test WPrototyped
*/
class WPrototypedTest : public CxxTest::TestSuite
......@@ -99,22 +126,30 @@ public:
{
SomePrototypeClass1 a;
SomePrototypeClass2 b;
SomePrototypeClass3 c;
// check the type checking mechanism in WPrototyped
// these should be true
TS_ASSERT( a.isA< WPrototyped >() );
TS_ASSERT( a.isA< SomePrototypeClass1 >() );
TS_ASSERT( b.isA< WPrototyped >() );
TS_ASSERT( b.isA< SomePrototypeClass2 >() );
TS_ASSERT( b.isA< SomePrototypeClass1 >() );
// The following lines would cause a warning
// "nonnull argument 'this' compared to NULL"
// because they would be always true,
// thus they are commented out.
//TS_ASSERT( a.isA< WPrototyped >() );
//TS_ASSERT( b.isA< WPrototyped >() );
//TS_ASSERT( c.isA< WPrototyped >() );
// check against other types not in polymorphic relation to each other (except the base class)
TS_ASSERT( !a.isA< SomePrototypeClass2 >() );
TS_ASSERT( !b.isA< SomePrototypeClass1 >() );
TS_ASSERT( !a.isA< SomePrototypeClass3 >() );
TS_ASSERT( !b.isA< SomePrototypeClass3 >() );
TS_ASSERT( !c.isA< SomePrototypeClass1 >() );
TS_ASSERT( !c.isA< SomePrototypeClass2 >() );
}
};
#endif // WPROTOTYPED_TEST_H
......@@ -82,7 +82,7 @@ std::string WEEGChannelInfo::getLabel() const
return m_label;
}
WPosition WEEGChannelInfo::getPosition() const throw( WDHException )
WPosition WEEGChannelInfo::getPosition() const
{
if( m_hasPosition )
{
......
......@@ -78,7 +78,7 @@ public:
*
* \return position
*/
WPosition getPosition() const throw( WDHException );
WPosition getPosition() const;
protected:
private:
......
......@@ -40,7 +40,7 @@ WEEGPositionsLibrary::WEEGPositionsLibrary( const std::map< std::string, WPositi
}
}
WPosition WEEGPositionsLibrary::getPosition( std::string label ) const throw( WOutOfBounds )
WPosition WEEGPositionsLibrary::getPosition( std::string label ) const
{
std::map< std::string, WPosition >::const_iterator iter = m_positions.find( string_utils::toUpper( label ) );
......
......@@ -53,7 +53,7 @@ public:
* \param label label of the electrode
* \return position of the electrode
*/
WPosition getPosition( std::string label ) const throw( WOutOfBounds );
WPosition getPosition( std::string label ) const;
protected:
private:
......
......@@ -28,17 +28,17 @@
#include "../exceptions/WDHNoSuchFile.h"
#include "WReader.h"
WReader::WReader( std::string fname ) throw( WDHNoSuchFile )
WReader::WReader( std::string fname )
{
setFilename( fname ); // not in constructor list since fileExcsits check
}
void WReader::setFileName( std::string fname ) throw( WDHNoSuchFile )
void WReader::setFileName( std::string fname )
{
setFilename( fname );
}
void WReader::setFilename( std::string fname ) throw( WDHNoSuchFile )
void WReader::setFilename( std::string fname )
{
m_fname = fname;
if( !fileExists( m_fname ) )
......
......@@ -45,7 +45,7 @@ public:
* \param fname path to file which should be loaded
* \throws WDHNoSuchFile
*/
explicit WReader( std::string fname ) throw( WDHNoSuchFile );
explicit WReader( std::string fname );
/**
* Reset the file name and checks if it exists.
......@@ -54,7 +54,7 @@ public:
* \throws WDHNoSuchFile
* \deprecated use setFilename instead.
*/
OW_API_DEPRECATED void setFileName( std::string fname ) throw( WDHNoSuchFile );
OW_API_DEPRECATED void setFileName( std::string fname );
/**
* Reset the file name and checks if it exists.
......@@ -62,7 +62,7 @@ public:
* \param fname file name
* \throws WDHNoSuchFile
*/
void setFilename( std::string fname ) throw( WDHNoSuchFile );
void setFilename( std::string fname );
protected:
std::string m_fname; //!< Absolute path of the file to read from
......
......@@ -93,6 +93,7 @@ WGEViewer::WGEViewer( std::string name, osg::ref_ptr<osg::Referenced> wdata, int
m_View->addEventHandler( m_pickHandler );
if( name != std::string( "Main View" ) )
break;
/* FALLTHRU */
case( WGECamera::PERSPECTIVE ):
// camera manipulator
m_View->setCameraManipulator( new WGEZoomTrackballManipulator() );
......
......@@ -118,6 +118,7 @@ bool WPickHandler::handle( const osgGA::GUIEventAdapter& ea, osgGA::GUIActionAda
break;
case osgGA::GUIEventAdapter::SCROLL_DOWN:
m_scrollWheel--;
break;
case osgGA::GUIEventAdapter::SCROLL_2D:
// FIXME: the osg doc tells us nothing about this value, but is seems to be always 120 or -120
if( ea.getScrollingDeltaY() > 0 )
......
......@@ -33,6 +33,7 @@ extern "C"
#include <cstddef>
#include <cstdio>
#include <iostream>
#include <sstream>
#include <string>
#include <vector>
......@@ -84,9 +85,7 @@ WPagerEEGLibeep::~WPagerEEGLibeep()
int status = eep_fclose( m_eeg );
if( status != CNTERR_NONE )
{
std::ostringstream stream;
stream << getFilename() << " could not be closed. Libeep status code: " << status;
throw WDHIOFailure( stream.str() );
std::cout << getFilename() << " could not be closed. Libeep status code: " << status << std::endl;
}
}
......@@ -189,4 +188,3 @@ std::string WPagerEEGLibeep::getChannelLabel( std::size_t channelID ) const
}
#endif // WEEP_ENABLED
......@@ -32,7 +32,7 @@
#include "WReaderEEG.h"
WReaderEEG::WReaderEEG( std::string fileName ) throw( WDHIOFailure )
WReaderEEG::WReaderEEG( std::string fileName )
: WReader( fileName )
{
}
......
......@@ -45,7 +45,7 @@ protected:
* \param fileName Path to be loaded
* \throw WDHIOFailure in case of an error
*/
explicit WReaderEEG( std::string fileName ) throw( WDHIOFailure );
explicit WReaderEEG( std::string fileName );
/**
* Load electrode positions from ELC file with same name
......
......@@ -112,6 +112,7 @@ boost::shared_ptr< WDataSet > WReaderVTK::read()
break;
case TENSORS:
ds = boost::shared_ptr< WDataSet >( new WDataSetDTI( values, grid ) );
break;
case ARRAYS:
if( values->dimension() > 6 )
{
......
......@@ -55,7 +55,7 @@ WEEGEvent::WEEGEvent( double time,
osg::ref_ptr< WGEGroupNode > parentNode,
bool snapToDipole,
bool proofOfConcept,
boost::shared_ptr< WDataSetDipoles > dipoles ) throw( WOutOfBounds )
boost::shared_ptr< WDataSetDipoles > dipoles )
: m_time( time ),
m_parentNode( parentNode )
{
......
......@@ -65,7 +65,7 @@ public:
osg::ref_ptr< WGEGroupNode > parentNode,
bool snapToDipole,
bool proofOfConcept,
boost::shared_ptr< WDataSetDipoles > dipoles ) throw( WOutOfBounds );
boost::shared_ptr< WDataSetDipoles > dipoles );
/**
* Constructor for an empty event
......
......@@ -82,7 +82,7 @@
// Optional description for a resource
description ="First Steps Tutorial, showing the first steps to take with OpenWalnut.";
// The URL. Required.
url="http://redmine.openwalnut.org/projects/openwalnut/wiki/FirstSteps";
url="https://bsvgit.informatik.uni-leipzig.de/openwalnut/openwalnut/wikis/FirstSteps";
};
// Multiple online resources allowed.
online
......
......@@ -35,6 +35,7 @@
#include <osg/ShapeDrawable>
#include <osgViewer/View>
#include "core/common/datastructures/WSinglePosition.h"
#include "core/dataHandler/WDataSetScalar.h"
#include "core/graphicsEngine/WGEGeodeUtils.h"
#include "core/graphicsEngine/WGEManagedGroupNode.h"
......@@ -64,10 +65,11 @@ W_LOADABLE_MODULE( WMPickingDVR )
WMPickingDVR::WMPickingDVR():
WModule(),
m_propCondition( new WCondition() ),
m_intersected( false ),
m_curve3D( 0 ),
m_oldRayStart( 0.0, 0.0, 0.0 )
m_oldRayStart( 0.0, 0.0, 0.0 ),
m_pickHandlerConnected( false )
{
m_intersected = false;
m_posStart = osg::Vec3f( 0.0, 0.0, 0.0 );
m_posEnd = osg::Vec3f( 0.0, 0.0, 0.0 );
}
......@@ -93,8 +95,15 @@ const std::string WMPickingDVR::getDescription() const
void WMPickingDVR::connectors()
{
m_transferFunction = WModuleInputData< WDataSetSingle >::createAndAdd( shared_from_this(), "transfer function", "The 1D transfer function." );
m_scalarIC = WModuleInputData< WDataSetScalar >::createAndAdd( shared_from_this(), "scalar data", "Scalar data." );
m_transferFunction = WModuleInputData< WDataSetSingle >::createAndAdd( shared_from_this(),
"transfer function",
"The 1D transfer function." );
m_scalarIC = WModuleInputData< WDataSetScalar >::createAndAdd( shared_from_this(),
"scalar data",
"Scalar data." );
m_externalScreenPos = WModuleInputData< WSinglePosition >::createAndAdd( shared_from_this(),
"External Screen Position",
"External screen position for picking." );
WModule::connectors();
}
......@@ -201,6 +210,7 @@ void WMPickingDVR::moduleMain()
m_moduleState.setResetable( true, true );
m_moduleState.add( m_scalarIC->getDataChangedCondition() );
m_moduleState.add( m_transferFunction->getDataChangedCondition() );
m_moduleState.add( m_externalScreenPos->getDataChangedCondition() );
m_moduleState.add( m_propCondition );
ready();
......@@ -209,13 +219,6 @@ void WMPickingDVR::moduleMain()
m_rootNode = osg::ref_ptr< WGEManagedGroupNode >( new WGEManagedGroupNode( m_active ) );
WKernel::getRunningKernel()->getGraphicsEngine()->getScene()->insert( m_rootNode );
//Get Camera and Register the callback
boost::shared_ptr< WGraphicsEngine > graphicsEngine = WGraphicsEngine::getGraphicsEngine();
boost::shared_ptr< WGEViewer > mainView = graphicsEngine->getViewerByName( "Main View" );
// Register PickHandler
mainView->getPickHandler()->getPickSignal()->connect( boost::bind( &WMPickingDVR::pickHandler, this, _1 ) );
// Main loop
while( !m_shutdownFlag() )
{
......@@ -228,6 +231,8 @@ void WMPickingDVR::moduleMain()
break;
}
setPickPositionSource();
std::string pickingMode;
const int selectionType = m_selectionType->get( true ).getItemIndexOfSelected( 0 );
......@@ -251,6 +256,11 @@ void WMPickingDVR::moduleMain()
if( selectionType == 0 )
{
if( m_externalScreenPos->isConnected() != 0 && m_externalScreenPos->getData() )
{
setPickPositionFromConnector();
}
// Valid position picked on proxy cube
if( m_intersected )
{
......@@ -343,7 +353,7 @@ void WMPickingDVR::pickHandler( WPickInfo pickInfo )
boost::shared_ptr< WGraphicsEngine > graphicsEngine = WGraphicsEngine::getGraphicsEngine();
boost::shared_ptr< WGEViewer > mainView = graphicsEngine->getViewerByName( "Main View" );
osg::ref_ptr<osgViewer::Viewer> view = mainView->getView();
osg::ref_ptr< osgViewer::Viewer > view = mainView->getView();
osgUtil::LineSegmentIntersector::Intersections intersections;
float fPosX = pickInfo.getPickPixel().x();
......@@ -365,6 +375,55 @@ void WMPickingDVR::pickHandler( WPickInfo pickInfo )
}
}
void WMPickingDVR::setPickPositionSource()
{
// Get Camera and Register the callback
boost::shared_ptr< WGraphicsEngine > graphicsEngine = WGraphicsEngine::getGraphicsEngine();
boost::shared_ptr< WGEViewer > mainView = graphicsEngine->getViewerByName( "Main View" );
if( m_externalScreenPos->isConnected() == 0 )
{
if( !m_pickHandlerConnected )
{
// Register PickHandler
mainView->getPickHandler()->getPickSignal()->connect( boost::bind( &WMPickingDVR::pickHandler, this, _1 ) );
m_pickHandlerConnected = true;
}
}
else
{
if( m_pickHandlerConnected )
{
// Register PickHandler
mainView->getPickHandler()->getPickSignal()->disconnect( boost::bind( &WMPickingDVR::pickHandler, this, _1 ) );
m_pickHandlerConnected = false;
}
}
}
void WMPickingDVR::setPickPositionFromConnector()
{
float fPosX = ( *( m_externalScreenPos->getData() ) )[0];
float fPosY = ( *( m_externalScreenPos->getData() ) )[1];
boost::shared_ptr< WGraphicsEngine > graphicsEngine = WGraphicsEngine::getGraphicsEngine();
boost::shared_ptr< WGEViewer > mainView = graphicsEngine->getViewerByName( "Main View" );
osg::ref_ptr< osgViewer::Viewer > view = mainView->getView();
osgUtil::LineSegmentIntersector::Intersections intersections;
bool intersected = view->computeIntersections( fPosX, fPosY, intersections, 0xFFFFFFFF );
if( intersected )
{
osgUtil::LineSegmentIntersector::Intersection start= *intersections.begin();
osgUtil::LineSegmentIntersector::Intersection end = *intersections.rbegin();
m_posStart = start.getWorldIntersectPoint();
m_posEnd = end.getWorldIntersectPoint();
m_intersected = true;
}
}
void WMPickingDVR::updateModuleGUI( std::string pickingMode )
{
const bool picking = ( m_selectionType->get( true ).getItemIndexOfSelected( 0 ) == 0 );
......@@ -444,7 +503,7 @@ void WMPickingDVR::calculateIntervalsWYSIWYP( const std::vector<double>& vecAlph
PickingDVRHelper::calculateDerivativesWYSIWYP( vecAlphaAcc, vecFirstDerivative, vecSecondDerivative );
// Calculate interval boundaries
double oldDerivative;
double oldDerivative = 0; // irrelevant, just initialized to quiet compiler.
if( vecSecondDerivative.size() > 0 )
{
oldDerivative = vecSecondDerivative[0];
......
......@@ -36,6 +36,7 @@
// forward declarations to reduce compile dependencies
template< class T > class WModuleInputData;
class WDataSetScalar;
class WSinglePosition;
class WGEManagedGroupNode;
/**
......@@ -105,14 +106,22 @@ private:
void pickHandler( WPickInfo pickInfo );
/**
* Check if a \ref WSinglePosition is connected and dis/connects pick signal from clicking accordingly.
*/
void setPickPositionSource();
/**
* Set the current pick position to the \ref WSinglePosition from the connector.
*/
void setPickPositionFromConnector();
/**
* Shows and hide relevant properties according to chosen picking mode.
*
* \param pickingMode The type of picking criterion used
*/
void updateModuleGUI( std::string pickingMode );
/**
* Calculates which interval is the most visible according
* to WYSIWYP (http://dx.doi.org/10.1109/TVCG.2012.292)
......@@ -196,6 +205,8 @@ private:
boost::shared_ptr< WModuleInputData< WDataSetSingle > > m_transferFunction; //!< The transfer function as an input data set
boost::shared_ptr< WModuleInputData< WSinglePosition > > m_externalScreenPos; //!< External screen position for picking instead of by clicking.
osg::ref_ptr< WGEManagedGroupNode > m_rootNode; //!< All other geodes or OSG nodes of this module will be attached on this node.
osg::ref_ptr< osg::Geode > m_geode; //!< The geometry rendered by this module.
......@@ -247,6 +258,8 @@ private:
WVisiTrace m_visiTrace; //!< Class providing VisiTrace optimization.
WPosition m_oldRayStart; //!< Used to check if position of picking has changed
bool m_pickHandlerConnected; //!< Is the signal from the pick handler connected?
};
#endif // WMPICKINGDVR_H
......@@ -33,7 +33,7 @@
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// How to create your own module in OpenWalnut? Here are the steps to take:
// * Setup your module building framework
// * See http://redmine.openwalnut.org/projects/openwalnut/wiki/Module_ExternalDevelopment for details
// * See https://bsvgit.informatik.uni-leipzig.de/openwalnut/openwalnut/wikis/Module_ExternalDevelopment for details
// * copy the template module directory
// * think about a name for your module
// * rename the files from WMTemplate.cpp and WMTemplate.h to WMYourModuleName.cpp and WMYourModuleName.h
......@@ -414,7 +414,7 @@ void WMTemplate::moduleMain()
// that your thread misses the event. The resettable flag for those condition sets can help here. Whenever a condition, managed by the
// condition set, fires, the moduleState variable remembers it. So, the next call to m_moduleState.wait() will immediately return and reset
// the "memory" of the moduleState. For more details, see:
// http://redmine.openwalnut.org/projects/openwalnut/wiki/MultithreadingHowto#How-to-wait-correctly
// https://bsvgit.informatik.uni-leipzig.de/openwalnut/openwalnut/wikis/MultithreadingHowto#how-to-wait-correctly
// Most probably, your module will be a module providing some kind of visual output. In this case, the WGEManagedGroupNode is very handy.
// It allows you to insert several nodes and transform them as the WGEGroupNode (from which WGEManagedGroupNode is derived from) is also
......
......@@ -157,7 +157,7 @@
// Optional description for a resource
description ="First Steps Tutorial, showing the first steps to take with OpenWalnut.";
// The URL. Required.
url="http://redmine.openwalnut.org/projects/openwalnut/wiki/FirstSteps";
url="https://bsvgit.informatik.uni-leipzig.de/openwalnut/openwalnut/wikis/FirstSteps";
};
// Multiple online resources allowed.
online
......@@ -207,7 +207,7 @@
// Basically the same as above, without comments. Skip this. It does not contain new information.
"Template UI"