Get card info from an index file, instead of trying to parse the PDF's.

master
Pacman Ghost 7 years ago
parent 8e65f68994
commit 21c005aa3e
  1. 1
      _freeze.py
  2. 100
      asl_cards/parse.py
  3. 2
      asl_cards/run_tests.sh
  4. 1
      asl_cards/tests/_test_case_base.py
  5. 6
      asl_cards/tests/_test_real_data.py
  6. 42
      index/AlliedMinorOrdnanceMidApril15.txt
  7. 50
      index/AlliedMinorVehiclesMidApril15.txt
  8. 30
      index/AmericanOrdnance.txt
  9. 62
      index/AmericanVehiclesMidApril15.txt
  10. 84
      index/AxisMinorOrdnanceApril15.txt
  11. 66
      index/AxisMinorVehiclesMidApril15.txt
  12. 30
      index/BritishOrdnanceMidApril15.txt
  13. 132
      index/BritishVehiclesMidApril15.txt
  14. 42
      index/ChineseOrdnanceMidApril15.txt
  15. 22
      index/ChineseVehiclesFeb15.txt
  16. 46
      index/FinnishOrdnanceUpdateApril15.txt
  17. 32
      index/FinnishVehiclesUpdateApril15.txt
  18. 22
      index/FrenchOrdnance.txt
  19. 52
      index/FrenchVehiclesMidApril15.txt
  20. 35
      index/GermanOrdnance.txt
  21. 120
      index/GermanVehiclesMidApril15.txt
  22. 32
      index/HPRussianVehiclesMidApril15.txt
  23. 21
      index/ItalianOrdnance.txt
  24. 42
      index/ItalianVehiclesMidApril15.txt
  25. 28
      index/JapaneseOrdnance.txt
  26. 24
      index/JapaneseVehiclesFeb15.txt
  27. 28
      index/RussianOrdnance.txt
  28. 58
      index/RussianVehiclesMidApril15.txt
  29. 2
      main_window.py
  30. 28
      startup_widget.py

@ -22,6 +22,7 @@ def get_extra_files( fspec ) :
# initialize
extra_files = []
extra_files.extend( get_extra_files( "index/*.txt" ) )
extra_files.extend( get_extra_files( "resources/*.ico" ) )
extra_files.extend( get_extra_files( "resources/*.png" ) )
extra_files.extend( get_extra_files( "ui/*ui" ) )

@ -6,6 +6,8 @@ import tempfile
import locale
from collections import namedtuple
from PyQt5.QtWidgets import QMessageBox
from pdfminer.pdfinterp import PDFResourceManager , PDFPageInterpreter
from pdfminer.converter import PDFPageAggregator
from pdfminer.layout import LAParams , LTTextBoxHorizontal
@ -20,8 +22,10 @@ from asl_cards.db import AslCard , AslCardImage
class PdfParser:
def __init__( self , progress=None , progress2=None ) :
def __init__( self , index_dir , ask=None , progress=None , progress2=None ) :
# initialize
self.index_dir = index_dir
self.ask = ask # nb: for asking the user something during processing
self.progress = progress # nb: for tracking file progress
self.progress2 = progress2 # nb: for tracking page progress within a file
self.cancelling = False
@ -39,34 +43,84 @@ class PdfParser:
]
# parse each file
cards = []
for fname in fnames :
for file_no,fname in enumerate(fnames) :
if self.cancelling : raise RuntimeError("Cancelled.")
cards.extend( self._do_parse_file( fname , max_pages , images ) )
file_cards = self._do_parse_file( float(file_no)/len(fnames) , fname , max_pages , images )
if file_cards :
cards.extend( file_cards )
self._progress( 1.0 , "Done." )
# filter out placeholder cards
cards = [ c for c in cards if c.nationality != "_unused_" and c.name != "_unused_" ]
return cards
def _do_parse_file( self , fname , max_pages , images ) :
# extract the details of each card
rmgr = PDFResourceManager()
laparams = LAParams()
dev = PDFPageAggregator( rmgr , laparams=laparams )
interp = PDFPageInterpreter( rmgr , dev )
def _do_parse_file( self , pval , fname , max_pages , images ) :
cards = []
with open(fname,"rb") as fp :
self._progress( 0 , "Analyzing {}...".format( os.path.split(fname)[1] ) )
pages = list( PDFPage.get_pages( fp ) )
for page_no,page in enumerate(pages) :
if self.cancelling : raise RuntimeError("Cancelled.")
self._progress2( float(page_no) / len(pages) )
page_cards = self._parse_page( cards , interp , page_no , page )
cards.extend( page_cards )
if max_pages > 0 and 1+page_no >= max_pages :
break
self._progress( 1.0 , "Done." )
# check if we have an index for this file
# NOTE: We originally tried to get the details of each card by parsing the PDF files but unfortunately,
# the text was coming out garbled. We allow corrections to be supplied in an external file, but if we're
# going to do that, we might as well not bother parsing the PDF :-/ (especially since it's so insanely slow).
split = os.path.split( fname )
index_fname = os.path.join(
self.index_dir if self.index_dir else "" ,
os.path.splitext(split[1])[0]+".txt"
)
if os.path.isfile( index_fname ) :
# yup - just generate the AslCard's from that
# NOTE: It would be nice to store these files as JSON, or something similar, but we want
# to keep them easy for end-users to change, if some values need to be tweaked.
self._progress( pval , "Reading card details from {}...".format( os.path.split(index_fname)[1] ) )
for line_buf in open(index_fname,"r") :
line_buf = line_buf.strip()
if line_buf == "" or line_buf.startswith(("#","'",";","//")) :
continue
fields = line_buf.split( "|" )
if len(fields) != 3 :
raise RuntimeError( "Invalid index line: {}".format( line_buf ) )
fields = [ f.strip() for f in fields ]
ncards = len( cards )
cards.append( AslCard(
card_tag = fields[0] ,
nationality = fields[1] ,
name = fields[2] ,
page_id = 1 + ncards/2 ,
page_pos = ncards % 2
) )
else :
# ask the user if they want to try parsing the PDF
if self.ask :
rc = self.ask(
"Can't find an index file for {}.\n\nDo you want to try parsing the PDF (slow and unreliable)?".format(
os.path.split( fname )[ 1 ]
) ,
QMessageBox.Yes | QMessageBox.No , QMessageBox.No
)
if rc != QMessageBox.Yes :
return None
# extract each AslCard from the file
self._progress( pval , "Analyzing {}...".format( os.path.split(fname)[1] ) )
rmgr = PDFResourceManager()
laparams = LAParams()
dev = PDFPageAggregator( rmgr , laparams=laparams )
interp = PDFPageInterpreter( rmgr , dev )
with open(fname,"rb") as fp :
pages = list( PDFPage.get_pages( fp ) )
for page_no,page in enumerate(pages) :
if self.cancelling : raise RuntimeError("Cancelled.")
self._progress2( float(page_no) / len(pages) )
page_cards = self._parse_page( cards , interp , page_no , page )
cards.extend( page_cards )
if max_pages > 0 and 1+page_no >= max_pages :
break
# extract the card images
if images :
self._progress( pval , "Extracting images from {}...".format( os.path.split(fname)[1] ) )
card_images = self._extract_images( fname , max_pages )
if len(cards) != len(card_images) :
raise RuntimeError( "Found {} cards, {} card images.".format( len(cards) , len(card_images) ) )
raise RuntimeError(
"Card mismatch in {}: found {} cards, {} card images.".format(
fname , len(cards) , len(card_images)
)
)
for i in range(0,len(cards)) :
if self.cancelling : raise RuntimeError("Cancelled.")
cards[i].card_image = AslCardImage( image_data=card_images[i] )
@ -138,7 +192,6 @@ class PdfParser:
# FIXME! clean up left-over temp files before we start
args = [ s.encode(locale.getpreferredencoding()) for s in args ]
# FIXME! stop GhostScript from issuing warnings (stdout).
self._progress( 0 , "Extracting images from {}...".format( os.path.split(fname)[1] ) )
ghostscript.Ghostscript( *args )
# figure out how many files were created (so we can show progress)
npages = 0
@ -182,7 +235,6 @@ class PdfParser:
card_images.append( buf2 )
# clean up
os.unlink( fname )
self._progress( 1.0 , "Done." )
return card_images
def _crop_image( self , img , bbox , fname ) :
@ -192,7 +244,7 @@ class PdfParser:
bgd_col = img.getpixel( (0,0) )
bgd_img = Image.new( img.mode , img.size , bgd_col )
diff = ImageChops.difference( rgn , bgd_img )
diff = ImageChops.add(diff, diff, 2.0, -100)
#diff = ImageChops.add(diff, diff, 2.0, -100)
bbox = diff.getbbox()
if bbox :
rgn = rgn.crop( bbox )

@ -1,2 +1,2 @@
cd `dirname "$0"`
cd `dirname "$0"`/tests
python -m unittest discover

@ -18,6 +18,7 @@ class TestCaseBase( unittest.TestCase ) :
if not os.path.isfile( fname2 ) :
raise RuntimeError( "Missing data file: {}".format( fname2 ) )
pdf_parser = PdfParser(
None ,
#progress = lambda _,msg: print( msg , file=sys.stderr , flush=True )
)
cards = pdf_parser.parse( fname2 , images=False )

