From 97b1d8309f37ba376445c159d091fa4361f19d1c Mon Sep 17 00:00:00 2001 From: Richard Fairhurst Date: Wed, 23 Nov 2011 15:11:17 +0000 Subject: [PATCH] Smart relation descriptions --- net/systemeD/halcyon/connection/Entity.as | 8 +++ net/systemeD/halcyon/connection/Relation.as | 58 ++++++++++++++++----- 2 files changed, 52 insertions(+), 14 deletions(-) diff --git a/net/systemeD/halcyon/connection/Entity.as b/net/systemeD/halcyon/connection/Entity.as index 8b4629bf..522d57d5 100644 --- a/net/systemeD/halcyon/connection/Entity.as +++ b/net/systemeD/halcyon/connection/Entity.as @@ -128,6 +128,14 @@ package net.systemeD.halcyon.connection { return tags[key]; } + /** Retrieve a key matching a regex. */ + public function getTagByRegex(regex:RegExp):String { + for (var k:String in tags) { + if (k.match(regex)) return tags[k]; + } + return null; + } + /** @return true if there exists key=value */ public function tagIs(key:String,value:String):Boolean { if (!tags[key]) { return false; } diff --git a/net/systemeD/halcyon/connection/Relation.as b/net/systemeD/halcyon/connection/Relation.as index 56808d41..a02dbe6b 100644 --- a/net/systemeD/halcyon/connection/Relation.as +++ b/net/systemeD/halcyon/connection/Relation.as @@ -60,6 +60,14 @@ package net.systemeD.halcyon.connection { return members[index]; } + public function getFirstMember():RelationMember { + return members[0]; + } + + public function getLastMember():RelationMember { + return members[members.length-1]; + } + public function setMember(index:uint, member:RelationMember, performAction:Function):void { var composite:CompositeUndoableAction = new CompositeUndoableAction("Set Member at index "+index); composite.push(new RemoveMemberByIndexAction(this, members, index)); @@ -112,20 +120,42 @@ package net.systemeD.halcyon.connection { return (deleted || (members.length==0)); } - public override function getDescription():String { - var desc:String = ""; - var relTags:Object = getTagsHash(); - if ( relTags["type"] ) { - desc = relTags["type"]; - if ( relTags[desc] ) - desc += " " + relTags[desc]; - } - if ( relTags["ref"] ) - desc += " " + relTags["ref"]; - if ( relTags["name"] ) - desc += " " + relTags["name"]; - return desc; - } + public override function getDescription():String { + var desc:String = ""; + var relTags:Object = getTagsHash(); + var named:Boolean = false; + if ( relTags["type"] ) { + // type=route --> "route" + desc = relTags["type"]; + // type=route, route=bicycle--> "route bicycle" + if (relTags[desc]) { desc += " " + relTags[desc]; } + } + // type=route, route=bicycle, network=ncn, ref=54 -> "route bicycle ncn 54" + if ( relTags["network"]) { desc += " " + relTags["network"]; } + if ( relTags["ref"] ) { desc += " " + relTags["ref"]; named=true; } + if ( relTags["name"] ) { desc += " " + relTags["name"]; named=true; } + // handle node->node routes + if ( !named && relTags["type"] && relTags["type"]=="route" ) { + var firstName:String=getSignificantName(getFirstMember().entity); + var lastName:String=getSignificantName(getLastMember().entity); + if ((firstName+lastName)!='') desc+=" "+firstName+"-"+lastName; + } + return desc; + } + + private function getSignificantName(entity:Entity):String { + if (!entity.loaded || (entity is Relation)) return ''; + + var t:String; + if (entity is Way) { + t=getSignificantName(Way(entity).getFirstNode()); + if (t=='') t=getSignificantName(Way(entity).getLastNode()); + return t; + } + t=Node(entity).getTag('name'); + if (!t) t=Node(entity).getTagByRegex(/ref$/); + return t ? t : ''; + } public override function getType():String { return 'relation'; -- 2.36.1