public override void ExecuteSimple() { /* PetrelLogger.InfoOutputWindow(string.Format("Well Log: {0},Grid: {1}", * arguments.NovozhentsevWellLog.Name, * arguments.NovozhentsevGrid.Name)); * PetrelLogger.InfoOutputWindow("Runtime contex: "+ context.GetType().FullName * );*/ Property prop = null; int count = 0; // все действия по изменению данных строго внутри транзакции using (ITransaction trans = DataManager.NewTransaction())//объект удалением которого будет с# { // запрашиваем исключительный доступ к свойствам сетки trans.Lock(arguments.NovozhentsevGrid.PropertyCollection);//подождать пока // создаем новое свойство и задаем его имя prop = arguments.NovozhentsevGrid.PropertyCollection.CreateProperty(arguments.NovozhentsevWellLog.WellLogVersion.Template); prop.Name = string.Format("{0} ({1}) upscaled", arguments.NovozhentsevWellLog.Name, arguments.NovozhentsevWellLog.Borehole.Description.Name); arguments.NovozhentsevResultProperty = prop; // получаем перечислитель замеров каротажки в явном виде IEnumerator <WellLogSample> enumSamples = arguments.NovozhentsevWellLog.Samples.GetEnumerator(); //<> generic type тип элемента коллекции нумератор которой имеет этот тип,итератор // получаем доступ к штатному сервису Petrel: IPillarGridIntersectionService pgIntersection = CoreSystem.GetService <IPillarGridIntersectionService>(); //статический метод пиллар- пилоны -вид сетки // получаем траекторию скважины в виде линии и запрашиваем список пересечений этой линии с ячейками сетки IPolyline3 polyline = arguments.NovozhentsevWellLog.Borehole.Trajectory.Polyline; // IEnumerable <SegmentCellIntersection> intersectionsegments = pgIntersection.GetPillarGridPolylineIntersections(arguments.NovozhentsevGrid, polyline); //набор пересечений полилайна с сеткой грида/коллекция // проходим в цикле по найденным точкам пересечения SegmentCellIntersection enteringSegment = new SegmentCellIntersection(); SegmentCellIntersection leavingSegment; double enteringMD = double.NaN;//measure depth, true vertical depth double leavingMD = double.NaN; bool FirstTime = true; foreach (SegmentCellIntersection segment in intersectionsegments) { // на первой итерации нужно только инициализировать внутренние переменные if (FirstTime) { FirstTime = false; enteringSegment = segment; enteringMD = arguments.NovozhentsevWellLog.Borehole.Transform(arguments.NovozhentsevGrid.Domain, segment.IntersectionPoint.Z, Domain.MD);//домен - система координат, отсчета // проматываем цикл по замерам, пока не дойдем до нужной глубины while (enumSamples.MoveNext()) { if (enumSamples.Current.MD >= enteringMD) { break; } } continue; } leavingSegment = segment; // находим измеренные глубины точек пересечения вдоль ствола скважины enteringMD = arguments.NovozhentsevWellLog.Borehole.Transform(arguments.NovozhentsevGrid.Domain, enteringSegment.IntersectionPoint.Z, Domain.MD); leavingMD = arguments.NovozhentsevWellLog.Borehole.Transform(arguments.NovozhentsevGrid.Domain, leavingSegment.IntersectionPoint.Z, Domain.MD); // находим индекс ячейки Index3 cellIndex = enteringSegment.EnteringCell; float avg = float.NaN; // если текущее значение глубины замера внутри текущей ячейки if (enumSamples.Current.MD <= leavingMD) { int numSamples = 1; float total = enumSamples.Current.Value; // вручную проматываем замеры каротажной кривой в этой ячейке while (enumSamples.MoveNext()) { if (enumSamples.Current.MD <= leavingMD) { numSamples++; total += enumSamples.Current.Value; } else { break; } } // теперь вычисляем усредненное значение свойства avg = (float)(total / numSamples); PetrelLogger.InfoOutputWindow(string.Format("сell= {0}, value={1} ({2})", cellIndex.ToString(), avg, prop.Description.Name)); prop[cellIndex] = avg; count++; enteringSegment = leavingSegment; } // и записываем его в новое свойство сетки } // если проблем нет, следующая строчка создаст наше свойство arguments.NovozhentsevNumCells = count; trans.Commit(); } // TODO: Implement the workstep logic here. }
private static void AddingWellGridIntersectionCellIndices(IPillarGridIntersectionService pgiservice, Grid gridInContext, IPolyline3 pline, List<Index3> ListOfIntersectingGridCells) { IEnumerable<SegmentCellIntersection> intersectionSegments; intersectionSegments = pgiservice.GetPillarGridPolylineIntersections(gridInContext, pline); if (intersectionSegments != null) { foreach (SegmentCellIntersection sci in intersectionSegments) { Index3 indx3 = sci.EnteringCell; if (indx3 != null) { ListOfIntersectingGridCells.Add(indx3); } else { indx3 = sci.LeavingCell; ListOfIntersectingGridCells.Add(indx3); } } } else { IEnumerator<Point3> Point3Enumerator = pline.GetEnumerator(); while (Point3Enumerator.MoveNext()) { Index3 indx3 = gridInContext.GetCellAtPoint(Point3Enumerator.Current); break; } } }