From 3ddbff09d9cb01f4147860a911e944639aa3d8ba Mon Sep 17 00:00:00 2001
From: Edward Moyse <edward.moyse@cern.ch>
Date: Fri, 25 Jan 2019 00:48:29 +0000
Subject: [PATCH] Master vp1 arbitraryline guideline

---
 .../VP1GuideLineSystems/GuideSysController.h  |  10 +-
 .../VP1GuideLineSystems/VP1Lines.h            |  35 ++++
 .../src/GuideSysController.cxx                |  80 +++++++-
 .../src/VP1GuideLineSystem.cxx                |  11 +-
 .../VP1GuideLineSystems/src/VP1Lines.cxx      | 150 ++++++++++++++
 .../src/guidelinescontrollerform.ui           | 132 ++++++------
 .../src/guides_settings_lines_form.ui         | 192 ++++++++++++++++++
 7 files changed, 548 insertions(+), 62 deletions(-)
 create mode 100644 graphics/VP1/VP1Systems/VP1GuideLineSystems/VP1GuideLineSystems/VP1Lines.h
 create mode 100644 graphics/VP1/VP1Systems/VP1GuideLineSystems/src/VP1Lines.cxx
 create mode 100644 graphics/VP1/VP1Systems/VP1GuideLineSystems/src/guides_settings_lines_form.ui

diff --git a/graphics/VP1/VP1Systems/VP1GuideLineSystems/VP1GuideLineSystems/GuideSysController.h b/graphics/VP1/VP1Systems/VP1GuideLineSystems/VP1GuideLineSystems/GuideSysController.h
index 8f932861f47..650769f0764 100644
--- a/graphics/VP1/VP1Systems/VP1GuideLineSystems/VP1GuideLineSystems/GuideSysController.h
+++ b/graphics/VP1/VP1Systems/VP1GuideLineSystems/VP1GuideLineSystems/GuideSysController.h
@@ -92,11 +92,15 @@ public:
   double etaExtent() const;//>0: extent means to a given radius, <0: extent means to a given z.
 
   //TrackingVolumes
-	bool showTrackingVolumes() const;
+  bool showTrackingVolumes() const;
   bool showInnerDetector() const;
   bool showCalorimeters() const;
   bool showMuonSpectrometer() const;
 	
+  // Lines
+  bool showLines() const;
+  double lineLength() const;
+  SbVec3f lineDirection() const;
   
   //ID Proj surfs:
 
@@ -150,6 +154,8 @@ signals:
   void showInnerDetectorChanged(bool);
   void showCalorimetersChanged(bool);
   void showMuonSpectrometerChanged(bool);
+  void showLinesChanged(bool);
+  void lineDirectionChanged(const SbVec3f&);
 
 private:
 
@@ -194,6 +200,8 @@ private slots:
   void possibleChange_showInnerDetector();
   void possibleChange_showCalorimeters();
   void possibleChange_showMuonSpectrometer();
+  void possibleChange_showLines();
+  void possibleChange_lineDirection();
 };
 
 
diff --git a/graphics/VP1/VP1Systems/VP1GuideLineSystems/VP1GuideLineSystems/VP1Lines.h b/graphics/VP1/VP1Systems/VP1GuideLineSystems/VP1GuideLineSystems/VP1Lines.h
new file mode 100644
index 00000000000..d3519461357
--- /dev/null
+++ b/graphics/VP1/VP1Systems/VP1GuideLineSystems/VP1GuideLineSystems/VP1Lines.h
@@ -0,0 +1,35 @@
+/*
+  Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration
+*/
+
+#ifndef VP1LINES_H
+#define VP1LINES_H
+
+#include "VP1Base/VP1HelperClassBase.h"
+#include <QObject>
+#include <Inventor/C/errors/debugerror.h>
+#include <Inventor/SbColor4f.h>
+class SoSeparator;
+
+class VP1Lines : public QObject, public VP1HelperClassBase {
+
+  Q_OBJECT
+
+public:
+
+  VP1Lines( SoSeparator * attachsep,//where the grid separator will attach itself when visible
+		    IVP1System * sys,QObject * parent = 0);
+  virtual ~VP1Lines();
+
+public slots:
+
+  void setShown(bool);//will attach/detach itself from attachsep depending on this
+  void setColourAndTransp(const SbColor4f&);
+  void setDirection(const SbVec3f&);
+
+private:
+  class Imp;
+  Imp * m_d;
+};
+
+#endif
diff --git a/graphics/VP1/VP1Systems/VP1GuideLineSystems/src/GuideSysController.cxx b/graphics/VP1/VP1Systems/VP1GuideLineSystems/src/GuideSysController.cxx
index 71255fdabd9..5032e37a52b 100644
--- a/graphics/VP1/VP1Systems/VP1GuideLineSystems/src/GuideSysController.cxx
+++ b/graphics/VP1/VP1Systems/VP1GuideLineSystems/src/GuideSysController.cxx
@@ -23,11 +23,11 @@
 #include "ui_guides_settings_grid_form.h"
 #include "ui_guides_settings_idprojsurfs_form.h"
 #include "ui_guides_settings_trkvolumes_form.h"
