//step 1. render dxf data from unscaledGraphicalData to bitmapInitial. Also initialize bitmapInitial. currentscalefactor should be set up beforehand public void drawImageToBitmapUsingCurrentScaleFactor() { double bitmapInitialWidth = Math.Abs(this.unscaledGraphicalData.XLowerLeft - this.unscaledGraphicalData.XUpperRight); double bitmapInitialHeight = Math.Abs(this.unscaledGraphicalData.YLowerLeft - this.unscaledGraphicalData.YUpperRight); //you know, dxf file might not be located at 0; 0 as lower Left. So I apply movement coefficients double unscaledOffsetX = this.unscaledGraphicalData.XLowerLeft; double unscaledOffsetY = this.unscaledGraphicalData.YLowerLeft; double newWidthPrescaled = currentscalefactor * bitmapInitialWidth; double newHeightPrescaled = currentscalefactor * bitmapInitialHeight; bitmapInitial = new Bitmap((int)Math.Round(newWidthPrescaled) + 1, (int)Math.Round(newHeightPrescaled) + 1); using (Graphics ee = Graphics.FromImage(bitmapInitial)) { ee.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.NearestNeighbor; ee.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias; // RENDERING CODE GOES HERE ! foreach (DXFRendering.GRAPHICAL.DXFentryForDisplay item in unscaledGraphicalData) { if (item is DXFRendering.GRAPHICAL.MyDxfLineForDisplay) { DXFRendering.GRAPHICAL.MyDxfLineForDisplay lineEntry = (item as DXFRendering.GRAPHICAL.MyDxfLineForDisplay); ee.DrawLine(lineEntry.penStructure, (float)((lineEntry.XStart - unscaledOffsetX) * currentscalefactor), (float)((lineEntry.YStart - unscaledOffsetY) * currentscalefactor), (float)((lineEntry.XEnd - unscaledOffsetX) * currentscalefactor), (float)((lineEntry.YEnd - unscaledOffsetY) * currentscalefactor)); } else if (item is DXFRendering.GRAPHICAL.MyDxfArcForDisplay) { DXFRendering.GRAPHICAL.MyDxfArcForDisplay arcEntry = (item as DXFRendering.GRAPHICAL.MyDxfArcForDisplay); ee.DrawArc(arcEntry.penStructure, (float)((arcEntry.XUpper - unscaledOffsetX) * currentscalefactor), (float)((arcEntry.YUpper - unscaledOffsetY) * currentscalefactor), (float)(arcEntry.Width * currentscalefactor), (float)(arcEntry.Height * currentscalefactor), (float)arcEntry.startAngle, (float)arcEntry.sweepAngle); } } } bitmapInitial.RotateFlip(RotateFlipType.RotateNoneFlipY); this.VerticalScroll.Value = 0; this.HorizontalScroll.Value = 0; realPaintingCanvas.Width = bitmapInitial.Width; realPaintingCanvas.Height = bitmapInitial.Height; realPaintingCanvas.Location = new Point(0, 0); bitmapRender = bitmapInitial.Clone(new Rectangle(0, 0, bitmapInitial.Width, bitmapInitial.Height), bitmapInitial.PixelFormat); }
//step 0. get the file structure from dxf and gradually turn it into drawing struct public void prepareGraphicalDataStruct(DXFRendering.LOGICAL.completeDxfStruct in_structFromFile) { unscaledGraphicalData = new DXFRendering.GRAPHICAL.CompleteDxfDrawingStruct(); int lngthOfStruct = in_structFromFile.getSize(); for (int i = 0; i < lngthOfStruct; i++) //read and convert entries from supplied struct to display struct with data ready to display { DXFRendering.LOGICAL.DXFdrawingEntry someEntry = in_structFromFile.getItemByIndex(i); Pen usedPen = null; if ((collectionOfLayerDefinitions != null) && (collectionOfLayerDefinitions.ContainsKey(someEntry.layerIdentifier))) { usedPen = collectionOfLayerDefinitions[someEntry.layerIdentifier].Item2; } else { usedPen = new Pen(Color.Black); } DXFRendering.LOGICAL.MyDxfBoundingBox tmpboundbox = someEntry.GetBoundingBox(); DXFRendering.GRAPHICAL.DXFentryForDisplay tmpEntry2 = null; if (someEntry is DXFRendering.LOGICAL.MyDxfLine) { tmpEntry2 = new DXFRendering.GRAPHICAL.MyDxfLineForDisplay( (someEntry as DXFRendering.LOGICAL.MyDxfLine).XStart, (someEntry as DXFRendering.LOGICAL.MyDxfLine).YStart, (someEntry as DXFRendering.LOGICAL.MyDxfLine).XEnd, (someEntry as DXFRendering.LOGICAL.MyDxfLine).YEnd, usedPen); } else if (someEntry is DXFRendering.LOGICAL.MyDxfArc) { DXFRendering.LOGICAL.MyDxfArc castArc = someEntry as DXFRendering.LOGICAL.MyDxfArc; tmpEntry2 = new DXFRendering.GRAPHICAL.MyDxfArcForDisplay(castArc.XCenter, castArc.YCenter, castArc.Radius, castArc.StartAngleDegree, castArc.EndAngleDegree, usedPen); } // distilled it this.unscaledGraphicalData.addSingleEntry(tmpEntry2, tmpboundbox.XLowerLeft, tmpboundbox.YLowerLeft, tmpboundbox.XUpperRight, tmpboundbox.YUpperRight); } }