Work on exception handling.

这个提交包含在:
craig-warren
2020-04-09 11:09:36 +01:00
父节点 7df45cd604
当前提交 f2eeeaaba8
共有 14 个文件被更改,包括 205 次插入121 次删除

查看文件

@@ -21,7 +21,6 @@ import logging
import gprMax.config as config import gprMax.config as config
import numpy as np import numpy as np
from ..exceptions import CmdInputError
from ..fractals import FractalSurface, Grass from ..fractals import FractalSurface, Grass
from ..materials import DispersiveMaterial from ..materials import DispersiveMaterial
from ..utilities import round_value from ..utilities import round_value
@@ -61,7 +60,8 @@ class AddGrass(UserObjectGeometry):
limits = self.kwargs['limits'] limits = self.kwargs['limits']
n_blades = self.kwargs['n_blades'] n_blades = self.kwargs['n_blades']
except KeyError: except KeyError:
raise CmdInputError(self.__str__() + ' requires at least eleven parameters') logger.exception(self.__str__() + ' requires at least eleven parameters')
raise
try: try:
seed = self.kwargs['seed'] seed = self.kwargs['seed']
@@ -70,68 +70,84 @@ class AddGrass(UserObjectGeometry):
# Get the correct fractal volume # Get the correct fractal volume
volumes = [volume for volume in grid.fractalvolumes if volume.ID == fractal_box_id] volumes = [volume for volume in grid.fractalvolumes if volume.ID == fractal_box_id]
if volumes: try:
volume = volumes[0] volume = volumes[0]
else: except NameError:
raise CmdInputError(self.__str__() + f' cannot find FractalBox {fractal_box_id}') logger.exception(self.__str__() + f' cannot find FractalBox {fractal_box_id}')
raise
p1, p2 = uip.check_box_points(p1, p2, self.__str__()) p1, p2 = uip.check_box_points(p1, p2, self.__str__())
xs, ys, zs = p1 xs, ys, zs = p1
xf, yf, zf = p2 xf, yf, zf = p2
if frac_dim < 0: if frac_dim < 0:
raise CmdInputError(self.__str__() + ' requires a positive value for the fractal dimension') logger.exception(self.__str__() + ' requires a positive value for the fractal dimension')
raise ValueError
if limits[0] < 0 or limits[1] < 0: if limits[0] < 0 or limits[1] < 0:
raise CmdInputError(self.__str__() + ' requires a positive value for the minimum and maximum heights for grass blades') logger.exception(self.__str__() + ' requires a positive value for the minimum and maximum heights for grass blades')
raise ValueError
# Check for valid orientations # Check for valid orientations
if xs == xf: if xs == xf:
if ys == yf or zs == zf: if ys == yf or zs == zf:
raise CmdInputError(self.__str__() + ' dimensions are not specified correctly') logger.exception(self.__str__() + ' dimensions are not specified correctly')
raise ValueError
if xs != volume.xs and xs != volume.xf: if xs != volume.xs and xs != volume.xf:
raise CmdInputError(self.__str__() + ' must specify external surfaces on a fractal box') logger.exception(self.__str__() + ' must specify external surfaces on a fractal box')
raise ValueError
fractalrange = (round_value(limits[0] / grid.dx), round_value(limits[1] / grid.dx)) fractalrange = (round_value(limits[0] / grid.dx), round_value(limits[1] / grid.dx))
# xminus surface # xminus surface
if xs == volume.xs: if xs == volume.xs:
raise CmdInputError(self.__str__() + ' grass can only be specified on surfaces in the positive axis direction') logger.exception(self.__str__() + ' grass can only be specified on surfaces in the positive axis direction')
raise ValueError
# xplus surface # xplus surface
elif xf == volume.xf: elif xf == volume.xf:
if fractalrange[1] > grid.nx: if fractalrange[1] > grid.nx:
raise CmdInputError(self.__str__() + ' cannot apply grass to fractal box as it would exceed the domain size in the x direction') logger.exception(self.__str__() + ' cannot apply grass to fractal box as it would exceed the domain size in the x direction')
raise ValueError
requestedsurface = 'xplus' requestedsurface = 'xplus'
elif ys == yf: elif ys == yf:
if xs == xf or zs == zf: if xs == xf or zs == zf:
raise CmdInputError(self.__str__() + ' dimensions are not specified correctly') logger.exception(self.__str__() + ' dimensions are not specified correctly')
raise ValueError
if ys != volume.ys and ys != volume.yf: if ys != volume.ys and ys != volume.yf:
raise CmdInputError(self.__str__() + ' must specify external surfaces on a fractal box') logger.exception(self.__str__() + ' must specify external surfaces on a fractal box')
raise ValueError
fractalrange = (round_value(limits[0] / grid.dy), round_value(limits[1] / grid.dy)) fractalrange = (round_value(limits[0] / grid.dy), round_value(limits[1] / grid.dy))
# yminus surface # yminus surface
if ys == volume.ys: if ys == volume.ys:
raise CmdInputError(self.__str__() + ' grass can only be specified on surfaces in the positive axis direction') logger.exception(self.__str__() + ' grass can only be specified on surfaces in the positive axis direction')
raise ValueError
# yplus surface # yplus surface
elif yf == volume.yf: elif yf == volume.yf:
if fractalrange[1] > grid.ny: if fractalrange[1] > grid.ny:
raise CmdInputError(self.__str__() + ' cannot apply grass to fractal box as it would exceed the domain size in the y direction') logger.exception(self.__str__() + ' cannot apply grass to fractal box as it would exceed the domain size in the y direction')
raise ValueError
requestedsurface = 'yplus' requestedsurface = 'yplus'
elif zs == zf: elif zs == zf:
if xs == xf or ys == yf: if xs == xf or ys == yf:
raise CmdInputError(self.__str__() + ' dimensions are not specified correctly') logger.exception(self.__str__() + ' dimensions are not specified correctly')
raise ValueError
if zs != volume.zs and zs != volume.zf: if zs != volume.zs and zs != volume.zf:
raise CmdInputError(self.__str__() + ' must specify external surfaces on a fractal box') logger.exception(self.__str__() + ' must specify external surfaces on a fractal box')
raise ValueError
fractalrange = (round_value(limits[0] / grid.dz), round_value(limits[1] / grid.dz)) fractalrange = (round_value(limits[0] / grid.dz), round_value(limits[1] / grid.dz))
# zminus surface # zminus surface
if zs == volume.zs: if zs == volume.zs:
raise CmdInputError(self.__str__() + ' grass can only be specified on surfaces in the positive axis direction') logger.exception(self.__str__() + ' grass can only be specified on surfaces in the positive axis direction')
raise ValueError
# zplus surface # zplus surface
elif zf == volume.zf: elif zf == volume.zf:
if fractalrange[1] > grid.nz: if fractalrange[1] > grid.nz:
raise CmdInputError(self.__str__() + ' cannot apply grass to fractal box as it would exceed the domain size in the z direction') logger.exception(self.__str__() + ' cannot apply grass to fractal box as it would exceed the domain size in the z direction')
raise ValueError
requestedsurface = 'zplus' requestedsurface = 'zplus'
else: else:
raise CmdInputError(self.__str__() + ' dimensions are not specified correctly') logger.exception(self.__str__() + ' dimensions are not specified correctly')
raise ValueError
surface = FractalSurface(xs, xf, ys, yf, zs, zf, frac_dim) surface = FractalSurface(xs, xf, ys, yf, zs, zf, frac_dim)
surface.ID = 'grass' surface.ID = 'grass'
@@ -143,7 +159,8 @@ class AddGrass(UserObjectGeometry):
surface.operatingonID = volume.ID surface.operatingonID = volume.ID
surface.generate_fractal_surface(grid) surface.generate_fractal_surface(grid)
if n_blades > surface.fractalsurface.shape[0] * surface.fractalsurface.shape[1]: if n_blades > surface.fractalsurface.shape[0] * surface.fractalsurface.shape[1]:
raise CmdInputError(self.__str__() + ' the specified surface is not large enough for the number of grass blades/roots specified') logger.exception(self.__str__() + ' the specified surface is not large enough for the number of grass blades/roots specified')
raise ValueError
# Scale the distribution so that the summation is equal to one, i.e. a probability distribution # Scale the distribution so that the summation is equal to one, i.e. a probability distribution
surface.fractalsurface = surface.fractalsurface / np.sum(surface.fractalsurface) surface.fractalsurface = surface.fractalsurface / np.sum(surface.fractalsurface)
@@ -188,7 +205,8 @@ class AddGrass(UserObjectGeometry):
grass = next((x for x in grid.materials if x.ID == 'grass')) grass = next((x for x in grid.materials if x.ID == 'grass'))
testgrass = next((x for x in grass.tau if x < grid.dt), None) testgrass = next((x for x in grass.tau if x < grid.dt), None)
if testgrass: if testgrass:
raise CmdInputError(self.__str__() + ' requires the time step for the model to be less than the relaxation time required to model grass.') logger.exception(self.__str__() + ' requires the time step for the model to be less than the relaxation time required to model grass.')
raise ValueError
volume.fractalsurfaces.append(surface) volume.fractalsurfaces.append(surface)

