DM_compare_polylines.py
## @package python.DM_compare_polylines
## @brief unkown python script prefix=autobuild.swdvlp64.opals.distro.demo
#
# Small example script showing how to compare polylines based on the pyDM.GeometricAlgorithms.analyseDistance functionality
# (script works in python 2 and 3)
#
from __future__ import print_function # print function syntax as in python 3
import sys
#from opals import pyDM_d as pyDM #for pyDM in debug mode
from opals import pyDM # for pyDM in release mode
def output_polyline(line,prefix=""):
print(prefix,"Polyline has",line.sizePart(),"parts with",line.sizePoint(),"points")
for idx, part in enumerate(line.parts()):
print("\tPart",idx,"with",part.sizePoint(),"points")
for p in part.points():
if sys.float_info.max == p.z:
print("\t\t(%.3f," % p.x, " %.3f," % p.y, "---)")
else:
print("\t\t(%.3f," % p.x, " %.3f," % p.y, "%.3f)" % p.z)
return
f = pyDM.PolylineFactory()
#create simple polyline
f.addPoint(0, 0, 0)
f.addPoint(5, 0, 0)
f.addPoint(10, 0, 0)
line1 = f.getPolyline()
f.addPoint(0, 1, 1 )
f.addPoint(5, 0.5, 0.5)
f.addPoint(10, 0, -0.5)
line2 = f.getPolyline()
output_polyline(line1,"Line1:")
output_polyline(line2,"Line2:")
##
# callback object for collecting distance information
class AnalyseDistance(pyDM.AnalyseDistance):
def __init__(self):
# initialize the base class (mandatory!)
if sys.version_info >= (3, 0):
super().__init__()
else:
super(AnalyseDistance, self).__init__()
self.sumDistance = 0
self.counter = 0
self.exceedCounter = 0
def reset(self):
self.sumDistance = 0
self.counter = 0
self.exceedCounter = 0
def closest(self, distance, idx, basePt, lineIdx1, lineIdx2, minDistPt):
self.counter += 1
self.sumDistance += distance
def exceeds(self,idx):
self.exceedCounter += 1
def meanDistance(self):
return self.sumDistance / self.counter
line1dense = pyDM.GeometricAlgorithms.densify(line1,1.0) #create a densified line with equal vertex spacing of 1 m (or lower)
obj = AnalyseDistance()
pyDM.GeometricAlgorithms.analyseDistance(line1dense,line2,obj)
print("\nResults of distance analysis (no distance threshold):")
print("\tMean distance of lines: %.2f" % obj.meanDistance())
print("\tVertices exceeed distance threshold: %d" % obj.exceedCounter)
obj.reset()
maxDist = 1;
pyDM.GeometricAlgorithms.analyseDistance(line1dense,line2,obj,maxDist)
print("\nResults of distance analysis (max distance threshold = %.2f):" % maxDist)
print("\tMean distance of lines: %.2f" % obj.meanDistance())
print("\tVertices exceed distance threshold: %d" % obj.exceedCounter)