@ -10,7 +10,11 @@ from asl_cards.parse import AslCard
# ---------------------------------------------------------------------
class TestRealData( TestCaseBase ) :
"""Run tests using the real "ASL Cards" PDF files."""
"""Run tests using the real "ASL Cards" PDF files.
NOTE: This set of tests are run separately since they are insanely slow, and require the real PDF files
that need to be purchased (and so aren't kept in source control).
"""
def _test_pdf_parser( self , fname , expected_cards ) :
"""Test the PDF parser."""

@ -0,0 +1,42 @@
Ordnance #1 | Polish | 46mm Gran. wz.36
Ordnance #2 | Polish | wz.35
Ordnance #3 | Polish | 75mm wz. 02/26
Ordnance #4 | Polish | 100mm wz. 14/19
Ordnance #5 | Polish | 75mm wz. 97/25
Ordnance #6 | Belgian | DBT
Ordnance #7 | Belgian | M76 A
Ordnance #7 | Belgian | M76 A (LF)
Ordnance #8 | Belgian | 7.6cm FRC
Ordnance #9 | Belgian | C47 FRC M32
Ordnance #10 | Belgian | C75 TR
Ordnance #11 | Belgian | C75 GP
Ordnance #11 | Belgian | C75 GP (LF)
Ordnance #12 | Belgian | Ob 105 GP
Ordnance #12 | Belgian | Ob 105 GP (LF)
Ordnance #13 | Belgian | C120 M31
Ordnance #13 | Belgian | C120 M31 (LF)
Ordnance #14 | Belgian | M27 FRC
Ordnance #15 | Dutch | Solothurn s/18-1100
Ordnance #16 | Greek | Vari 85/24 M
Ordnance #17 | Greek | OR 105/19 (f)
Ordnance #18 | Greek | 3.7cm Bofors (r)
Ordnance #19 | Danish | MC 20mm M-35
Ordnance #20 | Yugoslav | 3.7cm Inf Gun
Ordnance #21 | Yugoslav | 80mm M28/M33
Ordnance #22 | Yugoslav | 100mm M14/19
Ordnance #23 | Allied Minor | Brandt Mortar (f)
Ordnance #24 | Allied Minor | 37mm Bofors
Ordnance #25 | Allied Minor | 3.7cm PaK 35/36 (g)
Ordnance #26 | Allied Minor | Bohler M35 47mm
Ordnance #27 | Allied Minor | 65mm wz.06
Ordnance #28 | Allied Minor | 75mm wz.97
Ordnance #29 | Allied Minor | Bofors M34
Ordnance #30 | Allied Minor | 75M 19S (f)
Ordnance #31 | Allied Minor | C105L 13 S (f)
Ordnance #32 | Allied Minor | 120mm wz. 09/31
Ordnance #33 | Allied Minor | 155mm 17 S (f)
Ordnance #34 | Allied Minor | Mitra. de 13.2 CAJ (f)
Ordnance #35 | Allied Minor | 20mm Oerlikon
Ordnance #35 | Allied Minor | 20mm Oerlikon (LF)
Ordnance #36 | Allied Minor | 40mm Bofors
Ordnance #36 | Allied Minor | 40mm Bofors (LF)

@ -0,0 +1,50 @@
Vehicle #1 | Polish | TKS
Vehicle #1 | Polish | TKS (L)
Vehicle #2 | Polish | Vickers Edw (b)
Vehicle #2 | Polish | Vickers Ejw (b)
Vehicle #3 | Polish | 7TPdw
Vehicle #3 | Polish | 7TPjw
Vehicle #4 | Polish | H35 (f)
Vehicle #5 | Polish | Peugeot 1918 (f)
Vehicle #6 | Polish | wz.29
Vehicle #7 | Polish | wz.34-I
Vehicle #7 | Polish | wz.34-II
Vehicle #8 | Polish | De Dion-Bouton (f)
Vehicle #9 | Polish | PF621L SPAA
Vehicle #10 | Polish | 302T
Vehicle #11 | Polish | C2P
Vehicle #12 | Polish | C4P
Vehicle #13 | Polish | Taczanka
Vehicle #14 | Belgian | VCL Mk VI (b)
Vehicle #15 | Belgian | T-13 II (b)
Vehicle #16 | Belgian | T-13 III (b)
Vehicle #17 | Belgian | T-15 (b)
Vehicle #18 | Belgian | ACG1 (f)
Vehicle #19 | Yugoslav | T-32
Vehicle #20 | Yugoslav | M3A1 (a)
Vehicle #20 | Yugoslav | M3A3 (a)
Vehicle #21 | Yugoslav | M3 (a) Pak 40
Vehicle #22 | Yugoslav | M3 (a) FlaK 38
Vehicle #23 | Yugoslav | AEC II (b)
Vehicle #24 | Danish | Nimbus
Vehicle #25 | Dutch | VCL M1936 (b)
Vehicle #26 | Dutch | CTLS-4 (a)
Vehicle #27 | Dutch | M36
Vehicle #27 | Dutch | M38
Vehicle #28 | Dutch | M39
Vehicle #29 | Dutch | Marm-Herr III (b)
Vehicle #30 | Dutch | Jeep (a)
Vehicle #31 | Allied Minor | L5/30 (i)
Vehicle #31 | Allied Minor | L3/35 (i)
Vehicle #31 | Allied Minor | L6/40 (i)
Vehicle #31 | Allied Minor | M13/40 (i)
Vehicle #32 | Allied Minor | FT-17M (f)
Vehicle #32 | Allied Minor | FT-17C (f)
Vehicle #33 | Allied Minor | R-35 (f)
Vehicle #34 | Allied Minor | M3A1 (a)
Vehicle #35 | Allied Minor | C-K P17 (f)
Vehicle #35 | Allied Minor | C-K P19 (f)
Vehicle #36 | Allied Minor | VCL Utility B (b)
Vehicle #37 | Allied Minor | Light Truck
Vehicle #37 | Allied Minor | Medium Truck
Vehicle #37 | Allied Minor | Heavy Truck

@ -0,0 +1,30 @@
Ordnance #1 | American | M2 60mm
Ordnance #2 | American | M19
Ordnance #3 | American | M1 81mm
Ordnance #4 | American | M2 4.2in
Ordnance #5 | American | T25
Ordnance #6 | American | M3A1
Ordnance #7 | American | M1 57mm
Ordnance #8 | American | M5
Ordnance #9 | American | T32
Ordnance #10 | American | M18
Ordnance #11 | American | M20
Ordnance #12 | American | M1A1 75mm
Ordnance #13 | American | M1897A2
Ordnance #14 | American | M2A1
Ordnance #15 | American | M3
Ordnance #16 | American | M1 4.5in
Ordnance #17 | American | M1918
Ordnance #18 | American | M1 155mm
Ordnance #19 | American | M1918M1
Ordnance #20 | American | M1A1 155mm
Ordnance #21 | American | M1 8in
Ordnance #22 | American | M51
Ordnance #22 | American | M51 (LF)
Ordnance #23 | American | M1A2
Ordnance #24 | American | M1 40mm
Ordnance #24 | American | M1 40mm (LF)
Ordnance #25 | American | M3 AA
Ordnance #26 | American | M1A1 90mm
Ordnance #27 | American | M2
Ordnance #27 | American | M2 (LF)

@ -0,0 +1,62 @@
Vehicle #1 | American | M2A4
Vehicle #2 | American | M3 LT
Vehicle #3 | American | M3A1 LT
Vehicle #4 | American | M3A1 Satan
Vehicle #5 | American | M5A1
Vehicle #6 | American | M24
Vehicle #7 | American | M3 MT (MA)
Vehicle #7 | American | M3 MT (SA)
Vehicle #8 | American | M4
Vehicle #9 | American | M4A1
Vehicle #10 | American | M4A2
Vehicle #11 | American | M4A2 (L)
Vehicle #12 | American | M4A3
Vehicle #13 | American | M4A3(75)W
Vehicle #14 | American | M4A3E2
Vehicle #14 | American | M4A3E2(L)
Vehicle #15 | American | M4A1(76)W
Vehicle #16 | American | M4A3(76)W
Vehicle #17 | American | M4(105)
Vehicle #17 | American | M4A3(105)
Vehicle #18 | American | M4 Tankdozer
Vehicle #19 | American | T1E3
Vehicle #20 | American | Sherman Crab
Vehicle #21 | American | POA-CWS-H1
Vehicle #22 | American | M26
Vehicle #23 | American | M10 GMC
Vehicle #24 | American | M18 GMC
Vehicle #25 | American | M36 GMC
Vehicle #26 | American | M36B1 GMC
Vehicle #27 | American | M2
Vehicle #28 | American | M3
Vehicle #29 | American | M3A1
Vehicle #30 | American | M3(MMG)
Vehicle #30 | American | M3(HMG)
Vehicle #31 | American | M4 MC
Vehicle #32 | American | M4A1 MC
Vehicle #33 | American | M21 MC
Vehicle #34 | American | M3 GMC
Vehicle #35 | American | T30 HMC
Vehicle #36 | American | T19 HMC
Vehicle #37 | American | M15A1 MGMC
Vehicle #38 | American | M16 MGMC
Vehicle #39 | American | M3A1 SC
Vehicle #40 | American | M20
Vehicle #41 | American | T8
Vehicle #42 | American | M8
Vehicle #43 | American | M8 HMC
Vehicle #44 | American | M7 HMC
Vehicle #45 | American | M12 GMC
Vehicle #46 | American | LVT(A)1
Vehicle #47 | American | LVT(A)4
Vehicle #48 | American | M4 DD
Vehicle #49 | American | LVT2
Vehicle #50 | American | LVT(A)2
Vehicle #51 | American | LVT4
Vehicle #52 | American | DUKW
Vehicle #53 | American | 1/4-Ton Jeep GPA
Vehicle #54 | American | 1/4-Ton Jeep
Vehicle #55 | American | 3/4-Ton
Vehicle #56 | American | 1 1/2-Ton
Vehicle #57 | American | 2 1/2-Ton
Vehicle #58 | American | 7 1/2-Ton