查看文件

@@ -21,7 +21,6 @@ import logging
import gprMax.config as config import gprMax.config as config
import numpy as np import numpy as np
from ..exceptions import CmdInputError
from ..fractals import FractalSurface from ..fractals import FractalSurface
from ..utilities import round_value from ..utilities import round_value
from .cmds_geometry import UserObjectGeometry from .cmds_geometry import UserObjectGeometry
@@ -62,7 +61,8 @@ class AddSurfaceRoughness(UserObjectGeometry):
limits = np.array(self.kwargs['limits']) limits = np.array(self.kwargs['limits'])
fractal_box_id = self.kwargs['fractal_box_id'] fractal_box_id = self.kwargs['fractal_box_id']
except KeyError: except KeyError:
raise CmdInputError(self.__str__() + ' incorrect parameters') logger.exception(self.__str__() + ' incorrect parameters')
raise
try: try:
seed = self.kwargs['seed'] seed = self.kwargs['seed']
@@ -74,73 +74,90 @@ class AddSurfaceRoughness(UserObjectGeometry):
if volumes: if volumes:
volume = volumes[0] volume = volumes[0]
else: else:
raise CmdInputError(self.__str__() + ' cannot find FractalBox {fractal_box_id}') logger.exception(self.__str__() + f' cannot find FractalBox {fractal_box_id}')
raise ValueError
p1, p2 = uip.check_box_points(p1, p2, self.__str__()) p1, p2 = uip.check_box_points(p1, p2, self.__str__())
xs, ys, zs = p1 xs, ys, zs = p1
xf, yf, zf = p2 xf, yf, zf = p2
if frac_dim < 0: if frac_dim < 0:
raise CmdInputError(self.__str__() + ' requires a positive value for the fractal dimension') logger.exception(self.__str__() + ' requires a positive value for the fractal dimension')
raise ValueError
if weighting[0] < 0: if weighting[0] < 0:
raise CmdInputError(self.__str__() + ' requires a positive value for the fractal weighting in the first direction of the surface') logger.exception(self.__str__() + ' requires a positive value for the fractal weighting in the first direction of the surface')
raise ValueError
if weighting[1] < 0: if weighting[1] < 0:
raise CmdInputError(self.__str__() + ' requires a positive value for the fractal weighting in the second direction of the surface') logger.exception(self.__str__() + ' requires a positive value for the fractal weighting in the second direction of the surface')
raise ValueError
# Check for valid orientations # Check for valid orientations
if xs == xf: if xs == xf:
if ys == yf or zs == zf: if ys == yf or zs == zf:
raise CmdInputError(self.__str__() + ' dimensions are not specified correctly') logger.exception(self.__str__() + ' dimensions are not specified correctly')
raise ValueError
if xs != volume.xs and xs != volume.xf: if xs != volume.xs and xs != volume.xf:
raise CmdInputError(self.__str__() + ' can only be used on the external surfaces of a fractal box') logger.exception(self.__str__() + ' can only be used on the external surfaces of a fractal box')
raise ValueError
fractalrange = (round_value(limits[0] / grid.dx), round_value(limits[1] / grid.dx)) fractalrange = (round_value(limits[0] / grid.dx), round_value(limits[1] / grid.dx))
# xminus surface # xminus surface
if xs == volume.xs: if xs == volume.xs:
if fractalrange[0] < 0 or fractalrange[1] > volume.xf: if fractalrange[0] < 0 or fractalrange[1] > volume.xf:
raise CmdInputError(self.__str__() + ' cannot apply fractal surface to fractal box as it would exceed either the upper coordinates of the fractal box or the domain in the x direction') logger.exception(self.__str__() + ' cannot apply fractal surface to fractal box as it would exceed either the upper coordinates of the fractal box or the domain in the x direction')
raise ValueError
requestedsurface = 'xminus' requestedsurface = 'xminus'
# xplus surface # xplus surface
elif xf == volume.xf: elif xf == volume.xf:
if fractalrange[0] < volume.xs or fractalrange[1] > grid.nx: if fractalrange[0] < volume.xs or fractalrange[1] > grid.nx:
raise CmdInputError(self.__str__() + ' cannot apply fractal surface to fractal box as it would exceed either the lower coordinates of the fractal box or the domain in the x direction') logger.exception(self.__str__() + ' cannot apply fractal surface to fractal box as it would exceed either the lower coordinates of the fractal box or the domain in the x direction')
raise ValueError
requestedsurface = 'xplus' requestedsurface = 'xplus'
elif ys == yf: elif ys == yf:
if xs == xf or zs == zf: if xs == xf or zs == zf:
raise CmdInputError(self.__str__() + ' dimensions are not specified correctly') logger.exception(self.__str__() + ' dimensions are not specified correctly')
raise ValueError
if ys != volume.ys and ys != volume.yf: if ys != volume.ys and ys != volume.yf:
raise CmdInputError(self.__str__() + ' can only be used on the external surfaces of a fractal box') logger.exception(self.__str__() + ' can only be used on the external surfaces of a fractal box')
raise ValueError
fractalrange = (round_value(limits[0] / grid.dy), round_value(limits[1] / grid.dy)) fractalrange = (round_value(limits[0] / grid.dy), round_value(limits[1] / grid.dy))
# yminus surface # yminus surface
if ys == volume.ys: if ys == volume.ys:
if fractalrange[0] < 0 or fractalrange[1] > volume.yf: if fractalrange[0] < 0 or fractalrange[1] > volume.yf:
raise CmdInputError(self.__str__() + ' cannot apply fractal surface to fractal box as it would exceed either the upper coordinates of the fractal box or the domain in the y direction') logger.exception(self.__str__() + ' cannot apply fractal surface to fractal box as it would exceed either the upper coordinates of the fractal box or the domain in the y direction')
raise ValueError
requestedsurface = 'yminus' requestedsurface = 'yminus'
# yplus surface # yplus surface
elif yf == volume.yf: elif yf == volume.yf:
if fractalrange[0] < volume.ys or fractalrange[1] > grid.ny: if fractalrange[0] < volume.ys or fractalrange[1] > grid.ny:
raise CmdInputError(self.__str__() + ' cannot apply fractal surface to fractal box as it would exceed either the lower coordinates of the fractal box or the domain in the y direction') logger.exception(self.__str__() + ' cannot apply fractal surface to fractal box as it would exceed either the lower coordinates of the fractal box or the domain in the y direction')
raise ValueError
requestedsurface = 'yplus' requestedsurface = 'yplus'
elif zs == zf: elif zs == zf:
if xs == xf or ys == yf: if xs == xf or ys == yf:
raise CmdInputError(self.__str__() + ' dimensions are not specified correctly') logger.exception(self.__str__() + ' dimensions are not specified correctly')
raise ValueError
if zs != volume.zs and zs != volume.zf: if zs != volume.zs and zs != volume.zf:
raise CmdInputError(self.__str__() + ' can only be used on the external surfaces of a fractal box') logger.exception(self.__str__() + ' can only be used on the external surfaces of a fractal box')
raise ValueError
fractalrange = (round_value(limits[0] / grid.dz), round_value(limits[1] / grid.dz)) fractalrange = (round_value(limits[0] / grid.dz), round_value(limits[1] / grid.dz))
# zminus surface # zminus surface
if zs == volume.zs: if zs == volume.zs:
if fractalrange[0] < 0 or fractalrange[1] > volume.zf: if fractalrange[0] < 0 or fractalrange[1] > volume.zf:
raise CmdInputError(self.__str__() + ' cannot apply fractal surface to fractal box as it would exceed either the upper coordinates of the fractal box or the domain in the x direction') logger.exception(self.__str__() + ' cannot apply fractal surface to fractal box as it would exceed either the upper coordinates of the fractal box or the domain in the x direction')
raise ValueError
requestedsurface = 'zminus' requestedsurface = 'zminus'
# zplus surface # zplus surface
elif zf == volume.zf: elif zf == volume.zf:
if fractalrange[0] < volume.zs or fractalrange[1] > grid.nz: if fractalrange[0] < volume.zs or fractalrange[1] > grid.nz:
raise CmdInputError(self.__str__() + ' cannot apply fractal surface to fractal box as it would exceed either the lower coordinates of the fractal box or the domain in the z direction') logger.exception(self.__str__() + ' cannot apply fractal surface to fractal box as it would exceed either the lower coordinates of the fractal box or the domain in the z direction')
raise ValueError
requestedsurface = 'zplus' requestedsurface = 'zplus'
else: else:
raise CmdInputError(self.__str__() + ' dimensions are not specified correctly') logger.exception(self.__str__() + ' dimensions are not specified correctly')
raise ValueError
surface = FractalSurface(xs, xf, ys, yf, zs, zf, frac_dim) surface = FractalSurface(xs, xf, ys, yf, zs, zf, frac_dim)
surface.surfaceID = requestedsurface surface.surfaceID = requestedsurface
@@ -152,7 +169,8 @@ class AddSurfaceRoughness(UserObjectGeometry):
# List of existing surfaces IDs # List of existing surfaces IDs
existingsurfaceIDs = [x.surfaceID for x in volume.fractalsurfaces] existingsurfaceIDs = [x.surfaceID for x in volume.fractalsurfaces]
if surface.surfaceID in existingsurfaceIDs: if surface.surfaceID in existingsurfaceIDs:
raise CmdInputError(self.__str__() + f' has already been used on the {surface.surfaceID} surface') logger.exception(self.__str__() + f' has already been used on the {surface.surfaceID} surface')
raise ValueError
surface.generate_fractal_surface(grid) surface.generate_fractal_surface(grid)
volume.fractalsurfaces.append(surface) volume.fractalsurfaces.append(surface)

