def __init__(self): # Patient/ acquistion information self.name = '' self.modality = '' self.original_orientation = '' self.window = '' self.level = '' # Masks (vtkImageData) self.mask_dict = {} # Surfaces are (vtkPolyData) self.surface_dict = {} self.last_surface_index = -1 # Measurements self.measurement_dict = {} # TODO: Future ++ self.annotation_dict = {} # InVesalius related data # So we can find bugs and reproduce user-related problems self.invesalius_version = version.get_svn_revision() self.presets = Presets() self.threshold_modes = self.presets.thresh_ct self.threshold_range = '' self.raycasting_preset = ''
def localizeMapfile(project='wms-bod', langs=['fr','de','it','en'], projdir = None): map = None domain = project project_dir = os.path.abspath(os.path.join(os.curdir,'..','services', project)) # Exceptions # wms-ga-onegeologyeurope only de, en if project == 'wms-ga-onegeologyeurope': langs=['de','en'] # wms-ga-onegeology only de, fr if project == 'wms-ga-onegeology': langs=['de','fr'] if 'wms-ga-one' in project: print "special processing wms-ga" project_dir = os.path.abspath(os.path.join(os.curdir,'..','services', 'wms-ga')) proj_version = version.get_svn_revision(project_dir) print "Translating", project print "====================" print "SVN version: ", proj_version print "Locales (.mo) are in", localedir mapfile_tpl = os.path.join(project_dir, project + '.map') if os.path.isfile(mapfile_tpl): map = mapscript.mapObj(mapfile_tpl) print "Using mapfile ", mapfile_tpl print "Languages: ", ",".join(langs) if map: try: max_extent = map.getMetaData("wms_extent") except: try: max_extent = map.getMetaData("ows_extent") except: max_extent = MAX_EXTENT print "Max extent", max_extent if project == 'wms-bgdi' or project == 'wms-bod' : # Do not translate the following layers because they are internal wms-bgdi layer # and the current mapscript version (6.0.3-1~c2c+1) does not support the grid element # Known Bug in C Library # http://trac.osgeo.org/mapserver/ticket/1980 DoNotTranslate = [ 'org.epsg.grid_4326', 'org.epsg.grid_4326_1', 'org.epsg.grid_4326_2', 'org.epsg.grid_4326_3', 'org.epsg.grid_4326_4', 'org.epsg.grid_4326_5', 'org.epsg.grid_4326_6', 'org.epsg.grid_4326_7', 'org.epsg.grid_4326_8', 'org.epsg.grid_4326_9', 'org.epsg.grid_4326_10', 'org.epsg.grid_4326_11', 'org.epsg.grid_4326_12', 'org.epsg.grid_4326_13', 'org.epsg.grid_21781', 'org.epsg.grid_21781_1', 'org.epsg.grid_21781_2', 'org.epsg.grid_21781_3', 'org.epsg.grid_21781_4', 'org.epsg.grid_21781_5', 'org.epsg.grid_21781_6', 'org.epsg.grid_21781_7', 'org.epsg.grid_21781_8', 'org.epsg.grid_21781_9', 'org.epsg.grid_21781_10', 'org.epsg.grid_21781_11', 'org.epsg.grid_21781_12', 'org.epsg.grid_21781_13', 'ch.kantone.historische-topografische-namen' ] print "%s layers found in mapfile ..." % map.numlayers for deleteLayer in DoNotTranslate: if map.getLayerByName(deleteLayer): map.removeLayer(map.getLayerByName(deleteLayer).index) print "%s layers will be translated..." % map.numlayers for lang in langs: try: translation = gettext.translation(domain,localedir, languages=[lang]) except IOError, e: print "Error! Cannot initialize translation", e print "Try to run bod2po.py first" sys.exit() translation.install(unicode=1) #print translation.info() _ = translation.ugettext s = 'ch.swisstopo.vec25-heckenbaeume-linien.Hecke.name' print "Test translation:", s," --> ", _(s) fn = project + '.' + lang + '.yaml' #fn = 'wms-bod.' + lang + '.yaml' # for all project print "Opening %s (be patient)" % fn stream = file(fn , 'r') try: bodDict = yaml.load(stream, Loader=Loader) except: print "Critical error: Cannot read '%s'. Exit" % fn sys.exit() finally: stream.close() clone_map = map.clone() localized_mapfilename = os.path.abspath(os.path.join(project_dir,project + '.' + lang +'.map')) # Special Translation for wms-ga-onegeology and wms-ga-onegeologyeurope if 'wms-ga-one' in project: # remove wms_xxx from WEB Section clone_map.web.metadata.set('ows_title', uni2iso(_(project + '.wms_title'))) clone_map.web.metadata.set('ows_abstract', uni2iso(_( project +'.wms_abstract').replace('\n', '').replace('\r', '') + " (Revision: %s)" % proj_version)) clone_map.web.metadata.set('ows_encoding', bodDict['wms'][project]['encoding']) clone_map.web.metadata.set('ows_contactorganization', uni2iso(_(project + '.wms_contactorganization'))) clone_map.web.metadata.set('ows_keywordlist', uni2iso(_(project + '.ows_keywords'))) clone_map.web.metadata.set('ows_keywordlist_GEMET_items', uni2iso(_(project + '.ows_keywordlist_gemet_items'))) clone_map.web.metadata.set('ows_accessconstraints', uni2iso(_(project + '.ows_accessconstraint'))) #clone_map.web.metadata.set('ows_fees', uni2iso(_(project + '.ows_fee'))) clone_map.web.metadata.set('ows_contactorganization', uni2iso(_(project + '.wms_contactorganization'))) clone_map.web.metadata.set('ows_contactposition', uni2iso(_(project + '.ows_contactposition'))) clone_map.web.metadata.set('ows_enable_request', '*') else: # Translate general WMS Service Section clone_map.web.metadata.set('wms_abstract', uni2iso(_( project +'.wms_abstract') + " (Revision: %s)" % proj_version)) clone_map.web.metadata.set('wms_encoding', bodDict['wms'][project]['encoding']) clone_map.web.metadata.set('wms_contactorganization', uni2iso(_(project + '.wms_contactorganization'))) clone_map.web.metadata.set('wms_title', uni2iso(_(project + '.wms_title'))) clone_map.web.metadata.set('ows_enable_request', '*') clone_map.defresolution = clone_map.resolution if project == 'wms-bgdi': clone_map.web.metadata.set('wms_srs', WMS_SRS) for i in range(0, clone_map.numlayers): lyr = clone_map.getLayer(i) if lyr is not None: # Layer stuff and fixing if lyr.name == WATERMARK_LAYERNAME or project != 'wms-bod' : opacity = transparency = lyr.opacity else: opacity = transparency = 100 lyr.opacity = opacity lyr.transparency = transparency # No template (not queryable by default) if 'wms-ga-one' not in project: lyr.template = 'ttt' # How do we know if it is queryable None # Global Section if lyr.name in bodDict['layers'].keys(): lyr.metadata.set('ows_keywordlist',uni2iso(_(lyr.name+'.wms_ows_keywordlist'))) gml_include_items = bodDict['layers'][lyr.name]['gml_include_items'] if gml_include_items: lyr.metadata.set('gml_include_items', gml_include_items) #item value contains sometime invalid character lyr.metadata.set('wms_include_items', gml_include_items) # Queryable lyr.template = 'GetFeatureInfo' setScale(lyr, key='minscaledenom',value= bodDict['layers'][lyr.name]['ms_minscaledenom']) setScale(lyr, key='maxscaledenom',value= bodDict['layers'][lyr.name]['ms_maxscaledenom']) if project == 'wms-bod': setLabelScale(lyr, key='labelminscaledenom',value= bodDict['layers'][lyr.name]['ms_labelminscaledenom']) setLabelScale(lyr, key='labelmaxscaledenom',value= bodDict['layers'][lyr.name]['ms_labelmaxscaledenom']) group_id = bodDict['layers'][lyr.name]['group_id'] if group_id: lyr.group = group_id lyr.metadata.set('wms_group_title', uni2iso(_(lyr.name+'.wms_group_title')).replace("'","`")) lyr.metadata.set('wms_group_abstract', uni2iso(_(lyr.name+'.wms_group_abstract')).replace("'","`")) else: lyr.group = None if lyr.metadata.get('wms_group_title'): lyr.metadata.remove('wms_group_title') # Status lyr.status = mapscript.MS_OFF if lyr.name in WATERMARK_BGDI_LIST.split(",") : lyr.status=mapscript.MS_DEFAULT extent = lyr.metadata.get("wms_extent") if not extent: lyr.metadata.set("wms_extent", max_extent.strip()) else: lyr.metadata.set("wms_extent", extent.strip()) if 'wms-ga-one' in project: # Layer extent has to be provided by EXTENT Tag in projected Coordinates # remove wms_extent info from wms-ga-one* Layers # ltclm 20130920 lyr.metadata.remove('wms_extent') # ows_keywordlist_vocabulary and ows_keywordlist_XXXX_items are not yet in the bod # for now this dirty hack is sufficient # ltclm 20130920 if lang == 'en': lyr.metadata.set('ows_keywordlist_vocabulary', 'GEMET') lyr.metadata.set('ows_keywordlist_GEMET_items', 'Geology') if project == 'wms-bod': if lyr.name: # layer translation, if group take title and absctract from group if lyr.group and _(lyr.name+'.wms_title') == lyr.name+'.wms_title': lyr.metadata.set('wms_title',uni2iso(_(lyr.name+'.wms_group_title'))) else: lyr.metadata.set('wms_title', uni2iso(_(lyr.name+'.wms_title'))) #print _(u''+lyr.name+'.title') if lyr.group and _(lyr.name+'.wms_abstract') == lyr.name+'.wms_abstract': lyr.metadata.set('wms_abstract',uni2iso(_(lyr.name+'.wms_group_abstract'))) else: lyr.metadata.set('wms_abstract', uni2iso(_(lyr.name+'.wms_abstract'))) else: lyr.metadata.set('ows_title', uni2iso(_(lyr.name+'.wms_title')).replace("'","`")) lyr.metadata.set('ows_abstract', uni2iso(_(lyr.name+'.wms_abstract')).replace("'","`")) lyr.metadata.set('ows_srs', WMS_SRS) maxscaledenom = lyr.maxscaledenom if maxscaledenom < 0: lyr.maxscaledenom = MAXSCALEDENOM minscaledenom = lyr.minscaledenom if minscaledenom < 0: lyr.minscaledenom = MINSCALEDENOM items = lyr.metadata.get("gml_include_items") # do not translate gml_include_items or wms-ga* # if 'wms-ga-one' not in project: if items: for item in items.split(','): item = item.strip() gml_item_alias = "gml_%s_alias" % item wms_item_alias = "wms_%s_alias" % item item_translation = uni2iso(_(lyr.name+'.'+item+'.name')) lyr.metadata.set(gml_item_alias, xmlnamify(item_translation)) lyr.metadata.set(wms_item_alias, xmlnamify(item_translation)) # Classes stuff and fixing for j in range(0, lyr.numclasses): klass = lyr.getClass(j) if klass and klass.name and lyr.name: # Fix scales klassid = lyr.name + "." + klass.name.decode('utf-8','replace') if klassid in bodDict['classes'].keys(): setScale(klass, key='minscaledenom',value= bodDict['classes'][klassid]['ms_minscaledenom']) setScale(klass, key='maxscaledenom',value= bodDict['classes'][klassid]['ms_maxscaledenom']) klass.opacity = opacity klass.transparency = transparency klassname = klassid + ".name" klass.name =uni2iso( _(klassname)) #.encode('ascii','replace'))) if project == 'wms-bgdi': # layer / group translations # if layer is not (translated) in bod or translation kurzbezeichnung_de is empty and layer is not hidden in getcap if (not lyr.name in bodDict['layers'].keys() or not bodDict['layers'][lyr.name]['kurzbezeichnung_de']) and (lyr.metadata.get('wms_enable_request') is None or lyr.metadata.get('wms_enable_request').find('!GetCapabilities') == -1): # state 1: No translation for standard Layer without group id in mapfile if lyr.group is None: print "state 1: No bod entry for this layer %s, layer name will be tagged ..." % (lyr.name) print lyr.metadata.get('wms_enable_request') # save original layer id in wms_title attribute lyr.metadata.set('wms_title', uni2iso(_(lyr.name+'.wms_title')).replace("'","`")) lyr.metadata.set('wms_keywordlist', 'bgdi_hide_getcap,state1') lyr.name = None # state 2: # group is translated in bod # multiple technical layers in one snippet, only group entry in bod # tag layers elif lyr.group in bodDict['layers'].keys(): print "state 2: No bod entry for this layer %s (using group infos instead for translation: %s) ..." % (lyr.name,lyr.group) lyr.metadata.set('wms_group_title', uni2iso(_(lyr.group+'.wms_title')).replace("'","`")) lyr.metadata.set('wms_group_abstract', uni2iso(_(lyr.group+'.wms_abstract')).replace("'","`")) lyr.metadata.set('wms_keywordlist', 'bgdi_hide_getcap,state2') lyr.name = None else: # state 3: no translation available for layer and for group, tag layer remove layer name print "state 3: no valid group found in layer '%s', group id in mapfile '%s'" % (lyr.name,lyr.group) lyr.metadata.set('wms_keywordlist', 'bgdi_hide_getcap,state3') lyr.name = None if os.path.exists(localized_mapfilename): value = raw_input("Overwrite %s ? [y,n]" % localized_mapfilename) if value.strip() in ['y','Y','o','O']: clone_map.save(localized_mapfilename) else: clone_map.save(localized_mapfilename) s = iso2utf(open(localized_mapfilename).read()) # wms-swistopowms: remove _tilecache if project == 'wms-swisstopowms': s = s.replace("_tilecache", "") if project == 'wms-bgdi' or project == 'wms-bod': s = s.replace("MAP\n CONFIG","MAP\n MAXSIZE 15000\n CONFIG") s = s.replace('END # MAP','') # Append layers which should not be translated # these layers have to be added to the DoNotTranslate List in this script # these layers have to be added to the wms-bgdi.map.mako (otherwise they are not mapfilized to wms-bgdi.map) # ltclm 20130214 s += 'INCLUDE "mapfile_include/org.epsg.grid_21781.map"\n' s += 'INCLUDE "mapfile_include/org.epsg.grid_4326.map"\n' s += 'END # MAP' open(localized_mapfilename, 'w').write(s)