Initial commit

This commit is contained in:
torsten committed 2026-08-13 18:33:10 +02:00
commit b7d90b9afe
16245 files changed
+3396666

No files matched your search

+72
View File
@@ -0,0 +1,72 @@
# $Id: ahtc_buildings_buildingviewer.spec 48365 2019-09-13 10:58:22Z ehrlicher $
# $HeadURL: svn://slssvn/TDS/branches/product/iterations/21_06_mango_loco/specs/external/ahtc_buildings_buildingviewer.spec $
#
# Von Hand auszufuellen - Version und Release anpassen!
# import_ahtc.csv erzeugen (mittels convert_coordinates.py)
# "osgconv.sh ahtc"
# es wird ~/rpmbuild/SOURCES/ahtc_buildings_buildingviewer-1.0.0.tar.gz erzeugt, inklusive import_ahtc.csv
# rpmbuild -bb --target=noarch ahtc_buildings_buildingviewer.spec
#
%define real_name ahtc_buildings_buildingviewer
Summary: AHTC Buildings for BuildingViewer
Name: %{real_name}
Version: 1.0.0
Release: 8
License: proprietary
Group: Applications/Resources
Source: %{real_name}-%{version}.tar.gz
Prefix: /
Vendor: Rheinmetall Electronics GmbH
URL: http://www.rheinmetall-defence.com
Packager: ctc
Provides: %{real_name}
AutoReqProv: no
%description
3D Models for AHTC Buildings / BuildingViewer
%changelog
#* date +"%a %b %d %Y" text
* Thu Sep 12 2019 Christian Ehrlicher
- Don't show MountingPoints in 3D Model
* Fri Aug 30 2019 Christian Ehrlicher
- fix base heights
* Tue Aug 27 2019 Christian Ehrlicher
- fix rotation for building B6
- adjust z values (+30m)
* Thu Aug 22 2019 Christian Ehrlicher
- added some missing buildings
* Mon Jul 01 2019 Christian Ehrlicher
- used compressed ive files / textures
* Mon May 06 2019 Christian Ehrlicher
- added wls ids, svn rev 1405
* Thu Apr 04 2019 Christian Ehrlicher
- small update in generation script, svn rev 1403
* Mon Nov 26 2018 Christian Ehrlicher
- initial, svn rev 1401
%prep
%setup -q
%build
echo "nothing to build"
# nothing to do here
%install
mkdir -p "%{buildroot}/opt/BuildingModels/"
mv %{_builddir}/%{buildsubdir}/* %{buildroot}/opt/BuildingModels/
%clean
%__rm -rf "%{buildroot}"
%files
%defattr(-,ctc,ctc)
/opt/BuildingModels/
%pre
%post
%preun
%postun
@@ -0,0 +1,64 @@
#!/bin/sh
#
# @RDE_HEADER@
# $Id$
# $HeadURL$
# $Author$
#
me=`basename "$0"`
searchPath="."
if [ $# -ne 2 ]
then
searchPath=$1
fi;
echo "START '$me' at path= '${searchPath}' ..."
#REF_MOD_AP_0001
#BDI_P_1
#CAMERA_IN_AP_1 CAMERA_OUT_AP_1
#IPS_OUT_AP_1 IPS_IN_AP_1
#ZEG_MOD_AP_1
#undest_room_201
#SW_room_201
#floor_1
#xargs grep -wo 'IPS_IN_AP_[[:digit:]]\{1\}' | sort
REGEXS="${REGEXS} REF_MOD_AP_[0-9]\{4\}"
REGEXS="${REGEXS} BDI_P_[0-9]\{1\} BDI_P_[0-9]\{2\}"
REGEXS="${REGEXS} CAMERA_IN_AP_[0-9]\{1\} CAMERA_IN_AP_[0-9]\{2\}"
REGEXS="${REGEXS} CAMERA_OUT_AP_[0-9]\{1\} CAMERA_OUT_AP_[0-9]\{2\}"
REGEXS="${REGEXS} IPS_IN_AP_[0-9]\{1\} IPS_IN_AP_[0-9]\{2\}"
REGEXS="${REGEXS} IPS_OUT_AP_[0-9]\{1\} IPS_OUT_AP_[0-9]\{2\}"
REGEXS="${REGEXS} ZEG_AP_[0-9]\{1\} ZEG_[0-9]\{2\}"
REGEXS="${REGEXS} floor_[0-9]\{1\} floor_[0-9]\{2\}"
REGEXS="${REGEXS} undest_room_[0-9]\{3\}"
REGEXS="${REGEXS} SW_room_[0-9]\{3\}"
cnt=0;
for REGEX in ${REGEXS}
do
echo "---------------------------------------"
((cnt=cnt+1))
echo " check using regex_${cnt}: '${REGEX}' --->"
find ${searchPath} -iname "*.flt.xml" | xargs grep -wo ${REGEX} | sort | uniq -cd
echo
done
echo "END '$me' ..."
+37
View File
@@ -0,0 +1,37 @@
#!/bin/sh
#
# @RDE_HEADER@
# $Id$
# $HeadURL$
# $Author$
#
# Since 05-03-2024:
BLDGS="A1 A2 A3 A4"
numOk=0;
numFailure=0;
for BLDG in ${BLDGS}
do
echo "Bldg: '$BLDG':";
MyFile=`find ../QatarBuildings/buildings/ -iname "${BLDG}.flt.VWM_Building.xml"`
grep -E "OuterWallProtectiveFactor|ExclusionZoneProtectiveFactor" $MyFile | sort -u | grep -vE "usionZoneProtectiveFactor>0<|usionZoneProtectiveFactor>20|WallProtectiveFactor>200|WallProtectiveFactor>200"
if [ $? -ne 0 ];
then
((numFailure=numFailure+1))
echo "'$BLDG' okay";
else
((numOk=numOk+1))
echo " failure on -> '$BLDG' ";
fi
done
echo " numOk = $numOk ";
echo " numFailure = $numFailure ";
+126
View File
@@ -0,0 +1,126 @@
#!/usr/bin/python
import csv
import math
import os
import subprocess
import sys
def convert(src, dst, x, y):
cmd = "cs2cs -f %%.13f %s +to %s << EOF\n%s %s\nEOF" % (src, dst, x, y)
p = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE)
ret = p.wait()
pos = p.stdout.read().replace('\t', ' ').split()
#print pos
return pos
def readBldgId(fn):
try:
f = open(fn, 'r')
content = f.read()
return int(content.strip())
except:
return ''
def main():
subdir = ''
skipped_buildings_xml = []
skipped_buildings_vwm = []
skipped_buildings_name = []
skipped_buildings_no_files = []
script_file_name = 'import_ahtc.csv'
script_file = open(script_file_name, 'w')
# for block in ('a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'cts'):
for block in ('b'):
csv_file='block_%s.csv' % block
dir_prefix = 'bldg_BN_'
file_prefix = dir_prefix
proj_from = "+init=epsg:32639"
proj_to = "+init=epsg:4326"
print 'parsing %s' % csv_file
names = []
nextLineHasToBeEg = False;
buildingNameForEg = None
for line in list(csv.reader(open(csv_file, 'rt'), delimiter = ',')):
if len(line) < 6:
print 'continue 1111'
continue
print ' line = %s' % line
if line[1] != 'EG' and line[1] != 'UG':
print 'continue 2222'
continue
if nextLineHasToBeEg and line[1] != 'EG':
print "XXXX Got a 'UG' line, but no following line with 'EG'..."
skipped_buildings_name.append(name)
continue
name = buildingNameForEg if nextLineHasToBeEg else line[0].split(' ')[0]
if name in names:
print "found duplicate building %s - skipping" % name
skipped_buildings_name.append(name)
continue
# adjust the names
name = name.strip()
if '(' in name:
name = name[:name.index('(') - 1]
if len(name) == 0:
continue
if line[1] == 'UG':
nextLineHasToBeEg = True
buildingNameForEg = name
print 'continue 3333'
continue
nextLineHasToBeEg = False
print 'Converting coordinates for building "%s"' % name
names.append(name)
x = float(line[2].replace(',', '.'))
y = float(line[3].replace(',', '.'))
z = float(line[4].replace(',', '.'))
r = float(line[5].replace(',', '.'))
path = os.path.join('../AhtcBuildings', 'buildings', '%s%s' % (file_prefix, name))
if not os.path.exists(path):
print "Can not find path " + path
skipped_buildings_no_files.append(name)
continue
xml = os.path.join(path, '%s%s.flt.xml' % (file_prefix, name))
vwm = os.path.join(path, '%s%s.flt.VWM_Building.xml' % (file_prefix, name))
wls = os.path.join(path, '%s%s_wls_id.txt' % (file_prefix, name))
if not os.path.exists(xml):
skipped_buildings_xml.append(name)
continue
if not os.path.exists(vwm):
skipped_buildings_vwm.append(name)
continue
bldg_id = readBldgId(wls)
pos = convert(proj_from, proj_to, x, y)
lat = float(pos[0]) / 180. * math.pi
lon = float(pos[1]) / 180. * math.pi
z = z + 30 # 30m offset
#print lon, lat, pos[0], pos[1]
pos = '%.13f,%.13f,%.4f,%.4f' % (lat, lon, z, r);
flt = '%s%s.flt.xml' % (file_prefix, name)
vwm = '%s%s.flt.VWM_Building.xml' % (file_prefix, name)
print " --> write line '%s;%s;%s;%s\n'" % (flt, vwm, pos, bldg_id)
script_file.write('%s;%s;%s;%s\n' % (flt, vwm, pos, bldg_id));
if len(skipped_buildings_no_files):
print "Skipped due to missing files: " + ', '.join(skipped_buildings_no_files)
if len(skipped_buildings_xml):
print "Skipped due to missing xml: " + ', '.join(skipped_buildings_xml)
if len(skipped_buildings_vwm):
print "Skipped due to missing vwm: " + ', '.join(skipped_buildings_vwm)
if len(skipped_buildings_name):
print "Skipped due to duplicate names: " + ', '.join(skipped_buildings_name)
print "Created csv file " + script_file_name;
if __name__ == "__main__":
main()
@@ -0,0 +1,5 @@
#xmlFile;vulnerabilityFile;egcuToRoomFile;position;bauabschnitt
A1.flt.xml;A1.flt.VWM_Building.xml;A1.egcu2room.xml;0.8965588806456,0.4442807272790,1.6200,33.0755;8010
A2.flt.xml;A2.flt.VWM_Building.xml;A2.egcu2room.xml;0.8965583515870,0.4442689027989,1.6200,33.0755;8010
A3.flt.xml;A3.flt.VWM_Building.xml;A3.egcu2room.xml;0.8965606471857,0.4442707739939,1.6200,33.0755;8010
A4.flt.xml;A4.flt.VWM_Building.xml;A4.egcu2room.xml;0.8965657372476,0.4442737538448,1.6200,33.0755;8010
1 #xmlFile vulnerabilityFile egcuToRoomFile position bauabschnitt
2 A1.flt.xml A1.flt.VWM_Building.xml A1.egcu2room.xml 0.8965588806456,0.4442807272790,1.6200,33.0755 8010
3 A2.flt.xml A2.flt.VWM_Building.xml A2.egcu2room.xml 0.8965583515870,0.4442689027989,1.6200,33.0755 8010
4 A3.flt.xml A3.flt.VWM_Building.xml A3.egcu2room.xml 0.8965606471857,0.4442707739939,1.6200,33.0755 8010
5 A4.flt.xml A4.flt.VWM_Building.xml A4.egcu2room.xml 0.8965657372476,0.4442737538448,1.6200,33.0755 8010
+76
View File
@@ -0,0 +1,76 @@
#!/bin/sh
if [ "$#" -ne 3 ]; then
echo "Please pass: <VERSION>, <location>, <absPathTo_import_<location>.csv> like '1234.54123 <ba0|ba1|ba2|ba3|ba4|salchau> /shd/...../import_ba0.csv'"
exit 1
fi
version=$1
location=$2
import_csv=$3
outdir_rel=${location}_buildings_buildingviewer-${version}
tmpdir=/tmp
outdir=${tmpdir}/${outdir_rel}
outdir_ive=${outdir}/StaticMeshes
outdir_txt=${outdir}/texture
rm -rf ${outdir}
echo "Attn: must be called in directory with building subdirs!"
if [ ! -e ${outdir_ive} ]; then
mkdir -p ${outdir_ive}
fi
if [ ! -e ${outdir_txt} ]; then
mkdir -p ${outdir_txt}
fi
# remove old directory
rm -r $outdir_txt
# copy texture directory for conversion
cp -r texture ${outdir_txt}
# copy all files in texture to upper case (windows...)
for f in `ls -1 ${outdir_txt}`; do
f_upper="${f^^}"
f_lower="${f,,}"
if [ "${f}x" != "${f_upper}x" ]; then
cp ${outdir_txt}/$f ${outdir_txt}/$f_upper
fi
if [ "${f}x" != "${f_lower}x" ]; then
cp ${outdir_txt}/$f ${outdir_txt}/$f_lower
fi
done
dirs=`find . -maxdepth 1 -type d | sort -n`
pwd=`pwd`
cd $outdir_ive
infile=${import_csv}
if [ ! -e ${infile} ]; then
echo "Can not find import file ${infile}"
exit 1
fi
for d in `cat ${infile} | cut -d ';' -f 1 | cut -d '.' -f 1`; do
d=`basename $d`
srcdir=${pwd}/${d}
# nur fertig, wenn .flt und .flt.xml vorhanden sind
if [ -e ${srcdir}/${d}.flt ] && [ -e ${srcdir}/${d}.flt.xml ]; then
echo "converting $srcdir ..."
osgconv --compressed ${srcdir}/${d}.flt ${outdir_ive}/${d}.flt.ive -O "compressed"
cp ${srcdir}/$d.*.xml ${outdir_ive}/
echo "... finished"
fi
done
rm -r $outdir_txt
cp ${infile} ${outdir_ive}
cd ${tmpdir}
tar cvzf ~/rpmbuild/SOURCES/${location}_buildings_buildingviewer-${version}.tar.gz ${outdir_rel}
if [ $? -ne 0 ]; then
exit 2
fi
rm -rf ${outdir_rel}
cd ${pwd}
echo "Now you can run rpmbuild -bb --target=noarch ${location}_buildings_buildingviewer.spec"
@@ -0,0 +1,373 @@
#!/bin/sh
#
# @RDE_HEADER@
# $Id$
# $HeadURL$
# $Author$
#
env
file_location=`pwd`
echo "Comment: current wd is: " `pwd`
###
### Presets
###
PROJECT="QATAR"
xlsxfile=AHTC_Transformationspunkte_190114_UTM_fuer_FME
SPD_BLDGS=../QatarBuildings/buildings
LOCATIONS_LIST="qatar"
loc="qatar"
echo "Comment: remove some temporary files... revert some other..."
rm -v block*.csv
rm -v ./import_qatar.csv
rm -v ./${xlsxfile}*
rm -v vwm_adjustment*.log
rm -v checkProtective*.log
rm -v checkDuplicateNames*.log
###
### revert *.spec
###
svn revert *.spec
###
### check-out / revert bldgs
###
echo "Comment: revert bldgs: $SPD_BLDGS ..."
## rm -rfv $SPD_BLDGS/bldg_3145_47
svn revert -R $SPD_BLDGS
###
# remove uneeded: bldg_hierarchie.flt, directory bldg_EGCU_test
###
rm -v $SPD_BLDGS/bldg_hierarchie.flt
rm -rfv $SPD_BLDGS/bldg_EGCU_test
mv -v $SPD_BLDGS/bldg_3145-47 $SPD_BLDGS/bldg_3145_47
find $SPD_BLDGS -iname "*egcu2room*" -delete
find $SPD_BLDGS -iname "*.wrl" -delete
find $SPD_BLDGS -iname "*.patch" -delete
###
# fix syntax: bldg_3141_26.flt.VWM_Building.xml
###
BEFORE="<ExclusionZoneProtectiveFactor>20<\/OuterWallProtectiveFactor>"
AFTER="<OuterWallProtectiveFactor>20<\/OuterWallProtectiveFactor>"
#sed -i "s/${BEFORE}/${AFTER}/g" $SPD_BLDGS/bldg_3141_26/bldg_3141_26.flt.VWM_Building.xml
# if [ $? -ne 0 ]; then echo "sed command failed" ; fi
# Fix bldg_3101 (16.787/16.786 ; remove linear dependencies (GUEZE-605, GUEZE-717 ; CheckAwesOnBldg_3101_verteilt.sh)
#sed -i 's/16.787/16.786/g' $SPD_BLDGS/bldg_3101/bldg_3101.flt.xml
#sed -i 's/16.787/16.786/g' $SPD_BLDGS/bldg_3101/bldg_3101.flt.VWM_Building.xml
###
### Apply some patches: early to be idenpendent from modifications by replace_transistion_factors etc.
###
# Do it here, because the final xml structure is avaible now (node.js converts to json and back to xml....)
#
# fix Bbox / placement of 4 roomnames at 3101: 102, 108, 109, 112
#
# diff -Naur ./bldg_3100/bldg_3100.flt.VWM_Building.xml ./bldg_3100/bldg_3100.flt.VWM_Building.xmlOKAY
#
#cp -v ./patches/* $SPD_BLDGS
# if [ $? -ne 0 ]; then echo "copy command (patches) failed" ; fi
#pushd $SPD_BLDGS
# if [ $? -ne 0 ]; then echo "cd command failed" ; fi
#echo "Comment: cd building ; patching.."
#echo "Comment: current wd is: " `pwd`
#dos2unix ./bldg_3101/bldg_3101.flt.xml
#cp ./bldg_3101/bldg_3101.flt.xml ./bldg_3101/bldg_3101.flt.xml_bak
#patch -p1 < patch_bldg_3101.flt.xml.patch
# if [ $? -ne 0 ]; then echo "patch (patch_bldg_3101.flt.xml.patch) failed" ; exit ; fi
# popd
###
### update ProtectiveFactor, see https://devhub.defence-elec.de/jira/browse/MNQ-481
### (introduced in 2024 for qatar/qatar-mout)
###
echo "Comment: updateProtectiveFactor ..."
echo "Comment: current wd is: " `pwd`
./updateProtective.sh > updateProtectiveQatar.log
updateProtectiveErrorCnt=`cat updateProtectiveQatar.log | grep "failure" | wc -l`
echo -e "Comment: Problems regarding updating protectiveFactors at some files: cnt: $updateProtectiveErrorCnt"
###
### check ProtectiveFactor according VEMAG
###
# Wall -> 150
# Ceiling -> 150
# ExclusiveDoor -> 20
# ExclusiveWindow -> 0
#
echo "Comment: checkProtectiveFactors ..."
echo "Comment: current wd is: " `pwd`
./checkProtective.sh > checkProtectiveQatar.log
protectiveErrorCnt=`cat checkProtectiveQatar.log | grep "failure" | wc -l`
echo -e "Comment: Problems regarding wrong protectiveFactors at some files: cnt: $protectiveErrorCnt"
###
### xmllint
###
echo "Comment: verify xml using xmllint on $SPD_BLDGS ..."
rm /tmp/xmllintDummyout.xml
find $SPD_BLDGS -iname "*.xml" | xargs xmllint > /tmp/xmllintDummyout.xml
if [ $? -ne 0 ]; then
echo "xmllint failed" ; exit
else
echo "xmllint successfull"
fi
###
### check duplicate names
###
echo "Comment: check duplicate names on $SPD_BLDGS ..."
./checkDuplicateNames.sh $SPD_BLDGS > checkDuplicateNames.log
checkDuplicateNamesCnt=`cat checkDuplicateNames.log | grep "flt" | wc -l`
echo -e "Comment: Problems regarding duplicate Names at some files: cnt: $checkDuplicateNamesCnt"
###
### update _Transformationspunkte
###
####
echo "Comment: update _Transformationspunkte......"
cd $SPD_BLDGS/../_Transformationspunkte
svn up --username thoden --password SPDsvnTH
cd -
####
###
### Create VERSION_STR (containing a) rev of SPD and b) of this scripts)
###
# result will look like '4573.53084'
#
echo "Comment: create VERSION_STR..."
echo "Comment: current wd is: " `pwd`
# get last mod rev and remove whitespace
VERSION_POST_PROC=`svn info . | grep -E 'Letzte ge|Last Changed Rev' | awk -F ':' '{print $2 }'`
VERSION_POST_PROC=`echo $VERSION_POST_PROC | sed -e 's/[[:space:]]*$//'`
echo "VERSION_POST_PROC = '$VERSION_POST_PROC'"
#####TODO##### if [ -z "$VERSION_POST_PROC" ] ; then echo "VERSION_POST_PROC could not be determined" ; exit; fi
# get lst mod rev and remove whitespace
VERSION1=`svn info $SPD_BLDGS | grep -E 'Letzte ge|Last Changed Rev' | awk -F ':' '{print $2 }'`
VERSION1=`echo $VERSION1 | sed -e 's/[[:space:]]*$//'`
echo "VERSION1 = '$VERSION1'"
if [ -z "$VERSION1" ] ; then echo "VERSION1 could not be determined" ; exit; fi
VERSION2=`svn info $SPD_BLDGS/../_Transformationspunkte | grep -E 'Letzte ge|Last Changed Rev' | awk -F ':' '{print $2 }'`
VERSION2=`echo $VERSION2 | sed -e 's/[[:space:]]*$//'`
echo "VERSION2 = '$VERSION2'"
if [ -z "$VERSION2" ] ; then echo "VERSION2 could not be determined" ; exit; fi
if (( $VERSION1 > $VERSION2 )); then
VERSION_SPD_BLDGS=$VERSION1;
else
VERSION_SPD_BLDGS=$VERSION2;
fi
#####TODO##### if [ -z "$VERSION_POST_PROC" ] ; then echo "VERSION_SPD_BLDGS could not be determined" ; exit; fi
# Please do not add strings to VERSION_STR. rpm -Uhv will have problem with it....
echo "VERSION_SPD_BLDGS = '$VERSION_SPD_BLDGS'"
#####TODO##### echo "VERSION_POST_PROC = '$VERSION_POST_PROC'"
VERSION_STR="${VERSION_SPD_BLDGS}.${VERSION_POST_PROC}"
echo "VERSION_STR = '$VERSION_STR'"
###
### vwm_adjustment
###
# NodeJS:
# multiple dirs: 1st for jenkins, 2nd for CTCAP15/Norbert
export NODE_PATH='/usr/lib/node_modules:../node_modules'
echo "Comment: NODE_PATH=" $NODE_PATH
echo "Comment: vwm_adjustment at dir $SPD_BLDGS"
node ./vwm_adjustment/RECURSIV/pos_dir_guez.js $SPD_BLDGS &> vwm_adjustmentQatar.log
if [ $? -ne 0 ];
then echo " node vwm_adjustment failed" ; tail -n200 vwm_adjustmentQatar.log;
exit
else
echo " node vwm_adjustment finished";
fi
# Renoir-repos has xml files without svn:eol-style.
# So 'svn co' on unix will create files with CR+LF (Windows EOL)
# To ensure usefull 'svn diff' showing only the real differences, convert to CR+LF:
# execute unix2dos on all files adjusted (vwm_adjustment)
echo "Comment: unix2dos (quiet)"
find $FILE -name "*flt.xml" | xargs unix2dos -q
find $FILE -name "*VWM_Building.xml" | xargs unix2dos -q
# for debug:
# svn st ../GuezBuildings/buildings/bldg_0910/
# svn diff ../GuezBuildings/buildings/bldg_0910/
# svn diff ../GuezBuildings/buildings/bldg_0910/bldg_0910.flt.xml
### seperate sheets:
# xlsx to xls
### FILE=$SPD_BLDGS/../_Transformationspunkte/${xlsxfile}.xlsx
### if [ ! -f "$FILE" ]; then echo "$FILE does not exist." ; exit; fi
### cp -v $FILE .
### if [ $? -ne 0 ]; then echo "copy command failed" ; fi
### FILE=./${xlsxfile}.xlsx
### if [ ! -f "$FILE" ]; then echo "$FILE does not exist." ; exit; fi
### soffice --headless --convert-to SOFFICE_CONVERTED.xls $FILE
#-> GUEZ_BWDLZ_BA-0_BA-IV_Transformationspunkte_201210.SOFFICE_CONVERTED.xls
### if [ $? -ne 0 ]; then echo "soffice command failed" ; fi
### # xls to csv
### echo "Comment: xlsx to xls..."
### xlsfile=${xlsxfile}.SOFFICE_CONVERTED.xls
### echo "Comment: xls to single csv files..."
### xls2csv -x ${xlsfile} -n1 -c block_a.csv
### xls2csv -x ${xlsfile} -n2 -c block_b.csv
### xls2csv -x ${xlsfile} -n3 -c block_c.csv
### xls2csv -x ${xlsfile} -n4 -c block_d.csv
### xls2csv -x ${xlsfile} -n5 -c block_e.csv
### xls2csv -x ${xlsfile} -n6 -c block_f.csv
### xls2csv -x ${xlsfile} -n7 -c block_g.csv
### xls2csv -x ${xlsfile} -n8 -c block_h.csv
### xls2csv -x ${xlsfile} -n9 -c block_i.csv
### xls2csv -x ${xlsfile} -n10 -c block_cts.csv
#####TODO#####
# sort
### for loc in ${LOCATIONS_LIST}
### do
### cat block_${loc}.csv | sort > temp.txt
### mv temp.txt block_${loc}.csv
### done
### rm temp.txt
# replace some strings
# like BN_Kan -> BN_Kanaele and so on
#sed -i 's/BN_Kan/BN_Kanaele/g' GUEZ_BWDLZ_salchau.csv
# if [ $? -ne 0 ]; then echo "sed command failed" ; fi
###
### convert_coordinate.py
###
#echo "Comment: convert_coordinates.py angles"
#echo "Comment: current wd is: " `pwd`
# FILE=./convert_coordinates.py
# if [ ! -f "$FILE" ]; then echo "$FILE does not exist." ; exit; fi
###
### convert_coordinate.py has problem with BN_B4,B5 and some more.
### -> Use import_ahtc_instrumented.csv
###
echo "Comment: current wd is: " `pwd`
cp ./import_qatar_instrumented.csv ./import_qatar.csv
#####TODO#####for loc in ${LOCATIONS_LIST}
#####TODO#####do
#####TODO##### csv_cnt=`cat import_${loc}.csv | grep -v "^#" | wc -l`
#####TODO##### python ./convert_coordinates.py GUEZ_BWDLZ_${loc}.csv ./import_${loc}.csv
#####TODO##### cat GUEZ_BWDLZ_${loc}.csv | sort > temp.txt
#####TODO##### mv temp.txt GUEZ_BWDLZ_{loc}.csv
#####TODO#####done
### python ./convert_coordinates.py
###
### Copy some files to $SPD_BLDGS
###
echo "Comment: cd building ; osgconv.sh"
echo "Comment: current wd is: " `pwd`
cp -v ./osgconv.sh $SPD_BLDGS
if [ $? -ne 0 ]; then echo "copy command (osgconv.sh) failed" ; fi
pushd $SPD_BLDGS
if [ $? -ne 0 ]; then echo "cd command failed" ; fi
./osgconv.sh $VERSION_STR qatar ${file_location}/import_qatar.csv
# back to location of this file :-)
popd
echo "Comment: rpmbuild..."
echo "Comment: current wd is: " `pwd`
###
### Prepare spec files:
###
echo "Comment: replace some vars at *.spec"
echo "VERSION_STR = '$VERSION_STR'"
sed -i "s/@VERSION@/$VERSION_STR/g" qatar_buildings_buildingviewer.spec
if [ $? -ne 0 ]; then echo "sed command failed" ; fi
###
### JENKINS:
###
if [ -z "$BUILD_TAG" ] ; then echo "JENKINS BUILD_TAG not defined, set to '-'" ; BUILD_TAG="NoTag" ; fi
if [ -z "$BUILD_NUMBER" ] ; then echo "JENKINS BUILD_NUMBER not defined, set to '0'" ; BUILD_NUMBER=0 ; fi
JENKINS_BUILD_TAG="${BUILD_TAG}"
echo "JENKINS_BUILD_TAG: ${JENKINS_BUILD_TAG}"
sed -i "s/@JENKINS_BUILD_TAG@/${JENKINS_BUILD_TAG}/g" qatar_buildings_buildingviewer.spec
if [ $? -ne 0 ]; then echo "sed command JENKINS_BUILD_TAG failed" ; fi
sed -i "s/@RELEASE@/${BUILD_NUMBER}/g" qatar_buildings_buildingviewer.spec
if [ $? -ne 0 ]; then echo "sed command RELEASE failed" ; fi
rpmbuild -bb --target=noarch qatar_buildings_buildingviewer.spec
if [ $? -ne 0 ]; then echo "rpmbuild command failed for spec 'qatar_buildings_${loc}_buildingviewer.spec'" ; fi
echo "rpmbuild... finished"
csv_cnt_sum=0
rpm_cnt_sum=0
csv_cnt=`cat import_${loc}.csv | grep -v "^#" | wc -l`
rpm_cnt=`rpm -ql ~/rpmbuild/RPMS/noarch/qatar_buildings_buildingviewer-${VERSION_STR}-0.noarch.rpm | grep flt.xml | wc -l`
echo -e "Comment: #bldgs: csv: $csv_cnt \t - rpm: $rpm_cnt \t at import_${loc}.csv"
csv_cnt_sum=$(($csv_cnt_sum + $csv_cnt))
rpm_cnt_sum=$(($rpm_cnt_sum + $rpm_cnt))
echo -e "Comment: #bldgs: csv: $csv_cnt_sum \t - rpm: $rpm_cnt_sum - Over all"
### echo "Comment: Problems of EGCU_CONF..."
### grep "EGCU pro Etage" vwm_adjustment.log | sort -u
### grep "EGCU pro Etage" vwm_adjustment.log | sort -u | wc -l
echo -e "Comment: Problems regarding wrong protectiveFactors at some files: cnt: $protectiveErrorCnt"
echo -e "Comment: Problems regarding duplicate Names at some files: cnt: $checkDuplicateNamesCnt"
## JENKINS?
if [ -z ${WORKSPACE} ]
then
echo "rpmbuild... move to - skipped"
else
echo "rpmbuild... move to "
echo "VERSION_STR = '$VERSION_STR'"
DST_DIR=${WORKSPACE}/rpms/
mkdir ${DST_DIR}
mv -v ~/rpmbuild/RPMS/noarch/qatar_buildings*$VERSION_STR*.rpm ${DST_DIR}
fi
@@ -0,0 +1,57 @@
# $Id$
# $HeadURL$
#
# Von Hand auszufuellen - Version und Release anpassen!
# import_ahtc.csv erzeugen (mittels convert_coordinates.py)
# "osgconv.sh ahtc"
# es wird ~/rpmbuild/SOURCES/ahtc_buildings_buildingviewer-1.0.0.tar.gz erzeugt, inklusive import_ahtc.csv
# rpmbuild -bb --target=noarch ahtc_buildings_buildingviewer.spec
#
%define real_name qatar_buildings_buildingviewer
Summary: QATAR Buildings for BuildingViewer
Name: %{real_name}
Version: @VERSION@
Release: 0
License: proprietary
Group: Applications/Resources
Source: %{real_name}-%{version}.tar.gz
Prefix: /
Vendor: Rheinmetall Electronics GmbH
URL: http://www.rheinmetall-defence.com
Packager: ctc
Provides: %{real_name}
AutoReqProv: no
%description
3D Models for QATAR Buildings / BuildingViewer
%changelog
#* date +"%a %b %d %Y" text
* Mon Mar 04 2024 Norbert Thoden
- initial
%prep
%setup -q
%build
echo "nothing to build"
# nothing to do here
%install
mkdir -p "%{buildroot}/opt/BuildingModels/"
mv %{_builddir}/%{buildsubdir}/* %{buildroot}/opt/BuildingModels/
%clean
%__rm -rf "%{buildroot}"
%files
%defattr(-,ctc,ctc,755)
/opt/BuildingModels/
%pre
%post
%preun
%postun
+50
View File
@@ -0,0 +1,50 @@
#!/bin/sh
#
# @RDE_HEADER@
# $Id$
# $HeadURL$
# $Author$
#
# Since 05-03-2024:
BLDGS="A1 A2 A3 A4"
numOk=0;
numFailure=0;
for BLDG in ${BLDGS}
do
echo "Bldg: '$BLDG':";
MyFile=`find ../QatarBuildings/buildings/ -iname "${BLDG}.flt.VWM_Building.xml"`
# BEFORE="Factor" ; AFTER="FACTOR"
BEFORE1="ExclusionZoneProtectiveFactor>20<" ; AFTER1="ExclusionZoneProtectiveFactor>0<"
BEFORE2="ExclusionZoneProtectiveFactor>50<" ; AFTER2="ExclusionZoneProtectiveFactor>20<"
BEFORE3="OuterWallProtectiveFactor>150<" ; AFTER3="OuterWallProtectiveFactor>200<"
BEFORE4="OuterWallProtectiveFactor>125<" ; AFTER4="OuterWallProtectiveFactor>200<"
cmd="sed -i -e 's/${BEFORE1}/${AFTER1}/' -e 's/${BEFORE2}/${AFTER2}/' -e 's/${BEFORE3}/${AFTER3}/' -e 's/${BEFORE4}/${AFTER4}/' ${MyFile}"
# Bei mehreren Expression erfolgt die Auswertung erfolgt von links nach rechts:
# echo AABB | sed -e 's/A/B/g' -e 's/B/X/g' -> XXXX
# Anderfalls wäre der output: BBXX
eval $cmd ;
if [ $? -ne 0 ]; then
((numFailure=numFailure+1))
echo " failure on -> '$BLDG' ";
echo "command failed, cmd= >>>$cmd<<<" ;
else
((numOk=numOk+1))
echo " cmd= >>>$cmd<<< successfull"
fi
done
echo " numOk = $numOk ";
echo " numFailure = $numFailure ";
@@ -0,0 +1,233 @@
// $Id$
// $HeadURL$
// $Author$
// Created by Manfred Gronak, 2021-03
var fs = require("fs");
var parser = require('xml2json');
var format = require('xml-formatter');
var util = require('util');
var path = require('path');
/****************** Hier editieren **********************/
// Verschiebung der BSM weiter weg von der Wand
var delta = 0.11;
/********************************************************/
module.exports = function() {
this.BSM_pos = function BSM_pos(OriginalxmlFile) {
var xmlFileNeu = OriginalxmlFile + "_neu";
var content = fs.readFileSync(OriginalxmlFile);
var lines = content + '';
lines = lines.split("\n");
// try to save the comment generated by Structure Explorer to be re-inserted later
var comment;
if (lines[2].includes('HdrLastDate')) {
comment = lines[2];
var idx = comment.lastIndexOf("-->");
if (idx > 10)
comment = [comment.slice(0, idx), "- PostProcessed by SLTE $Rev$", comment.slice(idx)].join('');
}
console.log("OriginalxmlFile=" + OriginalxmlFile);
console.log("Filename=" + path.basename(OriginalxmlFile) );
var FileNamesArray = path.basename(OriginalxmlFile).split('.');
var bldg_name = FileNamesArray[0];
console.log("bldg_name = '" + bldg_name + "'" );
const specialMovementArray = {
"bldg_3106_11005": "0.150012345678",
"bldg_3138_11003": "0.150012345678",
"bldg_3139_11010": "0.150012345678",
"bldg_3139_11011": "0.150012345678",
"bldg_3140_11004": "0.160012345678",
"bldg_3144_11008": "0.150012345678",
"bldg_3144_11010": "0.150012345678",
"bldg_3148_11006": "0.150012345678",
"bldg_3152_11006": "0.150012345678",
"bldg_3152_11007": "0.150012345678",
"bldg_3156_11022": "0.150012345678",
"bldg_3159_11012": "0.150012345678",
"bldg_2100_11002": "0.250012345678",
"bldg_4115_11003": "0.150012345678",
"bldg_4115_11005": "0.150012345678",
"bldg_4115_11006": "0.150012345678",
"bldg_4115_11007": "0.150012345678",
"bldg_4115_11017": "0.150012345678",
"bldg_4147_11012": "0.150012345678",
"bldg_4155_11003": "0.150012345678",
"bldg_4194_11002": "0.250012345678",
"bldg_4119_11007": "0.250012345678",
"bldg_4120_11008": "0.250012345678",
"bldg_4121_11010": "0.150012345678",
"bldg_4121_11014": "0.150012345678",
"bldg_4122_11009": "0.150012345678",
"bldg_4122_11012": "0.150012345678",
"bldg_4123_11001": "0.150012345678",
"bldg_4123_11003": "0.150012345678",
"bldg_4123_11013": "0.150012345678",
"bldg_4130_11006": "0.250012345678",
"bldg_4130_11008": "0.250012345678",
"bldg_4130_11009": "0.250012345678",
}
console.log("specialMovementArray " + util.inspect(specialMovementArray, {showHidden: false, depth: 2}));
var jsonFileInhalt = parser.toJson(content, {
reversible: true
});
var jsonContent = JSON.parse(jsonFileInhalt);
// start with "1" to skip bldg FOOTPRINT
var j;
for (j = 1; j < Object.keys(jsonContent.STREIF.Header.Group.Group).length; j++) {
// test, ob Element jsonContent.STREIF.Header.Group.Group[j] vorhanden ist
//console.log("0 SHGGS " + j + "-" + util.inspect(jsonContent.STREIF.Header.Group.Group[j], { showHidden: false, depth: 3}));
if (jsonContent.STREIF.Header.Group.Group[j].Switch) {
// console.log("1 SHGGS " + j + "-" + util.inspect(jsonContent.STREIF.Header.Group.Group[j].Switch, {showHidden: false, depth: 2}));
// in case of just a single room per floor,
// -> jsonContent.STREIF.Header.Group.Group[j].Switch is NOT an array
// -> jsonContent.STREIF.Header.Group.Group[j].Switch).length is undefined!
// ==> wrap into an array:
if (!Array.isArray(jsonContent.STREIF.Header.Group.Group[j].Switch)) {
// wrap obj into an array
var dummy = new Array;
dummy[0] = jsonContent.STREIF.Header.Group.Group[j].Switch;
jsonContent.STREIF.Header.Group.Group[j].Switch = dummy;
}
if (!Array.isArray(jsonContent.STREIF.Header.Group.Group[j].Switch))
console.log("Switch noArray at " + OriginalxmlFile);
var k;
for (k = 0; k < Object.keys(jsonContent.STREIF.Header.Group.Group[j].Switch).length; k++) {
// test, ob Elelemant jsonContent.STREIF.Header.Group.Group[j].Switch[k]] vorhanden ist
if (jsonContent.STREIF.Header.Group.Group[j].Switch[k]) {
//console.log("2 SHGGS " + util.inspect(jsonContent.STREIF.Header.Group.Group[j].Switch[k], {showHidden: false, depth: 1}));
console.log("2 SHGGS " + jsonContent.STREIF.Header.Group.Group[j].Switch[k].Name.$t);
if (jsonContent.STREIF.Header.Group.Group[j].Switch[k].Group == null) {
console.log("Missing GroupNode1 at " + OriginalxmlFile + ", Data:" + util.inspect(jsonContent.STREIF.Header.Group.Group[j].Switch[k], {showHidden: false, depth: 2}));
continue;
}
if (jsonContent.STREIF.Header.Group.Group[j].Switch[k].Group.External_Reference == null) {
console.log("Missing GroupNode2 at " + OriginalxmlFile + ", Data:" + util.inspect(jsonContent.STREIF.Header.Group.Group[j].Switch[k].Group, {showHidden: false, depth: 2}));
continue;
}
// convert object to array to enable forEach:
if (!Array.isArray(jsonContent.STREIF.Header.Group.Group[j].Switch[k].Group.External_Reference)){
jsonContent.STREIF.Header.Group.Group[j].Switch[k].Group.External_Reference = [jsonContent.STREIF.Header.Group.Group[j].Switch[k].Group.External_Reference]
}
if (!Array.isArray(jsonContent.STREIF.Header.Group.Group[j].Switch[k].Group.External_Reference))
console.log("External_Reference: noArray at " + OriginalxmlFile);
jsonContent.STREIF.Header.Group.Group[j].Switch[k].Group.External_Reference.forEach(extRef => {
console.log("XXXX current extRe " + util.inspect(extRef, { showHidden: false, depth: 3}));
var ID = ~~(extRef.SubId.ID / 1000);
if (ID == 11) {
var finalDelta = delta;
var idx = bldg_name + "_" +extRef.SubId.ID;
if (specialMovementArray[idx])
{
finalDelta = specialMovementArray[idx];
console.log("specialMovementArray: found, finalDelta= " + finalDelta);
}
console.log("adjust on item ..." + util.inspect(extRef, { showHidden: false, depth: 2 }));
extRef.Coord.X = parseFloat(extRef.Coord.X) + (finalDelta * parseFloat(extRef.Dir.X));
extRef.Coord.Y = parseFloat(extRef.Coord.Y) + (finalDelta * parseFloat(extRef.Dir.Y));
extRef.Coord.Z = parseFloat(extRef.Coord.Z) + (finalDelta * parseFloat(extRef.Dir.Z));
console.log("adjust on item " + util.inspect(extRef, { showHidden: false, depth: 2 }) + " done");
}
}); // forEach
}
}
}
}
// handle outdoor elements:
// console.log("outdoor SHGGS " + j + "-" + util.inspect(jsonContent.STREIF.Header.Group.External_Reference, { showHidden: false, depth: 3}));
if (!Array.isArray(jsonContent.STREIF.Header.Group.External_Reference)) {
jsonContent.STREIF.Header.Group.External_Reference = [jsonContent.STREIF.Header.Group.External_Reference]
}
jsonContent.STREIF.Header.Group.External_Reference.forEach(extRef => {
// console.log("outdoor current extRe " + util.inspect(extRef, { showHidden: false, depth: 3}));
var ID = ~~(extRef.SubId.ID / 1000);
if (ID == 11) {
var finalDelta = delta;
var idx = bldg_name + "_" +extRef.SubId.ID;
if (specialMovementArray[idx])
{
finalDelta = specialMovementArray[idx];
console.log("specialMovementArray: found, finalDelta= " + finalDelta);
}
console.log("outdoor: adjust on item ..." + util.inspect(extRef, { showHidden: false, depth: 2 }));
extRef.Coord.X = parseFloat(extRef.Coord.X) + (finalDelta * parseFloat(extRef.Dir.X));
extRef.Coord.Y = parseFloat(extRef.Coord.Y) + (finalDelta * parseFloat(extRef.Dir.Y));
extRef.Coord.Z = parseFloat(extRef.Coord.Z) + (finalDelta * parseFloat(extRef.Dir.Z));
console.log("outdoor: adjust on item " + util.inspect(extRef, { showHidden: false, depth: 2 }) + " done");
}
}); // forEach
var Rooms = jsonContent;
var stringified = JSON.stringify(Rooms);
var ausgabe = parser.toXml(stringified);
if (comment)
var formattedXml = '<?xml version="1.0" ?>' + '\n' + comment + '\n' + format(ausgabe, {
collapseContent: true,
lineSeparator: '\n'
});
else
var formattedXml = '<?xml version="1.0" ?>' + '\n' + format(ausgabe, {
collapseContent: true,
lineSeparator: '\n'
});
// Renoir-repos has xml files without svn:eol-style.
// So 'svn co' will create files with CR+LF (Windows EOL)
// To enable an svn diff showingf only the real differences, write with CR+LF:
// write to < OriginalxmlFile | xmlFileNeu >
fs.writeFileSync(OriginalxmlFile, formattedXml, function(err) {
// If an error occurred, show it
if (err) {
console.log("Error on writing file: " + OriginalxmlFile);
console.err(err);
}
});
} // end of function
} // export
@@ -0,0 +1,160 @@
// $Id$
// $HeadURL$
// $Author$
// Created by Manfred Gronak, , 2021-04
var fs = require("fs");
var path = require("path");
var parser = require('xml2json');
var util = require("util");
var stableSort = (arr, compare) => arr
.map((item, index) => ({
item,
index
}))
.sort((a, b) => compare(a.item, b.item) || a.index - b.index)
.map(({
item
}) => item)
module.exports = function() {
this.EGCU_conf = function EGCU_conf(OriginalxmlFile) {
// console.log("EGCU_CONF: orgFile", OriginalxmlFile);
//OriginalxmlFile = ../GuezBuildings/buildings/bldg_1235/bldg_1235.flt.xml
// dirname = ../GuezBuildings/buildings/bldg_1235
// basename = bldg_1235
// newname ../GuezBuildings/buildings/bldg_1235/bldg_1235.egcu.xml
var dirname = path.dirname(OriginalxmlFile);
var basename = path.basename(OriginalxmlFile, '.flt.xml');
var newFileName = dirname + '/' + basename + '.egcu2room.xml';
var content = fs.readFileSync(OriginalxmlFile);
var jsonFileInhalt = parser.toJson(content);
var jsonContent = JSON.parse(jsonFileInhalt);
var numberOfBDI = 0;
var BDI_Elements_Raw = [];
// convert object to array to enable forEach:
if (!Array.isArray(jsonContent.STREIF.Header.Group.External_Reference)){
jsonContent.STREIF.Header.Group.External_Reference = [jsonContent.STREIF.Header.Group.External_Reference]
}
jsonContent.STREIF.Header.Group.External_Reference.forEach(Element => {
if (Element.Name.substring(0, 6) == 'BDI_P_') {
BDI_Elements_Raw.push(Element);
numberOfBDI = numberOfBDI + 1;
}
});
var BDI_Elements = stableSort(BDI_Elements_Raw, (a, b) => a.Coord.Z - b.Coord.Z);
var Switch_Elements = [];
jsonContent.STREIF.Header.Group.Group.forEach(Group => {
Switch_Elements.push(Group.Switch);
});
var i;
var Rooms = [];
for (i = 1; i < Object.keys(Switch_Elements).length; i++) {
var j;
if (util.isArray(Switch_Elements[i])) {
// console.log(Object.keys(Switch_Elements[i]).length);
for (j = 0; j < Object.keys(Switch_Elements[i]).length; j++) {
Rooms.push(Switch_Elements[i][j]);
}
} else {
Rooms.push(Switch_Elements[i]);
}
}
console.log("Test auf mindestens EGCU in einer Etage... ");
// Test auf mindestens EGCU in einer Etage
BDI_Elements.forEach(BDI => {
var k = 0;
BDI_Elements.forEach(BDI2 => {
if (parseInt(BDI.Coord.Z) == parseInt(BDI2.Coord.Z))
k = k + 1;
});
if (k > 1) {
console.log("EGCU_CONF: mehr als eine EGCU pro Etage " + OriginalxmlFile + " -> " + k);
// process.exit();
}
});
var EgcuToRooms = "<EgcusToRooms>\n";
var z = 0;
BDI_Elements.forEach(BDI => {
z = z + 1;
EgcuToRooms = EgcuToRooms + " <Egcu>\n <Mountpoint>\n";
EgcuToRooms = EgcuToRooms + " <Name>" + BDI.Name + "</Name>\n";
EgcuToRooms = EgcuToRooms + " <SubId>" + BDI.SubId.ID + "</SubId>\n";
EgcuToRooms = EgcuToRooms + " </Mountpoint>\n <Rooms>\n";
Rooms.forEach(Room => {
console.log("Room === " + util.inspect(Room, { showHidden: false, depth: 3}));
if (Object.keys(BDI_Elements).length == 1) {
if (typeof(Room) !== 'undefined') {
EgcuToRooms = EgcuToRooms + " <Name>" + Room.Name + "</Name>\n";
EgcuToRooms = EgcuToRooms + " <SubId>" + Room.SubId.ID + "</SubId>\n";
}
} else {
if (typeof(Room) !== 'undefined') {
console.log("XXXX Room === " + util.inspect(Room, { showHidden: false, depth: 3}));
console.log("XXXX BDI === " + util.inspect(BDI, { showHidden: false, depth: 3}));
var difference = BDI.Coord.Z - Room.Group.BBox_Min.Z;
if (parseInt(difference) == 0) {
EgcuToRooms = EgcuToRooms + " <Name>" + Room.Name + "</Name>\n";
EgcuToRooms = EgcuToRooms + " <SubId>" + Room.SubId.ID + "</SubId>\n";
}
if (numberOfBDI == z) {
if (parseInt(difference) < 0) {
EgcuToRooms = EgcuToRooms + " <Name>" + Room.Name + "</Name>\n";
EgcuToRooms = EgcuToRooms + " <SubId>" + Room.SubId.ID + "</SubId>\n";
}
}
} // if
} // if
});
EgcuToRooms = EgcuToRooms + " </Rooms>\n </Egcu>\n"
});
EgcuToRooms = EgcuToRooms + '</EgcusToRooms>\n';
console.log(newFileName);
// console.log(EgcuToRooms);
fs.writeFileSync(newFileName, EgcuToRooms, function(err) {
// If an error occurred, show it and return
console.log("EgcuToRooms.xml geschrieben")
if (err) return console.error(err);
// Successfully wrote binary contents to the file!
});
}
}
@@ -0,0 +1,104 @@
// $Id$
// $HeadURL$
// $Author$
// Created by Manfred Gronak, , 2021-03
const fs = require('fs');
// require ('./analyse_vmw_file.js')();
require ('./replace_transistion_factors.js')();
require('./BSM_pos.js')();
require('./egcu_conf.js')();
require('./vwmXmlToVrmlWrl.js')();
require('./simplify_polygons.js')();
var myArgs = process.argv.slice(2);
console.log('myArgs: ', myArgs);
// const GUEZ_DIR = '/media/tbox/423F-1127/DATENGEBAEUDE_GUEZ';
// const GUEZ_DIR = '/shd/CTC/TOOLS/GuezBuildings/buildingsXXXXX';
const GUEZ_DIR = myArgs[0];
console.log('adjust file at directory: ', GUEZ_DIR);
/*****************************************************************************************/
fs.readdir(GUEZ_DIR, (err, files) => {
if (err) return console.error(err);
var DirNames = files.toString();
var DirNamesArray = DirNames.split(',');
DirNamesArray.forEach(DirName => {
// the directory ist not 'bldg_1101' ; it is 'A1'
if (DirName.substring(0, 1) == 'A') {
console.log("Working at directory: " + DirName);
if ( (DirName == 'bldg_1141n') ||
(DirName == 'bldg_1102_Treppen') )
{
console.log("Skip subdir '", DirName + "'");
return;
}
fs.readdir(GUEZ_DIR + '/' + DirName, (err, subdir_files) => {
if (err) return console.error(err);
var SubDirNames = subdir_files.toString();
var FileNamesArray = SubDirNames.split(',');
FileNamesArray.forEach(FileName => {
var FileNamePartArray = FileName.split('.');
console.log("process file: ", FileNamePartArray);
// if (FileNamePartArray[0] == 'bldg_1199' && FileNamePartArray[2] == 'VWM_Building' && FileNamePartArray[3] == 'xml' && FileNamePartArray.length == 4) {
if (FileNamePartArray[2] == 'VWM_Building' && FileNamePartArray[3] == 'xml' && FileNamePartArray.length == 4) {
var File_Path = GUEZ_DIR + '/' + DirName + '/' + FileName;
console.log("XXXXX1 File_Path: " + File_Path );
simplify_polygons(File_Path); // Aktiviert wg. blgd_0910_Raum2201_Wall0 (8 vertex -> 4) - GUEZE-1004
console.log("XXXXX2 File_Path: " + File_Path );
replace_transistion_factors(File_Path);
// create wrl files (VRML). Usefull to find missing outerwalls:
console.log("XXXXX3 File_Path: " + File_Path );
VwmXmlToWrl(File_Path)
} // end if
// return; // For AHTC, BSM, EGCU do not exist
if (FileNamePartArray[1] == 'flt' && FileNamePartArray[2] == 'xml' && FileNamePartArray.length == 3) {
var File_Path = GUEZ_DIR + '/' + DirName + '/' + FileName;
console.log("XXXXX4 File_Path: " + File_Path );
BSM_pos(File_Path);
}
if (FileNamePartArray[1] == 'flt' && FileNamePartArray[2] == 'xml' && FileNamePartArray.length == 3) {
var File_Path = GUEZ_DIR + '/' + DirName + '/' + FileName;
console.log("XXXXX5 File_Path: " + File_Path );
EGCU_conf(File_Path);
}
});
}); // readdir
} // end if
});
});
@@ -0,0 +1,287 @@
// $Id$
// $HeadURL$
// $Author$
// Created by Manfred Gronak, 2021-03
const fs = require('fs');
var parser = require('xml2json');
var js2xmlparser = require('js2xmlparser');
var format = require('xml-formatter');
var util = require('util');
/****************** Hier editieren **********************/
// Das ist der Transistion Factor, der für alle vertikalen Transitionen eingetragen werden soll
// Muss ausgetestet werden.
var TransitionFactor_vertical = 0.15;
var TransitionFactor_horizontal_min = 0.03; // former MG=0.1
var TransitionFactor_horizontal_min_limit = 0.03;
var BelowGroundBldgs = ['U_Bahn', 'xxx'];
/*****************************************************************************************/
module.exports = function() {
this.replace_transistion_factors = function replace_transistion_factors(xmlFile) {
const OriginalVWMFile = xmlFile;
var content = fs.readFileSync(OriginalVWMFile);
var jsonFileInhalt;
var jsonContent;
try {
jsonFileInhalt = parser.toJson(content);
jsonContent = JSON.parse(jsonFileInhalt);
} catch (e) {
console.log("Parsing error bei Datei " + OriginalVWMFile + " -> " + e.message); // Datei geschrieben
return;
}
var BuildingName = jsonContent.BuildingVulnerability.BuildingName;
BuildingName = BuildingName.substring(5); // bldg_U_Bahn -> U_Bahn
if (BelowGroundBldgs.includes(BuildingName))
{
console.log("BuildingName '" + BuildingName + "' -> use special values (like TransistionFactors)");
TransitionFactor_vertical = 0.129988;
TransitionFactor_horizontal_min = 0.129999; // U-Bahn
}
// try to save the comment generated by Structure Explorer to be re-inserted later
var lines = content + '';
lines = lines.split("\n");
var comment;
if (lines[2].includes('HdrLastDate')) {
comment = lines[2];
var idx = comment.lastIndexOf("-->");
if (idx > 10)
comment = [comment.slice(0, idx), "- PostProcessed by SLTE $Rev$", comment.slice(idx)].join('');
}
var i;
var RoomId;
var NeighborRoomRoomId;
var index;
var RoomArray = jsonContent.BuildingVulnerability.Rooms.Room;
if (RoomArray == null) {
console.log("Datei " + OriginalVWMFile + ": " + " WARNING, no RoomArray detected");
return;
}
console.log("Datei " + OriginalVWMFile + ": " + Object.keys(jsonContent.BuildingVulnerability.Rooms.Room).length + " Rooms detected");
if (Array.isArray(jsonContent.BuildingVulnerability.Rooms.Room)) {
// console.log("1Array: ");
} else {
// No Array..
// wrap obj into an array to ensure 'RoomArray.forEach(...'
var dummy = new Array;
dummy[0] = jsonContent.BuildingVulnerability.Rooms.Room;
jsonContent.BuildingVulnerability.Rooms.Room = dummy;
}
// check number of floors:
var maxfloor = -1;
var roomsPerFloor = new Map;
for (i = 0; i < Object.keys(jsonContent.BuildingVulnerability.Rooms.Room).length; i++) {
console.log("RaumID " + jsonContent.BuildingVulnerability.Rooms.Room[i].RoomId);
var floor = ~~(jsonContent.BuildingVulnerability.Rooms.Room[i].RoomId - 2000);
floor = ~~(floor / 100);
console.log(" floor=" + floor);
if (floor > maxfloor)
maxfloor = floor;
var maxRoomNumber = jsonContent.BuildingVulnerability.Rooms.Room[i].RoomId - 2000;
maxRoomNumber = maxRoomNumber - (floor*100.0);
console.log(" maxRoomNumber " + maxRoomNumber + " (" + jsonContent.BuildingVulnerability.Rooms.Room[i].RoomId + ")");
console.log(" roomsPerFloor " + ", Data:" + util.inspect(roomsPerFloor, {showHidden: false, depth: 2}));
console.log(" roomsPerFloor " + roomsPerFloor);
if (!roomsPerFloor.has(floor))
roomsPerFloor.set(floor, 0);
if (maxRoomNumber > roomsPerFloor.get(floor))
{
console.log(" update: maxRoomNumber=" + maxRoomNumber + " at floor " + floor);
roomsPerFloor.set(floor, maxRoomNumber);
}
}
console.log("maxfloor " + maxfloor);
var removeCandidates = new Array;
for (i = 0; i < Object.keys(jsonContent.BuildingVulnerability.Rooms.Room).length; i++) {
// Reduzierung auf die Etage
// console.log("RaumID" + jsonContent.BuildingVulnerability.Rooms.Room[i].RoomId);
if (jsonContent.BuildingVulnerability.Rooms.Room[i] == null) {
console.log("Missing RoomId at " + OriginalVWMFile);
continue;
}
RoomId = ~~(jsonContent.BuildingVulnerability.Rooms.Room[i].RoomId / 100);
// console.log(RoomId);
var j;
// console.log(jsonContent.BuildingVulnerability.Rooms.Room[i].NeighborRooms);
// Test, ob ein Raum keine Nachbarraeume hat. Wenn dann entfernen
if (!jsonContent.BuildingVulnerability.Rooms.Room[i].NeighborRooms.NeighborRoom) {
var roomToBeRemove = ~~(jsonContent.BuildingVulnerability.Rooms.Room[i].RoomId - 2000);
var roomFloor = ~~(roomToBeRemove / 100);
// Nur oberste Etage, nur wenn mehr als eine Etage:
if (roomFloor == maxfloor && roomsPerFloor.size > 1) {
console.log("Element RoomId " + jsonContent.BuildingVulnerability.Rooms.Room[i].RoomId + " muesste entfernt werden at: " + OriginalVWMFile + " (maxfloor=" + maxfloor + ", rooms at previous floor:" + roomsPerFloor.get(maxfloor-1) + "m i=" + i +")");
removeCandidates.push({'roomToBeRemovedCandidateIdx' : i, 'roomToBeRemovedCandidateRoomNumber' : jsonContent.BuildingVulnerability.Rooms.Room[i].RoomId});
// // delete jsonContent.BuildingVulnerability.Rooms.Room[i];
} else
console.log("Skip Element RoomId " + jsonContent.BuildingVulnerability.Rooms.Room[i].RoomId + " wird entfernt at: " + OriginalVWMFile + " (maxfloor=" + maxfloor + ")");
} else {
//console.log(Object.keys(jsonContent.BuildingVulnerability.Rooms.Room[0].NeighborRooms.NeighborRoom).length);
for (j = 0; j < Object.keys(jsonContent.BuildingVulnerability.Rooms.Room[i].NeighborRooms.NeighborRoom).length; j++) {
// console.log(jsonContent.BuildingVulnerability.Rooms.Room[0].NeighborRooms.NeighborRoom.NeighborRoom.RoomId);
// Test, ob Raeume in der gleiche Etage liegen. Wenn nicht dann Transistion Faktoren einschreiben
// console.log(Object.keys(jsonContent.BuildingVulnerability.Rooms.Room[i].NeighborRooms.NeighborRoom).length);
if (Object.keys(jsonContent.BuildingVulnerability.Rooms.Room[i].NeighborRooms.NeighborRoom).length == 1) {
NeighborRoomId = ~~(jsonContent.BuildingVulnerability.Rooms.Room[i].NeighborRooms.NeighborRoom.NeighborRoom.RoomId / 100);
if (RoomId != NeighborRoomId)
jsonContent.BuildingVulnerability.Rooms.Room[i].NeighborRooms.NeighborRoom.NeighborRoom.TransitionFactor = TransitionFactor_vertical;
else {
if (jsonContent.BuildingVulnerability.Rooms.Room[i].NeighborRooms.NeighborRoom.NeighborRoom.TransitionFactor <= TransitionFactor_horizontal_min)
jsonContent.BuildingVulnerability.Rooms.Room[i].NeighborRooms.NeighborRoom.NeighborRoom.TransitionFactor = TransitionFactor_horizontal_min;
}
} else {
if (typeof jsonContent.BuildingVulnerability.Rooms.Room[i].NeighborRooms.NeighborRoom[j] !== 'undefined') {
// console.log(jsonContent.BuildingVulnerability.Rooms.Room[i].NeighborRooms.NeighborRoom[j].RoomId);
NeighborRoomId = ~~(jsonContent.BuildingVulnerability.Rooms.Room[i].NeighborRooms.NeighborRoom[j].RoomId / 100);
if (RoomId != NeighborRoomId)
jsonContent.BuildingVulnerability.Rooms.Room[i].NeighborRooms.NeighborRoom[j].TransitionFactor = TransitionFactor_vertical;
else {
if (jsonContent.BuildingVulnerability.Rooms.Room[i].NeighborRooms.NeighborRoom[j].TransitionFactor <= TransitionFactor_horizontal_min)
jsonContent.BuildingVulnerability.Rooms.Room[i].NeighborRooms.NeighborRoom[j].TransitionFactor = TransitionFactor_horizontal_min;
}
} else { // if undefined
// console.log("NeighborRooms.NeighborRoom is undefined at: " + OriginalVWMFile);
// relevant for bldg_salchau_tunnel.flt.VWM_Building.xml, bldg_BN_Kanaele and many more (78 files at this moment)
jsonContent.BuildingVulnerability.Rooms.Room[i].NeighborRooms.NeighborRoom.TransitionFactor = TransitionFactor_vertical;
}
} // if
} // for
}
}
// check
if (Object.keys(removeCandidates).length > 0) {
// how can we process 2 rooms at the roof ??? (like Guez bldg_2101)
if (Object.keys(removeCandidates).length > 1) {
console.log("ERROR at " + OriginalVWMFile + " : adding neighbor failed, more then one removeCandidates: size=" + Object.keys(removeCandidates).length);
} else {
removeCandidates.forEach(item => {
var roomToBeRemovedCandidateIdx = item.roomToBeRemovedCandidateIdx;
var roomToBeRemovedCandidateRoomNumber = item.roomToBeRemovedCandidateRoomNumber;
if (roomToBeRemovedCandidateIdx > 0)
{
console.log("roomToBeRemovedCandidateIdx=" + roomToBeRemovedCandidateIdx + ", roomToBeRemovedCandidateRoomNumber=" + roomToBeRemovedCandidateRoomNumber);
// console.log("NeighborRooms " + util.inspect(jsonContent.BuildingVulnerability.Rooms.Room[roomToBeRemovedCandidateIdx-1], {showHidden: false, depth: 3}));
// console.log("NeighborRooms " + Object.keys(jsonContent.BuildingVulnerability.Rooms.Room[roomToBeRemovedCandidateIdx-1].NeighborRooms.NeighborRoom).length );
var lowerRoomId = jsonContent.BuildingVulnerability.Rooms.Room[roomToBeRemovedCandidateIdx-1].RoomId;
// add lower to topmost room:
{
// console.log("jsonContent11 " + util.inspect(jsonContent.BuildingVulnerability.Rooms.Room[roomToBeRemovedCandidateIdx], {showHidden: false, depth: 5}));
if (typeof jsonContent.BuildingVulnerability.Rooms.Room[roomToBeRemovedCandidateIdx].NeighborRooms.NeighborRoom == 'undefined') {
// expected:
console.log(OriginalVWMFile + ", adding neighbor, part 1: lowerRoomId=" + lowerRoomId + " to topmost room=" + roomToBeRemovedCandidateRoomNumber );
jsonContent.BuildingVulnerability.Rooms.Room[roomToBeRemovedCandidateIdx].NeighborRooms['NeighborRoom'] = [ {"RoomId": lowerRoomId, "TransitionFactor": 0.99999} ];
} else {
console.log("ERROR at " + OriginalVWMFile + " : adding neighbor part 1");
}
// console.log("jsonContent22 " + util.inspect(jsonContent.BuildingVulnerability.Rooms.Room[roomToBeRemovedCandidateIdx], {showHidden: false, depth: 5}));
}
// add topmost to lower:
{
// console.log("jsonContent33 " + util.inspect(jsonContent.BuildingVulnerability.Rooms.Room[roomToBeRemovedCandidateIdx-1], {showHidden: false, depth: 3}));
if (Array.isArray(jsonContent.BuildingVulnerability.Rooms.Room[roomToBeRemovedCandidateIdx-1].NeighborRooms.NeighborRoom))
{
// expected:
console.log(OriginalVWMFile + ", adding neighbor, part 2a: to lower room : " + jsonContent.BuildingVulnerability.Rooms.Room[roomToBeRemovedCandidateIdx-1].RoomId);
jsonContent.BuildingVulnerability.Rooms.Room[roomToBeRemovedCandidateIdx-1].NeighborRooms.NeighborRoom.push({"RoomId": roomToBeRemovedCandidateRoomNumber, "TransitionFactor": 0.99999});
} else {
console.log(OriginalVWMFile + ", adding neighbor, part 2b: to lower room : " + jsonContent.BuildingVulnerability.Rooms.Room[roomToBeRemovedCandidateIdx-1].RoomId);
jsonContent.BuildingVulnerability.Rooms.Room[roomToBeRemovedCandidateIdx-1].NeighborRooms.NeighborRoom = [{"RoomId": roomToBeRemovedCandidateRoomNumber, "TransitionFactor": 0.99999}];
}
// console.log("jsonContent44 " + util.inspect(jsonContent.BuildingVulnerability.Rooms.Room[roomToBeRemovedCandidateIdx-1], {showHidden: false, depth: 3}));
}
} // if
}) // forEach
} // if
}// if
// delete jsonContent.BuildingVulnerability.Rooms.Room[index].NeighborRooms.NeighborRoom.NeighborRoom;
// jsonContent.BuildingVulnerability.Rooms.Room[index].NeighborRooms.NeighborRoom["TransitionFactor"] = TransitionFactor_vertical;
// jsonContent.BuildingVulnerability.Rooms.Room[index].NeighborRooms.NeighborRoom["RoomId"] = NeighborRoomRoomId;
var Rooms = jsonContent.BuildingVulnerability;
var ausgabe = js2xmlparser.parse("BuildingVulnerability", Rooms);
if (comment) {
var idxOfLine = ausgabe.indexOf("<BuildingName>")
// console.log("idxOfLine: " + idxOfLine);
var ausgabe2 = [ausgabe.slice(0, idxOfLine), comment, ausgabe.slice(idxOfLine)].join('');
ausgabe = ausgabe2;
}
var formattedXml = format(ausgabe, {
collapseContent: true,
lineSeparator: '\n'
});
fs.writeFileSync(OriginalVWMFile, formattedXml, function(err) {
// If an error occurred, show it
if (err) {
console.log("Error on writing file: " + OriginalVWMFile);
console.err(err);
}
});
}
/********************************************************************************************************/
} // end exports
@@ -0,0 +1,356 @@
// $Id$
// $HeadURL$
// $Author$
// Created by Norbert Thoden, 2021-12-22
const fs = require('fs');
var parser = require('xml2json');
var js2xmlparser = require('js2xmlparser');
var format = require('xml-formatter');
var util = require('util');
/****************** Hier editieren **********************/
var BelowGroundBldgs = ['U_Bahn', 'xxx'];
var tolerance = 0.1;
var highQuality = true;
/*****************************************************************************************/
/*****************************************************************************************/
/*****************************************************************************************/
/*****************************************************************************************/
/*
* (c) 2013, Vladimir Agafonkin
* Simplify.js, a high-performance JS polyline simplification library
* mourner.github.io/simplify-js
*/
// to suit your point format, run search/replace for '.x', '.y' and '.z';
// (configurability would draw significant performance overhead)
// square distance between 2 points
function getSquareDistance(p1, p2) {
var dx = p1.X - p2.X,
dy = p1.Y - p2.Y,
dz = p1.Z - p2.Z;
return dx * dx + dy * dy + dz * dz;
}
// square distance from a point to a segment
function getSquareSegmentDistance(p, p1, p2) {
var x = p1.X,
y = p1.Y,
z = p1.Z,
dx = p2.X - x,
dy = p2.Y - y,
dz = p2.Z - z;
if (dx !== 0 || dy !== 0 || dz !== 0) {
var t = ((p.X - x) * dx + (p.Y - y) * dy + (p.Z - z) * dz) /
(dx * dx + dy * dy + dz * dz);
if (t > 1) {
x = p2.X;
y = p2.Y;
z = p2.Z;
} else if (t > 0) {
x += dx * t;
y += dy * t;
z += dz * t;
}
}
dx = p.X - x;
dy = p.Y - y;
dz = p.Z - z;
return dx * dx + dy * dy + dz * dz;
}
// the rest of the code doesn't care for the point format
// basic distance-based simplification
function simplifyRadialDistance(points, sqTolerance) {
var prevPoint = points[0],
newPoints = [prevPoint],
point;
for (var i = 1, len = points.length; i < len; i++) {
point = points[i];
if (getSquareDistance(point, prevPoint) > sqTolerance) {
newPoints.push(point);
prevPoint = point;
}
}
if (prevPoint !== point) {
newPoints.push(point);
}
return newPoints;
}
// simplification using optimized Douglas-Peucker algorithm with recursion elimination
function simplifyDouglasPeucker(points, sqTolerance) {
var len = points.length,
MarkerArray = typeof Uint8Array !== 'undefined' ? Uint8Array : Array,
markers = new MarkerArray(len),
first = 0,
last = len - 1,
stack = [],
newPoints = [],
i, maxSqDist, sqDist, index;
markers[first] = markers[last] = 1;
while (last) {
maxSqDist = 0;
for (i = first + 1; i < last; i++) {
sqDist = getSquareSegmentDistance(points[i], points[first], points[last]);
if (sqDist > maxSqDist) {
index = i;
maxSqDist = sqDist;
}
}
if (maxSqDist > sqTolerance) {
markers[index] = 1;
stack.push(first, index, index, last);
}
last = stack.pop();
first = stack.pop();
}
for (i = 0; i < len; i++) {
if (markers[i]) {
newPoints.push(points[i]);
}
}
return newPoints;
}
function simplify(points, tolerance, highestQuality) {
var sqTolerance = tolerance !== undefined ? tolerance * tolerance : 1;
points = highestQuality ? points : simplifyRadialDistance(points, sqTolerance);
points = simplifyDouglasPeucker(points, sqTolerance);
return points;
}
/*****************************************************************************************/
/*****************************************************************************************/
/*****************************************************************************************/
module.exports = function() {
this.simplify_polygons = function simplify_polygons(xmlFile) {
const OriginalVWMFile = xmlFile;
var content = fs.readFileSync(OriginalVWMFile);
var jsonFileInhalt;
var jsonContent;
try {
jsonFileInhalt = parser.toJson(content);
jsonContent = JSON.parse(jsonFileInhalt);
} catch (e) {
console.log("Parsing error bei Datei " + OriginalVWMFile + " -> " + e.message); // Datei geschrieben
return;
}
var BuildingName = jsonContent.BuildingVulnerability.BuildingName;
BuildingName = BuildingName.substring(5); // bldg_U_Bahn -> U_Bahn
var RoomArray = jsonContent.BuildingVulnerability.Rooms.Room;
if (RoomArray == null) {
console.log("Datei " + OriginalVWMFile + ": " + " WARNING, no RoomArray detected");
return;
}
if (!Array.isArray(RoomArray)){
RoomArray = [RoomArray]
}
console.log("Datei " + OriginalVWMFile + ": " + Object.keys(jsonContent.BuildingVulnerability.Rooms.Room).length + " Rooms detected");
console.log("Datei " + OriginalVWMFile + ": " + RoomArray.length + " Rooms detected");
RoomArray.forEach(Room => {
// console.log("Bldg " + BuildingName + " - RoomId: " + Room.RoomId);
var OuterWallArray = Room.RoomOuterWalls.OuterWall;
//sometimes there are no walls: OuterWallArray is undefined
if (!OuterWallArray)
{
console.log("Bldg " + BuildingName + " / room " + Room.RoomId + " has no walls") ;
return;
}
if (!Array.isArray(OuterWallArray)){
OuterWallArray = [OuterWallArray]
}
if (!OuterWallArray)
{
console.log("Bldg " + BuildingName + " / room " + Room.RoomId + " has no walls") ;
return;
}
var wallIdx =-1;
OuterWallArray.forEach(Outerwall => {
wallIdx++;
// console.log(" Outerwall " + "idx=" + wallIdx + " : " + util.inspect(Outerwall, {showHidden: false, depth: 3}));
//
// Wall itself
//
// console.log(" Outerwall: " + Outerwall.OuterWallAreaElement);
var PolygonPoints = Outerwall.OuterWallAreaElement.PolygonPoint;
var polyLengthOrg = PolygonPoints.length;
// console.log(" WALL PolygonPoints-Org= " + polyLengthOrg) ;
// console.log(" WALL data=" + util.inspect(PolygonPoints, {showHidden: false, depth: 2}));
PolygonPoints.forEach(PolygonPoint => {
PolygonPoint.X = parseFloat(PolygonPoint.X);
PolygonPoint.Y = parseFloat(PolygonPoint.Y);
PolygonPoint.Z = parseFloat(PolygonPoint.Z);
//console.log(" WALL Point= " + PolygonPoint.X + " " + PolygonPoint.Y + " " + PolygonPoint.Z) ;
});
// There are some walls/rectangles with a very short side (~10cm). Most of them are correct.
// Avoid them being modified to a triangle/line:
if (PolygonPoints.length > 4)
{
PolygonPoints = simplify(PolygonPoints, tolerance, highQuality);
var polyLengthNew = PolygonPoints.length;
// console.log(" PolygonPoints-New= " + polyLengthNew) ;
if (polyLengthOrg != polyLengthNew)
console.log(" WALL Bldg " + BuildingName + " / room " + Room.RoomId + " / wallIdx " + wallIdx + ": " + " Outerwall: length changes from " + polyLengthOrg + " to " + polyLengthNew);
// console.log(" data=" + util.inspect(PolygonPoints, {showHidden: false, depth: 2}));
// PolygonPoints.forEach(PolygonPoint => {
// console.log(" Point= " + PolygonPoint.X + " " + PolygonPoint.Y + " " + PolygonPoint.Z) ;
// });
// write simplified data back:
Outerwall.OuterWallAreaElement.PolygonPoint = PolygonPoints;
} else {
console.log(" WALL Bldg " + BuildingName + " / room " + Room.RoomId + " / wallIdx " + wallIdx + ": Skip due to short length: " + polyLengthOrg);
}
//
// ExclusionZones bldg_1199 is complex and therefore good for verification
//
{
// node: Outerwall has ExclusionZones:
// console.log(" ---- ExclZone ExclusionZonesArray= " + util.inspect(Outerwall.ExclusionZones, {showHidden: false, depth: 4}));
var ExclusionZonesArray = Outerwall.ExclusionZones.ExclusionZone;
if (!ExclusionZonesArray)
return;
if (!Array.isArray(ExclusionZonesArray)) {
ExclusionZonesArray = [ExclusionZonesArray]
}
// console.log(" ExclZone ExclusionZonesArray.length= " + ExclusionZonesArray.length);
var EzIdx =-1;
ExclusionZonesArray.forEach(ExclusionZone => {
EzIdx++;
// console.log(" ExclZone ---- ExclusionZone " + "EzIdx=" + EzIdx + " : " + util.inspect(ExclusionZone, {showHidden: false, depth: 3}));
var ExclZonePolygonPoints = ExclusionZone.ExclusionZoneElement.PolygonPoint;
var polyLengthOrg = ExclZonePolygonPoints.length;
// console.log(" ExclZone ExclZonePolygonPoints-Org=" + polyLengthOrg + " (Bldg " + BuildingName + " / room " + Room.RoomId + ")") ;
// console.log(" ExclZone data=" + util.inspect(ExclZonePolygonPoints, {showHidden: false, depth: 2}));
ExclZonePolygonPoints.forEach(PolygonPoint => {
PolygonPoint.X = parseFloat(PolygonPoint.X);
PolygonPoint.Y = parseFloat(PolygonPoint.Y);
PolygonPoint.Z = parseFloat(PolygonPoint.Z);
//console.log(" ExclZone Point= " + PolygonPoint.X + " " + PolygonPoint.Y + " " + PolygonPoint.Z) ;
});
// Maybe in future there will be some ExclZone/rectangles with a very short side (~10cm)...
// Avoid them being modified to a triangle/line:
if (ExclZonePolygonPoints.length > 4)
{
ExclZonePolygonPoints = simplify(ExclZonePolygonPoints, tolerance, highQuality);
var polyLengthNew = ExclZonePolygonPoints.length;
// console.log(" ExclZone ExclZonePolygonPoints-New= " + polyLengthNew) ;
if (polyLengthOrg != polyLengthNew)
console.log(" ExclZone Bldg " + BuildingName + " / room " + Room.RoomId + " / wallIdx " + wallIdx + " / EzIdx " + EzIdx + ": " + " ExclZone: length changes from " + polyLengthOrg + " to " + polyLengthNew) ;
// write simplified data back, part 1:
ExclusionZone.ExclusionZoneElement.PolygonPoint = ExclZonePolygonPoints; //CHECK (e.g. bldg_1199)
} else {
console.log(" ExclZone Bldg " + BuildingName + " / room " + Room.RoomId + " / wallIdx " + wallIdx + " / EzIdx " + EzIdx + ": " + " Skip due to short length: " + polyLengthOrg) ;
}
});
// write simplified data back, part 2:
Outerwall.ExclusionZones.ExclusionZone = ExclusionZonesArray //CHECK (e.g. bldg_1199)
}
});
});
var Rooms = jsonContent.BuildingVulnerability;
var ausgabe = js2xmlparser.parse("BuildingVulnerability", Rooms);
var formattedXml = format(ausgabe, {
collapseContent: true,
lineSeparator: '\n'
});
fs.writeFileSync(OriginalVWMFile, formattedXml, function(err) {
// If an error occurred, show it
if (err) {
console.log("Error on writing file: " + OriginalVWMFile);
console.err(err);
}
});
}
/********************************************************************************************************/
} // end exports
@@ -0,0 +1,122 @@
// $Id$
// $HeadURL$
// $Author$
// Created by Manfred Gronak, , 2021-05
var fs = require("fs");
var parser = require('xml2json');
module.exports = function() {
this.VwmXmlToWrl = function VwmXmlToWrl(OriginalxmlFile) {
console.log(" VwmXmlToWrl: "+ OriginalxmlFile); // Datei geschrieben
// if (OriginalxmlFile.includes("bldg_1287.flt.VWM_Building.xml")) {
// console.log(" Skip VwmXmlToWrl: "+ OriginalxmlFile); // Datei geschrieben
// } else {
// return;
// }
var coordIndex = "]\n}\ncoordIndex [ ";
var counter = 0;
var wrl_filename = OriginalxmlFile + ".wrl";
var content = fs.readFileSync(OriginalxmlFile);
var jsonFileInhalt = parser.toJson(content);
var jsonContent = JSON.parse(jsonFileInhalt);
var i;
var resultfile = "#VRML V2.0 utf8\nBackground {\nskyColor 0.2 0.3 0.1}\nTransform {\ntranslation -2.5 -2.5 -2.5\n"
resultfile = resultfile + "children [\n Shape {\nappearance Appearance {\nmaterial Material {\n";
resultfile = resultfile + "diffuseColor 1 0 1\n}\n}\ngeometry IndexedFaceSet {\nsolid FALSE\n";
resultfile = resultfile + "coord Coordinate {\npoint [\n";
var RoomArray = jsonContent.BuildingVulnerability.Rooms.Room;
if (RoomArray == null) {
console.log("Datei " + OriginalxmlFile + ": " + " WARNING, no RoomArray detected");
return;
}
if (Array.isArray(RoomArray)) {
// console.log("1Array: ");
} else {
// No Array..
// wrap obj into an array to ensure 'RoomArray.forEach(...'
var dummy = new Array;
dummy[0] = RoomArray;
RoomArray = dummy;
}
RoomArray.forEach(Room => {
var OuterWallArray = Room.RoomOuterWalls.OuterWall;
if (Array.isArray(OuterWallArray)) {
OuterWallArray.forEach(Outerwall => {
// console.log("Array: " + Outerwall.OuterWallAreaElement);
var n = 0;
var PolygonPoints = Outerwall.OuterWallAreaElement.PolygonPoint;
PolygonPoints.forEach(PolygonPoint => {
// console.log(PolygonPoint.X + " " + PolygonPoint.Y + " " + PolygonPoint.Z) ;
resultfile = resultfile + PolygonPoint.X + " " + PolygonPoint.Y + " " + PolygonPoint.Z + ",\n";
n = n + 1;
counter = counter + 1;
})
for (i = counter - n; i < counter; i++) {
coordIndex = coordIndex + " " + i + ",";
}
coordIndex = coordIndex + " -1\n";
});
} else {
// console.log("NoArray: " + OuterWallArray);
if (OuterWallArray != undefined) {
// RoomArray is object:
// that means OuterWallArray could be used as (a single) Outerwall
// console.log("OBJ" + OuterWallArray);
var n = 0;
var PolygonPoints = OuterWallArray.OuterWallAreaElement.PolygonPoint;
PolygonPoints.forEach(PolygonPoint => {
// console.log(PolygonPoint.X + " " + PolygonPoint.Y + " " + PolygonPoint.Z) ;
resultfile = resultfile + PolygonPoint.X + " " + PolygonPoint.Y + " " + PolygonPoint.Z + ",\n";
n = n + 1;
counter = counter + 1;
})
for (i = counter - n; i < counter; i++) {
coordIndex = coordIndex + " " + i + ",";
}
coordIndex = coordIndex + " -1\n";
}
}
})
resultfile = resultfile + coordIndex;
resultfile = resultfile + " ]\n}\n}\n]\n}\n";
fs.writeFileSync(wrl_filename, resultfile, function(err) {
// If an error occurred, show it
if(err)
{
console.log("Error on writing file: " + wrl_filename);
console.err(err);
}
});
} // end of function
} // export