科学网

 找回密码
  注册

tag 标签: 测井质量检查

相关帖子

版块 作者 回复/查看 最后发表

没有相关内容

相关日志

C#调用LightChart实现测井三维交会图质量检查程序
moustudio 2020-7-20 17:20
测井质量检查是需要面临的基础问题,在拿到数据进行质控的第一步,保证后续处理的准确性意义重大。常规的是二维交会图查看,利用中子-密度-声波三条曲线两两交会查看三张图,如下图所示: 某一天在Geolog上面发现有三维的交会图,用起来看着非常直观,虽然细节上不如二维交会图,但是在总体观察效果上的确有优点,于是想着自己山寨一个看看效果。最初想到的OCC控件,瞬间对于C++的指针郁闷上来了,打包也麻烦;随后考虑国内的类似的AnyCAD,只有初步的试用版,而且还是不太好用,网上看到有不少Bug;继续浏览发现了2017年横空出世的LightingChart,是真的强大,试用发现操作接口比较函数式,比较好理解。相对比专业的3D绘图不是那么全面,但是够用。尤其是渲染速度非常快速,响应比AnyCAD要快很多。最终试验效果图如下图所示: 网上和说明书有的不细说,在此记录下几个有用的参数设置,具体如下: 三维视图对象:View3D v = _chart.View3D; 绘图操作类似OpenGL的定义,有个开始和结束更新,在中间添加各种操作即可。 1 三维坐标系设置参数 1.1 绘图空间大小设置 在 3D 空间中心创建 3D 模型。维度量级定义了三维空间中模型箱的大小。用该维度箱可以定义墙和轴的大小。用 Dimensions属性可设置每个维度的量级。 //v.Dimensions.X=50; v.Dimensions.Y=70; //v.Dimensions.Z=100; 这个参数是确定在控件上看到的图形整体大小,类似二维绘图的图纸大小。 1.2 坐标区间映射设置 具体的坐标参数区间通过每个坐标轴来进行设置,简单明了。 v.XAxisPrimary3D.Title.Text=中子; v.XAxisPrimary3D.Maximum=50; v.XAxisPrimary3D.Minimum=-8; v.YAxisPrimary3D.Title.Text=密度; v.YAxisPrimary3D.Maximum=3.0; v.YAxisPrimary3D.Minimum=1.9; v.ZAxisPrimary3D.Title.Text=声波; v.ZAxisPrimary3D.Maximum=140; v.ZAxisPrimary3D.Minimum=40; 2 三维绘图数据操作 2.1 添加散点数据 点和线都是同一个数据集,跟ZedGraph控件一样,将点和线的可见属性进行设置即可完成显示的转换。LightingChart的数据是通过不同的数据集进行组合管理的,如PointLineSeries3D、SurfaceGridSeries3D、SurfaceMeshSeries3D等数据集合,添加对应的数据类型进去即可。在此添加数据点集如下: PointLineSeries3DseriesIndividualPointColors=newPointLineSeries3D(v,Axis3DBinding.Primary,Axis3DBinding.Primary,Axis3DBinding.Primary); seriesIndividualPointColors.Title.Text=Individualpointcolors; seriesIndividualPointColors.IndividualPointColors=true; seriesIndividualPointColors.MouseInteraction=true; seriesIndividualPointColors.PointsVisible=true; seriesIndividualPointColors.PointStyle.Shape3D=PointShape3D.Sphere; seriesIndividualPointColors.PointStyle.Size3D.SetValues(1.5f,1.5f,1.5f); seriesIndividualPointColors.LineVisible=false; SeriesPoint3D ; for(inti=0;ipointCount;i++) { Cyq_PlatePointpp=get_point_by_id(list_ID_PlatePoint_Diagram ); points2 .X=pp.CNCF; points2 .Y=pp.RHOB; points2 .Z=pp.DT; } seriesIndividualPointColors.Points=points2; v.PointLineSeries3D.Add(seriesIndividualPointColors); 2.2 自定义数据点颜色 数据点颜色设置需要手动进行,具体颜色通过两种方式可以实现计算:取值区间和调色板。 (1)利用取值区间颜色设定数据点颜色 intgreen=Convert.ToInt32((limit_gr_max-pp.GR)/(limit_gr_max-limit_gr_min)*255.0); points2 .Color=Color.FromArgb(0,green,0); (2)利用调色板颜色设定数据点颜色 ValueRangePalettepalette=newValueRangePalette(); palette.Steps.Clear(); palette.Steps.Add(newPaletteStep(palette,Color.FromArgb(255,Color.DarkGray),100)); palette.Steps.Add(newPaletteStep(palette,Color.FromArgb(255,Color.Yellow),50)); palette.Steps.Add(newPaletteStep(palette,Color.FromArgb(255,Color.Red),0)); palette.Steps .MaxValue=limit_gr_min+(limit_gr_max-limit_gr_min)*0.7; palette.Steps .MaxValue=limit_gr_min+(limit_gr_max-limit_gr_min)*0.3; palette.Steps .MaxValue=limit_gr_min+(limit_gr_max-limit_gr_min)*0; Colorc; palette.GetColorByValue(pp.GR,outc); points2 .Color=c; 3 三维空间中绘图二维图形 3.1 数据点绘制 三维数据点集PointLineSeries3D的ShapType属性可以修改为Shape2D,设置的数据点坐标同样是三维的,但是显示出来的数据点就是二维的,不再有光源和明暗关系变化等情况,这里用来投射成三面墙的二维映射交互图,实例代码如下: PointLineSeries3DseriesIndividualPointColors_DEN_DT=newPointLineSeries3D(v,Axis3DBinding.Primary,Axis3DBinding.Primary,Axis3DBinding.Primary); seriesIndividualPointColors_DEN_DT.PointStyle.ShapeType=ShapeType.Shape2D; seriesIndividualPointColors_DEN_DT.PointStyle.Shape2D.Shape=Shape.Circle; seriesIndividualPointColors_DEN_DT.PointStyle.Shape2D.Width=3.0f; seriesIndividualPointColors_DEN_DT.PointStyle.Shape2D.Height=3.0f; SeriesPoint3D ; for(inti=0;ipointCount;i++) { Cyq_PlatePointpp=get_point_by_id(list_ID_PlatePoint_Diagram ); points_DEN_DT .X=xmin; points_DEN_DT .Y=pp.RHOB; points_DEN_DT .Z=pp.DT; points_DEN_DT .Color=Color.DarkOrchid; } seriesIndividualPointColors_DEN_DT.Points=points_DEN_DT;v.PointLineSeries3D.Add(seriesIndividualPointColors_DEN_DT); 绘图效果如下: 3.2 线条绘制 线条绘制常规三维绘制一样,只是需要固定一个维度的坐标值。 3.3 文本标注 文本标注需要设置一个坐标系统为屏幕坐标即可,这样就不会随着旋转变化,固定了屏幕x、y坐标。程序中显示数据点个数就是二维文本,代码如下: Annotation3Ddescription=newAnnotation3D(v,Axis3DBinding.Primary,Axis3DBinding.Primary,Axis3DBinding.Primary); description.TargetCoordinateSystem=AnnotationTargetCoordinates.AxisValues; description.LocationCoordinateSystem=CoordinateSystem.ScreenCoordinates; description.LocationRelativeOffset.SetValues(0,0); description.Visible=true; description.MouseInteraction=false; description.Style=AnnotationStyle.Rectangle; description.Shadow.Visible=false; description.TargetAxisValues.SetValues(19,2.9,zmax); description.Text=string.Format(数据点:{0}个,pointCount); description.BorderVisible=false; description.TextStyle.Color=Color.White; description.Fill.Color=Color.Empty; description.Fill.GradientColor=Color.Empty; _chart.View3D.Annotations.Add(description); 4 鼠标交互操作 简单实现数据点的追踪,直接拷贝示例程序中的代码如下: 在创建绘图的时候,加入鼠标移动事件响应函数: _chart.MouseMove+=newMouseEventHandler(_chart_MouseMove); 编写响应函数代码: void_chart_MouseMove(objectsender,MouseEventArgse) { //Disablerendering,stronglyrecommendedbeforeupdatingchartproperties _chart.BeginUpdate(); //Get3Dview View3Dview3D=_chart.View3D; //Resethighlightedpointcolors foreach(PointLineSeries3DpointLineSeries3Din_chart.View3D.PointLineSeries3D) { if(pointLineSeries3D.Tag!=null) { //Restorecolor intpointIndex=(int)pointLineSeries3D.Tag; pointLineSeries3D.Points .Color=pointLineSeries3D.Title.Color; } } //Annotationforvaluetracking Annotation3DtargetValueLabel=view3D.Annotations ; targetValueLabel.Visible=false;//hideit //Getobjectundermouseifany objectobj=_chart.GetActiveMouseOverObject(); //checkifobjectisvalid if(obj!=null) { //ifobjectisPointLineSeries3D if(objisPointLineSeries3D) { PointLineSeries3DpointLineSeries=objasPointLineSeries3D; //Getlastdataindexatmousecoordinates intpointIndex=pointLineSeries.LastMouseHitTestIndex; //Changethecolorofpointincurrentposition pointLineSeries.Points .Color=ChartTools.CalcGradient(pointLineSeries.Title.Color,Color.White,50); pointLineSeries.Tag=pointIndex;//Storeinfoofpointindexthatishighlighted SeriesPoint3Dpoint=pointLineSeries.Points ; intid_point=list_ID_PlatePoint_Diagram ; Cyq_PlatePointpp=get_point_by_id(id_point); targetValueLabel.TargetAxisValues.SetValues(point.X,point.Y,point.Z); targetValueLabel.Text=深度=+pp.DepthStart.ToString(F4) +\\n中子=+point.X.ToString(0.00)+;密度=+point.Y.ToString(0.00)+;声波=+point.Z.ToString(0.00); targetValueLabel.Fill.Color=ChartTools.CalcGradient(pointLineSeries.Title.Color,Color.White,90); targetValueLabel.Fill.GradientColor=ChartTools.CalcGradient(pointLineSeries.Title.Color,Color.White,50); targetValueLabel.Visible=true; } } //Allowchartrendering _chart.EndUpdate(); } 实现效果如下图所示: 控件还有其他更多图形保存输出、打印等功能,以后慢慢探索。
个人分类: 编程笔记|4707 次阅读|0 个评论

Archiver|手机版|科学网 ( 京ICP备07017567号-12 )

GMT+8, 2024-5-6 12:29

Powered by ScienceNet.cn

Copyright © 2007- 中国科学报社

返回顶部