...
 
Commits (13)
......@@ -23,18 +23,18 @@ SET(CXX_DISABLE_WERROR TRUE)
INCLUDE(cmake/base.cmake)
INCLUDE(cmake/boost.cmake)
INCLUDE(cmake/python.cmake)
INCLUDE(cmake/hpp.cmake)
INCLUDE(cmake//python.cmake)
# Tells pkg-config to read qtversion and cmake_plugin from pkg config file.
LIST(APPEND PKG_CONFIG_ADDITIONAL_VARIABLES qtversion cmake_plugin)
SET(PROJECT_NAME "hpp-gui")
SET(PROJECT_URL "https://github.com/humanoid-path-planner/hpp-gui")
SET(PROJECT_DESCRIPTION "Graphical interface for HPP ")
SETUP_HPP_PROJECT()
FINDPYTHON()
ADD_REQUIRED_DEPENDENCY("gepetto-viewer-corba >= 1.3")
# Get desired Qt version
......
Subproject commit ecaf20c28c8ce33de312fbd812f88037cf995b73
Subproject commit c81a37191d764522899b5dcb4468485a826141c2
......@@ -72,7 +72,7 @@ namespace hpp {
QString name = QInputDialog::getText(NULL, "Node name", "Node name", QLineEdit::Normal, "bvhmodel");
int splitMethod = QInputDialog::getInt(NULL, "Split method type",
"Split method type", 0, 0, 3, 1);
addBV (filename, name, splitMethod);
addBV (name, filename, splitMethod);
}
#if (QT_VERSION < QT_VERSION_CHECK(5,0,0))
......
......@@ -80,7 +80,7 @@ namespace hpp {
void HppManipulationWidgetsPlugin::loadRobotModel(gepetto::gui::DialogLoadRobot::RobotDefinition rd)
{
if (hpp_) return;
if (!hpp_) return;
try {
hpp::floatSeq_var q = client ()->robot ()->getCurrentConfig();
(void)q;
......@@ -102,7 +102,7 @@ namespace hpp {
void HppManipulationWidgetsPlugin::loadEnvironmentModel(gepetto::gui::DialogLoadEnvironment::EnvironmentDefinition ed)
{
if (hpp_) return;
if (!hpp_) return;
try {
hpp::floatSeq_var q = client ()->robot ()->getCurrentConfig();
(void)q;
......@@ -202,7 +202,7 @@ namespace hpp {
void HppManipulationWidgetsPlugin::drawRobotContacts()
{
if (hpp_) return;
if (!hpp_) return;
hpp::Names_t_var rcs = hpp_->problem()->getRobotContactNames();
hpp::floatSeqSeq_var points;
hpp::intSeq_var indexes;
......@@ -226,7 +226,7 @@ namespace hpp {
void HppManipulationWidgetsPlugin::drawEnvironmentContacts()
{
if (hpp_) return;
if (!hpp_) return;
hpp::Names_t_var rcs = hpp_->problem()->getEnvironmentContactNames();
hpp::floatSeqSeq_var points;
hpp::intSeq_var indexes;
......@@ -247,7 +247,7 @@ namespace hpp {
void HppManipulationWidgetsPlugin::drawHandlesFrame()
{
if (hpp_) return;
if (!hpp_) return;
gepetto::gui::MainWindow* main = gepetto::gui::MainWindow::instance ();
hpp::Names_t_var rcs = hpp_->problem()->getAvailable("handle");
hpp::Transform__var t (new Transform_);
......@@ -269,7 +269,7 @@ namespace hpp {
void HppManipulationWidgetsPlugin::drawGrippersFrame()
{
if (hpp_) return;
if (!hpp_) return;
gepetto::gui::MainWindow* main = gepetto::gui::MainWindow::instance ();
hpp::Names_t_var rcs = hpp_->problem()->getAvailable("gripper");
hpp::Transform__var t (new Transform_);
......@@ -416,7 +416,7 @@ namespace hpp {
void HppManipulationWidgetsPlugin::buildGraph()
{
if (hpp_) return;
if (!hpp_) return;
QListWidget* l = dynamic_cast<QListWidget*>(tw_->widget(0));
HppManipulationWidgetsPlugin::MapNames handlesMap = getObjects();
HppManipulationWidgetsPlugin::MapNames shapesMap = getObjects();
......@@ -455,7 +455,7 @@ namespace hpp {
void HppManipulationWidgetsPlugin::autoBuildGraph()
{
if (hpp_) return;
if (!hpp_) return;
if (graphBuilder_ == NULL) {
graphBuilder_ = new QDialog(NULL, Qt::Dialog);
tw_ = new QTabWidget(graphBuilder_);
......
......@@ -100,10 +100,6 @@ namespace hpp {
for (unsigned i = 0; i < nc->length(); i++) {
ui->nameList->addItem(nc[i].in());
}
hpp::Names_t_var lj = plugin_->client()->problem()->getAvailable("LockedJoint");
for (unsigned i = 0; i < lj->length(); i++) {
ui->nameList->addItem(lj[i].in());
}
}
void ConstraintWidget::createConstraint()
......
......@@ -15,6 +15,7 @@
#include <gepetto/gui/windows-manager.hh>
#include <gepetto/gui/omniorb/url.hh>
#include <gepetto/gui/action-search-bar.hh>
#include <gepetto/gui/safeapplication.hh>
#include <omniORB4/CORBA.h>
......@@ -40,6 +41,22 @@ namespace hpp {
typedef gepetto::viewer::Configuration OsgConfiguration_t;
typedef gepetto::gui::ActionSearchBar ActionSearchBar;
class HppExceptionCatch : public gepetto::gui::SlotExceptionCatch
{
public:
bool safeNotify (QApplication* app, QObject* receiver, QEvent* e)
{
try {
return impl_notify (app, receiver, e);
} catch (const hpp::Error& e) {
qDebug () << e.msg.in();
MainWindow* main = MainWindow::instance();
if (main != NULL) main->logError (e.msg.in());
}
return false;
}
};
HppWidgetsPlugin::JointElement::JointElement (
const std::string& n, const std::string& prefix,
const hpp::Names_t& bns, JointTreeItem* i, bool updateV)
......@@ -71,6 +88,9 @@ namespace hpp {
void HppWidgetsPlugin::init()
{
gepetto::gui::SafeApplication* app = dynamic_cast<gepetto::gui::SafeApplication*>(QApplication::instance());
if (app) app->addAsLeaf(new HppExceptionCatch);
openConnection();
gepetto::gui::MainWindow* main = gepetto::gui::MainWindow::instance ();
......@@ -99,6 +119,7 @@ namespace hpp {
// Path player widget
dock = new QDockWidget ("&Path player", main);
dock->setObjectName ("hppwidgetplugin.pathplayer");
dock->setSizePolicy (QSizePolicy::Minimum, QSizePolicy::Fixed);
pathPlayer_ = new PathPlayer (this, dock);
dock->setWidget(pathPlayer_);
main->insertDockWidget (dock, Qt::BottomDockWidgetArea, Qt::Horizontal);
......
......@@ -20,13 +20,8 @@ namespace hpp {
{
ui->setupUi(this);
hpp::Names_t_var names = plugin->client()->problem()->getAvailable("lockedjoint");
ui->lockedJointList->setSelectionMode(QAbstractItemView::ExtendedSelection);
for (unsigned i = 0; i < names->length(); ++i) {
ui->lockedJointList->addItem(QString(names[i]));
}
names = plugin->client()->problem()->getAvailable("numericalconstraint");
hpp::Names_t_var names =
plugin->client()->problem()->getAvailable("numericalconstraint");
ui->numericalList->setSelectionMode(QAbstractItemView::ExtendedSelection);
for (unsigned i = 0; i < names->length(); ++i) {
ui->numericalList->addItem(QString(names[i]));
......
......@@ -267,15 +267,22 @@ namespace hpp {
void PathPlayer::updateConfiguration ()
{
hpp::floatSeq_var config =
plugin_->client()->problem()->configAtParam ((CORBA::ULong)pathIndex()->value(),currentParam_);
plugin_->currentConfig() = config.in();
if (velocity_) {
config =
plugin_->client()->problem()->derivativeAtParam ((CORBA::ULong)pathIndex()->value(),1,currentParam_);
plugin_->currentVelocity() = config.in();
gepetto::gui::MainWindow* main = gepetto::gui::MainWindow::instance();
hpp::floatSeq_var config, velocity;
try {
config = plugin_->client()->problem()->configAtParam
((CORBA::ULong)pathIndex()->value(),currentParam_);
if (velocity_)
velocity = plugin_->client()->problem()->derivativeAtParam
((CORBA::ULong)pathIndex()->value(),1,currentParam_);
} catch (const hpp::Error& e) {
main->logError(e.msg.in());
return;
}
gepetto::gui::MainWindow::instance()->requestApplyCurrentConfiguration();
plugin_->currentConfig() = config.in();
if (velocity_)
plugin_->currentVelocity() = velocity.in();
main->requestApplyCurrentConfiguration();
emit appliedConfigAtParam (getCurrentPath(), currentParam_);
}
......
......@@ -6,12 +6,12 @@
<rect>
<x>0</x>
<y>0</y>
<width>366</width>
<height>64</height>
<width>562</width>
<height>50</height>
</rect>
</property>
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Minimum">
<sizepolicy hsizetype="Preferred" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
......@@ -22,6 +22,12 @@
<layout class="QHBoxLayout" name="horizontalLayout">
<item>
<widget class="QPushButton" name="refreshButton_path">
<property name="sizePolicy">
<sizepolicy hsizetype="Fixed" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="text">
<string/>
</property>
......@@ -42,6 +48,12 @@
<property name="enabled">
<bool>false</bool>
</property>
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="toolTip">
<string>Path index</string>
</property>
......@@ -126,6 +138,12 @@
</item>
<item>
<widget class="QDoubleSpinBox" name="timeSpinBox">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="toolTip">
<string>Total time</string>
</property>
......
......@@ -166,7 +166,7 @@ namespace hpp {
if (!vec3d.isNull()) {
qtQuat = QQuaternion::fromAxisAndAngle(vec3d.normalized(), vec3d.length());
const float theta = vec3d.length();
const float theta = (float) vec3d.length();
qtQuat = QQuaternion(std::cos(theta/2), std::sin(theta/2) * vec3d / theta);
}
......@@ -233,7 +233,7 @@ namespace hpp {
if (!vec3d.isNull()) {
qtQuat = QQuaternion::fromAxisAndAngle(vec3d.normalized(), vec3d.length());
const float theta = vec3d.length();
const float theta = (float) vec3d.length();
qtQuat = QQuaternion(std::cos(theta/2), std::sin(theta/2) * vec3d / theta);
}
......
......@@ -15,8 +15,6 @@
# hpp-corbaserver. If not, see
# <http://www.gnu.org/licenses/>.
FINDPYTHON(2.7 EXACT)
INSTALL(
FILES
${CMAKE_CURRENT_SOURCE_DIR}/hpp/gui/plugin.py
......
from plugin import Plugin
from .plugin import Plugin
......@@ -5,7 +5,7 @@
from PythonQt import QtGui, Qt
import xml.etree.ElementTree as ET
from itertools import izip
import re
def _makeCheckBox(active):
......@@ -113,7 +113,7 @@ class CollisionPairs(QtGui.QWidget):
def configValidation(self):
collide = self.plugin.client.robot.autocollisionCheck()
for p, c in izip(self.orderedPairs, collide):
for p, c in zip(self.orderedPairs, collide):
if c:
self.pairToRow[p][self.CURRENT_CONFIG].setText("Collision")
else:
......@@ -121,7 +121,7 @@ class CollisionPairs(QtGui.QWidget):
def setCollisionPair(self, r, l1, l2, active, reason):
pair = _Pair(l1, l2)
if self.pairToRow.has_key(pair):
if pair in self.pairToRow:
self.pairToRow[pair][self.ACTIVE].checked = active
self.pairToRow[pair][self.REASON].setText(reason)
return
......@@ -149,15 +149,15 @@ class CollisionPairs(QtGui.QWidget):
ncfg = int(pow(10, self.sliderRandomCfg.value / 10))
nbCol = [0] * len(self.pairToRow)
r = self.plugin.client.robot
for i in xrange(ncfg):
for i in range(ncfg):
cfg = r.shootRandomConfig()
r.setCurrentConfig(cfg)
collide = r.autocollisionCheck()
for i in xrange(len(collide)):
for i in range(len(collide)):
if collide[i]:
nbCol[i] += 1
for p, n in izip(self.orderedPairs, nbCol):
for p, n in zip(self.orderedPairs, nbCol):
self.pairToRow[p][self.PERCENTAGE].setData(Qt.Qt.DisplayRole, n * 100. / ncfg)
def refresh(self):
......@@ -169,7 +169,7 @@ class CollisionPairs(QtGui.QWidget):
inner, outer, active = self.plugin.client.robot.autocollisionPairs()
self.table.sortingEnabled = False
self.table.setRowCount(len(inner))
for r, l1, l2, a in izip(xrange(len(inner)), inner, outer, active):
for r, l1, l2, a in zip(range(len(inner)), inner, outer, active):
self.setCollisionPair(r, l1, l2, a, "From SRDF")
self.table.sortingEnabled = True
print(time.time() - start_time)
......@@ -195,12 +195,12 @@ class CollisionPairs(QtGui.QWidget):
p = _Pair(dc.attrib["link1"], dc.attrib["link2"])
pairsInFile[p] = dc
for p, row in self.pairToRow.iteritems():
for p, row in self.pairToRow.items():
if row[self.ACTIVE].checked:
continue
reason = str(row[self.REASON].text())
pp = _Pair(_(p.l1), _(p.l2))
if pairsInFile.has_key(pp):
if pp in pairsInFile:
dc.attrib["reason"] = reason
else:
attrib = dict()
......
......@@ -3,6 +3,7 @@
# Author: Joseph Mirabel
#
from __future__ import print_function
from PythonQt import QtGui, Qt
import numpy as np
from gepetto import Quaternion, Color
......@@ -76,7 +77,7 @@ class GraspFinder(QtGui.QWidget):
def optimize(self):
n = len(self.P)
if not n == len(self.Q):
print "P and Q must be of the same size"
print("P and Q must be of the same size")
return
P = np.array(self.P).transpose()
Q = np.array(self.Q).transpose()
......@@ -91,11 +92,11 @@ class GraspFinder(QtGui.QWidget):
T = [0,0,0,1,0,0,0]
T[0:3] = t.tolist()
T[3:7] = Quaternion(R).toTuple()
print self.names[0], T
print(self.names[0], T)
self.instructions.text = "Current transform of\n" + self.names[0] + "\nis\n" + str(T) + "\n\nSelect a fixed point."
self.plugin.gui.gui.applyConfiguration(self.names[0], T)
self.plugin.gui.gui.refresh()
for i in xrange(n):
for i in range(n):
self.setLineTransform(i)
self.plugin.gui.gui.refresh()
......
......@@ -3,6 +3,7 @@
# Author: Joseph Mirabel
#
from __future__ import print_function
from PythonQt import QtGui, Qt, QtCore
from hpp import Transform
from numpy import array
......@@ -60,14 +61,14 @@ class InspectBodies(QtGui.QWidget):
self.pointLabel ["global"].text = vec2str(vec(event.point (False)))
self.normalLabel["global"].text = vec2str(vec(event.normal(False)))
if len(self.refName.text) == 0:
print self.refName.text
print(self.refName.text)
else:
T = Transform(self.plugin.client.robot.getJointPosition(str(self.refName.text))).inverse()
try:
self.pointLabel ["reference"].text = vec2str(T.transform( vec(event.point (False))))
self.normalLabel["reference"].text = vec2str(T.quaternion.transform(vec(event.normal(False))))
except ValueError as e:
print e
print event.point(False)
print vec(event.point(False))
print(e)
print(event.point(False))
print(vec(event.point(False)))
event.done()
......@@ -3,14 +3,15 @@
# Author: Joseph Mirabel and Heidy Dallard
#
from __future__ import print_function
from PythonQt import QtGui, Qt
from hpp.corbaserver import Client
from hpp.corbaserver.robot import Robot
from gepetto.corbaserver import Client as GuiClient
from directpath import DirectPathBox
from findGrasp import GraspFinder
from inspector import InspectBodies
from collision_pairs import CollisionPairs
from .directpath import DirectPathBox
from .findGrasp import GraspFinder
from .inspector import InspectBodies
from .collision_pairs import CollisionPairs
from .parameters import Parameters
class _PathTab(QtGui.QWidget):
......@@ -64,14 +65,14 @@ class _PathManagement(QtGui.QWidget):
if (len(selected) > 1):
first = int(selected[0].text())
for i in range(1, len(selected)):
print "Concatenate %s and %s" % (first, int(selected[i].text()))
print("Concatenate %s and %s" % (first, int(selected[i].text())))
self.plugin.client.problem.concatenatePath(first, int(selected[i].text()))
def erase(self):
selected = self.paths.selectedItems()
if (len(selected) > 0):
for i in range(len(selected) - 1, -1, -1):
print "erase path %s " % (int(selected[i].text()))
print("erase path %s " % (int(selected[i].text())))
self.plugin.client.problem.erasePath(int(selected[i].text()))
self.refresh()
......@@ -152,7 +153,7 @@ class _StepByStepSolverTab(QtGui.QWidget):
self.plugin.main.log ("Problem is solved")
def executeOneStep(self):
for i in xrange(self.stepCount.value):
for i in range(self.stepCount.value):
if self.plugin.client.problem.executeOneStep():
self.plugin.main.log ("Problem is solved")
break
......