2021-03-25 15:19:44 +01:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								import  { GeoOperations }  from  "./GeoOperations" ;  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								import  Combine  from  "../UI/Base/Combine" ;  
						 
					
						
							
								
									
										
										
										
											2021-04-22 13:30:00 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								import  { Relation }  from  "./Osm/ExtractRelations" ;  
						 
					
						
							
								
									
										
										
										
											2021-05-16 15:34:44 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								import  State  from  "../State" ;  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								import  { Utils }  from  "../Utils" ;  
						 
					
						
							
								
									
										
										
										
											2021-06-15 00:28:59 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								import  BaseUIElement  from  "../UI/BaseUIElement" ;  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								import  List  from  "../UI/Base/List" ;  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								import  Title  from  "../UI/Base/Title" ;  
						 
					
						
							
								
									
										
										
										
											2021-03-25 15:19:44 +01:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								export  class  ExtraFunction  {  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-06-15 00:28:59 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    static  readonly  intro  =  new  Combine ( [ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        new  Title ( "Calculating tags with Javascript" ,  2 ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        "In some cases, it is useful to have some tags calculated based on other properties. Some useful tags are available by default (e.g. `lat`, `lon`, `_country`), as detailed above." , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        "It is also possible to calculate your own tags - but this requires some javascript knowledge." , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        "" , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        "Before proceeding, some warnings:" , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        new  List ( [ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            "DO NOT DO THIS AS BEGINNER" , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            "**Only do this if all other techniques fail**  This should _not_ be done to create a rendering effect, only to calculate a specific value" , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            "**THIS MIGHT BE DISABLED WITHOUT ANY NOTICE ON UNOFFICIAL THEMES** As unofficial themes might be loaded from the internet, this is the equivalent of injecting arbitrary code into the client. It'll be disabled if abuse occurs." 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        ] ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        "To enable this feature,  add a field `calculatedTags` in the layer object, e.g.:" , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        "````" , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        "\"calculatedTags\": [" , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        "    \"_someKey=javascript-expression\"," , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        "    \"name=feat.properties.name ?? feat.properties.ref ?? feat.properties.operator\"," , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        "    \"_distanceCloserThen3Km=feat.distanceTo( some_lon, some_lat) < 3 ? 'yes' : 'no'\" " , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        "  ]" , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        "````" , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        "" , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        "The above code will be executed for every feature in the layer. The feature is accessible as `feat` and is an amended geojson object:" , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        new  List ( [ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            "`area` contains the surface area (in square meters) of the object" , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            "`lat` and `lon` contain the latitude and longitude" 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        ] ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        "Some advanced functions are available on **feat** as well:" 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    ] ) . SetClass ( "flex-col" ) . AsMarkdown ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-06-21 00:18:59 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								       
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    
							 
						 
					
						
							
								
									
										
										
										
											2021-04-18 14:24:30 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    private  static  readonly  OverlapFunc  =  new  ExtraFunction ( 
							 
						 
					
						
							
								
									
										
										
										
											2021-03-26 03:24:58 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        "overlapWith" , 
							 
						 
					
						
							
								
									
										
										
										
											2021-06-15 00:28:59 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        "Gives a list of features from the specified layer which this feature (partly) overlaps with. If the current feature is a point, all features that embed the point are given. The returned value is `{ feat: GeoJSONFeature, overlap: number}[]` where `overlap` is the overlapping surface are (in m²) for areas, the overlapping length (in meter) if the current feature is a line or `undefined` if the current feature is a point" , 
							 
						 
					
						
							
								
									
										
										
										
											2021-03-26 03:24:58 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        [ "...layerIds - one or more layer ids  of the layer from which every feature is checked for overlap)" ] , 
							 
						 
					
						
							
								
									
										
										
										
											2021-04-22 13:30:00 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        ( params ,  feat )  = >  { 
							 
						 
					
						
							
								
									
										
										
										
											2021-03-26 03:24:58 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            return  ( . . . layerIds : string [ ] )  = >  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                const  result  =  [ ] 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                for  ( const  layerId  of  layerIds )  { 
							 
						 
					
						
							
								
									
										
										
										
											2021-04-22 13:30:00 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                    const  otherLayer  =  params . featuresPerLayer . get ( layerId ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-03-26 03:24:58 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                    if  ( otherLayer  ===  undefined )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                        continue ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    if  ( otherLayer . length  ===  0 )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                        continue ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    result . push ( . . . GeoOperations . calculateOverlap ( feat ,  otherLayer ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                return  result ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    ) 
							 
						 
					
						
							
								
									
										
										
										
											2021-04-18 14:24:30 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    private  static  readonly  DistanceToFunc  =  new  ExtraFunction ( 
							 
						 
					
						
							
								
									
										
										
										
											2021-03-25 15:19:44 +01:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								        "distanceTo" , 
							 
						 
					
						
							
								
									
										
										
										
											2021-05-16 15:34:44 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        "Calculates the distance between the feature and a specified point in kilometer. The input should either be a pair of coordinates, a geojson feature or the ID of an object" , 
							 
						 
					
						
							
								
									
										
										
										
											2021-03-25 15:19:44 +01:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								        [ "longitude" ,  "latitude" ] , 
							 
						 
					
						
							
								
									
										
										
										
											2021-03-26 03:24:58 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        ( featuresPerLayer ,  feature )  = >  { 
							 
						 
					
						
							
								
									
										
										
										
											2021-03-29 02:04:42 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            return  ( arg0 ,  lat )  = >  { 
							 
						 
					
						
							
								
									
										
										
										
											2021-04-18 14:24:30 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                if  ( typeof  arg0  ===  "number" )  { 
							 
						 
					
						
							
								
									
										
										
										
											2021-03-29 02:04:42 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                    // Feature._lon and ._lat is conveniently place by one of the other metatags
 
							 
						 
					
						
							
								
									
										
										
										
											2021-05-12 19:13:21 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                    return  GeoOperations . distanceBetween ( [ arg0 ,  lat ] ,  [ feature . _lon ,  feature . _lat ] ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-05-16 15:34:44 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                if  ( typeof  arg0  ===  "string" )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    // This is an identifier
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    const  feature  =  State . state . allElements . ContainingFeatures . get ( arg0 ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-06-15 00:28:59 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                    if  ( feature  ===  undefined )  { 
							 
						 
					
						
							
								
									
										
										
										
											2021-05-16 15:34:44 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                        return  undefined ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    arg0  =  feature ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-03-29 02:04:42 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                } 
							 
						 
					
						
							
								
									
										
										
										
											2021-04-18 14:24:30 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-05-16 15:34:44 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                // arg0 is probably a feature
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                return  GeoOperations . distanceBetween ( GeoOperations . centerpointCoordinates ( arg0 ) ,  [ feature . _lon ,  feature . _lat ] ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-03-25 15:19:44 +01:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								            } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    ) 
							 
						 
					
						
							
								
									
										
										
										
											2021-03-29 02:04:42 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-04-18 14:24:30 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    private  static  readonly  ClosestObjectFunc  =  new  ExtraFunction ( 
							 
						 
					
						
							
								
									
										
										
										
											2021-03-29 02:04:42 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        "closest" , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        "Given either a list of geojson features or a single layer name, gives the single object which is nearest to the feature. In the case of ways/polygons, only the centerpoint is considered." , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        [ "list of features" ] , 
							 
						 
					
						
							
								
									
										
										
										
											2021-04-22 13:30:00 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        ( params ,  feature )  = >  { 
							 
						 
					
						
							
								
									
										
										
										
											2021-03-29 02:04:42 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            return  ( features )  = >  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                if  ( typeof  features  ===  "string" )  { 
							 
						 
					
						
							
								
									
										
										
										
											2021-05-16 15:34:44 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                    const  name  =  features 
							 
						 
					
						
							
								
									
										
										
										
											2021-04-22 13:30:00 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                    features  =  params . featuresPerLayer . get ( features ) 
							 
						 
					
						
							
								
									
										
										
										
											2021-05-16 15:34:44 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                    if  ( features  ===  undefined )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                        var  keys  =  Utils . NoNull ( Array . from ( params . featuresPerLayer . keys ( ) ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                        if  ( keys . length  >  0 )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                            throw  ` No features defined for  ${ name } . Defined layers are  ${ keys . join ( ", " ) } ` ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                        }  else  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                            // This is the first pass over an external dataset
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                            // Other data probably still has to load!
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                            return  undefined ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                        } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    } 
							 
						 
					
						
							
								
									
										
										
										
											2021-03-29 02:04:42 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                } 
							 
						 
					
						
							
								
									
										
										
										
											2021-05-16 15:34:44 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-03-29 02:04:42 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                let  closestFeature  =  undefined ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                let  closestDistance  =  undefined ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                for  ( const  otherFeature  of  features )  { 
							 
						 
					
						
							
								
									
										
										
										
											2021-05-20 12:27:33 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                    if  ( otherFeature  ==  feature  ||  otherFeature . id  ==  feature . id )  { 
							 
						 
					
						
							
								
									
										
										
										
											2021-03-29 02:04:42 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                        continue ;  // We ignore self
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    let  distance  =  undefined ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    if  ( otherFeature . _lon  !==  undefined  &&  otherFeature . _lat  !==  undefined )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                        distance  =  GeoOperations . distanceBetween ( [ otherFeature . _lon ,  otherFeature . _lat ] ,  [ feature . _lon ,  feature . _lat ] ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    }  else  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                        distance  =  GeoOperations . distanceBetween ( 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                            GeoOperations . centerpointCoordinates ( otherFeature ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                            [ feature . _lon ,  feature . _lat ] 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                        ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    } 
							 
						 
					
						
							
								
									
										
										
										
											2021-04-18 14:24:30 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                    if  ( distance  ===  undefined )  { 
							 
						 
					
						
							
								
									
										
										
										
											2021-03-29 02:04:42 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                        throw  "Undefined distance!" 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    } 
							 
						 
					
						
							
								
									
										
										
										
											2021-04-18 14:24:30 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                    if  ( closestFeature  ===  undefined  ||  distance  <  closestDistance )  { 
							 
						 
					
						
							
								
									
										
										
										
											2021-03-29 02:04:42 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                        closestFeature  =  otherFeature 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                        closestDistance  =  distance ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                return  closestFeature ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-04-18 14:24:30 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    private  static  readonly  Memberships  =  new  ExtraFunction ( 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        "memberships" , 
							 
						 
					
						
							
								
									
										
										
										
											2021-06-15 00:28:59 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        "Gives a list of `{role: string, relation: Relation}`-objects, containing all the relations that this feature is part of. "  + 
							 
						 
					
						
							
								
									
										
										
										
											2021-05-12 19:13:21 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        "\n\n"  + 
							 
						 
					
						
							
								
									
										
										
										
											2021-06-15 00:28:59 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        "For example: `_part_of_walking_routes=feat.memberships().map(r => r.relation.tags.name).join(';')`" , 
							 
						 
					
						
							
								
									
										
										
										
											2021-04-18 14:24:30 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        [ ] , 
							 
						 
					
						
							
								
									
										
										
										
											2021-05-12 19:13:21 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        ( params ,  _ )  = >  { 
							 
						 
					
						
							
								
									
										
										
										
											2021-05-16 15:34:44 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            return  ( )  = >  params . relations  ? ?  [ ] ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-04-18 14:24:30 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    private  static  readonly  allFuncs : ExtraFunction [ ]  =  [ ExtraFunction . DistanceToFunc ,  ExtraFunction . OverlapFunc ,  ExtraFunction . ClosestObjectFunc ,  ExtraFunction . Memberships ] ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-03-25 15:19:44 +01:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								    private  readonly  _name : string ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    private  readonly  _args : string [ ] ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    private  readonly  _doc : string ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-05-16 15:34:44 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    private  readonly  _f :  ( params :  {  featuresPerLayer : Map < string ,  any [ ] > ,  relations :  {  role : string ,  relation : Relation  } [ ]  } ,  feat : any )  = >  any ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-03-25 15:19:44 +01:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-05-16 15:34:44 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    constructor ( name : string ,  doc : string ,  args : string [ ] ,  f :  ( ( params :  {  featuresPerLayer : Map < string ,  any [ ] > ,  relations :  {  role : string ,  relation : Relation  } [ ]  } ,  feat : any )  = >  any ) )  { 
							 
						 
					
						
							
								
									
										
										
										
											2021-03-25 15:19:44 +01:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								        this . _name  =  name ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        this . _doc  =  doc ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        this . _args  =  args ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        this . _f  =  f ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-05-16 15:34:44 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    public  static  FullPatchFeature ( featuresPerLayer : Map < string ,  any [ ] > ,  relations :  {  role : string ,  relation : Relation  } [ ] ,  feature )  { 
							 
						 
					
						
							
								
									
										
										
										
											2021-03-25 15:19:44 +01:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								        for  ( const  func  of  ExtraFunction . allFuncs )  { 
							 
						 
					
						
							
								
									
										
										
										
											2021-04-22 13:30:00 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            func . PatchFeature ( featuresPerLayer ,  relations ,  feature ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-03-25 15:19:44 +01:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								        } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-06-15 00:28:59 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    public  static  HelpText ( ) :  BaseUIElement  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        const  elems  =  [ ] 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        for  ( const  func  of  ExtraFunction . allFuncs )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            elems . push ( new  Title ( func . _name ,  3 ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                func . _doc , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                new  List ( func . _args ,  true ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-03-25 15:19:44 +01:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								        return  new  Combine ( [ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            ExtraFunction . intro , 
							 
						 
					
						
							
								
									
										
										
										
											2021-06-15 00:28:59 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            new  List ( ExtraFunction . allFuncs . map ( func  = >  func . _name ) ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            . . . elems 
							 
						 
					
						
							
								
									
										
										
										
											2021-03-25 15:19:44 +01:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								        ] ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-05-16 15:34:44 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    public  PatchFeature ( featuresPerLayer : Map < string ,  any [ ] > ,  relations :  {  role : string ,  relation : Relation  } [ ] ,  feature : any )  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-04-22 13:30:00 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        feature [ this . _name ]  =  this . _f ( { featuresPerLayer : featuresPerLayer ,  relations : relations } ,  feature ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2021-03-25 15:19:44 +01:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								    } 
							 
						 
					
						
							
								
									
										
										
										
											2021-05-11 11:47:25 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								}