+#include "ui_guides_settings_lines_form.h"
 #include "VP1Base/VP1Serialise.h"
 #include "VP1Base/VP1Deserialise.h"
-
-//#include "CLHEP/Units/SystemOfUnits.h"
 #include "GaudiKernel/SystemOfUnits.h"
+#include <cmath>
 
 //____________________________________________________________________
 class GuideSysController::Imp {
@@ -40,6 +40,7 @@ public:
   Ui::VP1GuidesSysSettingsGridForm ui_grid;
   Ui::VP1GuidesSysSettingsIDProjSurfsForm ui_idprojsurfs;
   Ui::VP1TrackingVolumesForm ui_trkvolumes;
+  Ui::VP1LinesForm ui_lines;
 
   static SbColor4f color4f(const QColor& col, int transp_int) {
     return SbColor4f(std::max<float>(0.0f,std::min<float>(1.0f,col.redF())),
@@ -78,6 +79,9 @@ public:
   bool last_showInnerDetector;
   bool last_showCalorimeters;
   bool last_showMuonSpectrometer;
+  bool last_showLines;
+  SbVec3f last_lineDirection;
+  double last_line_eta; // This is needed to update the display in possibleChange_lineDirection
 
   InDetProjFlags::InDetProjPartsFlags last_applicablePixelProjParts;
   InDetProjFlags::InDetProjPartsFlags last_applicableSCTProjParts;
@@ -108,6 +112,7 @@ GuideSysController::GuideSysController(IVP1System * sys)
   initDialog(m_d->ui_grid, m_d->ui.pushButton_settings_grid,m_d->ui.checkBox_grid);
   initDialog(m_d->ui_idprojsurfs, m_d->ui.pushButton_settings_inDetProjSurfs,m_d->ui.checkBox_inDetProjSurfs);
   initDialog(m_d->ui_trkvolumes, m_d->ui.pushButton_settings_trkVolumes,m_d->ui.checkBox_trkVolumes);
+  initDialog(m_d->ui_lines, m_d->ui.pushButton_settings_lines,m_d->ui.checkBox_lines);
 
   //Hide SCT/Pixel projection surface controls for now:
   m_d->ui_idprojsurfs.groupBox_pixelproj->setVisible(false);
@@ -314,6 +319,16 @@ GuideSysController::GuideSysController(IVP1System * sys)
   addUpdateSlot(SLOT(possibleChange_showMuonSpectrometer()));
 	connectToLastUpdateSlot(m_d->ui_trkvolumes.checkBox_MS);
 
+  addUpdateSlot(SLOT(possibleChange_showLines()));
+  connectToLastUpdateSlot(m_d->ui.checkBox_lines);
+  
+  addUpdateSlot(SLOT(possibleChange_lineDirection()));
+  connectToLastUpdateSlot(m_d->ui_lines.doubleSpinBox_phi);
+  connectToLastUpdateSlot(m_d->ui_lines.doubleSpinBox_theta);
+  connectToLastUpdateSlot(m_d->ui_lines.doubleSpinBox_eta);
+  connectToLastUpdateSlot(m_d->ui_lines.doubleSpinBox_length);
+  
+
   initLastVars();
 }
 
@@ -502,6 +517,29 @@ double GuideSysController::etaExtent() const
     * (m_d->ui_etacones.radioButton_etaconeextentisr->isChecked() ? 1.0 : -1.0);
 }
 
+//____________________________________________________________________
+bool GuideSysController::showLines() const
+{
+  return m_d->ui.checkBox_lines->isChecked();
+}
+
+
+//____________________________________________________________________
+SbVec3f GuideSysController::lineDirection() const
+{
+  double r = lineLength();
+  double phi = m_d->ui_lines.doubleSpinBox_phi->value();
+  double theta = m_d->ui_lines.doubleSpinBox_theta->value();
+  SbVec3f direction(r*sin(theta)*cos(phi),r*sin(theta)*sin(phi), r*cos(theta));
+  return direction;
+}
+
+//____________________________________________________________________
+double GuideSysController::lineLength() const
+{
+  return m_d->ui_lines.doubleSpinBox_length->value() * Gaudi::Units::m;
+}
+
 //_____________________________________________________________________________________
 InDetProjFlags::InDetProjPartsFlags GuideSysController::Imp::projPartsFlag( bool barrelinner, bool barrelouter,
 									    bool endcapinner, bool endcapouter,
@@ -726,7 +764,7 @@ bool GuideSysController::showMuonSpectrometer() const
 //____________________________________________________________________
 int GuideSysController::currentSettingsVersion() const
 {
-  return 2;
+  return 3;
 }
 
 //____________________________________________________________________
@@ -833,6 +871,13 @@ void GuideSysController::actualSaveSettings(VP1Serialise&s) const
   s.save(m_d->ui_trkvolumes.checkBox_ID);
   s.save(m_d->ui_trkvolumes.checkBox_Calo);
   s.save(m_d->ui_trkvolumes.checkBox_MS);
+  
+  // Line from origin
+  s.save(m_d->ui.checkBox_lines);
+  s.save(m_d->ui_lines.doubleSpinBox_phi); 
+  s.save(m_d->ui_lines.doubleSpinBox_phi);
+  s.save(m_d->ui_lines.doubleSpinBox_eta);
+  s.save(m_d->ui_lines.doubleSpinBox_length);
 }
 
 //____________________________________________________________________
@@ -946,9 +991,36 @@ void GuideSysController::actualRestoreSettings(VP1Deserialise& s)
     s.restore(m_d->ui_trkvolumes.checkBox_Calo);
     s.restore(m_d->ui_trkvolumes.checkBox_MS);
   } 