@ -0,0 +1,84 @@
Ordnance #1 | Romanian | Brandt M35 (f)
Ordnance #2 | Romanian | Bofors 37mm
Ordnance #3 | Romanian | 45mm PTP o.32 (r)
Ordnance #4 | Romanian | Resita M43
Ordnance #5 | Romanian | 76.2mm PaK 36 (r)
Ordnance #6 | Romanian | Breda 47 (i)
Ordnance #7 | Romanian | 75mm PP obr.27 (r)
Ordnance #8 | Romanian | 75 M mle 28 (f)
Ordnance #9 | Romanian | Skoda M 14/34
Ordnance #10 | Romanian | 76.2mm o.00/02 (r)
Ordnance #11 | Romanian | 76.2mm o.02/30 (r)
Ordnance #12 | Romanian | 76.2mm o.39 (r)
Ordnance #13 | Romanian | s 10cm K 18 (g)
Ordnance #14 | Romanian | Skoda M39(D9)
Ordnance #15 | Romanian | Canon 105L m36S (f)
Ordnance #16 | Romanian | Canon mle 10/12 (f)
Ordnance #17 | Romanian | OQF 4.5in (b)
Ordnance #18 | Romanian | Skoda M28 NOa
Ordnance #19 | Romanian | Skoda M33 (K1)
Ordnance #20 | Romanian | CA mle 38 (f)
Ordnance #21 | Romanian | Vick/Resita M36/39
Ordnance #22 | Romanian | Kanon PL vz. 12/20
Ordnance #23 | Hungarian | 5cm IeGrW 39 (h)
Ordnance #24 | Hungarian | 40mm MAVAG 40M
Ordnance #25 | Hungarian | Skoda M05/08
Ordnance #26 | Hungarian | 105 MAVAG M40
Ordnance #27 | Hungarian | Bofors 80 M29/38
Ordnance #28 | Slovakian | Minomet vz.36
Ordnance #29 | Slovakian | Kanon PUV v.36 (t)
Ordnance #30 | Slovakian | IeIG 18 (g)
Ordnance #31 | Slovakian | Skoda M37(K4)
Ordnance #32 | Slovakian | Skoda 47L40 (t)
Ordnance #33 | Slovakian | Skoda PL vz.37 (t)
Ordnance #34 | Slovakian | Kanon PL vz.22/24
Ordnance #35 | Croatian | Can da 65/17 (i)
Ordnance #36 | Croatian | Skoda M28(FE)
Ordnance #37 | Bulgarian | LG de 50 m 37 (f)
Ordnance #38 | Bulgarian | Madsen M-35
Ordnance #39 | Bulgarian | Skoda Inf 37
Ordnance #39 | Bulgarian | Skoda Inf 70
Ordnance #40 | Bulgarian | Bofors 75 M36
Ordnance #41 | Bulgarian | 75mm K-S
Ordnance #42 | Bulgarian | Ob 105mm GP
Ordnance #42 | Bulgarian | Ob 105mm GP (LF)
Ordnance #43 | Bulgarian | D/30 Krupp
Ordnance #44 | Axis Minor | 5cm IeGrW 36 (g)
Ordnance #45 | Axis Minor | 50mm RM o.40 (r)
Ordnance #46 | Axis Minor | 8cm GrW 34 (g)
Ordnance #47 | Axis Minor | Brandt M27/31 (f)
Ordnance #48 | Axis Minor | PM obr.38 (r)
Ordnance #49 | Axis Minor | Ur wz.35 (p)
Ordnance #50 | Axis Minor | s18-1100
Ordnance #51 | Axis Minor | Kanon PUV v.37 (t)
Ordnance #52 | Axis Minor | Bohler M35 47mm
Ordnance #53 | Axis Minor | 5cm PaK 38 (g)
Ordnance #54 | Axis Minor | 7.5cm PaK 97/38 (g)
Ordnance #55 | Axis Minor | 7.5cm PaK 40 (g)
Ordnance #56 | Axis Minor | Skoda M15
Ordnance #57 | Axis Minor | Canon 75 m 1897 (f)
Ordnance #58 | Axis Minor | Skoda M29
Ordnance #59 | Axis Minor | Skoda M17
Ordnance #60 | Axis Minor | Skoda M28(80)
Ordnance #61 | Axis Minor | Skoda M14/19
Ordnance #62 | Axis Minor | IeFH 18 (g)
Ordnance #63 | Axis Minor | Skoda M35
Ordnance #64 | Axis Minor | G obr.10/30 (r)
Ordnance #65 | Axis Minor | G obr.38 (r)
Ordnance #66 | Axis Minor | Skoda M14
Ordnance #67 | Axis Minor | Skoda M15/16
Ordnance #68 | Axis Minor | C mle 17 S (f)
Ordnance #69 | Axis Minor | Mitr. 13.2 CAJ m 30
Ordnance #70 | Axis Minor | Oerlikon FF
Ordnance #70 | Axis Minor | Oerlikon FF (LF)
Ordnance #71 | Axis Minor | 2cm FlaK 30 (g)
Ordnance #71 | Axis Minor | 2cm FlaK 30 (g) (LF)
Ordnance #72 | Axis Minor | 2cm FlaK 38 (g)
Ordnance #72 | Axis Minor | 2cm FlaK 38 (g) (LF)
Ordnance #73 | Axis Minor | 3.7cm FlaK 36 (g)
Ordnance #74 | Axis Minor | Bofors 40mm
Ordnance #74 | Axis Minor | Bofors 40mm (LF)
Ordnance #75 | Axis Minor | Skoda M33
Ordnance #76 | Axis Minor | 8.8cm FlaK 18 (g)
Ordnance #76 | Axis Minor | 8.8cm FlaK 18 (g) (LF)
Ordnance #00 | _unused_ | _unused_

@ -0,0 +1,66 @@
Vehicle #1 | Romanian | R-1 (t)
Vehicle #2 | Romanian | R-35/45 (f)
Vehicle #3 | Romanian | TACAM T-60 (r)
Vehicle #3 | Romanian | TACAM T-60A (r)
Vehicle #4 | Romanian | TACAM R-2 (r)
Vehicle #5 | Romanian | BA-6 (r)
Vehicle #5 | Romanian | BA-20 (r)
Vehicle #6 | Romanian | Malaxa UE2
Vehicle #7 | Hungarian | 38M Toldi I
Vehicle #8 | Hungarian | 38M Toldi IIA
Vehicle #9 | Hungarian | 40M Turan I (r)
Vehicle #10 | Hungarian | 41M Turan II (r)
Vehicle #11 | Hungarian | PzKpfw VG (g)
Vehicle #12 | Hungarian | PzKpfw VIE(L) (g)
Vehicle #13 | Hungarian | 43M Zrinyi II
Vehicle #14 | Hungarian | 39M Csaba
Vehicle #14 | Hungarian | 40M Csaba
Vehicle #15 | Hungarian | Marder II (g)
Vehicle #16 | Hungarian | 40M Nimrod
Vehicle #17 | Slovakian | T vz 33 (t)
Vehicle #18 | Slovakian | LT vz 34
Vehicle #19 | Slovakian | PzKpfz IIA (g)
Vehicle #20 | Slovakian | LT vz 40 (t)
Vehicle #21 | Slovakian | Marder III (t) H
Vehicle #22 | Slovakian | Kfz I (g)
Vehicle #23 | Slovakian | SdKfz 2 (g)
Vehicle #24 | Slovakian | TKS
Vehicle #24 | Croatian | TKS(L)
Vehicle #25 | Croatian | L6/40 (i)
Vehicle #26 | Croatian | wz 34-I
Vehicle #26 | Croatian | wz 34-II
Vehicle #27 | Croatian | SMV L40 da 47/32
Vehicle #28 | Bulgarian | Vickers Mk E (b)
Vehicle #29 | Axis Minor | L3/35 (i)
Vehicle #30 | Axis Minor | FT-17M (f)
Vehicle #30 | Axis Minor | FT-17C (f)
Vehicle #31 | Axis Minor | PzKpfw IB (g)
Vehicle #32 | Axis Minor | R-35 (f)
Vehicle #33 | Axis Minor | H39 (f)
Vehicle #34 | Axis Minor | LT vz 35 (g)
Vehicle #35 | Axis Minor | LT vz 38 (t) A
Vehicle #35 | Axis Minor | LT vz 38 (t) E
Vehicle #36 | Axis Minor | S-35 (f)
Vehicle #37 | Axis Minor | PzKpfw IIIL (g)
Vehicle #38 | Axis Minor | PzKpfw IIIN (g)
Vehicle #39 | Axis Minor | PzKpfw IVD (g)
Vehicle #39 | Axis Minor | PzKpfw IVF1 (g)
Vehicle #39 | Axis Minor | PzKpfw IVH (g)
Vehicle #40 | Axis Minor | StuG IIIG (g)
Vehicle #41 | Axis Minor | JgdPz 38 (t)
Vehicle #42 | Axis Minor | SPW 250/1 (g)
Vehicle #42 | Axis Minor | SPW 251/1 (g)
Vehicle #42 | Axis Minor | SPW 251/9 (g)
Vehicle #43 | Axis Minor | OA vz 30 (t)
Vehicle #44 | Axis Minor | AB 41 (i)
Vehicle #45 | Axis Minor | PSW 222 (g)
Vehicle #45 | Axis Minor | PSW 222(L) (g)
Vehicle #46 | Axis Minor | PSW 223 (g)
Vehicle #47 | Axis Minor | Komsomolet (r)
Vehicle #48 | Axis Minor | RSO (g)
Vehicle #49 | Axis Minor | Light Tractor
Vehicle #49 | Axis Minor | Medium Tractor
Vehicle #49 | Axis Minor | Heavy Tractor
Vehicle #50 | Axis Minor | Light Truck
Vehicle #50 | Axis Minor | Medium Truck
Vehicle #50 | Axis Minor | Heavy Truck

