// // Loop across all points in FaultInterpretation polylines: // 1. set context to Cube // 2. set attribute value from Cube (the same as for Horizon in main exercise) // private void calcFI(FaultInterpretation fi, SeismicCube cube, ITransaction tr) { // Check for Domain if (cube.Domain != fi.Domain) { return; } // Lock FaultInterpretation for update tr.Lock(fi); FaultProperty fp = findOrCreateFProperty(fi, cube.Template, "Ocean Fault Property", tr); // Set Cube as a context for FaultInterpretation List <FaultInterpretationPolyline> chgdPolylines = new List <FaultInterpretationPolyline>(); IEnumerable <FaultInterpretationPolyline> fiPolylines = fi.GetPolylines(); // Process each poly line and set the context for each point. foreach (FaultInterpretationPolyline poly in fiPolylines) { foreach (FaultInterpretationContextPoint pt in poly) { // Must cast as Context is IDomainObject and can be SeismicLine2D or SeismicCube. pt.Context = (IDomainObject)cube; } chgdPolylines.Add(poly); } fi.SetPolylines(chgdPolylines); // set attribute's values via PointPropertyRecord, the same way as for Horizon Index3 cubeIndex = cube.NumSamplesIJK; foreach (PointPropertyRecord ppr in fp) { ppr.Value = double.NaN; Point3 p = ppr.Geometry; IndexDouble3 ptIndexDbl = cube.IndexAtPosition(p); Index3 seisIndex = ptIndexDbl.ToIndex3(); if (seisIndex.I >= 0 && seisIndex.J >= 0 && seisIndex.I < cubeIndex.I && seisIndex.J < cubeIndex.J) { ITrace trace = cube.GetTrace(seisIndex.I, seisIndex.J); if (seisIndex.K >= 0 && seisIndex.K < cubeIndex.K) { ppr.Value = trace[seisIndex.K]; } } } return; }
// // Check FaultProperty with particular name and template, create if doesn't exist // private FaultProperty findOrCreateFProperty(FaultInterpretation fi, Template t, string Name, ITransaction tr) { FaultProperty fp = fi.FaultProperties.Where(prp => (prp.Name == Name && prp.Template == t)).FirstOrDefault(); if (fp == null) { fp = fi.CreateProperty(t); fp.Name = Name; } else { tr.Lock(fp); } return(fp); }