コンテンツにスキップ

FAQ/ 盛土データをDioVISTAにインポートするPowerShellスクリプト

CSVファイルに格納した盛土データを、DioVISTAに取り込むためのPowerShellスクリプトを作成しています。
ところが、以下のエラーメッセージが出現して、意図どおりの処理にすることができません。

"AppendChild" の引数"0" (値 "...")を型"System.Xml.XmlNode"に変換できません。

解決方法を教えてください。

回答

以下のPowerShellスクリプトを試してください。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
#プロジェクトに盛土を追加するスクリプト
# プロジェクトファイルを指定する(入力)
$fsxproj = ".\sample.fsxproj"

# プロジェクトファイルを指定する(出力)
$newFsxproj = ".\sample_addEmbankment.fsxproj"

# csvファイルを指定する(入力)
$csv = Import-Csv -Encoding UTF8 ".\Embankment.csv"

#プロジェクトの読み込み
$fsxprojInfo = Get-Item $fsxproj
[xml]$xml = (cat -Encoding UTF8 $fsxproj)

# Embankment.csvから読み込んだデータを盛土としてプロジェクトに追加
foreach ($id in ($csv | select -Unique "ID")) {
    $CoordInfos = $csv | where { $_.ID -eq $id.ID }
    $firstCoordInfo = $CoordInfos[0]
    $newFill = $xml.CreateElement("fill")
    [void]$xml.floodSim.conditions.fills.AppendChild($newFill)

    $attrs = @{
        "name"       = "盛土" + $firstCoordInfo.ID.ToString()
        "upperWidth" = $firstCoordInfo.Width.ToString()
        "lowerWidth" = $firstCoordInfo.Width.ToString()
        "valid"      = "True"
        "lineStyle"  = "0 2 255 80 80 255"
        "display3d"  = "False"
    }
    $attrs.GetEnumerator() | % {
        $newAttribute = $xml.CreateAttribute($_.Name)
        $newAttribute.Value = $_.Value
        [void]$newFill.Attributes.Append($newAttribute)
    }

    $newLine = $xml.CreateElement("line")
    [void]$newFill.AppendChild($newLine)
    foreach ($coordInfo  in $CoordInfos) {
        $y = ([double]$coordInfo.Y * [Math]::PI / 180.0)
        $x = ([double]$coordInfo.X * [Math]::PI / 180.0)
        $coordText = "{0:0.000000000000000} {1:0.000000000000000} {2} {3}" -f $y, $x, $coordInfo.Hhigh, $coordInfo.Hlow
        $coordValue = $xml.CreateTextNode($coordText)
        $newCoord = $xml.CreateElement("coord")
        [void]$newCoord.AppendChild($coordValue)
        [void]$newLine.AppendChild($newCoord)
    }
}
$xml.Save((Join-Path $fsxprojInfo.DirectoryName $newFsxproj))

盛土のデータの例を示します。これをテキストエディタに貼り付け "Embankment.csv" として保存します。エンコーディングはUTF8とします。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
ID,Width,X,Y,Hlow,Hhigh
1,20,140.03000000,36.00000000,10,15
1,20,140.02707107,36.00707107,10,15
1,20,140.02000000,36.01000000,10,15
1,20,140.01292893,36.00707107,10,15
1,20,140.01000000,36.00000000,10,15
1,20,140.01292893,35.99292893,10,15
1,20,140.02000000,35.99000000,10,15
1,20,140.02707107,35.99292893,10,15
1,20,140.03000000,36.00000000,10,15
2,15,140.00000000,36.01000000,0,4
2,15,140.00000000,35.99000000,0,4
3,15,140.01000000,36.00000000,0,3
3,15,140.00923880,36.00382683,0,3
3,15,140.00707107,36.00707107,0,3
3,15,140.00382683,36.00923880,0,3
3,15,140.00000000,36.01000000,0,3
3,15,139.99617317,36.00923880,0,3
3,15,139.99292893,36.00707107,0,3
3,15,139.99076120,36.00382683,0,3
3,15,139.99000000,36.00000000,0,3
3,15,139.99076120,35.99617317,0,3
3,15,139.99292893,35.99292893,0,3
3,15,139.99617317,35.99076120,0,3
3,15,140.00000000,35.99000000,0,3
3,15,140.00382683,35.99076120,0,3
3,15,140.00707107,35.99292893,0,3
3,15,140.00923880,35.99617317,0,3
3,15,140.01000000,36.00000000,0,3
カラム 内容
ID 盛土ID
Width 盛土幅
X 盛土の構成点の経度(degree)
Y 盛土の構成点の緯度(degree)
Hlow 地形標高(m)
Hhigh 天端標高(m)

スクリプトを実行すると、盛土1, 盛土2, および盛土3が作られます。下図の右の図形(赤い八角形)が盛土1です。左の図形(赤い円)が盛土3です。円の中の縦線が盛土2です。

「盛土1」のプロパティを示します。

関連項目


最終更新日: 2022-07-08