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,74 @@
# $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 ahtc_buildings_buildingviewer
Summary: AHTC 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 AHTC Buildings / BuildingViewer
%changelog
#* date +"%a %b %d %Y" text
* Thu Sep 12 2021 Norbert Thdoen
- Switch to PostProcessing (apply replace_transition etc)
* 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,755)
/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' ..."
+31
View File
@@ -0,0 +1,31 @@
#!/bin/sh
#
# @RDE_HEADER@
# $Id$
# $HeadURL$
# $Author$
#
# 57 Bldgs:
# Since 25-01-2022:
BLDGS="BN_A2 BN_A3a BN_A3b BN_A3c BN_A4a BN_A4b BN_A4c BN_A4d BN_A5 BN_A6a BN_A6b BN_A6c BN_A7 BN_B1 BN_B2 BN_B3 BN_B4 BN_B5 BN_B6 BN_B7 BN_B8 BN_B9a BN_B9b BN_B9c BN_B9d BN_B9e BN_B9f BN_B9g BN_B9h BN_B9i BN_B9j BN_B9k BN_B9l BN_B9m BN_B9n BN_B9o BN_B9p BN_B9q BN_B9r BN_B10a BN_B10b BN_B10c BN_B10d BN_B10e BN_B10f BN_B10g BN_B10h BN_B10i BN_B10j BN_B10k BN_B10l BN_B10m BN_B10n BN_B11a BN_B11b BN_B11c BN_B11d "
for BLDG in ${BLDGS}
do
echo "Bldg: '$BLDG':";
MyFile=`find ../AhtcBuildings/buildings/ -iname "bldg_${BLDG}.flt.VWM_Building.xml"`
grep -E "OuterWallProtectiveFactor|ExclusionZoneProtectiveFactor" $MyFile | sort -u | grep -vE "usionZoneProtectiveFactor>20<|usionZoneProtectiveFactor>50|WallProtectiveFactor>125|WallProtectiveFactor>150"
if [ $? -ne 0 ];
then
echo "'$BLDG' okay";
else
echo " failure on -> '$BLDG' ";
fi
done
+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,58 @@
#xmlFile;vulnerabilityFile;position;externalWlsId
bldg_BN_A2.flt.xml;bldg_BN_A2.flt.VWM_Building.xml;0.9147113772096,0.4197101048641,1.6200,21.0755;8010
bldg_BN_A3a.flt.xml;bldg_BN_A3a.flt.VWM_Building.xml;0.9147138312044,0.4197109472377,1.7000,21.0755;8011
bldg_BN_A3b.flt.xml;bldg_BN_A3b.flt.VWM_Building.xml;0.9147170821770,0.4197120678605,1.7000,21.0755;8012
bldg_BN_A3c.flt.xml;bldg_BN_A3c.flt.VWM_Building.xml;0.9147203347195,0.4197131905138,1.8900,21.0755;8013
bldg_BN_A4a.flt.xml;bldg_BN_A4a.flt.VWM_Building.xml;0.9147235860466,0.4197143115980,1.9800,21.0755;8014
bldg_BN_A4b.flt.xml;bldg_BN_A4b.flt.VWM_Building.xml;0.9147268439186,0.4197154345092,1.9800,21.0755;8015
bldg_BN_A4c.flt.xml;bldg_BN_A4c.flt.VWM_Building.xml;0.9147300947318,0.4197165551171,1.9200,21.0755;8016
bldg_BN_A4d.flt.xml;bldg_BN_A4d.flt.VWM_Building.xml;0.9147333539517,0.4197176751707,1.8700,21.0763;8017
bldg_BN_A5.flt.xml;bldg_BN_A5.flt.VWM_Building.xml;0.9147146173021,0.4197040661503,1.7300,21.0755;8018
bldg_BN_A6a.flt.xml;bldg_BN_A6a.flt.VWM_Building.xml;0.9147208133264,0.4197063010666,1.8900,21.0755;8019
bldg_BN_A6b.flt.xml;bldg_BN_A6b.flt.VWM_Building.xml;0.9147240923766,0.4197081700705,1.8900,21.0752;8020
bldg_BN_A6c.flt.xml;bldg_BN_A6c.flt.VWM_Building.xml;0.9147279005983,0.4197087391137,1.8900,21.0755;8021
bldg_BN_A7.flt.xml;bldg_BN_A7.flt.VWM_Building.xml;0.9147316654802,0.4197099438768,1.7200,21.0755;8022
bldg_BN_B1.flt.xml;bldg_BN_B1.flt.VWM_Building.xml;0.9147786949309,0.4197143117758,1.7100,-158.9145;8023
bldg_BN_B2.flt.xml;bldg_BN_B2.flt.VWM_Building.xml;0.9147734144771,0.4197132711118,1.6800,-143.8257;8024
bldg_BN_B3.flt.xml;bldg_BN_B3.flt.VWM_Building.xml;0.9147692248433,0.4197116783518,1.7800,-158.9145;8025
bldg_BN_B4.flt.xml;bldg_BN_B4.flt.VWM_Building.xml;0.9147659723726,0.4197086656993,1.5800,-158.9145;8026
bldg_BN_B5.flt.xml;bldg_BN_B5.flt.VWM_Building.xml;0.9147499288075,0.4197048597006,1.8200,-158.8845;8027
bldg_BN_B6.flt.xml;bldg_BN_B6.flt.VWM_Building.xml;0.9147431972809,0.4197020269302,1.9100,-158.9150;8028
bldg_BN_B7.flt.xml;bldg_BN_B7.flt.VWM_Building.xml;0.9147356227225,0.4197001024940,1.8900,-158.9150;8029
bldg_BN_B8.flt.xml;bldg_BN_B8.flt.VWM_Building.xml;0.9147295368809,0.4196980086036,1.7500,-158.9150;8030
bldg_BN_B9a.flt.xml;bldg_BN_B9a.flt.VWM_Building.xml;0.9147690274209,0.4197043790486,1.7300,-158.6570;8031
bldg_BN_B9b.flt.xml;bldg_BN_B9b.flt.VWM_Building.xml;0.9147719028917,0.4197045269901,1.7300,-158.6570;8032
bldg_BN_B9c.flt.xml;bldg_BN_B9c.flt.VWM_Building.xml;0.9147738593115,0.4197060235678,1.6800,-159.1210;8033
bldg_BN_B9d.flt.xml;bldg_BN_B9d.flt.VWM_Building.xml;0.9147764034840,0.4197060714848,1.6800,-159.1210;8034
bldg_BN_B9e.flt.xml;bldg_BN_B9e.flt.VWM_Building.xml;0.9147783523892,0.4197075867263,1.7000,-158.9423;8035
bldg_BN_B9f.flt.xml;bldg_BN_B9f.flt.VWM_Building.xml;0.9147812216931,0.4197077353450,1.7000,-158.9423;8036
bldg_BN_B9g.flt.xml;bldg_BN_B9g.flt.VWM_Building.xml;0.9147789833193,0.4197095188746,1.7000,21.1400;8037
bldg_BN_B9h.flt.xml;bldg_BN_B9h.flt.VWM_Building.xml;0.9147764336964,0.4197094751083,1.7000,21.1400;8038
bldg_BN_B9i.flt.xml;bldg_BN_B9i.flt.VWM_Building.xml;0.9147744839982,0.4197079658619,1.6800,21.1400;8039
bldg_BN_B9j.flt.xml;bldg_BN_B9j.flt.VWM_Building.xml;0.9147716103038,0.4197078081352,1.6800,21.1400;8040
bldg_BN_B9k.flt.xml;bldg_BN_B9k.flt.VWM_Building.xml;0.9147623828596,0.4197038032883,1.8800,21.2000;8041
bldg_BN_B9l.flt.xml;bldg_BN_B9l.flt.VWM_Building.xml;0.9147604582101,0.4197031393777,1.8800,21.2000;8042
bldg_BN_B9m.flt.xml;bldg_BN_B9m.flt.VWM_Building.xml;0.9147575576783,0.4197021433978,1.9700,21.1400;8043
bldg_BN_B9n.flt.xml;bldg_BN_B9n.flt.VWM_Building.xml;0.9147546926977,0.4197019970776,1.9700,21.1400;8044
bldg_BN_B9o.flt.xml;bldg_BN_B9o.flt.VWM_Building.xml;0.9147569289142,0.4197002191041,1.9700,-159.1160;8066
bldg_BN_B9p.flt.xml;bldg_BN_B9p.flt.VWM_Building.xml;0.9147598019442,0.4197003640868,1.9700,-159.1160;8045
bldg_BN_B9q.flt.xml;bldg_BN_B9q.flt.VWM_Building.xml;0.9147620466931,0.4197011399115,1.8800,-159.1160;8046
bldg_BN_B9r.flt.xml;bldg_BN_B9r.flt.VWM_Building.xml;0.9147639944270,0.4197026591467,1.8800,-159.1160;8047
bldg_BN_B10a.flt.xml;bldg_BN_B10a.flt.VWM_Building.xml;0.9147496027980,0.4197016797716,2.0300,-68.9145;8048
bldg_BN_B10b.flt.xml;bldg_BN_B10b.flt.VWM_Building.xml;0.9147487193908,0.4196980321510,2.0300,111.0855;8049
bldg_BN_B10c.flt.xml;bldg_BN_B10c.flt.VWM_Building.xml;0.9147444329444,0.4196965593959,1.7900,-68.9145;8050
bldg_BN_B10d.flt.xml;bldg_BN_B10d.flt.VWM_Building.xml;0.9147435154820,0.4196988085945,1.8900,-68.9145;8051
bldg_BN_B10e.flt.xml;bldg_BN_B10e.flt.VWM_Building.xml;0.9147423586933,0.4196958366437,1.8800,111.0855;8052
bldg_BN_B10f.flt.xml;bldg_BN_B10f.flt.VWM_Building.xml;0.9147432732626,0.4196935896786,1.7800,111.0855;8053
bldg_BN_B10g.flt.xml;bldg_BN_B10g.flt.VWM_Building.xml;0.9147383789098,0.4196937008235,1.7000,-68.9145;8054
bldg_BN_B10h.flt.xml;bldg_BN_B10h.flt.VWM_Building.xml;0.9147369089067,0.4196973094552,1.7000,-68.9468;8055
bldg_BN_B10i.flt.xml;bldg_BN_B10i.flt.VWM_Building.xml;0.9147357436229,0.4196943445142,1.7100,111.0730;8056
bldg_BN_B10j.flt.xml;bldg_BN_B10j.flt.VWM_Building.xml;0.9147372142971,0.4196907344584,1.7100,110.9640;8057
bldg_BN_B10k.flt.xml;bldg_BN_B10k.flt.VWM_Building.xml;0.9147320534288,0.4196915221457,1.7800,-68.9020;8058
bldg_BN_B10l.flt.xml;bldg_BN_B10l.flt.VWM_Building.xml;0.9147305787643,0.4196951290835,1.7800,-68.9145;8059
bldg_BN_B10m.flt.xml;bldg_BN_B10m.flt.VWM_Building.xml;0.9147294170507,0.4196921601663,1.7800,111.0855;8060
bldg_BN_B10n.flt.xml;bldg_BN_B10n.flt.VWM_Building.xml;0.9147308863921,0.4196885529628,1.7800,111.0545;8061
bldg_BN_B11a.flt.xml;bldg_BN_B11a.flt.VWM_Building.xml;0.9147675998146,0.4197072782168,1.9700,21.1400;8062
bldg_BN_B11b.flt.xml;bldg_BN_B11b.flt.VWM_Building.xml;0.9147665237541,0.4197021347707,1.8300,-68.6570;8063
bldg_BN_B11c.flt.xml;bldg_BN_B11c.flt.VWM_Building.xml;0.9147477596189,0.4196963318756,1.9400,111.0855;8064
bldg_BN_B11d.flt.xml;bldg_BN_B11d.flt.VWM_Building.xml;0.9147525359761,0.4196979074406,2.1300,21.0855;8065
1 #xmlFile vulnerabilityFile position externalWlsId
2 bldg_BN_A2.flt.xml bldg_BN_A2.flt.VWM_Building.xml 0.9147113772096,0.4197101048641,1.6200,21.0755 8010
3 bldg_BN_A3a.flt.xml bldg_BN_A3a.flt.VWM_Building.xml 0.9147138312044,0.4197109472377,1.7000,21.0755 8011
4 bldg_BN_A3b.flt.xml bldg_BN_A3b.flt.VWM_Building.xml 0.9147170821770,0.4197120678605,1.7000,21.0755 8012
5 bldg_BN_A3c.flt.xml bldg_BN_A3c.flt.VWM_Building.xml 0.9147203347195,0.4197131905138,1.8900,21.0755 8013
6 bldg_BN_A4a.flt.xml bldg_BN_A4a.flt.VWM_Building.xml 0.9147235860466,0.4197143115980,1.9800,21.0755 8014
7 bldg_BN_A4b.flt.xml bldg_BN_A4b.flt.VWM_Building.xml 0.9147268439186,0.4197154345092,1.9800,21.0755 8015
8 bldg_BN_A4c.flt.xml bldg_BN_A4c.flt.VWM_Building.xml 0.9147300947318,0.4197165551171,1.9200,21.0755 8016
9 bldg_BN_A4d.flt.xml bldg_BN_A4d.flt.VWM_Building.xml 0.9147333539517,0.4197176751707,1.8700,21.0763 8017
10 bldg_BN_A5.flt.xml bldg_BN_A5.flt.VWM_Building.xml 0.9147146173021,0.4197040661503,1.7300,21.0755 8018
11 bldg_BN_A6a.flt.xml bldg_BN_A6a.flt.VWM_Building.xml 0.9147208133264,0.4197063010666,1.8900,21.0755 8019
12 bldg_BN_A6b.flt.xml bldg_BN_A6b.flt.VWM_Building.xml 0.9147240923766,0.4197081700705,1.8900,21.0752 8020
13 bldg_BN_A6c.flt.xml bldg_BN_A6c.flt.VWM_Building.xml 0.9147279005983,0.4197087391137,1.8900,21.0755 8021
14 bldg_BN_A7.flt.xml bldg_BN_A7.flt.VWM_Building.xml 0.9147316654802,0.4197099438768,1.7200,21.0755 8022
15 bldg_BN_B1.flt.xml bldg_BN_B1.flt.VWM_Building.xml 0.9147786949309,0.4197143117758,1.7100,-158.9145 8023
16 bldg_BN_B2.flt.xml bldg_BN_B2.flt.VWM_Building.xml 0.9147734144771,0.4197132711118,1.6800,-143.8257 8024
17 bldg_BN_B3.flt.xml bldg_BN_B3.flt.VWM_Building.xml 0.9147692248433,0.4197116783518,1.7800,-158.9145 8025
18 bldg_BN_B4.flt.xml bldg_BN_B4.flt.VWM_Building.xml 0.9147659723726,0.4197086656993,1.5800,-158.9145 8026
19 bldg_BN_B5.flt.xml bldg_BN_B5.flt.VWM_Building.xml 0.9147499288075,0.4197048597006,1.8200,-158.8845 8027
20 bldg_BN_B6.flt.xml bldg_BN_B6.flt.VWM_Building.xml 0.9147431972809,0.4197020269302,1.9100,-158.9150 8028
21 bldg_BN_B7.flt.xml bldg_BN_B7.flt.VWM_Building.xml 0.9147356227225,0.4197001024940,1.8900,-158.9150 8029
22 bldg_BN_B8.flt.xml bldg_BN_B8.flt.VWM_Building.xml 0.9147295368809,0.4196980086036,1.7500,-158.9150 8030
23 bldg_BN_B9a.flt.xml bldg_BN_B9a.flt.VWM_Building.xml 0.9147690274209,0.4197043790486,1.7300,-158.6570 8031
24 bldg_BN_B9b.flt.xml bldg_BN_B9b.flt.VWM_Building.xml 0.9147719028917,0.4197045269901,1.7300,-158.6570 8032
25 bldg_BN_B9c.flt.xml bldg_BN_B9c.flt.VWM_Building.xml 0.9147738593115,0.4197060235678,1.6800,-159.1210 8033
26 bldg_BN_B9d.flt.xml bldg_BN_B9d.flt.VWM_Building.xml 0.9147764034840,0.4197060714848,1.6800,-159.1210 8034
27 bldg_BN_B9e.flt.xml bldg_BN_B9e.flt.VWM_Building.xml 0.9147783523892,0.4197075867263,1.7000,-158.9423 8035
28 bldg_BN_B9f.flt.xml bldg_BN_B9f.flt.VWM_Building.xml 0.9147812216931,0.4197077353450,1.7000,-158.9423 8036
29 bldg_BN_B9g.flt.xml bldg_BN_B9g.flt.VWM_Building.xml 0.9147789833193,0.4197095188746,1.7000,21.1400 8037
30 bldg_BN_B9h.flt.xml bldg_BN_B9h.flt.VWM_Building.xml 0.9147764336964,0.4197094751083,1.7000,21.1400 8038
31 bldg_BN_B9i.flt.xml bldg_BN_B9i.flt.VWM_Building.xml 0.9147744839982,0.4197079658619,1.6800,21.1400 8039
32 bldg_BN_B9j.flt.xml bldg_BN_B9j.flt.VWM_Building.xml 0.9147716103038,0.4197078081352,1.6800,21.1400 8040
33 bldg_BN_B9k.flt.xml bldg_BN_B9k.flt.VWM_Building.xml 0.9147623828596,0.4197038032883,1.8800,21.2000 8041
34 bldg_BN_B9l.flt.xml bldg_BN_B9l.flt.VWM_Building.xml 0.9147604582101,0.4197031393777,1.8800,21.2000 8042
35 bldg_BN_B9m.flt.xml bldg_BN_B9m.flt.VWM_Building.xml 0.9147575576783,0.4197021433978,1.9700,21.1400 8043
36 bldg_BN_B9n.flt.xml bldg_BN_B9n.flt.VWM_Building.xml 0.9147546926977,0.4197019970776,1.9700,21.1400 8044
37 bldg_BN_B9o.flt.xml bldg_BN_B9o.flt.VWM_Building.xml 0.9147569289142,0.4197002191041,1.9700,-159.1160 8066
38 bldg_BN_B9p.flt.xml bldg_BN_B9p.flt.VWM_Building.xml 0.9147598019442,0.4197003640868,1.9700,-159.1160 8045
39 bldg_BN_B9q.flt.xml bldg_BN_B9q.flt.VWM_Building.xml 0.9147620466931,0.4197011399115,1.8800,-159.1160 8046
40 bldg_BN_B9r.flt.xml bldg_BN_B9r.flt.VWM_Building.xml 0.9147639944270,0.4197026591467,1.8800,-159.1160 8047
41 bldg_BN_B10a.flt.xml bldg_BN_B10a.flt.VWM_Building.xml 0.9147496027980,0.4197016797716,2.0300,-68.9145 8048
42 bldg_BN_B10b.flt.xml bldg_BN_B10b.flt.VWM_Building.xml 0.9147487193908,0.4196980321510,2.0300,111.0855 8049
43 bldg_BN_B10c.flt.xml bldg_BN_B10c.flt.VWM_Building.xml 0.9147444329444,0.4196965593959,1.7900,-68.9145 8050
44 bldg_BN_B10d.flt.xml bldg_BN_B10d.flt.VWM_Building.xml 0.9147435154820,0.4196988085945,1.8900,-68.9145 8051
45 bldg_BN_B10e.flt.xml bldg_BN_B10e.flt.VWM_Building.xml 0.9147423586933,0.4196958366437,1.8800,111.0855 8052
46 bldg_BN_B10f.flt.xml bldg_BN_B10f.flt.VWM_Building.xml 0.9147432732626,0.4196935896786,1.7800,111.0855 8053
47 bldg_BN_B10g.flt.xml bldg_BN_B10g.flt.VWM_Building.xml 0.9147383789098,0.4196937008235,1.7000,-68.9145 8054
48 bldg_BN_B10h.flt.xml bldg_BN_B10h.flt.VWM_Building.xml 0.9147369089067,0.4196973094552,1.7000,-68.9468 8055
49 bldg_BN_B10i.flt.xml bldg_BN_B10i.flt.VWM_Building.xml 0.9147357436229,0.4196943445142,1.7100,111.0730 8056
50 bldg_BN_B10j.flt.xml bldg_BN_B10j.flt.VWM_Building.xml 0.9147372142971,0.4196907344584,1.7100,110.9640 8057
51 bldg_BN_B10k.flt.xml bldg_BN_B10k.flt.VWM_Building.xml 0.9147320534288,0.4196915221457,1.7800,-68.9020 8058
52 bldg_BN_B10l.flt.xml bldg_BN_B10l.flt.VWM_Building.xml 0.9147305787643,0.4196951290835,1.7800,-68.9145 8059
53 bldg_BN_B10m.flt.xml bldg_BN_B10m.flt.VWM_Building.xml 0.9147294170507,0.4196921601663,1.7800,111.0855 8060
54 bldg_BN_B10n.flt.xml bldg_BN_B10n.flt.VWM_Building.xml 0.9147308863921,0.4196885529628,1.7800,111.0545 8061
55 bldg_BN_B11a.flt.xml bldg_BN_B11a.flt.VWM_Building.xml 0.9147675998146,0.4197072782168,1.9700,21.1400 8062
56 bldg_BN_B11b.flt.xml bldg_BN_B11b.flt.VWM_Building.xml 0.9147665237541,0.4197021347707,1.8300,-68.6570 8063
57 bldg_BN_B11c.flt.xml bldg_BN_B11c.flt.VWM_Building.xml 0.9147477596189,0.4196963318756,1.9400,111.0855 8064
58 bldg_BN_B11d.flt.xml bldg_BN_B11d.flt.VWM_Building.xml 0.9147525359761,0.4196979074406,2.1300,21.0855 8065
+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,363 @@
#!/bin/sh
#
# @RDE_HEADER@
# $Id$
# $HeadURL$
# $Author$
#
env
file_location=`pwd`
echo "Comment: current wd is: " `pwd`
###
### Presets
###
PROJECT="AHTC"
xlsxfile=AHTC_Transformationspunkte_190114_UTM_fuer_FME
SPD_BLDGS=../AhtcBuildings/buildings
LOCATIONS_LIST="ahtc"
loc="ahtc"
echo "Comment: remove some temporary files... revert some other..."
rm -v block*.csv
rm -v ./import_ahtc.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
###
### check ProtectiveFactor according VEMAG
###
# Wall -> 200
# Ceiling -> 200
# ExclusiveDoor -> 20
# ExclusiveWindow -> 0
#
echo "Comment: checkProtectiveFactors ..."
echo "Comment: current wd is: " `pwd`
./checkProtective.sh > checkProtectiveAhtc.log
protectiveErrorCnt=`cat checkProtectiveAhtc.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_adjustmentAhtc.log
if [ $? -ne 0 ];
then echo " node vwm_adjustment failed" ; tail -n200 vwm_adjustmentAhtc.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_ahtc_instrumented.csv ./import_ahtc.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 ahtc ${file_location}/import_ahtc.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" ahtc_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" ahtc_buildings_buildingviewer.spec
if [ $? -ne 0 ]; then echo "sed command JENKINS_BUILD_TAG failed" ; fi
sed -i "s/@RELEASE@/${BUILD_NUMBER}/g" ahtc_buildings_buildingviewer.spec
if [ $? -ne 0 ]; then echo "sed command RELEASE failed" ; fi
rpmbuild -bb --target=noarch ahtc_buildings_buildingviewer.spec
if [ $? -ne 0 ]; then echo "rpmbuild command failed for spec 'guez_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/ahtc_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/guez_buildings*$VERSION_STR*.rpm ${DST_DIR}
fi
@@ -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,102 @@
// $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 => {
if (DirName.substring(0, 5) == 'bldg_') {
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