查看文件

@@ -20,7 +20,6 @@ import logging
import gprMax.config as config import gprMax.config as config
from ..exceptions import CmdInputError
from ..materials import DispersiveMaterial from ..materials import DispersiveMaterial
from ..utilities import round_value from ..utilities import round_value
from .cmds_geometry import UserObjectGeometry from .cmds_geometry import UserObjectGeometry
@@ -53,28 +52,33 @@ class AddSurfaceWater(UserObjectGeometry):
fractal_box_id = self.kwargs['fractal_box_id'] fractal_box_id = self.kwargs['fractal_box_id']
depth = self.kwargs['depth'] depth = self.kwargs['depth']
except KeyError: except KeyError:
raise CmdInputError(self.__str__() + ' requires exactly eight parameters') logger.exception(self.__str__() + ' requires exactly eight parameters')
raise
# Get the correct fractal volume # Get the correct fractal volume
volumes = [volume for volume in grid.fractalvolumes if volume.ID == fractal_box_id] volumes = [volume for volume in grid.fractalvolumes if volume.ID == fractal_box_id]
if volumes: if volumes:
volume = volumes[0] volume = volumes[0]
else: else:
raise CmdInputError(self.__str__() + f' cannot find FractalBox {fractal_box_id}') logger.exception(self.__str__() + f' cannot find FractalBox {fractal_box_id}')
raise ValueError
p1, p2 = uip.check_box_points(p1, p2, self.__str__()) p1, p2 = uip.check_box_points(p1, p2, self.__str__())
xs, ys, zs = p1 xs, ys, zs = p1
xf, yf, zf = p2 xf, yf, zf = p2
if depth <= 0: if depth <= 0:
raise CmdInputError(self.__str__() + ' requires a positive value for the depth of water') logger.exception(self.__str__() + ' requires a positive value for the depth of water')
raise ValueError
# Check for valid orientations # Check for valid orientations
if xs == xf: if xs == xf:
if ys == yf or zs == zf: if ys == yf or zs == zf:
raise CmdInputError(self.__str__() + ' dimensions are not specified correctly') logger.exception(self.__str__() + ' dimensions are not specified correctly')
raise ValueError
if xs != volume.xs and xs != volume.xf: if xs != volume.xs and xs != volume.xf:
raise CmdInputError(self.__str__() + ' can only be used on the external surfaces of a fractal box') logger.exception(self.__str__() + ' can only be used on the external surfaces of a fractal box')
raise ValueError
# xminus surface # xminus surface
if xs == volume.xs: if xs == volume.xs:
requestedsurface = 'xminus' requestedsurface = 'xminus'
@@ -86,9 +90,11 @@ class AddSurfaceWater(UserObjectGeometry):
elif ys == yf: elif ys == yf:
if xs == xf or zs == zf: if xs == xf or zs == zf:
raise CmdInputError(self.__str__() + ' dimensions are not specified correctly') logger.exception(self.__str__() + ' dimensions are not specified correctly')
raise ValueError
if ys != volume.ys and ys != volume.yf: if ys != volume.ys and ys != volume.yf:
raise CmdInputError(self.__str__() + ' can only be used on the external surfaces of a fractal box') logger.exception(self.__str__() + ' can only be used on the external surfaces of a fractal box')
raise ValueError
# yminus surface # yminus surface
if ys == volume.ys: if ys == volume.ys:
requestedsurface = 'yminus' requestedsurface = 'yminus'
@@ -100,9 +106,11 @@ class AddSurfaceWater(UserObjectGeometry):
elif zs == zf: elif zs == zf:
if xs == xf or ys == yf: if xs == xf or ys == yf:
raise CmdInputError(self.__str__() + ' dimensions are not specified correctly') logger.exception(self.__str__() + ' dimensions are not specified correctly')
raise ValueError
if zs != volume.zs and zs != volume.zf: if zs != volume.zs and zs != volume.zf:
raise CmdInputError(self.__str__() + ' can only be used on the external surfaces of a fractal box') logger.exception(self.__str__() + ' can only be used on the external surfaces of a fractal box')
raise ValueError
# zminus surface # zminus surface
if zs == volume.zs: if zs == volume.zs:
requestedsurface = 'zminus' requestedsurface = 'zminus'
@@ -113,17 +121,20 @@ class AddSurfaceWater(UserObjectGeometry):
filldepth = filldepthcells * grid.dz filldepth = filldepthcells * grid.dz
else: else:
raise CmdInputError(self.__str__() + ' dimensions are not specified correctly') logger.exception(self.__str__() + ' dimensions are not specified correctly')
raise ValueError
surface = next((x for x in volume.fractalsurfaces if x.surfaceID == requestedsurface), None) surface = next((x for x in volume.fractalsurfaces if x.surfaceID == requestedsurface), None)
if not surface: if not surface:
raise CmdInputError(self.__str__() + ' specified surface {} does not have a rough surface applied'.format(requestedsurface)) logger.exception(self.__str__() + f' specified surface {requestedsurface} does not have a rough surface applied')
raise ValueError
surface.filldepth = filldepthcells surface.filldepth = filldepthcells
# Check that requested fill depth falls within range of surface roughness # Check that requested fill depth falls within range of surface roughness
if surface.filldepth < surface.fractalrange[0] or surface.filldepth > surface.fractalrange[1]: if surface.filldepth < surface.fractalrange[0] or surface.filldepth > surface.fractalrange[1]:
raise CmdInputError(self.__str__() + ' requires a value for the depth of water that lies with the range of the requested surface roughness') logger.exception(self.__str__() + ' requires a value for the depth of water that lies with the range of the requested surface roughness')
raise ValueError
# Check to see if water has been already defined as a material # Check to see if water has been already defined as a material
if not any(x.ID == 'water' for x in grid.materials): if not any(x.ID == 'water' for x in grid.materials):
@@ -141,6 +152,7 @@ class AddSurfaceWater(UserObjectGeometry):
water = next((x for x in grid.materials if x.ID == 'water')) water = next((x for x in grid.materials if x.ID == 'water'))
testwater = next((x for x in water.tau if x < grid.dt), None) testwater = next((x for x in water.tau if x < grid.dt), None)
if testwater: if testwater:
raise CmdInputError(self.__str__() + ' requires the time step for the model to be less than the relaxation time required to model water.') logger.exception(self.__str__() + ' requires the time step for the model to be less than the relaxation time required to model water.')
raise ValueError
logger.info(f'Water on surface from {xs * grid.dx:g}m, {ys * grid.dy:g}m, {zs * grid.dz:g}m, to {xf * grid.dx:g}m, {yf * grid.dy:g}m, {zf * grid.dz:g}m with depth {filldepth:g}m, added to {surface.operatingonID}.') logger.info(f'Water on surface from {xs * grid.dx:g}m, {ys * grid.dy:g}m, {zs * grid.dz:g}m, to {xf * grid.dx:g}m, {yf * grid.dy:g}m, {zf * grid.dz:g}m with depth {filldepth:g}m, added to {surface.operatingonID}.')