+  if (s.version()>=3) {
+    s.restore(m_d->ui.checkBox_lines);
+    s.restore(m_d->ui_lines.doubleSpinBox_phi); 
+    s.restore(m_d->ui_lines.doubleSpinBox_phi);
+    s.restore(m_d->ui_lines.doubleSpinBox_eta);
+    s.restore(m_d->ui_lines.doubleSpinBox_length);
+  } 
+}
 
+void GuideSysController::possibleChange_lineDirection() {	
+  // Bit of a hack possibly to do this here, but I want to be able to update the direction by changing either theta or eta
+  double eta = m_d->ui_lines.doubleSpinBox_eta->value();
+  double theta = m_d->ui_lines.doubleSpinBox_theta->value();
+  
+  if (m_d->last_line_eta != eta){
+    // eta has changed, so update theta in the UI
+    theta = 2*std::atan(std::exp(-1.0 * eta));
+    m_d->ui_lines.doubleSpinBox_theta->setValue(theta);
+  } else if ( theta!= std::acos(m_d->last_lineDirection[2] / lineLength() ) ){
+    eta = -1.0 * std::log(std::tan(theta/2.0));
+    m_d->ui_lines.doubleSpinBox_eta->setValue(eta);  
+  }
+  m_d->last_line_eta = m_d->ui_lines.doubleSpinBox_eta->value();
+  if (changed( m_d->last_lineDirection , lineDirection() ) ) { 
+    if (verbose()&&!initVarsMode()) messageVerbose("Emitting "+QString()+"( lineDirectionChanged"+toString(m_d->last_lineDirection)+" )"); 
+    emit lineDirectionChanged(m_d->last_lineDirection); 
+  }  
 }
 
+
 ///////////////////////////////////////////////////////////////////////////
 // Test for possible changes in values and emit signals as appropriate:
 // (possibleChange_XXX() slots code provided by macros)
@@ -988,3 +1060,5 @@ POSSIBLECHANGE_IMP(showTrackingVolumes)
 POSSIBLECHANGE_IMP(showInnerDetector)
 POSSIBLECHANGE_IMP(showCalorimeters)
 POSSIBLECHANGE_IMP(showMuonSpectrometer)
