package protobuf import ( "fmt" "google.golang.org/protobuf/proto" "joylink.club/bj-rtsts-server/ats/verify/protos/graphicData" proto2 "joylink.club/rtsssimulation/repository/model/proto" "os" "testing" ) func TestBuildRepository(t *testing.T) { bytes, err := os.ReadFile("./file.bin") dir, _ := os.Getwd() println(dir) if err != nil { panic(err) } storage := &graphicData.RtssGraphicStorage{} err = proto.Unmarshal(bytes, storage) if err != nil { panic(err) } repo := &proto2.Repository{} //todo 数据中id为379的区段B端无计轴,临时在代码里修改,后续删除 storage.AxleCountings = append(storage.AxleCountings, &graphicData.AxleCounting{ Common: &graphicData.CommonInfo{ Id: "10000", }, KilometerSystem: &graphicData.KilometerSystem{ Kilometer: 13403549, CoordinateSystem: "MAIN_LINE", Direction: graphicData.Direction_RIGHT, }, AxleCountingRef: []*graphicData.RelatedRef{{ DeviceType: graphicData.RelatedRef_Section, Id: "379", DevicePort: graphicData.RelatedRef_B, }}, Index: 0, Invent: false, Type: 0, }) axleCountingMap := make(map[string]*graphicData.AxleCounting) for _, data := range storage.AxleCountings { if data.KilometerSystem == nil { println(fmt.Sprintf("计轴[%s]缺少公里标", data.Common.Id)) continue } axleCountingMap[data.Common.Id] = data cpType := proto2.CheckPointType_AxleCounter if data.Invent { cpType = proto2.CheckPointType_Boundary } cp := &proto2.CheckPoint{ Id: data.Common.Id, Km: convertKm(data.KilometerSystem), Type: cpType, DevicePorts: convertDevicePorts(data.AxleCountingRef), } repo.CheckPoints = append(repo.CheckPoints, cp) } for _, data := range storage.Section { var turnoutIds []string if data.SectionType == graphicData.Section_TurnoutPhysical { turnoutIds = findTurnoutIds(axleCountingMap, data.AxleCountings) } physicalSection := &proto2.PhysicalSection{ Id: data.Common.Id, ADevicePort: convertDevicePort(data.PaRef), BDevicePort: convertDevicePort(data.PbRef), TurnoutIds: turnoutIds, } repo.PhysicalSections = append(repo.PhysicalSections, physicalSection) } for _, data := range storage.Turnouts { var km *proto2.Kilometer for _, ks := range data.KilometerSystem { if ks.Kilometer != 0 { km = convertKm(ks) break } } for _, kc := range buildKmConverts(data.KilometerSystem) { repo.KilometerConverts = append(repo.KilometerConverts, kc) } turnout := &proto2.Turnout{ Id: data.Common.Id, Km: km, ADevicePort: convertDevicePort(data.PaRef), BDevicePort: convertDevicePort(data.PbRef), CDevicePort: convertDevicePort(data.PcRef), } repo.Turnouts = append(repo.Turnouts, turnout) } for _, data := range storage.Signals { var sectionId string var turnoutPort *proto2.DevicePort switch data.RefDev.DeviceType { case graphicData.RelatedRef_Section: sectionId = data.RefDev.Id case graphicData.RelatedRef_Turnout: turnoutPort = convertDevicePort(data.RefDev) } signal := &proto2.Signal{ Id: data.Common.Id, Km: convertKm(data.KilometerSystem), SectionId: sectionId, TurnoutPort: turnoutPort, } repo.Signals = append(repo.Signals, signal) } for _, data := range storage.Transponders { var sectionId string var turnoutPort *proto2.DevicePort switch data.TransponderRef.DeviceType { case graphicData.RelatedRef_Section: sectionId = data.TransponderRef.Id case graphicData.RelatedRef_Turnout: turnoutPort = convertDevicePort(data.TransponderRef) } responder := &proto2.Transponder{ Id: data.Common.Id, Km: convertKm(data.KilometerSystem), SectionId: sectionId, TurnoutPort: turnoutPort, } repo.Transponders = append(repo.Transponders, responder) } slopeKsMap := make(map[string]*graphicData.SlopeKiloMarker) for _, data := range storage.SlopeKiloMarker { slopeKsMap[data.Common.Id] = data for _, kc := range buildKmConverts(data.KilometerSystem) { repo.KilometerConverts = append(repo.KilometerConverts, kc) } } curveKsMap := make(map[string]*graphicData.CurvatureKiloMarker) for _, data := range storage.CurvatureKiloMarker { curveKsMap[data.Common.Id] = data for _, kc := range buildKmConverts(data.KilometerSystem) { repo.KilometerConverts = append(repo.KilometerConverts, kc) } } for _, data := range storage.Slopes { var kms []*proto2.Kilometer for _, id := range data.RefDeviceId { kms = append(kms, convertKm(slopeKsMap[id].KilometerSystem[0])) } slope := &proto2.Slope{ Id: data.Common.Id, Kms: kms, Degree: data.SlopeNumber, } repo.Slopes = append(repo.Slopes, slope) } for _, data := range storage.Curvatures { var kms []*proto2.Kilometer for _, id := range data.RefDeviceId { kms = append(kms, convertKm(curveKsMap[id].KilometerSystem[0])) } slope := &proto2.SectionalCurvature{ Id: data.Common.Id, Kms: kms, Radius: data.CurvatureNumber, } repo.SectionalCurvatures = append(repo.SectionalCurvatures, slope) } repoBytes, err := proto.Marshal(repo) if err != nil { panic(err) } err = os.WriteFile("./repo.bin", repoBytes, os.ModePerm) println(err) } func convertKm(ks *graphicData.KilometerSystem) *proto2.Kilometer { var dir proto2.Direction switch ks.Direction { case graphicData.Direction_LEFT: dir = proto2.Direction_LEFT case graphicData.Direction_RIGHT: dir = proto2.Direction_RIGHT } return &proto2.Kilometer{ Value: ks.Kilometer, CoordinateSystem: ks.CoordinateSystem, Direction: dir, } } func convertDevicePort(ref *graphicData.RelatedRef) *proto2.DevicePort { if ref == nil { return nil } var deviceType proto2.DeviceType var port proto2.Port switch ref.DevicePort { case graphicData.RelatedRef_A: port = proto2.Port_A case graphicData.RelatedRef_B: port = proto2.Port_B case graphicData.RelatedRef_C: port = proto2.Port_C } switch ref.DeviceType { case graphicData.RelatedRef_Section: deviceType = proto2.DeviceType_DeviceType_PhysicalSection case graphicData.RelatedRef_Turnout: deviceType = proto2.DeviceType_DeviceType_Turnout default: panic(fmt.Sprintf("异常的设备类型-%s", ref.DeviceType)) } return &proto2.DevicePort{ DeviceId: ref.Id, DeviceType: deviceType, Port: port, } } func convertDevicePorts(refList []*graphicData.RelatedRef) []*proto2.DevicePort { var dps []*proto2.DevicePort for _, ref := range refList { dps = append(dps, convertDevicePort(ref)) } return dps } func findTurnoutIds(axleCountingMap map[string]*graphicData.AxleCounting, axleIds []string) []string { if len(axleIds) <= 2 { return nil } turnoutMap := make(map[string]bool) for _, axleId := range axleIds { axle := axleCountingMap[axleId] relTurnoutCount := 0 var turnoutId string for _, ref := range axle.AxleCountingRef { if ref.DeviceType == graphicData.RelatedRef_Turnout { relTurnoutCount++ turnoutId = ref.Id } } if relTurnoutCount == 1 { turnoutMap[turnoutId] = true } } var turnoutIds []string for id, _ := range turnoutMap { turnoutIds = append(turnoutIds, id) } return turnoutIds } func buildKmConverts(ksList []*graphicData.KilometerSystem) []*proto2.KilometerConvert { var kmConvers []*proto2.KilometerConvert for i, ks := range ksList { if ks.Kilometer == 0 { continue } for j := i + 1; j < len(ksList); j++ { if ks.Kilometer == 0 { continue } kmConvers = append(kmConvers, buildKmConvert(ks, ksList[j])) } } return kmConvers } func buildKmConvert(ks1 *graphicData.KilometerSystem, ks2 *graphicData.KilometerSystem) *proto2.KilometerConvert { return &proto2.KilometerConvert{ KmA: convertKm(ks1), KmB: convertKm(ks2), SameTrend: false, } }