@ -0,0 +1,30 @@
Ordnance #1 | British | OML 2in
Ordnance #1 | British | OML 2in Airb.
Ordnance #2 | British | OML 3in (E)
Ordnance #2 | British | OML 3in (L)
Ordnance #3 | British | OSB 4.2in
Ordnance #4 | British | OQF 25mm Hotch.
Ordnance #5 | British | OQF 2pdr
Ordnance #5 | British | OQF 2pdr (LF)
Ordnance #6 | British | OQF 6pdr
Ordnance #7 | British | OQF 17/25pdr
Ordnance #8 | British | OQF 17pdr
Ordnance #9 | British | OQF M1A1 75mm
Ordnance #10 | British | Canon de 75 1897
Ordnance #11 | British | OQF 18pdr
Ordnance #12 | British | OQF 25pdr Short
Ordnance #13 | British | OQF 25pdr Gun
Ordnance #13 | British | OQF 25pdr Gun (LF)
Ordnance #14 | British | OQF 3.7in How.
Ordnance #15 | British | OQF 4.5in How.
Ordnance #16 | British | OBL 4.5in Gun
Ordnance #16 | British | OBL 5.5in Gun
Ordnance #17 | British | OBL 6in How.
Ordnance #18 | British | OBL 7.2in How. I
Ordnance #19 | British | OBL 7.2in How. VI
Ordnance #20 | British | OQF 20mm
Ordnance #21 | British | OQF 40mm
Ordnance #21 | British | OQF 40mm (LF)
Ordnance #22 | British | OQF 3in 20cwt
Ordnance #23 | British | OWF 3.7in
Ordnance #23 | British | OWF 3.7in

@ -0,0 +1,132 @@
Vehicle #1 | British | Mark VIB
Vehicle #1 | British | Mark VIC
Vehicle #2 | British | Tetrarch
Vehicle #2 | British | Tetrarch CS
Vehicle #3 | British | Stuart I(a)
Vehicle #3 | British | Stuart III(a)
Vehicle #4 | British | Stuart V(a)
Vehicle #5 | British | Locust(a)
Vehicle #6 | British | A9
Vehicle #6 | British | A9 CS
Vehicle #7 | British | A10 Mk IA
Vehicle #7 | British | A10 Mk IA CS
Vehicle #8 | British | A13 Mk I
Vehicle #8 | British | A13 Mk II
Vehicle #8 | British | A13 Mk II CS
Vehicle #9 | British | Crusader I
Vehicle #9 | British | Crusader I CS
Vehicle #9 | British | Crusader II
Vehicle #9 | British | Crusader II CS
Vehicle #10 | British | Crusader III
Vehicle #11 | British | Grant(a) (MA)
Vehicle #11 | British | Grant(a) (SA)
Vehicle #11 | British | Lee(a) (MA)
Vehicle #11 | British | Lee(a) (SA)
Vehicle #12 | British | Sherman II(a)
Vehicle #13 | British | Sherman III(a)
Vehicle #14 | British | Sherman V(a)
Vehicle #15 | British | Sherman IIA(a)
Vehicle #16 | British | Sherman IIC(a)
Vehicle #16 | British | Sherman VC(a)
Vehicle #17 | British | Sherman IB(a)
Vehicle #18 | British | Centaur IV
Vehicle #19 | British | Cromwell IV
Vehicle #20 | British | Cromwell VI
Vehicle #19 | British | Cromwell VII
Vehicle #20 | British | Cromwell VIII
Vehicle #21 | British | Challenger
Vehicle #22 | British | Comet
Vehicle #23 | British | Sherman Dozer(a)
Vehicle #24 | British | Sherman Crab(a)
Vehicle #25 | British | Matilda I
Vehicle #25 | British | Matilda I (6)
Vehicle #26 | British | Matilda II
Vehicle #26 | British | Matilda II CS
Vehicle #27 | British | Valentine II
Vehicle #28 | British | Valentine V
Vehicle #29 | British | Valentine VIII
Vehicle #30 | British | Valentine XI
Vehicle #31 | British | Churchill I (MA)
Vehicle #31 | British | Churchill I (SA)
Vehicle #32 | British | Churchill IV
Vehicle #00 | _unused_ | _unused_
Vehicle #33 | British | Churchill V
Vehicle #34 | British | Churchill VI
Vehicle #35 | British | Churchill VII
Vehicle #35 | British | Churchill VIII
Vehicle #36 | British | Valen. Bridgelayer
Vehicle #36 | British | Church. Bridgelayer
Vehicle #37 | British | Churchill AVRE
Vehicle #38 | British | Churchill Crocodile
Vehicle #39 | British | Deacon
Vehicle #40 | British | Wolverine(a)
Vehicle #40 | British | Achilles(a)
Vehicle #41 | British | Archer
Vehicle #42 | British | Daimler
Vehicle #42 | British | Lynx
Vehicle #43 | British | Humber
Vehicle #44 | British | Stuart Recce(a)
Vehicle #45 | British | Humber III LRC
Vehicle #45 | British | Otter
Vehicle #46 | British | Morris CS9
Vehicle #47 | British | Rolls Royce
Vehicle #48 | British | Marm.-Herr. II ME
Vehicle #49 | British | Marm.-Herr. IIv
Vehicle #48 | British | Marm.-Herr. III MFF
Vehicle #48 | British | Marm.-Herr. III ME
Vehicle #49 | British | Marm.-Herr. IIIv
Vehicle #50 | British | Humber II
Vehicle #50 | British | Humber III
Vehicle #51 | British | Humber IV
Vehicle #52 | British | Daimler AC
Vehicle #53 | British | AEC I
Vehicle #53 | British | AEC II
Vehicle #53 | British | AEC III
Vehicle #54 | British | Staghound I(a)
Vehicle #54 | British | Staghound II(a)
Vehicle #55 | British | Bishop
Vehicle #56 | British | Priest(a)
Vehicle #57 | British | Sexton(a)
Vehicle #58 | British | M3 GMC(a)
Vehicle #59 | British | Mark VI AA
Vehicle #60 | British | Crusader AA
Vehicle #61 | British | M17 MGMC(a)
Vehicle #62 | British | Humber AA
Vehicle #62 | British | Staghound AA(a)
Vehicle #63 | British | M5(a)
Vehicle #63 | British | M9(a)
Vehicle #63 | British | M5A1(a)
Vehicle #63 | British | M9A1(a)
Vehicle #64 | British | Carrier A
Vehicle #64 | British | Carrier B
Vehicle #64 | British | Carrier C
Vehicle #65 | British | Carrier, MMG A
Vehicle #65 | British | Carrier, MMG B
Vehicle #66 | British | Carrier, 2-in MTR
Vehicle #67 | British | Carrier, 3-in MTR
Vehicle #68 | British | Priest Kangaroo(a)
Vehicle #68 | British | Ram Kangaroo(a)
Vehicle #69 | British | White(a)
Vehicle #70 | British | Carrier, IP MK IIA
Vehicle #70 | British | Carrier, IP Mk IIB
Vehicle #70 | British | Carrier, IP AOV
Vehicle #71 | British | Carrier, IP 3-in MTR
Vehicle #72 | British | Carrier, Wasp
Vehicle #72 | British | Badger(a)
Vehicle #73 | British | Buffalo Mk II(a)
Vehicle #73 | British | Buffalo Mk IV(a)
Vehicle #74 | British | Sherman III DD(a)
Vehicle #75 | British | DUKW(a)
Vehicle #76 | British | Terrapin Mk I
Vehicle #77 | British | 2pdr Portee
Vehicle #78 | British | Morris C9/B
Vehicle #79 | British | Loyd Carrier
Vehicle #80 | British | Quad FAT
Vehicle #81 | British | 15-cwt Truck
Vehicle #82 | British | 30-cwt Truck
Vehicle #83 | British | 3-Ton Lorry
Vehicle #84 | British | 1/4-Ton Jeep(a)
Vehicle #85 | British | 3/4-Ton Truck(a)
Vehicle #85 | British | 1 1/2-Ton Truck(a)
Vehicle #85 | British | 2 1/2-Ton Truck(a)
Vehicle #85 | British | 7 1/2-Ton Truck(a)

