Files
Pier_v1/pierzainer_ground/tests/test_survey_polyline.py
T

71 lines
4.1 KiB
Python

import tempfile
from pathlib import Path
import unittest
import ezdxf
import numpy as np
from pierzainer_ground.survey_terrain import read_survey_block
class SurveyPolylineTests(unittest.TestCase):
def options(self):
return dict(terrain_block='*Model_Space',z_min=-200,z_max=200,exclude_zero=True,
contour_step_m=2,dedup_m=.001,cad_axes='YX')
def test_2d_header_height_not_zero_vertices(self):
doc=ezdxf.new();doc.modelspace().add_polyline2d([(100,200),(104,200),(104,204)],dxfattribs={'elevation':(0,0,45)})
points,counts,_=read_survey_block(Path('unused.dxf'),self.options(),doc=doc)
self.assertTrue(np.all(points[:,2]==45));self.assertEqual(counts['constant_height_polylines'],1)
self.assertTrue(any(np.array_equal(p,[200,100,45]) for p in points))
def test_ocs_axes_and_height_are_applied(self):
doc=ezdxf.new();doc.modelspace().add_lwpolyline([(100,200),(104,200),(104,204)],dxfattribs={'elevation':45,'extrusion':(0,0,-1)})
points,_,_=read_survey_block(Path('unused.dxf'),self.options(),doc=doc)
self.assertTrue(any(np.array_equal(p,[200,-100,-45]) for p in points))
def test_varying_3d_structure_is_not_a_contour(self):
doc=ezdxf.new();doc.modelspace().add_polyline3d([(1,1,20),(2,2,30),(3,3,40)])
with self.assertRaises(ValueError):read_survey_block(Path('unused.dxf'),self.options(),doc=doc)
def contours(self,msp,levels):
for k,z in enumerate(levels):
msp.add_lwpolyline([(0,10*k),(200,10*k)],dxfattribs={'elevation':z})
def test_stray_constant_height_symbols_are_rejected(self):
# Ungok case: dense short ticks at EL 5.624 and a few at -112.719 among 20-40 m contours.
doc=ezdxf.new();msp=doc.modelspace();self.contours(msp,[28,29,30,31,32,33])
for i in range(60):msp.add_lwpolyline([(40+2*i,20),(40+2*i,22)],dxfattribs={'elevation':5.624})
for i in range(4):msp.add_lwpolyline([(100+i,25),(100+i,27)],dxfattribs={'elevation':-112.719})
points,counts,_=read_survey_block(Path('unused.dxf'),self.options(),doc=doc)
self.assertEqual(counts['rejected_height_outliers'],64)
self.assertGreaterEqual(points[:,2].min(),28)
def test_real_peak_above_contours_is_kept(self):
doc=ezdxf.new();msp=doc.modelspace();self.contours(msp,[70,72,74,76,78,80])
msp.add_lwpolyline([(100,25),(100,27)],dxfattribs={'elevation':84})
points,counts,_=read_survey_block(Path('unused.dxf'),self.options(),doc=doc)
self.assertNotIn('rejected_height_outliers',counts);self.assertEqual(points[:,2].max(),84)
def test_known_plan_layers_exclude_near_height_bore_and_base(self):
doc=ezdxf.new();msp=doc.modelspace()
for y,z in [(0,30),(100,32)]:
msp.add_lwpolyline([(0,y),(100,y)],dxfattribs={'layer':'CAA001','elevation':z})
doc.blocks.new('SPOT').add_circle((0,0),.1)
msp.add_blockref('SPOT',(20,50,31),dxfattribs={'layer':'CA002'})
msp.add_text('30.5',dxfattribs={'layer':'CA0021','insert':(80,50)})
for layer in ['CV-BORE-SYMB','CZ-BASE','CF-BRDG-NEWC']:
msp.add_lwpolyline([(45,45),(55,45),(55,55)],dxfattribs={'layer':layer,'elevation':27.5})
points,counts,_=read_survey_block(Path('unused.dxf'),self.options(),doc=doc)
self.assertGreaterEqual(points[:,2].min(),30)
self.assertEqual(counts['semantic_layer_filter'],1)
self.assertEqual(counts['survey_points'],1)
self.assertEqual(counts['spot_text_points'],1)
self.assertTrue(any(np.array_equal(p,[50,20,31]) for p in points))
self.assertTrue(any(np.array_equal(p,[50,80,30.5]) for p in points))
def test_known_layers_do_not_fall_back_to_symbols_when_empty(self):
doc=ezdxf.new();msp=doc.modelspace()
msp.add_lwpolyline([(0,0),(10,0)],dxfattribs={'layer':'CAA001','elevation':0})
msp.add_lwpolyline([(0,0),(10,0),(10,10)],dxfattribs={'layer':'CV-BORE-SYMB','elevation':28})
with self.assertRaises(ValueError):read_survey_block(Path('unused.dxf'),self.options(),doc=doc)
if __name__=='__main__':unittest.main()