Пример #1
0
        public bool Load(string path)
        {
            var sb = new StringBuilder(1024);

            using (var r = new StreamReader(path, Encoding.GetEncoding("iso-8859-1")))
            {
                int lineIndex = 1;
                var state     = State.Idle;
                while (!r.EndOfStream)
                {
                    try
                    {
                        var str = r.ReadLine();
                        Decode(str, sb);
                        Update(ref state, sb);
                        lineIndex++;
                    }
                    catch (Exception e)
                    {
                        var fname = Path.GetFileName(path);
                        BoardUtil.OnUnknownFormat(fname, lineIndex);
                        return(false);
                    }
                }
            }
            // process nail parts
            foreach (var part in nailParts)
            {
                var nail = new Nail();
                nail.Location = Pins[part.FirstPin].Location;
                nail.Net      = Pins[part.FirstPin].Net;
                nail.Side     = part.Side;
                nail.Name     = Pins[part.FirstPin].Name;
                nail.Id       = -99;
                Nails.Add(nail);
            }
            nailParts.Clear();
            // assign pin sides
            foreach (var part in Parts)
            {
                for (int i = part.FirstPin; i < part.FirstPin + part.PinCount; i++)
                {
                    Pins[i].Side = part.Side;
                }
            }
            // generate bottom contour
            for (int i = 0; i < TopContour.Count; i++)
            {
                var v = TopContour[i];
                v.Y *= -1;
                BottomContour.Add(v);
            }
            return(true);
        }
Пример #2
0
        private void UpdateNails(ref NailsState state, StringBuilder data)
        {
            switch (state)
            {
            case NailsState.Idle:
            {
                var str = BoardUtil.SplitLine(data, 1);
                switch (str[0].ToLowerInvariant())
                {
                case "test":
                    state = NailsState.Desc;
                    break;

                case "nail":
                    state = NailsState.NailEntry;
                    break;
                }
            }
            break;

            case NailsState.Desc:
                //if (data.ToString().Contains("INCH units"))
                //    InchUnits = true;
                state = NailsState.Idle;
                break;

            case NailsState.NailEntry:
            {
                var str  = BoardUtil.SplitLine(data, 8);
                var nail = new Nail();
                nail.Id = int.Parse(str[0].Substring(1));
                var loc = new Vector2();
                loc.X         = ParseDouble(str[1]);
                loc.Y         = ParseDouble(str[2]);
                nail.Location = loc;
                nail.Type     = byte.Parse(str[3]);
                nail.Side     = GetSide(str[5]);
                nail.Net      = int.Parse(str[6].Substring(1));
                nail.Name     = str[7];
                Nails.Add(nail);
            }
            break;
            }
        }
Пример #3
0
        private void Update(ref State currentState, string data)
        {
            if (data.Length == 0)
            {
                currentState = State.Idle;
                return;
            }
            switch (currentState)
            {
            case State.Idle:
            {
                var str = BoardUtil.SplitLine(data.ToLowerInvariant());
                switch (str[0])
                {
                case "brdout:":
                    currentState = State.Format;
                    break;

                case "nets:":
                    currentState = State.Nets;
                    netNames     = new string[int.Parse(str[1])];
                    break;

                case "parts:":
                    currentState   = State.Parts;
                    Parts.Capacity = int.Parse(str[1]);
                    break;

                case "pins:":
                    currentState  = State.Pins;
                    Pins.Capacity = int.Parse(str[1]);
                    break;

                case "nails:":
                    currentState   = State.Nails;
                    Nails.Capacity = int.Parse(str[1]);
                    break;

                default:
                    break; // leave in idle state
                }
                break;
            }

            case State.Format: // update contour
            {
                var str = BoardUtil.SplitLine(data);
                if (str.Length != 2)
                {
                    throw new InvalidDataException();
                }
                var newVert = new Vector2(int.Parse(str[0]), int.Parse(str[1]));
                if (TopContour.Count > 0 && TopContour[TopContour.Count - 1] == newVert)
                {
                    break;
                }
                TopContour.Add(newVert);
                break;
            }

            case State.Nets:
            {
                var str = BoardUtil.SplitLine(data);
                int id  = int.Parse(str[0]) - 1;
                netNames[id] = str[1];
                break;
            }

            case State.Parts: // update partsTest
            {
                // 0     1    2   3    4    5    6
                // J3200 6765 430 9462 1386 8754 1
                // name  ?     ?   ?   ?    fp   side
                var str = BoardUtil.SplitLine(data);
                if (str.Length != 7)
                {
                    throw new InvalidDataException();
                }
                var part = new Part();
                part.Name = str[0];
                if (part.Name == "...")
                {
                    part.Name = string.Empty;
                }
                part.Side     = BoardUtil.GetSide(int.Parse(str[6]));
                part.FirstPin = int.Parse(str[5]);
                if (prevPart != null)
                {
                    prevPart.PinCount = part.FirstPin - prevPart.FirstPin;
                }
                Parts.Add(part);
                prevPart = part;
                break;
            }

            case State.Pins:                         // update pins
            {
                var str = BoardUtil.SplitLine(data); // X Y net side
                if (str.Length != 4)
                {
                    throw new InvalidDataException();
                }
                var pin = new Pin();
                pin.Location = new Vector2(int.Parse(str[0]), int.Parse(str[1]));
                pin.Net      = int.Parse(str[2]);
                pin.Side     = BoardUtil.GetSide(int.Parse(str[3]));
                if (pin.Side == (BoardSide.Top))
                {
                    pin.Location = new Vector2(pin.Location.X, -pin.Location.Y);
                }
                if (pin.Net == 0)
                {
                    if (prevNet == 0)
                    {
                        throw new InvalidDataException();
                    }
                    pin.Net = prevNet;
                }
                //pin.PartIndex = int.Parse(str[3]);
                pin.Name = netNames[pin.Net - 1];
                Pins.Add(pin);
                prevNet = pin.Net;
                break;
            }

            case State.Nails: // update nails
            {
                // net, x, y, side?, name
                // id, x, y, net, side
                var str = BoardUtil.SplitLine(data);
                if (str.Length != 5)
                {
                    throw new InvalidDataException();
                }
                var nail = new Nail();
                nail.Id       = int.Parse(str[0]);
                nail.Location = new Vector2(int.Parse(str[1]), int.Parse(str[2]));
                nail.Net      = int.Parse(str[3]);
                nail.Side     = BoardUtil.GetSide(int.Parse(str[4]));
                if (nail.Side == (BoardSide.Top))
                {
                    nail.Location = new Vector2(nail.Location.X, -nail.Location.Y);
                }
                nail.Name = netNames[nail.Net];
                if (nail.Name == "...")
                {
                    nail.Name = string.Empty;
                }
                Nails.Add(nail);
                break;
            }
            }
        }