@ -0,0 +1,42 @@
Ordnance #1 | Chinese | Type 27 GL
Ordnance #2 | Chinese | Mortaio da 45 (i)
Ordnance #2 | Chinese | 5cm IeGrW 36 (g)
Ordnance #2 | Chinese | 50mm RM obr.38 (r)
Ordnance #2 | Chinese | Type 89 HGL (j)
Ordnance #3 | Chinese | M2 60mm (a)
Ordnance #4 | Chinese | Stokes 3-in (b)
Ordnance #4 | Chinese | 8cm GrW 34 (g)
Ordnance #4 | Chinese | 82mm BM o.37 (r)
Ordnance #5 | Chinese | M1 81mm (a)
Ordnance #5 | Chinese | M2 4.2-in (a)
Ordnance #6 | Chinese | 3.7cm PaK 35/36 (g)
Ordnance #6 | Chinese | M3A1 37mm (a)
Ordnance #7 | Chinese | 37mm PP o.15R (r)
Ordnance #7 | Chinese | Cann. da 70/15 (i)
Ordnance #8 | Chinese | 7.5cm Krupp (g)
Ordnance #8 | Chinese | Obice da 75/13 (i)
Ordnance #9 | Chinese | 7.5cm IeIG 18 (g)
Ordnance #9 | Chinese | 76.2mm PP o.27 (r)
Ordnance #10 | Chinese | M1A1 75mm (a)
Ordnance #11 | Chinese | 7.7cm FK 16 (g)
Ordnance #11 | Chinese | 76.2mm o.02/30 (r)
Ordnance #11 | Chinese | OQF 18pdr (b)
Ordnance #12 | Chinese | 10.5cm IeFH 16 (g)
Ordnance #12 | Chinese | Cann. da 105/28 (i)
Ordnance #12 | Chinese | M2A1 105mm (a)
Ordnance #13 | Chinese | 122mm o.10/30 (r)
Ordnance #13 | Chinese | 122mm G o.38 (r)
Ordnance #14 | Chinese | Obice da 149/13 (i)
Ordnance #15 | Chinese | Oerlikon FF (g)
Ordnance #15 | Chinese | Oerlikon FF (LF)
Ordnance #15 | Chinese | Cann.-mitr. 20/65 (i)
Ordnance #15 | Chinese | Cann.-mitr. 20/65 (LF)
Ordnance #15 | Chinese | 2cm FlaK 30 (g)
Ordnance #15 | Chinese | 2cm FlaK 30 (LF)
Ordnance #16 | Chinese | 3.7cm FlaK 36/37 (g)
Ordnance #16 | Chinese | Bofors 40mm L/60
Ordnance #16 | Chinese | Bofors 40mm L/60 (L)
Ordnance #17 | Chinese | Bofors 76mm M29
Ordnance #17 | Chinese | Bofors 76mm M29 (L)
Ordnance #17 | Chinese | 8.8cm FlaK 18 (g)
Ordnance #17 | Chinese | 8.8cm FlaK 18 (LF)

@ -0,0 +1,22 @@
Vehicle #1 | Chinese | VCL M1931 9b)
Vehicle #2 | Chinese | L3/35 (i)
Vehicle #3 | Chinese | PzKpfw IA (g)
Vehicle #4 | Chinese | Vickers Mk E (b)
Vehicle #5 | Chinese | T-26TU M33 (r)
Vehicle #6 | Chinese | M3A3 (a)
Vehicle #7 | Chinese | M4A4 (a)
Vehicle #8 | Chinese | M3A1 (a)
Vehicle #9 | Chinese | Stuart Recon (a)
Vehicle #10 | Chinese | Type 22
Vehicle #11 | Chinese | PSW 221 (g)
Vehicle #11 | Chinese | PSW 222 (g)
Vehicle #12 | Chinese | BA-20 (r)
Vehicle #12 | Chinese | BA-6 (r)
Vehicle #13 | Chinese | Carrier, VCL Mk VI (b)
Vehicle #14 | Chinese | Carrier A (b)
Vehicle #14 | Chinese | Carrier B (b)
Vehicle #14 | Chinese | Carrier C (b)
Vehicle #15 | Chinese | Henschel 33 (g)
Vehicle #16 | Chinese | Jeep (2) (a)
Vehicle #16 | Chinese | Jeep (4) (a)
Vehicle #16 | Chinese | 2 1/2-Ton Truck (a)

@ -0,0 +1,46 @@
Ordnance #1 | Finnish | 47 Krh/41
Ordnance #2 | Finnish | 50 Krh/39 (r)
Ordnance #3 | Finnish | 81 Krh/32
Ordnance #4 | Finnish | 81 Savunh. M/42
Ordnance #5 | Finnish | 120 Krh/40
Ordnance #6 | Finnish | Boys ATR (b)
Ordnance #7 | Finnish | Lahti ATR
Ordnance #8 | Finnish | 20 PstK/40
Ordnance #9 | Finnish | 25 PstK/37 (f)
Ordnance #10 | Finnish | 37 PstK/36 (s)
Ordnance #11 | Finnish | 37 PstK/37 (g)
Ordnance #12 | Finnish | 45 PstK/32 (r)
Ordnance #13 | Finnish | 50 PstK/38 (g)
Ordnance #14 | Finnish | 75 PstK/97-38 (g)
Ordnance #15 | Finnish | 75 PstK/40 (g)
Ordnance #16 | Finnish | 76 RK/27 (r)
Ordnance #17 | Finnish | 75 K/02
Ordnance #18 | Finnish | 76 LK/13
Ordnance #19 | Finnish | 76 K/02 (r)
Ordnance #20 | Finnish | 76 K/36 (r)
Ordnance #21 | Finnish | 87 K/95
Ordnance #22 | Finnish | 90 K/77
Ordnance #23 | Finnish | 105 H/33 (g)
Ordnance #24 | Finnish | 105 H/37
Ordnance #25 | Finnish | 105 H/41 (t)
Ordnance #26 | Finnish | 107 K 10/13
Ordnance #27 | Finnish | 107 K/77 (r)
Ordnance #28 | Finnish | 114 H/18 (b)
Ordnance #29 | Finnish | 122 H/10 (r)
Ordnance #30 | Finnish | 150 H/40 (g)
Ordnance #31 | Finnish | 155 H/17 (f)
Ordnance #32 | Finnish | 7.62 ltKK/31-40
Ordnance #33 | Finnish | 20 ltK/30 BSW (g)
Ordnance #33 | Finnish | 20 ltK/30 BSW (LF)
Ordnance #34 | Finnish | 20 ltK/38 BSW (g)
Ordnance #34 | Finnish | 20 ltK/38 BSW (LF)
Ordnance #35 | Finnish | 20 ltK/35 Br
Ordnance #35 | Finnish | 20 ltK/35 Br (LF)
Ordnance #36 | Finnish | 20 ltK/40 VKT
Ordnance #36 | Finnish | 20 ltK/40 VKT (LF)
Ordnance #37 | Finnish | 40 ltK/35-39 B (s)
Ordnance #37 | Finnish | 40 ltK/35-39 B (s) (LF)
Ordnance #38 | Finnish | 76 ltK/28 B (s)
Ordnance #38 | Finnish | 76 ltK/28 B (s) (LF)
Ordnance #39 | Finnish | 76 ltK/31 (r)
Ordnance #00 | _unused_ | _unused_

@ -0,0 +1,32 @@
Vehicle #1 | Finnish | T-37 (r)
Vehicle #2 | Finnish | T-50 (r)
Vehicle #3 | Finnish | Vikkersi (b)
Vehicle #4 | Finnish | T-26E (b)
Vehicle #5 | Finnish | T-26A (r)
Vehicle #6 | Finnish | T-26B (r)
Vehicle #7 | Finnish | T-26C (r)
Vehicle #8 | Finnish | OT-133 (r)
Vehicle #9 | Finnish | BT-5 (r)
Vehicle #9 | Finnish | BT-7 (r)
Vehicle #10 | Finnish | Postijuna (r)
Vehicle #11 | Finnish | Postijuna(L) (r)
Vehicle #12 | Finnish | Sotka (r)
Vehicle #13 | Finnish | Sotka(L) (r)
Vehicle #14 | Finnish | Pitkä. Sotka (r)
Vehicle #15 | Finnish | KV-1E (r)
Vehicle #15 | Finnish | KV-1 M42 (r)
Vehicle #16 | Finnish | BT-42 (r)
Vehicle #17 | Finnish | Sturmi (g)
Vehicle #18 | Finnish | Landsverk Anti II (s)
Vehicle #19 | Finnish | L182 (s)
Vehicle #19 | Finnish | L182(L) (s)
Vehicle #20 | Finnish | BA-20 (r)
Vehicle #21 | Finnish | BA-6 (r)
Vehicle #22 | Finnish | GAZ-4M-AA (r)
Vehicle #23 | Finnish | T-20 (r)
Vehicle #24 | Finnish | RSO (g)
Vehicle #25 | Finnish | STZ-3 (r)
Vehicle #26 | Finnish | Tempo G1200
Vehicle #27 | Finnish | Light Truck
Vehicle #27 | Finnish | Medium Truck
Vehicle #27 | Finnish | Heavy Truck

