private void RealPaintingPanel_Paint(object sender, PaintEventArgs e) { //https://stackoverflow.com/questions/1485745/flip-coordinates-when-drawing-to-control // Call the OnPaint method of the base class. base.OnPaint(e); // Begin graphics container System.Drawing.Drawing2D.GraphicsContainer containerState = e.Graphics.BeginContainer(); double offset2X = 0.0; double offset2Y = 0.0; // Flip the Y-Axis e.Graphics.ScaleTransform(1.0F, -1.0F); e.Graphics.TranslateTransform(0.0F, -(float)Height + 1.0f); e.Graphics.Clear(Color.White); //let's have all entries shown on field, no matter how far or close are they located double deltaDrawingOffsetX = (0 - structToRender.GetBoundingBox().XLowerLeft) * internalScaleFactor; double deltaDrawingOffsetY = (0 - structToRender.GetBoundingBox().YLowerLeft) * internalScaleFactor; // do not cling pixel-to-pixel to lower bottom double deltaTinyOffsetW = Math.Abs(1 - prescaleKoefficient) / 2.0 * this.Width; double deltaTinyOffsetH = Math.Abs(1 - prescaleKoefficient) / 2.0 * this.Height; //render all using (System.Drawing.Pen myPen = new System.Drawing.Pen(Color.Black)) { int totalNumber = structToRender.getSize(); for (int i = 0; i < totalNumber; i++) { DXFdrawingEntry tmpEntryFromList = structToRender.getItemByIndex(i); if (tmpEntryFromList is MyDxfLine) { e.Graphics.DrawLine(myPen, (float)((tmpEntryFromList as MyDxfLine).XStart * internalScaleFactor + deltaDrawingOffsetX + deltaTinyOffsetW), (float)((tmpEntryFromList as MyDxfLine).YStart * internalScaleFactor + deltaDrawingOffsetY + deltaTinyOffsetH), (float)((tmpEntryFromList as MyDxfLine).XEnd * internalScaleFactor + deltaDrawingOffsetX + deltaTinyOffsetW), (float)((tmpEntryFromList as MyDxfLine).YEnd * internalScaleFactor + deltaDrawingOffsetY + deltaTinyOffsetH)); } else if (tmpEntryFromList is MyDxfArc) { //width and height (3 and 4 parametrs) should be scaled and not translated e.Graphics.DrawArc(myPen, (float)((tmpEntryFromList as MyDxfArc).drawUpperLeftX * internalScaleFactor + deltaDrawingOffsetX + deltaTinyOffsetW), (float)((tmpEntryFromList as MyDxfArc).drawUpperLeftY * internalScaleFactor + deltaDrawingOffsetY + deltaTinyOffsetH), (float)((tmpEntryFromList as MyDxfArc).drawDimensionHorizontal * internalScaleFactor), (float)((tmpEntryFromList as MyDxfArc).drawDimensionVertical * internalScaleFactor), (float)((tmpEntryFromList as MyDxfArc).drawStartAngleDegreeCW), (float)((tmpEntryFromList as MyDxfArc).drawSweepAngleDegree)); } } } e.Graphics.EndContainer(containerState); }
/// <summary> /// Setup only INITIAL logical and graphical datastructures. /// </summary> /// <param name="in_savedStructureOfDxf">Logical structure of DXF as read from file</param> public void setupLogicalAndGraphicalDXFstructures(LOGICAL.completeDxfStruct in_savedStructureOfDxf) { savedStructureOfDxf = in_savedStructureOfDxf; //generate primal drawing structure MyDxfBoundingBox obtainedBox2 = savedStructureOfDxf.GetBoundingBox(); if (obtainedBox2.XLowerLeft != 0) { offsetOfDxfHorizontal = 0 - obtainedBox2.XLowerLeft; } if (obtainedBox2.YLowerLeft != 0) { offsetOfDxfVertical = 0 - obtainedBox2.YLowerLeft; } primalDrawingStructure = new CompleteDxfDrawingStruct(null); int currentSizeOfDxfStruct = savedStructureOfDxf.getSize(); for (int i = 0; i < currentSizeOfDxfStruct; i++) { DXFdrawingEntry someEntry = savedStructureOfDxf.getItemByIndex(i); MyDxfBoundingBox obtainedBox = someEntry.GetBoundingBox(); //offsets to centralize the drawing in the box Pen usedPen = null; if ((collectionOfLayerDefinitions != null) && (collectionOfLayerDefinitions.ContainsKey(someEntry.layerIdentifier))) { usedPen = collectionOfLayerDefinitions[someEntry.layerIdentifier].Item2; } else { usedPen = new Pen(Color.Black); } if (someEntry is MyDxfLine) { MyDxfLine castLine = someEntry as MyDxfLine; DXFentryForDisplay theLineForDisplay = new MyDxfLineForDisplay(castLine.XStart + offsetOfDxfHorizontal, castLine.YStart + offsetOfDxfVertical, castLine.XEnd + offsetOfDxfHorizontal, castLine.YEnd + offsetOfDxfVertical, usedPen); primalDrawingStructure.addSingleEntry(theLineForDisplay, obtainedBox.XLowerLeft + offsetOfDxfHorizontal, obtainedBox.YLowerLeft + offsetOfDxfVertical, obtainedBox.XUpperRight + offsetOfDxfHorizontal, obtainedBox.YUpperRight + offsetOfDxfVertical); } else if (someEntry is MyDxfArc) { MyDxfArc castArc = someEntry as MyDxfArc; DXFentryForDisplay theArcForDisplay = new MyDxfArcForDisplay(castArc.XCenter + offsetOfDxfHorizontal, castArc.YCenter + offsetOfDxfVertical, castArc.Radius, castArc.StartAngleDegree, castArc.EndAngleDegree, usedPen); primalDrawingStructure.addSingleEntry(theArcForDisplay, obtainedBox.XLowerLeft + offsetOfDxfHorizontal, obtainedBox.YLowerLeft + offsetOfDxfVertical, obtainedBox.XUpperRight + offsetOfDxfHorizontal, obtainedBox.YUpperRight + offsetOfDxfVertical); } } //performing flip on draw structure is done by means of graphical container }