/// <summary> /// Processes the specified args. /// </summary> /// <param name="args">The args.</param> public override void Process([NotNull] ServicePipelineArgs args) { Assert.ArgumentNotNull(args, "args"); using (var nopServiceClient = this.GetClient()) { var categories = nopServiceClient.GetAllCategories(); var productClassifications = categories.Select( x => { Classification classification = this.InstantiateEntity <Classification>(); classification.ExternalId = x.Id; classification.ExternalParentId = x.ParentCategoryId; classification.Description = x.Description; classification.Name = x.Name; classification.Created = x.CreatedOnUtc; classification.Updated = x.UpdatedOnUtc; return(classification); }).ToList(); ClassificationGroup classificationGroup = this.InstantiateEntity <ClassificationGroup>(); classificationGroup.Classifications = productClassifications.AsReadOnly(); classificationGroup.Name = this.productClassificationGroupName; classificationGroup.ExternalId = this.productClassificationGroupExternalId; classificationGroup.Updated = DateTime.UtcNow; args.Request.Properties["ClassificationGroups"] = new List <ClassificationGroup> { classificationGroup }; nopServiceClient.Close(); } }
public static ClassificationResult Classify(IList <Color> colors) { if (colors == null || colors.Count() != 96) { throw new Exception("Impossible d'obtenir le cube car une quantité différente de 96 couleurs a été transmise au classifier"); } var groups = new List <ClassificationGroup>(6); var points = new List <ClassifiedPoint>(96); for (int i = 0; i < 96; i++) { points.Add(new ClassifiedPoint(colors[i])); } // distances entre points deux à deux trier par ordre croissant var distances = new List <Distance>(); for (int i = 0; i < 96; i++) { for (int j = i + 1; j < 96; j++) { var dx = (points[i].MeasuredColor.R - points[j].MeasuredColor.R); var dy = (points[i].MeasuredColor.G - points[j].MeasuredColor.G); var dz = (points[i].MeasuredColor.B - points[j].MeasuredColor.B); var d = dx * dx + dy * dy + dz * dz; points[i].Distance[points[j]] = d; points[j].Distance[points[i]] = d; distances.Add(new Distance(points[i], points[j], d)); } } distances.Sort((x, y) => x.PointDistance - y.PointDistance); for (int igGrp = 0; igGrp < 6; igGrp++) { // trouver la paire de point la plus proche qui n'appartient pas encore à un groupe var nearest = distances.FirstOrDefault((x) => x.Point1.Group == null && x.Point2.Group == null); var group = new ClassificationGroup(igGrp); // les ajouter au groupe group.Add(nearest.Point1); group.Add(nearest.Point2); // ajouter les 14 plus proches for (int i = 0; i < 14; i++) { group.AddNearest(); } groups.Add(group); } var res = new ClassificationResult(); res.Groups = groups; res.Points = points; return(res); }