From 43bafdb8ce37fd09e0c5c09595179bab0d94fcbd Mon Sep 17 00:00:00 2001
From: tobias <tobias@5a81b35b-ba03-0410-adc8-b2c5c5119f08>
Date: Fri, 3 Sep 2010 12:38:39 +0000
Subject: [PATCH] additional selection options for right click menu

git-svn-id: https://dng.biozentrum.unibas.ch/svn/openstructure/trunk@2688 5a81b35b-ba03-0410-adc8-b2c5c5119f08
---
 modules/gui/src/scene_menu.cc                | 34 +++++++++++++++++-
 modules/gui/src/scene_menu.hh                |  3 ++
 modules/mol/base/pymod/export_entity_view.cc |  2 ++
 modules/mol/base/src/entity_view.cc          | 36 ++++++++++++++++++++
 modules/mol/base/src/entity_view.hh          | 10 ++++++
 5 files changed, 84 insertions(+), 1 deletion(-)

diff --git a/modules/gui/src/scene_menu.cc b/modules/gui/src/scene_menu.cc
index 597064469..7952b8c47 100644
--- a/modules/gui/src/scene_menu.cc
+++ b/modules/gui/src/scene_menu.cc
@@ -29,8 +29,14 @@ namespace ost { namespace gui {
 SceneMenu::SceneMenu() {
   context_menu_=new QMenu();
   select_menu_=context_menu_->addMenu("Select");
-  QAction* a=select_menu_->addAction("Around Atom");
+  QAction* a=select_menu_->addAction("Atom");
+  connect(a, SIGNAL(triggered()), this, SLOT(SelectAtom()));
+  a=select_menu_->addAction("Residue");
+  connect(a, SIGNAL(triggered()), this, SLOT(SelectResidue()));
+  a=select_menu_->addAction("Around Atom");
   connect(a, SIGNAL(triggered()), this, SLOT(SelectAroundAtom()));
+  a=select_menu_->addAction("Around Residue");
+  connect(a, SIGNAL(triggered()), this, SLOT(SelectAroundResidue()));
   a=select_menu_->addAction("Backbone");
   connect(a, SIGNAL(triggered()), this, SLOT(SelectBackbone()));
   a=select_menu_->addAction("Sidechains");
@@ -76,6 +82,32 @@ void SceneMenu::SelectAroundAtom()
   e->SetSelection(v);
 }
 
+void SceneMenu::SelectAroundResidue()
+{
+  gfx::EntityP e=dyn_cast<gfx::Entity>(picked_.first);
+  mol::EntityView v=e->GetView().CreateEmptyView();
+  v.AddAtom(picked_.second);
+  v=v.ExtendViewToResidues();
+  v=v.ExtendViewToSurrounding(0.5);
+  e->SetSelection(v.ExtendViewToResidues());
+}
+
+void SceneMenu::SelectAtom()
+{
+  gfx::EntityP e=dyn_cast<gfx::Entity>(picked_.first);
+  mol::EntityView v=e->GetView().CreateEmptyView();
+  v.AddAtom(picked_.second);
+  e->SetSelection(v);
+}
+
+void SceneMenu::SelectResidue()
+{
+  gfx::EntityP e=dyn_cast<gfx::Entity>(picked_.first);
+  mol::EntityView v=e->GetView().CreateEmptyView();
+  v.AddAtom(picked_.second);
+  e->SetSelection(v.ExtendViewToResidues());
+}
+
 void SceneMenu::Select(const String& str)
 {
   gfx::EntityP e=dyn_cast<gfx::Entity>(picked_.first);
diff --git a/modules/gui/src/scene_menu.hh b/modules/gui/src/scene_menu.hh
index 0b212bad9..8b8d1f402 100644
--- a/modules/gui/src/scene_menu.hh
+++ b/modules/gui/src/scene_menu.hh
@@ -43,6 +43,9 @@ public slots:
   void SelectSidechains();
   void SelectLigands();
   void SelectAroundAtom();
+  void SelectAroundResidue();
+  void SelectAtom();
+  void SelectResidue();
   void Select(const String& str);
   void UnSelect();
   void CenterOnAtom();
diff --git a/modules/mol/base/pymod/export_entity_view.cc b/modules/mol/base/pymod/export_entity_view.cc
index 3b3eadab2..4eadd54cd 100644
--- a/modules/mol/base/pymod/export_entity_view.cc
+++ b/modules/mol/base/pymod/export_entity_view.cc
@@ -86,6 +86,8 @@ void export_EntityView()
 
   class_<EntityView, bases<EntityBase> >("EntityView", init<>())
     .def("Copy", &EntityView::Copy)
+    .def("ExtendViewToResidues", &EntityView::ExtendViewToResidues)
+    .def("ExtendViewToSurrounding", &EntityView::ExtendViewToSurrounding)
     .def("FindChain", find_chain_str)
     .def("FindResidue", &EntityView::FindResidue)
     .def("FindAtom", find_atom_a)
diff --git a/modules/mol/base/src/entity_view.cc b/modules/mol/base/src/entity_view.cc
index d81d02d98..945230d2f 100644
--- a/modules/mol/base/src/entity_view.cc
+++ b/modules/mol/base/src/entity_view.cc
@@ -773,6 +773,42 @@ void EntityView::RemoveAtomInternal(const AtomView& av)
   data_->handle_to_view.erase(av.GetHandle().GetHashCode());
 }
 
+EntityView EntityView::ExtendViewToResidues() const
+{
+  this->CheckValidity();
+  EntityView view=this->CreateEmptyView();
+  ResidueViewList residues=this->GetResidueList();
+  ResidueViewList::const_iterator res_it;
+  for (res_it=residues.begin(); res_it!=residues.end(); ++res_it) {
+    view.AddResidue((*res_it).GetHandle(),
+                    mol::ViewAddFlag::INCLUDE_ALL|mol::ViewAddFlag::CHECK_DUPLICATES);
+  }
+  view.AddAllInclusiveBonds();
+  return view;
+}
+
+EntityView EntityView::ExtendViewToSurrounding(Real gap) const
+{
+  this->CheckValidity();
+  EntityView view=this->CreateEmptyView();
+  AtomViewList atoms=this->GetAtomList();
+  AtomViewList::const_iterator atm_it;
+  Real max_dist=5+gap;
+  for (atm_it=atoms.begin(); atm_it!=atoms.end(); ++atm_it) {
+    view.AddAtom((*atm_it),mol::ViewAddFlag::INCLUDE_ALL|mol::ViewAddFlag::CHECK_DUPLICATES);
+    AtomHandleList prot_atoms=this->GetHandle().FindWithin((*atm_it).GetPos(),max_dist);
+    AtomHandleList::const_iterator protatm_it;
+    for (protatm_it=prot_atoms.begin(); protatm_it!=prot_atoms.end(); ++protatm_it){
+      Real dist=geom::Distance((*atm_it).GetPos(), (*protatm_it).GetPos());
+      if (dist <= (*atm_it).GetRadius() + (*protatm_it).GetRadius() + gap) {
+        view.AddAtom((*protatm_it),mol::ViewAddFlag::INCLUDE_ALL|mol::ViewAddFlag::CHECK_DUPLICATES);
+      }
+    }
+  }
+  view.AddAllInclusiveBonds();
+  return view;
+}
+
 namespace {
 
 class EntityViewDumper : public EntityVisitor {
diff --git a/modules/mol/base/src/entity_view.hh b/modules/mol/base/src/entity_view.hh
index 6e3aa7bf8..e9566a1c2 100644
--- a/modules/mol/base/src/entity_view.hh
+++ b/modules/mol/base/src/entity_view.hh
@@ -286,6 +286,16 @@ public:
   Real GetAngle(const AtomView& a1, const AtomView& a2,
                 const AtomView& a3) const;
 
+  /// \brief  Extend current view to include all atoms of each residue where
+  ///         at least one atom is selected currently
+  EntityView ExtendViewToResidues() const;
+
+  /// \brief  Extend current view to include all atoms that are within the sum
+  ///         of their vdw radii + gap
+  ///
+  /// Include all atoms within: at1.GetRadius() + at2.GetRadius() + gap
+  EntityView ExtendViewToSurrounding(Real gap) const;
+
   /// \brief returns a string containing a human-readable summary of the
   ///     entity view
   String Dump() const;
-- 
GitLab