Пример #4
0
        private void Update(ref State currentState, StringBuilder data)
        {
            if (data.Length == 0)
            {
                currentState = State.Idle;
                return;
            }
            switch (currentState)
            {
            case State.Idle:
                switch (data.ToString())
                {
                case "str_length:":
                    currentState = State.StrLength;
                    break;

                case "var_data:":
                    currentState = State.VarData;
                    break;

                case "Format:":
                    currentState = State.Format;
                    break;

                case "Parts:":
                    currentState = State.Parts;
                    break;

                case "Pins:":
                    currentState = State.Pins;
                    break;

                case "Nails:":
                    currentState = State.Nails;
                    break;

                default:
                    break; // leave in idle state
                }
                break;

            case State.StrLength: // XXX: wtf is this?
                break;

            case State.VarData: // XXX: wtf is this?
                break;

            case State.Format: // update contour
            {
                var str     = BoardUtil.SplitLine(data, 2);
                var newVert = new Vector2(int.Parse(str[0]), int.Parse(str[1]));
                if (TopContour.Count > 0 && TopContour[TopContour.Count - 1] == newVert)
                {
                    break;
                }
                TopContour.Add(newVert);
                break;
            }

            case State.Parts: // update partsTest
            {
                var str  = BoardUtil.SplitLine(data, 3);
                var part = new Part();
                part.Name = str[0];
                if (part.Name == "...")
                {
                    part.Name = string.Empty;
                }
                part.Side       = BoardUtil.GetSide(int.Parse(str[1]));
                part.FirstPin   = prevPartLastPin + 1;
                part.PinCount   = int.Parse(str[2]) - part.FirstPin;
                prevPartLastPin = part.FirstPin + part.PinCount - 1;
                if (part.Name.Length == 0 && part.PinCount == 1)
                {
                    nailParts.Add(part);
                    break;
                }
                Parts.Add(part);
                break;
            }

            case State.Pins: // update pins
            {
                var str = BoardUtil.SplitLine(data, 5);
                var pin = new Pin();
                pin.Location = new Vector2(int.Parse(str[0]), int.Parse(str[1]));
                pin.Net      = int.Parse(str[2]);
                //pin.PartIndex = int.Parse(str[3]);
                pin.Name = str[4];
                Pins.Add(pin);
                break;
            }

            case State.Nails: // update nails
            {
                // net, x, y, side?, name
                var str  = BoardUtil.SplitLine(data, 5);
                var nail = new Nail();
                nail.Location = new Vector2(int.Parse(str[1]), int.Parse(str[2]));
                nail.Net      = int.Parse(str[0]);
                nail.Side     = BoardUtil.GetSide(int.Parse(str[3]));
                nail.Name     = str[4];
                if (nail.Name == "...")
                {
                    nail.Name = string.Empty;
                }
                Nails.Add(nail);
                break;
            }
            }
        }