PythonでSimutransの特定の行と列の格子点にある特定の種類の道路の接続方向を揃えてみた
素敵な交通シミュレーション Simutrans で、
↓人工地盤っぽい感じで格子状に道路+線路を張り巡らしたいのです、私は
Simutransで人工地盤してみる - shingoushori's dialy
...タイトルが長くなりました
やりたいことは、↓こんな感じです
人工地盤で格子を築いた上に駅(バス停)を設置する座標なら格子点 地形を吸収すべく柱だらけの層で吸収 ... そこに待合室(まるでコインロッカー)的に1つ目を設置 ... 格子点自体は道路,線路層では交差点だが、下層は別の話 そして向きを揃えれば、いい感じ #Simutrans pic.twitter.com/gRCAcjGE7Q
— shingoushori (@shingoushori) 2017年8月31日
輝く都市!成長する都市!そして、崩れ落ちる新しき建築物したいですね!
揃えるのは大変なので、Pythonしちゃいます
手でやるのは本当に大変 手が滑ってめちゃくちゃな方向に接続されると崩れ落ちます、本当に!
今回のポイント ... サンプルの制限事項です
・"MOD_Slab_Skelton_Piller_Road_ELV" : これが 特定の種類の道路 の名前です なお、これは自作の道路です
・道路の"接続方向" のみしか確認していません "制限付き接続方向"については上書きしたつもりではいません
・特定の行と列の格子点 のつもりでしたが、書き換えミスで、特定の行と列 全部を書き換えています ... まぁ、こちらの方が更なる開発ができますね!
・揃える接続方向は 5 = 1(toN)+4(toS) です
[追記]
やはり、乱暴でした
"接続方向"の先に接続対象が存在しないところが大量にできてしまいます
すると、その接続方向に従って存在しない接続対象に行こうとするものがある時、Segmentation fault: 11 で落ちるようです
たとえそれが、車両でなく 歩行者, 乗降客であっても
ですので、このサンプルコードで実に危険です ... ...
↓サンプルコードです。
↓※絶対に元のデータを上書きしないでください。
↓※データや設定が破壊されても、責任は一切負えません。
↓version=0.120.4, 自作改造パック pak.japan_custom 用になっていますが ... 適宜正しい値になっていないと、面白いくらい開けないデータになります、多分
↓私はそれで苦戦しました
↓さらに、文字コードとかあれこれ読み込みが繊細です。
# -*- coding: utf-8 -*- import sys reload(sys) sys.setdefaultencoding('utf-8') import xml.etree.ElementTree as ET filename_in = 'test_in.sve' filename_out = 'test_out.sve' f = open(filename_in) data1 = f.read() # ファイル終端まで全て読んだデータを返す f.close() data2 = data1.replace("<![CDATA[","<CDATA>") data2 = data2.replace("]]>","</CDATA>") root = ET.fromstring(unicode(data2.encode('utf-8'))) # マップのサイズを取得 N_x = int(root[0][0].text) N_y = int(root[0][13].text) count_p = 0 count_x = 0 count_y = 0 for planquadrat in root.iter('planquadrat_t'): count_x = count_p % N_x count_y = count_p / N_x if (count_x % 5 == 0) or (count_x % 40 == 19) or (count_x % 40 == 21) \ or (count_y % 5 == 0) or (count_y % 40 == 19) or (count_y % 40 == 21): planquadrat_iter = planquadrat.iter('strasse_t') for strasse in planquadrat_iter: isTarget = False for elem in strasse.iter('CDATA'): if elem.text == "MOD_Slab_Skelton_Piller_Road_ELV": isTarget = True print str(count_x) + " , " + str(count_y) else: isTarget = False if isTarget: for weg in strasse.iter('weg_t'): weg[1].text = str(1+4) # 1:toN, 2:toE, 4:toS, 8:toW count_p = count_p + 1 data3 = ET.tostring(root, encoding="utf-8") data4 = "<?xml version=\"1.0\"?>\n" + data3 data4 = data4.replace("<CDATA>","<![CDATA[") data4 = data4.replace("</CDATA>","]]>") data4 = data4.replace("<CDATA />","<![CDATA[]]>") data4 = data4.replace("<Simutrans pak=\"pak.japan_custom\" version=\"0.120.4\">","<Simutrans version=\"0.120.4\" pak=\"pak.japan_custom\">") f = open(filename_out,'w') # 書き込みモードで開く f.write(data4) # 引数の文字列をファイルに書き込む f.close()