• Skip to content
  • Skip to link menu
KDE API Reference
  • KDE API Reference
  • kdeedu API Reference
  • KDE Home
  • Contact Us
 

kig

  • sources
  • kde-4.12
  • kdeedu
  • kig
  • filters
kgeo-filter.cc
Go to the documentation of this file.
1 
21 #include "kgeo-filter.h"
22 
23 #include "kgeo-resource.h"
24 #include "filters-common.h"
25 
26 #include "../kig/kig_part.h"
27 #include "../kig/kig_document.h"
28 #include "../objects/angle_type.h"
29 #include "../objects/bogus_imp.h"
30 #include "../objects/circle_imp.h"
31 #include "../objects/circle_type.h"
32 #include "../objects/intersection_types.h"
33 #include "../objects/line_type.h"
34 #include "../objects/object_calcer.h"
35 #include "../objects/object_drawer.h"
36 #include "../objects/object_factory.h"
37 #include "../objects/object_holder.h"
38 #include "../objects/other_type.h"
39 #include "../objects/point_imp.h"
40 #include "../objects/point_type.h"
41 #include "../objects/text_type.h"
42 #include "../objects/transform_types.h"
43 #include "../objects/vector_type.h"
44 
45 #include <kconfig.h>
46 #include <kconfiggroup.h>
47 
48 #include <algorithm>
49 #include <functional>
50 
51 bool KigFilterKGeo::supportMime( const QString& mime )
52 {
53  return mime == "application/x-kgeo";
54 }
55 
56 KigDocument* KigFilterKGeo::load( const QString& sFrom )
57 {
58  // kgeo uses a KConfig to save its contents...
59  KConfig config ( sFrom, KConfig::SimpleConfig );
60 
61  loadMetrics ( &config );
62  return loadObjects ( sFrom, &config );
63 }
64 
65 void KigFilterKGeo::loadMetrics(KConfig* c )
66 {
67  KConfigGroup grp = c->group("Main");
68  xMax = grp.readEntry("XMax", 16);
69  yMax = grp.readEntry("YMax", 11);
70  grid = grp.readEntry( "Grid", true );
71  axes = grp.readEntry( "Axes", true );
72  // the rest is not relevant to us (yet ?)...
73 }
74 
75 struct KGeoHierarchyElement
76 {
77  int id;
78  std::vector<int> parents;
79 };
80 
81 static void visitElem( std::vector<KGeoHierarchyElement>& ret,
82  const std::vector<KGeoHierarchyElement>& elems,
83  std::vector<bool>& seen,
84  int i )
85 {
86  if ( !seen[i] )
87  {
88  for ( uint j = 0; j < elems[i].parents.size(); ++j )
89  visitElem( ret, elems, seen, elems[i].parents[j] );
90  ret.push_back( elems[i] );
91  seen[i] = true;
92  };
93 }
94 
95 static std::vector<KGeoHierarchyElement> sortElems( const std::vector<KGeoHierarchyElement> elems )
96 {
97  std::vector<KGeoHierarchyElement> ret;
98  std::vector<bool> seenElems( elems.size(), false );
99  for ( uint i = 0; i < elems.size(); ++i )
100  visitElem( ret, elems, seenElems, i );
101  return ret;
102 }
103 
104 KigDocument* KigFilterKGeo::loadObjects( const QString& file, KConfig* c )
105 {
106  KigDocument* ret = new KigDocument();
107 
108  using namespace std;
109 
110  QString group;
111  bool ok = true;
112  KConfigGroup grp = c->group("Main");
113  int number = grp.readEntry ("Number",0);
114 
115  // first we determine the parent relationships, and sort the
116  // elements in an order that we can be sure all of an object's
117  // parents will have been handled before it is handled itself..
118  // ( aka topological sort of the parent relations graph..
119  std::vector<KGeoHierarchyElement> elems;
120  elems.reserve( number );
121 
122  for ( int i = 0; i < number; ++i )
123  {
124  KGeoHierarchyElement elem;
125  elem.id = i;
126  group.setNum( i + 1 );
127  group.prepend( "Object " );
128 
129  KConfigGroup grp = c->group(group);
130  QStringList parents = grp.readEntry( "Parents", QVariant( QVariant::StringList ) ).toStringList();
131  elems.push_back( elem );
132  for ( QStringList::ConstIterator parent = parents.constBegin(); parent != parents.constEnd(); ++parent )
133  {
134  int parentIndex = ( *parent ).toInt( &ok );
135  if ( ! ok ) KIG_FILTER_PARSE_ERROR;
136  if ( parentIndex != 0 )
137  elems[i].parents.push_back( parentIndex - 1 );
138  };
139  };
140 
141  std::vector<KGeoHierarchyElement> sortedElems = sortElems( elems );
142  std::vector<ObjectHolder*> os;
143  os.resize( number, 0 );
144  const ObjectFactory* factory = ObjectFactory::instance();
145 
146  // now we iterate over the elems again in the newly determined
147  // order..
148  for ( uint i = 0; i < sortedElems.size(); ++i )
149  {
150  const KGeoHierarchyElement& e = sortedElems[i];
151  int id = e.id;
152  group.setNum( id + 1 );
153  group.prepend( "Object " );
154  KConfigGroup grp = c->group(group );
155  int objID = grp.readEntry( "Geo",0 );
156 
157  std::vector<ObjectCalcer*> parents;
158  for ( uint j = 0; j < e.parents.size(); ++j )
159  {
160  int parentid = e.parents[j];
161  parents.push_back( os[parentid]->calcer() );
162  };
163 
164  ObjectCalcer* o = 0;
165  switch (objID)
166  {
167  case ID_point:
168  {
169  // fetch the coordinates...
170  QString strX = grp.readEntry("QPointX");
171  QString strY = grp.readEntry("QPointY");
172  double x = strX.toDouble(&ok);
173  if (!ok) KIG_FILTER_PARSE_ERROR;
174  double y = strY.toDouble(&ok);
175  if (!ok) KIG_FILTER_PARSE_ERROR;
176  Coordinate m( x, y );
177  uint nparents = parents.size();
178  if ( nparents == 0 )
179  o = factory->fixedPointCalcer( m );
180  else if ( nparents == 1 )
181  o = factory->constrainedPointCalcer( parents[0], m, *ret );
182  else
183  KIG_FILTER_PARSE_ERROR;
184  break;
185  }
186  case ID_segment:
187  {
188  o = new ObjectTypeCalcer( SegmentABType::instance(), parents );
189  break;
190  }
191  case ID_circle:
192  {
193  o = new ObjectTypeCalcer( CircleBCPType::instance(), parents );
194  break;
195  }
196  case ID_line:
197  {
198  o = new ObjectTypeCalcer( LineABType::instance(), parents );
199  break;
200  }
201  case ID_bisection:
202  {
203  // if this is the bisection of two points, first build a segment
204  // between them..
205  if ( parents.size() == 2 )
206  {
207  ObjectTypeCalcer* seg = new ObjectTypeCalcer( SegmentABType::instance(), parents );
208  parents.clear();
209  parents.push_back( seg );
210  }
211  if ( parents.size() != 1 ) KIG_FILTER_PARSE_ERROR;
212  o = factory->propertyObjectCalcer( parents[0], "mid-point" );
213  break;
214  };
215  case ID_perpendicular:
216  {
217  o = new ObjectTypeCalcer( LinePerpendLPType::instance(), parents );
218  break;
219  }
220  case ID_parallel:
221  {
222  o = new ObjectTypeCalcer( LineParallelLPType::instance(), parents );
223  break;
224  }
225  case ID_vector:
226  {
227  o = new ObjectTypeCalcer( VectorType::instance(), parents );
228  break;
229  }
230  case ID_ray:
231  {
232  o = new ObjectTypeCalcer( RayABType::instance(), parents );
233  break;
234  }
235  case ID_move:
236  {
237  o = new ObjectTypeCalcer( TranslatedType::instance(), parents );
238  break;
239  }
240  case ID_mirrorPoint:
241  {
242  o = new ObjectTypeCalcer( PointReflectionType::instance(), parents );
243  break;
244  }
245  case ID_pointOfConc:
246  {
247  o = new ObjectTypeCalcer( LineLineIntersectionType::instance(), parents );
248  break;
249  }
250  case ID_text:
251  {
252  bool frame = grp.readEntry( "Frame",true );
253  double x = grp.readEntry( "TextRectCenterX",0.0 );
254  double y = grp.readEntry( "TextRectCenterY",0.0 );
255  QString text = grp.readEntry( "TextRectEntry" );
256  double height = grp.readEntry( "TextRectHeight",0.0 );
257  double width = grp.readEntry( "TextRectWidth",0.0 );
258  // we don't want the center, but the top left..
259  x -= width / 80;
260  y -= height / 80;
261  o = factory->labelCalcer(
262  text, Coordinate( x, y ), frame, std::vector<ObjectCalcer*>(), *ret );
263  break;
264  }
265  case ID_fixedCircle:
266  {
267  double r = grp.readEntry( "Radius",0.0 );
268  parents.push_back( new ObjectConstCalcer( new DoubleImp( r ) ) );
269  o = new ObjectTypeCalcer( CircleBPRType::instance(), parents );
270  break;
271  }
272  case ID_angle:
273  {
274  if ( parents.size() == 3 )
275  {
276  ObjectTypeCalcer* ao = new ObjectTypeCalcer( AngleType::instance(), parents );
277  ao->calc( *ret );
278  parents.clear();
279  parents.push_back( ao );
280  };
281  if ( parents.size() != 1 ) KIG_FILTER_PARSE_ERROR;
282  ObjectCalcer* angle = parents[0];
283  parents.clear();
284  const Coordinate c =
285  static_cast<const PointImp*>( angle->parents()[1]->imp() )->coordinate();
286  o = filtersConstructTextObject( c, angle, "angle-degrees", *ret, true );
287  break;
288  }
289  case ID_distance:
290  {
291  if ( parents.size() != 2 ) KIG_FILTER_PARSE_ERROR;
292  ObjectTypeCalcer* segment = new ObjectTypeCalcer( SegmentABType::instance(), parents );
293  segment->calc( *ret );
294  Coordinate m = ( static_cast<const PointImp*>( parents[0]->imp() )->coordinate() +
295  static_cast<const PointImp*>( parents[1]->imp() )->coordinate() ) / 2;
296  o = filtersConstructTextObject( m, segment, "length", *ret, true );
297  break;
298  }
299  case ID_arc:
300  {
301  o = new ObjectTypeCalcer( AngleType::instance(), parents );
302  break;
303  }
304  case ID_area:
305  {
306  if ( parents.size() != 1 ) KIG_FILTER_PARSE_ERROR;
307  const CircleImp* circle = static_cast<const CircleImp*>( parents[0]->imp() );
308  const Coordinate c = circle->center() + Coordinate( circle->radius(), 0 );
309  o = filtersConstructTextObject( c, parents[0], "surface", *ret, true );
310  break;
311  }
312  case ID_slope:
313  {
314  // if parents contains a segment, line, vector or whatever, we
315  // take its parents cause we want points..
316  if ( parents.size() == 1 ) parents = parents[0]->parents();
317  if ( parents.size() != 2 ) KIG_FILTER_PARSE_ERROR;
318  const Coordinate c = (
319  static_cast<const PointImp*>( parents[0]->imp() )->coordinate() +
320  static_cast<const PointImp*>( parents[1]->imp() )->coordinate() ) / 2;
321  ObjectTypeCalcer* line = new ObjectTypeCalcer( LineABType::instance(), parents );
322  line->calc( *ret );
323  o = filtersConstructTextObject( c, line, "slope", *ret, true );
324  break;
325  }
326  case ID_circumference:
327  {
328  if ( parents.size() != 1 ) KIG_FILTER_PARSE_ERROR;
329  const CircleImp* c = static_cast<const CircleImp*>( parents[0]->imp() );
330  const Coordinate m = c->center() + Coordinate( c->radius(), 0 );
331  o = filtersConstructTextObject( m, parents[0], "circumference", *ret, true );
332  break;
333  }
334  case ID_rotation:
335  {
336  // in kig, the rotated object should be last..
337  ObjectCalcer* t = parents[2];
338  parents[2] = parents[0];
339  parents[0] = t;
340  o = new ObjectTypeCalcer( RotationType::instance(), parents );
341  break;
342  }
343  default:
344  KIG_FILTER_PARSE_ERROR;
345  };
346 
347  // set the color...
348  QColor co = grp.readEntry( "Color",QColor() );
349  if( !co.isValid() )
350  co = Qt::blue;
351  ObjectDrawer* d = new ObjectDrawer( co );
352 
353  os[i] = new ObjectHolder( o, d );
354  os[i]->calc( *ret );
355  }; // for loop (creating KGeoHierarchyElements..
356 
357  ret->addObjects( os );
358  ret->setGrid( grid );
359  ret->setAxes( axes );
360  return ret;
361 }
362 
363 KigFilterKGeo::KigFilterKGeo()
364 {
365 }
366 
367 KigFilterKGeo::~KigFilterKGeo()
368 {
369 }
370 
371 KigFilterKGeo* KigFilterKGeo::instance()
372 {
373  static KigFilterKGeo f;
374  return &f;
375 }
ID_move
#define ID_move
Definition: kgeo-resource.h:131
ObjectFactory::instance
static const ObjectFactory * instance()
Definition: object_factory.cc:90
kgeo-resource.h
KigFilterKGeo
This is an import filter for files generated by the program KGeo, which was an interactive geometry p...
Definition: kgeo-filter.h:35
ID_slope
#define ID_slope
Definition: kgeo-resource.h:124
ID_angle
#define ID_angle
Definition: kgeo-resource.h:122
PointReflectionType::instance
static const PointReflectionType * instance()
Definition: transform_types.cc:87
KigFilterKGeo::loadMetrics
void loadMetrics(KConfig *)
Definition: kgeo-filter.cc:65
RotationType::instance
static const RotationType * instance()
Definition: transform_types.cc:161
TranslatedType::instance
static const TranslatedType * instance()
Definition: transform_types.cc:52
ObjectConstCalcer
This is an ObjectCalcer that keeps an ObjectImp, and never calculates a new one.
Definition: object_calcer.h:232
LinePerpendLPType::instance
static LinePerpendLPType * instance()
Definition: line_type.cc:130
ID_area
#define ID_area
Definition: kgeo-resource.h:123
KigFilterKGeo::supportMime
bool supportMime(const QString &mime)
This file is part of Kig, a KDE program for Interactive Geometry...
Definition: kgeo-filter.cc:51
ID_fixedCircle
#define ID_fixedCircle
Definition: kgeo-resource.h:109
ID_arc
#define ID_arc
Definition: kgeo-resource.h:110
CircleImp
An ObjectImp representing a circle.
Definition: circle_imp.h:27
kgeo-filter.h
AngleType::instance
static const AngleType * instance()
Definition: angle_type.cc:63
CircleBPRType::instance
static const CircleBPRType * instance()
Definition: circle_type.cc:210
CircleImp::center
const Coordinate center() const
Return the center of this circle.
Definition: circle_imp.cc:210
RayABType::instance
static const RayABType * instance()
Definition: line_type.cc:119
ID_vector
#define ID_vector
Definition: kgeo-resource.h:126
KigDocument::addObjects
void addObjects(const std::vector< ObjectHolder * > &os)
Add the objects os to the document.
Definition: kig_document.cc:143
ObjectTypeCalcer
This is an ObjectCalcer that uses one of the various ObjectType's to calculate its ObjectImp...
Definition: object_calcer.h:183
Coordinate
The Coordinate class is the basic class representing a 2D location by its x and y components...
Definition: coordinate.h:33
KigDocument::setGrid
void setGrid(bool showgrid)
set to show/hide the grid.
Definition: kig_document.cc:181
ID_mirrorPoint
#define ID_mirrorPoint
Definition: kgeo-resource.h:104
visitElem
static void visitElem(std::vector< KGeoHierarchyElement > &ret, const std::vector< KGeoHierarchyElement > &elems, std::vector< bool > &seen, int i)
Definition: kgeo-filter.cc:81
ID_circumference
#define ID_circumference
Definition: kgeo-resource.h:125
ID_pointOfConc
#define ID_pointOfConc
Definition: kgeo-resource.h:102
LineLineIntersectionType::instance
static const LineLineIntersectionType * instance()
Definition: intersection_types.cc:374
ID_line
#define ID_line
Definition: kgeo-resource.h:108
ObjectHolder
An ObjectHolder represents an object as it is known to the document.
Definition: object_holder.h:40
LineParallelLPType::instance
static LineParallelLPType * instance()
Definition: line_type.cc:163
VectorType::instance
static const VectorType * instance()
Definition: vector_type.cc:43
PointImp
An ObjectImp representing a point.
Definition: point_imp.h:27
ObjectCalcer
An ObjectCalcer is an object that represents an algorithm for calculating an ObjectImp from other Obj...
Definition: object_calcer.h:66
filtersConstructTextObject
ObjectTypeCalcer * filtersConstructTextObject(const Coordinate &c, ObjectCalcer *o, const QByteArray &arg, const KigDocument &doc, bool needframe)
constructs a text object with text "%1", location c, and variable parts given by the argument arg of ...
Definition: filters-common.cc:28
KigFilterKGeo::instance
static KigFilterKGeo * instance()
Definition: kgeo-filter.cc:371
ID_rotation
#define ID_rotation
Definition: kgeo-resource.h:132
CircleBCPType::instance
static const CircleBCPType * instance()
Definition: circle_type.cc:55
sortElems
static std::vector< KGeoHierarchyElement > sortElems(const std::vector< KGeoHierarchyElement > elems)
Definition: kgeo-filter.cc:95
ID_circle
#define ID_circle
Definition: kgeo-resource.h:107
ID_parallel
#define ID_parallel
Definition: kgeo-resource.h:129
ID_point
#define ID_point
Definition: kgeo-resource.h:99
ObjectDrawer
A class holding some information about how a certain object is drawn on the window.
Definition: object_drawer.h:47
KigFilterKGeo::xMax
int xMax
Definition: kgeo-filter.h:49
KigDocument::setAxes
void setAxes(bool showaxes)
set to show/hide the grid.
Definition: kig_document.cc:191
ID_text
#define ID_text
Definition: kgeo-resource.h:133
CircleImp::radius
double radius() const
Return the radius of this circle.
Definition: circle_imp.cc:215
KigFilterKGeo::KigFilterKGeo
KigFilterKGeo()
Definition: kgeo-filter.cc:363
filters-common.h
DoubleImp
This ObjectImp is a BogusImp containing only a double value.
Definition: bogus_imp.h:89
KigDocument
KigDocument is the class holding the real data in a Kig document.
Definition: kig_document.h:36
ID_bisection
#define ID_bisection
Definition: kgeo-resource.h:103
KigFilterKGeo::loadObjects
KigDocument * loadObjects(const QString &file, KConfig *)
Definition: kgeo-filter.cc:104
ObjectTypeCalcer::calc
void calc(const KigDocument &doc)
Makes the ObjectCalcer recalculate its ObjectImp from its parents.
Definition: object_calcer.cc:32
KIG_FILTER_PARSE_ERROR
#define KIG_FILTER_PARSE_ERROR
Definition: filter.h:53
SegmentABType::instance
static const SegmentABType * instance()
Definition: line_type.cc:55
KigFilterKGeo::grid
bool grid
Definition: kgeo-filter.h:51
ObjectCalcer::parents
virtual std::vector< ObjectCalcer * > parents() const =0
Returns the parent ObjectCalcer's of this ObjectCalcer.
ID_segment
#define ID_segment
Definition: kgeo-resource.h:106
KigFilterKGeo::axes
bool axes
Definition: kgeo-filter.h:52
KigFilterKGeo::~KigFilterKGeo
~KigFilterKGeo()
Definition: kgeo-filter.cc:367
ID_perpendicular
#define ID_perpendicular
Definition: kgeo-resource.h:130
ObjectFactory
Definition: object_factory.h:23
uint
unsigned int uint
Definition: object_imp.h:87
ID_distance
#define ID_distance
Definition: kgeo-resource.h:121
ID_ray
#define ID_ray
Definition: kgeo-resource.h:128
KigFilterKGeo::load
KigDocument * load(const QString &from)
load file fromfile and build a KigDocument from it.
Definition: kgeo-filter.cc:56
KigFilterKGeo::yMax
int yMax
Definition: kgeo-filter.h:50
LineABType::instance
static const LineABType * instance()
Definition: line_type.cc:87
This file is part of the KDE documentation.
Documentation copyright © 1996-2014 The KDE developers.
Generated on Tue Oct 14 2014 22:35:39 by doxygen 1.8.7 written by Dimitri van Heesch, © 1997-2006

KDE's Doxygen guidelines are available online.

kig

Skip menu "kig"
  • Main Page
  • Namespace List
  • Namespace Members
  • Alphabetical List
  • Class List
  • Class Hierarchy
  • Class Members
  • File List
  • File Members

kdeedu API Reference

Skip menu "kdeedu API Reference"
  • Analitza
  •     lib
  • kalgebra
  • kalzium
  •   libscience
  • kanagram
  • kig
  •   lib
  • klettres
  • kstars
  • libkdeedu
  •   keduvocdocument
  • marble
  • parley
  • rocs
  •   App
  •   RocsCore
  •   VisualEditor
  •   stepcore

Search



Report problems with this website to our bug tracking system.
Contact the specific authors with questions and comments about the page contents.

KDE® and the K Desktop Environment® logo are registered trademarks of KDE e.V. | Legal