@ -0,0 +1,22 @@
Ordnance #1 | French | LG de 50 mle 37 (f)
Ordnance #2 | French | Mtr de 60 mle 35
Ordnance #3 | French | Mtr de 81 mle 27/31
Ordnance #5 | French | Canon AC de 25
Ordnance #6 | French | Canon AC de 47
Ordnance #7 | French | Canon de 75 AC
Ordnance #8 | French | Canon de 37
Ordnance #9 | French | Canon de 65 M
Ordnance #10 | French | Canon de 75 M
Ordnance #11 | French | Canon de 75
Ordnance #12 | French | Canon de 105 M
Ordnance #13 | French | Canon de 105 C
Ordnance #14 | French | Canon de 105 L 13 S
Ordnance #15 | French | Canon de 105 L 36 S
Ordnance #16 | French | Canon de 155 C
Ordnance #17 | French | Canon de 155 GPF
Ordnance #18 | French | Mitr. de 13.2 CAJ
Ordnance #19 | French | Mitr. de 20 CA
Ordnance #19 | French | Mitr. de 20 CA (LF)
Ordnance #20 | French | Canon Auto. de 25
Ordnance #21 | French | Canon de 75 CA
Ordnance #21 | French | Canon de 75 CA

@ -0,0 +1,52 @@
Vehicle #1 | French | FT-17M
Vehicle #1 | French | FT-17C
Vehicle #1 | French | FT-17 75BS
Vehicle #2 | French | AMR 33
Vehicle #3 | French | AMR 35
Vehicle #3 | French | AMR 35(L)
Vehicle #4 | French | R35
Vehicle #5 | French | H35
Vehicle #6 | French | FCM 36
Vehicle #7 | French | H39
Vehicle #8 | French | H39(L)
Vehicle #8 | French | H35(L)
Vehicle #8 | French | R35(L)
Vehicle #9 | French | R40
Vehicle #10 | French | D1
Vehicle #11 | French | D2
Vehicle #11 | French | D2(L)
Vehicle #12 | French | S35
Vehicle #13 | French | B1-bis (MA)
Vehicle #13 | French | B1-bis (SA)
Vehicle #14 | French | Valentine V(b)
Vehicle #15 | French | AM Dodge(a)
Vehicle #16 | French | AMD 20 cv TOE
Vehicle #17 | French | AMD 50 AM
Vehicle #17 | French | AMD 80 AM
Vehicle #18 | French | AMD 35
Vehicle #19 | French | Laffly W15T CC
Vehicle #20 | French | Ac de 75 Conus(b)
Vehicle #20 | French | Ac de 75 mle 97
Vehicle #21 | French | Cam. de Mitr. CA
Vehicle #21 | French | Cam. de 13.2 CAJ
Vehicle #21 | French | Camion de 20 CA
Vehicle #21 | French | Ac de 25 CA
Vehicle #22 | French | Ac de 40 CA(a)
Vehicle #23 | French | Ac de 75 mle 13/34
Vehicle #24 | French | AMC 29
Vehicle #25 | French | C-K P17
Vehicle #25 | French | C-K P19
Vehicle #26 | French | SOMUA MCG
Vehicle #27 | French | Unic P107
Vehicle #28 | French | Renault UE
Vehicle #29 | French | Lorraine 38L
Vehicle #30 | French | Lorraine 37L 44
Vehicle #31 | French | Carrier AC(b)
Vehicle #32 | French | Latil TAR H2
Vehicle #33 | French | Laffly S15T
Vehicle #34 | French | Laffly S20TL
Vehicle #35 | French | Laffly V15T
Vehicle #36 | French | Peugeot 202
Vehicle #36 | French | Citroën 23
Vehicle #36 | French | Renault AGR2
Vehicle #00 | _unused_ |_unused_

@ -0,0 +1,35 @@
Ordnance #1 | German | 5cm IeGrW
Ordnance #2 | German | 8cm GrW 34
Ordnance #3 | German | 10cm NbW 35
Ordnance #4 | German | 12cm GrW 42
Ordnance #5 | German | 2.8cm sPzB 41
Ordnance #6 | German | 3.7cm PaK 35/36
Ordnance #7 | German | 4.2cm IePaK 41
Ordnance #8 | German | 5cm PaK 38
Ordnance #9 | German | 7.5cm PaK 97/38
Ordnance #10 | German | 7.5cm PaK 40
Ordnance #11 | German | 7.62cm PaK 36r
Ordnance #12 | German | 8.8cm PaK 43
Ordnance #12 | German | 8.8cm PaK 43 (LF)
Ordnance #13 | German | 8.8cm PaK 43/41
Ordnance #14 | German | 12.8cm K 81/1
Ordnance #15 | German | 7.5cm IeIG 18
Ordnance #16 | German | 15cm sIG 33
Ordnance #17 | German | 7.5cm LG 40
Ordnance #18 | German | 10.5cm LG 42
Ordnance #19 | German | 7.5cm IeFK 16nA
Ordnance #20 | German | 10.5cm IeFH 18
Ordnance #21 | German | s 10cm K 18
Ordnance #22 | German | 15cm sFH 18
Ordnance #23 | German | 15cm K 18
Ordnance #24 | German | 17cm K 18
Ordnance #25 | German | 2cm FlaK 30
Ordnance #25 | German | 2cm FlaK 30 (LF)
Ordnance #26 | German | 2cm FlaK 38
Ordnance #26 | German | 2cm FlaK 38 (LF)
Ordnance #27 | German | 2cm FlaK vierling 38
Ordnance #28 | German | 3.7cm FlaK 36 o.37
Ordnance #29 | German | 3.7cm FlaK 43
Ordnance #30 | German | 8.8cm FlaK 18
Ordnance #30 | German | 8.8cm FlaK 18 (LF)

@ -0,0 +1,120 @@
Vehicle #1 | German | PzKpfw IB
Vehicle #2 | German | PzKpfw IIA
Vehicle #3 | German | PzKpfw IIF
Vehicle #4 | German | PzKpfw IIF (FI)
Vehicle #5 | German | PzKpfw IIL
Vehicle #6 | German | PzKpfw 35t
Vehicle #7 | German | PzKpfw 38(t)A
Vehicle #8 | German | PzKpfw 38(t)E
Vehicle #9 | German | Aufklaerer 38(t)
Vehicle #9.1 | German | FT-17 730m(f)
Vehicle #9.1 | German | FT-17 730(f)
Vehicle #9.2 | German | 38H 735(f)
Vehicle #9.3 | German | 35-S 739(f)
Vehicle #10 | German | PzKpfw IIID
Vehicle #11 | German | PzKpfw IIIF
Vehicle #12 | German | PzKpfw IIIG
Vehicle #13 | German | PzKpfw IIIH
Vehicle #14 | German | PzKpfw IIIJ
Vehicle #15 | German | PzKpfw IIIL
Vehicle #16 | German | PzKpfw IIIN
Vehicle #17 | German | PzKpfw III(FI)
Vehicle #18 | German | PzKpfw IVA
Vehicle #19 | German | PzKpfw IVC
Vehicle #20 | German | PzKpfw IVD
Vehicle #21 | German | PzKpfw IVE
Vehicle #22 | German | PzKpfw IVF1
Vehicle #23 | German | PzKpfw IVF2
Vehicle #24 | German | PzKpfw IVH
Vehicle #25 | German | PzKpfw IVJ
Vehicle #26 | German | PzKpfw VD
Vehicle #27 | German | PzKpfw VG
Vehicle #28 | German | PzKpfw M15/42 (i)
Vehicle #29 | German | PzKpfw P26/40 (i)
Vehicle #30 | German | PzKpfw VIE
Vehicle #31 | German | PzKpfw VIE (L)
Vehicle #32 | German | PzKpfw VIB
Vehicle #33 | German | StuG IIIB
Vehicle #34 | German | StuG IIIG
Vehicle #35 | German | StuG IIIG (L)
Vehicle #36 | German | StuH 42
Vehicle #35 | German | StuH 42 (L)
Vehicle #37 | German | StuPz IV
Vehicle #38 | German | PzJg Tiger
Vehicle #39 | German | StuG 75/18 (i)
Vehicle #40 | German | StuG 75/34 (i)
Vehicle #41 | German | StuG 105/25 (i)
Vehicle #42 | German | StuG 75/46 (i)
Vehicle #43 | German | PzJg I
Vehicle #44 | German | PzJg 35R (f)
Vehicle #44.1 | German | Pz 35R 731 (f)
Vehicle #45 | German | Marder I (f)
Vehicle #45.1 | German | GSW 39H(f) Pak
Vehicle #46 | German | Marder II
Vehicle #47 | German | Marder III(t)H
Vehicle #48 | German | Marder III(t)M
Vehicle #49 | German | PzJg III/IV
Vehicle #50 | German | JgdPz 38(t)
Vehicle #51 | German | JgdPz 38(t) (FI)
Vehicle #52 | German | JgdPz IV
Vehicle #52 | German | JgdPz IV (L)
Vehicle #53 | German | StuIG 33B
Vehicle #54 | German | JgdPz IV/70
Vehicle #55 | German | JgdPz V
Vehicle #56 | German | JgdPz VI
Vehicle #57 | German | SPW 250/1
Vehicle #58 | German | SPW 250/sMG
Vehicle #59 | German | SPW 250/7
Vehicle #60 | German | SPW 250/8
Vehicle #61 | German | SPW 250/9
Vehicle #62 | German | SPW 250/10
Vehicle #63 | German | SPW 251/1
Vehicle #58 | German | SPW 251/sMG
Vehicle #59 | German | SPW 251/2
Vehicle #64 | German | SPW 251/9
Vehicle #65 | German | SPW 251/10
Vehicle #66 | German | SPW 251/16
Vehicle #66.1 | German | SPW 251/21
Vehicle #67 | German | SPW 251/22
Vehicle #67.1 | German | SPW S307 (f)
Vehicle #67.2 | German | mSPW S307 (f)
Vehicle #68 | German | Kfz 13
Vehicle #69 | German | PSW 221
Vehicle #70 | German | PSW 222
Vehicle #70 | German | PSW 222 (L)
Vehicle #71 | German | PSW 231 (6 rad)
Vehicle #72 | German | PSW 231 (8 rad)
Vehicle #72 | German | PSW 232 (8 rad)
Vehicle #73 | German | PSW 233
Vehicle #74 | German | PSW 234/1
Vehicle #75 | German | PSW 234/2
Vehicle #76 | German | PSW 234/3
Vehicle #77 | German | PSW 234/4
Vehicle #78 | German | sIG IB
Vehicle #79 | German | sIG II
Vehicle #80 | German | sIG 38(t)M
Vehicle #81 | German | PzA II
Vehicle #82 | German | PzA LrS(f)
Vehicle #82.1 | German | GSW 39H (f)
Vehicle #83 | German | PzA III/IV
Vehicle #84 | German | FlaKPz 38(t)
Vehicle #85 | German | 37 FlaK/Pz IV
Vehicle #85 | German | Moebelwagen
Vehicle #86 | German | FlaKPz IV/20
Vehicle #87 | German | FlaKPz IV/37
Vehicle #88 | German | SdKfz 10/4
Vehicle #89 | German | SdKfz 6/2
Vehicle #90 | German | SdKfz 7/1
Vehicle #91 | German | Kfz 4
Vehicle #92 | German | 2cm FlaK LKW
Vehicle #92 | German | 3.7cm FlaK LKW
Vehicle #93 | German | Goliath
Vehicle #94 | German | Kfz 1
Vehicle #95 | German | Kfz 1/20
Vehicle #96 | German | Opel 6700 (Blitz)
Vehicle #96 | German | Buessing-NAG 4500
Vehicle #97 | German | SdKfz 2
Vehicle #98 | German | SfKfz 7
Vehicle #99 | German | SdKfz 11
Vehicle #88.1 | German | SdKfz 10/5
Vehicle #37.1 | German | Sturmtiger