查看文件

@@ -22,7 +22,6 @@ import gprMax.config as config
import numpy as np import numpy as np
from ..cython.geometry_primitives import build_box from ..cython.geometry_primitives import build_box
from ..exceptions import CmdInputError
from ..materials import Material from ..materials import Material
from .cmds_geometry import UserObjectGeometry from .cmds_geometry import UserObjectGeometry
@@ -52,9 +51,10 @@ class Box(UserObjectGeometry):
try: try:
p1 = self.kwargs['p1'] p1 = self.kwargs['p1']
p2 = self.kwargs['p2'] p2 = self.kwargs['p2']
except KeyError: except KeyError:
raise CmdInputError(self.__str__() + ' Please specify two points.') logger.exception(self.__str__() + ' Please specify two points.')
raise
# check materials have been specified # check materials have been specified
# isotropic case # isotropic case
try: try:
@@ -64,7 +64,8 @@ class Box(UserObjectGeometry):
try: try:
materialsrequested = self.kwargs['material_ids'] materialsrequested = self.kwargs['material_ids']
except KeyError: except KeyError:
raise CmdInputError(self.__str__() + ' No materials have been specified') logger.exception(self.__str__() + ' No materials have been specified')
raise
# check averaging # check averaging
try: try:
@@ -83,7 +84,8 @@ class Box(UserObjectGeometry):
if len(materials) != len(materialsrequested): if len(materials) != len(materialsrequested):
notfound = [x for x in materialsrequested if x not in materials] notfound = [x for x in materialsrequested if x not in materials]
raise CmdInputError(self.__str__() + ' material(s) {} do not exist'.format(notfound)) logger.exception(self.__str__() + f' material(s) {notfound} do not exist')
raise ValueError
# Isotropic case # Isotropic case
if len(materials) == 1: if len(materials) == 1:

查看文件

@@ -32,17 +32,17 @@ class UserObjectGeometry:
def __str__(self): def __str__(self):
"""Readable string of parameters given to object.""" """Readable string of parameters given to object."""
s = '' s = ''
for k, v in self.kwargs.items(): for _, v in self.kwargs.items():
if isinstance(v, tuple) or isinstance(v, list): if isinstance(v, tuple) or isinstance(v, list):
v = ' '.join([str(el) for el in v]) v = ' '.join([str(el) for el in v])
s += str(v) + ' ' s += str(v) + ' '
return f'{self.hash}: {s[:-1]}' return f'{self.hash}: {s[:-1]}'
def params_str(self):
"""Readable user string as per hash commands."""
return self.hash + ': ' + str(self.kwargs)
def create(self, grid, uip): def create(self, grid, uip):
"""Create the object and add it to the grid.""" """Create the object and add it to the grid."""
logger.debug('This method is incomplete') pass
def rotate(self):
"""Rotate geometry object."""
logger.debug('Must complete rotate method.')

查看文件

@@ -22,7 +22,6 @@ import gprMax.config as config
import numpy as np import numpy as np
from ..cython.geometry_primitives import build_cylinder from ..cython.geometry_primitives import build_cylinder
from ..exceptions import CmdInputError
from ..materials import Material from ..materials import Material
from .cmds_geometry import UserObjectGeometry from .cmds_geometry import UserObjectGeometry
@@ -55,16 +54,16 @@ class Cylinder(UserObjectGeometry):
p1 = self.kwargs['p1'] p1 = self.kwargs['p1']
p2 = self.kwargs['p2'] p2 = self.kwargs['p2']
r = self.kwargs['r'] r = self.kwargs['r']
except KeyError: except KeyError:
raise CmdInputError(self.__str__() + ' Please specify 2 points and a radius') logger.exception(self.__str__() + ' please specify 2 points and a radius')
raise
# check averaging # check averaging
try: try:
# go with user specified averaging # go with user specified averaging
averagecylinder = self.kwargs['averaging'] averagecylinder = self.kwargs['averaging']
except KeyError: except KeyError:
# if they havent specfied - go with the grid default # if they havent specified - go with the grid default
averagecylinder = grid.averagevolumeobjects averagecylinder = grid.averagevolumeobjects
# check materials have been specified # check materials have been specified
@@ -76,20 +75,23 @@ class Cylinder(UserObjectGeometry):
try: try:
materialsrequested = self.kwargs['material_ids'] materialsrequested = self.kwargs['material_ids']
except KeyError: except KeyError:
raise CmdInputError(self.__str__() + ' No materials have been specified') logger.exception(self.__str__() + ' no materials have been specified')
raise
x1, y1, z1 = uip.round_to_grid(p1) x1, y1, z1 = uip.round_to_grid(p1)
x2, y2, z2 = uip.round_to_grid(p2) x2, y2, z2 = uip.round_to_grid(p2)
if r <= 0: if r <= 0:
raise CmdInputError(self.__str__() + ' the radius {:g} should be a positive value.'.format(r)) logger.exception(self.__str__() + f' the radius {r:g} should be a positive value.')
raise ValueError
# Look up requested materials in existing list of material instances # Look up requested materials in existing list of material instances
materials = [y for x in materialsrequested for y in grid.materials if y.ID == x] materials = [y for x in materialsrequested for y in grid.materials if y.ID == x]
if len(materials) != len(materialsrequested): if len(materials) != len(materialsrequested):
notfound = [x for x in materialsrequested if x not in materials] notfound = [x for x in materialsrequested if x not in materials]
raise CmdInputError(self.__str__() + ' material(s) {} do not exist'.format(notfound)) logger.exception(self.__str__() + f' material(s) {notfound} do not exist')
raise ValueError
# Isotropic case # Isotropic case
if len(materials) == 1: if len(materials) == 1:

查看文件

@@ -22,7 +22,6 @@ import gprMax.config as config
import numpy as np import numpy as np
from ..cython.geometry_primitives import build_cylindrical_sector from ..cython.geometry_primitives import build_cylindrical_sector
from ..exceptions import CmdInputError
from ..materials import Material from ..materials import Material
from .cmds_geometry import UserObjectGeometry from .cmds_geometry import UserObjectGeometry
@@ -73,7 +72,8 @@ class CylindricalSector(UserObjectGeometry):
r = self.kwargs['r'] r = self.kwargs['r']
thickness = extent2 - extent1 thickness = extent2 - extent1
except KeyError: except KeyError:
raise CmdInputError(self.__str__()) logger.exception(self.__str__())
raise
# check averaging # check averaging
try: try:
@@ -92,26 +92,31 @@ class CylindricalSector(UserObjectGeometry):
try: try:
materialsrequested = self.kwargs['material_ids'] materialsrequested = self.kwargs['material_ids']
except KeyError: except KeyError:
raise CmdInputError(self.__str__() + ' No materials have been specified') logger.exception(self.__str__() + ' No materials have been specified')
raise
sectorstartangle = 2 * np.pi * (start / 360) sectorstartangle = 2 * np.pi * (start / 360)
sectorangle = 2 * np.pi * (end / 360) sectorangle = 2 * np.pi * (end / 360)
if normal != 'x' and normal != 'y' and normal != 'z': if normal != 'x' and normal != 'y' and normal != 'z':
raise CmdInputError(self.__str__() + ' the normal direction must be either x, y or z.') logger.exception(self.__str__() + ' the normal direction must be either x, y or z.')
raise ValueError
if r <= 0: if r <= 0:
raise CmdInputError(self.__str__() + ' the radius {:g} should be a positive value.'.format(r)) logger.exception(self.__str__() + f' the radius {r:g} should be a positive value.')
if sectorstartangle < 0 or sectorangle <= 0: if sectorstartangle < 0 or sectorangle <= 0:
raise CmdInputError(self.__str__() + ' the starting angle and sector angle should be a positive values.') logger.exception(self.__str__() + ' the starting angle and sector angle should be a positive values.')
raise ValueError
if sectorstartangle >= 2 * np.pi or sectorangle >= 2 * np.pi: if sectorstartangle >= 2 * np.pi or sectorangle >= 2 * np.pi:
raise CmdInputError(self.__str__() + ' the starting angle and sector angle must be less than 360 degrees.') logger.exception(self.__str__() + ' the starting angle and sector angle must be less than 360 degrees.')
raise ValueError
# Look up requested materials in existing list of material instances # Look up requested materials in existing list of material instances
materials = [y for x in materialsrequested for y in grid.materials if y.ID == x] materials = [y for x in materialsrequested for y in grid.materials if y.ID == x]
if len(materials) != len(materialsrequested): if len(materials) != len(materialsrequested):
notfound = [x for x in materialsrequested if x not in materials] notfound = [x for x in materialsrequested if x not in materials]
raise CmdInputError(self.__str__() + ' material(s) {} do not exist'.format(notfound)) logger.exception(self.__str__() + f' material(s) {notfound} do not exist')
raise ValueError
if thickness > 0: if thickness > 0:
# Isotropic case # Isotropic case

