/* Ċ Ġ* ĠCopyright Ġ 2 0 1 9 - 2 0 2 0 ĠCh air Ġof ĠGe oin form atics , ĠTechnical ĠUniversity Ġof ĠM un ich Ċ Ġ* Ċ Ġ* ĠLicensed Ġunder Ġthe ĠApache ĠLicense , ĠVersion Ġ 2 . 0 Ġ( the Ġ" License "); Ċ Ġ* Ġyou Ġmay Ġnot Ġuse Ġthis Ġfile Ġexcept Ġin Ġcompliance Ġwith Ġthe ĠLicense . Ċ Ġ* ĠYou Ġmay Ġobtain Ġa Ġcopy Ġof Ġthe ĠLicense Ġat Ċ Ġ* Ċ Ġ* ĠĠĠĠ Ġhttp :// www . apache . org / licenses / LICENSE - 2 . 0 Ċ Ġ* Ċ Ġ* ĠUnless Ġrequired Ġby Ġapplicable Ġlaw Ġor Ġagreed Ġto Ġin Ġwriting , Ġsoftware Ċ Ġ* Ġdistributed Ġunder Ġthe ĠLicense Ġis Ġdistributed Ġon Ġan Ġ" AS ĠIS " ĠBASIS , Ċ Ġ* ĠWITHOUT ĠWARRANTIES ĠOR ĠCONDITIONS ĠOF ĠANY ĠKIND , Ġeither Ġexpress Ġor Ġimplied . Ċ Ġ* ĠSee Ġthe ĠLicense Ġfor Ġthe Ġspecific Ġlanguage Ġgoverning Ġpermissions Ġand Ċ Ġ* Ġlimitations Ġunder Ġthe ĠLicense . Ċ Ġ*/ Ċ Ċ package Ġio . r tron . transformer . opend rive 2 road spaces . road spaces Ċ Ċ import Ġio . r tron . math . analysis . function . un ivariate . Un ivariate Function Ċ import Ġio . r tron . math . analysis . function . un ivariate . combin ation . Concat en ated Function Ċ import Ġio . r tron . math . analysis . function . un ivariate . pure . Constant Function Ċ import Ġio . r tron . math . analysis . function . un ivariate . pure . Linear Function Ċ import Ġio . r tron . math . range . Range Ċ import Ġio . r tron . math . std . fuzzy Equals Ċ import Ġio . r tron . model . opend rive . common . ER o ad Mark Type Ċ import Ġio . r tron . model . opend rive . road . lan es . Road Lan es Lane Section Center Lane Ċ import Ġio . r tron . model . opend rive . road . lan es . Road Lan es Lane Section LC RL ane Road Mark Ċ import Ġio . r tron . model . opend rive . road . lan es . Road Lan es Lane Section L RL ane Ċ import Ġio . r tron . model . opend rive . road . lan es . Road Lan es Lane Section L RL ane Height Ċ import Ġio . r tron . model . road spaces . road space . attribute . Attribute List Ċ import Ġio . r tron . model . road spaces . road space . attribute . attributes Ċ import Ġio . r tron . model . road spaces . road space . road .* Ċ import Ġio . r tron . std . filter To Strict Sorting By Ċ import Ġio . r tron . transformer . opend rive 2 road spaces . analysis . Function Builder Ċ import Ġio . r tron . transformer . opend rive 2 road spaces . parameter . O pend rive 2 Road spaces Configuration ĊĊ Ċ /** Ċ Ġ* ĠBuilder Ġfor Ġ[ Lane ] Ġobjects Ġof Ġthe ĠRoad Spaces Ġdata Ġmodel . Ċ Ġ*/ Ċ class ĠL ane Builder ( ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġconfiguration : ĠO pend rive 2 Road spaces Configuration Ċ ) Ġ{ ĊĊĠĠĠ Ġ// ĠProperties Ġand ĠInitial izers ĊĠĠĠ Ġprivate Ġval Ġ_ report Logger Ġ= Ġconfiguration . get Report Logger () ĊĠĠĠ Ġprivate Ġval Ġ_ function Builder Ġ= ĠFunction Builder (_ report Logger , Ġconfiguration . parameters ) ĊĊĠĠĠ Ġ// ĠMethods ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠBuilds Ġa Ġsingle Ġlane Ġ( which Ġis Ġeither Ġleft Ġor Ġright Ġto Ġthe Ġcenter ) Ġwith Ġthe Ġ[ id ]. ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġid Ġidentifier Ġof Ġthe Ġlane ĊĠĠĠĠ Ġ* Ġ@ param Ġcurve Position Domain Ġcurve Ġposition Ġdomain Ġ( relative Ġto Ġthe Ġlane Ġsection ) Ġwhere Ġthe Ġlane Ġis Ġdefined ĊĠĠĠĠ Ġ* Ġ@ param Ġsrc Lane Ġlane Ġobject Ġof Ġthe ĠOpen DRIVE Ġdata Ġmodel ĊĠĠĠĠ Ġ* Ġ@ param Ġbase Attributes Ġattributes Ġattached Ġto Ġthe Ġtransformed Ġ[ Lane ] Ġobject ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġbuild Lane ( id : ĠL ane Identifier , Ġcurve Position Domain : ĠRange < Double >, Ġsrc Lane : ĠRoad Lan es Lane Section L RL ane , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbase Attributes : ĠAttribute List ): ĠL ane Ġ{ ĊĊĠĠĠĠĠĠĠ Ġ// Ġbuild Ġlane Ġgeometry ĊĠĠĠĠĠĠĠ Ġval Ġwidth Ġ= Ġ_ function Builder . build Lane Width ( id , Ġsrc Lane . width ) ĊĠĠĠĠĠĠĠ Ġval Ġlane Height Offsets Ġ= Ġbuild Lane Height Offset ( id , Ġsrc Lane . height ) ĊĊĠĠĠĠĠĠĠ Ġ// Ġbuild Ġroad Ġmark ings ĊĠĠĠĠĠĠĠ Ġval Ġroad Mark ings Ġ= Ġbuild Road Mark ings ( id , Ġcurve Position Domain , Ġsrc Lane . road Mark ) ĊĊĠĠĠĠĠĠĠ Ġ// Ġlane Ġtopology ĊĠĠĠĠĠĠĠ Ġval Ġpre decess ors Ġ= Ġsrc Lane . link . pre decessor . map Ġ{ Ġit . id Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġsuccess ors Ġ= Ġsrc Lane . link . success or . map Ġ{ Ġit . id Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// Ġbuild Ġlane Ġattributes ĊĠĠĠĠĠĠĠ Ġval Ġattributes Ġ= Ġbase Attributes Ġ+ Ġbuild Attributes ( src Lane ) ĊĊĠĠĠĠĠĠĠ Ġ// Ġbuild Ġup Ġlane Ġobject ĊĠĠĠĠĠĠĠ Ġreturn ĠL ane ( id , Ġwidth , Ġlane Height Offsets . inner , Ġlane Height Offsets . outer , Ġsrc Lane . level , Ġroad Mark ings , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpre decess ors , Ġsuccess ors , Ġattributes ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠBuilds Ġa Ġcenter Ġlane Ġof Ġa Ġlane Ġsection . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġid Ġidentifier Ġof Ġthe Ġcenter Ġlane ĊĠĠĠĠ Ġ* Ġ@ param Ġcurve Position Domain Ġcurve Ġposition Ġdomain Ġ( relative Ġto Ġthe Ġlane Ġsection ) Ġwhere Ġthe Ġlane Ġis Ġdefined ĊĠĠĠĠ Ġ* Ġ@ param Ġsrc Lan es Ġcenter Ġlane Ġobject Ġof Ġthe ĠOpen DRIVE Ġdata Ġmodel ĊĠĠĠĠ Ġ* Ġ@ param Ġbase Attributes Ġattributes Ġattached Ġto Ġthe Ġtransformed Ġ[ Lane ] Ġobject ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġbuild Center Lane ( id : ĠL ane Section Identifier , Ġcurve Position Domain : ĠRange < Double >, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsrc Lan es : ĠList < Road Lan es Lane Section Center Lane >, Ġbase Attributes : ĠAttribute List ): ĠCenter Lane Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġlane Identifier Ġ= ĠL ane Identifier ( 0 , Ġid ) ĊĊĠĠĠĠĠĠĠ Ġif Ġ( src Lan es . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ_ report Logger . info (" Lane Ġsection Ġcontains Ġno Ġcenter Ġlane .", Ġid . toString ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠCenter Lane ( lane Identifier ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( src Lan es . size Ġ> Ġ 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ_ report Logger . info (" Lane Ġsection Ġcontains Ġmultiple Ġcenter Ġlan es , Ġ" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" but Ġshould Ġcontain Ġonly Ġone .", Ġid . toString ()) ĊĊĠĠĠĠĠĠĠ Ġval Ġsrc Lane Ġ= Ġsrc Lan es . first () ĊĠĠĠĠĠĠĠ Ġif Ġ( src Lane . id Ġ!= Ġ 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ_ report Logger . info (" Center Ġlane Ġshould Ġhave Ġid Ġ 0 , Ġbut Ġhas Ġ${ src Lane . id }. ", Ġid . toString ()) ĊĊĠĠĠĠĠĠĠ Ġval Ġroad Mark ings Ġ= Ġbuild Road Mark ings ( lane Identifier , Ġcurve Position Domain , Ġsrc Lane . road Mark ) ĊĠĠĠĠĠĠĠ Ġval Ġattributes Ġ= Ġbase Attributes Ġ+ Ġbuild Attributes ( src Lane ) ĊĠĠĠĠĠĠĠ Ġreturn ĠCenter Lane ( lane Identifier , Ġsrc Lane . level , Ġroad Mark ings , Ġattributes ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠSmall Ġhelper Ġclass Ġcontaining Ġthe Ġheight Ġoffset Ġfunctions Ġof Ġthe Ġinner Ġand Ġouter Ġlane Ġboundary . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġdata Ġclass ĠL ane Height Offset ( val Ġinner : ĠUn ivariate Function , Ġval Ġouter : ĠUn ivariate Function ) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠBuilds Ġup Ġthe Ġheight Ġoffset Ġfunction Ġfor Ġthe Ġinner Ġand Ġouter Ġlane Ġboundary . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġsrc Lane Height s Ġlane Ġheight Ġentries Ġof Ġthe ĠOpen DRIVE Ġdata Ġmodel ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġbuild Lane Height Offset ( id : ĠL ane Identifier , Ġsrc Lane Height s : ĠList < Road Lan es Lane Section L RL ane Height >): ĊĠĠĠĠĠĠĠĠĠĠĠ ĠL ane Height Offset Ġ{ ĊĊĠĠĠĠĠĠĠ Ġ// Ġremove Ġcon sec ut ively Ġduplicated Ġheight Ġentries ĊĠĠĠĠĠĠĠ Ġval Ġheight Entries Distinct Ġ= Ġsrc Lane Height s . filter To Strict Sorting By Ġ{ Ġit . s Offset Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( height Entries Distinct . size Ġ< Ġsrc Lane Height s . size ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ_ report Logger . info (" Removing Ġlane Ġheight Ġentries Ġwhich Ġare Ġplaced Ġnot Ġin Ġstrict Ġorder Ġaccording Ġ" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" to Ġs Offset .", Ġid . toString ()) ĊĊĠĠĠĠĠĠĠ Ġ// Ġfilter Ġnon - finite Ġentries ĊĠĠĠĠĠĠĠ Ġval Ġheight Entries Adjust ed Ġ= Ġheight Entries Distinct ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Ġ{ Ġit . inner . is Finite () Ġ&& Ġit . outer . is Finite () Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( height Entries Adjust ed . size Ġ< Ġheight Entries Distinct . size ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ_ report Logger . warn (" Removing Ġat Ġleast Ġone Ġlane Ġheight Ġentry , Ġsince Ġno Ġvalid Ġvalues Ġare Ġprovided .", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġid . toString ()) ĊĊĠĠĠĠĠĠĠ Ġ// Ġbuild Ġthe Ġinner Ġand Ġouter Ġheight Ġoffset Ġfunctions ĊĠĠĠĠĠĠĠ Ġval Ġinner Ġ= Ġif Ġ( height Entries Adjust ed . isEmpty ()) ĠLinear Function . X _ AXIS ĊĠĠĠĠĠĠĠ Ġelse ĠConcat en ated Function . of Linear Functions ( height Entries Adjust ed . map Ġ{ Ġit . s Offset Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġheight Entries Adjust ed . map Ġ{ Ġit . inner Ġ}) ĊĊĠĠĠĠĠĠĠ Ġval Ġouter Ġ= Ġif Ġ( height Entries Adjust ed . isEmpty ()) ĠLinear Function . X _ AXIS ĊĠĠĠĠĠĠĠ Ġelse ĠConcat en ated Function . of Linear Functions ( height Entries Adjust ed . map Ġ{ Ġit . s Offset Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġheight Entries Adjust ed . map Ġ{ Ġit . outer Ġ}) ĊĊĠĠĠĠĠĠĠ Ġreturn ĠL ane Height Offset ( inner , Ġouter ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠBuilds Ġa Ġlist Ġof Ġroad Ġmark ings Ġ([ src Road Mark ]). ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġid Ġidentifier Ġof Ġthe Ġlane Ġfor Ġwhich Ġthe Ġroad Ġmark ings Ġare Ġbuilt ĊĠĠĠĠ Ġ* Ġ@ param Ġcurve Position Domain Ġcurve Ġposition Ġdomain Ġ( relative Ġto Ġthe Ġlane Ġsection ) Ġwhere Ġthe Ġroad Ġmark ings Ġis Ġdefined ĊĠĠĠĠ Ġ* Ġ@ param Ġsrc Road Mark Ġroad Ġmarking Ġentries Ġof Ġthe ĠOpen DRIVE Ġdata Ġmodel ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġbuild Road Mark ings ( id : ĠL ane Identifier , Ġcurve Position Domain : ĠRange < Double >, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsrc Road Mark : ĠList < Road Lan es Lane Section LC RL ane Road Mark >): ĠList < Road Mark ing > Ġ{ ĊĊĠĠĠĠĠĠĠ Ġval Ġcurve Position Domain End Ġ= Ġcurve Position Domain . upper Endpoint OrNull () !! ĊĠĠĠĠĠĠĠ Ġval Ġadjusted Src Road Mark Ġ= Ġsrc Road Mark ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Ġ{ Ġit . s Offset Ġin Ġcurve Position Domain Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Ġ{ Ġ! fuzzy Equals ( it . s Offset , Ġcurve Position Domain End , Ġconfiguration . parameters . tolerance ) Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( adjusted Src Road Mark . size Ġ< Ġsrc Road Mark . size ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ_ report Logger . warn (" Road Ġmark Ġentries Ġhave Ġbeen Ġremoved , Ġas Ġthe Ġs Offset Ġis Ġnot Ġlocated Ġwithin Ġ" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" the Ġlocal Ġcurve Ġposition Ġdomain Ġ($ curve Position Domain ) Ġof Ġthe Ġlane Ġsection .", Ġid . toString ()) ĊĊĠĠĠĠĠĠĠ Ġif Ġ( adjusted Src Road Mark . isEmpty ()) Ġreturn Ġempty List () ĊĊĠĠĠĠĠĠĠ Ġreturn Ġadjusted Src Road Mark . zip With Next () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Ġ{ Ġit . first . type Attribute Ġ!= ĠE Road Mark Type . NONE Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġbuild Road Mark ing ( it . first , Ġit . second . s Offset ) Ġ} Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( adjusted Src Road Mark . last (). type Attribute Ġ!= ĠE Road Mark Type . NONE ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠlistOf ( build Road Mark ing ( adjusted Src Road Mark . last ())) Ġelse Ġempty List () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠBuilds Ġan Ġindividual Ġroad Ġmarking Ġ[ src Road Mark ]. ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġsrc Road Mark Ġroad Ġmark Ġentry Ġof Ġthe ĠOpen DRIVE Ġdata Ġmodel ĊĠĠĠĠ Ġ* Ġ@ param Ġdomain Endpoint Ġupper Ġdomain Ġendpoint Ġfor Ġthe Ġdomain Ġof Ġthe Ġroad Ġmark ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġbuild Road Mark ing ( src Road Mark : ĠRoad Lan es Lane Section LC RL ane Road Mark , Ġdomain Endpoint : ĠDouble Ġ= ĠDouble . NaN ): ĊĠĠĠĠĠĠĠĠĠĠĠ ĠRoad Mark ing Ġ{ ĊĊĠĠĠĠĠĠĠ Ġval Ġdomain Ġ= Ġif Ġ( domain Endpoint . isNaN ()) ĠRange . at Least ( src Road Mark . s Offset ) ĊĠĠĠĠĠĠĠ Ġelse ĠRange . closed ( src Road Mark . s Offset , Ġdomain Endpoint ) ĊĊĠĠĠĠĠĠĠ Ġval Ġwidth Ġ= ĠConstant Function ( src Road Mark . width , Ġdomain ) ĊĊĠĠĠĠĠĠĠ Ġval Ġattributes Ġ= Ġattributes ("${ configuration . parameters . attributes Prefix } road Mark ing ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġattribute ("_ curve Position Start ", Ġsrc Road Mark . s Offset ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġattribute ("_ width ", Ġsrc Road Mark . width ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġattribute ("_ type ", Ġsrc Road Mark . type Attribute . toString ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġattribute ("_ weight ", Ġsrc Road Mark . weight . toString ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġattribute ("_ color ", Ġsrc Road Mark . color . toString ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġattribute ("_ material ", Ġsrc Road Mark . material ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn ĠRoad Mark ing ( width , Ġattributes ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġbuild Attributes ( src Center Lane : ĠRoad Lan es Lane Section Center Lane ) Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġattributes ("${ configuration . parameters . attributes Prefix } lane _ ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġattribute (" type ", Ġsrc Center Lane . type . toString ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġattribute (" level ", Ġsrc Center Lane . level ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġattributes (" pre decessor _ lane ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsrc Center Lane . link . pre decessor . forEach Indexed Ġ{ Ġi , Ġelement Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġattribute ("_ $ i ", Ġelement . id ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġattributes (" success or _ lane ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsrc Center Lane . link . success or . forEach Indexed Ġ{ Ġi , Ġelement Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġattribute ("_ $ i ", Ġelement . id ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġbuild Attributes ( src Left Right Lane : ĠRoad Lan es Lane Section L RL ane ) Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġattributes ("${ configuration . parameters . attributes Prefix } lane _ ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġattribute (" type ", Ġsrc Left Right Lane . type . toString ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġattribute (" level ", Ġsrc Left Right Lane . level ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġattributes (" pre decessor _ lane ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsrc Left Right Lane . link . pre decessor . forEach Indexed Ġ{ Ġi , Ġelement Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġattribute ("_ $ i ", Ġelement . id ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġattributes (" success or _ lane ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsrc Left Right Lane . link . success or . forEach Indexed Ġ{ Ġi , Ġelement Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġattribute ("_ $ i ", Ġelement . id ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġattributes (" material ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsrc Left Right Lane . material . forEach Indexed Ġ{ Ġi , Ġelement Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġattribute ("_ curve Position Start _$ i ", Ġelement . s Offset ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġattribute ("_ surface _$ i ", Ġelement . surface ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġattribute ("_ f riction _$ i ", Ġelement . f riction ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġattribute ("_ rough ness _$ i ", Ġelement . rough ness ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġattributes (" speed ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsrc Left Right Lane . speed . forEach Indexed Ġ{ Ġi , Ġelement Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġattribute ("_ curve Position Start _$ i ", Ġelement . s Offset ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġattribute ("_ max _$ i ", Ġelement . max , Ġelement . unit . to Unit Of Measure ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġattributes (" height Offset ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsrc Left Right Lane . height . forEach Indexed Ġ{ Ġi , Ġelement Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġattribute ("_ curve Position Start _$ i ", Ġelement . s Offset ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġattribute ("_ inner _$ i ", Ġelement . inner ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġattribute ("_ outer _$ i ", Ġelement . outer ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ċ } Ċ