Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import xml.etree.ElementTree as ET
- import xml.dom.minidom as md
- import re
- import csv
- # XMLファイルを解析
- tree = ET.parse(r'D:\DATA2\game\Bataille\Bataille_set\VASSAL\Z_base\BaseS_V2R6ext\buildFile')
- # ツリーを取得
- root = tree.getroot()
- #要素を文字列に変換
- strxml=ET.tostring(root, 'utf-8').decode()
- #トレイ共通部セット
- Tray_header=['']*4
- Tray_header[0]=' <VASSAL.build.module.Map allowMultiple="false" backgroundcolor="255,255,204" buttonName="'
- Tray_header[1]='" changeFormat="$message$" color="0,0,0" createFormat="$pieceName$ created in $location$" edgeHeight="0" edgeWidth="0" hotkey="" icon="" launch="true" mapName="'
- Tray_header[2]='" markMoved="Never" markUnmovedIcon="/images/unmoved.gif" markUnmovedText="" markUnmovedTooltip="Mark all pieces on this map as not moved" moveKey="" moveToFormat="$pieceName$ moves $previousLocation$ -> $location$ *" moveWithinFormat="$pieceName$ moves $previousLocation$ -> $location$ *" thickness="3">\n <VASSAL.build.module.map.BoardPicker addColumnText="Add column" addRowText="Add row" boardPrompt="Select board" slotHeight="125" slotScale="0.2" slotWidth="450" title="Choose Boards">\n <setup>'
- Tray_header[3]='BoardPicker tray 0 0</setup>\n <VASSAL.build.module.map.boardPicker.Board height="600" name="tray" reversible="false" width="1900"/>\n </VASSAL.build.module.map.BoardPicker>\n <VASSAL.build.module.map.StackMetrics bottom="40,0" disabled="false" down="37,0" exSepX="10" exSepY="10" top="38,0" unexSepX="4" unexSepY="4" up="39,0"/>\n <VASSAL.build.module.map.ForwardToKeyBuffer/>\n <VASSAL.build.module.map.Scroller/>\n <VASSAL.build.module.map.ForwardToChatter/>\n <VASSAL.build.module.map.MenuDisplayer/>\n <VASSAL.build.module.map.MapCenterer/>\n <VASSAL.build.module.map.StackExpander/>\n <VASSAL.build.module.map.PieceMover/>\n <VASSAL.build.module.map.KeyBufferer/>\n <VASSAL.build.module.map.ImageSaver buttonText="" hotkey="" icon="/images/camera.gif" tooltip="Save Map as PNG image"/>\n <VASSAL.build.module.map.CounterDetailViewer borderWidth="0" counterReportFormat="" delay="700" display="from top-most layer only" emptyHexReportForma="$LocationName$" fgColor="0,0,0" fontSize="9" graphicsZoom="1.0" hotkey="32,130" layerList="" minDisplayPieces="2" propertyFilter="" showDeck="false" showMoveSelectde="false" showNoStack="false" showNonMovable="false" showgraph="true" showgraphsingle="false" showtext="false" showtextsingle="false" summaryReportFormat="$LocationName$" unrotatePieces="false" version="" zoomlevel="1.0"/>\n <VASSAL.build.module.properties.GlobalProperties/>\n <VASSAL.build.module.map.SelectionHighlighters/>\n <VASSAL.build.module.map.HighlightLastMoved color="255,0,0" enabled="true" thickness="2"/>\n'
- #デッキ共通部セット
- Deck_header=['']*3
- Deck_header[0]=' <VASSAL.build.module.map.DrawPile allowMultiple="false" allowSelect="true" canSave="false" color="0,0,0" countExpressions="" draw="false" drawFaceUp="true" emptyHotkey="" expressionCounting="false" faceDown="Never" faceDownFormat="" height="60" hotkeyOnEmpty="false" maxStack="12" name="'
- Deck_header[1]='" owningBoard="tray" reshufflable="false" reshuffleCommand="" reshuffleHotkey="" reshuffleMessage="" reshuffleTarget="" restrictExpression="" restrictOption="false" reverseCommand="Reverse" reverseFormat="" reverseHotkey="" reversible="false" selectDisplayProperty="$BasicName$" selectSortProperty="" shuffle="Never" shuffleCommand="Shuffle" shuffleFormat="" shuffleHotkey="" width="120" '
- #カード共通部セット
- Card_header=['']*1
- Card_header[0]=' <VASSAL.build.widget.CardSlot entryName="'
- #歩兵、騎兵
- Card_header_InfCav=['']*8
- Card_header_InfCav[0]=Card_header[0]
- Card_header_InfCav[1]='" height="0" width="0">+/null/propertysheet;0Fire~0Melee~0Morale~0Range\/Lancer;Class Properties;;0;;;;67,130 propertysheet;0Strength~0Status;Properties;;0;;;;80,130\ markmoved;moved;56;0;Mark Moved;77,130\\\\ rotate;24;93,130;91,130;Rotate CW;Rotate CCW;;;\\\\\\ '
- Card_header_InfCav[2]='emb2;Activate;2;;;2;;;2;;;;1;false;0;0;' #裏画像付き
- Card_header_InfCav[3]='.jpg;;true;SK;;;false;;1;1;false;70,130;;\\\\\\\\ ' #裏画像付き
- Card_header_InfCav[4]='piece;;;'
- Card_header_InfCav[5]='\ false\\\\ 0\\\\\\ '
- Card_header_InfCav[6]='-1\\\\\\\\ ' #裏画像付き
- Card_header_InfCav[7]='null;0;0;'
- #砲兵
- Card_header_Art=['']*4
- Card_header_Art[0]=Card_header[0]
- Card_header_Art[1]='" height="0" width="0">+/null/propertysheet;0Strength~0Status;Properties;;0;;;;80,130 markmoved;moved;56;0;Mark Moved;77,130\\ rotate;24;93,130;91,130;Rotate CW;Rotate CCW;;;\\\\ emb2;Activate;2;;;2;;;2;;;;1;false;0;0;'
- Card_header_Art[2]='.jpg;;true;BI;;;false;;1;1;false;70,130;;\\\\\\ piece;;;'
- Card_header_Art[3]=' false\\ 0\\\\ -1\\\\\\ null;0;0;'
- #指揮官
- Card_header_Cmd=['']*3
- Card_header_Cmd[0]=Card_header[0]
- Card_header_Cmd[1]='" height="0" width="0">+/null/propertysheet;0Inf Bonus A\/D~0Cav Bonus~0Art Bous~0Morale Bonus;Class Properties;;0;;;;67,130 markmoved;moved;56;0;Mark Moved;77,130\ rotate;24;93,130;91,130;Rotate CW;Rotate CCW;;;\\\\ piece;;;'
- Card_header_Cmd[2]=' false\\ 0\\\\ null;0;0;'
- #終了部
- Card_footer='</VASSAL.build.widget.CardSlot>\n'
- Deck_footer=' </VASSAL.build.module.map.DrawPile>\n'
- Tray_footer=' </VASSAL.build.module.Map>\n'
- File_footer='</VASSAL.launch.BasicModule>'
- #ファイルの終了を一旦削除
- strxml_first=re.sub(File_footer,"",strxml)
- #基本情報ファイルを読み込む
- read_file=open(r'D:\WORK\temp\BatailleWK\UnitInfo.csv')
- reader= csv.reader(read_file)
- read_data=list(reader)
- #read_num=[len(v) for v in read_data]
- read_file.close()
- #トレイ名称設定
- Tray_name='Tray_test'
- #Tray追加
- strxml_new=strxml_first+Tray_header[0]+Tray_name+Tray_header[1]+Tray_name+Tray_header[2]+Tray_name+Tray_header[3]
- #初期設定
- Deck_xmax=2 #左記はテスト用で正式は7
- Deck_xdist=140
- Deck_ydist=140
- Deck_xstart=70
- Deck_ystart=100
- gpid=2000
- end_line=int(read_data[0][10])-1
- Deck_xnum=0
- Deck_ynum=0
- Deck_nameold=""
- Deck_start='No'
- for i in range(1,end_line):
- Deck_name=read_data[i][8]
- if Deck_name !=Deck_nameold :
- if Deck_start=='Yes':
- strxml_new=strxml_new+Deck_footer #Deck終了
- Deck_nameold=Deck_name
- Deck_x=Deck_xstart + Deck_xdist*Deck_xnum
- Deck_y=Deck_ystart + Deck_ydist*Deck_ynum
- Deck_header[2]='x="'+str(Deck_x)+'" y="'+str(Deck_y)+'">\n'
- #Deck追加
- strxml_new=strxml_new+Deck_header[0]+Deck_name+Deck_header[1]+Deck_header[2]
- Deck_start='Yes'
- Deck_xnum+=1
- if Deck_xnum>=Deck_xmax:
- Deck_xnum=0
- Deck_ynum+=1
- unit_name=read_data[i][0]
- unit_name2=re.sub('/',"\/",unit_name) #部隊名称で1/LRなど"/"の文字が入る場合の対策。これがないとVASSALでエラーになる。
- fire_value=read_data[i][1]
- melee_value=read_data[i][2]
- morale_value=read_data[i][3]
- range_value=read_data[i][4]
- uinit_strength=read_data[i][5]
- unit_imageF=read_data[i][6]
- unit_imageB=read_data[i][7]
- unit_type=read_data[i][9]
- #Card編集
- Card_val_1=unit_name+'" gpid="'+str(gpid)
- gpid+=1
- if unit_type=='4inf' or unit_type=='3cav': #歩兵、騎兵の場合
- Card_unite=Card_header_InfCav[0]+Card_val_1+Card_header_InfCav[1]
- if unit_imageB!='': #裏画像あり
- Card_unite=Card_unite+Card_header_InfCav[2]+unit_imageB+Card_header_InfCav[3]
- Card_unite=Card_unite+Card_header_InfCav[4]+unit_imageF+'.jpg;'+unit_name2
- Card_unite=Card_unite+'/'+fire_value+'~'+melee_value+'~'+morale_value+'~'+range_value+' '+uinit_strength+'~'+Card_header_InfCav[5]
- if unit_imageB!='': #裏画像あり
- Card_unite=Card_unite+Card_header_InfCav[6]
- Card_unite=Card_unite+Card_header_InfCav[7]+str(gpid)+Card_footer
- elif unit_type=='2art': #砲兵の場合
- Card_unite=Card_header_Art[0]+Card_val_1+Card_header_Art[1]+unit_imageB+Card_header_Art[2]+unit_imageF+'.jpg;'+unit_name2
- Card_unite=Card_unite+'/'+uinit_strength+'~'+Card_header_Art[3]+str(gpid)+Card_footer
- elif unit_type=='1cmd': #指揮官の場合
- Card_unite=Card_header_Cmd[0]+Card_val_1+Card_header_Cmd[1]+unit_imageF+'.jpg;'+unit_name2
- Card_unite=Card_unite+'/'+fire_value+'~'+melee_value+'~'+morale_value+'~'+range_value+Card_header_Cmd[2]+str(gpid)+Card_footer
- #Card追加
- strxml_new=strxml_new+Card_unite
- #データ終了
- strxml_new=strxml_new+Deck_footer+Tray_footer+File_footer
- #文字列を要素に戻す
- element_new=ET.fromstring(strxml_new)
- tree_new = ET.ElementTree(element_new)
- #ファイル出力
- tree_new.write(r'D:\DATA2\game\Bataille\Bataille_set\VASSAL\Z_base\BaseS_V2R6ext\buildFile', encoding="UTF-8", xml_declaration=True)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement