override protected void Update() { PixelColor stitchcolor = General.Colors.Highlight; PixelColor losecolor = General.Colors.Selection; // We WANT snaptogrid and DON'T WANT snaptonearest when lock to grid is enabled snaptocardinaldirection = General.Interface.ShiftState && General.Interface.AltState; //mxd snaptogrid = (snaptocardinaldirection || gridlockmode != GridLockMode.NONE || (General.Interface.ShiftState ^ General.Interface.SnapToGrid)); snaptonearest = (gridlockmode == GridLockMode.NONE && (General.Interface.CtrlState ^ General.Interface.AutoMerge)); DrawnVertex curp = GetCurrentPosition(); Vector2D curvertexpos = curp.pos; float vsize = (renderer.VertexSize + 1.0f) / renderer.Scale; curp.pos = curp.pos.GetRotated(-General.Map.Grid.GridRotate); // Render drawing lines if (renderer.StartOverlay(true)) { PixelColor color = snaptonearest ? stitchcolor : losecolor; if (points.Count == 1) { UpdateReferencePoints(points[0], curp); List <Vector2D[]> shapes = GetShapes(start, end); Vector2D startrotated = start.GetRotated(General.Map.Grid.GridRotate); Vector2D endrotated = end.GetRotated(General.Map.Grid.GridRotate); // Rotate the shape to fit the grid rotation foreach (Vector2D[] shape in shapes) { for (int i = 0; i < shape.Length; i++) { shape[i] = shape[i].GetRotated(General.Map.Grid.GridRotate); } } // Render guidelines if (showguidelines) { RenderGuidelines(startrotated, endrotated, General.Colors.Guideline.WithAlpha(80), -General.Map.Grid.GridRotate); } //render shape foreach (Vector2D[] shape in shapes) { for (int i = 1; i < shape.Length; i++) { renderer.RenderLine(shape[i - 1], shape[i], LINE_THICKNESS, color, true); } } //vertices foreach (Vector2D[] shape in shapes) { for (int i = 0; i < shape.Length; i++) { renderer.RenderRectangleFilled(new RectangleF((float)(shape[i].x - vsize), (float)(shape[i].y - vsize), vsize * 2.0f, vsize * 2.0f), color, true); } } //and labels if (width == 0 || height == 0) { // Render label for line labels[0].Move(startrotated, endrotated); renderer.RenderText(labels[0].TextLabel); } else { // Render labels for grid Vector2D[] labelCoords = { startrotated, new Vector2D(end.x, start.y).GetRotated(General.Map.Grid.GridRotate), endrotated, new Vector2D(start.x, end.y).GetRotated(General.Map.Grid.GridRotate), startrotated }; for (int i = 1; i < 5; i++) { labels[i - 1].Move(labelCoords[i], labelCoords[i - 1]); renderer.RenderText(labels[i - 1].TextLabel); } } //render hint if (horizontalslices > 1 || verticalslices > 1) { string text = "H: " + (slicesH - 1) + "; V: " + (slicesV - 1); if (Math.Abs(width) > text.Length * vsize && Math.Abs(height) > 16 * vsize) { hintlabel.Text = text; hintlabel.Move(startrotated, endrotated); renderer.RenderText(hintlabel.TextLabel); } } } else { // Render vertex at cursor renderer.RenderRectangleFilled(new RectangleF((float)(curvertexpos.x - vsize), (float)(curvertexpos.y - vsize), vsize * 2.0f, vsize * 2.0f), color, true); } // Done renderer.Finish(); } // Done renderer.Present(); }
override protected void Update() { PixelColor stitchcolor = General.Colors.Highlight; PixelColor losecolor = General.Colors.Selection; snaptocardinaldirection = General.Interface.ShiftState && General.Interface.AltState; //mxd snaptogrid = (snaptocardinaldirection || General.Interface.ShiftState ^ General.Interface.SnapToGrid); snaptonearest = General.Interface.CtrlState ^ General.Interface.AutoMerge; DrawnVertex curp = GetCurrentPosition(); float vsize = (renderer.VertexSize + 1.0f) / renderer.Scale; // Render drawing lines if (renderer.StartOverlay(true)) { PixelColor color = snaptonearest ? stitchcolor : losecolor; if (points.Count == 1) { UpdateReferencePoints(points[0], curp); Vector2D[] shape = GetShape(start, end); //render shape for (int i = 1; i < shape.Length; i++) { renderer.RenderLine(shape[i - 1], shape[i], LINE_THICKNESS, color, true); } //vertices for (int i = 0; i < shape.Length; i++) { renderer.RenderRectangleFilled(new RectangleF(shape[i].x - vsize, shape[i].y - vsize, vsize * 2.0f, vsize * 2.0f), color, true); } //and labels Vector2D[] labelCoords = new[] { start, new Vector2D(end.x, start.y), end, new Vector2D(start.x, end.y), start }; for (int i = 1; i < 5; i++) { labels[i - 1].Move(labelCoords[i], labelCoords[i - 1]); renderer.RenderText(labels[i - 1].TextLabel); } //got beveled corners? if (alwaysrendershapehints || shape.Length > minpointscount + 1) { //render hint if (width > 64 * vsize && height > 16 * vsize) { hintlabel.Move(start, end); hintlabel.Text = GetHintText(); renderer.RenderText(hintlabel.TextLabel); } //and shape corners for (int i = 0; i < 4; i++) { renderer.RenderRectangleFilled(new RectangleF(labelCoords[i].x - vsize, labelCoords[i].y - vsize, vsize * 2.0f, vsize * 2.0f), General.Colors.InfoLine, true); } } } else { // Render vertex at cursor renderer.RenderRectangleFilled(new RectangleF(curp.pos.x - vsize, curp.pos.y - vsize, vsize * 2.0f, vsize * 2.0f), color, true); } // Done renderer.Finish(); } // Done renderer.Present(); }
override protected void Update() { if (blockupdate) { return; } PixelColor stitchcolor = General.Colors.Highlight; PixelColor losecolor = General.Colors.Selection; snaptocardinaldirection = General.Interface.ShiftState && General.Interface.AltState; //mxd snaptogrid = (snaptocardinaldirection || General.Interface.ShiftState ^ General.Interface.SnapToGrid); snaptonearest = General.Interface.CtrlState ^ General.Interface.AutoMerge; DrawnVertex curp = GetCurrentPosition(); Vector2D curvertexpos = curp.pos; float vsize = (renderer.VertexSize + 1.0f) / renderer.Scale; curp.pos = curp.pos.GetRotated(-General.Map.Grid.GridRotate); // Render drawing lines if (renderer.StartOverlay(true)) { PixelColor color = snaptonearest ? stitchcolor : losecolor; if (points.Count == 1) { UpdateReferencePoints(points[0], curp); Vector2D[] shape = GetShape(start, end); Vector2D startrotated = start.GetRotated(General.Map.Grid.GridRotate); Vector2D endrotated = end.GetRotated(General.Map.Grid.GridRotate); // Rotate the shape to fit the grid rotation for (int i = 0; i < shape.Length; i++) { shape[i] = shape[i].GetRotated(General.Map.Grid.GridRotate); } // Render guidelines if (showguidelines) { RenderGuidelines(startrotated, endrotated, General.Colors.Guideline.WithAlpha(80), -General.Map.Grid.GridRotate); } //render shape for (int i = 1; i < shape.Length; i++) { renderer.RenderLine(shape[i - 1], shape[i], LINE_THICKNESS, color, true); } //vertices for (int i = 0; i < shape.Length; i++) { renderer.RenderRectangleFilled(new RectangleF((float)(shape[i].x - vsize), (float)(shape[i].y - vsize), vsize * 2.0f, vsize * 2.0f), color, true); } //and labels if (shape.Length == 2) { // Render label for line labels[0].Move(startrotated, endrotated); renderer.RenderText(labels[0].TextLabel); } else if (shape.Length > 3) { // Render labels for rectangle Vector2D[] labelCoords = { startrotated, new Vector2D(end.x, start.y).GetRotated(General.Map.Grid.GridRotate), endrotated, new Vector2D(start.x, end.y).GetRotated(General.Map.Grid.GridRotate), startrotated }; for (int i = 1; i < 5; i++) { labels[i - 1].Move(labelCoords[i], labelCoords[i - 1]); renderer.RenderText(labels[i - 1].TextLabel); } //got beveled corners? if (alwaysrendershapehints || shape.Length > minpointscount + 1) { //render hint if (width > 64 * vsize && height > 16 * vsize) { hintlabel.Move(startrotated, endrotated); hintlabel.Text = GetHintText(); renderer.RenderText(hintlabel.TextLabel); } //and shape corners for (int i = 0; i < 4; i++) { renderer.RenderRectangleFilled(new RectangleF((float)(labelCoords[i].x - vsize), (float)(labelCoords[i].y - vsize), vsize * 2.0f, vsize * 2.0f), General.Colors.InfoLine, true); } } } else { // Render vertex at points[0] renderer.RenderRectangleFilled(new RectangleF((float)(start.x - vsize), (float)(start.y - vsize), vsize * 2.0f, vsize * 2.0f), General.Colors.InfoLine, true); } } else { // Render vertex at cursor renderer.RenderRectangleFilled(new RectangleF((float)(curvertexpos.x - vsize), (float)(curvertexpos.y - vsize), vsize * 2.0f, vsize * 2.0f), color, true); } // Done renderer.Finish(); } // Done renderer.Present(); }
//mxd public override void OnMouseMove(MouseEventArgs e) { base.OnMouseMove(e); // Anything to do? if ((!selectpressed && !editpressed) || closestline == null) { hintlabel.Text = string.Empty; return; } // Do something... Vector2D perpendicular = closestline.Line.GetPerpendicular().GetNormal(); if (panel.Distance != 0) { perpendicular *= panel.Distance; // Special cases... } Vector2D center = closestline.GetCenterPoint(); Line2D radius = new Line2D(center, center - perpendicular); float u = radius.GetNearestOnLine(mousemappos - mousedownoffset); int dist = (panel.Distance == 0 ? 1 : panel.Distance); // Special cases... int offset = (int)Math.Round(dist * u - dist); bool updaterequired = false; // Clamp values? bool clampvalue = !General.Interface.ShiftState; // Change verts amount if (selectpressed && editpressed) { if (prevoffset != 0) { // Set new verts count without triggering the update... panel.SetValues(panel.Vertices + Math.Sign(prevoffset - offset), panel.Distance, panel.Angle, panel.FixedCurve); // Update hint text hintlabel.Text = "Vertices: " + panel.Vertices; updaterequired = true; } } // Change distance else if (selectpressed && !panel.FixedCurve) { if (float.IsNaN(u)) { // Set new distance without triggering the update... panel.SetValues(panel.Vertices, 0, panel.Angle, panel.FixedCurve); // Special cases... } else { int newoffset; if (clampvalue) { newoffset = (panel.Distance + offset) / panel.DistanceIncrement * panel.DistanceIncrement; // Clamp to 8 mu increments } else { newoffset = panel.Distance + offset; } // Set new distance without triggering the update... panel.SetValues(panel.Vertices, newoffset, panel.Angle, panel.FixedCurve); } // Update hint text hintlabel.Text = "Distance: " + panel.Distance; updaterequired = true; } // Change angle else if (editpressed && prevoffset != 0) { int newangle = 0; if (panel.FixedCurve) { // Flip required? if (panel.Angle == 0 && (Math.Sign(offset - prevoffset) != Math.Sign(panel.Distance))) { // Set new distance without triggering the update... panel.SetValues(panel.Vertices, -panel.Distance, panel.Angle, panel.FixedCurve); // Recalculate affected values... perpendicular *= -1; radius.v2 = center - perpendicular; u = radius.GetNearestOnLine(mousemappos - mousedownoffset); } //TODO: there surely is a way to get new angle without iteration... float targetoffset = radius.GetLength() * u; float prevdiff = float.MaxValue; int increment = (clampvalue ? panel.AngleIncrement : 1); for (int i = 1; i < panel.MaximumAngle; i += increment) { // Calculate diameter for current angle... float ma = Angle2D.DegToRad(i); float d = (closestline.Length / (float)Math.Tan(ma / 2f)) / 2; float D = d / (float)Math.Cos(ma / 2f); float h = D - d; float curdiff = Math.Abs(h - targetoffset); // This one matches better... if (curdiff < prevdiff) { newangle = i; } prevdiff = curdiff; } // Clamp to 5 deg increments if (clampvalue) { newangle = (newangle / panel.AngleIncrement) * panel.AngleIncrement; } } else { int diff = (int)Math.Round((offset - prevoffset) * renderer.Scale); if (panel.Angle + diff > 0) { if (clampvalue) { newangle = (panel.Angle / panel.AngleIncrement + Math.Sign(diff)) * panel.AngleIncrement; // Clamp to 5 deg increments } else { newangle = panel.Angle + diff; } } } // Set new angle without triggering the update... panel.SetValues(panel.Vertices, panel.Distance, newangle, panel.FixedCurve); // Update hint text hintlabel.Text = "Angle: " + panel.Angle; updaterequired = true; } // Update UI if (updaterequired) { // Update label position float labeldistance; if (panel.Angle == 0) { labeldistance = 0; // Special cases! } else if (panel.FixedCurve) { float ma = Angle2D.DegToRad(panel.Angle); float d = (closestline.Length / (float)Math.Tan(ma / 2f)) / 2; float D = d / (float)Math.Cos(ma / 2f); labeldistance = D - d; } else { labeldistance = Math.Abs(panel.Distance); } labeldistance += 16 / renderer.Scale; Vector2D labelpos = radius.GetCoordinatesAt(labeldistance / radius.GetLength()); hintlabel.Move(labelpos, labelpos); // Trigger update OnValuesChanged(null, EventArgs.Empty); } // Store current offset prevoffset = offset; }
protected override void Update() { PixelColor stitchcolor = General.Colors.Highlight; PixelColor losecolor = General.Colors.Selection; snaptocardinaldirection = General.Interface.ShiftState && General.Interface.AltState; snaptogrid = snaptocardinaldirection || General.Interface.ShiftState ^ General.Interface.SnapToGrid; snaptonearest = General.Interface.CtrlState ^ General.Interface.AutoMerge; DrawnVertex curp = GetCurrentPosition(); float vsize = (renderer.VertexSize + 1.0f) / renderer.Scale; // Update label positions (mxd) if (labels.Count > 0) { // Update labels for already drawn lines for (int i = 0; i < labels.Count - 1; i++) { labels[i].Move(points[i].pos, points[i + 1].pos); } // Update label for active line labels[labels.Count - 1].Move(points[points.Count - 1].pos, curp.pos); } // Render drawing lines if (renderer.StartOverlay(true)) { // Go for all points to draw lines if (points.Count > 0) { //update curve List <Vector2D> verts = new List <Vector2D>(); for (int i = 0; i < points.Count; i++) { verts.Add(points[i].pos); } if (curp.pos != verts[verts.Count - 1]) { verts.Add(curp.pos); } curve = CurveTools.CurveThroughPoints(verts, 0.5f, 0.75f, segmentlength); // Render lines for (int i = 1; i < curve.Shape.Count; i++) { // Determine line color PixelColor c = snaptonearest ? stitchcolor : losecolor; // Render line renderer.RenderLine(curve.Shape[i - 1], curve.Shape[i], LINE_THICKNESS, c, true); } //render "inactive" vertices for (int i = 1; i < curve.Shape.Count - 1; i++) { // Determine vertex color PixelColor c = !snaptonearest ? stitchcolor : losecolor; // Render vertex renderer.RenderRectangleFilled(new RectangleF(curve.Shape[i].x - vsize, curve.Shape[i].y - vsize, vsize * 2.0f, vsize * 2.0f), c, true); } } if (points.Count > 0) { // Render vertices for (int i = 0; i < points.Count; i++) { // Determine vertex color PixelColor c = points[i].stitch ? stitchcolor : losecolor; // Render vertex renderer.RenderRectangleFilled(new RectangleF(points[i].pos.x - vsize, points[i].pos.y - vsize, vsize * 2.0f, vsize * 2.0f), c, true); } } // Determine point color PixelColor color = snaptonearest ? stitchcolor : losecolor; // Render vertex at cursor renderer.RenderRectangleFilled(new RectangleF(curp.pos.x - vsize, curp.pos.y - vsize, vsize * 2.0f, vsize * 2.0f), color, true); // Render labels renderer.RenderText(labels.ToArray()); //Render info label Vector2D start = new Vector2D(mousemappos.x + (32 / renderer.Scale), mousemappos.y - (16 / renderer.Scale)); Vector2D end = new Vector2D(mousemappos.x + (96 / renderer.Scale), mousemappos.y); hintlabel.Move(start, end); hintlabel.Text = "SEG LEN: " + segmentlength; renderer.RenderText(hintlabel.TextLabel); // Done renderer.Finish(); } // Done renderer.Present(); }
override protected void Update() { PixelColor stitchcolor = General.Colors.Highlight; PixelColor losecolor = General.Colors.Selection; // We WANT snaptogrid and DON'T WANT snaptonearest when lock to grid is enabled snaptocardinaldirection = General.Interface.ShiftState && General.Interface.AltState; //mxd snaptogrid = (snaptocardinaldirection || gridlockmode != GridLockMode.NONE || (General.Interface.ShiftState ^ General.Interface.SnapToGrid)); snaptonearest = (gridlockmode == GridLockMode.NONE && (General.Interface.CtrlState ^ General.Interface.AutoMerge)); DrawnVertex curp; if (points.Count == 1) { // Handle the case when start point is not on current grid. Vector2D gridoffset = General.Map.Grid.SnappedToGrid(points[0].pos) - points[0].pos; curp = GetCurrentPosition(mousemappos + gridoffset, snaptonearest, snaptogrid, snaptocardinaldirection, usefourcardinaldirections, renderer, points); curp.pos -= gridoffset; } else { curp = GetCurrentPosition(); } float vsize = (renderer.VertexSize + 1.0f) / renderer.Scale; // Render drawing lines if (renderer.StartOverlay(true)) { PixelColor color = snaptonearest ? stitchcolor : losecolor; if (points.Count == 1) { UpdateReferencePoints(points[0], curp); List <Vector2D[]> shapes = GetShapes(start, end); //render shape foreach (Vector2D[] shape in shapes) { for (int i = 1; i < shape.Length; i++) { renderer.RenderLine(shape[i - 1], shape[i], LINE_THICKNESS, color, true); } } //vertices foreach (Vector2D[] shape in shapes) { for (int i = 0; i < shape.Length; i++) { renderer.RenderRectangleFilled(new RectangleF(shape[i].x - vsize, shape[i].y - vsize, vsize * 2.0f, vsize * 2.0f), color, true); } } //and labels Vector2D[] labelCoords = new[] { start, new Vector2D(end.x, start.y), end, new Vector2D(start.x, end.y), start }; for (int i = 1; i < 5; i++) { labels[i - 1].Move(labelCoords[i], labelCoords[i - 1]); renderer.RenderText(labels[i - 1].TextLabel); } //render hint if (horizontalslices > 1 || verticalslices > 1) { string text = "H: " + (slicesH - 1) + "; V: " + (slicesV - 1); if (width > text.Length * vsize && height > 16 * vsize) { hintlabel.Text = text; hintlabel.Move(start, end); renderer.RenderText(hintlabel.TextLabel); } } } else { // Render vertex at cursor renderer.RenderRectangleFilled(new RectangleF(curp.pos.x - vsize, curp.pos.y - vsize, vsize * 2.0f, vsize * 2.0f), color, true); } // Done renderer.Finish(); } // Done renderer.Present(); }