public HorizontalCableLayoutComparer(Dictionary <int, CableInfo> cableInfoById, Dictionary <int, int> matePositionByCableId, int groupPosition)
 {
     this.matePositionByCableId = matePositionByCableId;
     this.cableInfoById         = cableInfoById;
     this.groupPosition         = groupPosition;
     stringComparer             = new NaturalSortingStringComparer();
 }
 public VerticalCableSymbolsComparer(List <ISchemeSymbol> topSymbols, List <ISchemeSymbol> bottomSymbols, Dictionary <int, int> bottomPositionById, Dictionary <int, int> topPositionById)
 {
     this.optimalBottomPositionById = bottomPositionById;
     this.optimalTopPositionById    = topPositionById;
     this.topGroups    = topSymbols;
     this.bottomGroups = bottomSymbols;
     stringComparer    = new NaturalSortingStringComparer();
 }
        private void GetPins(Dictionary <int, DeviceConnection> deviceConnectionById, Dictionary <int, DeviceSymbol> deviceSymbolById, E3Text text)
        {
            Dictionary <string, SymbolPin> topPinByName    = new Dictionary <string, SymbolPin>();
            Dictionary <string, SymbolPin> bottomPinByName = new Dictionary <string, SymbolPin>();

            foreach (int connectionId in ConnectionIds)
            {
                DeviceConnection connection = deviceConnectionById[connectionId];
                int    connectedId;
                string pinName;
                if (id == connection.StartDeviceId)
                {
                    connectedId = connection.EndDeviceId;
                    pinName     = connection.StartPinName;
                }
                else
                {
                    connectedId = connection.StartDeviceId;
                    pinName     = connection.EndPinName;
                }
                string connectedAssignment = deviceSymbolById[connectedId].Assignment;
                if (!String.IsNullOrEmpty(Assignment) && String.IsNullOrEmpty(connectedAssignment))
                {
                    if (!topPinByName.ContainsKey(pinName))
                    {
                        SymbolPin pin = new SymbolPin(pinName, connection.Signal, text, smallFont);
                        topPinByName.Add(pinName, pin);
                    }
                    topPinByName[pinName].CableIds.Add(connection.CableId);
                }
                else
                {
                    if (!bottomPinByName.ContainsKey(pinName))
                    {
                        SymbolPin pin = new SymbolPin(pinName, connection.Signal, text, smallFont);
                        bottomPinByName.Add(pinName, pin);
                    }
                    bottomPinByName[pinName].CableIds.Add(connection.CableId);
                }
            }
            topPins    = topPinByName.Values.ToList();
            bottomPins = bottomPinByName.Values.ToList();
            NaturalSortingStringComparer stringComparer = new NaturalSortingStringComparer();

            topPins.Sort((p1, p2) => stringComparer.Compare(p1.Name, p2.Name));
            bottomPins.Sort((p1, p2) => stringComparer.Compare(p1.Name, p2.Name));
        }
 public VerticalCableLayoutComparer(Dictionary <int, CableInfo> cableInfoById, Dictionary <int, int> matePositionByCableId)
 {
     this.matePositionByCableId = matePositionByCableId;
     this.cableInfoById         = cableInfoById;
     stringComparer             = new NaturalSortingStringComparer();
 }
        private void SortSymbols()
        {
            NaturalSortingStringComparer stringComparer = new NaturalSortingStringComparer();

            deviceSymbols.Sort((ds1, ds2) => stringComparer.Compare(ds1.Name, ds2.Name));
        }
 private Dictionary<int, Dictionary<int, int>> GetConnectedPositionByIdByCenterId(Level centerGroupLevel, List<Tuple<int, int>> topToBottomConnections)
 {
     IEnumerable<int> centerIds = topToBottomConnections.Select(c => (centerGroupLevel == Level.Top) ? c.Item1 : c.Item2).Distinct();
     NaturalSortingStringComparer stringComparer = new NaturalSortingStringComparer();
     Dictionary<int, Dictionary<int, int>> connectedPositionByIdByCenterId = new Dictionary<int, Dictionary<int, int>>();
     foreach (int centerId in centerIds)
     {
         DeviceGroup centerGroup = symbolById[centerId] as DeviceGroup;
         if (centerGroup == null)
             continue;
         List<int> connectedIds = topToBottomConnections.Where(c => ((centerGroupLevel == Level.Top) ? c.Item1 : c.Item2) == centerId).Select(c => (centerGroupLevel == Level.Top) ? c.Item2 : c.Item1).ToList();
         int connectedCount = connectedIds.Count();
         if (connectedCount > 1)
         {
             Dictionary<string, List<int>> groupIdsByPinName = new Dictionary<string, List<int>>(connectedCount);
             foreach (int connectedId in connectedIds)
             {
                 IEnumerable<int> commonCableIds = symbolById[connectedId].CableIds.Intersect(centerGroup.CableIds);
                 IEnumerable<SymbolPin> bottomPins = centerGroup.DeviceSymbols.SelectMany(ds => ds.BottomPins);
                 IEnumerable<SymbolPin> topPins = centerGroup.DeviceSymbols.SelectMany(ds => ds.TopPins);
                 List<SymbolPin> pins = new List<SymbolPin>(bottomPins.Count() + topPins.Count());
                 pins.AddRange(bottomPins);
                 pins.AddRange(topPins);
                 List<string> commonPinNames = pins.Where(p => p.CableIds.Intersect(commonCableIds).Any()).Select(p => p.Name).ToList();
                 commonPinNames.Sort(stringComparer);
                 string leftPinName = commonPinNames.First();
                 if (!groupIdsByPinName.ContainsKey(leftPinName))
                     groupIdsByPinName.Add(leftPinName, new List<int>(){connectedId});
                 else
                     groupIdsByPinName[leftPinName].Add(connectedId);
             }
             if (groupIdsByPinName.Count > 1)
             {
                 List<string> sortedLeftPinNames = groupIdsByPinName.Keys.ToList();
                 sortedLeftPinNames.Sort(stringComparer);
                 Dictionary<int, int> positionById = new Dictionary<int, int>(connectedCount);
                 for (int position = 0; position < sortedLeftPinNames.Count; position++)
                 {
                     string pinName = sortedLeftPinNames[position];
                     groupIdsByPinName[pinName].ForEach(id => positionById.Add(id, position));
                 }
                 connectedPositionByIdByCenterId.Add(centerId, positionById);
             }
         }
     }
     return connectedPositionByIdByCenterId;
 }
 private void GetPins(Dictionary<int, DeviceConnection> deviceConnectionById, Dictionary<int, DeviceSymbol> deviceSymbolById, E3Text text)
 {
     Dictionary<string, SymbolPin> topPinByName = new Dictionary<string, SymbolPin>();
     Dictionary<string, SymbolPin>  bottomPinByName = new Dictionary<string, SymbolPin>();
     foreach (int connectionId in ConnectionIds)
     {
         DeviceConnection connection = deviceConnectionById[connectionId];
         int connectedId;
         string pinName;
         if (id == connection.StartDeviceId)
         {
             connectedId = connection.EndDeviceId;
             pinName = connection.StartPinName;
         }
         else
         {
             connectedId = connection.StartDeviceId;
             pinName = connection.EndPinName;
         }
         string connectedAssignment = deviceSymbolById[connectedId].Assignment;
         if (!String.IsNullOrEmpty(Assignment) && String.IsNullOrEmpty(connectedAssignment))
         {
             if (!topPinByName.ContainsKey(pinName))
             {
                 SymbolPin pin = new SymbolPin(pinName, connection.Signal, text, smallFont);
                 topPinByName.Add(pinName, pin);
             }
             topPinByName[pinName].CableIds.Add(connection.CableId);
         }
         else
         {
             if (!bottomPinByName.ContainsKey(pinName))
             {
                 SymbolPin pin = new SymbolPin(pinName, connection.Signal, text, smallFont);
                 bottomPinByName.Add(pinName, pin);
             }
             bottomPinByName[pinName].CableIds.Add(connection.CableId);
         }
     }
     topPins = topPinByName.Values.ToList();
     bottomPins = bottomPinByName.Values.ToList();
     NaturalSortingStringComparer stringComparer = new NaturalSortingStringComparer();
     topPins.Sort((p1,p2)=>stringComparer.Compare(p1.Name, p2.Name));
     bottomPins.Sort((p1, p2) => stringComparer.Compare(p1.Name, p2.Name));
 }