from macrolib.fifDim import fifDim

from macrolib.columnize import columnize

import math

 

def round_length_next(length, increment=1.0):

    try: return float(math.ceil(length/increment) * increment)

    except: return length

 

def parseKSS(fn):

    # initialize member dictionary

    memDict = {}

   

    # open KSS file for reading

    f = open(fn)

   

    # skip to first member

    s = f.next()

    while s.strip() != '*':

        s = f.next()

       

    for line in f:

        # Sample line: D,101,0,101B1,101B1,1,W,18x50,A992,8791.57,, ,,

        lineList = line.strip().split(',')       

        memMark = lineList[3]

        memQuan = lineList[5]

        memSize = lineList[6]+lineList[7]

        memLength = fifDim(round_length_next(float(lineList[9])/25.4, 1))

        memABM = 'N/A'

        if memDict.has_key(memSize):

            memDict[memSize].append([memMark, memQuan, memLength, memABM])

        else:

            memDict[memSize] = [[memMark, memQuan, memLength, memABM], ]

           

        while not line.startswith('A'):

            try:

                line = f.next()

            except:

                f.close()

                return memDict

            if line.strip() == '*': break

            

        # proceed with iteration if not next member

        if line.strip() != '*':

            # A,2-8

            memABM = line.strip().split(',')[1]

            memDict[memSize][-1][-1] = memABM

            # skip to next member

            while line.strip() != '*':

                try:

                    line = f.next()

                except:

                    f.close()

                    return memDict

 

if __name__ == '__main__':

 

    sizeList = ['W12x58', 'W16x26', 'W21x44', 'W21x50', 'W21x57', 'W21x62', 'W21x93', 'W21x122', 'W24x55', 'W24x62']

    abmList = ['5-15','2-31','2-32','2-33','2-34','2-35','2-1','2-2','2-3','2-4','2-5','2-6','1-46','1-47','1-48',\

               '1-49','1-41','1-42','1-43','1-37','1-38','1-32','1-33','1-29','1-30','1-22','1-23','1-24','1-25',\

               '1-26','1-27','1-13','1-14','1-15','1-16','1-17','1-19','1-20']

    fn = r'C:\SDS2_7.0\output\24329\24329.kss'

 

    memDict = parseKSS(fn)

    keys = memDict.keys()

    keys.sort()

    colWidth = 8

    print

    outList = []

    markList = []

    total_quan = 0

    for key in keys:

        total_pcs = 0

        if key in sizeList:

            outList.append(columnize('Material size: %s' % key, colWidth*4, 'Center'))

            header = ['Mark', 'Quantity', 'Length', 'ABM']

            outList.append(''.join([columnize(item, colWidth, 'Center') for item in header]))

            outList.append('-'*colWidth*4)

            for item in memDict[key]:

                if item[-1] in abmList:

                #if item[-1] == 'N/A':

                    outList.append(''.join([columnize(s, colWidth, 'Center') for s in item]))

                    markList.append(item[0])

                    total_pcs += int(item[1])

 

            outList.append('Total pieces of %s = %d\n' % (key, total_pcs))

            total_quan += total_pcs

    outList.append('Overall total = %d' % total_quan)

 

    #print '\n'.join(outList)           

 

    fn = r'H:\Contract Documents\612 Toringdon VI\CharlotteMtrl.txt'

    f = open(fn, 'w')

    f.write('\n'.join(outList))

    markList.sort()

    f.write('\n\n')

    f.write('\n'.join(markList))

    f.close()

 

''' Interactive

>>>

>>> import re

>>> patt = re.compile(r'\d{3}')

>>> patt.match('102B1').group(0)

'102'

>>> sheetList = [patt.match(s).group(0) for s in markList]

>>> sheetList = [i for i in sheetList if i not in locals()['_[1]'].__self__]

>>> print '\n'.join(sheetList)

102

103

104

105

106

107

108

109

110

111

201

202

203

204

205

206

207

208

209

210

211

213

214

301

303

304

305

306

307

308

310

401

402

403

404

405

406

407

408

409

410

411

412

414

416

417

502

503

504

505

506

507

508

509

510

601

602

603

604

605

606

607

608

609

610

611

612

613

614

615

616

701

702

703

704

705

707

801

802

803

804

805

806

807

808

809

>>> len(sheetList)

86

>>>

'''

 

 

