####################################################################################################
#
# Invoking X3D model self-test:
#
#   $ python Hull.py
#
# Python package x3d.py package is available on PyPI for import.
#   This approach simplifies Python X3D deployment and use.
#   https://pypi.org/project/x3d
#
# Installation:
#       pip install x3d
# or
#       python -m pip install x3d
#
# Developer options for loading x3d package in other Python programs:
#
#    from x3d import *  # preferred approach, terser source that avoids x3d.* class prefixes
#
# or
#    import x3d         # traditional way to subclass x3d package, all classes require x3d.* prefix,
#                       # but python source is very verbose, for example x3d.Material x3d.Shape etc.
#                       # X3dToPython.xslt stylesheet insertPackagePrefix=true supports this option.
#
# Project home page:    # X3D Python Scene Access Interface Library (X3DPSAIL)
#                       # https://www.web3d.org/x3d/stylesheets/python/python.html
# Conversion generator: # https://www.web3d.org/x3d/stylesheets/X3dToPython.xslt
#
####################################################################################################

from x3d import *

newModel=X3D(profile='Immersive',version='3.3',
  head=head(
    children=[
    meta(content='Hull.x3d',name='title'),
    meta(content='T72M model tank hull',name='description'),
    meta(content='Joseph L. Chacon',name='creator'),
    meta(content='20 July 2003',name='created'),
    meta(content='20 October 2019',name='modified'),
    meta(content='1.5',name='version'),
    meta(content='https://www.fas.org/man/dod-101/sys/land/row/t72tank.htm',name='reference'),
    meta(content='https://www.fas.org/man/dod-101/sys/land/row/t72-1.gif',name='reference'),
    meta(content='Zaloga, Steven J., T72 Main Battle Tank 1974 to 1993, Osprey Publishing, Oxford, United Kingdom, 1993.',name='reference'),
    meta(content='T-72, Tank, Soviet, OPFOR',name='subject'),
    meta(content='https://www.web3d.org/x3d/content/examples/Savage/GroundVehicles/T72M/Hull.x3d',name='identifier'),
    meta(content='https://www.web3d.org/x3d/content/README.X3D-Edit.html',name='generator'),
    meta(content='../../license.html',name='license')]),
  Scene=Scene(
    children=[
    WorldInfo(title='Hull.x3d'),
    Background(groundAngle=[1.309,1.570796],groundColor=[(.1,.1,0),(.4,.25,.2),(.6,.6,.6)],skyAngle=[1.309,1.571],skyColor=[(0,.2,.7),(0,.5,1),(1,1,1)]),
    Transform(DEF='Hull',
      children=[
      Transform(DEF='left_deck',rotation=(0,0,1,-.02),translation=(-.15,1.2,1.3),
        children=[
        Transform(rotation=(0,1,0,1.57),
          children=[
          Shape(
            appearance=Appearance(
              material=Material(diffuseColor=(.8,.7,.6))),
            geometry=Box(size=(.55,.15,5.5)))])]),
      Transform(DEF='right_deck',rotation=(0,0,1,-.02),translation=(-.15,1.2,-1.275),
        children=[
        Transform(rotation=(0,1,0,1.57),
          children=[
          Shape(
            appearance=Appearance(
              material=Material(diffuseColor=(.8,.7,.6))),
            geometry=Box(size=(.55,.15,5.5)))])]),
      Transform(DEF='Hull_Main',rotation=(1,0,0,-1.57),
        children=[
        Shape(
          appearance=Appearance(
            material=Material(diffuseColor=(.8,.7,.6))),
          geometry=Extrusion(crossSection=[(-2.6,.5),(-3.1,.9),(-1.7,1.3),(-1.3,1.4),(1.2,1.4),(1.2,1.3),(2.6,1.3),(3.0,1.1),(2.4,.5),(-2.6,.5)],spine=[(0,-1.0,0),(0,1.0,0)]))]),
      Transform(DEF='L_1_skirt',rotation=(1,0,0,-1.57),translation=(0,0,1.6),
        children=[
        Shape(
          appearance=Appearance(
            material=Material(diffuseColor=(.8,.7,.6))),
          geometry=Extrusion(crossSection=[(-2.9,.8),(-2.9,1.3),(-1.525,1.25),(-1.525,.8)],spine=[(0,0,0),(0,.05,0)]))]),
      Transform(DEF='L_2_skirt',rotation=(1,0,0,-1.57),translation=(0,0,1.6),
        children=[
        Shape(
          appearance=Appearance(
            material=Material(diffuseColor=(.8,.7,.6))),
          geometry=Extrusion(crossSection=[(-1.5,.8),(-1.5,1.25),(-.225,1.2),(-.225,.8)],spine=[(0,0,0),(0,.05,0)]))]),
      Transform(DEF='L_3_skirt',rotation=(1,0,0,-1.57),translation=(0,0,1.6),
        children=[
        Shape(
          appearance=Appearance(
            material=Material(diffuseColor=(.8,.7,.6))),
          geometry=Extrusion(crossSection=[(-.2,.8),(-.2,1.2),(.975,1.2),(1.075,.8)],spine=[(0,0,0),(0,.05,0)]))]),
      Transform(DEF='L_4_skirt',rotation=(1,0,0,-1.57),translation=(0,0,1.6),
        children=[
        Shape(
          appearance=Appearance(
            material=Material(diffuseColor=(.8,.7,.6))),
          geometry=Extrusion(crossSection=[(1.1,.8),(1,1.2),(2.55,1.2),(2.55,.9)],spine=[(0,0,0),(0,.05,0)]))]),
      Transform(DEF='R_1_skirt',rotation=(1,0,0,-1.57),translation=(0,0,-1.55),
        children=[
        Shape(
          appearance=Appearance(
            material=Material(diffuseColor=(.8,.7,.6))),
          geometry=Extrusion(crossSection=[(-2.9,.8),(-2.9,1.3),(-1.525,1.25),(-1.525,.8)],spine=[(0,0,0),(0,.05,0)]))]),
      Transform(DEF='R_2_skirt',rotation=(1,0,0,-1.57),translation=(0,0,-1.55),
        children=[
        Shape(
          appearance=Appearance(
            material=Material(diffuseColor=(.8,.7,.6))),
          geometry=Extrusion(crossSection=[(-1.5,.8),(-1.5,1.25),(-.225,1.2),(-.225,.8)],spine=[(0,0,0),(0,.05,0)]))]),
      Transform(DEF='R_3_skirt',rotation=(1,0,0,-1.57),translation=(0,0,-1.55),
        children=[
        Shape(
          appearance=Appearance(
            material=Material(diffuseColor=(.8,.7,.6))),
          geometry=Extrusion(crossSection=[(-.2,.8),(-.2,1.2),(.975,1.2),(1.075,.8)],spine=[(0,0,0),(0,.05,0)]))]),
      Transform(DEF='R_4_skirt',rotation=(1,0,0,-1.57),translation=(0,0,-1.55),
        children=[
        Shape(
          appearance=Appearance(
            material=Material(diffuseColor=(.8,.7,.6))),
          geometry=Extrusion(crossSection=[(1.1,.8),(1,1.2),(2.55,1.2),(2.55,.9)],spine=[(0,0,0),(0,.05,0)]))]),
      Transform(DEF='L_inside_skirt',rotation=(1,0,0,-1.57),translation=(0,0,1.05),
        children=[
        Shape(
          appearance=Appearance(
            material=Material(diffuseColor=(.8,.7,.6))),
          geometry=Extrusion(crossSection=[(-2.9,.8),(-2.9,1.3),(-1.525,1.25),(-1.525,.8)],spine=[(0,0,0),(0,.05,0)]))]),
      Transform(DEF='R_inside_skirt',rotation=(1,0,0,-1.57),translation=(0,0,-.995),
        children=[
        Shape(
          appearance=Appearance(
            material=Material(diffuseColor=(.8,.7,.6))),
          geometry=Extrusion(crossSection=[(-2.9,.8),(-2.9,1.3),(-1.525,1.25),(-1.525,.8)],spine=[(0,0,0),(0,.05,0)]))]),
      Transform(DEF='all_skirt_bolts',
        children=[
        Transform(translation=(-2.9,0,0),
          children=[
          Group(DEF='skirt_bolts',
            children=[
            Transform(translation=(0,1.1,1.6),
              children=[
              Shape(
                appearance=Appearance(
                  material=Material(diffuseColor=(.8,.7,.6))),
                geometry=Box(size=(.1,.1,.1)))]),
            Transform(translation=(0,.9,1.6),
              children=[
              Shape(
                appearance=Appearance(
                  material=Material(diffuseColor=(.8,.7,.6))),
                geometry=Box(size=(.1,.1,.1)))])])]),
        Transform(translation=(-1.5,0,0),
          children=[
          Group(USE='skirt_bolts')]),
        Transform(translation=(-.2,0,0),
          children=[
          Group(USE='skirt_bolts')]),
        Transform(translation=(1.05,0,0),
          children=[
          Group(USE='skirt_bolts')]),
        Transform(translation=(1.05,0,0),
          children=[
          Group(USE='skirt_bolts')]),
        Transform(translation=(-2.9,0,-3.2),
          children=[
          Group(USE='skirt_bolts')]),
        Transform(translation=(-1.5,0,-3.2),
          children=[
          Group(USE='skirt_bolts')]),
        Transform(translation=(-.2,0,-3.2),
          children=[
          Group(USE='skirt_bolts')]),
        Transform(translation=(1.05,0,-3.2),
          children=[
          Group(USE='skirt_bolts')])]),
      Transform(DEF='L_front_fender',rotation=(1,0,0,-1.57),translation=(-2.9,.825,1.6),
        children=[
        Transform(scale=(.1,.1,.1),
          children=[
          Shape(
            appearance=Appearance(
              material=Material(diffuseColor=(.8,.7,.6))),
            geometry=Extrusion(creaseAngle=.785,crossSection=[(0,0),(0,5.1),(-1,5.066),(-2,5.033),(-3,5),(-3.4,4.9),(-3.8,4.8),(-4.1,4.7),(-4.3,4.6),(-4.6,4.4),(-4.7,4.3),(-4.9,4.1),(-5.1,3.9),(-5.4,3.5),(-5.5,3.3),(-5.7,3),(-5.8,2.7),(-5.9,2.5),(-6,2)],solid=False,spine=[(0,0,0),(0,6,0)]))])]),
      Transform(DEF='R_front_fender',rotation=(1,0,0,-1.57),translation=(-2.9,.825,-.98),
        children=[
        Transform(scale=(.1,.1,.1),
          children=[
          Shape(
            appearance=Appearance(
              material=Material(diffuseColor=(.8,.7,.6))),
            geometry=Extrusion(creaseAngle=.785,crossSection=[(0,0),(0,5.1),(-1,5.066),(-2,5.033),(-3,5),(-3.4,4.9),(-3.8,4.8),(-4.1,4.7),(-4.3,4.6),(-4.6,4.4),(-4.7,4.3),(-4.9,4.1),(-5.1,3.9),(-5.4,3.5),(-5.5,3.3),(-5.7,3),(-5.8,2.7),(-5.9,2.5),(-6,2)],solid=False,spine=[(0,0,0),(0,6,0)]))])]),
      Transform(DEF='driver_hatch',
        children=[
        Transform(translation=(-1.5,1.2,0),
          children=[
          Shape(
            appearance=Appearance(
              material=Material(diffuseColor=(.8,.7,.6))),
            geometry=Cylinder(height=.3,radius=.3))]),
        Transform(translation=(-1.5,1.4,0),
          children=[
          Shape(
            appearance=Appearance(
              material=Material(diffuseColor=(.8,.7,.6))),
            geometry=Cylinder(height=.05,radius=.2))])]),
      Transform(DEF='trim_vane',translation=(0,-.05,0),
        children=[
        Transform(rotation=(0,1,0,.785),translation=(-2.3,1.2,.3),
          children=[
          Transform(rotation=(1,0,0,-.2),
            children=[
            Shape(
              appearance=Appearance(
                material=Material(diffuseColor=(.8,.7,.6))),
              geometry=Box(size=(.05,.05,.9)))])]),
        Transform(rotation=(0,1,0,-.785),translation=(-2.3,1.2,-.3),
          children=[
          Transform(rotation=(1,0,0,.2),
            children=[
            Shape(
              appearance=Appearance(
                material=Material(diffuseColor=(.8,.7,.6))),
              geometry=Box(size=(.05,.05,.9)))])])]),
      Transform(DEF='L_rear_fender',
        children=[
        Transform(rotation=(1,0,0,-1.57),translation=(0,.0,1.6),
          children=[
          Shape(
            appearance=Appearance(
              material=Material(diffuseColor=(.8,.7,.6))),
            geometry=Extrusion(crossSection=[(2.55,.9),(2.55,1.2),(2.9,1.2),(2.9,1.1)],spine=[(0,0,0),(0,.6,0)]))])]),
      Transform(DEF='R_rear_fender',
        children=[
        Transform(rotation=(1,0,0,-1.57),translation=(0,.0,-1.),
          children=[
          Shape(
            appearance=Appearance(
              material=Material(diffuseColor=(.8,.7,.6))),
            geometry=Extrusion(crossSection=[(2.55,.9),(2.55,1.2),(2.9,1.2),(2.9,1.1)],spine=[(0,0,0),(0,.6,0)]))])]),
      Transform(DEF='grill',
        children=[
        Transform(rotation=(0,0,1,1.57),translation=(2.2,1.3,0),
          children=[
          Shape(
            appearance=Appearance(
              material=Material(diffuseColor=(.5,.5,.5))),
            geometry=Box(size=(.05,.7,1.8)))])]),
      Transform(DEF='Lights',
        children=[
        Transform(translation=(-2.8,-1.15,-1.47),
          children=[
          Group(DEF='Head_lights',
            children=[
            Transform(DEF='Head_light',rotation=(0,0,1,-1.57),scale=(.05,.175,.05),translation=(.1,2.3,.6),
              children=[
              Shape(
                appearance=Appearance(
                  material=Material(diffuseColor=(.8,.7,.6))),
                geometry=Extrusion(creaseAngle=0.785,crossSection=[(1.00,0.00),(0.92,-0.38),(0.71,-0.71),(0.38,-0.92),(0.00,-1.00),(-0.38,-0.92),(-0.71,-0.71),(-0.92,-0.38),(-1.00,-0.00),(-0.92,0.38),(-0.71,0.71),(-0.38,0.92),(0.00,1.00),(0.38,0.92),(0.71,0.71),(0.92,0.38),(1.00,0.00)],scale=[(1,1),(.8,.8),(.4,.4)],spine=[(0,0,0),(0,.2,0),(0,.3,0)]))]),
            Transform(translation=(.12,2.2,.65),
              children=[
              Shape(
                appearance=Appearance(
                  material=Material(diffuseColor=(.8,.7,.6))),
                geometry=Box(size=(.01,.2,.01)))]),
            Transform(rotation=(0,0,1,-1.57),scale=(.04,.05,.04),translation=(.09,2.3,.6),
              children=[
              Shape(
                appearance=Appearance(
                  material=Material(diffuseColor=(.8,.8,.8))),
                geometry=Extrusion(creaseAngle=0.785,crossSection=[(1.00,0.00),(0.92,-0.38),(0.71,-0.71),(0.38,-0.92),(0.00,-1.00),(-0.38,-0.92),(-0.71,-0.71),(-0.92,-0.38),(-1.00,-0.00),(-0.92,0.38),(-0.71,0.71),(-0.38,0.92),(0.00,1.00),(0.38,0.92),(0.71,0.71),(0.92,0.38),(1.00,0.00)],scale=[(1,1),(.8,.8),(.4,.4)],spine=[(0,0,0),(0,.2,0),(0,.3,0)]))]),
            Transform(translation=(.12,2.2,.55),
              children=[
              Shape(
                appearance=Appearance(
                  material=Material(diffuseColor=(.8,.7,.6))),
                geometry=Box(size=(.01,.2,.01)))])])]),
        Transform(translation=(-2.8,-1.15,.23),
          children=[
          Group(USE='Head_lights')])])]),
    Viewpoint(description='Entry view',orientation=(1,0,0,-0.37),position=(0,5,10)),
    Viewpoint(description='Front',orientation=(0,1,0,-1.57),position=(-10,2,0)),
    Transform(rotation=(0,0,1,-.785),
      children=[
      Viewpoint(description='Front High',orientation=(0,1,0,-1.57),position=(-12,2,0))]),
    Viewpoint(description='left side',orientation=(0,1,0,-3.14),position=(0,2,-10)),
    Viewpoint(description='rear',orientation=(0,1,0,1.57),position=(10,2,0)),
    Viewpoint(description='top',orientation=(1,0,0,-1.57),position=(0,10,0))])
)

### X3D model conversion complete ###

####################################################################################################
# Self-test diagnostics
####################################################################################################

print('Self-test diagnostics for Hull.py:')
if        metaDiagnostics(newModel): # built-in utility method in X3D class
    print(metaDiagnostics(newModel)) # display meta info, hint, warning, error, TODO values in this model
# print('check newModel.XML() serialization...')
newModelXML= newModel.XML() # test export method XML() for exceptions during export
newModel.XMLvalidate()
# print(newModelXML) # diagnostic

try:
#   print('check newModel.VRML() serialization...')
    newModelVRML=newModel.VRML() # test export method VRML() for exceptions during export
    # print(prependLineNumbers(newModelVRML)) # debug
    print("Python-to-VRML export of VRML output successful", flush=True)
except Exception as err: # usually BaseException
    # https://stackoverflow.com/questions/18176602/how-to-get-the-name-of-an-exception-that-was-caught-in-python
    print("*** Python-to-VRML export of VRML output failed:", type(err).__name__, err)
    if newModelVRML: # may have failed to generate
        print(prependLineNumbers(newModelVRML, err.lineno))

try:
#   print('check newModel.JSON() serialization...')
    newModelJSON=newModel.JSON() # test export method JSON() for exceptions during export
#   print(prependLineNumbers(newModelJSON)) # debug
    print("Python-to-JSON export of JSON output successful (under development)")
except Exception as err: # usually SyntaxError
    print("*** Python-to-JSON export of JSON output failed:", type(err).__name__, err)
    if newModelJSON: # may have failed to generate
        print(prependLineNumbers(newModelJSON,err.lineno))

print("python Hull.py load and self-test diagnostics complete.")
