OPAL (Object Oriented Parallel Accelerator Library)  2.2.0
OPAL
Edit.cpp
Go to the documentation of this file.
1 // ------------------------------------------------------------------------
2 // $RCSfile: Edit.cpp,v $
3 // ------------------------------------------------------------------------
4 // $Revision: 1.2 $
5 // ------------------------------------------------------------------------
6 // Copyright: see Copyright.readme
7 // ------------------------------------------------------------------------
8 //
9 // Class: Edit
10 // This class is the work horse for OPAL sequence editor commands.
11 //
12 // ------------------------------------------------------------------------
13 //
14 // $Date: 2000/12/15 10:13:47 $
15 // $Author: opal $
16 //
17 // ------------------------------------------------------------------------
18 
19 #include "Editor/Edit.h"
20 #include "AbsBeamline/Drift.h"
22 #include "AbsBeamline/Marker.h"
28 #include "Algorithms/Flagger.h"
29 #include "BeamlineCore/DriftRep.h"
30 #include "Beamlines/TBeamline.h"
33 #include "Elements/OpalDrift.h"
34 #include "Lines/Sequence.h"
35 #include "Lines/SequenceMember.h"
37 #include "Tables/Selector.h"
39 #include "Utilities/Options.h"
41 #include <iostream>
42 
43 
44 namespace {
45 
46  // Class EditFlat
47  // Flatten the sequence being edited.
48  // ----------------------------------------------------------------------
49 
50  class EditFlat: public DefaultVisitor {
51 
52  public:
53 
54  // Construction/destruction
55  EditFlat(const Beamline &, Edit::TLine &, Sequence::ReferenceType);
56  virtual ~EditFlat();
57 
58 
59  //: Apply the algorithm to a drift.
60  // Accumulate drift length and skip.
61  virtual void visitDrift(const Drift &);
62 
63  //: Apply the algorithm to a marker.
64  // Suppress begin and end markers.
65  virtual void visitMarker(const Marker &);
66 
67  private:
68 
69  // Not implemented.
70  EditFlat();
71  EditFlat(const EditFlat &);
72  void operator=(const EditFlat &);
73 
74  // Apply default:
75  // Append element to flat sequence.
76  virtual void applyDefault(const ElementBase &);
77 
78  // The line to be filled during application of this visitor.
79  Edit::TLine &newLine;
80 
81  // The accumulated total length.
82  double sumLength;
83 
84  // The reference type for the outer sequence.
85  Sequence::ReferenceType reference;
86  };
87 
88 
89  // Implementation of class EditFlat
90  // ----------------------------------------------------------------------
91 
92  EditFlat::EditFlat(const Beamline &line, Edit::TLine &toLine,
94  DefaultVisitor(line, false, false), newLine(toLine), reference(refer) {
95  sumLength = 0.0;
96  }
97 
98 
99  EditFlat::~EditFlat()
100  {}
101 
102 
103  void EditFlat::visitDrift(const Drift &drift) {
104  // Accumulate drift length.
105  sumLength += drift.getElementLength();
106  }
107 
108 
109  void EditFlat::visitMarker(const Marker &marker) {
110  const std::string &name = marker.getName();
111  if(name[0] != '#') applyDefault(marker);
112  }
113 
114 
115  void EditFlat::applyDefault(const ElementBase &element) {
116  double length = element.getElementLength();
117  SequenceMember member;
118  Element *elem = Element::find(element.getName());
119  member.setElement(elem->getElement());
120 
121  // ada 4.5 2000 to speed up matching, add a pointer to
122  // opal elements in order to avoid serching the opal elements
123  member.OpalElement = elem;
124 
125  switch(reference) {
126  case Sequence::IS_ENTRY:
127  member.itsPosition = sumLength;
128  break;
129  case Sequence::IS_CENTRE:
130  member.itsPosition = sumLength + length / 2.0;
131  break;
132  case Sequence::IS_EXIT:
133  member.itsPosition = sumLength + length;
134  break;
135  }
136 
137  sumLength += length;
138  newLine.push_back(member);
139  }
140 };
141 
142 
143 // Class Edit
144 // This code assumes that the sequence has at least 3 members,
145 // namely the begin and end markers, and a drift between the two.
146 // We only look at the user-defined positions, and skip the drifts.
147 // ------------------------------------------------------------------------
148 
149 Edit *Edit::block = 0;
150 
151 
153  itsSequence(seq), itsLine(), isModified(false), parser() {
154  Pointer<Sequence> clone = seq->copy(seq->getOpalName());
155  itsLine = clone->fetchLine();
156  selectClear();
157 }
158 
159 
161 {}
162 
163 
164 bool Edit::cycle(const PlaceRep &init) {
165  // NOTE: We can cycle the top level only.
166  // Get length of sequence.
167  PlaceRep pos(init);
168  double length = itsSequence->getLength();
169 
170  // Point "first" to first element (may be end marker).
171  iterator first = itsLine->begin();
172  ++first;
173  ++first;
174 
175  // Point "last" to end marker.
176  iterator last = itsLine->end();
177  --last;
178 
179  for(iterator start = first; start != last;) {
180  pos.enter(*start);
181 
182  if(pos.isActive()) {
183  // Update positions preceding "start".
184  for(iterator i = first; i != start;) {
185  (*i).itsPosition += length;
186  ++i;
187  ++i;
188  }
189 
190  // Move all elements from "first" (included) to "start" (excluded),
191  // and the drifts following each element to just before "last".
192  itsLine->splice(last, *itsLine, first, start);
193 
194  // Point "first" to new start element.
195  iterator first = itsLine->begin();
196  ++first;
197  ++first;
198 
199  // Point "last" to end marker.
200  iterator last = itsLine->end();
201  --last;
202 
203  // Update the lengths to start with zero.
204  double startPos = (*first).itsPosition;
205  for(iterator i = first; i != last;) {
206  (*i).itsPosition -= startPos;
207  ++i;
208  ++i;
209  }
210 
211  isModified = true;
212  return true;
213  }
214 
215  pos.leave(*start);
216  ++start;
217  ++start;
218  }
219 
220  return false;
221 }
222 
223 
224 void Edit::finish(const std::string &newName) {
225  selectClear();
226 
227  if(newName == itsSequence->getOpalName()) {
228  // If name is unchanged and sequence is modified,
229  // replace the sequence line.
230  if(isModified) {
232  }
233  } else {
234  // If name is changed, build new modified sequence.
235  Sequence *model = dynamic_cast<Sequence *>(OpalData::getInstance()->find("SEQUENCE"));
236  Pointer<Sequence> copy = model->clone(newName);
237  copy->copyAttributes(*itsSequence);
238  copy->storeLine(*itsLine);
239  OpalData::getInstance()->define(&*copy);
240  copy->update();
241  }
242 
244 }
245 
246 
249  TLine newLine;
250  EditFlat flatten(*itsLine, newLine, refer);
251  flatten.execute();
252  itsSequence->addEndMarkers(newLine);
253  itsSequence->insertDrifts(newLine);
254  itsLine->swap(newLine);
255  isModified = true;
256 }
257 
258 
259 int Edit::installMultiple(ElementBase *elm, double at) {
260  return installMultiple(false, *itsLine, elm, at);
261 }
262 
263 
264 int Edit::installSingle(const PlaceRep &pos, ElementBase *elm, double at) {
265  PlaceRep from(pos);
266  return installSingle(false, *itsLine, from, elm, at);
267 }
268 
269 
270 int Edit::moveMultiple(double by) {
271  return moveMultiple(false, *itsLine, by);
272 }
273 
274 
275 int Edit::moveSingleAbs(const PlaceRep &pos, double to) {
276  PlaceRep it(pos);
277  return moveSingleAbs(false, *itsLine, it, to);
278 }
279 
280 
281 int Edit::moveSingleRel(const PlaceRep &pos, const PlaceRep &from, double to) {
282  PlaceRep it(pos);
283  PlaceRep frm(from);
284  return moveSingleRel(false, *itsLine, it, frm, to);
285 }
286 
287 
289  itsLine = reflect(*itsLine);
290 }
291 
292 
294  return removeMultiple(false, *itsLine);
295 }
296 
297 
298 int Edit::removeSingle(const PlaceRep &pos) {
299  PlaceRep it(pos);
300  return removeSingle(false, *itsLine, it);
301 }
302 
303 
305  return replaceMultiple(false, *itsLine, elm);
306 }
307 
308 
309 int Edit::replaceSingle(const PlaceRep &pos, ElementBase *elm) {
310  PlaceRep it(pos);
311  return replaceSingle(false, *itsLine, it, elm);
312 }
313 
314 
315 int Edit::select(const RangeRep &rng, const std::string &cls,
316  const std::string &typ, const std::string &patt) {
317  Selector sel(*itsLine, rng, cls, typ, patt);
318  sel.execute();
319  return sel.getCount();
320 }
321 
322 
324  Flagger flagger(*itsLine, false);
325  flagger.execute();
326 }
327 
328 
330  Flagger flagger(*itsLine, true);
331  flagger.execute();
332 }
333 
334 
335 void Edit::install(TLine &newList, ElementBase *elm, double at) {
336  SequenceMember member1;
337 
338  // Push the installed element.
339  member1.setElement(elm->copyStructure());
340 
341  // ada 4.5 2000 to speed up matching, add a pointer to
342  // opal elements in order to avoid serching the opal elements
343  member1.OpalElement = Element::find(elm->getName());
344 
346  member1.itsPosition = at;
347  newList.push_back(member1);
348 
349  // Push a generated drift.
350  SequenceMember member2;
351  DriftRep *drift = new DriftRep();
352  drift->setName("[DRIFT]");
353  member2.setElement(drift);
355  member2.itsPosition = 0.0;
356  newList.push_back(member2);
357 }
358 
359 
360 int Edit::installMultiple(bool shared, TLine &bl, ElementBase *elm, double at) {
361  int count = 0;
362  TLine newList;
363 
364  // Point "first" at begin marker.
365  iterator first = bl.begin();
366 
367  // Point "last" at end marker.
368  iterator last = bl.end();
369  --last;
370 
371  for(iterator i = first; i != last;) {
372  if(i->getSelectionFlag()) {
373  if(shared && Options::warn) {
374  invalidShare("INSTALL");
375  } else {
376  install(newList, elm, i->itsPosition + at);
377  ++count;
378  }
379  } else {
380  ElementBase *base = i->getElement()->removeWrappers();
381  if(dynamic_cast<FlaggedBeamline *>(base)) {
382  invalidLine("INSTALL");
383  } else if(TLine *line = dynamic_cast<TLine *>(base)) {
384  count += installMultiple(shared || base->isSharable(), *line, elm, at);
385  }
386  }
387 
388  ++i;
389  ++i;
390  }
391 
392  merge(bl, newList);
393  return count;
394 }
395 
396 
398 (bool shared, TLine &bl, PlaceRep &it, ElementBase *elm, double at) {
399  int count = 0;
400  TLine newList;
401 
402  // Point "first" at begin marker.
403  iterator first = bl.begin();
404 
405  // Point "last" at end marker.
406  iterator last = bl.end();
407  --last;
408 
409  for(iterator i = first; i != last;) {
410  it.enter(*i);
411 
412  if(it.isActive()) {
413  if(shared && Options::warn) {
414  invalidShare("INSTALL");
415  } else {
416  install(newList, elm, i->itsPosition + at);
417  ++count;
418  }
419  } else {
420  ElementBase *base = i->getElement()->removeWrappers();
421  if(dynamic_cast<FlaggedBeamline *>(base)) {
422  invalidLine("INSTALL");
423  } else if(TLine *line = dynamic_cast<TLine *>(base)) {
424  count += installSingle(shared || base->isSharable(),
425  *line, it, elm, at);
426  }
427  }
428 
429  it.leave(*i);
430  ++i;
431  ++i;
432  }
433 
434  merge(bl, newList);
435  return count;
436 }
437 
438 
439 void Edit::merge(TLine &bl, TLine &newList) {
440  // Point "first" at first element.
441  iterator first = bl.begin();
442  ++first;
443  ++first;
444 
445  // Point "last at end marker.
446  iterator last = bl.end();
447  --last;
448 
449  // For all positions in original line.
450  for(iterator i = first; i != last;) {
451  double sOld = i->itsPosition;
452 
453  // Insert new positions which belong before the current position.
454  iterator j = newList.begin();
455  iterator k = j;
456  while(k != newList.end() && k->itsPosition < sOld) {
457  ++k;
458  ++k;
459  }
460 
461  if(j != k) {
462  bl.splice(i, newList, j, k);
463  isModified = true;
464  }
465 
466  ++i;
467  ++i;
468  }
469 
470  // Insert any remaining positions before end marker.
471  // This happens even if their position is beyond the end marker.
472  if(! newList.empty()) {
473  bl.splice(last, newList, newList.begin(), newList.end());
474  isModified = true;
475  }
476 }
477 
478 
479 int Edit::moveMultiple(bool shared, TLine &bl, double by) {
480  int count = 0;
481  TLine newList;
482 
483  // Point "first" at first element (may be end marker).
484  iterator first = bl.begin();
485  ++first;
486  ++first;
487 
488  // Point "last" at end marker.
489  iterator last = bl.end();
490  --last;
491 
492  for(iterator i = first; i != last;) {
493  iterator j = i;
494  ++i;
495  ++i;
496 
497  if(j->getSelectionFlag()) {
498  if(shared && Options::warn) {
499  invalidShare("MOVE");
500  } else {
501  // Move element and following drift to "newList".
502  j->itsPosition += by;
503  newList.splice(newList.end(), bl, j, i);
504  ++count;
505  isModified = true;
506  }
507  } else {
508  ElementBase *base = j->getElement()->removeWrappers();
509  if(dynamic_cast<FlaggedBeamline *>(base)) {
510  invalidLine("MOVE");
511  } else if(TLine *line = dynamic_cast<TLine *>(base)) {
512  count += moveMultiple(shared || base->isSharable(), *line, by);
513  }
514  }
515  }
516 
517  merge(bl, newList);
518  return count;
519 }
520 
521 
522 int Edit::moveSingleAbs(bool shared, TLine &bl, PlaceRep &it, double to) {
523  int count = 0;
524  TLine newList;
525 
526  // Point "first" at first element (may be end marker).
527  iterator first = bl.begin();
528  ++first;
529  ++first;
530 
531  // Point "last" at end marker.
532  iterator last = bl.end();
533  --last;
534 
535  for(iterator i = first; i != last;) {
536  iterator j = i;
537  ++i;
538  ++i;
539  it.enter(*j);
540 
541  if(it.isActive()) {
542  if(shared && Options::warn) {
543  invalidShare("MOVE");
544  } else {
545  // Move element and following drift to "newList".
546  j->itsPosition = to;
547  newList.splice(newList.end(), bl, j, i);
548  ++count;
549  isModified = true;
550  }
551  } else {
552  ElementBase *base = j->getElement()->removeWrappers();
553  if(dynamic_cast<FlaggedBeamline *>(base)) {
554  invalidLine("MOVE");
555  } else if(TLine *line = dynamic_cast<TLine *>(base)) {
556  count += moveSingleAbs(shared | base->isSharable(), *line, it, to);
557  }
558  }
559 
560  it.leave(*j);
561  }
562 
563  merge(bl, newList);
564  return count;
565 }
566 
567 
569 (bool shared, TLine &bl, PlaceRep &it, PlaceRep &from, double by) {
570  int count = 0;
571  TLine newList;
572 
573  // Point "first" at first element (may be end marker).
574  iterator first = bl.begin();
575  ++first;
576  ++first;
577 
578  // Point "last" at end marker.
579  iterator last = bl.end();
580  --last;
581 
582  for(iterator i = first; i != last;) {
583  iterator j = i;
584  ++i;
585  ++i;
586  it.enter(*j);
587 
588  if(it.isActive()) {
589  if(shared && Options::warn) {
590  invalidShare("MOVE");
591  } else {
592  double fromPos = 0.0;
593  from.initialize();
594  for(iterator k = bl.begin(); k != bl.end(); ++k) {
595  from.enter(*k);
596  if(from.isActive()) {
597  fromPos = k->itsPosition + by;
598  goto doIt;
599  }
600  from.leave(*k);
601  }
602  throw OpalException("Edit::MoveSingleRel()",
603  "\"FROM\" position not found.");
604 
605 doIt: {
606  // Move element and following drift to "newList".
607  j->itsPosition = fromPos;
608  newList.splice(newList.end(), bl, j, i);
609  ++count;
610  isModified = true;
611  }
612  }
613  } else {
614  ElementBase *base = j->getElement()->removeWrappers();
615  if(dynamic_cast<FlaggedBeamline *>(base)) {
616  invalidLine("MOVE");
617  } else if(TLine *line = dynamic_cast<TLine *>(base)) {
618  count += moveSingleRel(shared || base->isSharable(),
619  *line, it, from, by);
620  }
621  }
622  it.leave(*j);
623  }
624 
625  merge(bl, newList);
626  return count;
627 }
628 
629 
631  double length = bl.back().itsPosition;
632  TLine *newLine = new TLine(bl.getName());
633  newLine->push_front(bl.back());
634 
635  iterator first = bl.begin();
636  ++first;
637  iterator last = bl.end();
638  --last;
639  for(iterator i = first; i != last; ++i) {
640  SequenceMember member(*i);
641  member.itsPosition = length - member.itsPosition;
642  member.setReflectionFlag(! member.getReflectionFlag());
643  newLine->push_front(member);
644  }
645 
646  newLine->push_front(bl.front());
647  isModified = true;
648  return newLine;
649 }
650 
651 
652 int Edit::removeMultiple(bool shared, TLine &bl) {
653  int count = 0;
654 
655  // Point "first" at begin marker.
656  iterator first = bl.begin();
657  ++first;
658  ++first;
659 
660  // Point "last" at end marker.
661  iterator last = bl.end();
662  --last;
663 
664  for(iterator i = first; i != last;) {
665  iterator j = i;
666  ++i;
667  ++i;
668 
669  if(j->getSelectionFlag()) {
670  if(shared && Options::warn) {
671  invalidShare("REMOVE");
672  ++i;
673  } else {
674  bl.erase(j, i);
675  ++count;
676  isModified = true;
677  }
678  } else {
679  ElementBase *base = j->getElement()->removeWrappers();
680  if(dynamic_cast<FlaggedBeamline *>(base)) {
681  invalidLine("REMOVE");
682  } else if(TLine *line = dynamic_cast<TLine *>(base)) {
683  count += removeMultiple(shared || base->isSharable(), *line);
684  }
685  }
686  }
687 
688  return count;
689 }
690 
691 
692 int Edit::removeSingle(bool shared, TLine &bl, PlaceRep &it) {
693  int count = 0;
694 
695  // Point "first" at begin marker.
696  iterator first = bl.begin();
697  ++first;
698  ++first;
699 
700  // Point "last" at end marker.
701  iterator last = bl.end();
702  --last;
703 
704  for(iterator i = first; i != last;) {
705  // We must get the place status before removing anything !
706  it.enter(*i);
707  bool doIt = it.isActive();
708  it.leave(*i);
709 
710  iterator j = i;
711  ++i;
712  ++i;
713 
714  if(doIt) {
715  if(shared && Options::warn) {
716  invalidShare("REMOVE");
717  } else {
718  bl.erase(j, i);
719  ++count;
720  isModified = true;
721  }
722  } else {
723  ElementBase *base = j->getElement()->removeWrappers();
724  if(dynamic_cast<FlaggedBeamline *>(base)) {
725  invalidLine("REMOVE");
726  } else if(TLine *line = dynamic_cast<TLine *>(base)) {
727  count += removeSingle(shared || base->isSharable(), *line, it);
728  }
729  }
730  }
731 
732  return count;
733 }
734 
735 
736 int Edit::replaceMultiple(bool shared, TLine &bl, ElementBase *elm) {
737  int count = 0;
738 
739  // Point "first" at first element.
740  iterator first = bl.begin();
741  ++first;
742  ++first;
743 
744  // Point "last" at end marker.
745  iterator last = bl.end();
746  --last;
747 
748  for(iterator i = first; i != last;) {
749  if(i->getSelectionFlag()) {
750  if(shared && Options::warn) {
751  invalidShare("REPLACE");
752  } else {
753  i->setElement(elm);
754 
755  // ada 4.5 2000 to speed up matching, add a pointer to
756  // opal elements in order to avoid serching the opal elements
757  i->OpalElement = Element::find(elm->getName());
758 
759  ++count;
760  isModified = true;
761  }
762  } else {
763  ElementBase *base = i->getElement()->removeWrappers();
764  if(dynamic_cast<FlaggedBeamline *>(base)) {
765  invalidLine("REPLACE");
766  } else if(TLine *line = dynamic_cast<TLine *>(base)) {
767  count += replaceMultiple(shared || base->isSharable(), *line, elm);
768  }
769  }
770 
771  ++i;
772  ++i;
773  }
774 
775  return count;
776 }
777 
778 
779 int Edit::replaceSingle(bool shared, TLine &bl, PlaceRep &it, ElementBase *elm) {
780  int count = 0;
781 
782  // Point "first" at first element.
783  iterator first = bl.begin();
784  ++first;
785  ++first;
786 
787  // Point "last" at end marker.
788  iterator last = bl.end();
789  --last;
790 
791  for(iterator i = first; i != last;) {
792  it.enter(*i);
793 
794  if(it.isActive()) {
795  if(shared && Options::warn) {
796  invalidShare("REPLACE");
797  } else {
798  i->setElement(elm);
799 
800  // ada 4.5 2000 to speed up matching, add a pointer to
801  // opal elements in order to avoid serching the opal elements
802  i->OpalElement = Element::find(elm->getName());
803 
804  ++count;
805  isModified = true;
806  }
807  } else {
808  ElementBase *base = i->getElement()->removeWrappers();
809  if(dynamic_cast<FlaggedBeamline *>(base)) {
810  invalidLine("REPLACE");
811  } else if(TLine *line = dynamic_cast<TLine *>(base)) {
812  count += replaceSingle(shared || base->isSharable(), *line, it, elm);
813  }
814  }
815 
816  it.leave(*i);
817  ++i;
818  ++i;
819  }
820 
821  return count;
822 }
823 
824 
825 void Edit::invalidLine(const char cmd[]) {
826  if(Options::warn) {
827  std::cerr << "\n### Warning ### You cannot apply \"" << cmd
828  << "\" on a nested \"LINE\".\n" << std::endl;
829  }
830 }
831 
832 
833 void Edit::invalidShare(const char cmd[]) {
834  if(Options::warn) {
835  std::cerr << "\n### Warning ### You cannot apply \"" << cmd
836  << "\" on a nested shared object.\n" << std::endl;
837  }
838 }
Sequence::TLine TLine
The type of line contained in a sequence.
Definition: Edit.h:50
virtual void visitDrift(const Drift &)
Apply the algorithm to a drift.
int installMultiple(ElementBase *, double)
Install multiple elements.
Definition: Edit.cpp:259
Interface for basic beam line object.
Definition: ElementBase.h:128
virtual TLine * fetchLine() const
Return the embedded CLASSIC beam line.
Definition: Sequence.cpp:279
Pointer< TLine > itsLine
The edit sequence.
Definition: Edit.h:124
void define(Object *newObject)
Define a new object.
Definition: OpalData.cpp:538
void copyAttributes(const Object &)
Copy attributes from another object.
Definition: Object.cpp:57
virtual void applyDefault(const ElementBase &)
The base class for all OPAL exceptions.
Definition: OpalException.h:28
virtual void setName(const std::string &name)
Set element name.
virtual ElementBase * removeWrappers()
Return the design element.
~Edit()
Definition: Edit.cpp:160
Interface for a marker.
Definition: Marker.h:32
void selectClear()
Clear all selection flags.
Definition: Edit.cpp:323
virtual const std::string & getName() const
Get element name.
Definition: ElementBase.cpp:95
void operator=(const DefaultVisitor &)
Interface for drift space.
Definition: Drift.h:33
bool isActive() const
Return status.
Definition: PlaceRep.cpp:98
void selectFull()
Set all selection flags.
Definition: Edit.cpp:329
bool warn
Warn flag.
Definition: Options.cpp:10
Default algorithms.
double itsPosition
The position attribute (&quot;AT&quot; or &quot;DRIFT&quot;).
void insertDrifts(TLine &line)
Definition: Sequence.cpp:369
bool isModified
Modify flag.
Definition: Edit.h:128
void invalidShare(const char msg[])
Definition: Edit.cpp:833
Pointer< Sequence > itsSequence
The original sequence.
Definition: Edit.h:121
Set selection flags for a given range in a beam line.
Definition: Selector.h:33
ReferenceType getReference() const
Return the reference type flag.
Definition: Sequence.cpp:178
Representation of a place within a beam line or sequence.
Definition: PlaceRep.h:41
virtual void visitMarker(const Marker &)
Apply the algorithm to a marker.
static OpalData * getInstance()
Definition: OpalData.cpp:209
int replaceSingle(const PlaceRep &, ElementBase *elem)
Replace single element.
Definition: Edit.cpp:309
const std::string & getOpalName() const
Return object name.
Definition: Object.cpp:284
MemberType itsType
Type word.
Template class for beam lines.
Definition: TBeamline.h:40
The base class for all OPAL elements.
Definition: Element.h:46
virtual double getElementLength() const
Get design length.
Definition: ElementBase.h:511
ReferenceType
Reference for element positioning.
Definition: Element.h:52
void addEndMarkers(TLine &line) const
Definition: Sequence.cpp:313
int moveSingleAbs(const PlaceRep &, double to)
Move single element.
Definition: Edit.cpp:275
void enter(const FlaggedElmPtr &) const
Enter an element or line.
Definition: PlaceRep.cpp:70
Sequence::TLine::iterator iterator
The line iterator for a sequence.
Definition: Edit.h:53
void storeLine(TLine &line)
Store sequence line.
Definition: Sequence.cpp:284
The SEQUENCE definition.
Definition: Sequence.h:38
int installSingle(const PlaceRep &, ElementBase *, double)
Install element relative to place.
Definition: Edit.cpp:264
void reflect()
Reflect the edit sequence.
Definition: Edit.cpp:288
virtual ElementBase * copyStructure()
Make a structural copy.
Set/reset all selection flags in a beam line built from FlaggedElmPtr.
Definition: Flagger.h:31
void initialize()
Initialise data for search.
Definition: PlaceRep.cpp:64
static Edit * block
Pointer to the edit data.
Definition: Edit.h:134
Representation of a range within a beam line or sequence.
Definition: RangeRep.h:34
void leave(const FlaggedElmPtr &) const
Leave an element or line.
Definition: PlaceRep.cpp:84
An abstract sequence of beam line components.
Definition: Beamline.h:37
virtual Sequence * clone(const std::string &name)
Make clone.
Definition: Sequence.cpp:98
virtual void execute()
Apply the algorithm to the top-level beamline.
bool cycle(const PlaceRep &start)
Cycle the edit sequence.
Definition: Edit.cpp:164
ElementBase * getElement() const
Return the embedded CLASSIC element.
Definition: Element.h:128
static Element * find(const std::string &name)
Find named Element.
Definition: Element.cpp:37
virtual Sequence * copy(const std::string &name)
Make copy of the sequence line.
Definition: Sequence.cpp:103
This class contains all data for the sequence editor.
Definition: Edit.h:38
void merge(TLine &, TLine &)
Definition: Edit.cpp:439
virtual double getLength() const
Return sequence length.
Definition: Sequence.cpp:151
void invalidLine(const char msg[])
Definition: Edit.cpp:825
Object * find(const std::string &name)
Find entry.
Definition: OpalData.cpp:618
void install(TLine &, ElementBase *, double)
Definition: Edit.cpp:335
const std::string name
int removeSingle(const PlaceRep &)
Remove single element.
Definition: Edit.cpp:298
bool getReflectionFlag() const
Get reflection flag.
int removeMultiple()
Remove multiple elements.
Definition: Edit.cpp:293
bool isSharable() const
Test if the element can be shared.
Definition: ElementBase.h:559
void finish(const std::string &newName)
Finish editing.
Definition: Edit.cpp:224
int moveSingleRel(const PlaceRep &, const PlaceRep &, double to)
Move single element.
Definition: Edit.cpp:281
int select(const RangeRep &rng, const std::string &cls, const std::string &typ, const std::string &patt)
Select elements in the edit sequence.
Definition: Edit.cpp:315
virtual void execute()
Execute the selection.
Definition: Selector.cpp:58
int replaceMultiple(ElementBase *elem)
Replace multiple elements.
Definition: Edit.cpp:304
virtual void update()
Update the embedded CLASSIC beam line.
Definition: Sequence.cpp:273
int moveMultiple(double by)
Move multiple elements.
Definition: Edit.cpp:270
int getCount() const
Return the count of selected elements.
Definition: Selector.cpp:91
Representation for a drift space.
Definition: DriftRep.h:32
Inform & endl(Inform &inf)
Definition: Inform.cpp:42
void makeDirty(Object *object)
Invalidate expressions.
Definition: OpalData.cpp:629
void flatten()
Flatten the edit sequence.
Definition: Edit.cpp:247
Pointer< Element > OpalElement
void setElement(ElementBase *)
Set the element pointer.
Definition: ElmPtr.h:63
A member of a SEQUENCE.
void setReflectionFlag(bool flag) const
Set reflection flag.