+POSSIBLECHANGE_IMP(showLines)  
+//POSSIBLECHANGE_IMP(lineDirection) Implemented this manually so we can update eta/theta
diff --git a/graphics/VP1/VP1Systems/VP1GuideLineSystems/src/VP1GuideLineSystem.cxx b/graphics/VP1/VP1Systems/VP1GuideLineSystems/src/VP1GuideLineSystem.cxx
index 9fa913399c4..7f3900c6cc5 100644
--- a/graphics/VP1/VP1Systems/VP1GuideLineSystems/src/VP1GuideLineSystem.cxx
+++ b/graphics/VP1/VP1Systems/VP1GuideLineSystems/src/VP1GuideLineSystem.cxx
@@ -23,6 +23,7 @@
 #include "VP1GuideLineSystems/VP1CartesianGrid.h"
 #include "VP1GuideLineSystems/VP1CylindricalGrid.h"
 #include "VP1GuideLineSystems/VP1TrackingVolumes.h"
+#include "VP1GuideLineSystems/VP1Lines.h"
 
 #include "VP1Base/VP1Serialise.h"
 #include "VP1Base/VP1Deserialise.h"
@@ -64,6 +65,7 @@ public:
   VP1EtaCone * etacone2;
   VP1EtaCone * etacone3;
   VP1TrackingVolumes * trackingVolumes;
+  VP1Lines * lines;
 
   ProjectionSurfacesHelper * projsurfhelper_pixel;
   ProjectionSurfacesHelper * projsurfhelper_sct;