查看文件

@@ -22,7 +22,6 @@ import gprMax.config as config
from ..cython.geometry_primitives import (build_edge_x, build_edge_y, from ..cython.geometry_primitives import (build_edge_x, build_edge_y,
build_edge_z) build_edge_z)
from ..exceptions import CmdInputError
from .cmds_geometry import UserObjectGeometry from .cmds_geometry import UserObjectGeometry
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
@@ -50,7 +49,8 @@ class Edge(UserObjectGeometry):
p2 = self.kwargs['p2'] p2 = self.kwargs['p2']
material_id = self.kwargs['material_id'] material_id = self.kwargs['material_id']
except KeyError: except KeyError:
raise CmdInputError(self.__str__() + ' requires exactly 3 parameters') logger.exception(self.__str__() + ' requires exactly 3 parameters')
raise
p1, p2 = uip.check_box_points(p1, p2, self.__str__()) p1, p2 = uip.check_box_points(p1, p2, self.__str__())
xs, ys, zs = p1 xs, ys, zs = p1
@@ -59,13 +59,15 @@ class Edge(UserObjectGeometry):
material = next((x for x in grid.materials if x.ID == material_id), None) material = next((x for x in grid.materials if x.ID == material_id), None)
if not material: if not material:
raise CmdInputError('Material with ID {} does not exist'.format(material_id)) logger.exception(f'Material with ID {material_id} does not exist')
raise ValueError
# Check for valid orientations # Check for valid orientations
# x-orientated wire # x-orientated wire
if xs != xf: if xs != xf:
if ys != yf or zs != zf: if ys != yf or zs != zf:
raise CmdInputError(self.__str__() + ' the edge is not specified correctly') logger.exception(self.__str__() + ' the edge is not specified correctly')
raise ValueError
else: else:
for i in range(xs, xf): for i in range(xs, xf):
build_edge_x(i, ys, zs, material.numID, grid.rigidE, grid.rigidH, grid.ID) build_edge_x(i, ys, zs, material.numID, grid.rigidE, grid.rigidH, grid.ID)
@@ -73,7 +75,8 @@ class Edge(UserObjectGeometry):
# y-orientated wire # y-orientated wire
elif ys != yf: elif ys != yf:
if xs != xf or zs != zf: if xs != xf or zs != zf:
raise CmdInputError(self.__str__() + ' the edge is not specified correctly') logger.exception(self.__str__() + ' the edge is not specified correctly')
raise ValueError
else: else:
for j in range(ys, yf): for j in range(ys, yf):
build_edge_y(xs, j, zs, material.numID, grid.rigidE, grid.rigidH, grid.ID) build_edge_y(xs, j, zs, material.numID, grid.rigidE, grid.rigidH, grid.ID)
@@ -81,7 +84,8 @@ class Edge(UserObjectGeometry):
# z-orientated wire # z-orientated wire
elif zs != zf: elif zs != zf:
if xs != xf or ys != yf: if xs != xf or ys != yf:
raise CmdInputError(self.__str__() + ' the edge is not specified correctly') logger.exception(self.__str__() + ' the edge is not specified correctly')
raise ValueError
else: else:
for k in range(zs, zf): for k in range(zs, zf):
build_edge_z(xs, ys, k, material.numID, grid.rigidE, grid.rigidH, grid.ID) build_edge_z(xs, ys, k, material.numID, grid.rigidE, grid.rigidH, grid.ID)

查看文件

@@ -21,7 +21,6 @@ import logging
import gprMax.config as config import gprMax.config as config
import numpy as np import numpy as np
from ..exceptions import CmdInputError
from ..fractals import FractalVolume from ..fractals import FractalVolume
from .cmds_geometry import UserObjectGeometry from .cmds_geometry import UserObjectGeometry
@@ -65,7 +64,8 @@ class FractalBox(UserObjectGeometry):
mixing_model_id = self.kwargs['mixing_model_id'] mixing_model_id = self.kwargs['mixing_model_id']
ID = self.kwargs['id'] ID = self.kwargs['id']
except KeyError: except KeyError:
raise CmdInputError(self.__str__() + ' Incorrect parameters') logger.exception(self.__str__() + ' Incorrect parameters')
raise
try: try:
seed = self.kwargs['seed'] seed = self.kwargs['seed']
@@ -88,15 +88,19 @@ class FractalBox(UserObjectGeometry):
xf, yf, zf = p2 xf, yf, zf = p2
if frac_dim < 0: if frac_dim < 0:
raise CmdInputError(self.__str__() + ' requires a positive value for the fractal dimension') logger.exception(self.__str__() + ' requires a positive value for the fractal dimension')
raise ValueError
if weighting[0] < 0: if weighting[0] < 0:
raise CmdInputError(self.__str__() + ' requires a positive value for the fractal weighting in the x direction') logger.exception(self.__str__() + ' requires a positive value for the fractal weighting in the x direction')
raise ValueError
if weighting[1] < 0: if weighting[1] < 0:
raise CmdInputError(self.__str__() + ' requires a positive value for the fractal weighting in the y direction') logger.exception(self.__str__() + ' requires a positive value for the fractal weighting in the y direction')
raise ValueError
if weighting[2] < 0: if weighting[2] < 0:
raise CmdInputError(self.__str__() + ' requires a positive value for the fractal weighting in the z direction') logger.exception(self.__str__() + ' requires a positive value for the fractal weighting in the z direction')
if n_materials < 0: if n_materials < 0:
raise CmdInputError(self.__str__() + ' requires a positive value for the number of bins') logger.exception(self.__str__() + ' requires a positive value for the number of bins')
raise ValueError
# Find materials to use to build fractal volume, either from mixing models or normal materials # Find materials to use to build fractal volume, either from mixing models or normal materials
mixingmodel = next((x for x in grid.mixingmodels if x.ID == mixing_model_id), None) mixingmodel = next((x for x in grid.mixingmodels if x.ID == mixing_model_id), None)
@@ -105,11 +109,13 @@ class FractalBox(UserObjectGeometry):
if mixingmodel: if mixingmodel:
if nbins == 1: if nbins == 1:
raise CmdInputError(self.__str__() + ' must be used with more than one material from the mixing model.') logger.exception(self.__str__() + ' must be used with more than one material from the mixing model.')
raise ValueError
# Create materials from mixing model as number of bins now known from fractal_box command # Create materials from mixing model as number of bins now known from fractal_box command
mixingmodel.calculate_debye_properties(nbins, grid) mixingmodel.calculate_debye_properties(nbins, grid)
elif not material: elif not material:
raise CmdInputError(self.__str__() + ' mixing model or material with ID {} does not exist'.format(mixing_model_id)) logger.exception(self.__str__() + f' mixing model or material with ID {mixing_model_id} does not exist')
raise ValueError
volume = FractalVolume(xs, xf, ys, yf, zs, zf, frac_dim) volume = FractalVolume(xs, xf, ys, yf, zs, zf, frac_dim)
volume.ID = ID volume.ID = ID

