@ -5,7 +5,22 @@ import club.joylink.rtss.simulation.cbtc.build.SimulationBuilder;
import club.joylink.rtss.simulation.cbtc.constant.SignalAspect ;
import club.joylink.rtss.simulation.cbtc.constant.SignalModel ;
import club.joylink.rtss.simulation.cbtc.data.CalculateService ;
import club.joylink.rtss.simulation.cbtc.data.map.* ;
import club.joylink.rtss.simulation.cbtc.data.map.AutoSignal ;
import club.joylink.rtss.simulation.cbtc.data.map.Cycle ;
import club.joylink.rtss.simulation.cbtc.data.map.DestinationCodeDefinition ;
import club.joylink.rtss.simulation.cbtc.data.map.ESP ;
import club.joylink.rtss.simulation.cbtc.data.map.MapElement ;
import club.joylink.rtss.simulation.cbtc.data.map.PSD ;
import club.joylink.rtss.simulation.cbtc.data.map.Route ;
import club.joylink.rtss.simulation.cbtc.data.map.RouteFls ;
import club.joylink.rtss.simulation.cbtc.data.map.RouteOverlap ;
import club.joylink.rtss.simulation.cbtc.data.map.Section ;
import club.joylink.rtss.simulation.cbtc.data.map.SectionPath ;
import club.joylink.rtss.simulation.cbtc.data.map.Signal ;
import club.joylink.rtss.simulation.cbtc.data.map.Stand ;
import club.joylink.rtss.simulation.cbtc.data.map.Station ;
import club.joylink.rtss.simulation.cbtc.data.map.Switch ;
import club.joylink.rtss.simulation.cbtc.data.map.SwitchElement ;
import club.joylink.rtss.simulation.cbtc.data.support.RoutePath ;
import club.joylink.rtss.simulation.cbtc.exception.SimulationException ;
import club.joylink.rtss.simulation.cbtc.exception.SimulationExceptionType ;
@ -14,7 +29,28 @@ import club.joylink.rtss.vo.map.CiGenerateResultVO;
import club.joylink.rtss.vo.map.MapCiGenerateConfig ;
import club.joylink.rtss.vo.map.MapRoutingSectionNewVO ;
import club.joylink.rtss.vo.map.MapVO ;
import club.joylink.rtss.vo.map.logic.* ;
import club.joylink.rtss.vo.map.logic.MapAutoReentryVO ;
import club.joylink.rtss.vo.map.logic.MapAutoSignalNewVO ;
import club.joylink.rtss.vo.map.logic.MapDestinationCodeDefinitionVO ;
import club.joylink.rtss.vo.map.logic.MapOverlapVO ;
import club.joylink.rtss.vo.map.logic.MapRouteFlankProtectionNewVO ;
import club.joylink.rtss.vo.map.logic.MapRouteNewVO ;
import club.joylink.rtss.vo.map.logic.MapRoutingDataVO ;
import club.joylink.rtss.vo.map.logic.MapSignalApproachSectionVO ;
import club.joylink.rtss.vo.map.logic.MapStationRunLevelVO ;
import java.util.ArrayList ;
import java.util.Arrays ;
import java.util.Collection ;
import java.util.Collections ;
import java.util.Comparator ;
import java.util.HashMap ;
import java.util.List ;
import java.util.Map ;
import java.util.Objects ;
import java.util.Stack ;
import java.util.concurrent.atomic.AtomicInteger ;
import java.util.function.Function ;
import java.util.stream.Collectors ;
import lombok.Getter ;
import lombok.extern.slf4j.Slf4j ;
import org.springframework.beans.factory.annotation.Autowired ;
@ -23,11 +59,6 @@ import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.CollectionUtils ;
import org.springframework.util.StringUtils ;
import java.util.* ;
import java.util.concurrent.atomic.AtomicInteger ;
import java.util.function.Function ;
import java.util.stream.Collectors ;
@Slf4j
@Service
public class DraftMapCiDataGeneratorImpl implements DraftMapCiDataGenerator {
@ -46,9 +77,11 @@ public class DraftMapCiDataGeneratorImpl implements DraftMapCiDataGenerator {
public CiGenerateResultVO generate ( Long mapId ) {
/ / 先校验地图基础数据
MapVO mapVO = this . draftMapService . getDraftMapData ( mapId ) ;
SimulationBuilder . SimulationDeviceBuildResult buildResult = SimulationBuilder . checkAndBuildBasicMapData ( mapVO ) ;
SimulationBuilder . SimulationDeviceBuildResult buildResult = SimulationBuilder . checkAndBuildBasicMapData (
mapVO ) ;
BusinessExceptionAssertEnum . DATA_ERROR . assertCollectionEmpty ( buildResult . getErrMsgList ( ) ,
String . format ( " 地图基础数据有错误: %s " , JsonUtils . writeValueAsString ( buildResult . getErrMsgList ( ) ) ) ) ;
String . format ( " 地图基础数据有错误: %s " ,
JsonUtils . writeValueAsString ( buildResult . getErrMsgList ( ) ) ) ) ;
MapCiGenerateConfig generateConfig = mapVO . getGraphDataNew ( ) . getGenerateConfig ( ) ;
Map < String , MapElement > deviceMap = buildResult . getDeviceMap ( ) ;
/ / 联锁关系数据生成
@ -90,7 +123,8 @@ public class DraftMapCiDataGeneratorImpl implements DraftMapCiDataGenerator {
autoReentryVOList . add ( MapAutoReentryVO . fromBO ( cycle ) ) ;
}
/ / 目的地码
List < MapDestinationCodeDefinitionVO > destinationCodeDefinitionVOList = result . getDestinationCodeDefinitionList ( ) . stream ( )
List < MapDestinationCodeDefinitionVO > destinationCodeDefinitionVOList = result . getDestinationCodeDefinitionList ( )
. stream ( )
. map ( MapDestinationCodeDefinitionVO : : fromBO ) . collect ( Collectors . toList ( ) ) ;
/ / 删除旧联锁数据 , 保存新联锁数据
@ -106,9 +140,11 @@ public class DraftMapCiDataGeneratorImpl implements DraftMapCiDataGenerator {
public int generateDepot ( Long mapId , String stationCode ) {
/ / 先校验地图基础数据
MapVO mapVO = this . draftMapService . getDraftMapData ( mapId ) ;
SimulationBuilder . SimulationDeviceBuildResult buildResult = SimulationBuilder . checkAndBuildBasicMapData ( mapVO ) ;
SimulationBuilder . SimulationDeviceBuildResult buildResult = SimulationBuilder . checkAndBuildBasicMapData (
mapVO ) ;
BusinessExceptionAssertEnum . DATA_ERROR . assertCollectionEmpty ( buildResult . getErrMsgList ( ) ,
String . format ( " 地图基础数据有错误: %s " , JsonUtils . writeValueAsString ( buildResult . getErrMsgList ( ) ) ) ) ;
String . format ( " 地图基础数据有错误: %s " ,
JsonUtils . writeValueAsString ( buildResult . getErrMsgList ( ) ) ) ) ;
MapCiGenerateConfig generateConfig = mapVO . getGraphDataNew ( ) . getGenerateConfig ( ) ;
Map < String , MapElement > deviceMap = buildResult . getDeviceMap ( ) ;
/ / 处理旧数据
@ -141,13 +177,17 @@ public class DraftMapCiDataGeneratorImpl implements DraftMapCiDataGenerator {
/ / 列车兼调车信号机 、 调车信号机
if ( signal . getType ( ) . equals ( Signal . SignalType . SHUNTING2 ) ) {
signal . setType ( Signal . SignalType . SHUNTING ) ;
generatedRouteList . addAll ( this . generateRouteDepot ( signal , routeCodeGenerator , generateConfig , errorList ) ) ;
generatedRouteList . addAll (
this . generateRouteDepot ( signal , routeCodeGenerator , generateConfig , errorList ) ) ;
signal . setType ( Signal . SignalType . SHUNTING2 ) ;
generatedRouteList . addAll ( this . generateRouteDepot ( signal , routeCodeGenerator , generateConfig , errorList ) ) ;
generatedRouteList . addAll (
this . generateRouteDepot ( signal , routeCodeGenerator , generateConfig , errorList ) ) ;
} else if ( signal . getType ( ) . equals ( Signal . SignalType . SHUNTING ) ) {
generatedRouteList . addAll ( this . generateRouteDepot ( signal , routeCodeGenerator , generateConfig , errorList ) ) ;
generatedRouteList . addAll (
this . generateRouteDepot ( signal , routeCodeGenerator , generateConfig , errorList ) ) ;
} else if ( signal . getType ( ) . equals ( Signal . SignalType . INBOUND ) ) {
generatedRouteList . addAll ( this . generateRouteDepot ( signal , routeCodeGenerator , generateConfig , errorList ) ) ;
generatedRouteList . addAll (
this . generateRouteDepot ( signal , routeCodeGenerator , generateConfig , errorList ) ) ;
}
}
log . info ( String . format ( " 生成一般进路[%s]条 " , generatedRouteList . size ( ) ) ) ;
@ -170,6 +210,7 @@ public class DraftMapCiDataGeneratorImpl implements DraftMapCiDataGenerator {
* 唯一编码生成器
* /
public static class CodeGenerator {
public static final String Prefix_Route = " Route " ;
public static final String Prefix_Overlap = " Overlap " ;
public static final String Prefix_Fls = " Fls " ;
@ -221,6 +262,7 @@ public class DraftMapCiDataGeneratorImpl implements DraftMapCiDataGenerator {
@Getter
private class CiGenerateResult {
private List < String > errMsgList ;
private List < Signal > approachList ;
@ -233,8 +275,10 @@ public class DraftMapCiDataGeneratorImpl implements DraftMapCiDataGenerator {
List < MapRoutingDataVO > routingList ;
public CiGenerateResult ( List < String > errMsgList , List < Signal > approachList , List < AutoSignal > autoSignalList , List < Route > routeList ,
List < RouteOverlap > overlapList , List < RouteFls > flsList , List < Cycle > generateCycleList , List < MapRoutingDataVO > routingList ,
public CiGenerateResult ( List < String > errMsgList , List < Signal > approachList ,
List < AutoSignal > autoSignalList , List < Route > routeList ,
List < RouteOverlap > overlapList , List < RouteFls > flsList , List < Cycle > generateCycleList ,
List < MapRoutingDataVO > routingList ,
List < DestinationCodeDefinition > destinationCodeDefinitionList ) {
this . errMsgList = errMsgList ;
this . approachList = approachList ;
@ -269,7 +313,8 @@ public class DraftMapCiDataGeneratorImpl implements DraftMapCiDataGenerator {
}
private CiGenerateResult generate ( Long mapId , Map < String , MapElement > deviceMap , MapCiGenerateConfig config ) {
private CiGenerateResult generate ( Long mapId , Map < String , MapElement > deviceMap ,
MapCiGenerateConfig config ) {
List < String > errorList = new ArrayList < > ( ) ;
List < AutoSignal > autoSignalList = new ArrayList < > ( ) ;
List < Route > generatedRouteList = new ArrayList < > ( ) ;
@ -321,7 +366,8 @@ public class DraftMapCiDataGeneratorImpl implements DraftMapCiDataGenerator {
} else if ( signal . isProtectionSignal ( ) ) {
/ / 防护信号机 , 生成进路
if ( config . isLikeHa1 ( ) ) {
generatedRouteList . addAll ( this . generateRouteLikeHa1 ( signal , routeCodeGenerator , overlapMap ,
generatedRouteList . addAll (
this . generateRouteLikeHa1 ( signal , routeCodeGenerator , overlapMap ,
overlapCodeGenerator , config , errorList ) ) ;
} else {
generatedRouteList . addAll ( this . generateRoute ( signal ,
@ -376,7 +422,8 @@ public class DraftMapCiDataGeneratorImpl implements DraftMapCiDataGenerator {
}
/ / 根据配置生成折返进路
if ( config . isGenerateTbRoute ( ) ) {
List < Route > tbRouteList = this . generateTurnBackRoute ( generatedRouteList , routeCodeGenerator , config ) ;
List < Route > tbRouteList = this . generateTurnBackRoute ( generatedRouteList , routeCodeGenerator ,
config ) ;
generatedRouteList . addAll ( tbRouteList ) ;
}
/ / 清除不需要的基本进路
@ -411,7 +458,8 @@ public class DraftMapCiDataGeneratorImpl implements DraftMapCiDataGenerator {
}
/ / 生成交路数据
List < MapRoutingDataVO > generateRoutingList = this . routingGenerator . generateAllRouting ( deviceMap , errorList ) ;
List < MapRoutingDataVO > generateRoutingList = this . routingGenerator . generateAllRouting ( deviceMap ,
errorList ) ;
/ / 目的地码生成
List < DestinationCodeDefinition > destinationCodeDefinitionList
@ -422,7 +470,8 @@ public class DraftMapCiDataGeneratorImpl implements DraftMapCiDataGenerator {
generateCycleList , generateRoutingList , destinationCodeDefinitionList ) ;
}
private List < DestinationCodeDefinition > generateDestinationCodeDefinition ( MapCiGenerateConfig config , List < Section > sectionList , List < Station > stationList ) {
private List < DestinationCodeDefinition > generateDestinationCodeDefinition (
MapCiGenerateConfig config , List < Section > sectionList , List < Station > stationList ) {
List < DestinationCodeDefinition > destinationCodeDefinitionList = new ArrayList < > ( ) ;
if ( config . isGenerateDestination ( ) ) {
String code = null ;
@ -442,9 +491,12 @@ public class DraftMapCiDataGeneratorImpl implements DraftMapCiDataGenerator {
for ( int i = 0 ; i < stationList . size ( ) ; i + + ) {
leftStation = stationList . get ( i ) ;
if ( CollectionUtils . isEmpty ( leftStation . getTurnBackList ( ) ) ) / / 没有折返轨的略过
{
continue ;
if ( i = = stationList . size ( ) - 1 )
}
if ( i = = stationList . size ( ) - 1 ) {
break ;
}
List < Section > leftTbSections = queryAfterTurnBackList ( leftStation , false ) ;
leftTbSections . addAll ( queryFrontTurnBackList ( stationList , leftStation , false ) ) ;
@ -464,8 +516,10 @@ public class DraftMapCiDataGeneratorImpl implements DraftMapCiDataGenerator {
leftFrontTurnBack = startTbSection . isNormalStandTrack ( ) ;
rightFrontTurnBack = endTbSection . isNormalStandTrack ( ) ;
destinationCodeDefinitionList . add (
new DestinationCodeDefinition ( code , type , description , null , null , right , necessarySections ,
leftStation , leftFrontTurnBack , rightStation , rightFrontTurnBack , null , null , null )
new DestinationCodeDefinition ( code , type , description , null , null , right ,
necessarySections ,
leftStation , leftFrontTurnBack , rightStation , rightFrontTurnBack , null , null ,
null )
) ;
}
}
@ -478,7 +532,9 @@ public class DraftMapCiDataGeneratorImpl implements DraftMapCiDataGenerator {
if ( ! StringUtils . hasText ( destinationCode ) ) {
continue ;
}
destinationCodeDefinitionList . add ( new DestinationCodeDefinition ( destinationCode , DestinationCodeDefinition . Type . OTHER , section ) ) ;
destinationCodeDefinitionList . add (
new DestinationCodeDefinition ( destinationCode , DestinationCodeDefinition . Type . OTHER ,
section ) ) ;
}
}
}
@ -491,9 +547,11 @@ public class DraftMapCiDataGeneratorImpl implements DraftMapCiDataGenerator {
* @param stations 所有车站
* @param right 是否是右端车站
* /
private List < Section > queryFrontTurnBackList ( List < Station > stations , Station station , boolean right ) {
private List < Section > queryFrontTurnBackList ( List < Station > stations , Station station ,
boolean right ) {
List < Section > turnBackList = station . getTurnBackList ( ) ;
if ( CollectionUtils . isEmpty ( turnBackList ) | | CollectionUtils . isEmpty ( station . getAllNormalStands ( ) ) ) {
if ( CollectionUtils . isEmpty ( turnBackList ) | | CollectionUtils . isEmpty (
station . getAllNormalStands ( ) ) ) {
return new ArrayList < > ( ) ;
}
int sn ;
@ -513,20 +571,28 @@ public class DraftMapCiDataGeneratorImpl implements DraftMapCiDataGenerator {
List < Section > tbSections = new ArrayList < > ( ) ;
if ( right ) {
if ( rightStandTrack . isTurnBackTrack ( )
& & ! CollectionUtils . isEmpty ( CalculateService . queryRoutePathsOnDirection ( rightStandTrack , adjacentLeftStandTrack , false , 10 ) ) ) {
& & ! CollectionUtils . isEmpty (
CalculateService . queryRoutePathsOnDirection ( rightStandTrack , adjacentLeftStandTrack ,
false , 10 ) ) ) {
tbSections . add ( rightStandTrack ) ;
}
if ( leftStandTrack . isTurnBackTrack ( )
& & ! CollectionUtils . isEmpty ( CalculateService . queryRoutePathsOnDirection ( adjacentRightStandTrack , leftStandTrack , true , 10 ) ) ) {
& & ! CollectionUtils . isEmpty (
CalculateService . queryRoutePathsOnDirection ( adjacentRightStandTrack , leftStandTrack , true ,
10 ) ) ) {
tbSections . add ( leftStandTrack ) ;
}
} else {
if ( rightStandTrack . isTurnBackTrack ( )
& & ! CollectionUtils . isEmpty ( CalculateService . queryRoutePathsOnDirection ( adjacentLeftStandTrack , rightStandTrack , false , 10 ) ) ) {
& & ! CollectionUtils . isEmpty (
CalculateService . queryRoutePathsOnDirection ( adjacentLeftStandTrack , rightStandTrack ,
false , 10 ) ) ) {
tbSections . add ( rightStandTrack ) ;
}
if ( leftStandTrack . isTurnBackTrack ( )
& & ! CollectionUtils . isEmpty ( CalculateService . queryRoutePathsOnDirection ( leftStandTrack , adjacentRightStandTrack , true , 10 ) ) ) {
& & ! CollectionUtils . isEmpty (
CalculateService . queryRoutePathsOnDirection ( leftStandTrack , adjacentRightStandTrack , true ,
10 ) ) ) {
tbSections . add ( leftStandTrack ) ;
}
}
@ -545,17 +611,20 @@ public class DraftMapCiDataGeneratorImpl implements DraftMapCiDataGenerator {
}
Section standTrack = station . getNormalStand ( right ) . get ( 0 ) . getSection ( ) ;
return turnBackList . stream ( ) . filter ( section - > ! section . isNormalStandTrack ( ) )
. filter ( section - > ! CollectionUtils . isEmpty ( CalculateService . queryRoutePathsOnDirection ( standTrack , section , right , 10 ) ) )
. filter ( section - > ! CollectionUtils . isEmpty (
CalculateService . queryRoutePathsOnDirection ( standTrack , section , right , 10 ) ) )
. collect ( Collectors . toList ( ) ) ;
}
private Collection < ? extends Route > generateRouteLikeHa1 ( Signal signal , CodeGenerator routeCodeGenerator ,
private Collection < ? extends Route > generateRouteLikeHa1 ( Signal signal ,
CodeGenerator routeCodeGenerator ,
Map < String , List < RouteOverlap > > overlapMap ,
CodeGenerator overlapCodeGenerator ,
MapCiGenerateConfig config , List < String > errorList ) {
/ / 生成ATP信号
List < Route > routeList = new ArrayList < > ( ) ;
List < Route > atpRouteList = this . generateRoute ( signal , routeCodeGenerator , overlapMap , overlapCodeGenerator , config , errorList ) ;
List < Route > atpRouteList = this . generateRoute ( signal , routeCodeGenerator , overlapMap ,
overlapCodeGenerator , config , errorList ) ;
if ( ! CollectionUtils . isEmpty ( atpRouteList ) ) {
for ( Route route : atpRouteList ) {
route . setAtp ( true ) ;
@ -567,7 +636,8 @@ public class DraftMapCiDataGeneratorImpl implements DraftMapCiDataGenerator {
}
}
/ / 生成地面信号
List < Route > groundRouteList = this . generateGroundRoute ( signal , routeCodeGenerator , overlapMap , overlapCodeGenerator , config , errorList ) ;
List < Route > groundRouteList = this . generateGroundRoute ( signal , routeCodeGenerator , overlapMap ,
overlapCodeGenerator , config , errorList ) ;
if ( ! CollectionUtils . isEmpty ( groundRouteList ) ) {
for ( Route ground : groundRouteList ) {
ground . setGround ( true ) ;
@ -578,14 +648,16 @@ public class DraftMapCiDataGeneratorImpl implements DraftMapCiDataGenerator {
/ / 生成引导信号
if ( ! CollectionUtils . isEmpty ( groundRouteList ) ) {
for ( Route route : groundRouteList ) {
Route guide = this . buildGuideRouteFromGroundRoute ( route , routeCodeGenerator , config . isRouteInterlockDoNotIncludeStandHoldTrain ( ) ) ;
Route guide = this . buildGuideRouteFromGroundRoute ( route , routeCodeGenerator ,
config . isRouteInterlockDoNotIncludeStandHoldTrain ( ) ) ;
routeList . add ( guide ) ;
}
}
return routeList ;
}
private Route buildGuideRouteFromGroundRoute ( Route route , CodeGenerator routeCodeGenerator , boolean noStandHold ) {
private Route buildGuideRouteFromGroundRoute ( Route route , CodeGenerator routeCodeGenerator ,
boolean noStandHold ) {
Route clone = new Route ( routeCodeGenerator . next ( ) , route . getName ( ) ) ;
clone . setArs ( false ) ;
clone . setGuide ( true ) ;
@ -616,7 +688,8 @@ public class DraftMapCiDataGeneratorImpl implements DraftMapCiDataGenerator {
List < SectionPath > routePathList = new ArrayList < > ( ) ;
getRoutePathOf ( signal , startSection , true ,
new SectionPath ( right ) , routePathList , config , errorList ) ;
List < Route > routeList = this . buildRouteFromPath ( signal , routeCodeGenerator , routePathList , overlapMap ,
List < Route > routeList = this . buildRouteFromPath ( signal , routeCodeGenerator , routePathList ,
overlapMap ,
overlapCodeGenerator , config , errorList ) ;
return routeList ;
}
@ -645,7 +718,8 @@ public class DraftMapCiDataGeneratorImpl implements DraftMapCiDataGenerator {
return routeList ;
}
private List < Route > buildRouteFromPath ( Signal start , CodeGenerator routeCodeGenerator , List < SectionPath > routePathList ,
private List < Route > buildRouteFromPath ( Signal start , CodeGenerator routeCodeGenerator ,
List < SectionPath > routePathList ,
Map < String , List < RouteOverlap > > overlapMap ,
CodeGenerator overlapCodeGenerator ,
MapCiGenerateConfig config , List < String > errorList ) {
@ -690,8 +764,10 @@ public class DraftMapCiDataGeneratorImpl implements DraftMapCiDataGenerator {
for ( RouteOverlap routeOverlap : overlapList ) {
String code = routeCodeGenerator . next ( ) ;
String name = String . format ( " %s-%s_%s " , start . getName ( ) , endName , index ) ;
Route route = this . buildRoute ( code , name , start , end , clickEnd , sectionPath , routeOverlap ,
config . isRouteSignalAlwaysGreen ( ) , config . isRouteInterlockDoNotIncludeStandHoldTrain ( ) , singleTrain ) ;
Route route = this . buildRoute ( code , name , start , end , clickEnd , sectionPath ,
routeOverlap ,
config . isRouteSignalAlwaysGreen ( ) ,
config . isRouteInterlockDoNotIncludeStandHoldTrain ( ) , singleTrain ) ;
routeList . add ( route ) ;
+ + index ;
}
@ -699,7 +775,8 @@ public class DraftMapCiDataGeneratorImpl implements DraftMapCiDataGenerator {
String code = routeCodeGenerator . next ( ) ;
String name = String . format ( " %s-%s " , start . getName ( ) , endName ) ;
Route route = this . buildRoute ( code , name , start , end , clickEnd , sectionPath , null ,
config . isRouteSignalAlwaysGreen ( ) , config . isRouteInterlockDoNotIncludeStandHoldTrain ( ) , singleTrain ) ;
config . isRouteSignalAlwaysGreen ( ) ,
config . isRouteInterlockDoNotIncludeStandHoldTrain ( ) , singleTrain ) ;
routeList . add ( route ) ;
} else {
String code = routeCodeGenerator . next ( ) ;
@ -709,12 +786,14 @@ public class DraftMapCiDataGeneratorImpl implements DraftMapCiDataGenerator {
overlap = overlapList . get ( 0 ) ;
}
Route route = this . buildRoute ( code , name , start , end , clickEnd , sectionPath , overlap ,
config . isRouteSignalAlwaysGreen ( ) , config . isRouteInterlockDoNotIncludeStandHoldTrain ( ) , singleTrain ) ;
config . isRouteSignalAlwaysGreen ( ) ,
config . isRouteInterlockDoNotIncludeStandHoldTrain ( ) , singleTrain ) ;
routeList . add ( route ) ;
}
}
} else {
errorList . add ( String . format ( " 以[%s(%s)]为始端信号的进路未搜索到 " , start . getName ( ) , start . getCode ( ) ) ) ;
errorList . add (
String . format ( " 以[%s(%s)]为始端信号的进路未搜索到 " , start . getName ( ) , start . getCode ( ) ) ) ;
}
return routeList ;
}
@ -724,11 +803,13 @@ public class DraftMapCiDataGeneratorImpl implements DraftMapCiDataGenerator {
boolean right = start . isRight ( ) ;
Section startSection = start . getSection ( ) . getSectionOf ( right ) ;
List < SectionPath > routePathList = new ArrayList < > ( ) ;
getRoutePathOfDepot ( start , startSection , new SectionPath ( right ) , routePathList , config , errorList ) ;
getRoutePathOfDepot ( start , startSection , new SectionPath ( right ) , routePathList , config ,
errorList ) ;
return buildRouteFromPathDepot ( start , routeCodeGenerator , routePathList , config , errorList ) ;
}
private List < Route > buildRouteFromPathDepot ( Signal startSignal , CodeGenerator routeCodeGenerator , List < SectionPath > routePathList ,
private List < Route > buildRouteFromPathDepot ( Signal startSignal , CodeGenerator routeCodeGenerator ,
List < SectionPath > routePathList ,
MapCiGenerateConfig config , List < String > errorList ) {
boolean right = startSignal . isRight ( ) ;
List < Route > routeList = new ArrayList < > ( ) ;
@ -741,16 +822,20 @@ public class DraftMapCiDataGeneratorImpl implements DraftMapCiDataGenerator {
Signal . SignalType endSignalType = Objects . nonNull ( endSignal ) ? endSignal . getType ( ) : null ;
/ / 反向信号机
Signal endOpSignal = lastSection . getSignalOf ( ! right ) ;
Signal . SignalType endOpSignalType = Objects . nonNull ( endOpSignal ) ? endOpSignal . getType ( ) : null ;
Signal . SignalType endOpSignalType =
Objects . nonNull ( endOpSignal ) ? endOpSignal . getType ( ) : null ;
Section nextSection = lastSection . getSectionOf ( right ) ;
/ / 下个区段反向信号机
Signal nextOpSignal = Objects . nonNull ( nextSection ) ? nextSection . getSignalOf ( ! right ) : null ;
Signal clickEnd ;
SignalAspect signalAspect ;
if ( ( Signal . SignalType . SHUNTING2 . equals ( endSignalType ) & & Signal . SignalType . SHUNTING2 . equals ( startSignalType ) )
| | ( Signal . SignalType . SHUNTING2 . equals ( endSignalType ) & & Signal . SignalType . INBOUND . equals ( startSignalType ) )
| | ( Signal . SignalType . OUTBOUND . equals ( endSignalType ) & & Signal . SignalType . SHUNTING2 . equals ( startSignalType ) ) ) {
if ( ( Signal . SignalType . SHUNTING2 . equals ( endSignalType )
& & Signal . SignalType . SHUNTING2 . equals ( startSignalType ) )
| | ( Signal . SignalType . SHUNTING2 . equals ( endSignalType )
& & Signal . SignalType . INBOUND . equals ( startSignalType ) )
| | ( Signal . SignalType . OUTBOUND . equals ( endSignalType )
& & Signal . SignalType . SHUNTING2 . equals ( startSignalType ) ) ) {
/ / 列车进路
signalAspect = SignalAspect . Y ;
if ( Objects . nonNull ( endOpSignal ) & & ( Signal . SignalType . SHUNTING2 . equals ( endOpSignalType )
@ -774,15 +859,18 @@ public class DraftMapCiDataGeneratorImpl implements DraftMapCiDataGenerator {
}
}
String endName = Objects . nonNull ( endSignal ) ? endSignal . getShowName ( ) : lastSection . getName ( ) ;
String endName =
Objects . nonNull ( endSignal ) ? endSignal . getShowName ( ) : lastSection . getName ( ) ;
/ / 构建进路
String code = routeCodeGenerator . next ( ) ;
String name = String . format ( " %s-%s " , startSignal . getShowName ( ) , endName ) ;
Route route = this . buildRouteDepot ( code , name , startSignal , endSignal , clickEnd , sectionPath , signalAspect ) ;
Route route = this . buildRouteDepot ( code , name , startSignal , endSignal , clickEnd ,
sectionPath , signalAspect ) ;
routeList . add ( route ) ;
}
} else {
errorList . add ( String . format ( " 以[%s(%s)]为始端信号(%s)的进路未搜索到 " , startSignal . getShowName ( ) ,
errorList . add (
String . format ( " 以[%s(%s)]为始端信号(%s)的进路未搜索到 " , startSignal . getShowName ( ) ,
startSignal . getCode ( ) , startSignal . getType ( ) ) ) ;
}
return routeList ;
@ -824,7 +912,8 @@ public class DraftMapCiDataGeneratorImpl implements DraftMapCiDataGenerator {
* @param generatedRouteList
* /
private void deleteBaseRoute ( List < Signal > signalList , List < Route > generatedRouteList ) {
Map < String , Signal > signalMap = signalList . stream ( ) . collect ( Collectors . toMap ( Signal : : getCode , Function . identity ( ) ) ) ;
Map < String , Signal > signalMap = signalList . stream ( )
. collect ( Collectors . toMap ( Signal : : getCode , Function . identity ( ) ) ) ;
List < Route > removeList = new ArrayList < > ( ) ;
for ( Route route : generatedRouteList ) {
if ( route . isTurnBack ( ) ) { / / 折返进路不处理
@ -874,7 +963,8 @@ public class DraftMapCiDataGeneratorImpl implements DraftMapCiDataGenerator {
Switch linkedSwitch = aSwitch . queryLinkedSwitch ( ) ;
if ( Objects . nonNull ( linkedSwitch ) ) {
/ / 联动道岔存在 , 联动道岔定位即为一级侧防
RouteFls . FlsElement flsElement = new RouteFls . FlsElement ( new SwitchElement ( linkedSwitch , true ) ) ;
RouteFls . FlsElement flsElement = new RouteFls . FlsElement (
new SwitchElement ( linkedSwitch , true ) ) ;
fls . addLevel1 ( flsElement ) ;
} else {
/ / 无联动道岔 , 则从道岔C区段向外查询 , 第一个反向信号机和经过的路径道岔位置构成一级侧防
@ -883,8 +973,10 @@ public class DraftMapCiDataGeneratorImpl implements DraftMapCiDataGenerator {
/ / 尽头区段 , 不需构成侧防
return null ;
}
BusinessExceptionAssertEnum . DATA_ERROR . assertNotTrue ( c . getLeftSection ( ) ! = null & & c . getRightSection ( ) ! = null ,
String . format ( " 道岔区段[%s]关联区段关系异常,只能最多一边关联,实际两边都关联了区段 " , c . debugStr ( ) ) ) ;
BusinessExceptionAssertEnum . DATA_ERROR . assertNotTrue (
c . getLeftSection ( ) ! = null & & c . getRightSection ( ) ! = null ,
String . format ( " 道岔区段[%s]关联区段关系异常,只能最多一边关联,实际两边都关联了区段 " ,
c . debugStr ( ) ) ) ;
boolean right = true ;
Section startSection = c . getRightSection ( ) ;
if ( c . getLeftSection ( ) ! = null ) { / / 左向区段存在 , 方向向左
@ -910,7 +1002,8 @@ public class DraftMapCiDataGeneratorImpl implements DraftMapCiDataGenerator {
relSwitch . isC ( firstSection ) & & relSwitch . isA ( pre ) ) ) {
normal = false ;
}
flsElement = new RouteFls . FlsElement ( oppositeSignal , new SwitchElement ( relSwitch , normal ) ) ;
flsElement = new RouteFls . FlsElement ( oppositeSignal ,
new SwitchElement ( relSwitch , normal ) ) ;
} else {
flsElement = new RouteFls . FlsElement ( oppositeSignal ) ;
}
@ -921,7 +1014,8 @@ public class DraftMapCiDataGeneratorImpl implements DraftMapCiDataGenerator {
if ( next ! = null ) {
if ( next . isSwitchTrack ( ) & & next . getRelSwitch ( ) . isC ( next ) ) {
/ / C区段 , 一级侧防为此道岔定位
RouteFls . FlsElement flsElement = new RouteFls . FlsElement ( new SwitchElement ( next . getRelSwitch ( ) , true ) ) ;
RouteFls . FlsElement flsElement = new RouteFls . FlsElement (
new SwitchElement ( next . getRelSwitch ( ) , true ) ) ;
fls . addLevel1 ( flsElement ) ;
pre = null ;
} else {
@ -966,8 +1060,10 @@ public class DraftMapCiDataGeneratorImpl implements DraftMapCiDataGenerator {
/ / 尽头区段 , 不需构成侧防
return null ;
}
BusinessExceptionAssertEnum . DATA_ERROR . assertNotTrue ( b . getLeftSection ( ) ! = null & & b . getRightSection ( ) ! = null ,
String . format ( " 道岔区段[%s]关联区段关系异常,只能最多一边关联,实际两边都关联了区段 " , b . debugStr ( ) ) ) ;
BusinessExceptionAssertEnum . DATA_ERROR . assertNotTrue (
b . getLeftSection ( ) ! = null & & b . getRightSection ( ) ! = null ,
String . format ( " 道岔区段[%s]关联区段关系异常,只能最多一边关联,实际两边都关联了区段 " ,
b . debugStr ( ) ) ) ;
boolean right = true ;
Section startSection = b . getRightSection ( ) ;
if ( b . getLeftSection ( ) ! = null ) { / / 左向区段存在 , 方向向左
@ -990,9 +1086,11 @@ public class DraftMapCiDataGeneratorImpl implements DraftMapCiDataGenerator {
! Objects . equals ( aSwitch . queryAxleRelatedOtherSwitch ( ) , relSwitch ) ) {
Switch remoteSwitch = relSwitch . queryAxleRelatedOtherSwitch ( ) ;
if ( Objects . nonNull ( remoteSwitch ) ) {
flsElement = new RouteFls . FlsElement ( oppositeSignal , new SwitchElement ( remoteSwitch , true ) ) ;
flsElement = new RouteFls . FlsElement ( oppositeSignal ,
new SwitchElement ( remoteSwitch , true ) ) ;
} else {
flsElement = new RouteFls . FlsElement ( oppositeSignal , new SwitchElement ( relSwitch , true ) ) ;
flsElement = new RouteFls . FlsElement ( oppositeSignal ,
new SwitchElement ( relSwitch , true ) ) ;
}
} else {
flsElement = new RouteFls . FlsElement ( oppositeSignal ) ;
@ -1003,7 +1101,8 @@ public class DraftMapCiDataGeneratorImpl implements DraftMapCiDataGenerator {
if ( next ! = null ) {
if ( next . isSwitchTrack ( ) & & next . getRelSwitch ( ) . isC ( next ) ) {
/ / C区段 , 一级侧防为此道岔定位
RouteFls . FlsElement flsElement = new RouteFls . FlsElement ( new SwitchElement ( next . getRelSwitch ( ) , true ) ) ;
RouteFls . FlsElement flsElement = new RouteFls . FlsElement (
new SwitchElement ( next . getRelSwitch ( ) , true ) ) ;
fls . addLevel1 ( flsElement ) ;
} else {
sectionStack . push ( next ) ;
@ -1063,13 +1162,18 @@ public class DraftMapCiDataGeneratorImpl implements DraftMapCiDataGenerator {
if ( station . getSn ( ) > min & & station . getSn ( ) < max ) {
BusinessExceptionAssertEnum . CI_GENERATE_ERROR
. assertTrue ( station . isDepot ( ) | | station . isNoDepotAndNoNormalStand ( ) ,
String . format ( " 交路[%s]下的站间运行等级[%s]数据间隔车站大于1且间隔中的车站[%s]是正常可停靠车站 " ,
String . format (
" 交路[%s]下的站间运行等级[%s]数据间隔车站大于1且间隔中的车站[%s]是正常可停靠车站 " ,
String . format ( " %s(%s)->%s(%s) " ,
routingStartSection . getStation ( ) . getName ( ) , routingStartSection . getName ( ) ,
routingEndSection . getStation ( ) . getName ( ) , routingEndSection . getName ( ) ) ,
routingStartSection . getStation ( ) . getName ( ) ,
routingStartSection . getName ( ) ,
routingEndSection . getStation ( ) . getName ( ) ,
routingEndSection . getName ( ) ) ,
String . format ( " %s(%s(%s))->%s(%s(%s)) " ,
startSection . getStation ( ) . getName ( ) , startSection . getName ( ) , startSection . getCode ( ) ,
endSection . getStation ( ) . getName ( ) , endSection . getName ( ) , endSection . getCode ( ) ) ,
startSection . getStation ( ) . getName ( ) , startSection . getName ( ) ,
startSection . getCode ( ) ,
endSection . getStation ( ) . getName ( ) , endSection . getName ( ) ,
endSection . getCode ( ) ) ,
station . getName ( ) ) ) ;
}
}
@ -1081,14 +1185,17 @@ public class DraftMapCiDataGeneratorImpl implements DraftMapCiDataGenerator {
runLevelVO . setEndSectionCode ( endSection . getCode ( ) ) ;
runLevelVO . setEndStationCode ( endSection . getStation ( ) . getCode ( ) ) ;
runLevelVO . setRight ( right ) ;
List < RoutePath > routePaths = CalculateService . queryRoutePathsOnDirection ( startSection , endSection , right , 10 ) ;
List < RoutePath > routePaths = CalculateService . queryRoutePathsOnDirection ( startSection ,
endSection , right , 10 ) ;
if ( CollectionUtils . isEmpty ( routePaths ) ) {
/ / 未找到 , 反方向再找
routePaths = CalculateService . queryRoutePathsOnDirection ( startSection , endSection , ! right , 10 ) ;
routePaths = CalculateService . queryRoutePathsOnDirection ( startSection , endSection , ! right ,
10 ) ;
if ( ! CollectionUtils . isEmpty ( routePaths ) ) {
log . info ( String . format ( " 站间运行等级[%s]与交路[%s]方向相反,实际为[%s] " ,
String . format ( " %s(%s(%s))->%s(%s(%s)) " ,
startSection . getStation ( ) . getName ( ) , startSection . getName ( ) , startSection . getCode ( ) ,
startSection . getStation ( ) . getName ( ) , startSection . getName ( ) ,
startSection . getCode ( ) ,
endSection . getStation ( ) . getName ( ) , endSection . getName ( ) , endSection . getCode ( ) ) ,
String . format ( " %s(%s)->%s(%s) " ,
routingStartSection . getStation ( ) . getName ( ) , routingStartSection . getName ( ) ,
@ -1098,8 +1205,10 @@ public class DraftMapCiDataGeneratorImpl implements DraftMapCiDataGenerator {
}
}
if ( CollectionUtils . isEmpty ( routePaths ) ) {
log . warn ( String . format ( " 站间运行等级数据生成失败:没有找到[%s(%s) ——> %s(%s)]对应方向[%s]的站间 " ,
startSection . getStation ( ) . getName ( ) , startSection . getName ( ) , endSection . getStation ( ) . getName ( ) , endSection . getName ( ) , right ? " 右向 " : " 左向 " ) ) ;
log . warn ( String . format (
" 站间运行等级数据生成失败:没有找到[%s(%s) ——> %s(%s)]对应方向[%s]的站间 " ,
startSection . getStation ( ) . getName ( ) , startSection . getName ( ) ,
endSection . getStation ( ) . getName ( ) , endSection . getName ( ) , right ? " 右向 " : " 左向 " ) ) ;
/ / errorList . add ( String . format ( " 站间运行等级数据生成失败:没有找到[%s(%s) ——> %s(%s)]对应方向[%s]的站间 " ,
/ / startSection . getStation ( ) . getName ( ) , startSection . getName ( ) , endSection . getStation ( ) . getName ( ) , endSection . getName ( ) , right ? " 右向 " : " 左向 " ) ) ;
continue ;
@ -1117,7 +1226,8 @@ public class DraftMapCiDataGeneratorImpl implements DraftMapCiDataGenerator {
}
}
private void buildAutoSignalRouteConflict ( List < AutoSignal > autoSignalList , List < Route > generatedRouteList ) {
private void buildAutoSignalRouteConflict ( List < AutoSignal > autoSignalList ,
List < Route > generatedRouteList ) {
if ( CollectionUtils . isEmpty ( autoSignalList ) ) {
/ / 自动信号为空 , 返回
return ;
@ -1195,7 +1305,8 @@ public class DraftMapCiDataGeneratorImpl implements DraftMapCiDataGenerator {
}
}
if ( Objects . isNull ( basicRoute ) ) {
errorList . add ( String . format ( " 自动折返数据生成失败:折返进路[%s(%s)]的反向基本进路不存在 " ,
errorList . add (
String . format ( " 自动折返数据生成失败:折返进路[%s(%s)]的反向基本进路不存在 " ,
tbRoute . getName ( ) , tbRoute . getCode ( ) ) ) ;
continue ;
}
@ -1310,8 +1421,12 @@ public class DraftMapCiDataGeneratorImpl implements DraftMapCiDataGenerator {
String code = routeCodeGenerator . next ( ) ;
Route tbRoute = new Route ( code , name ) ;
/ / 拷贝进路其他属性
this . copyToTurnBackRoute ( route , tbRoute , config . isRouteInterlockDoNotIncludeStandHoldTrain ( ) ) ;
this . copyToTurnBackRoute ( route , tbRoute ,
config . isRouteInterlockDoNotIncludeStandHoldTrain ( ) ) ;
tbRoute . setTurnBack ( true ) ;
if ( config . isTbRouteNameUseEndOppositeSignalName ( ) ) {
tbRoute . setDestinationButtonSignal ( endOppositeSignal ) ;
}
/ / 如果生成进路按钮 , 折返进路按钮默认为终端信号机
if ( config . isRouteButton ( ) ) {
tbRoute . setDestinationButtonSignal ( route . getDestination ( ) ) ;
@ -1424,7 +1539,8 @@ public class DraftMapCiDataGeneratorImpl implements DraftMapCiDataGenerator {
* /
private Route buildRoute ( String code , String name ,
Signal start , Signal end , Signal endButton ,
SectionPath sectionPath , RouteOverlap routeOverlap , boolean alwaysGreen , boolean noStandHold , boolean singleTrain ) {
SectionPath sectionPath , RouteOverlap routeOverlap , boolean alwaysGreen , boolean noStandHold ,
boolean singleTrain ) {
Route route = new Route ( code , name ) ;
route . setInterlockStation ( start . getInterlockStation ( ) ) ;
route . setStart ( start ) ;
@ -1436,7 +1552,7 @@ public class DraftMapCiDataGeneratorImpl implements DraftMapCiDataGenerator {
route . setSingleTrain ( singleTrain ) ;
SignalModel signalModel = start . getSignalModel ( ) ;
switch ( signalModel ) {
case RGY : {
case RGY : {
route . setAspect ( SignalAspect . G ) ;
if ( ! alwaysGreen & & sectionPath . containRpSwitch ( ) ) {
route . setAspect ( SignalAspect . Y ) ;
@ -1447,7 +1563,8 @@ public class DraftMapCiDataGeneratorImpl implements DraftMapCiDataGenerator {
route . setAspect ( SignalAspect . W ) ;
break ;
default :
throw BusinessExceptionAssertEnum . DATA_ERROR . exception ( String . format ( " 信号机[%s]型号[%s]不正确 " ,
throw BusinessExceptionAssertEnum . DATA_ERROR . exception (
String . format ( " 信号机[%s]型号[%s]不正确 " ,
start . debugStr ( ) , start . getSignalModel ( ) ) ) ;
}
route . setTurnBack ( false ) ;
@ -1641,7 +1758,8 @@ public class DraftMapCiDataGeneratorImpl implements DraftMapCiDataGenerator {
List < SectionPath > triggerPathList = new ArrayList < > ( ) ;
Section section = signalSection ;
/ / 反方向找触发区段
this . getOverlapTriggerPathOf ( end , section , ! right , new SectionPath ( ! right ) , triggerPathList ) ;
this . getOverlapTriggerPathOf ( end , section , ! right , new SectionPath ( ! right ) ,
triggerPathList ) ;
routeOverlap . setTriggerPathList ( triggerPathList ) ;
}
overlapList . add ( routeOverlap ) ;
@ -1714,7 +1832,8 @@ public class DraftMapCiDataGeneratorImpl implements DraftMapCiDataGenerator {
getOverlapTriggerPathOf ( end , relSwitch . getA ( ) . getSectionOf ( right ) , right ,
tempPath , triggerPathList ) ;
} else {
log . error ( String . format ( " 地图基础数据有错误:区段[%s(%s)]关联了道岔[%s(%s)],却不是此道岔的关联区段 " ,
log . error ( String . format (
" 地图基础数据有错误:区段[%s(%s)]关联了道岔[%s(%s)],却不是此道岔的关联区段 " ,
section . getName ( ) , section . getCode ( ) ,
relSwitch . getName ( ) , relSwitch . getCode ( ) ) ) ;
return ;
@ -1753,7 +1872,8 @@ public class DraftMapCiDataGeneratorImpl implements DraftMapCiDataGenerator {
}
} else if ( Objects . isNull ( section ) ) { / / 如果区段不存在 , 就没有延续保护区段
return ;
} else if ( config . isOverlapOnlySwitch ( ) & & ! section . isSwitchTrack ( ) ) { / / 如果只构建道岔延续保护 , 不是道岔区段 , 不构建 , 返回
} else if ( config . isOverlapOnlySwitch ( )
& & ! section . isSwitchTrack ( ) ) { / / 如果只构建道岔延续保护 , 不是道岔区段 , 不构建 , 返回
return ;
}
tempPath . addSection ( section ) ;
@ -1785,7 +1905,8 @@ public class DraftMapCiDataGeneratorImpl implements DraftMapCiDataGenerator {
/ / if ( config . isCoupleSwitch ( ) ) {
/ / 如果是同一道岔计轴 , 添加另一道岔定位
Switch otherSwitch = relSwitch . queryAxleRelatedOtherSwitch ( ) ;
if ( ! config . isGenerateFls ( ) & & Objects . nonNull ( otherSwitch ) & & relSwitch . isBConnectTo ( otherSwitch ) ) {
if ( ! config . isGenerateFls ( ) & & Objects . nonNull ( otherSwitch ) & & relSwitch . isBConnectTo (
otherSwitch ) ) {
rpPath . addSwitchElement ( new SwitchElement ( otherSwitch , true ) ) ;
}
/ / }
@ -1815,13 +1936,15 @@ public class DraftMapCiDataGeneratorImpl implements DraftMapCiDataGenerator {
getOverlapPathOf ( relSwitch . getA ( ) . getSectionOf ( right ) , right ,
tempPath , overlapPathList , config , errorList ) ;
} else {
errorList . add ( String . format ( " 地图基础数据有错误:区段[%s(%s)]关联了道岔[%s(%s)],却不是此道岔的关联区段 " ,
errorList . add ( String . format (
" 地图基础数据有错误:区段[%s(%s)]关联了道岔[%s(%s)],却不是此道岔的关联区段 " ,
section . getName ( ) , section . getCode ( ) ,
relSwitch . getName ( ) , relSwitch . getCode ( ) ) ) ;
return ;
}
} else {
getOverlapPathOf ( section . getSectionOf ( right ) , right , tempPath , overlapPathList , config , errorList ) ;
getOverlapPathOf ( section . getSectionOf ( right ) , right , tempPath , overlapPathList , config ,
errorList ) ;
}
}
@ -1883,7 +2006,8 @@ public class DraftMapCiDataGeneratorImpl implements DraftMapCiDataGenerator {
if ( ! config . isGenerateFls ( ) & & Objects . nonNull ( linkedSwitch ) ) {
npPath . addSwitchElement ( new SwitchElement ( linkedSwitch , true ) ) ;
}
getRoutePathOf ( startSignal , relSwitch . getB ( ) . getSectionOf ( right ) , ground , npPath , routePathList , config , errorList ) ;
getRoutePathOf ( startSignal , relSwitch . getB ( ) . getSectionOf ( right ) , ground , npPath ,
routePathList , config , errorList ) ;
SectionPath rpPath = tempPath . cloneNew ( ) ; / / 反位路径
rpPath . addSection ( relSwitch . getC ( ) ) ;
rpPath . addSwitchElement ( new SwitchElement ( relSwitch , false ) ) ;
@ -1892,7 +2016,8 @@ public class DraftMapCiDataGeneratorImpl implements DraftMapCiDataGenerator {
/ / }
/ / 如果是同一道岔计轴 , 添加另一道岔定位
Switch otherSwitch = relSwitch . queryAxleRelatedOtherSwitch ( ) ;
if ( ! config . isGenerateFls ( ) & & Objects . nonNull ( otherSwitch ) & & relSwitch . isBConnectTo ( otherSwitch ) ) {
if ( ! config . isGenerateFls ( ) & & Objects . nonNull ( otherSwitch ) & & relSwitch . isBConnectTo (
otherSwitch ) ) {
rpPath . addSwitchElement ( new SwitchElement ( otherSwitch , true ) ) ;
/ / 另一道岔联动道岔也需要
Switch otherLinkSwitch = otherSwitch . queryLinkedSwitch ( ) ;
@ -1900,7 +2025,8 @@ public class DraftMapCiDataGeneratorImpl implements DraftMapCiDataGenerator {
rpPath . addSwitchElement ( new SwitchElement ( otherLinkSwitch , true ) ) ;
}
}
getRoutePathOf ( startSignal , relSwitch . getC ( ) . getSectionOf ( right ) , ground , rpPath , routePathList , config , errorList ) ;
getRoutePathOf ( startSignal , relSwitch . getC ( ) . getSectionOf ( right ) , ground , rpPath ,
routePathList , config , errorList ) ;
} else if ( relSwitch . isB ( section ) ) {
/ / 只有一条路径 , 从B - > A , 道岔定位
tempPath . addSection ( relSwitch . getA ( ) ) ;
@ -1909,7 +2035,8 @@ public class DraftMapCiDataGeneratorImpl implements DraftMapCiDataGenerator {
if ( ! config . isGenerateFls ( ) & & Objects . nonNull ( linkedSwitch ) ) {
tempPath . addSwitchElement ( new SwitchElement ( linkedSwitch , true ) ) ;
}
getRoutePathOf ( startSignal , relSwitch . getA ( ) . getSectionOf ( right ) , ground , tempPath , routePathList , config , errorList ) ;
getRoutePathOf ( startSignal , relSwitch . getA ( ) . getSectionOf ( right ) , ground , tempPath ,
routePathList , config , errorList ) ;
} else if ( relSwitch . isC ( section ) ) {
/ / 只有一条路径 , 从C - > A , 道岔反位
tempPath . addSection ( relSwitch . getA ( ) ) ;
@ -1927,9 +2054,11 @@ public class DraftMapCiDataGeneratorImpl implements DraftMapCiDataGenerator {
tempPath . addSwitchElement ( new SwitchElement ( otherLinkSwitch , true ) ) ;
}
}
getRoutePathOf ( startSignal , relSwitch . getA ( ) . getSectionOf ( right ) , ground , tempPath , routePathList , config , errorList ) ;
getRoutePathOf ( startSignal , relSwitch . getA ( ) . getSectionOf ( right ) , ground , tempPath ,
routePathList , config , errorList ) ;
} else {
errorList . add ( String . format ( " 地图基础数据有错误:区段[%s(%s)]关联了道岔[%s(%s)],却不是此道岔的关联区段 " ,
errorList . add ( String . format (
" 地图基础数据有错误:区段[%s(%s)]关联了道岔[%s(%s)],却不是此道岔的关联区段 " ,
section . getName ( ) , section . getCode ( ) ,
relSwitch . getName ( ) , relSwitch . getCode ( ) ) ) ;
return ;
@ -1957,7 +2086,8 @@ public class DraftMapCiDataGeneratorImpl implements DraftMapCiDataGenerator {
}
if ( Objects . isNull ( section ) ) {
Signal lastSignal = tempPath . getLastSection ( ) . getSignalOf ( ! right ) ;
if ( Objects . nonNull ( lastSignal ) & & lastSignal . getType ( ) . equals ( Signal . SignalType . SHUNTING2 ) ) {
if ( Objects . nonNull ( lastSignal ) & & lastSignal . getType ( )
. equals ( Signal . SignalType . SHUNTING2 ) ) {
routePathList . add ( tempPath ) ;
}
return ;
@ -1997,7 +2127,8 @@ public class DraftMapCiDataGeneratorImpl implements DraftMapCiDataGenerator {
if ( Objects . nonNull ( linkedSwitch ) ) {
npPath . addSwitchElement ( new SwitchElement ( linkedSwitch , true ) ) ;
}
getRoutePathOfDepot ( startSignal , relSwitch . getB ( ) . getSectionOf ( right ) , npPath , routePathList , config , errorList ) ;
getRoutePathOfDepot ( startSignal , relSwitch . getB ( ) . getSectionOf ( right ) , npPath ,
routePathList , config , errorList ) ;
SectionPath rpPath = tempPath . cloneNew ( ) ; / / 反位路径
rpPath . addSection ( relSwitch . getC ( ) ) ;
rpPath . addSwitchElement ( new SwitchElement ( relSwitch , false ) ) ;
@ -2011,7 +2142,8 @@ public class DraftMapCiDataGeneratorImpl implements DraftMapCiDataGenerator {
rpPath . addSwitchElement ( new SwitchElement ( otherLinkSwitch , true ) ) ;
}
}
getRoutePathOfDepot ( startSignal , relSwitch . getC ( ) . getSectionOf ( right ) , rpPath , routePathList , config , errorList ) ;
getRoutePathOfDepot ( startSignal , relSwitch . getC ( ) . getSectionOf ( right ) , rpPath ,
routePathList , config , errorList ) ;
} else if ( relSwitch . isB ( section ) ) {
/ / 只有一条路径 , 从B - > A , 道岔定位
tempPath . addSection ( relSwitch . getA ( ) ) ;
@ -2020,7 +2152,8 @@ public class DraftMapCiDataGeneratorImpl implements DraftMapCiDataGenerator {
if ( Objects . nonNull ( linkedSwitch ) ) {
tempPath . addSwitchElement ( new SwitchElement ( linkedSwitch , true ) ) ;
}
getRoutePathOfDepot ( startSignal , relSwitch . getA ( ) . getSectionOf ( right ) , tempPath , routePathList , config , errorList ) ;
getRoutePathOfDepot ( startSignal , relSwitch . getA ( ) . getSectionOf ( right ) , tempPath ,
routePathList , config , errorList ) ;
} else if ( relSwitch . isC ( section ) ) {
/ / 只有一条路径 , 从C - > A , 道岔反位
tempPath . addSection ( relSwitch . getA ( ) ) ;
@ -2035,9 +2168,11 @@ public class DraftMapCiDataGeneratorImpl implements DraftMapCiDataGenerator {
tempPath . addSwitchElement ( new SwitchElement ( otherLinkSwitch , true ) ) ;
}
}
getRoutePathOfDepot ( startSignal , relSwitch . getA ( ) . getSectionOf ( right ) , tempPath , routePathList , config , errorList ) ;
getRoutePathOfDepot ( startSignal , relSwitch . getA ( ) . getSectionOf ( right ) , tempPath ,
routePathList , config , errorList ) ;
} else {
errorList . add ( String . format ( " 地图基础数据有错误:区段[%s(%s)]关联了道岔[%s(%s)],却不是此道岔的关联区段 " ,
errorList . add ( String . format (
" 地图基础数据有错误:区段[%s(%s)]关联了道岔[%s(%s)],却不是此道岔的关联区段 " ,
section . getName ( ) , section . getCode ( ) ,
relSwitch . getName ( ) , relSwitch . getCode ( ) ) ) ;
return ;
@ -2070,7 +2205,9 @@ public class DraftMapCiDataGeneratorImpl implements DraftMapCiDataGenerator {
List < Section > logicApproachList = new ArrayList < > ( ) ;
List < Section > sectionList = sectionPath . getSectionList ( ) ;
for ( Section phySection : sectionList ) {
if ( len > = 600 ) break ;
if ( len > = 600 ) {
break ;
}
if ( phySection . isSwitchTrack ( ) ) {
len + = phySection . getLen ( ) ;
logicApproachList . add ( phySection ) ;
@ -2089,7 +2226,9 @@ public class DraftMapCiDataGeneratorImpl implements DraftMapCiDataGenerator {
for ( Section logic : sortedList ) {
logicApproachList . add ( logic ) ;
len + = logic . getLen ( ) ;
if ( len > = 600 ) break ;
if ( len > = 600 ) {
break ;
}
}
}
sectionPath . setLogicList ( logicApproachList ) ;
@ -2098,7 +2237,8 @@ public class DraftMapCiDataGeneratorImpl implements DraftMapCiDataGenerator {
signal . setRouteReleaseTime ( config . getRouteReleaseTime ( ) ) ;
}
public void getApproachPathOf ( Section section , boolean right , Float distance , SectionPath tempPath , MapCiGenerateConfig config , List < SectionPath > results ) {
public void getApproachPathOf ( Section section , boolean right , Float distance ,
SectionPath tempPath , MapCiGenerateConfig config , List < SectionPath > results ) {
if ( ! CollectionUtils . isEmpty ( tempPath . getSectionList ( ) ) ) {
/ / 已经有区段了
if ( Objects . isNull ( section ) ) {
@ -2110,7 +2250,8 @@ public class DraftMapCiDataGeneratorImpl implements DraftMapCiDataGenerator {
return ;
}
}
if ( config . isSignalApproachNotPassPreSignal ( ) & & Objects . nonNull ( section . getSignalOf ( ! right ) ) ) {
if ( config . isSignalApproachNotPassPreSignal ( ) & & Objects . nonNull (
section . getSignalOf ( ! right ) ) ) {
results . add ( tempPath ) ;
return ;
}
@ -2131,33 +2272,39 @@ public class DraftMapCiDataGeneratorImpl implements DraftMapCiDataGenerator {
SectionPath npPath = tempPath . cloneNew ( ) ; / / 定位路径
npPath . addSection ( relSwitch . getB ( ) ) ;
npPath . addSwitchElement ( new SwitchElement ( relSwitch , true ) ) ;
getApproachPathOf ( relSwitch . getB ( ) . getSectionOf ( right ) , right , distance , npPath , config , results ) ;
getApproachPathOf ( relSwitch . getB ( ) . getSectionOf ( right ) , right , distance , npPath , config ,
results ) ;
if ( ! config . isSignalApproachOnlyNpSwitch ( ) ) {
SectionPath rpPath = tempPath . cloneNew ( ) ; / / 反位路径
rpPath . addSection ( relSwitch . getC ( ) ) ;
rpPath . addSwitchElement ( new SwitchElement ( relSwitch , false ) ) ;
getApproachPathOf ( relSwitch . getC ( ) . getSectionOf ( right ) , right , distance , rpPath , config , results ) ;
getApproachPathOf ( relSwitch . getC ( ) . getSectionOf ( right ) , right , distance , rpPath , config ,
results ) ;
}
} else if ( relSwitch . isB ( section ) ) {
/ / 只有一条路径 , 从B - > A , 道岔定位
tempPath . addSection ( section ) ;
tempPath . addSection ( relSwitch . getA ( ) ) ;
tempPath . addSwitchElement ( new SwitchElement ( relSwitch , true ) ) ;
getApproachPathOf ( relSwitch . getA ( ) . getSectionOf ( right ) , right , distance , tempPath , config , results ) ;
getApproachPathOf ( relSwitch . getA ( ) . getSectionOf ( right ) , right , distance , tempPath , config ,
results ) ;
} else if ( relSwitch . isC ( section ) ) {
if ( ! config . isSignalApproachOnlyNpSwitch ( ) | | CollectionUtils . isEmpty ( tempPath . getSectionList ( ) ) ) {
if ( ! config . isSignalApproachOnlyNpSwitch ( ) | | CollectionUtils . isEmpty (
tempPath . getSectionList ( ) ) ) {
/ / 只有一条路径 , 从C - > A , 道岔反位
tempPath . addSection ( section ) ;
tempPath . addSection ( relSwitch . getA ( ) ) ;
tempPath . addSwitchElement ( new SwitchElement ( relSwitch , false ) ) ;
getApproachPathOf ( relSwitch . getA ( ) . getSectionOf ( right ) , right , distance , tempPath , config , results ) ;
getApproachPathOf ( relSwitch . getA ( ) . getSectionOf ( right ) , right , distance , tempPath , config ,
results ) ;
} else {
results . add ( tempPath ) ;
return ;
}
} else {
throw BusinessExceptionAssertEnum . DATA_ERROR . exception (
String . format ( " 地图基础数据有错误:区段[%s(%s)]关联了道岔[%s(%s)],却不是此道岔的关联区段 " ,
String . format (
" 地图基础数据有错误:区段[%s(%s)]关联了道岔[%s(%s)],却不是此道岔的关联区段 " ,
section . getName ( ) , section . getCode ( ) ,
relSwitch . getName ( ) , relSwitch . getCode ( ) ) ) ;
}
@ -2175,7 +2322,8 @@ public class DraftMapCiDataGeneratorImpl implements DraftMapCiDataGenerator {
* @param autoSignalGenerator
* @param errorList
* /
private AutoSignal generateAutoSignal ( Signal signal , CodeGenerator autoSignalGenerator , List < String > errorList ) {
private AutoSignal generateAutoSignal ( Signal signal , CodeGenerator autoSignalGenerator ,
List < String > errorList ) {
AutoSignal autoSignal = new AutoSignal ( autoSignalGenerator . next ( ) ) ;
autoSignal . setSignal ( signal ) ;
List < Section > sectionList = new ArrayList < > ( ) ;
@ -2203,10 +2351,12 @@ public class DraftMapCiDataGeneratorImpl implements DraftMapCiDataGenerator {
}
sectionList . add ( nextSwitchSection ) ;
Section next2 = nextSwitchSection . getSectionOf ( right ) ;
if ( Objects . nonNull ( next2 ) & & Objects . equals ( next2 . getParent ( ) , nextSwitchSection . getParent ( ) ) ) {
if ( Objects . nonNull ( next2 ) & & Objects . equals ( next2 . getParent ( ) ,
nextSwitchSection . getParent ( ) ) ) {
/ / 是同一计轴区段 , 添加下一个道岔区段
sectionList . add ( next2 ) ;
sectionList . add ( next2 . getRelSwitch ( ) . getNextSectionOnBaseSectionAndPosition ( next2 , true ) ) ;
sectionList . add (
next2 . getRelSwitch ( ) . getNextSectionOnBaseSectionAndPosition ( next2 , true ) ) ;
}
}
break ;