@ -0,0 +1,32 @@
Vehicle #1.1 | Russian | T-27
Vehicle #6.1 | Russian | T-26 M31
Vehicle #6.2 | Russian | T-26 M32
Vehicle #6.3 | Russian | OT-26
Vehicle #6.4 | Russian | ST-26
Vehicle #11.1 | Russian | T-28 M34(L)
Vehicle #12.1 | Russian | T-28E M40(L)
Vehicle #21.1 | Russian | SMK (MA)
Vehicle #21.1 | Russian | SMK (SA)
Vehicle #21.2 | Russian | T-100 (MA)
Vehicle #21.2 | Russian | T-100 (SA)
Vehicle #44.1 | Russian | LANO AT
Vehicle #44.2 | Russian | LANO AA
Vehicle #46.2 | Russian | STZ-3
Vehicle #46.3 | Russian | STZ-5
Vehicle #47.1 | Russian | NKL-6
Vehicle #47.1 | Russian | NKL-16
Vehicle #47.2 | Russian | NKL-26
Vehicle #47.3 | Russian | RF-8-GAZ-98
Vehicle #48 | Russian | Stuart III(a)
Vehicle #49 | Russian | Lee(a) (MA)
Vehicle #49 | Russian | Lee(a) (SA)
Vehicle #50 | Russian | Sherman III(a)
Vehicle #50.1 | Russian | Sherman III(L)(a)
Vehicle #51 | Russian | Matilda II(b)
Vehicle #52.1 | Russian | Valentine V(b)
Vehicle #52.2 | Russian | Valentine VIII(b)
Vehicle #53 | Russian | Churchill III(b)
Vehicle #54 | Russian | M3A1 SC(a)
Vehicle #59 | Russian | Jeep GPA(a)
Vehicle #60 | Russian | DUKW(a)
Vehicle #00 | _unused_ | _unused_

@ -0,0 +1,21 @@
Ordnance #1 | Italian | Mortaio da 45
Ordnance #2 | Italian | Mortaio da 81/14
Ordnance #3 | Italian | Fucile-cc S
Ordnance #4 | Italian | Cannone-cc da 37/45
Ordnance #5 | Italian | Cannone da 47/32
Ordnance #6 | Italian | Cannone da 65/17
Ordnance #7 | Italian | Cannone da 70/15
Ordnance #8 | Italian | Obice da 75/13
Ordnance #9 | Italian | Cannone da 75/27
Ordnance #10 | Italian | Obice da 75/18
Ordnance #11 | Italian | Cannone da 75/32
Ordnance #12 | Italian | Obice da 100/17
Ordnance #13 | Italian | Cannone da 105/28
Ordnance #14 | Italian | Obice da 149/13
Ordnance #15 | Italian | Cannone da 149/35
Ordnance #16 | Italian | Cannone da 149/40
Ordnance #17 | Italian | Cannone-mitr. 20
Ordnance #17 | Italian | Cannone-mitr. 20 (LF)
Ordnance #18 | Italian | Cannone-aa 75/39
Ordnance #19 | Italian | Cannone-aa 75/46
Ordnance #20 | Italian | Cannone-aa 90/53

@ -0,0 +1,42 @@
Vehicle #1 | Italian | L5/21
Vehicle #1 | Italian | L5/30
Vehicle #2 | Italian | L3/35
Vehicle #3 | Italian | L3 aa
Vehicle #4 | Italian | L3 cc
Vehicle #5 | Italian | L3 lf
Vehicle #6 | Italian | L6/40
Vehicle #7 | Italian | M11/39 (MA)
Vehicle #7 | Italian | M11/39 (SA)
Vehicle #8 | Italian | M13/40
Vehicle #9 | Italian | M14/41
Vehicle #10 | Italian | M15/42
Vehicle #11 | Italian | MR/35 (f)
Vehicle #12 | Italian | SMV M40 da 75/18
Vehicle #12 | Italian | SMV M41 da 75/18
Vehicle #13 | Italian | SMV M42 da 75/18
Vehicle #13 | Italian | SMV M42 da 75/32
Vehicle #14 | Italian | SMV M43 da 105/25
Vehicle #15 | Italian | SMV L40 da 47/32
Vehicle #16 | Italian | SMV M41M da 90/53
Vehicle #17 | Italian | AS 42
Vehicle #17 | Italian | AS 42 aa
Vehicle #17 | Italian | AS 42 cc
Vehicle #18 | Italian | Lince
Vehicle #19 | Italian | Lancia 1ZM
Vehicle #20 | Italian | Fiat 611A
Vehicle #20 | Italian | Fiat 611B
Vehicle #21 | Italian | AB 40
Vehicle #21 | Italian | AB 41
Vehicle #22 | Italian | Autop. S37
Vehicle #23 | Italian | Autoc. da 65/17 (b)
Vehicle #23 | Italian | Autoc. da 20/65 (b)
Vehicle #24 | Italian | Autoc. da 75/27 CK
Vehicle #24 | Italian | Autoc. da 90/53
Vehicle #25 | Italian | TL 37
Vehicle #25 | Italian | TM 40
Vehicle #25 | Italian | TP 32
Vehicle #26 | Italian | Autocarretta
Vehicle #27 | Italian | Fiat 508 MC
Vehicle #28 | Italian | Autoc. Leggero
Vehicle #28 | Italian | Autoc. Medio
Vehicle #28 | Italian | Autoc. Pesante

@ -0,0 +1,28 @@
Ordnance #1 | Japanese | Type 89 HGL
Ordnance #2 | Japanese | Year-11 Type CFIG
Ordnance #3 | Japanese | Type 97 CFIG
Ordnance #4 | Japanese | Type 97 LCAG
Ordnance #5 | Japanese | Type 97 MCAG
Ordnance #6 | Japanese | Type 97 Auto Gun
Ordnance #7 | Japanese | Type 94 RF Gun
Ordnance #8 | Japanese | Type 1 MM Gun
Ordnance #9 | Japanese | Year-11 Type FTIG
Ordnance #10 | Japanese | Type 92 Inf Gun
Ordnance #11 | Japanese | Year-41 Type M Gun
Ordnance #12 | Japanese | Year-38 Type F Gun
Ordnance #13 | Japanese | Type 90 Field Gun
Ordnance #14 | Japanese | Type 91 10cm How
Ordnance #15 | Japanese | Type 92 10cm Can
Ordnance #16 | Japanese | Year-38 Type 12cm
Ordnance #17 | Japanese | Year-3 Type 14cm
Ordnance #18 | Japanese | Year-4 Type 15cm
Ordnance #19 | Japanese | Type 96 15cm How
Ordnance #20 | Japanese | Type 93 TM HA
Ordnance #21 | Japanese | Type 98 HAMC
Ordnance #21 | Japanese | Type 98 HAMC (LF)
Ordnance #22 | Japanese | Type 96 Single
Ordnance #22 | Japanese | Type 96 Twin
Ordnance #22 | Japanese | Type 96 Triple
Ordnance #23 | Japanese | Type 88 7.5cm
Ordnance #24 | Japanese | Year-10 Type 12cm
Ordnance #24 | Japanese | Year-10 Type 12cm

