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);
        }
Ejemplo n.º 2
0
        /// <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
        }