Example #1
0
        private void RenderTextFramePrimitive(Graphics g, TextFrameRecord textFrame)
        {
            var penWidth = ScaleLineWidth(textFrame.LineWidth);
            var rect     = ScreenFromWorld(textFrame.CalculateBounds());

            if (textFrame.IsSolid)
            {
                using (var brush = new SolidBrush(textFrame.AreaColor))
                {
                    DrawingUtils.FillRectangle(g, brush, rect);
                }
            }

            if (textFrame.ShowBorder)
            {
                using (var pen = CreatePen(textFrame.Color, penWidth, lineJoin: LineJoin.Miter))
                {
                    DrawingUtils.DrawRectangle(g, pen, rect);
                }
                // reduce text area according to the penWidth
                rect.Inflate(-penWidth, -penWidth);
            }

            using (var brush = new SolidBrush(textFrame.TextColor))
                using (var font = CreateFont(textFrame.FontId))
                {
                    DrawingUtils.DrawString(g, textFrame.Text, font, brush, rect, StringAlignment.Near, StringAlignment.Near, textFrame.ClipToRect, textFrame.WordWrap);
                }
        }
Example #2
0
        private void RenderPadPrimitive(Graphics g, PcbPad pad)
        {
            var holeCenter = ScreenFromWorld(pad.Location.X, pad.Location.Y);

            g.TranslateTransform(holeCenter.X, holeCenter.Y);
            g.RotateTransform(-(float)pad.Rotation);

            DrawPad(g, pad, PcbPadPart.BottomSolder);
            DrawPad(g, pad, PcbPadPart.TopSolder);
            DrawPad(g, pad, PcbPadPart.BottomLayer);
            DrawPad(g, pad, PcbPadPart.TopLayer);

            if (pad.HasHole)
            {
                g.RotateTransform(-(float)pad.HoleRotation);
                using (var brush = new SolidBrush(Layer.GetLayerColor("PadHoleLayer")))
                {
                    var rect = ScaleRect(pad.CalculatePartRect(PcbPadPart.Hole, false));
                    switch (pad.HoleShape)
                    {
                    case PcbPadHoleShape.Round:
                        g.FillEllipse(brush, rect);
                        break;

                    case PcbPadHoleShape.Square:
                        DrawingUtils.FillRectangle(g, brush, rect);
                        break;

                    case PcbPadHoleShape.Slot:
                        DrawingUtils.FillRoundedRect(g, brush, rect, 100);
                        break;

                    default:
                        return;
                    }
                }
            }

            g.ResetTransform();

            const float MIN_FONT_DESCRIPTOR = 7;
            var         fontSize            = Math.Min(29f, ScaleCoord(pad.HasHole ? pad.HoleSize : pad.SizeTop.Y) * 0.5f);

            if (fontSize > MIN_FONT_DESCRIPTOR)
            {
                var fontColor = pad.HasHole ? Color.FromArgb(255, 227, 143) : Color.FromArgb(255, 181, 181);
                using (var brush = new SolidBrush(fontColor)) // TODO: add constant
                    using (var font = new Font("Arial", fontSize))
                    {
                        DrawingUtils.DrawString(g, pad.Designator, font, brush, holeCenter.X, holeCenter.Y,
                                                StringAlignmentKind.Tight, StringAlignment.Center, StringAlignment.Center);
                    }
            }
        }
Example #3
0
        private void RenderPinPrimitive(Graphics g, PinRecord pin)
        {
            var location = ScreenFromWorld(pin.Location.X, pin.Location.Y);

            g.TranslateTransform(location.X, location.Y);

            var direction = 1.0f;
            var displayNameHorizontalAlignment = StringAlignment.Far;
            var designatorHorizontalAlignment  = StringAlignment.Near;
            var penWidth = ScaleLineWidth(LineWidth.Small);

            using (var pen = CreatePen(pin.Color, penWidth, LineCap.Flat))
            {
                if (pin.PinConglomerate.HasFlag(PinConglomerateFlags.Rotated))
                {
                    g.RotateTransform(-90);
                }

                if (pin.PinConglomerate.HasFlag(PinConglomerateFlags.Flipped))
                {
                    direction = -1.0f;
                    displayNameHorizontalAlignment = StringAlignment.Near;
                    designatorHorizontalAlignment  = StringAlignment.Far;
                }

                var length = ScaleCoord(pin.PinLength) * direction;
                g.DrawLine(pen, -1.0f, 0.0f, length, 0.0f);
            }

            using (var brush = new SolidBrush(pin.Color))
                using (var font = CreateFont("Times New Roman", 10f, FontStyle.Regular))
                {
                    if (pin.PinConglomerate.HasFlag(PinConglomerateFlags.DisplayNameVisible))
                    {
                        var x           = ScalePixelLength(-5.0f) * direction;
                        var displayName = pin.Name.Replace(@"\", "");
                        DrawingUtils.DrawString(g, displayName, font, brush, x, ScalePixelLength(0.5),
                                                StringAlignmentKind.Default, displayNameHorizontalAlignment, StringAlignment.Center);
                        using (var pen = CreatePen(pin.Color, ScaleLineWidth(LineWidth.Small)))
                        {
                            DrawOverline(g, pin.Name, font, pen, x, ScalePixelLength(0.5),
                                         StringAlignmentKind.Default, displayNameHorizontalAlignment, StringAlignment.Center);
                        }
                    }

                    if (pin.PinConglomerate.HasFlag(PinConglomerateFlags.DesignatorVisible))
                    {
                        DrawingUtils.DrawString(g, pin.Designator, font, brush,
                                                ScalePixelLength(8.0f) * direction, 0,
                                                StringAlignmentKind.Extent, designatorHorizontalAlignment, StringAlignment.Far);
                    }
                }
        }
Example #4
0
        private void RenderTextPrimitive(Graphics g, PcbText text)
        {
            var   location  = ScreenFromWorld(text.Corner1.X, text.Corner1.Y);
            var   color     = LayerMetadata.GetColor(text.Layer);
            var   height    = ScaleCoord(text.Height);
            var   fontStyle = (text.FontItalic ? FontStyle.Italic : FontStyle.Regular) | (text.FontBold ? FontStyle.Bold : FontStyle.Regular);
            float fontWidth;
            float fontSize;

            if (text.TextKind == PcbTextKind.Stroke)
            {
                fontWidth = ScaleCoord(text.Width);
                fontSize  = DrawingUtils.CalculateFontSizeForBaseline(g, StrokeFontFamily, fontStyle, height + fontWidth);
            }
            else
            {
                fontWidth = 0;
                fontSize  = DrawingUtils.CalculateFontSizeForHeight(g, StrokeFontFamily, fontStyle, height);
            }

            g.TranslateTransform(location.X, location.Y);
            g.RotateTransform(-(float)text.Rotation);

            using (var brush = new SolidBrush(color))
                using (var fontFamily = new FontFamily(text.FontName))
                    using (var font = new Font(text.TextKind == PcbTextKind.Stroke ? StrokeFontFamily : fontFamily, fontSize, fontStyle))
                    {
                        var size = g.MeasureString(text.Text, font);
                        if (size.Height < 5)
                        {
                            using (var pen = new Pen(brush))
                            {
                                var rect = ScaleRect(text.CalculateRect(false));
                                g.DrawRectangle(pen, rect.Left, rect.Top, rect.Width, rect.Height);
                            }
                        }
                        else
                        {
                            if (text.Mirrored)
                            {
                                g.ScaleTransform(-1.0f, 1.0f);
                            }
                            DrawingUtils.DrawString(g, text.Text, font, brush, 0, fontWidth * 0.5f,
                                                    StringAlignmentKind.Tight, StringAlignment.Near, StringAlignment.Far);
                        }
                    }

            g.ResetTransform();
        }
Example #5
0
        private void RenderTextStringPrimitive(Graphics g, TextStringRecord textString)
        {
            if (textString.IsHidden || textString.Record != 4)
            {
                return;
            }

            var location = ScreenFromWorld(textString.Location.X, textString.Location.Y);

            using (var brush = new SolidBrush(textString.Color))
                using (var font = CreateFont(textString.FontId))
                {
                    StringAlignment horizontalAlignment;
                    if (textString.Justification == TextJustification.BottomLeft ||
                        textString.Justification == TextJustification.MiddleLeft ||
                        textString.Justification == TextJustification.TopLeft)
                    {
                        horizontalAlignment = StringAlignment.Near;
                    }
                    else if (textString.Justification == TextJustification.BottomCenter ||
                             textString.Justification == TextJustification.MiddleCenter ||
                             textString.Justification == TextJustification.TopCenter)
                    {
                        horizontalAlignment = StringAlignment.Center;
                    }
                    else
                    {
                        horizontalAlignment = StringAlignment.Far;
                    }

                    StringAlignment verticalAlignment;
                    if (textString.Justification == TextJustification.BottomLeft ||
                        textString.Justification == TextJustification.BottomCenter ||
                        textString.Justification == TextJustification.BottomRight)
                    {
                        verticalAlignment = StringAlignment.Far;
                    }
                    else if (textString.Justification == TextJustification.MiddleLeft ||
                             textString.Justification == TextJustification.MiddleCenter ||
                             textString.Justification == TextJustification.MiddleRight)
                    {
                        verticalAlignment = StringAlignment.Center;
                    }
                    else
                    {
                        verticalAlignment = StringAlignment.Near;
                    }

                    g.TranslateTransform(location.X, location.Y);
                    if (textString.Orientations.HasFlag(TextOrientations.Rotated))
                    {
                        g.RotateTransform(-90);
                    }
                    if (textString.Orientations.HasFlag(TextOrientations.Flipped))
                    {
                        horizontalAlignment = StringAlignment.Far - (int)horizontalAlignment;
                        verticalAlignment   = StringAlignment.Far - (int)verticalAlignment;
                    }

                    DrawingUtils.DrawString(g, textString.Text, font, brush,
                                            0, 0, horizontalAlignment, verticalAlignment, false);
                }
        }