1 // utils.cpp: Stuff that's useful to have kicking around, in one spot
3 // Part of the Architektonas Project
4 // (C) 2015 Underground Software
5 // See the README and GPLv3 files for licensing and warranty information
7 // JLH = James Hammons <jlhamm@acm.org>
10 // --- ---------- ------------------------------------------------------------
11 // JLH 05/01/2015 Created this file
15 #include <string.h> // For memcpy()
19 // Copy objects in one vector to another, creating copies and placing them in
20 // the other vector. Clearing & etc. of vectors is responsibility of the caller!
22 void CopyObjects(std::vector<void *> & from, std::vector<void *> & to)
24 std::vector<void *>::iterator i;
26 for(i=from.begin(); i!=from.end(); i++)
28 Object * obj = (Object *)(*i);
29 Object * newObject = CopyObject(obj);
30 to.push_back(newObject);
36 // Create a copy of the passed in object.
38 Object * CopyObject(Object * obj)
40 Object * newObject = NULL;
45 newObject = (Object *)new Line();
46 memcpy(newObject, obj, sizeof(Line));
49 newObject = (Object *)new Circle();
50 memcpy(newObject, obj, sizeof(Circle));
53 newObject = (Object *)new Ellipse();
54 memcpy(newObject, obj, sizeof(Ellipse));
57 newObject = (Object *)new Arc();
58 memcpy(newObject, obj, sizeof(Arc));
61 newObject = (Object *)new Dimension();
62 memcpy(newObject, obj, sizeof(Dimension));
66 newObject = (Object *)new Spline();
67 memcpy(newObject, obj, sizeof(Spline));
71 newObject = (Object *)new Text();
72 memcpy(newObject, obj, sizeof(Text));
73 ((Text *)newObject)->s = ((Text *)obj)->s;
76 newObject = (Object *)new Container();
78 // memcpy(newObject, obj, sizeof(Line));
79 CopyObjects(((Container *)obj)->objects, ((Container *)newObject)->objects);
86 if (newObject && (newObject->type != OTContainer))
87 newObject->id = Global::objectID;
93 void MoveSelectedObjectsTo(std::vector<void *> & dest, std::vector<void *> & from)
95 std::vector<void *>::iterator i = from.begin();
97 while (i != from.end())
99 Object * obj = (Object *)(*i);
112 void AddObjectsTo(std::vector<void *> & dest, std::vector<void *> & from)
114 for(std::vector<void *>::iterator i=from.begin(); i!=from.end(); i++)
119 void ClearSelected(std::vector<void *> & v)
121 std::vector<void *>::iterator i;
123 for(i=v.begin(); i!=v.end(); i++)
124 ((Object *)(*i))->selected = false;
128 void SelectAll(std::vector<void *> & v)
130 std::vector<void *>::iterator i;
132 for(i=v.begin(); i!=v.end(); i++)
133 ((Object *)(*i))->selected = true;
138 // Recursively go down thru the Container's vectors, deleting all the objects
139 // contained therein. Once that is done, the main Container can be deleted. We
140 // don't have to worry about the underlying std::vectors, as they have their
141 // own destructors--plus they don't take ownership of objects, which is why we
142 // have to keep track of that stuff ourselves. :-P Believe it or not, this is a
143 // Good Thing(TM). ;-)
145 void DeleteContents(std::vector<void *> & v)
147 std::vector<void *>::iterator i;
149 for(i=v.begin(); i!=v.end(); i++)
151 Object * obj = (Object *)(*i);
153 if (obj->type == OTContainer)
154 DeleteContents(((Container *)obj)->objects);
160 void DeleteSelectedObjects(std::vector<void *> & v)
162 std::vector<void *>::iterator i = v.begin();
166 Object * obj = (Object *)(*i);
180 // This is used to remove selected objects from one container in order to move
181 // them to a different container.
183 void RemoveSelectedObjects(std::vector<void *> & v)
185 std::vector<void *>::iterator i = v.begin();
189 Object * obj = (Object *)(*i);
199 void SavePointsFrom(std::vector<void *> & v, std::vector<Object> & save)
204 for(std::vector<void *>::iterator i=v.begin(); i!=v.end(); i++)
206 memcpy(&o, (*i), sizeof(Object));
212 void RestorePointsTo(std::vector<void *> & v, std::vector<Object> & s)
214 std::vector<Object>::iterator i = s.begin();
215 std::vector<void *>::iterator j = v.begin();
217 for(; i!=s.end(); i++, j++)
219 Object * obj2 = (Object *)(*j);
220 obj2->p[0] = (*i).p[0];
221 obj2->p[1] = (*i).p[1];
222 obj2->angle[0] = (*i).angle[0];
223 obj2->angle[1] = (*i).angle[1];
224 //we don't do this because we want to keep selected & friends from changing
225 // memcpy(obj2, *j, sizeof(Object));
230 void TranslateObject(Object * obj, Point delta)
232 if (obj->type == OTContainer)
234 Container * c = (Container *)obj;
235 std::vector<void *>::iterator i;
237 for(i=c->objects.begin(); i!=c->objects.end(); i++)
238 TranslateObject((Object *)*i, delta);
248 void TranslateObjects(std::vector<void *> & v, Point delta)
251 if (obj->type == OTContainer)
253 Container * c = (Container *)obj;
254 std::vector<void *>::iterator i;
256 for(i=c->objects.begin(); i!=c->objects.end(); i++)
257 TranslateObject((Object *)*i, delta);
265 // Handle containters too???
266 std::vector<void *>::iterator i;
268 for(i=v.begin(); i!=v.end(); i++)
270 Object * obj = (Object *)(*i);