Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- from xml.etree import ElementTree
- import os, re
- # Kept here: http://pastebin.com/TRCR5Y1k
- template_path = '/home/hellerick/Dropbox/License plates/Template.svg'
- letters = 'ABEKMHOPCTYX'
- digits = '0123456789'
- total = 12*12*9999*12*12 # =207339264
- offset = 128142713
- magic = 43514825
- regions = {
- 'резервная серия' : {'code': 0, 'zones':range( 0,100)},
- 'Республика Адыгея' : {'code': 1, 'zones':range(100,103)},
- 'Республика Алтай' : {'code': 4, 'zones':range(103,105)},
- 'Республика '
- 'Башкортостан' : {'code': 2, 'zones':range(105,129)},
- 'Республика Бурятия' : {'code': 3, 'zones':range(129,135)},
- 'Республика Дагестан' : {'code': 5, 'zones':range(135,153)},
- 'Республика Ингушетия' : {'code': 6, 'zones':range(153,156)},
- 'Кабардино-Балкарская '
- 'Республика' : {'code': 7, 'zones':range(156,162)},
- 'Республика Калмыкия' : {'code': 8, 'zones':range(162,164)},
- 'Республика Карачаево-'
- 'Черкесия' : {'code': 9, 'zones':range(164,167)},
- 'Республика Карелия' : {'code':10, 'zones':range(167,171)},
- 'Республика Коми' : {'code':11, 'zones':range(171,177)},
- 'Республика Крым' : {'code':82, 'zones':range(177,189)},
- 'Республика Марий Эл' : {'code':12, 'zones':range(189,194)},
- 'Республика Мордовия' : {'code':13, 'zones':range(194,199)},
- 'Республика Саха '
- '(Якутия)' : {'code':14, 'zones':range(199,205)},
- 'Республика Северная '
- 'Осетия — Алания' : {'code':15, 'zones':range(205,210)},
- 'Республика Татарстан' : {'code':16, 'zones':range(210,233)},
- 'Республика Тыва' : {'code':17, 'zones':range(233,235)},
- 'Удмуртская Республика' : {'code':18, 'zones':range(235,244)},
- 'Республика Хакасия' : {'code':19, 'zones':range(244,248)},
- 'Чеченская республика' : {'code':20, 'zones':range(248,256)},
- 'Чувашская Республика' : {'code':21, 'zones':range(256,264)},
- 'Алтайский край' : {'code':22, 'zones':range(264,279)},
- 'Забайкальский край' : {'code':75, 'zones':range(279,286)},
- 'Камчатский край' : {'code':41, 'zones':range(286,288)},
- 'Краснодарский край' : {'code':23, 'zones':range(288,320)},
- 'Красноярский край' : {'code':24, 'zones':range(320,337)},
- 'Пермский край' : {'code':59, 'zones':range(337,353)},
- 'Приморский край' : {'code':25, 'zones':range(353,365)},
- 'Ставропольский край' : {'code':26, 'zones':range(365,382)},
- 'Хабаровский край' : {'code':27, 'zones':range(382,390)},
- 'Амурская область' : {'code':28, 'zones':range(390,395)},
- 'Архангельская область' : {'code':29, 'zones':range(395,402)},
- 'Астраханская область' : {'code':30, 'zones':range(402,408)},
- 'Белгородская область' : {'code':31, 'zones':range(408,418)},
- 'Брянская область' : {'code':32, 'zones':range(418,426)},
- 'Владимирская область' : {'code':33, 'zones':range(426,435)},
- 'Волгоградская область' : {'code':34, 'zones':range(435,451)},
- 'Вологодская область' : {'code':35, 'zones':range(451,459)},
- 'Воронежская область' : {'code':36, 'zones':range(459,473)},
- 'Ивановская область' : {'code':37, 'zones':range(473,480)},
- 'Иркутская область' : {'code':38, 'zones':range(480,495)},
- 'Калининградская '
- 'область' : {'code':39, 'zones':range(495,501)},
- 'Калужская область' : {'code':40, 'zones':range(501,507)},
- 'Кемеровская область' : {'code':42, 'zones':range(507,524)},
- 'Кировская область' : {'code':43, 'zones':range(524,532)},
- 'Костромская область' : {'code':44, 'zones':range(532,536)},
- 'Курганская область' : {'code':45, 'zones':range(536,542)},
- 'Курская область' : {'code':46, 'zones':range(542,549)},
- 'Ленинградская область' : {'code':47, 'zones':range(549,560)},
- 'Липецкая область' : {'code':48, 'zones':range(560,567)},
- 'Магаданская область' : {'code':49, 'zones':range(567,568)},
- 'Московская область' : {'code':50, 'zones':range(568,610)},
- 'Мурманская область' : {'code':51, 'zones':range(610,615)},
- 'Нижегородская область' : {'code':52, 'zones':range(615,635)},
- 'Новгородская область' : {'code':53, 'zones':range(635,639)},
- 'Новосибирская область' : {'code':54, 'zones':range(639,656)},
- 'Омская область' : {'code':55, 'zones':range(656,668)},
- 'Оренбургская область' : {'code':56, 'zones':range(668,680)},
- 'Орловская область' : {'code':57, 'zones':range(680,685)},
- 'Пензенская область' : {'code':58, 'zones':range(685,694)},
- 'Псковская область' : {'code':60, 'zones':range(694,698)},
- 'Ростовская область' : {'code':61, 'zones':range(698,724)},
- 'Рязанская область' : {'code':62, 'zones':range(724,731)},
- 'Самарская область' : {'code':63, 'zones':range(731,750)},
- 'Саратовская область' : {'code':64, 'zones':range(750,765)},
- 'Сахалинская область' : {'code':65, 'zones':range(765,768)},
- 'Свердловская область' : {'code':66, 'zones':range(768,794)},
- 'Смоленская область' : {'code':67, 'zones':range(794,800)},
- 'Тамбовская область' : {'code':68, 'zones':range(800,807)},
- 'Тверская область' : {'code':69, 'zones':range(807,815)},
- 'Томская область' : {'code':70, 'zones':range(815,822)},
- 'Тульская область' : {'code':71, 'zones':range(822,832)},
- 'Тюменская область' : {'code':72, 'zones':range(832,841)},
- 'Ульяновская область' : {'code':73, 'zones':range(841,849)},
- 'Челябинская область' : {'code':74, 'zones':range(849,870)},
- 'Ярославская область' : {'code':76, 'zones':range(870,878)},
- 'Москва' : {'code':77, 'zones':range(878,949)},
- 'Санкт-Петербург' : {'code':78, 'zones':range(949,979)},
- 'Севастополь' : {'code':92, 'zones':range(979,982)},
- 'Еврейская автономная '
- 'область' : {'code':79, 'zones':range(982,984)},
- 'Ненецкий автономный '
- 'округ' : {'code':83, 'zones':range(984,985)},
- 'Ханты-Мансийский '
- 'автономный округ '
- '— Югра' : {'code':86, 'zones':range(985,995)},
- 'Чукотский автономный '
- 'округ' : {'code':87, 'zones':range(995,996)},
- 'Ямало-Ненецкий '
- 'автономный округ' : {'code':89, 'zones':range(996,1000)},
- }
- colors = {
- 'W':'#ffffff',
- 'Y':'#ffcc00',
- 'K':'#000000',
- 'R':'#d40000',
- 'G':'#008000',
- 'B':'#0000d4',
- }
- def generate_plate(plate_code):
- print('Generating the plate', plate_code)
- inner_id, zone = unpack(plate_code)
- print('Inner ID:', inner_id)
- print('Zone:', zone)
- region = [regions[r]['code'] for r in regions if zone in regions[r]['zones']][0]
- region_name = [r for r in regions if region==regions[r]['code']][0]
- print('Region code:', region, '('+region_name+')')
- colorscheme = get_colorscheme(region)
- print('Color scheme: {}/{} {}/{}'.format(*colorscheme)) # RPFONT, RPBG, IPFONT, IPBG
- ## https://docs.python.org/3/library/xml.etree.elementtree.html
- ElementTree.register_namespace('dc','http://purl.org/dc/elements/1.1/')
- ElementTree.register_namespace('cc','http://creativecommons.org/ns#')
- ElementTree.register_namespace('rdf','http://www.w3.org/1999/02/22-rdf-syntax-ns#')
- ElementTree.register_namespace('svg','http://www.w3.org/2000/svg')
- ElementTree.register_namespace('','http://www.w3.org/2000/svg')
- ElementTree.register_namespace('xlink','http://www.w3.org/1999/xlink')
- ElementTree.register_namespace('sodipodi','http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd')
- ElementTree.register_namespace('inkscape','http://www.inkscape.org/namespaces/inkscape')
- doc = ElementTree.parse(template_path)
- RPFONT = doc.find('.//*[@id="RPFONT"]')
- RPBG = doc.find('.//*[@id="RPBG"]')
- IPFONT = doc.find('.//*[@id="IPFONT"]')
- IPBG = doc.find('.//*[@id="IPBG"]')
- RPFONT.attrib['style']=re.sub(r'fill:#[0-9a-f]{6}', r'fill:'+colors[colorscheme[0]], RPFONT.attrib['style'])
- RPBG.attrib['style']=re.sub(r'fill:#[0-9a-f]{6}', r'fill:'+colors[colorscheme[1]], RPBG.attrib['style'])
- IPFONT.attrib['style']=re.sub(r'fill:#[0-9a-f]{6}', r'fill:'+colors[colorscheme[2]], IPFONT.attrib['style'])
- IPBG.attrib['style']=re.sub(r'fill:#[0-9a-f]{6}', r'fill:'+colors[colorscheme[3]], IPBG.attrib['style'])
- RP1 = doc.find('.//*[@id="RP1"]')
- RP2 = doc.find('.//*[@id="RP2"]')
- for n,e in enumerate([RP1, RP2]):
- e.attrib['{http://www.w3.org/1999/xlink}href'] = '#smallDigit'+'{:02d}'.format(region)[n]
- IP1 = doc.find('.//*[@id="IP1"]')
- IP2 = doc.find('.//*[@id="IP2"]')
- IP3 = doc.find('.//*[@id="IP3"]')
- IP4 = doc.find('.//*[@id="IP4"]')
- IP5 = doc.find('.//*[@id="IP5"]')
- IP6 = doc.find('.//*[@id="IP6"]')
- IP7 = doc.find('.//*[@id="IP7"]')
- IP8 = doc.find('.//*[@id="IP8"]')
- for n,e in enumerate([IP1, IP2]):
- e.attrib['{http://www.w3.org/1999/xlink}href'] = '#letter'+plate_code[n]
- for n,e in enumerate([IP3, IP4, IP5, IP6]):
- e.attrib['{http://www.w3.org/1999/xlink}href'] = '#digit'+plate_code[n+2]
- for n,e in enumerate([IP7, IP8]):
- e.attrib['{http://www.w3.org/1999/xlink}href'] = '#letter'+plate_code[n+6]
- folder = os.path.dirname(template_path)
- svg_path = os.path.join(folder, 'Plate ({:02d}) {}.svg'.format(region, plate_code))
- png_path = os.path.join(folder, 'Plate ({:02d}) {}.png'.format(region, plate_code))
- print('Saving as:', svg_path)
- doc.write(svg_path, default_namespace=None)
- print('Converting as:', png_path)
- os.system('inkscape "{}" -e "{}"'.format(svg_path, png_path))
- def pack(inner_id, zone): # inner_id 0..207339; zone 100..999
- plainnum = inner_id * 1000 + zone
- n = plainnum*offset % total
- code = ''
- for p in [12,12,9999,12,12]:
- c = n%p
- n = n//p
- if p==12:
- code = letters[c] + code
- else:
- code = '{:04d}'.format(c+1) + code
- return code
- def unpack(alphanumcode):
- alphanumcode = [
- alphanumcode[0],
- alphanumcode[1],
- alphanumcode[2:6],
- alphanumcode[6],
- alphanumcode[7],
- ]
- num = 0
- for c in alphanumcode:
- if c in letters:
- val = [i for i in range(len(letters)) if letters[i]==c][0]
- num = num * len(letters) + val
- else:
- val = int(c)-1
- num = num * 9999 + val
- num = round(num * magic % total)
- inner_id, zone = num // 1000, num % 1000
- return inner_id, zone
- def get_colorscheme(regioncode):
- ipcol = 'KRGB'[regioncode%4]
- rpcol = 'KRGB'[regioncode//4%4]
- ipmet = 'WY'[regioncode//16%2]
- rpmet = 'WY'[regioncode//32%2]
- scheme = [ipcol,ipmet,rpcol,rpmet]
- if regioncode in range(0,64):
- scheme[0], scheme[1] = scheme[1], scheme[0]
- if regioncode in range(64,128):
- scheme[2], scheme[3] = scheme[3], scheme[2]
- return scheme
- if __name__ == '__main__':
- ## print(pack(6024,336))
- ## print(unpack('XM7145MA'))
- ## generate_plate(pack(1,949))
- for r in regions:
- generate_plate(pack(1,regions[r]['zones'][0]))
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement