public override void ExecuteSimple() { // TODO: Implement the workstep logic here. SeismicCube cube = arguments.Cube; SeismicCollection sc = cube.SeismicCollection; SeismicProject proj = null; SeismicRoot sroot; sroot = SeismicRoot.Get(PetrelProject.PrimaryProject); if (!sroot.HasSeismicProject) { return; } proj = sroot.SeismicProject; using (ITransaction t = DataManager.NewTransaction()) { t.Lock(proj); InterpretationCollection aaa = proj.CreateInterpretationCollection("aaa"); HorizonInterpretation h = aaa.CreateHorizonInterpretation("surface", cube.Domain); HorizonInterpretation3D h3d = h.CreateHorizonInterpretation3D(sc); List <HorizonInterpretation3DSample> horizonsamples = new List <HorizonInterpretation3DSample>(); for (int i = 0; i < cube.NumSamplesIJK.I; i++) { for (int j = 0; j < cube.NumSamplesIJK.J; j++) { horizonsamples.Add(new HorizonInterpretation3DSample(i, j, -2000)); } } h3d.Samples = horizonsamples; t.Commit(); } }
public override void Execute(Slb.Ocean.Petrel.Contexts.Context context) { foreach (object obj in context.GetSelectedObjects()) { PetrelLogger.InfoOutputWindow("Object type: " + obj.GetType().ToString()); PetrelLogger.InfoOutputWindow("Ocean Object type: " + GetPublicDomainObjectTypeName(obj)); //测试3d cube下的虚拟地震属性和3d cube的差别,用反射扫描所有属性 foreach (System.Reflection.PropertyInfo p in obj.GetType().GetProperties()) { PetrelLogger.InfoOutputWindow(p.Name + " Value//" + p.GetValue(obj)); } //return; //测试通过线道号读取地震解释 //HorizonInterpretation hi=new HorizonInterpretation(); //测试三维地震体线道号 20200306 SeismicRoot sr = SeismicRoot.Get(PetrelProject.PrimaryProject); /* * SeismicCollection sc = new SeismicCollection(); * SeismicCube scube = new SeismicCube(); * scube.AnnotationAtIndex(0,0,0).I- scube.AnnotationAtIndex(1, 0, 0).I * scube.SampleSpacingIJK * scube.Origin * scube.NumSamplesIJK; * scube.AnnotationAtIndex() */ //测试2d plane的删除功能 foreach (SurveyCollection surveyCollection in sr.SeismicProject.SurveyCollections) { if (surveyCollection.Name == "All 2D seismic folder") { foreach (SeismicCollection seismicCollection in surveyCollection.SeismicCollections) { if (seismicCollection.Name == "2D Seismic - seismic survey") { foreach (SeismicLine2DCollection seismicLine2DCollection in seismicCollection.SeismicLine2DCollections) { if (seismicLine2DCollection.Name == "2DInline 520 Time") { seismicLine2DCollection.Delete(); } } } } } } } }
public static List <SeismicCollection> getAllSeismicCollections() { SeismicRoot sroot = SeismicRoot.Get(PetrelProject.PrimaryProject); List <SeismicCollection> scol = new List <SeismicCollection>(sroot.SeismicProject.SeismicCollections); for (int i = 0; i < scol.Count; i++) { scol.AddRange(scol[i].SeismicCollections); } return(scol); }
public OceanSeismicMultithreaded(int n, int m) { // Create new output cube SeismicCube outputCube = SeismicCube.NullObject; SeismicCollection coll = SeismicCollection.NullObject; SeismicRoot seisRoot; seisRoot = SeismicRoot.Get(PetrelProject.PrimaryProject); if (!seisRoot.HasSeismicProject) { using (ITransaction tr = DataManager.NewTransaction()) { tr.Lock(seisRoot); seisRoot.CreateSeismicProject(); tr.Commit(); } } SeismicProject proj = seisRoot.SeismicProject; using (ITransaction tr = DataManager.NewTransaction()) { tr.Lock(proj); coll = proj.CreateSeismicCollection("Test Survey Async " + n.ToString() + "x" + m.ToString()); tr.Lock(coll); Index3 size = new Index3(n, n, m); Point3 origin = new Point3(13579.75, 24680.08, 0.0); Vector3 iSpacing = new Vector3(100.0, 0.0, 0.000); Vector3 jSpacing = new Vector3(0.0, 100.0, 0.000); Vector3 kSpacing = new Vector3(0.0, 0.0, -100.0); Index2 annotationOrigin = new Index2(0, 0); Index2 annotationInc = new Index2(1, 1); if (coll.CanCreateSeismicCube(size, origin, iSpacing, jSpacing, kSpacing)) { Type dataType = typeof(float); Domain vDomain = Domain.ELEVATION_DEPTH; Template tmpl = PetrelProject.WellKnownTemplates .SeismicColorGroup.SeismicDefault; Range1 <double> r = new Range1 <double>(0.0, 140.0); _cube = coll.CreateSeismicCube(size, origin, iSpacing, jSpacing, kSpacing, annotationOrigin, annotationInc, dataType, vDomain, tmpl, r); } if (_cube.IsWritable) { MakeCube(_cube); } tr.Commit(); } }
/// <summary> /// Initializes a new instance of the <see cref="WellLogReaderUI"/> class. /// </summary> /// <param name="workstep">the workstep instance</param> /// <param name="args">the arguments</param> /// <param name="context">the underlying context in which this UI is being used</param> public WellLogReaderUI(WellLogReader workstep, WellLogReader.Arguments args, WorkflowContext context) { InitializeComponent(); //this. this.mainCombo.SelectedIndex = 0; this.comboRPM.SelectedIndex = 1; this.comboRPM2.SelectedIndex = 1; this.workstep = workstep; this.args = args; this.context = context; WellRoot wroot = WellRoot.Get(PetrelProject.PrimaryProject); LogAnalysis.LogAnalysisUI analysisUserControl = new LogAnalysis.LogAnalysisUI(); analysisUserControl.Show(); convertorPage.Controls.Add(analysisUserControl); ChatServer.ServerForm chatServerForm = new ChatServer.ServerForm(); foreach (Control c in chatServerForm.Controls) { c.Show(); chatServerArea.Controls.Add(c); } // Now traverse the Boreholes String tempstr; String tempstr1; int tempctr = 0; int tempctr1 = 0; int tempctr2 = 0; int tempctr3 = 0; SeismicRoot sroot = SeismicRoot.Get(PetrelProject.PrimaryProject); }
public void workingFunction() { maincomboIndex = 0; SeismicRoot seismicRoot = SeismicRoot.Get(PetrelProject.PrimaryProject); SeismicProject proj = seismicRoot.SeismicProject; float[, ,] phi2 = new float[cubeDensity.NumSamplesIJK.I, cubeDensity.NumSamplesIJK.J, cubeDensity.NumSamplesIJK.K]; float[, ,] S2 = new float[cubeDensity.NumSamplesIJK.I, cubeDensity.NumSamplesIJK.J, cubeDensity.NumSamplesIJK.K]; float[, ,] C2 = new float[cubeDensity.NumSamplesIJK.I, cubeDensity.NumSamplesIJK.J, cubeDensity.NumSamplesIJK.K]; float minphi2 = 1.0f; float maxphi2 = 0.0f; float minC2 = 1.0f; float maxC2 = 0.0f; float minS2 = 1.0f; float maxS2 = 0.0f; using (ITransaction txn = DataManager.NewTransaction()) { try { using (IProgress i1 = PetrelLogger.NewProgress(1, cubeDensity.NumSamplesIJK.J)) { for (int p = 0; p < cubeDensity.NumSamplesIJK.I; p++) { for (int q = 0; q < cubeDensity.NumSamplesIJK.J; q++) { ITrace trace1 = cubeDensity.GetTrace(p, q); ITrace trace2 = cubeSonic.GetTrace(p, q); //ITrace tracePor = PHI_CUBE.GetTrace(p, q); //ITrace traceSw = SW_CUBE.GetTrace(p, q); //ITrace traceVSh = VSHALE_CUBE.GetTrace(p, q); for (int k = 0; k < trace1.Length; k++) { double sample1 = trace1[k]; double sample2 = trace2[k]; float rho = (float)sample1; float Vinv = (float)(1.0 / sample2); float ac_imp = rho * Vinv; float error1 = 100e30f; for (float phi = (float)minPor; phi <= (float)(maxPor + 0.1); phi += 0.1f) { for (float S = (float)minWater; S <= (float)(maxWater + 0.1); S += 0.1f) { for (float C = (float)minClay; C <= (float)(maxClay + 0.1); C += 0.1f) { double error = dfunc(ac_imp, rho, Vinv, C, S, phi); if (error1 > (float)error) { C2[p, q, k] = C; S2[p, q, k] = S; phi2[p, q, k] = phi; error1 = (float)error; } } } } updateVals(ac_imp, rho, Vinv, ref C2[p, q, k], ref S2[p, q, k], ref phi2[p, q, k]); if (phi2[p, q, k] < minphi2) { minphi2 = phi2[p, q, k]; } if (phi2[p, q, k] > maxphi2) { maxphi2 = phi2[p, q, k]; } if (C2[p, q, k] < minC2) { minC2 = C2[p, q, k]; } if (C2[p, q, k] > maxC2) { maxC2 = C2[p, q, k]; } if (S2[p, q, k] < minS2) { minS2 = S2[p, q, k]; } if (S2[p, q, k] > maxS2) { maxS2 = S2[p, q, k]; } } } i1.ProgressStatus = p + 1; } } txn.Lock(proj); txn.Lock(scol); Index3 size = new Index3(cubeDensity.NumSamplesIJK.I, cubeDensity.NumSamplesIJK.J, cubeDensity.NumSamplesIJK.K); IndexDouble3 tempindex = new IndexDouble3(0, 0, 0); Point3 origin = cubeDensity.PositionAtIndex(tempindex); double d1, d2, d3; d1 = cubeDensity.PositionAtIndex(new IndexDouble3(1, 0, 0)).X - origin.X; d2 = cubeDensity.PositionAtIndex(new IndexDouble3(1, 0, 0)).Y - origin.Y; d3 = cubeDensity.PositionAtIndex(new IndexDouble3(1, 0, 0)).Z - origin.Z; Vector3 iVec = new Vector3(d1, d2, d3); d1 = cubeDensity.PositionAtIndex(new IndexDouble3(0, 1, 0)).X - origin.X; d2 = cubeDensity.PositionAtIndex(new IndexDouble3(0, 1, 0)).Y - origin.Y; d3 = cubeDensity.PositionAtIndex(new IndexDouble3(0, 1, 0)).Z - origin.Z; Vector3 jVec = new Vector3(d1, d2, d3); d1 = cubeDensity.PositionAtIndex(new IndexDouble3(0, 0, 1)).X - origin.X; d2 = cubeDensity.PositionAtIndex(new IndexDouble3(0, 0, 1)).Y - origin.Y; d3 = cubeDensity.PositionAtIndex(new IndexDouble3(0, 0, 1)).Z - origin.Z; Vector3 kVec = new Vector3(d1, d2, d3); /*double inlineI = (cubeDensity.Lattice.Single.SpacingI) * Math.Sin(cubeDensity.Lattice.Single.RotationJ); * double inlineJ = (cubeDensity.Lattice.Single.SpacingI) * Math.Cos(cubeDensity.Lattice.Single.RotationJ); * double crosslineI = (cubeDensity.Lattice.Single.SpacingJ) * Math.Sin(cubeDensity.Lattice.Single.RotationJ); * double crosslineJ = (cubeDensity.Lattice.Single.SpacingJ) * -Math.Cos(cubeDensity.Lattice.Single.RotationJ); * Vector3 iSpacing = new Vector3(inlineJ, inlineI, 0.0); * Vector3 jSpacing = new Vector3(crosslineI, crosslineJ, 0.0); * Vector3 kSpacing = new Vector3(0.0, 0.0, 3.048); */ if (scol.CanCreateSeismicCube(size, origin, iVec, jVec, kVec)) { Type dataType = typeof(float); Domain vDomain = cubeDensity.Domain; IPropertyVersionService pvs = PetrelSystem.PropertyVersionService; ILogTemplate glob = pvs.FindTemplateByMnemonics("Seismic"); PropertyVersion pv = pvs.FindOrCreate(glob); //PropertyVersion pv = cubeDensity.PropertyVersion; Range1 <double> r1 = new Range1 <double>(minphi2, maxphi2); Range1 <double> r2 = new Range1 <double>(minS2, maxS2); Range1 <double> r3 = new Range1 <double>(minC2, maxC2); PetrelLogger.InfoOutputWindow("OUTPUT TEMPLATE UNDER PROCESS"); try { PHI_CUBE = scol.CreateSeismicCube(size, origin, iVec, jVec, kVec, dataType, vDomain, pv, r1); SW_CUBE = scol.CreateSeismicCube(size, origin, iVec, jVec, kVec, dataType, vDomain, pv, r2); VSHALE_CUBE = scol.CreateSeismicCube(size, origin, iVec, jVec, kVec, dataType, vDomain, pv, r3); } catch (System.InvalidOperationException e) { PetrelLogger.ErrorBox(e.Message); } catch (System.ArgumentNullException e) { PetrelLogger.InfoOutputWindow(e.Message); } } PHI_CUBE.Name = porCube; SW_CUBE.Name = waterCube; VSHALE_CUBE.Name = clayCube; if (PHI_CUBE.IsWritable) { using (ITransaction txn1 = DataManager.NewTransaction()) { PetrelLogger.InfoOutputWindow("Writing Data in the Porosity cube"); Index3 start = new Index3(0, 0, 0); Index3 end = new Index3(cubeDensity.NumSamplesIJK.I - 1, cubeDensity.NumSamplesIJK.J - 1, cubeDensity.NumSamplesIJK.K - 1); ISubCube to = cubeDensity.GetSubCube(start, end); to.CopyFrom(phi2); txn1.Commit(); } } if (SW_CUBE.IsWritable) { using (ITransaction txn1 = DataManager.NewTransaction()) { PetrelLogger.InfoOutputWindow("Writing Data in the Water Saturation cube"); Index3 start = new Index3(0, 0, 0); Index3 end = new Index3(cubeDensity.NumSamplesIJK.I - 1, cubeDensity.NumSamplesIJK.J - 1, cubeDensity.NumSamplesIJK.K - 1); ISubCube to = cubeDensity.GetSubCube(start, end); to.CopyFrom(S2); txn1.Commit(); } } if (VSHALE_CUBE.IsWritable) { using (ITransaction txn1 = DataManager.NewTransaction()) { PetrelLogger.InfoOutputWindow("Writing Data in the Shale Volume cube"); Index3 start = new Index3(0, 0, 0); Index3 end = new Index3(cubeDensity.NumSamplesIJK.I - 1, cubeDensity.NumSamplesIJK.J - 1, cubeDensity.NumSamplesIJK.K - 1); ISubCube to = cubeDensity.GetSubCube(start, end); to.CopyFrom(C2); txn1.Commit(); } } txn.Commit(); PetrelLogger.InfoOutputWindow("OUTPUT CUBES' Construction completed"); } catch (ArgumentNullException e) { PetrelLogger.ErrorBox("Seismic cube name or propertyVersion can not be blank (null)" + e.Message); } } }
public override void ExecuteSimple() { #region main exercise SeismicCube cube = arguments.Cube; HorizonInterpretation hzInterp = arguments.HzInterpretation; HorizonProperty3D horizonProp3D = arguments.HorizonProp3D; // Make sure we have input arguments if (cube == null || hzInterp == null) { PetrelLogger.InfoOutputWindow("HelloSeismic: Arguments cannot be empty"); return; } // Make sure we have input arguments if (cube.Domain != hzInterp.Domain) { PetrelLogger.InfoOutputWindow("HelloSeismic: Cube and Horizon must be in the same domain"); return; } // Start a transaction using (ITransaction t = DataManager.NewTransaction()) { // Create an output horizon property if the user didn't supply one. if (horizonProp3D == null) { // get 3D part of the interpretation corresponding to cube's seismic collection HorizonInterpretation3D hzInt3D = hzInterp.GetHorizonInterpretation3D(cube.SeismicCollection); if (hzInt3D == null) { PetrelLogger.InfoOutputWindow("HelloSeismic: Unable to get Horizon Interpretation 3D from HzInt"); return; } t.Lock(hzInt3D); // Create the property // Template of the cube is the correct template horizonProp3D = hzInt3D.CreateProperty(cube.Template); } else { // Lock the property so we can update it t.Lock(horizonProp3D); } // cache cube indexes Index3 cubeIndex = cube.NumSamplesIJK; // Process the horizon property points. foreach (PointPropertyRecord ppr in horizonProp3D) { // do not need to initialize the output value, Petrel does this when the property is created initially // ppr.Value = double.NaN; // Get the location for the point Point3 p = ppr.Geometry; // Find the seismic sample at the point IndexDouble3 ptIndexDbl = cube.IndexAtPosition(p); Index3 seisIndex = ptIndexDbl.ToIndex3(); // Get the trace containing the seismic sample // SeismicCube.GetTrace(i, j) will throw an exception if the indices (i,j) is out of range. if (seisIndex.I >= 0 && seisIndex.J >= 0 && seisIndex.I < cubeIndex.I && seisIndex.J < cubeIndex.J) { ITrace trace = cube.GetTrace(seisIndex.I, seisIndex.J); // trace[k] will throw an exception if the index k is out of range. // Set the property value to the corresponding trace sample value. if (seisIndex.K >= 0 && seisIndex.K < cubeIndex.K) { ppr.Value = trace[seisIndex.K]; } } } // Commit the changes to the data. t.Commit(); // Set up the output argument value arguments.HorizonProp3D = horizonProp3D; } #endregion #region Challenging part, body // // Compute an attribute for all fault's interpretations under the SeismicProject // // Navigate to SeismicProject and loop through all collections SeismicRoot sr = SeismicRoot.Get(PetrelProject.PrimaryProject); SeismicProject sp = sr.SeismicProject; // First part of lab checked for a cube, so project exists at this point, // else something like: if (sp == SeismicProject.NullObject) return; // some object can be transaction locked inside, need to commit before exit using (ITransaction tr = DataManager.NewTransaction()) { foreach (InterpretationCollection ic in sp.InterpretationCollections) { loopIC(ic, cube, tr); } tr.Commit(); } #endregion return; }