Points&Forces (survey)
Software tools facilitating the task of surveying architecture
pixelpos_points.cxx
Go to the documentation of this file.
1 /*
2  Copyright 2002-2019 Pierre SMARS (smars@yuntech.edu.tw)
3  This program is free software: you can redistribute it and/or modify
4  it under the terms of the GNU General Public License as published by
5  the Free Software Foundation, either version 2 of the License, or
6  (at your option) any later version.
7 
8  This program is distributed in the hope that it will be useful,
9  but WITHOUT ANY WARRANTY; without even the implied warranty of
10  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11  GNU General Public License for more details.
12 
13  You should have received a copy of the GNU General Public License
14  along with this program. If not, see <http://www.gnu.org/licenses/>.
15 */
16 #include "pixelpos_points.h"
17 
18 #include "vtkTransform.h"
19 #include "vtkDiskSource.h"
20 #include "vtkTransformPolyDataFilter.h"
21 #include "vtkPolyDataMapper.h"
22 #include "vtkActor.h"
23 #include "vtkProperty.h"
24 #include "vtkRenderWindow.h"
25 
26 //---------------------------------------------------------------------------
28 {
29  ref_.clear();
30  pos_.clear();
31 }
32 //---------------------------------------------------------------------------
33 void pixelpos_points::add_point(int ref, double u, double v)
34 {
35  if (selected_ != -1)
36  ((vtkActor*)(ren_->GetActors()->GetItemAsObject(selected_)))->GetProperty()->SetColor(.8,.8,.8);
37  selected_ = ren_->GetActors()->GetNumberOfItems();
38  if (ref==0)
39  {
40  for (auto r:ref_)
41  {
42  if (ref<r) ref=r;
43  }
44  ref++;
45  }
46  if (verbose_)
47  std::cerr << ref << " " << u << " " << v << std::endl;
48  ref_.push_back(ref);
49  vtkTransform * trans = vtkTransform::New();
50  trans->Translate(u,v,0.1);
51  pos_.push_back(trans);
52  vtkDiskSource * disk = vtkDiskSource::New();
53  disk->SetCircumferentialResolution(20);
54  disk->SetRadialResolution(3);
55  disk->SetOuterRadius(3.);
56  disk->SetInnerRadius(2.);
57  vtkTransformPolyDataFilter * move = vtkTransformPolyDataFilter::New();
58  move->SetInputConnection(disk->GetOutputPort());
59  disk->Delete();
60  move->SetTransform(trans);
61  vtkPolyDataMapper * map = vtkPolyDataMapper::New();
62  map->SetInputConnection(move->GetOutputPort());
63  move->Delete();
64  vtkActor * actor = vtkActor::New();
65  actor->SetMapper(map);
66  map->Delete();
67  actor->GetProperty()->SetColor(1.,0.,0.);
68  actor->GetProperty()->SetOpacity(.6);
69  actor->DragableOn();
70  ren_->AddActor(actor);
71  actor->Delete();
72 }
73 //---------------------------------------------------------------------------
75 {
76  if (ref_.size()>0)
77  {
78  ref_.erase(ref_.end()-1);
79  vtkActor * actor = ren_->GetActors()->GetLastActor();
80  ren_->RemoveActor(actor);
81  pos_.erase(pos_.end()-1);
82  ren_->GetRenderWindow()->Render();
83  }
84 }
85 //---------------------------------------------------------------------------
87 {
88  if (selected_ != -1)
89  {
90  ref_.erase(ref_.begin()+selected_-2);
91  vtkActor * actor = (vtkActor*)(ren_->GetActors()->GetItemAsObject(selected_));
92  ren_->RemoveActor(actor);
93  pos_.erase(pos_.begin()+selected_-2);
94  ren_->GetRenderWindow()->Render();
95  selected_ = ren_->GetActors()->GetNumberOfItems()-2;
96  if (selected_>0)
97  {
98  vtkActor * act = (vtkActor*)(ren_->GetActors()->GetItemAsObject(selected_));
99  act->GetProperty()->SetColor(1.,0.,0.);
100  ren_->GetRenderWindow()->Render();
101  } else
102  selected_ = -1;
103  }
104 }
105 //---------------------------------------------------------------------------
106 void pixelpos_points::moa_point(int ref, double u, double v)
107 {
108  std::cerr << ref_[ref] << " " << u << " " << v << std::endl;
109  double p1[3];
110  pos_[ref]->GetPosition(p1);
111  pos_[ref]->Translate(u-p1[0], v-p1[1], 0);
112  pos_[ref]->Modified();
113 }
114 //---------------------------------------------------------------------------
115 int pixelpos_points::pick_point(double u, double v)
116 {
117  int ref;
118  int n = ref_.size();
119  double dmin = 1.e30;
120  for (int i=0; i<n; i++)
121  {
122  double p[3];
123  pos_[i]->GetPosition(p);
124  double d = sqrt((p[0]-u)*(p[0]-u)+(p[1]-v)*(p[1]-v));
125  if (d<dmin)
126  {
127  dmin = d;
128  ref = i;
129  }
130  }
131  if (dmin <= 3)
132  return ref;
133  else
134  return -1;
135 }
136 //---------------------------------------------------------------------------
137 int pixelpos_points::select_point(double u, double v)
138 {
139  int ref = this->pick_point(u,v);
140  if (ref != -1)
141  {
142  vtkActor * act;
143  act = (vtkActor*)(ren_->GetActors()->GetItemAsObject(selected_));
144  act->GetProperty()->SetColor(.8,.8,.8);
145  selected_ = ref+2;
146  act = (vtkActor*)(ren_->GetActors()->GetItemAsObject(selected_));
147  act->GetProperty()->SetColor(1.,0.,0.);
148  }
149  return ref;
150 }
151 //---------------------------------------------------------------------------
152 void pixelpos_points::add_or_moa_point(double u, double v)
153 {
154  int ref = this->pick_point(u,v);
155  if (ref == -1)
156  this->add_point(0,u,v);
157  else
158  this->moa_point(ref,u,v);
159  ren_->GetRenderWindow()->Render();
160 }
161 //---------------------------------------------------------------------------
163 {
164  double p[3];
165  pos_[selected_-2]->GetPosition(p);
166  std::cout << ref_[selected_-2] << "\t" << p[0] << "\t" << p[1] << std::endl;
167 }
168 //---------------------------------------------------------------------------
169 std::istream& operator>> (std::istream& in, pixelpos_points& l)
170 {
171  int n;
172  in >> n;
173  if (n>0)
174  std::cerr << "importing " << n << " points" << std::endl;
175  for (int i=0; i<n; i++)
176  {
177  int ref;
178  double u,v;
179  in >> ref >> u >> v;
180  l.add_point(ref,u,v);
181  std::cerr << ref << " " << u << " " << v << std::endl;
182  }
183  return in;
184 }
185 //---------------------------------------------------------------------------
186 std::ostream& operator<< (std::ostream& o, const pixelpos_points& l)
187 {
188  o << l.ref_.size() << std::endl;
189  for (int i=0; i<l.ref_.size(); i++)
190  {
191  double p[3];
192  l.pos_[i]->GetPosition(p);
193  o << l.ref_[i] << "\t" << p[0] << "\t" << p[1] << std::endl;
194  }
195  return o;
196 }
std::vector< vtkTransform * > pos_
std::vector< int > ref_
vtkRenderer * ren_
void moa_point(int ref, double u, double v)
void add_or_moa_point(double u, double v)
int pick_point(double u, double v)
int select_point(double u, double v)
void add_point(int ref, double u, double v)
double v(const uint32_t step, const uint32_t n)
Definition: generate.cxx:42
uint32_t n[]
Definition: generate.cxx:34
std::istream & operator>>(std::istream &in, pixelpos_points &l)
std::ostream & operator<<(std::ostream &o, const pixelpos_points &l)
std::istringstream in
Definition: ply2tri.cxx:32