@ -0,0 +1,24 @@
Vehicle #1 | Japanese | Type 92A
Vehicle #1 | Japanese | Type 92B
Vehicle #2 | Japanese | Type 94
Vehicle #3 | Japanese | Type 95 SO-KI
Vehicle #4 | Japanese | Type 97A TE-KE
Vehicle #4 | Japanese | Type 97B TE-KE
Vehicle #5 | Japanese | Type 95 HA-GO
Vehicle #6 | Japanese | Type 2 KA-MI
Vehicle #6 | Japanese | Type 2 KA-MI w/o
Vehicle #7 | Japanese | Type 89A CHI-RO
Vehicle #7 | Japanese | Type 89B CHI-RO
Vehicle #8 | Japanese | Type 97A CHI-HA
Vehicle #8 | Japanese | Type 97B CHI-HA
Vehicle #9 | Japanese | Type 1 CHI-HE
Vehicle #10 | Japanese | Type 91
Vehicle #11 | Japanese | Type 92
Vehicle #12 | Japanese | Type 1 HO-NI I
Vehicle #13 | Japanese | Type 4 HO-RO
Vehicle #14 | Japanese | Type 1 HO-KI
Vehicle #15 | Japanese | Type 98 SHI-KE
Vehicle #16 | Japanese | Type 92 I-KE
Vehicle #17 | Japanese | Type 95
Vehicle #18 | Japanese | Type 94 Truck
Vehicle #19 | Japanese | Type 97 Truck

@ -0,0 +1,28 @@
Ordnance #1 | Russian | 50mm RM o 40
Ordnance #2 | Russian | 82mm BM o 37
Ordnance #3 | Russian | 107mm GVPM o 38
Ordnance #4 | Russian | 120 PM o 38
Ordnance #5 | Russian | 160mm PM o 43
Ordnance #6 | Russian | 37mm PTP o 30
Ordnance #7 | Russian | 45mm PTP o 32
Ordnance #8 | Russian | 45mm PTP o 42
Ordnance #9 | Russian | 57mm PTP o 43
Ordnance #10 | Russian | 100mm PTP o 44
Ordnance #11 | Russian | 37mm PP o 15R
Ordnance #12 | Russian | 76.2mm PP o 27
Ordnance #13 | Russian | 76.2mm P o 00/02P
Ordnance #14 | Russian | 76.2mm P o 02/30
Ordnance #15 | Russian | 76.2mm P o 39
Ordnance #16 | Russian | 76.2mm P o 36
Ordnance #17 | Russian | 85mm P o 44
Ordnance #18 | Russian | 107mm P o 10/30
Ordnance #19 | Russian | 122mm G o 10/30
Ordnance #20 | Russian | 122mm G o 38
Ordnance #21 | Russian | 122mm P o 31
Ordnance #22 | Russian | 152mm G o 38
Ordnance #23 | Russian | 152mm GP o 37
Ordnance #24 | Russian | 25mm ZP o 40
Ordnance #25 | Russian | 37mm ZP o 39
Ordnance #26 | Russian | 76.2mm ZP o 38
Ordnance #27 | Russian | 85mm ZP o 39
Ordnance #27 | Russian | 85mm ZP o 39

@ -0,0 +1,58 @@
Vehicle #1 | Russian | T-37
Vehicle #2 | Russian | T-40
Vehicle #3 | Russian | T-50
Vehicle #4 | Russian | T-60 M40
Vehicle #4 | Russian | T-60 M42
Vehicle #5 | Russian | T-70
Vehicle #6 | Russian | T-26 M33
Vehicle #6 | Russian | T-26S M37/39
Vehicle #7 | Russian | OT-133
Vehicle #8 | Russian | BT-5 M34
Vehicle #9 | Russian | BT-7 M37
Vehicle #10 | Russian | BT-7A
Vehicle #11 | Russian | T-28 M34
Vehicle #12 | Russian | T-28E M40
Vehicle #13 | Russian | T-34 M40
Vehicle #14 | Russian | T-34 M41
Vehicle #15 | Russian | OT-34
Vehicle #16 | Russian | T-34 M43
Vehicle #17 | Russian | T-43
Vehicle #18 | Russian | T-34/85
Vehicle #19 | Russian | M4/76 (a)
Vehicle #20 | Russian | T-44
Vehicle #21 | Russian | T-35
Vehicle #22 | Russian | KV-1 M39/40
Vehicle #23 | Russian | KV-1E
Vehicle #23 | Russian | KV-1 M41
Vehicle #23 | Russian | KV-1 M42
Vehicle #24 | Russian | KV-2
Vehicle #15 | Russian | KV-8
Vehicle #25 | Russian | KV-1S
Vehicle #26 | Russian | KV-85
Vehicle #27 | Russian | IS-2
Vehicle #28 | Russian | IS-2m
Vehicle #29 | Russian | IS-3
Vehicle #30 | Russian | SU-76M
Vehicle #31 | Russian | SU-76i (g)
Vehicle #32 | Russian | SU-122
Vehicle #33 | Russian | SU-152
Vehicle #34 | Russian | ISU-122
Vehicle #34 | Russian | ISU-152
Vehicle #35 | Russian | SU-85
Vehicle #36 | Russian | SU-100
Vehicle #37 | Russian | SU-57 (a)
Vehicle #38 | Russian | BA-20
Vehicle #39 | Russian | BA-6
Vehicle #40 | Russian | BA-64B
Vehicle #41 | Russian | ZSU-37
Vehicle #42 | Russian | SU-12
Vehicle #43 | Russian | GAZ-4M-AA
Vehicle #44 | Russian | ZIS-42-AA
Vehicle #45 | Russian | IAG-10-AA
Vehicle #46 | Russian | GAZ-67B
Vehicle #47 | Russian | GAZ-MM
Vehicle #47 | Russian | ZIS-5
Vehicle #47 | Russian | IAG-6
Vehicle #7.1 | Russian | BT-2A
Vehicle #46.1 | Russian | Komsomolet
Vehicle #00 | _unused_ | _unused_

@ -97,7 +97,7 @@ class MainWindow( QMainWindow ) :
QMessageBox.warning( MainWindow._instance , APP_NAME , msg )
@staticmethod
def ask( msg , buttons , default ) :
"""Show an error message."""
"""Ask the user a question."""
return QMessageBox.question( MainWindow._instance , APP_NAME , msg , buttons , default )
def closeEvent( self , evt ) :

@ -1,7 +1,7 @@
import os
from PyQt5 import uic
from PyQt5.QtCore import QThread , pyqtSignal
from PyQt5.QtCore import Qt , QMetaObject , QThread , pyqtSignal , pyqtSlot , Q_ARG , Q_RETURN_ARG
from PyQt5.QtWidgets import QWidget , QFrame , QFileDialog , QMessageBox
from PyQt5.QtGui import QPixmap , QIcon
@ -34,6 +34,8 @@ class AnalyzeThread( QThread ) :
os.unlink( self.db_fname )
# parse the files
self.parser = PdfParser(
os.path.join( globals.base_dir , "index" ) ,
ask = self.ask ,
progress = lambda pval,msg: self.progress_signal.emit( -1 if pval is None else pval , msg ) ,
progress2 = lambda pval: self.progress2_signal.emit( pval )
)
@ -50,14 +52,32 @@ class AnalyzeThread( QThread ) :
# notify slots that we've finished
self.completed_signal.emit( "" )
def ask( self , msg , btns , default ) :
"""Ask the user a question."""
# NOTE: We are running in a worker thread, so we need to delegate showing the message box
# to the GUI thread.
retarg = Q_RETURN_ARG( QMessageBox.StandardButton )
QMetaObject.invokeMethod(
StartupWidget._instance , "on_ask" , Qt.BlockingQueuedConnection ,
retarg ,
Q_ARG( str , msg ) ,
Q_ARG( QMessageBox.StandardButtons , btns ) ,
Q_ARG( QMessageBox.StandardButton , default ) ,
)
# FIXME! How do we get the return value?! :-/
return StartupWidget._on_ask_retval
# ---------------------------------------------------------------------
class StartupWidget( QWidget ) :
"""This form lets the user initialize a new database, or load an existing one."""
_instance = None
def __init__( self , db_fname , parent=None ) :
# initialize
super(StartupWidget,self).__init__( parent=parent )
StartupWidget._instance = self
self.analyze_thread = None
# FUDGE! Workaround recursive import's :-/
global MainWindow
@ -170,6 +190,12 @@ class StartupWidget( QWidget ) :
"""Update the analysis progress in the UI."""
self.pb_pages.setValue( int( 100*pval + 0.5 ) )
@pyqtSlot( str , QMessageBox.StandardButtons , QMessageBox.StandardButton , result=QMessageBox.StandardButton )
def on_ask( self , msg , buttons , default ) :
"""Ask the user a question."""
StartupWidget._on_ask_retval = MainWindow.ask( msg , buttons , default )
return StartupWidget._on_ask_retval
def on_cancel_analyze( self ) :
"""Cancel the analyze worker thread."""
if not self.analyze_thread or self.analyze_thread.parser.cancelling :

Loading…
Cancel
Save