public int Compare(object x, object y) { // Typ-Casting IGeoObject o1 = (IGeoObject)x; IGeoObject o2 = (IGeoObject)y; // Sortierung nach Mittelpunkten BoundingRect re = IGeoObjectImpl.GetExtent(o1, projection, false); GeoPoint2D p1 = re.GetCenter(); re = IGeoObjectImpl.GetExtent(o2, projection, false); GeoPoint2D p2 = re.GetCenter(); if (dirx) { if (p1.x < p2.x) { return(-1); } if (p1.x > p2.x) { return(1); } } else { if (p1.y < p2.y) { return(-1); } if (p1.y > p2.y) { return(1); } } return(0); }
static public void SpaceDown(GeoObjectList gl, Projection projection, Project pr) { using (pr.Undo.UndoFrame) { IGeoObject[] geoArray = new IGeoObject[gl.Count]; for (int i = 0; i < gl.Count; ++i) // umkopieren auf ein Array, um den Sort machen zu können { geoArray[i] = gl[i]; } // hier nun Sort, der Compare steht oben als lokal class und braucht die Parameter: Sort nach y = false und pm Array.Sort(geoArray, 0, geoArray.Length, new CompareGeoObject(false, projection)); // die Rechtecke des ersten und letzten Objeks für die Gesamtausdehnung BoundingRect reStart = IGeoObjectImpl.GetExtent(geoArray[0], projection, false); BoundingRect reEnd = IGeoObjectImpl.GetExtent(geoArray[geoArray.Length - 1], projection, false); double reTotal = reEnd.Top - reStart.Bottom; // Gesamtausdehnung double distRe = 0; for (int i = 0; i < geoArray.Length; ++i) // Summe der Ausdehnung der Einzelnen: { BoundingRect re = IGeoObjectImpl.GetExtent(geoArray[i], projection, false); distRe = distRe + re.Height; } double space = (reTotal - distRe) / (geoArray.Length - 1); // Gesamt - Summe Einzelne / Zwischenräume double pos = reStart.Top; for (int i = 1; i < geoArray.Length - 1; ++i) // vom zweiten bis zum vorletzten, die Äußeren bleiben unverändert { BoundingRect re = IGeoObjectImpl.GetExtent(geoArray[i], projection, false); GeoVector2D trans2D = new GeoVector2D(0, pos + space - re.Bottom); pos = pos + space + re.Height; // pos hochzählen auf den oberen Rand des aktuellen GeoVector trans = projection.DrawingPlane.ToGlobal(trans2D); ModOp m = ModOp.Translate(trans); geoArray[i].Modify(m); } } }
static public void AlignCenter(GeoObjectList gl, Projection projection, Project pr) { // nur zum Nullpunkt zentieren using (pr.Undo.UndoFrame) { for (int i = 0; i < gl.Count; ++i) { BoundingRect re = IGeoObjectImpl.GetExtent(gl[i], projection, false); GeoVector2D trans2D = new GeoVector2D(-(re.Left + re.Right) / 2, -(re.Bottom + re.Top) / 2); GeoVector trans = projection.DrawingPlane.ToGlobal(trans2D); ModOp m = ModOp.Translate(trans); gl[i].Modify(m); } } }
static public void AlignLeft(GeoObjectList gl, Projection projection, Project pr) { using (pr.Undo.UndoFrame) { BoundingRect re1 = IGeoObjectImpl.GetExtent(gl[gl.Count - 1], projection, false); for (int i = 0; i < gl.Count - 1; ++i) { BoundingRect re = IGeoObjectImpl.GetExtent(gl[i], projection, false); GeoVector2D trans2D = new GeoVector2D(re1.Left - re.Left, 0); GeoVector trans = projection.DrawingPlane.ToGlobal(trans2D); ModOp m = ModOp.Translate(trans); gl[i].Modify(m); } } }
static public void SameHeight(GeoObjectList gl, Projection projection, Project pr) { using (pr.Undo.UndoFrame) { BoundingRect re1 = IGeoObjectImpl.GetExtent(gl[gl.Count - 1], projection, false); for (int i = 0; i < gl.Count - 1; ++i) { BoundingRect re = IGeoObjectImpl.GetExtent(gl[i], projection, false); double hig = 1; if (re.Height != 0) { hig = re1.Height / re.Height; } GeoPoint refPkt = projection.DrawingPlane.ToGlobal(re.GetCenter()); ModOp m = ModOp.Scale(refPkt, new GeoVector(0.0, 1.0, 0.0), hig); gl[i].Modify(m); } } }
static public void AlignHcenter(GeoObjectList gl, Projection projection, Project pr) { using (pr.Undo.UndoFrame) { BoundingRect re1 = IGeoObjectImpl.GetExtent(gl[gl.Count - 1], projection, false); double center1 = (re1.Left + re1.Right) / 2; if (gl.Count == 1) { center1 = 0.0; // um den Ursprung, wenns nur eines ist } for (int i = 0; i < Math.Max(1, gl.Count - 1); ++i) { BoundingRect re = IGeoObjectImpl.GetExtent(gl[i], projection, false); GeoVector2D trans2D = new GeoVector2D(center1 - (re.Left + re.Right) / 2, 0); GeoVector trans = projection.DrawingPlane.ToGlobal(trans2D); ModOp m = ModOp.Translate(trans); gl[i].Modify(m); } } }