查看文件

@@ -16,14 +16,17 @@
# You should have received a copy of the GNU General Public License # You should have received a copy of the GNU General Public License
# along with gprMax. If not, see <http://www.gnu.org/licenses/>. # along with gprMax. If not, see <http://www.gnu.org/licenses/>.
import logging
import gprMax.config as config import gprMax.config as config
import numpy as np import numpy as np
from ..cython.geometry_primitives import (build_voxels_from_array, from ..cython.geometry_primitives import (build_voxels_from_array,
build_voxels_from_array_mask) build_voxels_from_array_mask)
from ..exceptions import CmdInputError
from .cmds_geometry import UserObjectGeometry from .cmds_geometry import UserObjectGeometry
logger = logging.getLogger(__name__)
class FractalBoxBuilder(UserObjectGeometry): class FractalBoxBuilder(UserObjectGeometry):
"""Internal class for fractal box modifications. This class should be used """Internal class for fractal box modifications. This class should be used
@@ -300,7 +303,8 @@ class FractalBoxBuilder(UserObjectGeometry):
else: else:
if volume.nbins == 1: if volume.nbins == 1:
raise CmdInputError(self.__str__() + ' is being used with a single material and no modifications, therefore please use a #box command instead.') logger.exception(self.__str__() + ' is being used with a single material and no modifications, therefore please use a #box command instead.')
raise ValueError
else: else:
volume.generate_fractal_volume(grid) volume.generate_fractal_volume(grid)
volume.fractalvolume += volume.mixingmodel.startmaterialnum volume.fractalvolume += volume.mixingmodel.startmaterialnum

查看文件

@@ -23,7 +23,6 @@ import gprMax.config as config
import h5py import h5py
from ..cython.geometry_primitives import build_voxels_from_array from ..cython.geometry_primitives import build_voxels_from_array
from ..exceptions import CmdInputError
from ..hash_cmds_file import get_user_objects from ..hash_cmds_file import get_user_objects
from ..utilities import round_value from ..utilities import round_value
from .cmds_geometry import UserObjectGeometry from .cmds_geometry import UserObjectGeometry
@@ -43,8 +42,9 @@ class GeometryObjectsRead(UserObjectGeometry):
p1 = self.kwargs['p1'] p1 = self.kwargs['p1']
geofile = self.kwargs['geofile'] geofile = self.kwargs['geofile']
matfile = self.kwargs['matfile'] matfile = self.kwargs['matfile']
except: except KeyError:
raise CmdInputError(self.__str__() + 'requires exactly five parameters') logger.exception(self.__str__() + 'requires exactly five parameters')
raise
# discretise the point using uip object. This has different behaviour # discretise the point using uip object. This has different behaviour
# depending on the type of uip object. So we can use it for # depending on the type of uip object. So we can use it for
@@ -94,7 +94,8 @@ class GeometryObjectsRead(UserObjectGeometry):
f = h5py.File(geofile, 'r') f = h5py.File(geofile, 'r')
dx_dy_dz = f.attrs['dx_dy_dz'] dx_dy_dz = f.attrs['dx_dy_dz']
if round_value(dx_dy_dz[0] / G.dx) != 1 or round_value(dx_dy_dz[1] / G.dy) != 1 or round_value(dx_dy_dz[2] / G.dz) != 1: if round_value(dx_dy_dz[0] / G.dx) != 1 or round_value(dx_dy_dz[1] / G.dy) != 1 or round_value(dx_dy_dz[2] / G.dz) != 1:
raise CmdInputError(self.__str__() + ' requires the spatial resolution of the geometry objects file to match the spatial resolution of the model') logger.exception(self.__str__() + ' requires the spatial resolution of the geometry objects file to match the spatial resolution of the model')
raise ValueError
data = f['/data'][:] data = f['/data'][:]

查看文件

