private Bitmap _generateGeneralObject() { ImgGeneralObject imgGO = new ImgGeneralObject(ModuleWidth, genObj.SpotInf, ImagePath); //ImgGeneralObject imgGO = new ImgGeneralObject(ModuleWidth, 35, 31); foreach (HouseInfo hi in this.genObj.Houses) { ImgHouse imgH = generateOneHouse(hi); imgGO.ImgHouses.Add(imgH); } Bitmap bmpImageGO = imgGO.Generate(Seria); return(bmpImageGO); }
/// <summary> /// Построение изображений отдельных домов /// </summary> private ImgHouse generateOneHouse(HouseInfo hi) { ImgHouse imgHouse = new ImgHouse(); List <Bitmap> bmpSections = new List <Bitmap>(); foreach (FlatInfo fi in hi.Sections) { ImgSection imgSection = GetImgSection(fi, imgHouse); imgHouse.ImgSections.Add(imgSection); SectionIndex++; } // GC.Collect(); return(imgHouse); }
public void CombineImages(string imageOutPutPath) { int HouseIndex = 1; List <ImgHouse> imgHouses = new List <ImgHouse>(); foreach (HouseInfo hi in this.genObj.Houses) { ImgHouse imgH = generateOneHouse(hi); //string imgHName = "Вариант" + HouseIndex + ".png"; //string imgHDir = imageOutPutPath; //SaveImage(imgH.BmpImageHouse, imgHDir, imgHName); // GC.Collect(); HouseIndex++; } }
public Bitmap generateOneHouse(ImgHouse House, int ModuleWidth) { CalculateHouseImageDimentions(ModuleWidth); CalculateImageSectionsCoords(ModuleWidth); int width = House.Width * ModuleWidth; int height = House.Height * ModuleWidth; var bitmap = new Bitmap(width, height); using (var canvas = Graphics.FromImage(bitmap)) { canvas.Clear(Color.White); canvas.InterpolationMode = InterpolationMode.HighQualityBicubic; foreach (ImgSection imgSection in House.ImgSections) { int imgSectionWidth = 0; int imgSectionHeight = 0; if (imgSection.SectionInfo.IsVertical) { // TODO: в классе изображения секции привести значения длины секции и высоты секции в соответствии с изображением png imgSectionWidth = imgSection.Height; imgSectionHeight = imgSection.Lenght; } else { imgSectionWidth = imgSection.Lenght; imgSectionHeight = imgSection.Height; } imgSectionWidth *= ModuleWidth; imgSectionHeight *= ModuleWidth; imgSection.CoordX *= ModuleWidth; imgSection.CoordY *= ModuleWidth; Image frame; try { frame = imgSection.BmpSection; } catch (Exception ex) { frame = new Bitmap(imgSectionWidth, imgSectionHeight); } //TODO: Здесь возникала ошибка с отсутствующим изображением PIK1_BS_L_10-17_A try { canvas.DrawImage(frame, new Rectangle(imgSection.CoordX, imgSection.CoordY, //imgFlat.CoordY * ModuleWidth * 2, //-ModuleWidth - ModuleWidth/4, imgSectionWidth, imgSectionHeight), new Rectangle(0, 0, //imgFlat.CoordY * ModuleWidth, //-ModuleWidth, frame.Width, frame.Height), GraphicsUnit.Pixel); } catch (Exception) { } //canvas.Save(); } // canvas.RotateTransform(7); canvas.Save(); } return(bitmap); }
private ImgSection GetImgSection(FlatInfo fi, ImgHouse imgHouse = null) { ImgSection imgSection = new ImgSection(); //if (hi.SectionsBySize[0].) //{ // imgSection.Angle += 90; //} //if (fi.IsInvert) //{ // imgSection.Angle += 180; //} imgSection.Angle = fi.ImageAngle; // Корректировка точки вставки секций if (fi.IsCorner) { imgSection.CoordYCorrection = 0; if (imgHouse != null) { imgHouse.IsCorner = true; } } // Определение положения дома - вертикальный/горизонтальный if (!fi.IsVertical) { if (imgHouse != null) { imgHouse.IsVertical = false; } } int SelectedDownPrev = 0; int offset = 0; int minX = 0; int X = 0; bool prev3NL2 = false; int FlatIndex = 0; foreach (RoomInfo ri in fi.Flats) { // Корректировка неверно выданных данных if (ri.Type.Contains("3NL2")) { ri.SelectedIndexTop = 4; ri.SelectedIndexBottom = 0; imgSection.Height = 5; } // Корректировка неверно выданных данных if (ri.Type == "PIK1U_BS_A_10-17_A_2") { ri.SelectedIndexTop = 3; } // Корректировка положения квартиры 2KL2 и 2NM1 if (ri.Type.Contains("2KL2") || ri.Type.Contains("2NM1")) { if (prev3NL2 || (fi.Flats.Any(x => x.Type.Contains("3NL2")) && (fi.Flats.Count == FlatIndex + 2))) { ri.ImageNameSuffix = "_U"; if (ri.Type.Contains("2NM1")) { ri.SelectedIndexBottom = 1; } if (ri.Type.Contains("2KL2")) { ri.SelectedIndexBottom = 2; } ri.HorisontalModules = 2; prev3NL2 = false; } else { ri.ImageNameSuffix = ""; ri.SelectedIndexBottom = 3; ri.HorisontalModules = 3; } if (fi.Flats.Any(x => x.Type.Contains("3NL2")) && (fi.Flats.Count == FlatIndex + 2)) { ri.NextOffsetX = 1; } } if (ri.Type.Contains("3NL2")) { // Флаг предыдущей секции 3NL2 prev3NL2 = true; // Если после ЛЛУ идёт квартира типа 3NL2, то дом L-ориентирован if (FlatIndex == 1) { if (imgHouse != null) { imgHouse.LOrientation = true; } } // Если встретилась повёрнутая секция, то дом не является горизонтально ориентированным // TODO: неясно, для чего было условие, разобраться //if (fi.IsVertical) //{ //} } else { prev3NL2 = false; } FlatIndex++; ImgFlat imgFlat = new ImgFlat(ImagePath, ri.Type + ri.ImageNameSuffix, 0); imgFlat.Width = ri.HorisontalModules + 2; imgFlat.Heigth = 6; // Определение точки вставки квартиры if (ri.SelectedIndexTop > 0 && ri.SelectedIndexBottom > 0 && SelectedDownPrev > 0) { offset = SelectedDownPrev; SelectedDownPrev = 0; } else { offset = SelectedDownPrev - ri.SelectedIndexTop; if (ri.SelectedIndexBottom > 0) { SelectedDownPrev = ri.HorisontalModules + ri.NextOffsetX; } else { SelectedDownPrev = ri.SelectedIndexBottom; } } X = X + offset + ri.CurrentOffsetX; if (X < minX) { minX = X; } imgFlat.CoordX = X; imgSection.Lenght += ri.SelectedIndexBottom; imgSection.ImgFlats.Add(imgFlat); } foreach (ImgFlat imgFlat in imgSection.ImgFlats) { imgFlat.CoordX -= minX; } imgSection.SectionInfo = fi; //imgSection.BmpSectionPath = imgDir + imgName; imgSection.BmpSection = generateOneSection(imgSection); // Сохранение отдельных секций для отладки #if DEBUG string imgName = @"Секция" + SectionIndex + ".png"; string imgDir = @"Section\";// @"C:\Users\fazleevaa\Links\Desktop\RRR" + "\\"; SaveImage(imgSection.BmpSection, imgDir, imgName); #endif return(imgSection); }