+//
+// Create a copy of the passed in object. This version calls the second
+// version of CopyObjects() (with one parameter and a vector return value).
+//
+Object * CopyObject2(Object * obj)
+{
+ void * newObject = NULL;
+
+ switch (obj->type)
+ {
+ case OTLine:
+ newObject = new Line();
+ memcpy(newObject, obj, sizeof(Line));
+ break;
+
+ case OTCircle:
+ newObject = new Circle();
+ memcpy(newObject, obj, sizeof(Circle));
+ break;
+
+ case OTEllipse:
+ newObject = new Ellipse();
+ memcpy(newObject, obj, sizeof(Ellipse));
+ break;
+
+ case OTArc:
+ newObject = new Arc();
+ memcpy(newObject, obj, sizeof(Arc));
+ break;
+
+ case OTDimension:
+ newObject = new Dimension();
+ memcpy(newObject, obj, sizeof(Dimension));
+ break;
+
+ case OTSpline:
+ newObject = new Spline();
+ memcpy(newObject, obj, sizeof(Spline));
+ break;
+
+ case OTText:
+ newObject = new Text();
+ memcpy(newObject, obj, sizeof(Text));
+ ((Text *)newObject)->s = ((Text *)obj)->s;
+ break;
+
+ case OTContainer:
+ newObject = new Container();
+ ((Container *)newObject)->p[0] = obj->p[0];
+ ((Container *)newObject)->p[1] = obj->p[1];
+ ((Container *)newObject)->layer = obj->layer;
+ ((Container *)newObject)->objects = CopyObjects(((Container *)obj)->objects);
+ break;
+ }
+
+ // Fix objectID
+ if (newObject && (((Object *)newObject)->type != OTContainer))
+ ((Object *)newObject)->id = Global::objectID++;
+
+ return (Object *)newObject;
+}
+
+
+void MoveSelectedObjectsTo(VPVector & dest, VPVector & from)