private int OnData(DataContext ctx, IntPtr sys, IntPtr data) { if (!SecretKey.License.SnOk) { string errMsg = ""; string warnMsg = "传感器试用权限已到期,传感器将停止接收数据,如有疑问请联系:" + tel; if (DisConnect(ref errMsg)) { warnMsg += " !"; } MessageBox.Show(warnMsg); return(0); } if (!IsOnline) { GoSdkWrapper.GoDestroy(data); //GC.Collect(); return(1); } IntPtr dataObj = IntPtr.Zero; IntPtr StampMsg = IntPtr.Zero; IntPtr StampPtr = IntPtr.Zero; GoStamp stamp = new GoStamp(); IntPtr ProfileMsgZ = IntPtr.Zero; Profile mProfile = new Profile(); IntPtr ProfileMsgIntensity = IntPtr.Zero; IntPtr SurfaceMsgZ = IntPtr.Zero; IntPtr SurfaceMsgIntensity = IntPtr.Zero; IntPtr MeasurementMsg = IntPtr.Zero; MeasurementData measurementData = new MeasurementData(); bool isRecSurfaceZOK = false; for (uint i = 0; i < GoSdkWrapper.GoDataSet_Count(data); i++) { dataObj = GoSdkWrapper.GoDataSet_At(data, i); switch (GoSdkWrapper.GoDataMsg_Type(dataObj)) { case GoDataMessageTypes.GO_DATA_MESSAGE_TYPE_STAMP: StampMsg = dataObj; StampPtr = GoSdkWrapper.GoStampMsg_At(StampMsg, 0); stamp = (GoStamp)Marshal.PtrToStructure(StampPtr, typeof(GoStamp)); //if (stamp.encoder == 0) //{ // stamp.encoder = 0; //} Stamp = stamp; mProfile.encoder = stamp.encoder; break; case GoDataMessageTypes.GO_DATA_MESSAGE_TYPE_SURFACE: SurfaceMsgZ = dataObj; ctx.xResolution = (double)GoSdkWrapper.GoSurfaceMsg_XResolution(SurfaceMsgZ) / 1000000; ctx.zResolution = (double)GoSdkWrapper.GoSurfaceMsg_ZResolution(SurfaceMsgZ) / 1000000; ctx.yResolution = (double)GoSdkWrapper.GoSurfaceMsg_YResolution(SurfaceMsgZ) / 1000000; ctx.xOffset = (double)GoSdkWrapper.GoSurfaceMsg_XOffset(SurfaceMsgZ) / 1000; ctx.yOffset = (double)GoSdkWrapper.GoSurfaceMsg_YOffset(SurfaceMsgZ) / 1000; ctx.zOffset = (double)GoSdkWrapper.GoSurfaceMsg_ZOffset(SurfaceMsgZ) / 1000; uint surfaceWidth = GoSdkWrapper.GoSurfaceMsg_Width(SurfaceMsgZ); uint surfaceHeight = GoSdkWrapper.GoSurfaceMsg_Length(SurfaceMsgZ); IntPtr surfacePtr = GoSdkWrapper.GoSurfaceMsg_RowAt(SurfaceMsgZ, 0); short[] surfacePoints = new short[surfaceWidth * surfaceHeight]; float[] surfaceData = new float[surfaceWidth * surfaceHeight]; float[] surfaceDataX = new float[surfaceWidth * surfaceHeight]; float[] surfaceDataY = new float[surfaceWidth * surfaceHeight]; byte[] surfaceDataZByte = new byte[surfaceWidth * surfaceHeight]; //保存Kdat Stopwatch sp = new Stopwatch(); sp.Start(); //if (surfacePoints.Length==0) //{ // break; //} try { Marshal.Copy(surfacePtr, surfacePoints, 0, surfacePoints.Length); } catch (Exception) { return(1); } //保存dat //if (SaveDatFileDirectory != null && !string.IsNullOrEmpty(SaveDatFileDirectory)) //{ // PointMsg pmoffset = new PointMsg() { x = ctx.xOffset, y = ctx.yOffset, z = ctx.zOffset }; // PointMsg pmscale = new PointMsg() { x = ctx.xResolution, y = ctx.yResolution, z = ctx.zResolution }; // SurfaceZSaveDat ssd = new SurfaceZSaveDat() { points = surfacePoints, resolution = pmscale, offset = pmoffset,width = (int)surfaceWidth,height = (int)surfaceHeight }; // StaticTool.WriteSerializable($"{SaveDatFileDirectory}Side{RunSide}_H.dat", ssd); //} PointMsg pmoffset = new PointMsg() { x = ctx.xOffset, y = ctx.yOffset, z = ctx.zOffset }; PointMsg pmscale = new PointMsg() { x = ctx.xResolution, y = ctx.yResolution, z = ctx.zResolution }; SurfaceZSaveDat ssd = new SurfaceZSaveDat() { points = surfacePoints, resolution = pmscale, offset = pmoffset, width = (int)surfaceWidth, height = (int)surfaceHeight }; if (!isRecSurfaceZOK) { if (SaveDatFileDirectory != null && !string.IsNullOrEmpty(SaveDatFileDirectory)) { StaticTool.WriteSerializable($"{SaveDatFileDirectory}Side{RunSide}_L_H.dat", ssd); } sddList_L.Add(ssd); if (SaveKdatDirectoy != null && !string.IsNullOrEmpty(SaveKdatDirectoy) && RunSide != null) { Point3d64f poffset = new Point3d64f() { x = ctx.xOffset, y = ctx.yOffset, z = ctx.zOffset }; Point3d64f pscale = new Point3d64f() { x = ctx.xResolution, y = ctx.yResolution, z = ctx.zResolution }; GoSurface insurface = new GoSurface() { data = surfacePtr, width = (int)surfaceWidth, height = (int)surfaceHeight, offset = poffset, scale = pscale }; GoSaveSurfaceGraphic.SaveSufaceToFile($"{SaveKdatDirectoy}{DateTime.Now.ToString("yyyyMMdd_HHmmss")}_Side{RunSide}_L.kdat", ref insurface, false); } } else { //保存dat if (SaveDatFileDirectory != null && !string.IsNullOrEmpty(SaveDatFileDirectory)) { //PointMsg pmoffset = new PointMsg() { x = ctx.xOffset, y = ctx.yOffset, z = ctx.zOffset }; //PointMsg pmscale = new PointMsg() { x = ctx.xResolution, y = ctx.yResolution, z = ctx.zResolution }; //SurfaceZSaveDat ssd = new SurfaceZSaveDat() { points = surfacePoints, resolution = pmscale, offset = pmoffset, width = (int)surfaceWidth, height = (int)surfaceHeight }; StaticTool.WriteSerializable($"{SaveDatFileDirectory}Side{RunSide}_S_H.dat", ssd); } sddList_S.Add(ssd); if (SaveKdatDirectoy != null && !string.IsNullOrEmpty(SaveKdatDirectoy) && RunSide != null) { Point3d64f poffset = new Point3d64f() { x = ctx.xOffset, y = ctx.yOffset, z = ctx.zOffset }; Point3d64f pscale = new Point3d64f() { x = ctx.xResolution, y = ctx.yResolution, z = ctx.zResolution }; GoSurface insurface = new GoSurface() { data = surfacePtr, width = (int)surfaceWidth, height = (int)surfaceHeight, offset = poffset, scale = pscale }; GoSaveSurfaceGraphic.SaveSufaceToFile($"{SaveKdatDirectoy}{DateTime.Now.ToString("yyyyMMdd_HHmmss")}_Side{RunSide}_S.kdat", ref insurface, false); } } sp.Stop(); long b = sp.ElapsedMilliseconds; sp.Start(); for (int j = 0; j < surfaceHeight; j++) { for (int k = 0; k < surfaceWidth; k++) { surfaceData[j * surfaceWidth + k] = surfacePoints[j * surfaceWidth + k] == -32768 ? -12 : (float)(ctx.zOffset + ctx.zResolution * surfacePoints[j * surfaceWidth + k]); surfaceDataX[j * surfaceWidth + k] = (float)(ctx.xOffset + ctx.xResolution * k); surfaceDataY[j * surfaceWidth + k] = (float)(ctx.yOffset + ctx.yResolution * j); if (IsRecSurfaceDataZByte && (!isRecSurfaceZOK)) { if (surfacePoints[j * surfaceWidth + k] != -32768) { surfaceDataZByte[j * surfaceWidth + k] = (byte)Math.Ceiling(((ctx.zOffset + ctx.zResolution * surfacePoints[j * surfaceWidth + k]) - zStart) * z_byte_resolution); } else { surfaceDataZByte[j * surfaceWidth + k] = 0; } } } } sp.Stop(); long a = sp.ElapsedMilliseconds; if (!isRecSurfaceZOK) { this.SurfaceWidth = surfaceWidth; this.SurfaceHeight = surfaceHeight; this.SurfaceDataZ = surfaceData; this.SurfaceDataZByte = surfaceDataZByte; this.surfaceDataX = surfaceDataX; this.surfaceDataY = surfaceDataY; isRecSurfaceZOK = true; } else { this.SurfaceAlignData = surfaceData; this.SurfaceAlignWidth = surfaceWidth; this.SurfaceAlignHeight = surfaceHeight; } break; case GoDataMessageTypes.GO_DATA_MESSAGE_TYPE_SURFACE_INTENSITY: SurfaceMsgIntensity = dataObj; IntPtr intensityPtr = GoSdkWrapper.GoSurfaceIntensityMsg_RowAt(SurfaceMsgIntensity, 0); surfaceWidth = GoSdkWrapper.GoSurfaceIntensityMsg_Width(SurfaceMsgIntensity); surfaceHeight = GoSdkWrapper.GoSurfaceIntensityMsg_Length(SurfaceMsgIntensity); byte[] intensityArr = new byte[surfaceWidth * surfaceHeight]; Marshal.Copy(intensityPtr, intensityArr, 0, intensityArr.Length); SurfaceDataIntensity = intensityArr; SurfaceIntensitySaveDat sid = new SurfaceIntensitySaveDat() { points = intensityArr, width = (int)surfaceWidth, height = (int)surfaceHeight }; if (SaveDatFileDirectory != null && !string.IsNullOrEmpty(SaveDatFileDirectory)) { StaticTool.WriteSerializable($"{SaveDatFileDirectory}Side{RunSide}_I.dat", sid); } sddList_I.Add(sid); break; case GoDataMessageTypes.GO_DATA_MESSAGE_TYPE_RESAMPLED_PROFILE: if (!EnableProfle) { break; } ProfileMsgZ = dataObj; ctx.xResolution = ((double)GoSdkWrapper.GoProfileMsg_XResolution(ProfileMsgZ)) / 1000000; ctx.zResolution = ((double)GoSdkWrapper.GoProfileMsg_ZResolution(ProfileMsgZ)) / 1000000; ctx.xOffset = ((double)GoSdkWrapper.GoProfileMsg_XOffset(ProfileMsgZ)) / 1000; ctx.zOffset = ((double)GoSdkWrapper.GoProfileMsg_ZOffset(ProfileMsgZ)) / 1000; profileWidth = GoSdkWrapper.GoProfileMsg_Width(ProfileMsgZ); IntPtr pointPtr = GoSdkWrapper.GoResampledProfileMsg_At(ProfileMsgZ, 0); short[] points = new short[profileWidth]; Marshal.Copy(pointPtr, points, 0, points.Length); ProfilePoint[] profile = new ProfilePoint[profileWidth]; for (int j = 0; j < points.Length; j++) { profile[j].x = (float)(ctx.xOffset + ctx.xResolution * j); profile[j].z = points[j] == -32768 ? -12 : (float)(ctx.zOffset + ctx.zResolution * points[j]); } mProfile.points = profile; isRecProfileZ = true; break; case GoDataMessageTypes.GO_DATA_MESSAGE_TYPE_PROFILE_INTENSITY: if (isRecProfileZ) { ProfileMsgIntensity = dataObj; profileWidth = GoSdkWrapper.GoProfileIntensityMsg_Width(ProfileMsgIntensity); IntPtr profileIntensityPtr = GoSdkWrapper.GoProfileIntensityMsg_At(ProfileMsgIntensity, 0); byte[] profileIntensityArr = new byte[profileWidth]; Marshal.Copy(profileIntensityPtr, profileIntensityArr, 0, profileIntensityArr.Length); for (int j = 0; j < profileIntensityArr.Length; j++) { mProfile.points[j].Intensity = profileIntensityArr[j]; } } break; case GoDataMessageTypes.GO_DATA_MESSAGE_TYPE_MEASUREMENT: MeasurementMsg = dataObj; IntPtr measurementPtr = GoSdkWrapper.GoMeasurementMsg_At(MeasurementMsg, 0); GoMeasurementData mData = (GoMeasurementData)Marshal.PtrToStructure(measurementPtr, typeof(GoMeasurementData)); measurementData.id = GoSdkWrapper.GoMeasurementMsg_Id(MeasurementMsg); measurementData.value = mData.Value; measurementDataList.Add(measurementData); break; default: break; } } if (isRecProfileZ) { profileDataZ.Add(mProfile); this.SigleProfile = mProfile; isRecProfileZ = false; } GoSdkWrapper.GoDestroy(data); //GC.Collect(); return(1); }