@@ -213,7 +215,14 @@ void VP1GuideLineSystem::buildPermanentSceneGraph(StoreGateSvc* /*detstore*/, So
 	connect(m_d->controller,SIGNAL(showCalorimetersChanged(bool)),m_d->trackingVolumes,SLOT(setShownCalo(bool)));
 	connect(m_d->controller,SIGNAL(showMuonSpectrometerChanged(bool)),m_d->trackingVolumes,SLOT(setShownMS(bool)));
 	m_d->trackingVolumes->setShown(m_d->controller->showTrackingVolumes());	
-	
+  
+  //Lines
+  m_d->lines = new VP1Lines(root, this);
+  connect(m_d->controller,SIGNAL(showLinesChanged(bool)),m_d->lines,SLOT(setShown(bool)));
+	m_d->lines->setShown(m_d->controller->showLines());	
+  connect(m_d->controller,SIGNAL(lineDirectionChanged(const SbVec3f&)),m_d->lines,SLOT(setDirection(const SbVec3f&)));
+  m_d->lines->setDirection(m_d->controller->lineDirection());  
+  
   SoSeparator * projsep = new SoSeparator;
   root->addChild(projsep);
 
diff --git a/graphics/VP1/VP1Systems/VP1GuideLineSystems/src/VP1Lines.cxx b/graphics/VP1/VP1Systems/VP1GuideLineSystems/src/VP1Lines.cxx
new file mode 100644
index 00000000000..aaffe29ccab
--- /dev/null
+++ b/graphics/VP1/VP1Systems/VP1GuideLineSystems/src/VP1Lines.cxx
@@ -0,0 +1,150 @@
+/*
+  Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration
+*/
+
+#include "VP1GuideLineSystems/VP1Lines.h"
+
+#include <Inventor/nodes/SoSeparator.h>
+#include <Inventor/nodes/SoVertexProperty.h>
+#include <Inventor/nodes/SoLineSet.h>
+#include <Inventor/SbColor4f.h>
+
+#include "GaudiKernel/SystemOfUnits.h"
+
+
+//____________________________________________________________________
+class VP1Lines::Imp {
+public:
+  Imp(VP1Lines *,
+      SoSeparator * attachsep);
+  VP1Lines * theclass;
+  SoSeparator * attachSep;
+
+  bool shown;
+  SbColor4f colourAndTransp;
+  SbVec3f direction;
+
+  SoSeparator * sep;
+
+  void rebuild3DObjects();
+  void updateColour();
+};
+
+//____________________________________________________________________
+VP1Lines::VP1Lines(SoSeparator * attachsep,
+		   IVP1System * sys,QObject * parent)
+  : QObject(parent), VP1HelperClassBase(sys,"VP1Lines"), m_d(new Imp(this,attachsep))
+{
+}
+
+//____________________________________________________________________
+VP1Lines::~VP1Lines()
+{
+  setShown(false);
+  if (m_d->sep)
+    m_d->sep->unref();
+  m_d->attachSep->unref();
+  delete m_d;
+}
+
+//____________________________________________________________________
+VP1Lines::Imp::Imp(VP1Lines *tc,SoSeparator * as)
+  : theclass(tc), attachSep(as), shown(false),
+    colourAndTransp(SbColor4f(1,1,1,1)), direction(SbVec3f(0,0,0)), sep(0)
+{
+  attachSep->ref();
+}
+
+//____________________________________________________________________
+void VP1Lines::Imp::rebuild3DObjects()
+{
+  theclass->messageVerbose("(Re)building 3D objects");
+
+  if (sep) {
+    sep->removeAllChildren();
+  } else {
+    sep = new SoSeparator;
+    sep->ref();
+  }
+
+  const bool save = sep->enableNotify(false);
+
+  SoVertexProperty * line_vertices = new SoVertexProperty();
+
+  line_vertices->vertex.set1Value(0,0.0,0.0,0.0);
+  line_vertices->vertex.set1Value(1,direction[0],direction[1],direction[2]);
+
+  line_vertices->materialBinding=SoMaterialBinding::OVERALL;
+  line_vertices->normalBinding=SoNormalBinding::OVERALL;
+  SoLineSet * line = new SoLineSet();
+  line->numVertices.enableNotify(FALSE);
+  // line->numVertices.setNum(1);
+  // line->numVertices.set1Value(0,2);
+  line->vertexProperty = line_vertices;
+  line->numVertices.enableNotify(TRUE);
+  line->numVertices.touch();
+
+  sep->addChild(line);
+  updateColour();
+
+  if (save) {
+    sep->enableNotify(true);
+    sep->touch();
+  }
+
+}
+
+//____________________________________________________________________
+void VP1Lines::Imp::updateColour()
+{
+  theclass->messageVerbose("Updating packed colour");
+  if (!sep||sep->getNumChildren()<1)
+    return;
+  SoNode * n = sep->getChild(0);
+  if (!n||n->getTypeId()!=SoLineSet::getClassTypeId())
+    return;
+  SoLineSet * line = static_cast<SoLineSet*>(n);
+  SoVertexProperty * vertices = static_cast<SoVertexProperty *>(line->vertexProperty.getValue());
+  if (!vertices)
+    return;
+  vertices->orderedRGBA = colourAndTransp.getPackedValue();
+}
+
+//____________________________________________________________________
+void VP1Lines::setShown(bool b)
+{
+  messageVerbose("Signal received: setShown("+str(b)+")");
+  if (m_d->shown==b)
+    return;
+  m_d->shown=b;
+  if (m_d->shown) {
+    m_d->rebuild3DObjects();
+    if (m_d->attachSep->findChild(m_d->sep)<0)
+      m_d->attachSep->addChild(m_d->sep);
+  } else {
+    if (m_d->sep&&m_d->attachSep->findChild(m_d->sep)>=0)
+      m_d->attachSep->removeChild(m_d->sep);
+  }
+}
+
+//____________________________________________________________________
+void VP1Lines::setColourAndTransp(const SbColor4f&ct)
+{
+  messageVerbose("Signal received in setColourAndTransp slot.");
+  if (m_d->colourAndTransp==ct)
+    return;
+  m_d->colourAndTransp=ct;
+  if (m_d->shown)
+    m_d->updateColour();
+}
+
+//____________________________________________________________________
+void VP1Lines::setDirection(const SbVec3f& o)
+{
+  messageVerbose("Signal received: setDirection("+str(o)+")");
+  if (m_d->direction==o)
+    return;
+  m_d->direction=o;
+  if (m_d->shown)
+    m_d->rebuild3DObjects();
+}
diff --git a/graphics/VP1/VP1Systems/VP1GuideLineSystems/src/guidelinescontrollerform.ui b/graphics/VP1/VP1Systems/VP1GuideLineSystems/src/guidelinescontrollerform.ui
index c527d377a5d..f0d1f101b3b 100644
--- a/graphics/VP1/VP1Systems/VP1GuideLineSystems/src/guidelinescontrollerform.ui
+++ b/graphics/VP1/VP1Systems/VP1GuideLineSystems/src/guidelinescontrollerform.ui
@@ -1,7 +1,8 @@
-<ui version="4.0" >
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
  <class>VP1GuidesControllerForm</class>
- <widget class="QWidget" name="VP1GuidesControllerForm" >
-  <property name="geometry" >
+ <widget class="QWidget" name="VP1GuidesControllerForm">
+  <property name="geometry">
    <rect>
     <x>0</x>
     <y>0</y>
@@ -9,128 +10,145 @@
     <height>182</height>
    </rect>
   </property>
-  <property name="windowTitle" >
+  <property name="windowTitle">
    <string>Form</string>
   </property>
-  <layout class="QGridLayout" >
-   <property name="rightMargin" >
+  <layout class="QGridLayout">
+   <property name="rightMargin">
     <number>1</number>
    </property>
-   <property name="bottomMargin" >
+   <property name="bottomMargin">
     <number>1</number>
    </property>
-   <property name="spacing" >
+   <property name="spacing">
     <number>0</number>
    </property>
-   <item row="0" column="0" >
-    <layout class="QGridLayout" >
-     <property name="horizontalSpacing" >
+   <item row="0" column="0">
+    <layout class="QGridLayout">
+     <property name="horizontalSpacing">
       <number>2</number>
      </property>
-     <property name="verticalSpacing" >
+     <property name="verticalSpacing">
       <number>0</number>
      </property>
-     <item row="0" column="0" >
-      <widget class="QCheckBox" name="checkBox_floorAndLetters" >
-       <property name="text" >
+     <item row="0" column="0">
+      <widget class="QCheckBox" name="checkBox_floorAndLetters">
+       <property name="text">
         <string>Floor &amp;&amp; Letters</string>
        </property>
-       <property name="checked" >
+       <property name="checked">
         <bool>true</bool>
        </property>
       </widget>
      </item>
-     <item row="0" column="1" >
-      <widget class="QPushButton" name="pushButton_settings_floorAndLetters" >
-       <property name="text" >
+     <item row="0" column="1">
+      <widget class="QPushButton" name="pushButton_settings_floorAndLetters">
+       <property name="text">
         <string>Configure</string>
        </property>
       </widget>
      </item>
-     <item row="1" column="0" >
-      <widget class="QCheckBox" name="checkBox_coordinateAxes" >
-       <property name="text" >
+     <item row="1" column="0">
+      <widget class="QCheckBox" name="checkBox_coordinateAxes">
+       <property name="text">
         <string>Coordinate axes</string>
        </property>
       </widget>
      </item>
-     <item row="1" column="1" >
-      <widget class="QPushButton" name="pushButton_settings_coordinateAxes" >
-       <property name="text" >
+     <item row="1" column="1">
+      <widget class="QPushButton" name="pushButton_settings_coordinateAxes">
+       <property name="text">
         <string>Configure</string>
        </property>
       </widget>
      </item>
-     <item row="2" column="0" >
-      <widget class="QCheckBox" name="checkBox_grid" >
-       <property name="text" >
+     <item row="2" column="0">
+      <widget class="QCheckBox" name="checkBox_grid">
+       <property name="text">
         <string>Grid</string>
        </property>
       </widget>
      </item>
-     <item row="2" column="1" >
-      <widget class="QPushButton" name="pushButton_settings_grid" >
-       <property name="text" >
+     <item row="2" column="1">
+      <widget class="QPushButton" name="pushButton_settings_grid">
+       <property name="text">
         <string>Configure</string>
        </property>
       </widget>
      </item>
-     <item row="3" column="0" >
-      <widget class="QCheckBox" name="checkBox_etaCones" >
-       <property name="text" >
+     <item row="3" column="0">
+      <widget class="QCheckBox" name="checkBox_etaCones">
+       <property name="text">
         <string>Eta Cones</string>
        </property>
       </widget>
      </item>
-     <item row="3" column="1" >
-      <widget class="QPushButton" name="pushButton_settings_etaCones" >
-       <property name="text" >
+     <item row="3" column="1">
+      <widget class="QPushButton" name="pushButton_settings_etaCones">
+       <property name="text">
         <string>Configure</string>
        </property>
       </widget>
      </item>
-     <item row="4" column="0" >
-      <widget class="QCheckBox" name="checkBox_inDetProjSurfs" >
-       <property name="text" >
+     <item row="4" column="0">
+      <widget class="QCheckBox" name="checkBox_inDetProjSurfs">
+       <property name="text">
         <string>ID projection surfaces</string>
        </property>
-       <property name="checked" >
+       <property name="checked">
         <bool>true</bool>
        </property>
       </widget>
      </item>
-     <item row="4" column="1" >
-      <widget class="QPushButton" name="pushButton_settings_inDetProjSurfs" >
-       <property name="text" >
+     <item row="4" column="1">
+      <widget class="QPushButton" name="pushButton_settings_inDetProjSurfs">
+       <property name="text">
         <string>Configure</string>
        </property>
       </widget>
      </item>
-     <item row="5" column="1" >
-      <widget class="QPushButton" name="pushButton_settings_trkVolumes" >
-       <property name="text" >
+     <item row="5" column="1">
+      <widget class="QPushButton" name="pushButton_settings_trkVolumes">
+       <property name="text">
         <string>Configure</string>
        </property>
       </widget>
      </item>
-     <item row="5" column="0" >
-      <widget class="QCheckBox" name="checkBox_trkVolumes" >
-       <property name="text" >
+     <item row="5" column="0">
+      <widget class="QCheckBox" name="checkBox_trkVolumes">
+       <property name="text">
         <string>Tracking Volumes</string>
        </property>
-       <property name="checked" >
+       <property name="checked">
         <bool>false</bool>
        </property>
       </widget>
      </item>
+     <item row="7" column="0">
+      <widget class="QCheckBox" name="checkBox_lines">
+       <property name="text">
+        <string>Line from origin</string>
+       </property>
+       <property name="checked">
+        <bool>false</bool>
+       </property>
+      </widget>
+     </item>
+     <item row="7" column="1">
+      <widget class="QPushButton" name="pushButton_settings_lines">
+       <property name="text">
+        <string>Configure</string>
+       </property>
+      </widget>
+     </item>
     </layout>
    </item>
-   <item row="0" column="1" >
+   <item row="0" column="1">
     <spacer>
-     <property name="orientation" >
+     <property name="orientation">
       <enum>Qt::Horizontal</enum>
      </property>
-     <property name="sizeHint" stdset="0" >
+     <property name="sizeHint" stdset="0">
       <size>
        <width>1</width>
        <height>20</height>
@@ -138,12 +156,12 @@
      </property>
     </spacer>
    </item>
-   <item row="1" column="0" >
+   <item row="1" column="0">
     <spacer>
-     <property name="orientation" >
+     <property name="orientation">
       <enum>Qt::Vertical</enum>
      </property>
-     <property name="sizeHint" stdset="0" >
+     <property name="sizeHint" stdset="0">
       <size>
        <width>20</width>
        <height>1</height>
diff --git a/graphics/VP1/VP1Systems/VP1GuideLineSystems/src/guides_settings_lines_form.ui b/graphics/VP1/VP1Systems/VP1GuideLineSystems/src/guides_settings_lines_form.ui
new file mode 100644
index 00000000000..aa6ab3689c2
--- /dev/null
+++ b/graphics/VP1/VP1Systems/VP1GuideLineSystems/src/guides_settings_lines_form.ui
@@ -0,0 +1,192 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>VP1LinesForm</class>
+ <widget class="QWidget" name="VP1LinesForm">
+  <property name="geometry">
+   <rect>
+    <x>0</x>
+    <y>0</y>
+    <width>333</width>
+    <height>166</height>
+   </rect>
+  </property>
+  <property name="windowTitle">
+   <string>Form</string>
+  </property>
+  <layout class="QVBoxLayout" name="verticalLayout">
+   <item>
+    <layout class="QGridLayout" name="gridLayout">
+     <item row="6" column="0">
+      <widget class="QLabel" name="label_26">
+       <property name="text">
+        <string>Length</string>
+       </property>
+      </widget>
+     </item>
+     <item row="1" column="1">
+      <widget class="QDoubleSpinBox" name="doubleSpinBox_phi">
+       <property name="sizePolicy">
+        <sizepolicy hsizetype="Preferred" vsizetype="Fixed">
+         <horstretch>0</horstretch>
+         <verstretch>0</verstretch>
+        </sizepolicy>
+       </property>
+       <property name="alignment">
+        <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
+       </property>
+       <property name="suffix">
+        <string/>
+       </property>
+       <property name="decimals">
+        <number>3</number>
+       </property>
+       <property name="minimum">
+        <double>-6.280000000000000</double>
+       </property>
+       <property name="maximum">
+        <double>6.280000000000000</double>
+       </property>
+       <property name="singleStep">
+        <double>0.010000000000000</double>
+       </property>
+      </widget>
+     </item>
+     <item row="4" column="1">
+      <widget class="QDoubleSpinBox" name="doubleSpinBox_theta">
+       <property name="sizePolicy">
+        <sizepolicy hsizetype="Preferred" vsizetype="Fixed">
+         <horstretch>0</horstretch>
+         <verstretch>0</verstretch>
+        </sizepolicy>
+       </property>
+       <property name="alignment">
+        <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
+       </property>
+       <property name="suffix">
+        <string/>
+       </property>
+       <property name="decimals">
+        <number>3</number>
+       </property>
+       <property name="minimum">
+        <double>-6.280000000000000</double>
+       </property>
+       <property name="maximum">
+        <double>6.280000000000000</double>
+       </property>
+       <property name="singleStep">
+        <double>0.010000000000000</double>
+       </property>
+      </widget>
+     </item>
+     <item row="6" column="1">
+      <widget class="QDoubleSpinBox" name="doubleSpinBox_length">
+       <property name="sizePolicy">
+        <sizepolicy hsizetype="Preferred" vsizetype="Fixed">
+         <horstretch>0</horstretch>
+         <verstretch>0</verstretch>
+        </sizepolicy>
+       </property>
+       <property name="alignment">
+        <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
+       </property>
+       <property name="suffix">
+        <string> m</string>
+       </property>
+       <property name="decimals">
+        <number>3</number>
+       </property>
+       <property name="minimum">
+        <double>-99.989999999999995</double>
+       </property>
+       <property name="singleStep">
+        <double>0.010000000000000</double>
+       </property>
+       <property name="value">
+        <double>5.000000000000000</double>
+       </property>
+      </widget>
+     </item>
+     <item row="4" column="0">
+      <widget class="QLabel" name="label_27">
+       <property name="text">
+        <string>Theta</string>
+       </property>
+      </widget>
+     </item>
+     <item row="2" column="1">
+      <widget class="QDoubleSpinBox" name="doubleSpinBox_eta">
+       <property name="sizePolicy">
+        <sizepolicy hsizetype="Preferred" vsizetype="Fixed">
+         <horstretch>0</horstretch>
+         <verstretch>0</verstretch>
+        </sizepolicy>
+       </property>
+       <property name="alignment">
+        <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
+       </property>
+       <property name="suffix">
+        <string/>
+       </property>
+       <property name="decimals">
+        <number>3</number>
+       </property>
+       <property name="minimum">
+        <double>-5.000000000000000</double>
+       </property>
+       <property name="maximum">
+        <double>5.000000000000000</double>
+       </property>
+       <property name="singleStep">
+        <double>0.010000000000000</double>
+       </property>
+      </widget>
+     </item>
+     <item row="2" column="0">
+      <widget class="QLabel" name="label_24">
+       <property name="text">
+        <string>Eta</string>
+       </property>
+      </widget>
+     </item>
+     <item row="1" column="0">
+      <widget class="QLabel" name="label_25">
+       <property name="text">
+        <string>Phi</string>
+       </property>
+      </widget>
+     </item>
+    </layout>
+   </item>
+   <item>
+    <layout class="QHBoxLayout" name="_2">
+     <property name="spacing">
+      <number>0</number>
+     </property>
+     <item>
+      <spacer>
+       <property name="orientation">
+        <enum>Qt::Horizontal</enum>
+       </property>
+       <property name="sizeHint" stdset="0">
+        <size>
+         <width>1</width>
+         <height>5</height>
+        </size>
+       </property>
+      </spacer>
+     </item>
+     <item>
+      <widget class="QPushButton" name="pushButton_close">
+       <property name="text">
+        <string>&amp;Close</string>
+       </property>
+      </widget>
+     </item>
+    </layout>
+   </item>
+  </layout>
+ </widget>
+ <resources/>
+ <connections/>
+</ui>
-- 
GitLab