X-Git-Url: http://shamusworld.gotdns.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Futils.cpp;h=98902d7a80a439de0b39a6a0613e963dde30d1aa;hb=790c1a6d97f73f7457c7fad7e82fa29e5b6accd5;hp=2263d7d224c6d4d66d76d69144e288b2fbfece68;hpb=a6e76b6a748a350bda067a99672f9dcca626d872;p=architektonas diff --git a/src/utils.cpp b/src/utils.cpp index 2263d7d..98902d7 100644 --- a/src/utils.cpp +++ b/src/utils.cpp @@ -1,7 +1,7 @@ // utils.cpp: Stuff that's useful to have kicking around, in one spot // // Part of the Architektonas Project -// (C) 2015 Underground Software +// (C) 2020 Underground Software // See the README and GPLv3 files for licensing and warranty information // // JLH = James Hammons @@ -13,6 +13,7 @@ #include "utils.h" #include // For memcpy() +#include "geometry.h" // @@ -21,9 +22,7 @@ // void CopyObjects(std::vector & from, std::vector & to) { - std::vector::iterator i; - - for(i=from.begin(); i!=from.end(); i++) + for(std::vector::iterator i=from.begin(); i!=from.end(); i++) { Object * obj = (Object *)(*i); Object * newObject = CopyObject(obj); @@ -37,45 +36,47 @@ void CopyObjects(std::vector & from, std::vector & to) // Object * CopyObject(Object * obj) { - Object * newObject = NULL; + void * newObject = NULL; switch (obj->type) { case OTLine: - newObject = (Object *)new Line(); + newObject = new Line(); memcpy(newObject, obj, sizeof(Line)); break; case OTCircle: - newObject = (Object *)new Circle(); + newObject = new Circle(); memcpy(newObject, obj, sizeof(Circle)); break; case OTEllipse: - newObject = (Object *)new Ellipse(); + newObject = new Ellipse(); memcpy(newObject, obj, sizeof(Ellipse)); break; case OTArc: - newObject = (Object *)new Arc(); + newObject = new Arc(); memcpy(newObject, obj, sizeof(Arc)); break; case OTDimension: - newObject = (Object *)new Dimension(); + newObject = new Dimension(); memcpy(newObject, obj, sizeof(Dimension)); break; #if 0 case OTSpline: - newObject = (Object *)new Spline(); + newObject = new Spline(); memcpy(newObject, obj, sizeof(Spline)); break; #endif case OTText: - newObject = (Object *)new Text(); + newObject = new Text(); memcpy(newObject, obj, sizeof(Text)); ((Text *)newObject)->s = ((Text *)obj)->s; break; case OTContainer: - newObject = (Object *)new Container(); + newObject = new Container(); //this won't work... // memcpy(newObject, obj, sizeof(Line)); + ((Container *)newObject)->p[0] = obj->p[0]; + ((Container *)newObject)->p[1] = obj->p[1]; CopyObjects(((Container *)obj)->objects, ((Container *)newObject)->objects); break; default: @@ -83,10 +84,10 @@ Object * CopyObject(Object * obj) } // Fix objectID - if (newObject && (newObject->type != OTContainer)) - newObject->id = Global::objectID; + if (newObject && (((Object *)newObject)->type != OTContainer)) + ((Object *)newObject)->id = Global::objectID++; - return newObject; + return (Object *)newObject; } @@ -109,6 +110,23 @@ void MoveSelectedObjectsTo(std::vector & dest, std::vector & fro } +//hmm, this won't work, as these are just pointers... +//[should work now] +void CopySelectedObjectsTo(std::vector & dest, std::vector & from) +{ + for(std::vector::iterator i=from.begin(); i!=from.end(); i++) + { + Object * obj = (Object *)(*i); + + if (obj->selected) +// { +// Object * newObject = CopyObject(obj); + dest.push_back(CopyObject(obj)); +// } + } +} + + void AddObjectsTo(std::vector & dest, std::vector & from) { for(std::vector::iterator i=from.begin(); i!=from.end(); i++) @@ -136,11 +154,11 @@ void SelectAll(std::vector & v) // // Recursively go down thru the Container's vectors, deleting all the objects -// contained therein. Once that is done, the main Container can be deleted. We -// don't have to worry about the underlying std::vectors, as they have their +// contained therein. Once that is done, the main Container can be deleted. +// We don't have to worry about the underlying std::vectors, as they have their // own destructors--plus they don't take ownership of objects, which is why we -// have to keep track of that stuff ourselves. :-P Believe it or not, this is a -// Good Thing(TM). ;-) +// have to keep track of that stuff ourselves. :-P Believe it or not, this is +// a Good Thing(TM). ;-) // void DeleteContents(std::vector & v) { @@ -155,8 +173,11 @@ void DeleteContents(std::vector & v) delete obj; } + + v.clear(); } + void DeleteSelectedObjects(std::vector & v) { std::vector::iterator i = v.begin(); @@ -203,7 +224,7 @@ void SavePointsFrom(std::vector & v, std::vector & save) for(std::vector::iterator i=v.begin(); i!=v.end(); i++) { - memcpy(&o, (*i), sizeof(Object)); + memcpy(&o, (Object *)(*i), sizeof(Object)); save.push_back(o); } } @@ -227,6 +248,32 @@ void RestorePointsTo(std::vector & v, std::vector & s) } +void RestorePointsTo(std::vector & v, std::vector & s) +{ + std::vector::iterator i = s.begin(); + std::vector::iterator j = v.begin(); + + for(; i!=s.end(); i++, j++) + { + Object * objS = (Object *)(*i); + Object * objV = (Object *)(*j); + + if (objV->type == OTContainer) + { + RestorePointsTo(((Container *)objV)->objects, ((Container *)objS)->objects); + return; + } + + objV->p[0] = objS->p[0]; + objV->p[1] = objS->p[1]; + objV->angle[0] = objS->angle[0]; + objV->angle[1] = objS->angle[1]; +//we don't do this because we want to keep selected & friends from changing +// memcpy(obj2, *j, sizeof(Object)); + } +} + + void TranslateObject(Object * obj, Point delta) { if (obj->type == OTContainer) @@ -237,11 +284,61 @@ void TranslateObject(Object * obj, Point delta) for(i=c->objects.begin(); i!=c->objects.end(); i++) TranslateObject((Object *)*i, delta); } - else - { +// else +// { obj->p[0] += delta; obj->p[1] += delta; +// } +} + + +/* +So we need to make it so that we pick the container's point clicked on, and translate all the other parts *not* clicked on. +*/ +void TranslateContainer(Container * c, Point point, Point delta) +{ + if (c->clicked == NULL) + { +// TranslateObject((Object *)c, delta); + return; } + +static int i=0; +printf("TranslateContainer: boop (%i)\n", i++); + Point clickedPoint; + + switch (c->clicked->type) + { + case OTLine: + if (c->clicked->hitPoint[0]) + clickedPoint = c->clicked->p[0]; + else if (c->clicked->hitPoint[1]) + clickedPoint = c->clicked->p[1]; + else if (c->clicked->hitObject) + clickedPoint = Geometry::Midpoint((Line *)(c->clicked)); + + break; + + case OTCircle: + if (c->clicked->hitPoint[0]) + clickedPoint = c->clicked->p[0]; + else if (c->clicked->hitObject) + clickedPoint = point; + + break; + + case OTArc: + break; + + case OTDimension: + break; + + case OTText: + break; + } + + Point clickedDelta = point - clickedPoint; + TranslateObject((Object *)c, clickedDelta); } @@ -274,3 +371,24 @@ void TranslateObjects(std::vector & v, Point delta) } +std::vector Flatten(Container * src) +{ + std::vector flat; + std::vector::iterator i; + + for(i=src->objects.begin(); i!=src->objects.end(); i++) + { + flat.push_back(*i); + Object * obj = (Object *)(*i); + + // Recursively add objects to the flat vector, if necessary + if (obj->type == OTContainer) + { + std::vector sub = Flatten((Container *)obj); + flat.insert(flat.end(), sub.begin(), sub.end()); + } + } + + return flat; +} +