private Symbol FindSymbol(Part part, string gateId)
        {
            Library lib = schematic.Drawing.Schematic.Libraries.Library.Find(x => x.Name == part.Library);

            Deviceset devset = lib.Devicesets.Deviceset.Find(x => x.Name == part.Deviceset);

            Gate   gate   = devset.Gates.Gate.Find(x => x.Name == gateId);
            Symbol symbol = lib.Symbols.Symbol.Find(x => x.Name == gate.Symbol);

            return(symbol);
        }
        private int GetUnitNumber(Part part, string gate_name)
        {
            Library   lib    = schematic.Drawing.Schematic.Libraries.Library.Find(x => x.Name == part.Library);
            Deviceset devset = lib.Devicesets.Deviceset.Find(x => x.Name == part.Deviceset);

            int unit = 1;

            foreach (Gate gate in devset.Gates.Gate)
            {
                if (gate.Name == gate_name)
                {
                    return(unit);
                }
                else
                {
                    unit++;
                }
            }
            return(0);
        }
Exemple #3
0
        private void GetSymbol(Library lib, Deviceset devset, k.Symbol.Symbol k_sym)
        {
            bool   is_multi_part         = false;
            bool   interchangeable_units = false;
            string symbol_name           = devset.Gates.Gate[0].Symbol;

            if (devset.Gates.Gate.Count == 1)
            {
                is_multi_part = false;
            }
            else
            {
                is_multi_part         = true;
                interchangeable_units = true;
                foreach (Gate gate in devset.Gates.Gate)
                {
                    if (symbol_name != gate.Symbol)
                    {
                        interchangeable_units = false;
                        break;
                    }
                }

                k_sym.NumUnits = devset.Gates.Gate.Count;
                if (interchangeable_units)
                {
                    k_sym.Locked = false;
                }
                else
                {
                    k_sym.Locked = true;
                }
            }

            int gate_index = 0;

            k_sym.ShowPinName   = true;
            k_sym.ShowPinNumber = true;

            foreach (Gate gate in devset.Gates.Gate)
            {
                Symbol sym = lib.Symbols.Symbol.Find(x => x.Name == gate.Symbol);
                if (sym == null)
                {
                    Trace("error: symbol not found: " + gate.Symbol);
                    return;
                }

                if ((lib.Name != null) && lib.Name.StartsWith("supply"))
                {
                    k_sym.PowerSymbol             = true;
                    k_sym.Reference               = "#PWR";
                    k_sym.fReference.Text.Value   = "#PWR";
                    k_sym.fReference.Text.Visible = false;
                }

                int unit = 0;
                //int convert = 1;

                if (is_multi_part && !interchangeable_units)
                {
                    unit = gate_index + 1;
                }

                if ((gate_index == 0) || (is_multi_part && !interchangeable_units))
                {
                    // graphic lines, arcs
                    foreach (Wire wire in sym.Wire)
                    {
                        float curve = (float)StringUtils.StringToDouble(wire.Curve);

                        if (curve == 0)
                        {
                            k_sym.Drawings.Add(new k.Symbol.sym_polygon(unit, Common.StrToInch(wire.Width), k.Symbol.FillTypes.None,
                                                                        new List <PointF>()
                            {
                                Common.StrToPointInch(wire.X1, wire.Y1), Common.StrToPointInch(wire.X2, wire.Y2)
                            }));
                        }
                        else
                        {
                            PointF start = Common.StrToPointInch(wire.X1, wire.Y1);
                            PointF end = Common.StrToPointInch(wire.X2, wire.Y2);
                            float  arc_start, arc_end, radius;
                            PointF center = Common.kicad_arc_center(start, end, -curve, out radius, out arc_start, out arc_end);

                            k_sym.Drawings.Add(new k.Symbol.sym_arc(unit, Common.StrToInch(wire.Width),
                                                                    center, radius, arc_start, arc_end,
                                                                    start, end));
                        }
                    }

                    // graphic : circles
                    foreach (Circle circle in sym.Circle)
                    {
                        float width = 1;
                        if (!string.IsNullOrEmpty(circle.Width))
                        {
                            width = Math.Max(Common.StrToInch(circle.Width), 1);
                        }

                        k_sym.Drawings.Add(new k.Symbol.sym_circle(unit, width, k.Symbol.FillTypes.None,
                                                                   Common.StrToPointInch(circle.X, circle.Y),
                                                                   Common.StrToInch(circle.Radius)));
                    }

                    // graphic : rectangles
                    foreach (EagleImport.Rectangle rect in sym.Rectangle)
                    {
                        k_sym.Drawings.Add(new k.Symbol.sym_rectangle(unit, 1f, k.Symbol.FillTypes.PenColor, Common.StrToPointInch(rect.X1, rect.Y1), Common.StrToPointInch(rect.X2, rect.Y2)));
                    }

                    // graphic : texts
                    // check for name, value
                    foreach (Text text in sym.Text)
                    {
                        k.Symbol.sym_text k_text = new k.Symbol.sym_text(unit, text.mText, 0, Common.StrToPointInch(text.X, text.Y), Common.StrToInch(text.Size),
                                                                         false, false, false, k.Symbol.SymbolField.HorizAlign_Left, k.Symbol.SymbolField.VertAlign_Bottom);

                        //ExtRotation extRot = ExtRotation.Parse(text.Rot);
                        k_text.Text.xAngle = Common.GetAngle(text.Rot);

                        k_text.Text.Pos.Rotation = Common.xGetAngleFlip(text.Rot, out k_text.Text.xMirror);

                        SizeF textSize = strokeFont.GetTextSize(text.mText, new Kicad_utils.TextEffects(k_text.Text.FontSize));

                        string t = text.mText.ToUpperInvariant();
                        if (t.Contains(">NAME") || t.Contains(">PART") ||
                            t.Contains(">VALUE"))
                        {
                            k.Symbol.SymbolField sym_text;
                            if (t.Contains(">VALUE"))
                            {
                                sym_text = k_sym.fValue;
                            }
                            else
                            {
                                sym_text = k_sym.fReference;
                            }

                            sym_text.Text.Pos      = k_text.Text.Pos;
                            sym_text.Text.FontSize = k_text.Text.FontSize;
                            if ((k_text.Text.Pos.Rotation == 0) || (k_text.Text.Pos.Rotation == 180))
                            {
                                sym_text.Text.Pos.Rotation = 0;
                            }
                            else
                            {
                                sym_text.Text.Pos.Rotation = 90;
                            }
                        }
                        else
                        {
                            // unless Spin is set?
                            if (k_text.Text.Pos.Rotation == 180)
                            {
                                k_text.Text.Pos.At.X    -= textSize.Width;
                                k_text.Text.Pos.At.Y    -= textSize.Height;
                                k_text.Text.Pos.Rotation = 0;
                            }

                            //
                            k_sym.Drawings.Add(k_text);
                        }
                    }
                }


                // Pins
                foreach (Pin pin in sym.Pin)
                {
                    k.Symbol.sym_pin k_pin = new k.Symbol.sym_pin(unit, Common.ConvertName(pin.Name), "~", Common.StrToPointInch(pin.X, pin.Y),
                                                                  250,
                                                                  "L",
                                                                  50f, 50f, "P", "", true);
                    switch (pin.Rot)
                    {
                    case "R0": k_pin.Orientation = "R"; break;

                    case "R90": k_pin.Orientation = "U"; break;

                    case "R180": k_pin.Orientation = "L"; break;

                    case "R270": k_pin.Orientation = "D"; break;

                    default:
                        k_pin.Orientation = "R"; break;
                    }
                    switch (pin.Length)
                    {
                    case PinLength.point: k_pin.Length = 0; break;

                    case PinLength.@short: k_pin.Length = 100; break;

                    case PinLength.middle: k_pin.Length = 200; break;

                    case PinLength.@long: k_pin.Length = 300; break;

                    default:
                        k_pin.Length = 300; break;
                    }

                    switch (pin.Visible)
                    {
                    case PinVisible.off:
                        k_pin.SizeName = 0;
                        k_pin.SizeNum  = 0;
                        break;

                    case PinVisible.pad:
                        k_pin.SizeName = 0;
                        break;

                    case PinVisible.pin:
                        k_pin.SizeNum = 0;
                        break;

                    case PinVisible.both:
                        break;
                    }

                    switch (pin.Direction)
                    {
                    case PinDirection.nc: k_pin.Type = "N"; break;

                    case PinDirection.@in: k_pin.Type = "I"; break;

                    case PinDirection.@out: k_pin.Type = "O"; break;

                    case PinDirection.io: k_pin.Type = "B"; break;

                    case PinDirection.oc: k_pin.Type = "C"; break;

                    case PinDirection.hiz: k_pin.Type = "T"; break;

                    case PinDirection.pas: k_pin.Type = "P"; break;

                    case PinDirection.pwr: k_pin.Type = "W"; break;

                    case PinDirection.sup: k_pin.Type = "w"; break;

                    default:
                        k_pin.Type = "B";
                        break;
                    }

                    if (k_sym.PowerSymbol)
                    {
                        k_pin.Type      = k.Symbol.sym_pin.dir_power_in;
                        k_pin.PinNumber = "~";
                        k_pin.Visible   = false;
                        // todo add line...

                        if (k_pin.Length != 0)
                        {
                            PointF p1 = k_pin.Pos;
                            PointF p2 = new PointF(k_pin.Pos.X + k_pin.Length, k_pin.Pos.Y);

                            p2 = PointFExt.Rotate(p2, k_pin.Pos, Common.GetAngle(pin.Rot));

                            k_sym.Drawings.Add(new k.Symbol.sym_polygon(unit, 6,
                                                                        k.Symbol.FillTypes.None,
                                                                        new List <PointF>()
                            {
                                p1, p2
                            }));
                        }
                    }

                    switch (pin.Function)
                    {
                    case PinFunction.none: k_pin.Shape = ""; break;

                    case PinFunction.dot: k_pin.Shape = "I"; break;

                    case PinFunction.clk: k_pin.Shape = "C"; break;

                    case PinFunction.dotclk: k_pin.Shape = "CI"; break;
                    }

                    //
                    k_sym.Drawings.Add(k_pin);
                }

                gate_index++;
            } // foreach gate
        }