@@ -22,7 +22,6 @@ import gprMax.config as config
from ..cython.geometry_primitives import (build_face_xy, build_face_xz, from ..cython.geometry_primitives import (build_face_xy, build_face_xz,
build_face_yz) build_face_yz)
from ..exceptions import CmdInputError
from .cmds_geometry import UserObjectGeometry from .cmds_geometry import UserObjectGeometry
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
@@ -50,7 +49,8 @@ class Plate(UserObjectGeometry):
p1 = self.kwargs['p1'] p1 = self.kwargs['p1']
p2 = self.kwargs['p2'] p2 = self.kwargs['p2']
except KeyError: except KeyError:
raise CmdInputError(self.__str__() + ' 2 points must be specified') logger.exception(self.__str__() + ' 2 points must be specified')
raise
# isotropic # isotropic
try: try:
@@ -60,7 +60,8 @@ class Plate(UserObjectGeometry):
try: try:
materialsrequested = self.kwargs['material_ids'] materialsrequested = self.kwargs['material_ids']
except KeyError: except KeyError:
raise CmdInputError(self.__str__() + ' No materials have been specified') logger.exception(self.__str__() + ' No materials have been specified')
raise
p1, p2 = uip.check_box_points(p1, p2, self.__str__()) p1, p2 = uip.check_box_points(p1, p2, self.__str__())
xs, ys, zs = p1 xs, ys, zs = p1
@@ -69,25 +70,30 @@ class Plate(UserObjectGeometry):
# Check for valid orientations # Check for valid orientations
if xs == xf: if xs == xf:
if ys == yf or zs == zf: if ys == yf or zs == zf:
raise CmdInputError(self.__str__() + ' the plate is not specified correctly') logger.exception(self.__str__() + ' the plate is not specified correctly')
raise ValueError
elif ys == yf: elif ys == yf:
if xs == xf or zs == zf: if xs == xf or zs == zf:
raise CmdInputError(self.__str__() + ' the plate is not specified correctly') logger.exception(self.__str__() + ' the plate is not specified correctly')
raise ValueError
elif zs == zf: elif zs == zf:
if xs == xf or ys == yf: if xs == xf or ys == yf:
raise CmdInputError(self.__str__() + ' the plate is not specified correctly') logger.exception(self.__str__() + ' the plate is not specified correctly')
raise ValueError
else: else:
raise CmdInputError(self.__str__() + ' the plate is not specified correctly') logger.exception(self.__str__() + ' the plate is not specified correctly')
raise ValueError
# Look up requested materials in existing list of material instances # Look up requested materials in existing list of material instances
materials = [y for x in materialsrequested for y in grid.materials if y.ID == x] materials = [y for x in materialsrequested for y in grid.materials if y.ID == x]
if len(materials) != len(materialsrequested): if len(materials) != len(materialsrequested):
notfound = [x for x in materialsrequested if x not in materials] notfound = [x for x in materialsrequested if x not in materials]
raise CmdInputError(self.__str__() + ' material(s) {} do not exist'.format(notfound)) logger.exception(self.__str__() + f' material(s) {notfound} do not exist')
raise ValueError
# yz-plane plate # yz-plane plate
if xs == xf: if xs == xf:

查看文件

@@ -22,7 +22,6 @@ import gprMax.config as config
import numpy as np import numpy as np
from ..cython.geometry_primitives import build_sphere from ..cython.geometry_primitives import build_sphere
from ..exceptions import CmdInputError
from ..materials import Material from ..materials import Material
from .cmds_geometry import UserObjectGeometry from .cmds_geometry import UserObjectGeometry
@@ -53,7 +52,8 @@ class Sphere(UserObjectGeometry):
p1 = self.kwargs['p1'] p1 = self.kwargs['p1']
r = self.kwargs['r'] r = self.kwargs['r']
except KeyError: except KeyError:
raise CmdInputError(self.__str__() + ' Please specify a point and a radius.') logger.exception(self.__str__() + ' please specify a point and a radius.')
raise
# check averaging # check averaging
try: try:
@@ -72,7 +72,8 @@ class Sphere(UserObjectGeometry):
try: try:
materialsrequested = self.kwargs['material_ids'] materialsrequested = self.kwargs['material_ids']
except KeyError: except KeyError:
raise CmdInputError(self.__str__() + ' No materials have been specified') logger.exception(self.__str__() + ' no materials have been specified')
raise
# Centre of sphere # Centre of sphere
xc, yc, zc = uip.round_to_grid(p1) xc, yc, zc = uip.round_to_grid(p1)
@@ -82,7 +83,8 @@ class Sphere(UserObjectGeometry):
if len(materials) != len(materialsrequested): if len(materials) != len(materialsrequested):
notfound = [x for x in materialsrequested if x not in materials] notfound = [x for x in materialsrequested if x not in materials]
raise CmdInputError(self.__str__() + ' material(s) {} do not exist'.format(notfound)) logger.exception(self.__str__() + f' material(s) {notfound} do not exist')
raise ValueError
# Isotropic case # Isotropic case
if len(materials) == 1: if len(materials) == 1:

查看文件

@@ -22,7 +22,6 @@ import gprMax.config as config
import numpy as np import numpy as np
from ..cython.geometry_primitives import build_triangle from ..cython.geometry_primitives import build_triangle
from ..exceptions import CmdInputError
from ..materials import Material from ..materials import Material
from .cmds_geometry import UserObjectGeometry from .cmds_geometry import UserObjectGeometry
@@ -59,7 +58,8 @@ class Triangle(UserObjectGeometry):
up3 = self.kwargs['p3'] up3 = self.kwargs['p3']
thickness = self.kwargs['thickness'] thickness = self.kwargs['thickness']
except KeyError: except KeyError:
raise CmdInputError(self.params_str() + ' Specify 3 points and a thickness') logger.exception(self.__str__() + ' specify 3 points and a thickness')
raise
# check averaging # check averaging
try: try:
@@ -78,7 +78,8 @@ class Triangle(UserObjectGeometry):
try: try:
materialsrequested = self.kwargs['material_ids'] materialsrequested = self.kwargs['material_ids']
except KeyError: except KeyError:
raise CmdInputError(self.__str__() + ' No materials have been specified') logger.exception(self.__str__() + ' no materials have been specified')
raise
# Check whether points are valid against grid # Check whether points are valid against grid
uip.check_tri_points(up1, up2, up3, object) uip.check_tri_points(up1, up2, up3, object)
@@ -88,7 +89,8 @@ class Triangle(UserObjectGeometry):
x3, y3, z3 = uip.round_to_grid(up3) x3, y3, z3 = uip.round_to_grid(up3)
if thickness < 0: if thickness < 0:
raise CmdInputError(self.__str__() + ' requires a positive value for thickness') logger.exception(self.__str__() + ' requires a positive value for thickness')
raise ValueError
# Check for valid orientations # Check for valid orientations
# yz-plane triangle # yz-plane triangle
@@ -101,14 +103,16 @@ class Triangle(UserObjectGeometry):
elif z1 == z2 and z2 == z3: elif z1 == z2 and z2 == z3:
normal = 'z' normal = 'z'
else: else:
raise CmdInputError(self.__str__() + ' the triangle is not specified correctly') logger.exception(self.__str__() + ' the triangle is not specified correctly')
raise ValueError
# Look up requested materials in existing list of material instances # Look up requested materials in existing list of material instances
materials = [y for x in materialsrequested for y in grid.materials if y.ID == x] materials = [y for x in materialsrequested for y in grid.materials if y.ID == x]
if len(materials) != len(materialsrequested): if len(materials) != len(materialsrequested):
notfound = [x for x in materialsrequested if x not in materials] notfound = [x for x in materialsrequested if x not in materials]
raise CmdInputError(self.__str__() + ' material(s) {} do not exist'.format(notfound)) logger.exception(self.__str__() + f' material(s) {notfound} do not exist')
raise ValueError
if thickness > 0: if thickness > 0:
# Isotropic case # Isotropic case