public List<string> CreateSketch(Section section, Section symmetricSection, CampaignReport campaignReport, List<SteelThicknessGaugingPoint> steelThicknessGaugingPoints, out SortedList<int, List<SteelThicknessGaugingPoint>> pointsPerSketch) { try { if (section == null) { throw new ArgumentNullException("section"); } if (symmetricSection == null) { throw new ArgumentNullException("symmetricSection"); } if (campaignReport == null) { throw new ArgumentNullException("campaignReport"); } int index = 0; pointsPerSketch = new SortedList<int, List<SteelThicknessGaugingPoint>>(); if (!section.SectionType.Name.Equals("Shell") && !section.SectionType.Name.Equals("Longitudinal") && !section.SectionType.Name.Equals("LongitudinalBulkheads") && !symmetricSection.SectionType.Name.Equals("Shell") && !symmetricSection.SectionType.Name.Equals("Longitudinal") && !symmetricSection.SectionType.Name.Equals("LongitudinalBulkheads") ) { return null; } string sectionDrawerCurrentViewModeName = section.SectionDrawer.CurrentViewModeName; section.SectionDrawer.CurrentViewModeName = "SketchFormat"; Vessel vessel = section.Vessel; Document document = vessel.Document as Document; if (!this.sectionThumbnails.ContainsKey(vessel.GUID)) { this.sectionThumbnails.Add(vessel.GUID, new Dictionary<int, Bitmap>()); } if (!this.sectionThumbnails[vessel.GUID].ContainsKey(section.ID)) { this.sectionThumbnails[vessel.GUID].Add(section.ID, null); } if (this.sectionThumbnails[vessel.GUID][section.ID] == null) { CaptionsModel.Instance.SetCaptionPropertySelection("Plate", "IACSSketchDescription", false); section.SectionDrawer.CurrentViewModeName = "Wireframe"; section.SectionDrawer.ConfigureView(this.glPanel, section.GetDefaultView(), true); section.SectionDrawer.UpdateLastCamera(this.glPanel); section.SectionDrawer.DrawAxis = false; bool isWireframeVisible = ViewModesData.Instance.IsVisible(section.SectionDrawer.CurrentViewModeName, "Wireframe"); if (!isWireframeVisible) { ViewModesData.Instance.SetVisibility(section.SectionDrawer.CurrentViewModeName, "Wireframe", true, true); } Bitmap bitmap = section.SectionDrawer.DrawModelImmediateMode(this.glPanel); if (!isWireframeVisible) { ViewModesData.Instance.SetVisibility(section.SectionDrawer.CurrentViewModeName, "Wireframe", false, true); } section.SectionDrawer.DrawAxis = true; this.sectionThumbnails[vessel.GUID][section.ID] = bitmap; section.SectionDrawer.CurrentViewModeName = "SketchFormat"; CaptionsModel.Instance.SetCaptionPropertySelection("Plate", "IACSSketchDescription", true); } Bitmap originalThumbnail = this.sectionThumbnails[vessel.GUID][section.ID]; List<string> bitmaps = new List<string>(); List<SteelThicknessGaugingPoint> sectionSteelThicknessGaugingPoints = new List<SteelThicknessGaugingPoint>(); List<SteelThicknessGaugingPoint> symmetricSteelThicknessGaugingPoints = new List<SteelThicknessGaugingPoint>(); foreach (SteelThicknessGaugingPoint steelThicknessGaugingPoint in steelThicknessGaugingPoints) { if (steelThicknessGaugingPoint.Section.ID == section.ID) { sectionSteelThicknessGaugingPoints.Add(steelThicknessGaugingPoint); } else if (steelThicknessGaugingPoint.Section.ID == symmetricSection.ID) { symmetricSteelThicknessGaugingPoints.Add(steelThicknessGaugingPoint); } } if (sectionSteelThicknessGaugingPoints != null || symmetricSteelThicknessGaugingPoints != null) { #region Old Code //int numberOfSketches = 9; //Point3D minPoint = section.BoundingBox.MinPoint; //Point3D maxPoint = section.BoundingBox.MaxPoint; //double sizeX = maxPoint.X - minPoint.X; //double deltaX = Math.Ceiling(sizeX / numberOfSketches); //Vector3D planeNormal = new Vector3D(1, 0, 0); //for (int i = 0; i < numberOfSketches; i++) //{ // Point3D minPlanePoint = new Point3D(minPoint.X + (i * deltaX), minPoint.Y, minPoint.Z); // Point3D maxPlanePoint = new Point3D(minPoint.X + ((i + 1) * deltaX), minPoint.Y, minPoint.Z); // Plane minPlane = new Plane(planeNormal, minPlanePoint); // Plane maxPlane = new Plane(planeNormal, maxPlanePoint); #endregion SortedList<float, SteelThicknessGaugingPoint> sortedSteelThicknessGaugingPoints = new SortedList<float, SteelThicknessGaugingPoint>(); foreach (SteelThicknessGaugingPoint steelThicknessGaugingPoint in steelThicknessGaugingPoints) { float x = steelThicknessGaugingPoint.PointGeometry.Position.X; while (sortedSteelThicknessGaugingPoints.ContainsKey(x)) { x += (float)Point3D.Epsilon; } sortedSteelThicknessGaugingPoints.Add(x, steelThicknessGaugingPoint); } float minKey = sortedSteelThicknessGaugingPoints.Keys[0]; float maxKey = sortedSteelThicknessGaugingPoints.Keys[sortedSteelThicknessGaugingPoints.Count - 1]; Point3D minPoint = sortedSteelThicknessGaugingPoints[minKey].PointGeometry.Position; Point3D maxPoint = sortedSteelThicknessGaugingPoints[maxKey].PointGeometry.Position; minPoint.Translate(-2 * Point3D.Epsilon, 0, 0); maxPoint.Translate(2 * Point3D.Epsilon, 0, 0); double defaultSketchSize = 40; double sizeX = maxPoint.X - minPoint.X; int numberOfSketches = (int)Math.Floor(sizeX / defaultSketchSize); if (sizeX < defaultSketchSize) { defaultSketchSize = sizeX; numberOfSketches = 1; } else { double mod = sizeX - (numberOfSketches * defaultSketchSize); if (mod > (defaultSketchSize / 2)) { numberOfSketches++; defaultSketchSize -= (mod / numberOfSketches); } else { defaultSketchSize += (mod / numberOfSketches); } } Vector3D planeNormal = new Vector3D(1, 0, 0); for (int i = 0; i < numberOfSketches; i++) { Point3D minPlanePoint = new Point3D(minPoint.X + (i * defaultSketchSize), minPoint.Y, minPoint.Z); Point3D maxPlanePoint = new Point3D(minPoint.X + ((i + 1) * defaultSketchSize), minPoint.Y, minPoint.Z); Plane minPlane = new Plane(planeNormal, minPlanePoint); Plane maxPlane = new Plane(planeNormal, maxPlanePoint); List<SteelThicknessGaugingPoint> sectionGaugingPointsBySketch = (sectionSteelThicknessGaugingPoints != null) ? this.GetPointsBetweenPlanes(sectionSteelThicknessGaugingPoints, minPlane, maxPlane) : null; List<SteelThicknessGaugingPoint> symmetricGaugingPointsBySketch = (symmetricSteelThicknessGaugingPoints != null) ? this.GetPointsBetweenPlanes(symmetricSteelThicknessGaugingPoints, minPlane, maxPlane) : null; if ((sectionGaugingPointsBySketch == null || sectionGaugingPointsBySketch.Count == 0) && (symmetricGaugingPointsBySketch == null || symmetricGaugingPointsBySketch.Count == 0)) { continue; } List<SteelThicknessGaugingPoint> gaugingPointsBySketch = new List<SteelThicknessGaugingPoint>(); if (sectionGaugingPointsBySketch != null && sectionGaugingPointsBySketch.Count > 0) { gaugingPointsBySketch.AddRange(sectionGaugingPointsBySketch); } if (symmetricGaugingPointsBySketch != null && symmetricGaugingPointsBySketch.Count > 0) { gaugingPointsBySketch.AddRange(symmetricGaugingPointsBySketch); } pointsPerSketch.Add(index, gaugingPointsBySketch); index++; #region Compute gauging points in symmetric section List<SteelThicknessGaugingPoint> pointsToBeDeleted = new List<SteelThicknessGaugingPoint>(); if (symmetricGaugingPointsBySketch != null && symmetricGaugingPointsBySketch.Count > 0) { #region Clone gauging points only in SB side, to PS side to be renderized in sketch #region Find center plane parallel to X and Z axis BoundingBox sectionBoundingBox = new BoundingBox(); BoundingBox symmetricBoundingBox = new BoundingBox(); List<Campaign> originalCampaigns = vessel.GetOriginalCampaigns(); foreach (Campaign campaign in originalCampaigns) { IList platesInCampaign = section.GetPermanentElementsInCampaign(campaign, true, "Plate"); if (platesInCampaign != null && platesInCampaign.Count > 0) { foreach (Plate plate in platesInCampaign) { sectionBoundingBox.Union(plate.Design.Geometry.BoundingBox); } } platesInCampaign = symmetricSection.GetPermanentElementsInCampaign(campaign, true, "Plate"); if (platesInCampaign != null && platesInCampaign.Count > 0) { foreach (Plate plate in platesInCampaign) { symmetricBoundingBox.Union(plate.Design.Geometry.BoundingBox); } } } BoundingBox boundingBox = new BoundingBox(sectionBoundingBox); boundingBox.Union(symmetricBoundingBox); Plane plane = new Plane(new Vector3D(0, 1, 0), boundingBox.Center); #endregion SortedList<int, List<SteelThicknessGaugingPoint>> sectionOrganizedGaugingPoints = this.OrganizeIACSGaugingPointsByID(sectionGaugingPointsBySketch); foreach (SteelThicknessGaugingPoint symmetricGaugingPoint in symmetricGaugingPointsBySketch) { if (sectionOrganizedGaugingPoints.ContainsKey((int)symmetricGaugingPoint.IACSReportLocationData.ID)) { bool haveSymmetricPoint = false; foreach (SteelThicknessGaugingPoint symmetricOrganizedGaugingPoint in sectionOrganizedGaugingPoints[(int)symmetricGaugingPoint.IACSReportLocationData.ID]) { if (symmetricOrganizedGaugingPoint.IACSReportLocationData.IsForward == symmetricGaugingPoint.IACSReportLocationData.IsForward) { haveSymmetricPoint = true; break; } } if (haveSymmetricPoint) { continue; } } Point3D pointPosition = new Point3D(symmetricGaugingPoint.PointGeometry.Position); pointPosition = (Point3D)pointPosition.Mirror(plane); Vector3D pointNormal = new Vector3D(symmetricGaugingPoint.PointGeometry.Normal * -1); int geometryID, geometryPartID; List<string> elementTypeNames = new List<string>(); elementTypeNames.Add(symmetricGaugingPoint.TargetElement.GetBaseType().Name); Point3D closestPoint; SectionElement sectionElement = section.PointOverDomainEntity(pointPosition, elementTypeNames, 0.01, out closestPoint, out geometryID, out geometryPartID) as SectionElement; if (sectionElement == null) { continue; } AverageSteelThicknessGaugingPoint averageSteelThicknessGaugingPoint = new AverageSteelThicknessGaugingPoint(); averageSteelThicknessGaugingPoint.PointGeometry.Position = pointPosition; averageSteelThicknessGaugingPoint.PointGeometry.Normal = pointNormal; averageSteelThicknessGaugingPoint.Section = section; averageSteelThicknessGaugingPoint.Campaign = campaignReport.Campaign; averageSteelThicknessGaugingPoint.CampaignReport = campaignReport; averageSteelThicknessGaugingPoint.TargetElement = sectionElement as IWorkableElement; averageSteelThicknessGaugingPoint.TargetElementGeometryID = geometryID; averageSteelThicknessGaugingPoint.TargetElementGeometrySegmentID = geometryPartID; averageSteelThicknessGaugingPoint.TargetElementPart = symmetricGaugingPoint.TargetElementPart; averageSteelThicknessGaugingPoint.Active = true; averageSteelThicknessGaugingPoint.IACSReportLocationData.ID = symmetricGaugingPoint.IACSReportLocationData.ID; averageSteelThicknessGaugingPoint.IACSReportLocationData.SetColumnNull(); averageSteelThicknessGaugingPoint.IACSReportLocationData.Strake = symmetricGaugingPoint.IACSReportLocationData.Strake; averageSteelThicknessGaugingPoint.IACSReportLocationData.IsForward = (bool)symmetricGaugingPoint.IACSReportLocationData.IsForward; averageSteelThicknessGaugingPoint.IACSReportLocationData.IsPortSide = !(bool)symmetricGaugingPoint.IACSReportLocationData.IsPortSide; //#if (DEBUG) //newFrontGaugingPoint.Name = ((bool)newFrontGaugingPoint.IACSReportLocationData.IsForward) ? "F " : "B "; //newFrontGaugingPoint.Name += newFrontGaugingPoint.IACSReportLocationData.ID.ToString(); //newFrontGaugingPoint.Name += ((bool)newFrontGaugingPoint.IACSReportLocationData.IsPortSide) ? " P " : " S "; //#else averageSteelThicknessGaugingPoint.Name = averageSteelThicknessGaugingPoint.IACSReportLocationData.ID.ToString(); //#endif section.AddPermanentDomainEntityToGroup(averageSteelThicknessGaugingPoint, true, false); //section.Vessel.Document.DocumentStateController.BroadcastEntityCreation(this, averageSteelThicknessGaugingPoint); sectionGaugingPointsBySketch.Add(averageSteelThicknessGaugingPoint); pointsToBeDeleted.Add(averageSteelThicknessGaugingPoint); } #endregion } #endregion #region Remove computed gauging points of collections to avoid unnecessary computations int sketchPointsCount = 0; Vector3D sketchNormal = new Vector3D(); if (sectionGaugingPointsBySketch != null) { foreach (SteelThicknessGaugingPoint sectionGaugingPointBySketch in sectionGaugingPointsBySketch) { sketchNormal += sectionGaugingPointBySketch.PointGeometry.Normal; if (sectionSteelThicknessGaugingPoints.Contains(sectionGaugingPointBySketch)) { sectionSteelThicknessGaugingPoints.Remove(sectionGaugingPointBySketch); } } sketchPointsCount += sectionGaugingPointsBySketch.Count; } if (symmetricGaugingPointsBySketch != null) { foreach (SteelThicknessGaugingPoint symmetricGaugingPointBySketch in symmetricGaugingPointsBySketch) { sketchNormal += symmetricGaugingPointBySketch.PointGeometry.Normal; if (symmetricSteelThicknessGaugingPoints.Contains(symmetricGaugingPointBySketch)) { symmetricSteelThicknessGaugingPoints.Remove(symmetricGaugingPointBySketch); } } sketchPointsCount += symmetricGaugingPointsBySketch.Count; } sketchNormal /= sketchPointsCount; sketchNormal.Normalize(); #endregion if (sectionGaugingPointsBySketch.Count > 0) { List<SectionElement> sectionElements = this.GetSectionElementsVisibleInSketch(section, minPlane, maxPlane, sectionGaugingPointsBySketch, sketchNormal); // Generate thumbnail section.SectionDrawer.ConfigureView(this.glPanel, section.GetDefaultView(), true); section.SectionDrawer.UpdateLastCamera(this.glPanel); Bitmap thumbnail = new Bitmap(originalThumbnail, originalThumbnail.Width, originalThumbnail.Height); Rectangle rectangle = this.GetRectangleOfRenderizedArea(sectionElements); for (int j = 0; j < thumbnail.Width; j++) { for (int k = 0; k < thumbnail.Height; k++) { if (this.IsPixelOfRectangle(j, k, rectangle, 3)) { thumbnail.SetPixel(j, k, Color.Red); } } } string thumbName = thumbnail.RawFormat.Guid.ToString() + "-" + this.bitmapCount.ToString() + ".jpg"; this.bitmapCount++; thumbName = document.HDF5DataAccessController.SaveBitmap(thumbnail, thumbName); bitmaps.Add(thumbName); C4DView view = section.SectionDrawer.ComputeViewForSectionElements(this.glPanel, sectionElements, false, 1.2f, true); if (view == null) { view = section.GetDefaultView(); } section.SectionDrawer.ConfigureView(this.glPanel, view, false); section.SectionDrawer.UpdateLastCamera(this.glPanel); List<int> gaugingPointIDs = new List<int>(); foreach (SteelThicknessGaugingPoint steelThicknessGaugingPoint in sectionGaugingPointsBySketch) { gaugingPointIDs.Add(steelThicknessGaugingPoint.ID); } section.SectionDrawer.SetPriorityVisibleElements("SteelThicknessGaugingPoint", gaugingPointIDs); Bitmap bitmap = section.SectionDrawer.DrawModelImmediateModeCuttingOfCompartment(this.glPanel); section.SectionDrawer.ClearPriorityVisibleElements("SteelThicknessGaugingPoint"); string bitmapName = bitmap.RawFormat.Guid.ToString() + "-" + this.bitmapCount.ToString() + ".jpg"; this.bitmapCount++; bitmapName = document.HDF5DataAccessController.SaveBitmap(bitmap, bitmapName); bitmaps.Add(bitmapName); bitmap.Dispose(); } foreach (SteelThicknessGaugingPoint pointToBeDeleted in pointsToBeDeleted) { document.DeleteSectionElement(pointToBeDeleted, false); } } } section.SectionDrawer.CurrentViewModeName = sectionDrawerCurrentViewModeName; return bitmaps; } catch (Exception ex) { throw new ApplicationException("Sketch for section/campaign report cannot be created!", ex); } }
public List<string> CreateSketch(Section section, CampaignReport campaignReport, List<SteelThicknessGaugingPoint> steelThicknessGaugingPoints, out SortedList<int, List<SteelThicknessGaugingPoint>> pointsPerSketch) { try { if (section == null) { throw new ArgumentNullException("section"); } if (campaignReport == null) { throw new ArgumentNullException("campaignReport"); } int index = 0; pointsPerSketch = new SortedList<int, List<SteelThicknessGaugingPoint>>(); SortedList<string, IList> elementsInCampaign = section.GetPermanentElementsInCampaignReport(campaignReport); if (!elementsInCampaign.ContainsKey("SteelThicknessGaugingPoint") || elementsInCampaign["SteelThicknessGaugingPoint"].Count == 0) { return null; } Document document = campaignReport.Vessel.Document as Document; Vessel vessel = document.Vessel; List<string> bitmaps = new List<string>(); string sectionDrawerCurrentViewModeName = section.SectionDrawer.CurrentViewModeName; section.SectionDrawer.CurrentViewModeName = "SketchFormat"; if (!this.sectionThumbnails.ContainsKey(vessel.GUID)) { this.sectionThumbnails.Add(vessel.GUID, new Dictionary<int, Bitmap>()); } if (!this.sectionThumbnails[vessel.GUID].ContainsKey(section.ID)) { this.sectionThumbnails[vessel.GUID].Add(section.ID, null); } if (this.sectionThumbnails[vessel.GUID][section.ID] == null) { CaptionsModel.Instance.SetCaptionPropertySelection("Plate", "IACSSketchDescription", false); section.SectionDrawer.CurrentViewModeName = "Wireframe"; section.SectionDrawer.ConfigureView(this.glPanel, section.GetDefaultView(), true); section.SectionDrawer.UpdateLastCamera(this.glPanel); section.SectionDrawer.DrawAxis = false; bool isWireframeVisible = ViewModesData.Instance.IsVisible(section.SectionDrawer.CurrentViewModeName, "Wireframe"); if (!isWireframeVisible) { ViewModesData.Instance.SetVisibility(section.SectionDrawer.CurrentViewModeName, "Wireframe", true, true); } Bitmap bitmap = section.SectionDrawer.DrawModelImmediateMode(this.glPanel); if (!isWireframeVisible) { ViewModesData.Instance.SetVisibility(section.SectionDrawer.CurrentViewModeName, "Wireframe", false, true); } section.SectionDrawer.DrawAxis = true; this.sectionThumbnails[vessel.GUID][section.ID] = bitmap; section.SectionDrawer.CurrentViewModeName = "SketchFormat"; CaptionsModel.Instance.SetCaptionPropertySelection("Plate", "IACSSketchDescription", true); } Bitmap originalThumbnail = this.sectionThumbnails[vessel.GUID][section.ID]; if (section.SectionType.Name.Equals("WebFrames") || section.SectionType.Name.Equals("TransverseBulkheads") || section.SectionType.Name.Equals("TransverseCentralBulkheads") || section.SectionType.Name.Equals("SwashBulkheads") ) { #region Non Longitudinal pointsPerSketch.Add(index, steelThicknessGaugingPoints); index++; BoundingBox boundingBox = section.GetBoundingBoxOfElementType("Plate"); Vector3D planeNormal = section.Normal * section.Up; Point3D planePoint = boundingBox.Center; Plane plane = new Plane(planeNormal, planePoint); List<SteelThicknessGaugingPoint> backGaugingPoints = null; List<SteelThicknessGaugingPoint> frontGaugingPoints = null; this.averageGaugingsCreator.SeparateGaugingPoints(steelThicknessGaugingPoints, plane, out backGaugingPoints, out frontGaugingPoints); SortedList<int, List<SteelThicknessGaugingPoint>> backOrganizedGaugingPoints = this.OrganizeIACSGaugingPointsByID(backGaugingPoints); SortedList<int, List<SteelThicknessGaugingPoint>> frontOrganizedGaugingPoints = this.OrganizeIACSGaugingPointsByID(frontGaugingPoints); #region Clone gauging points that only exists in source side, and copy to target side List<SteelThicknessGaugingPoint> pointsToBeDeleted = new List<SteelThicknessGaugingPoint>(); List<SteelThicknessGaugingPoint> sourceGaugingPoints = (backGaugingPoints.Count < frontGaugingPoints.Count) ? backGaugingPoints : frontGaugingPoints; List<SteelThicknessGaugingPoint> targetGaugingPoints = (backGaugingPoints.Count < frontGaugingPoints.Count) ? frontGaugingPoints : backGaugingPoints; List<int> sourceGaugingPointsIACSID = (backGaugingPoints.Count < frontGaugingPoints.Count) ? new List<int>(backOrganizedGaugingPoints.Keys) : new List<int>(frontOrganizedGaugingPoints.Keys); List<int> targetGaugingPointsIACSID = (backGaugingPoints.Count < frontGaugingPoints.Count) ? new List<int>(frontOrganizedGaugingPoints.Keys) : new List<int>(backOrganizedGaugingPoints.Keys); foreach (SteelThicknessGaugingPoint sourceGaugingPoint in sourceGaugingPoints) { if (targetGaugingPointsIACSID.Contains((int)sourceGaugingPoint.IACSReportLocationData.ID)) { continue; } Point3D pointPosition = new Point3D(sourceGaugingPoint.PointGeometry.Position); pointPosition = (Point3D)pointPosition.Mirror(plane); Vector3D pointNormal = new Vector3D(sourceGaugingPoint.PointGeometry.Normal); int geometryID, geometryPartID; List<string> elementTypeNames = new List<string>(); elementTypeNames.Add(sourceGaugingPoint.TargetElement.GetBaseType().Name); Point3D closestPoint; SectionElement sectionElement = section.PointOverDomainEntity(pointPosition, elementTypeNames, 0.01, out closestPoint, out geometryID, out geometryPartID) as SectionElement; if (sectionElement == null) { continue; } AverageSteelThicknessGaugingPoint averageSteelThicknessGaugingPoint = new AverageSteelThicknessGaugingPoint(); averageSteelThicknessGaugingPoint.PointGeometry.Position = pointPosition; averageSteelThicknessGaugingPoint.PointGeometry.Normal = pointNormal; averageSteelThicknessGaugingPoint.Section = section; averageSteelThicknessGaugingPoint.Campaign = campaignReport.Campaign; averageSteelThicknessGaugingPoint.CampaignReport = campaignReport; averageSteelThicknessGaugingPoint.TargetElement = sectionElement as IWorkableElement; averageSteelThicknessGaugingPoint.TargetElementGeometryID = geometryID; averageSteelThicknessGaugingPoint.TargetElementGeometrySegmentID = geometryPartID; averageSteelThicknessGaugingPoint.TargetElementPart = sourceGaugingPoint.TargetElementPart; averageSteelThicknessGaugingPoint.Active = true; averageSteelThicknessGaugingPoint.GaugingValue = sourceGaugingPoint.GaugingValue; averageSteelThicknessGaugingPoint.IACSReportLocationData.ID = sourceGaugingPoint.IACSReportLocationData.ID; averageSteelThicknessGaugingPoint.IACSReportLocationData.SetColumnNull(); averageSteelThicknessGaugingPoint.IACSReportLocationData.Strake = sourceGaugingPoint.IACSReportLocationData.Strake; averageSteelThicknessGaugingPoint.IACSReportLocationData.IsPortSide = !(bool)sourceGaugingPoint.IACSReportLocationData.IsPortSide; averageSteelThicknessGaugingPoint.Name = averageSteelThicknessGaugingPoint.IACSReportLocationData.ID.ToString(); //#if (DEBUG) // newFrontGaugingPoint.Name += ((bool)newFrontGaugingPoint.IACSReportLocationData.IsPortSide) ? " P " : " S "; //#endif section.AddPermanentDomainEntityToGroup(averageSteelThicknessGaugingPoint, true, false); //section.Vessel.Document.DocumentStateController.BroadcastEntityCreation(this, averageSteelThicknessGaugingPoint); targetGaugingPoints.Add(averageSteelThicknessGaugingPoint); pointsToBeDeleted.Add(averageSteelThicknessGaugingPoint); } #endregion List<SectionElement> sectionElements = this.GetSectionElementsVisibleInSketch(section, targetGaugingPoints); // Generate thumbnail Bitmap thumbnail = originalThumbnail.Clone() as Bitmap; Rectangle rectangle = this.GetRectangleOfRenderizedArea(sectionElements); for (int i = 0; i < thumbnail.Width; i++) { for (int j = 0; j < thumbnail.Height; j++) { if (this.IsPixelOfRectangle(i, j, rectangle, 3)) { thumbnail.SetPixel(i, j, Color.Red); } } } //int newWidht = (int)(thumbnail.Width / 5); //int newHeight = (int)(thumbnail.Height / 5); //Image image = thumbnail.GetThumbnailImage(newWidht, newHeight, null, IntPtr.Zero); //thumbnail = new Bitmap(image); string thumbName = thumbnail.RawFormat.Guid.ToString() + "-" + this.bitmapCount.ToString() + ".jpg"; this.bitmapCount++; thumbName = document.HDF5DataAccessController.SaveBitmap(thumbnail, thumbName); bitmaps.Add(thumbName); //section.SectionDrawer.CurrentViewModeName = "SketchFormat"; C4DView view = section.SectionDrawer.ComputeViewForSectionElements(this.glPanel, sectionElements, false, 1.2f, true); if (view == null) { view = section.GetDefaultView(); } section.SectionDrawer.ConfigureView(this.glPanel, view, false); section.SectionDrawer.UpdateLastCamera(this.glPanel); // Get IDs of gauging points to set in SectionDrawer List<int> pointIDs = new List<int>(); foreach (SteelThicknessGaugingPoint steelThicknessGaugingPoint in targetGaugingPoints) { pointIDs.Add(steelThicknessGaugingPoint.ID); } section.SectionDrawer.SetPriorityVisibleElements("SteelThicknessGaugingPoint", pointIDs); Bitmap bitmap = section.SectionDrawer.DrawModelImmediateModeCuttingOfCompartment(this.glPanel); section.SectionDrawer.ClearPriorityVisibleElements("SteelThicknessGaugingPoint"); string bitmapName = bitmap.RawFormat.Guid.ToString() + "-" + this.bitmapCount.ToString() + ".jpg"; this.bitmapCount++; bitmapName = document.HDF5DataAccessController.SaveBitmap(bitmap, bitmapName); bitmaps.Add(bitmapName); bitmap.Dispose(); foreach (SteelThicknessGaugingPoint pointToBeDeleted in pointsToBeDeleted) { document.DeleteSectionElement(pointToBeDeleted, false); } #endregion } else if (section.SectionType.Name.Equals("MainDeck") || section.SectionType.Name.Equals("OtherDecks") || section.SectionType.Name.Equals("InnerBottom") || section.SectionType.Name.Equals("Bottom") ) { #region Decks and Inner Bottom #region Old Code //// Get plates in campaigns of construction or in campaigns of conversion //SortedList<int, Plate> originalPlates = new SortedList<int, Plate>(); //List<Campaign> originalCampaigns = vessel.GetOriginalCampaigns(); //foreach (Campaign campaign in originalCampaigns) //{ // SortedList<string, IList> platesInCampaign = section.GetElementsInCampaign(campaign, true, "Plate"); // if (platesInCampaign.ContainsKey("Plate")) // { // List<Plate> platesInCampaignList = platesInCampaign["Plate"].Cast<Plate>().ToList(); // foreach (Plate plate in platesInCampaignList) // { // originalPlates.Add(plate.ID, plate); // } // } //} //// Get plates in center column //Plane centerPlaneYZ = new Plane(new Vector3D(1, 0, 0), section.BoundingBox.Center); //SortedList<int, Plate> intersectedPlatesYZ = this.IntersectPlates(originalPlates, centerPlaneYZ); //// Get bounding box of plates in center column //BoundingBox boundingBox = new BoundingBox(); //foreach (Plate plate in intersectedPlatesYZ.Values) //{ // boundingBox.Union(plate.Design.Geometry.BoundingBox); //} //Plane centerPlaneXZ = new Plane(new Vector3D(0, 1, 0), boundingBox.Center); //Vector3D xAxis = new Vector3D(1, 0, 0); //SortedList<double, Compartment> sortedCompartments = this.IntersectCompartments(section, centerPlaneXZ); //foreach (Compartment compartment in sortedCompartments.Values) //{ // Plane minPlane = new Plane(xAxis, compartment.BoundingBox.MinPoint); // Plane maxPlane = new Plane(xAxis, compartment.BoundingBox.MaxPoint); // List<SteelThicknessGaugingPoint> pointsBetweenPlanes = this.GetPointsBetweenPlanes(steelThicknessGaugingPoints, minPlane, maxPlane); #endregion SortedList<float, SteelThicknessGaugingPoint> sortedSteelThicknessGaugingPoints = new SortedList<float, SteelThicknessGaugingPoint>(); foreach (SteelThicknessGaugingPoint steelThicknessGaugingPoint in steelThicknessGaugingPoints) { float x = steelThicknessGaugingPoint.PointGeometry.Position.X; while (sortedSteelThicknessGaugingPoints.ContainsKey(x)) { x += (float)Point3D.Epsilon; } sortedSteelThicknessGaugingPoints.Add(x, steelThicknessGaugingPoint); } float minKey = sortedSteelThicknessGaugingPoints.Keys[0]; float maxKey = sortedSteelThicknessGaugingPoints.Keys[sortedSteelThicknessGaugingPoints.Count - 1]; Point3D minPoint = sortedSteelThicknessGaugingPoints[minKey].PointGeometry.Position; Point3D maxPoint = sortedSteelThicknessGaugingPoints[maxKey].PointGeometry.Position; minPoint.Translate(-2 * Point3D.Epsilon, 0, 0); maxPoint.Translate(2 * Point3D.Epsilon, 0, 0); double defaultSketchSize = 40; double sizeX = maxPoint.X - minPoint.X; int numberOfSketches = (int)Math.Floor(sizeX / defaultSketchSize); if (sizeX < defaultSketchSize) { defaultSketchSize = sizeX; numberOfSketches = 1; } else { double mod = sizeX - (numberOfSketches * defaultSketchSize); if (mod > (defaultSketchSize / 2)) { numberOfSketches++; defaultSketchSize -= (mod / numberOfSketches); } else { defaultSketchSize += (mod / numberOfSketches); } } Vector3D planeNormal = new Vector3D(1, 0, 0); for (int i = 0; i < numberOfSketches; i++) { Point3D minPlanePoint = new Point3D(minPoint.X + (i * defaultSketchSize), minPoint.Y, minPoint.Z); Point3D maxPlanePoint = new Point3D(minPoint.X + ((i + 1) * defaultSketchSize), minPoint.Y, minPoint.Z); Plane minPlane = new Plane(planeNormal, minPlanePoint); Plane maxPlane = new Plane(planeNormal, maxPlanePoint); List<SteelThicknessGaugingPoint> pointsBetweenPlanes = this.GetPointsBetweenPlanes(steelThicknessGaugingPoints, minPlane, maxPlane); if (pointsBetweenPlanes == null || pointsBetweenPlanes.Count == 0) { continue; } pointsPerSketch.Add(index, pointsBetweenPlanes); index++; foreach (SteelThicknessGaugingPoint pointBetweenPlane in pointsBetweenPlanes) { if (steelThicknessGaugingPoints.Contains(pointBetweenPlane)) { steelThicknessGaugingPoints.Remove(pointBetweenPlane); } } //List<SectionElement> sectionElements = this.GetSectionElementsVisibleInSketch(section, compartment); List<SectionElement> sectionElements = this.GetSectionElementsVisibleInSketch(section, minPlane, maxPlane); // Generate thumbnail section.SectionDrawer.ConfigureView(this.glPanel, section.GetDefaultView(), true); section.SectionDrawer.UpdateLastCamera(this.glPanel); Bitmap thumbnail = originalThumbnail.Clone() as Bitmap; Rectangle rectangle = this.GetRectangleOfRenderizedArea(sectionElements); for (int j = 0; j < thumbnail.Width; j++) { for (int k = 0; k < thumbnail.Height; k++) { if (this.IsPixelOfRectangle(j, k, rectangle, 3)) { thumbnail.SetPixel(j, k, Color.Red); } } } //int newWidht = (int)(thumbnail.Width / 5); //int newHeight = (int)(thumbnail.Height / 5); //Image image = thumbnail.GetThumbnailImage(newWidht, newHeight, null, IntPtr.Zero); //thumbnail = new Bitmap(image); string thumbName = thumbnail.RawFormat.Guid.ToString() + "-" + this.bitmapCount.ToString() + ".jpg"; this.bitmapCount++; thumbName = document.HDF5DataAccessController.SaveBitmap(thumbnail, thumbName); bitmaps.Add(thumbName); C4DView view = section.SectionDrawer.ComputeViewForSectionElements(this.glPanel, sectionElements, false, 1.2f, true); if (view == null) { view = section.GetDefaultView(); } section.SectionDrawer.ConfigureView(this.glPanel, view, false); section.SectionDrawer.UpdateLastCamera(this.glPanel); List<int> pointIDs = new List<int>(); foreach (SteelThicknessGaugingPoint steelThicknessGaugingPoint in pointsBetweenPlanes) { pointIDs.Add(steelThicknessGaugingPoint.ID); } section.SectionDrawer.SetPriorityVisibleElements("SteelThicknessGaugingPoint", pointIDs); Bitmap bitmap = section.SectionDrawer.DrawModelImmediateModeCuttingOfCompartment(this.glPanel); section.SectionDrawer.ClearPriorityVisibleElements("SteelThicknessGaugingPoint"); string bitmapName = bitmap.RawFormat.Guid.ToString() + "-" + this.bitmapCount.ToString() + ".jpg"; this.bitmapCount++; bitmapName = document.HDF5DataAccessController.SaveBitmap(bitmap, bitmapName); bitmaps.Add(bitmapName); bitmap.Dispose(); } #endregion } else if (section.SectionType.Name.Equals("Shell") || section.SectionType.Name.Equals("Longitudinal") || section.SectionType.Name.Equals("LongitudinalBulkheads") || section.SectionType.Name.Equals("LongitudinalCentralBulkheads") ) { #region Symmetric Longitudinal #region Old Code //int numberOfSketches = 9; //BoundingBox sectionBoundingBox = section.GetBoundingBoxOfElementType("Plate"); //Point3D minPoint = sectionBoundingBox.MinPoint; //Point3D maxPoint = sectionBoundingBox.MaxPoint; //double sizeX = maxPoint.X - minPoint.X; //double deltaX = Math.Ceiling(sizeX / numberOfSketches); //Vector3D planeNormal = new Vector3D(1, 0, 0); //for (int i = 0; i < numberOfSketches; i++) //{ // Point3D minPlanePoint = new Point3D(minPoint.X + (i * deltaX), minPoint.Y, minPoint.Z); // Point3D maxPlanePoint = new Point3D(minPoint.X + ((i + 1) * deltaX), minPoint.Y, minPoint.Z); // Plane minPlane = new Plane(planeNormal, minPlanePoint); // Plane maxPlane = new Plane(planeNormal, maxPlanePoint); #endregion SortedList<float, SteelThicknessGaugingPoint> sortedSteelThicknessGaugingPoints = new SortedList<float, SteelThicknessGaugingPoint>(); foreach (SteelThicknessGaugingPoint steelThicknessGaugingPoint in steelThicknessGaugingPoints) { float x = steelThicknessGaugingPoint.PointGeometry.Position.X; while (sortedSteelThicknessGaugingPoints.ContainsKey(x)) { x += (float)Point3D.Epsilon; } sortedSteelThicknessGaugingPoints.Add(x, steelThicknessGaugingPoint); } float minKey = sortedSteelThicknessGaugingPoints.Keys[0]; float maxKey = sortedSteelThicknessGaugingPoints.Keys[sortedSteelThicknessGaugingPoints.Count - 1]; Point3D minPoint = sortedSteelThicknessGaugingPoints[minKey].PointGeometry.Position; Point3D maxPoint = sortedSteelThicknessGaugingPoints[maxKey].PointGeometry.Position; minPoint.Translate(-2 * Point3D.Epsilon, 0, 0); maxPoint.Translate(2 * Point3D.Epsilon, 0, 0); double defaultSketchSize = 40; double sizeX = maxPoint.X - minPoint.X; int numberOfSketches = (int)Math.Floor(sizeX / defaultSketchSize); if (sizeX < defaultSketchSize) { defaultSketchSize = sizeX; numberOfSketches = 1; } else { double mod = sizeX - (numberOfSketches * defaultSketchSize); if (mod > (defaultSketchSize / 2)) { numberOfSketches++; defaultSketchSize -= (mod / numberOfSketches); } else { defaultSketchSize += (mod / numberOfSketches); } } Vector3D planeNormal = new Vector3D(1, 0, 0); for (int i = 0; i < numberOfSketches; i++) { Point3D minPlanePoint = new Point3D(minPoint.X + (i * defaultSketchSize), minPoint.Y, minPoint.Z); Point3D maxPlanePoint = new Point3D(minPoint.X + ((i + 1) * defaultSketchSize), minPoint.Y, minPoint.Z); Plane minPlane = new Plane(planeNormal, minPlanePoint); Plane maxPlane = new Plane(planeNormal, maxPlanePoint); List<SteelThicknessGaugingPoint> gaugingPointsBySketch = this.GetPointsBetweenPlanes(steelThicknessGaugingPoints, minPlane, maxPlane); if (gaugingPointsBySketch == null || gaugingPointsBySketch.Count == 0) { continue; } pointsPerSketch.Add(index, gaugingPointsBySketch); index++; Vector3D sketchNormal = new Vector3D(); foreach (SteelThicknessGaugingPoint gaugingPointBySketch in gaugingPointsBySketch) { sketchNormal += gaugingPointBySketch.PointGeometry.Normal; if (steelThicknessGaugingPoints.Contains(gaugingPointBySketch)) { steelThicknessGaugingPoints.Remove(gaugingPointBySketch); } } sketchNormal /= gaugingPointsBySketch.Count; sketchNormal.Normalize(); List<SectionElement> sectionElements = this.GetSectionElementsVisibleInSketch(section, minPlane, maxPlane, gaugingPointsBySketch, sketchNormal); // Generate thumbnail section.SectionDrawer.ConfigureView(this.glPanel, section.GetDefaultView(), true); section.SectionDrawer.UpdateLastCamera(this.glPanel); Bitmap thumbnail = originalThumbnail.Clone() as Bitmap; Rectangle rectangle = this.GetRectangleOfRenderizedArea(sectionElements); for (int j = 0; j < thumbnail.Width; j++) { for (int k = 0; k < thumbnail.Height; k++) { if (this.IsPixelOfRectangle(j, k, rectangle, 3)) { thumbnail.SetPixel(j, k, Color.Red); } } } string thumbName = thumbnail.RawFormat.Guid.ToString() + "-" + this.bitmapCount.ToString() + ".jpg"; this.bitmapCount++; thumbName = document.HDF5DataAccessController.SaveBitmap(thumbnail, thumbName); bitmaps.Add(thumbName); C4DView view = section.SectionDrawer.ComputeViewForSectionElements(this.glPanel, sectionElements, false, 1.2f, true); if (view == null) { view = section.GetDefaultView(); } section.SectionDrawer.ConfigureView(this.glPanel, view, false); section.SectionDrawer.UpdateLastCamera(this.glPanel); List<int> pointIDs = new List<int>(); foreach (SteelThicknessGaugingPoint steelThicknessGaugingPoint in gaugingPointsBySketch) { pointIDs.Add(steelThicknessGaugingPoint.ID); } section.SectionDrawer.SetPriorityVisibleElements("SteelThicknessGaugingPoint", pointIDs); Bitmap bitmap = section.SectionDrawer.DrawModelImmediateModeCuttingOfCompartment(this.glPanel); section.SectionDrawer.ClearPriorityVisibleElements("SteelThicknessGaugingPoint"); string bitmapName = bitmap.RawFormat.Guid.ToString() + "-" + this.bitmapCount.ToString() + ".jpg"; this.bitmapCount++; bitmapName = document.HDF5DataAccessController.SaveBitmap(bitmap, bitmapName); bitmaps.Add(bitmapName); bitmap.Dispose(); } #endregion } else if (section.SectionType.Name.Equals("AnyOtherSection")) { #region Any Other Section pointsPerSketch.Add(index, steelThicknessGaugingPoints); index++; List<SectionElement> sectionElements = this.GetSectionElementsVisibleInSketch(section, steelThicknessGaugingPoints); Bitmap thumbnail = originalThumbnail.Clone() as Bitmap; Rectangle rectangle = this.GetRectangleOfRenderizedArea(sectionElements); for (int i = 0; i < thumbnail.Width; i++) { for (int j = 0; j < thumbnail.Height; j++) { if (this.IsPixelOfRectangle(i, j, rectangle, 3)) { thumbnail.SetPixel(i, j, Color.Red); } } } //int newWidht = (int)(thumbnail.Width / 5); //int newHeight = (int)(thumbnail.Height / 5); //Image image = thumbnail.GetThumbnailImage(newWidht, newHeight, null, IntPtr.Zero); //thumbnail = new Bitmap(image); string thumbName = thumbnail.RawFormat.Guid.ToString() + "-" + this.bitmapCount.ToString() + ".jpg"; this.bitmapCount++; thumbName = document.HDF5DataAccessController.SaveBitmap(thumbnail, thumbName); bitmaps.Add(thumbName); //section.SectionDrawer.CurrentViewModeName = "SketchFormat"; C4DView view = section.SectionDrawer.ComputeViewForSectionElements(this.glPanel, sectionElements, false); if (view == null) { view = section.GetDefaultView(); } section.SectionDrawer.ConfigureView(this.glPanel, view, false); section.SectionDrawer.UpdateLastCamera(this.glPanel); // Get IDs of gauging points to set in SectionDrawer List<int> pointIDs = new List<int>(); foreach (SteelThicknessGaugingPoint steelThicknessGaugingPoint in steelThicknessGaugingPoints) { pointIDs.Add(steelThicknessGaugingPoint.ID); } section.SectionDrawer.SetPriorityVisibleElements("SteelThicknessGaugingPoint", pointIDs); Bitmap bitmap = section.SectionDrawer.DrawModelImmediateModeCuttingOfCompartment(this.glPanel); section.SectionDrawer.ClearPriorityVisibleElements("SteelThicknessGaugingPoint"); string bitmapName = bitmap.RawFormat.Guid.ToString() + "-" + this.bitmapCount.ToString() + ".jpg"; this.bitmapCount++; bitmapName = document.HDF5DataAccessController.SaveBitmap(bitmap, bitmapName); bitmaps.Add(bitmapName); bitmap.Dispose(); #endregion } section.SectionDrawer.CurrentViewModeName = sectionDrawerCurrentViewModeName; return bitmaps; } catch (Exception ex) { throw new ApplicationException("Sketch for section/campaign report cannot be created!", ex); } }