''' Using abmList filter

>>>

     Material size: W12x58     

  Mark  Quantity Length   ABM  

--------------------------------

 416C3     1     24'-4    5-15 

 417C1     1     24'-4    5-15 

 616C1     1     24'-4    5-15 

Total pieces of W12x58 = 3

 

     Material size: W16x26     

  Mark  Quantity Length   ABM  

--------------------------------

 102B4     1      9'-2    2-34 

 103B2     1      9'-7    2-34 

 104B6     1      9'-7    2-34 

 105B1     2     29'-11   2-31 

 105B2     2     29'-11   2-31 

 106B2     1     9'-11    2-33 

 107B2     1     9'-11    2-33 

 108B4     2     29'-11   2-31 

 110B6     2     9'-11    2-33 

 202B1     1     29'-11   2-31 

 203B1     1     9'-11    2-33 

 204B3     1      9'-7    2-34 

 207B2     1     29'-11   2-31 

 208B3     1     9'-11    2-33 

 208B4     1     29'-11   2-31 

 209B5     1     29'-11   2-31 

 211B2     1      9'-7    2-34 

 213B4     1     29'-11   2-31 

 214B3     1     29'-11   2-31 

 303B2     1     9'-11    2-33 

 306B4     1     9'-11    2-33 

 307B4     1     29'-5    2-32 

 308B5     1     29'-11   2-31 

 402B2     1     29'-11   2-31 

 403B4     1     29'-5    2-32 

 406B3     1     9'-11    2-33 

 407B5     2      4'-5    2-35 

 408B5     1     29'-11   2-31 

 409B4     1     29'-5    2-32 

 412B5     1     9'-11    2-33 

 504B3     1     29'-11   2-31 

 505B1     1     9'-11    2-33 

 506B4     1     9'-11    2-33 

 507B4     1     9'-11    2-33 

 507B5     1     9'-11    2-33 

 509B5     2     29'-11   2-31 

 509B6     1     29'-11   2-31 

 510B6     2     9'-11    2-33 

 603B3     1     9'-11    2-33 

 605B1     1     29'-11   2-31 

 605B2     1     29'-11   2-31 

 605B4     1     9'-11    2-33 

 608B2     1     9'-11    2-33 

 609B3     1     9'-11    2-33 

 704B1     1      9'-7    2-34 

 704B2     1      9'-2    2-34 

 704B5     1      9'-7    2-34 

 705B5     2     29'-11   2-31 

 705B6     2     29'-11   2-31 

 707B2     2     29'-11   2-31 

 801B3     1     29'-11   2-31 

 801B4     1     29'-11   2-31 

 804B4     1     29'-11   2-31 

 804B5     1      9'-7    2-34 

 806B4     1     29'-11   2-31 

 808B4     1      9'-7    2-34 

 808B5     1     29'-11   2-31 

 809B4     1     29'-11   2-31 

Total pieces of W16x26 = 68

 

     Material size: W21x122    

  Mark  Quantity Length   ABM  

--------------------------------

 303B4     1     43'-7    1-30 

 303B5     1     44'-1    1-29 

Total pieces of W21x122 = 2

 

     Material size: W21x44     

  Mark  Quantity Length   ABM  

--------------------------------

 105B3     1     29'-5    2-5  

 105B4     1     39'-1    2-3  

 105B5     1     29'-11   2-4  

 106B5     2     29'-11   2-4  

 110B1     2     29'-11   2-4  

 201B3     1     29'-11   2-4  

 202B3     1     29'-11   2-4  

 205B3     1     29'-11   2-4  

 206B4     1     29'-5    2-5  

 207B1     1     39'-1    2-3  

 207B5     1     29'-11   2-4  

 209B6     1     29'-11   2-4  

 213B3     1     29'-5    2-5  

 301B1     2     44'-7    2-1  

 301B3     4     19'-11   2-6  

 304B2     1     29'-11   2-4  

 305B1     1     29'-11   2-4  

 307B3     1     29'-11   2-4  

 307B5     1     29'-11   2-4  

 307B6     1     29'-11   2-4  

 310B1     2     44'-7    2-1  

 401B1     1     19'-11   2-6  

 401B3     1     44'-7    2-1  

 401B5     1     44'-7    2-1  

 402B4     1     29'-11   2-4  

 404B2     1     43'-7    2-2  

 404B3     1     43'-7    2-2  

 406B4     1     19'-11   2-6  

 407B1     2     44'-7    2-1  

 407B6     2     29'-11   2-4  

 409B3     1     19'-11   2-6  

 410B3     2     44'-7    2-1  

 410B4     1     43'-7    2-2  

 410B5     1     43'-7    2-2  

 414B6     1     19'-11   2-6  

 504B4     2     44'-7    2-1  

 506B6     1     29'-11   2-4  

 508B3     1     29'-11   2-4  

 508B4     4     19'-11   2-6  

 509B2     2     29'-11   2-4  

 510B3     2     44'-7    2-1  

 603B2     1     29'-11   2-4  

 604B2     1     19'-11   2-6  

 604B4     1     44'-7    2-1  

 604B5     1     29'-11   2-4  

 605B3     1     44'-7    2-1  

 607B2     1     29'-11   2-4  

 608B1     1     19'-11   2-6  

 609B1     1     19'-11   2-6  

 612B6     1     19'-11   2-6  

 614B1     1     29'-11   2-4  

 701B3     1     29'-5    2-5  

 703B4     1     39'-1    2-3  

 704B4     1     29'-11   2-4  

 704B6     1     29'-11   2-4  

 801B2     1     29'-5    2-5  

 802B2     1     29'-11   2-4  

 803B1     1     39'-1    2-3  

 805B1     1     29'-11   2-4  

 808B2     1     29'-5    2-5  

Total pieces of W21x44 = 76

 

     Material size: W21x50     

  Mark  Quantity Length   ABM  

--------------------------------

 102B1     1     39'-1    1-47 

 214B1     1     39'-1    1-47 

 306B5     1     44'-1    1-46 

 404B1     1     44'-1    1-46 

 405B5     1     29'-4    1-49 

 408B2     1     29'-5    1-49 

 408B3     1     29'-11   1-48 

 504B2     1     44'-1    1-46 

 607B4     1     44'-1    1-46 

 613B2     1     44'-0    1-46 

 705B4     1     39'-1    1-47 

 808B3     1     39'-1    1-47 

Total pieces of W21x50 = 12

 

     Material size: W21x57     

  Mark  Quantity Length   ABM  

--------------------------------

 303B3     1     44'-1    1-42 

 411B2     1     44'-6    1-41 

 412B1     1     43'-7    1-43 

 412B4     1     44'-6    1-41 

 412B6     1     44'-1    1-42 

 504B1     1     44'-1    1-42 

 611B6     1     44'-6    1-41 

 613B3     1     44'-6    1-41 

Total pieces of W21x57 = 8

 

     Material size: W21x62      

  Mark  Quantity Length   ABM  

--------------------------------

 308B1     1     43'-7    1-38 

 308B2     1     43'-7    1-38 

 308B3     1     44'-1    1-37 

 403B2     1     43'-7    1-38 

 403B3     1     44'-1    1-37 

 406B2     1     44'-1    1-37 

 505B3     1     44'-1    1-37 

 606B1     1     44'-1    1-37 

Total pieces of W21x62 = 8

 

     Material size: W21x93     

  Mark  Quantity Length   ABM  

--------------------------------

 305B3     1     43'-7    1-33 

 305B4     1     43'-7    1-33 

 307B1     1     43'-7    1-33 

 307B2     1     44'-1    1-32 

Total pieces of W21x93 = 4

 

     Material size: W24x55     

  Mark  Quantity Length   ABM  

--------------------------------

 111B2     3     29'-11   1-26 

 203B3     1     29'-11   1-26 

 210B2     1     29'-11   1-26 

 213B1     1     39'-1    1-24 

 213B2     1     38'-8    1-25 

 214B4     1     39'-1    1-24 

 214B6     2     39'-7    1-23 

 305B2     1     29'-11   1-26 

 306B2     1     29'-11   1-26 

 306B3     1     29'-5    1-27 

 402B5     1     29'-11   1-26 

 403B1     1     29'-5    1-27 

 410B6     1     39'-7    1-23 

 411B6     1     44'-1    1-22 

 505B2     1     29'-11   1-26 

 506B1     1     29'-11   1-26 

 610B2     1     29'-11   1-26 

 610B4     1     39'-1    1-24 

 610B5     1     44'-1    1-22 

 611B5     1     39'-7    1-23 

 612B1     1     39'-1    1-24 

 612B2     1     38'-8    1-25 

 613B1     1     39'-1    1-24 

 615B2     2     39'-7    1-23 

 702B1     2     29'-11   1-26 

 806B1     1     29'-11   1-26 

 806B5     1     29'-11   1-26 

 807B3     1     39'-1    1-24 

Total pieces of W24x55 = 33

 

     Material size: W24x62     

  Mark  Quantity Length   ABM  

--------------------------------

 104B2     1     29'-5    1-16 

 104B3     1      9'-8    1-20 

 106B1     1     29'-11   1-15 

 106B3     1     29'-11   1-15 

 109B3     2     29'-11   1-15 

 204B5     1     29'-11   1-15 

 208B2     1     29'-11   1-15 

 211B1     1     38'-7    1-14 

 411B3     1     39'-1    1-13 

 502B1     1     28'-10   1-17 

 503B1     1     28'-10   1-17 

 508B1     2     29'-11   1-15 

 601B2     1     28'-11   1-17 

 602B1     1     28'-11   1-17 

 606B4     1     29'-11   1-15 

 705B1     1      9'-8    1-20 

 705B2     1     29'-5    1-16 

Total pieces of W24x62 = 19

 

Overall total = 233

>>>

'''

 

''' As originally coded:

>>>

     Material size: W12x58     

  Mark  Quantity Length   ABM  

--------------------------------

 115C2     1     33'-7    5-14 

 116C2     1     33'-7    5-14 

 118C2     1     33'-7    5-14 

 119C1     1     33'-7    5-14 

 416C3     1     24'-4    5-15 

 417C1     1     24'-4    5-15 

 516C1     1     33'-7    5-14 

 616C1     1     24'-4    5-15 

 709C1     1     33'-7    5-14 

 710C1     1     33'-7    5-14 

 710C2     1     33'-7    5-14 

 

     Material size: W16x26     

  Mark  Quantity Length   ABM  

--------------------------------

 102B4     1      9'-2    2-34 

 103B2     1      9'-7    2-34 

 104B6     1      9'-7    2-34 

 105B1     2     29'-11   2-31 

 105B2     2     29'-11   2-31 

 106B2     1     9'-11    2-33 

 107B2     1     9'-11    2-33 

 108B4     2     29'-11   2-31 

 110B6     2     9'-11    2-33 

 202B1     1     29'-11   2-31 

 203B1     1     9'-11    2-33 

 204B3     1      9'-7    2-34 

 207B2     1     29'-11   2-31 

 208B3     1     9'-11    2-33 

 208B4     1     29'-11   2-31 

 209B5     1     29'-11   2-31 

 211B2     1      9'-7    2-34 

 213B4     1     29'-11   2-31 

 214B3     1     29'-11   2-31 

 303B2     1     9'-11    2-33 

 306B4     1     9'-11    2-33 

 307B4     1     29'-5    2-32 

 308B5     1     29'-11   2-31 

 402B2     1     29'-11   2-31 

 403B4     1     29'-5    2-32 

 406B3     1     9'-11    2-33 

 407B5     2      4'-5    2-35 

 408B5     1     29'-11   2-31 

 409B4     1     29'-5    2-32 

 412B5     1     9'-11    2-33 

 504B3     1     29'-11   2-31 

 505B1     1     9'-11    2-33 

 506B4     1     9'-11    2-33 

 507B4     1     9'-11    2-33 

 507B5     1     9'-11    2-33 

 509B5     2     29'-11   2-31 

 509B6     1     29'-11   2-31 

 510B6     2     9'-11    2-33 

 603B3     1     9'-11    2-33 

 605B1     1     29'-11   2-31 

 605B2     1     29'-11   2-31 

 605B4     1     9'-11    2-33 

 608B2     1     9'-11    2-33 

 609B3     1     9'-11    2-33 

 704B1     1      9'-7    2-34 

 704B2     1      9'-2    2-34 

 704B5     1      9'-7    2-34 

 705B5     2     29'-11   2-31 

 705B6     2     29'-11   2-31 

 707B2     2     29'-11   2-31 

 801B3     1     29'-11   2-31 

 801B4     1     29'-11   2-31 

 804B4     1     29'-11   2-31 

 804B5     1      9'-7    2-34 

 806B4     1     29'-11   2-31 

 808B4     1      9'-7    2-34 

 808B5     1     29'-11   2-31 

 809B4     1     29'-11   2-31 

 

     Material size: W21x122    

  Mark  Quantity Length   ABM  

--------------------------------

 303B4     1     43'-7    1-30 

 303B5     1     44'-1    1-29 

 

     Material size: W21x44     

  Mark  Quantity Length   ABM  

--------------------------------

 105B3     1     29'-5    2-5  

 105B4     1     39'-1    2-3  

 105B5     1     29'-11   2-4  

 106B5     2     29'-11   2-4  

 110B1     2     29'-11   2-4  

 201B3     1     29'-11   2-4  

 202B3     1     29'-11   2-4  

 205B3     1     29'-11   2-4  

 206B4     1     29'-5    2-5  

 207B1     1     39'-1    2-3  

 207B5     1     29'-11   2-4  

 209B6     1     29'-11   2-4  

 213B3     1     29'-5    2-5  

 301B1     2     44'-7    2-1  

 301B3     4     19'-11   2-6  

 304B2     1     29'-11   2-4  

 305B1     1     29'-11   2-4  

 307B3     1     29'-11   2-4  

 307B5     1     29'-11   2-4  

 307B6     1     29'-11   2-4  

 310B1     2     44'-7    2-1  

 401B1     1     19'-11   2-6  

 401B3     1     44'-7    2-1  

 401B5     1     44'-7    2-1  

 402B4     1     29'-11   2-4  

 404B2     1     43'-7    2-2  

 404B3     1     43'-7    2-2  

 406B4     1     19'-11   2-6  

 407B1     2     44'-7    2-1  

 407B6     2     29'-11   2-4  

 409B3     1     19'-11   2-6  

 410B3     2     44'-7    2-1  

 410B4     1     43'-7    2-2  

 410B5     1     43'-7    2-2  

 414B6     1     19'-11   2-6  

 504B4     2     44'-7    2-1  

 506B6     1     29'-11   2-4  

 508B3     1     29'-11   2-4  

 508B4     4     19'-11   2-6  

 509B2     2     29'-11   2-4  

 510B3     2     44'-7    2-1  

 603B2     1     29'-11   2-4  

 604B2     1     19'-11   2-6  

 604B4     1     44'-7    2-1  

 604B5     1     29'-11   2-4  

 605B3     1     44'-7    2-1  

 607B2     1     29'-11   2-4  

 608B1     1     19'-11   2-6  

 609B1     1     19'-11   2-6  

 612B6     1     19'-11   2-6  

 614B1     1     29'-11   2-4  

 701B3     1     29'-5    2-5  

 703B4     1     39'-1    2-3  

 704B4     1     29'-11   2-4  

 704B6     1     29'-11   2-4  

 801B2     1     29'-5    2-5  

 802B2     1     29'-11   2-4  

 803B1     1     39'-1    2-3  

 805B1     1     29'-11   2-4  

 808B2     1     29'-5    2-5  

 

     Material size: W21x50     

  Mark  Quantity Length   ABM  

--------------------------------

 102B1     1     39'-1    1-47 

 214B1     1     39'-1    1-47 

 306B5     1     44'-1    1-46 

 404B1     1     44'-1    1-46 

 405B5     1     29'-4    1-49 

 408B2     1     29'-5    1-49 

 408B3     1     29'-11   1-48 

 504B2     1     44'-1    1-46 

 607B4     1     44'-1    1-46 

 613B2     1     44'-0    1-46 

 705B4     1     39'-1    1-47 

 808B3     1     39'-1    1-47 

 

     Material size: W21x57     

  Mark  Quantity Length   ABM  

--------------------------------

 303B3     1     44'-1    1-42 

 404B4     1     29'-11   1-44 

 411B2     1     44'-6    1-41 

 412B1     1     43'-7    1-43 

 412B3     1     29'-11   1-44 

 412B4     1     44'-6    1-41 

 412B6     1     44'-1    1-42 

 504B1     1     44'-1    1-42 

 611B6     1     44'-6    1-41 

 613B3     1     44'-6    1-41 

 

     Material size: W21x62     

  Mark  Quantity Length   ABM  

--------------------------------

 204B1     1     39'-1    1-39 

 308B1     1     43'-7    1-38 

 308B2     1     43'-7    1-38 

 308B3     1     44'-1    1-37 

 403B2     1     43'-7    1-38 

 403B3     1     44'-1    1-37 

 406B2     1     44'-1    1-37 

 505B3     1     44'-1    1-37 

 606B1     1     44'-1    1-37 

 805B4     1     39'-1    1-39 

 

     Material size: W21x93     

  Mark  Quantity Length   ABM  

--------------------------------

 305B3     1     43'-7    1-33 

 305B4     1     43'-7    1-33 

 307B1     1     43'-7    1-33 

 307B2     1     44'-1    1-32 

 

     Material size: W24x55     

  Mark  Quantity Length   ABM  

--------------------------------

 111B2     3     29'-11   1-26 

 203B3     1     29'-11   1-26 

 210B2     1     29'-11   1-26 

 213B1     1     39'-1    1-24 

 213B2     1     38'-8    1-25 

 214B4     1     39'-1    1-24 

 214B6     2     39'-7    1-23 

 305B2     1     29'-11   1-26 

 306B2     1     29'-11   1-26 

 306B3     1     29'-5    1-27 

 402B5     1     29'-11   1-26 

 403B1     1     29'-5    1-27 

 410B6     1     39'-7    1-23 

 411B6     1     44'-1    1-22 

 505B2     1     29'-11   1-26 

 506B1     1     29'-11   1-26 

 610B2     1     29'-11   1-26 

 610B4     1     39'-1    1-24 

 610B5     1     44'-1    1-22 

 611B5     1     39'-7    1-23 

 612B1     1     39'-1    1-24 

 612B2     1     38'-8    1-25 

 613B1     1     39'-1    1-24 

 615B2     2     39'-7    1-23 

 702B1     2     29'-11   1-26 

 806B1     1     29'-11   1-26 

 806B5     1     29'-11   1-26 

 807B3     1     39'-1    1-24 

 

     Material size: W24x62     

  Mark  Quantity Length   ABM  

--------------------------------

 104B2     1     29'-5    1-16 

 104B3     1      9'-8    1-20 

 106B1     1     29'-11   1-15 

 106B3     1     29'-11   1-15 

 109B3     2     29'-11   1-15 

 204B5     1     29'-11   1-15 

 208B2     1     29'-11   1-15 

 210B3     1     20'-0    1-18 

 211B1     1     38'-7    1-14 

 411B3     1     39'-1    1-13 

 502B1     1     28'-10   1-17 

 503B1     1     28'-10   1-17 

 508B1     2     29'-11   1-15 

 601B2     1     28'-11   1-17 

 602B1     1     28'-11   1-17 

 606B4     1     29'-11   1-15 

 705B1     1      9'-8    1-20 

 705B2     1     29'-5    1-16 

 808B1     1     20'-0    1-18 

 

>>>

'''