####################################################################################################
#
# Invoking X3D model self-test:
#
#   $ python CrawlerPerry2001.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.0',
  head=head(
    children=[
    meta(content='CrawlerPerry2001.x3d',name='title'),
    meta(content='Small twin-tracked underwater bottom crawler, tested during AUV Fest 2001.',name='description'),
    meta(content='Jeffrey D. Weekley',name='creator'),
    meta(content='22 October 2001',name='created'),
    meta(content='29 April 2021',name='created'),
    meta(content='CrawlerPerry2001.jpg',name='photo'),
    meta(content='CrawlerPerryElectronicsBox.jpg',name='photo'),
    meta(content='CrawlerPerry2001Model.jpg',name='Image'),
    meta(content='Autonomous Underwater Vehicle AUV Crawler',name='subject'),
    meta(content='https://www.web3d.org/x3d/content/examples/Savage/Robots/UnmannedUnderwaterVehicles/CrawlerPerry2001.x3d',name='identifier'),
    meta(content='X3D-Edit 3.2, https://www.web3d.org/x3d/tools/X3D-Edit',name='generator'),
    meta(content='../../license.html',name='license')]),
  Scene=Scene(
    children=[
    Background(skyColor=[(0.1,0.8,0.8)]),
    Viewpoint(description='Crawler Perry 2001 AUV',position=(0,0,1)),
    LOD(range=[100,1000],
      children=[
      Group(DEF='DetailedCrawler',
        children=[
        Group(DEF='Chassis',
          children=[
          Transform(
            children=[
            Shape(
              geometry=Box(size=(0.5,0.11,0.2)),
              appearance=Appearance(DEF='Black',
                material=Material(diffuseColor=(0.15,0.2,0.225)))),
            Transform(rotation=(1,0,0,1.57),translation=(0.25,0,0),
              children=[
              Shape(
                geometry=Cylinder(height=0.2,radius=0.055),
                appearance=Appearance(USE='Black'))])]),
          Transform(DEF='ElectronicsBox',translation=(0.125,0.14,0),
            children=[
            Shape(
              geometry=Box(size=(0.175,0.166,0.125)),
              appearance=Appearance(
                texture=ImageTexture(url=["CrawlerPerryElectronicsBox.jpg","https://www.web3d.org/x3d/content/examples/Savage/Robots/UnmannedUnderwaterVehicles/CrawlerPerryElectronicsBox.jpg"]))),
            Transform(translation=(0.04,0.1,0),
              children=[
              Shape(
                geometry=Cylinder(height=0.04,radius=0.033),
                appearance=Appearance(USE='Black'))])])]),
        Group(DEF='RightWheels',
          children=[
          Transform(DEF='RightHub',rotation=(1,0,0,1.57),translation=(0.225,0,0.15),
            children=[
            Shape(
              geometry=Cylinder(DEF='Wheel',height=0.02,radius=0.125),
              appearance=Appearance(
                material=Material(DEF='Melamine',diffuseColor=(0.68,0.375,0.18)))),
            Transform(translation=(0,-0.11,0),
              children=[
              Shape(DEF='Axle',
                geometry=Cylinder(height=0.25,radius=0.0125),
                appearance=Appearance(DEF='StainlessSteel',
                  material=Material(diffuseColor=(0.66,0.66,0.66),shininess=0.4,specularColor=(0.78,0.78,0.88)))),
              Transform(translation=(0,0.135,0),
                children=[
                Shape(
                  geometry=Cone(bottomRadius=0.0125,height=0.02),
                  appearance=Appearance(USE='StainlessSteel')),
                Transform(
                  children=[
                  Shape(
                    geometry=Cylinder(height=0.025,radius=0.0025),
                    appearance=Appearance(USE='StainlessSteel'))]),
                Transform(translation=(0,0.00625,0),
                  children=[
                  Shape(
                    geometry=Cylinder(height=0.0025,radius=0.005),
                    appearance=Appearance(USE='StainlessSteel'))])])]),
            Transform(DEF='RightWheelHoles',
              children=[
              Transform(DEF='WheelHole',translation=(0,0,0.075),
                children=[
                Shape(
                  geometry=Cylinder(height=0.0212,radius=0.025,side=False),
                  appearance=Appearance(USE='Black'))]),
              Transform(rotation=(0,1,0,1.25),
                children=[
                Transform(USE='WheelHole')]),
              Transform(rotation=(0,1,0,2.5),
                children=[
                Transform(USE='WheelHole')]),
              Transform(rotation=(0,1,0,3.75),
                children=[
                Transform(USE='WheelHole')]),
              Transform(rotation=(0,1,0,5),
                children=[
                Transform(USE='WheelHole')])])]),
          Transform(translation=(-0.45,0,0),
            children=[
            Transform(USE='RightHub')])]),
        Group(DEF='LeftWheels',
          children=[
          Transform(DEF='LeftHub',rotation=(1,0,0,1.57),translation=(0.225,0,-0.15),
            children=[
            Shape(
              geometry=Cylinder(USE='Wheel'),
              appearance=Appearance(
                material=Material(USE='Melamine'))),
            Transform(translation=(0,0.11,0),
              children=[
              Shape(USE='Axle'),
              Transform(rotation=(1,0,0,3.14),translation=(0,-0.135,0),
                children=[
                Shape(
                  geometry=Cone(bottomRadius=0.0125,height=0.02),
                  appearance=Appearance(USE='StainlessSteel')),
                Transform(
                  children=[
                  Shape(
                    geometry=Cylinder(height=0.025,radius=0.0025),
                    appearance=Appearance(USE='StainlessSteel'))]),
                Transform(translation=(0,0.00625,0),
                  children=[
                  Shape(
                    geometry=Cylinder(height=0.0025,radius=0.005),
                    appearance=Appearance(USE='StainlessSteel'))])])]),
            Transform(DEF='LeftWheelHoles',
              children=[
              Transform(DEF='LeftWheelHole',translation=(0,0,0.075),
                children=[
                Shape(
                  geometry=Cylinder(height=0.0212,radius=0.025,side=False),
                  appearance=Appearance(USE='Black'))]),
              Transform(rotation=(0,1,0,1.25),
                children=[
                Transform(USE='LeftWheelHole')]),
              Transform(rotation=(0,1,0,2.5),
                children=[
                Transform(USE='LeftWheelHole')]),
              Transform(rotation=(0,1,0,3.75),
                children=[
                Transform(USE='LeftWheelHole')]),
              Transform(rotation=(0,1,0,5),
                children=[
                Transform(USE='LeftWheelHole')])])]),
          Transform(translation=(-0.45,0,0),
            children=[
            Transform(USE='LeftHub')])]),
        Group(DEF='RightTrack',
          children=[
          Group(DEF='UpperRightTrack',
            children=[
            Transform(translation=(0,0,-0.05),
              children=[
              Transform(translation=(0.025,0.125,0.19),
                children=[
                Group(DEF='TrackSegment',
                  children=[
                  Transform(translation=(0.15,0,0),
                    children=[
                    Shape(
                      geometry=Box(size=(0.05,0.01,0.125)),
                      appearance=Appearance(USE='Black')),
                    Transform(translation=(0,0.00625,0),
                      children=[
                      Shape(
                        geometry=Box(size=(0.0025,0.0125,0.125)),
                        appearance=Appearance(USE='Black'))]),
                    Transform(translation=(0.01875,0.00325,0),
                      children=[
                      Shape(
                        geometry=Box(size=(0.0025,0.0125,0.125)),
                        appearance=Appearance(USE='Black'))]),
                    Transform(translation=(-0.01875,0.00325,0),
                      children=[
                      Shape(
                        geometry=Box(size=(0.0025,0.0125,0.125)),
                        appearance=Appearance(USE='Black'))]),
                    Transform(translation=(-0.4,0,0),
                      children=[
                      Shape(
                        geometry=Box(size=(0.05,0.01,0.125)),
                        appearance=Appearance(USE='Black')),
                      Transform(translation=(0,0.00625,0),
                        children=[
                        Shape(
                          geometry=Box(size=(0.0025,0.0125,0.125)),
                          appearance=Appearance(USE='Black'))]),
                      Transform(translation=(0.01875,0.00325,0),
                        children=[
                        Shape(
                          geometry=Box(size=(0.0025,0.0125,0.125)),
                          appearance=Appearance(USE='Black'))]),
                      Transform(translation=(-0.01875,0.00325,0),
                        children=[
                        Shape(
                          geometry=Box(size=(0.0025,0.0125,0.125)),
                          appearance=Appearance(USE='Black'))])])]),
                  Transform(translation=(-0.05,0,0),
                    children=[
                    Shape(
                      geometry=Box(size=(0.05,0.01,0.125)),
                      appearance=Appearance(USE='Black')),
                    Transform(translation=(0,0.00625,0),
                      children=[
                      Shape(
                        geometry=Box(size=(0.0025,0.0125,0.125)),
                        appearance=Appearance(USE='Black'))]),
                    Transform(translation=(0.01875,0.00325,0),
                      children=[
                      Shape(
                        geometry=Box(size=(0.0025,0.0125,0.125)),
                        appearance=Appearance(USE='Black'))]),
                    Transform(translation=(-0.01875,0.00325,0),
                      children=[
                      Shape(
                        geometry=Box(size=(0.0025,0.0125,0.125)),
                        appearance=Appearance(USE='Black'))])]),
                  Transform(translation=(-0.1,0,0),
                    children=[
                    Shape(
                      geometry=Box(size=(0.05,0.01,0.125)),
                      appearance=Appearance(USE='Black')),
                    Transform(translation=(0,0.00625,0),
                      children=[
                      Shape(
                        geometry=Box(size=(0.0025,0.0125,0.125)),
                        appearance=Appearance(USE='Black'))]),
                    Transform(translation=(0.01875,0.00325,0),
                      children=[
                      Shape(
                        geometry=Box(size=(0.0025,0.0125,0.125)),
                        appearance=Appearance(USE='Black'))]),
                    Transform(translation=(-0.01875,0.00325,0),
                      children=[
                      Shape(
                        geometry=Box(size=(0.0025,0.0125,0.125)),
                        appearance=Appearance(USE='Black'))])]),
                  Transform(translation=(0.05,0,0),
                    children=[
                    Shape(
                      geometry=Box(size=(0.05,0.01,0.125)),
                      appearance=Appearance(USE='Black')),
                    Transform(translation=(0,0.00625,0),
                      children=[
                      Shape(
                        geometry=Box(size=(0.0025,0.0125,0.125)),
                        appearance=Appearance(USE='Black'))]),
                    Transform(translation=(0.01875,0.00325,0),
                      children=[
                      Shape(
                        geometry=Box(size=(0.0025,0.0125,0.125)),
                        appearance=Appearance(USE='Black'))]),
                    Transform(translation=(-0.01875,0.00325,0),
                      children=[
                      Shape(
                        geometry=Box(size=(0.0025,0.0125,0.125)),
                        appearance=Appearance(USE='Black'))])]),
                  Transform(translation=(0.1,0,0),
                    children=[
                    Shape(
                      geometry=Box(size=(0.05,0.01,0.125)),
                      appearance=Appearance(USE='Black')),
                    Transform(translation=(0,0.00625,0),
                      children=[
                      Shape(
                        geometry=Box(size=(0.0025,0.0125,0.125)),
                        appearance=Appearance(USE='Black'))]),
                    Transform(translation=(0.01875,0.00325,0),
                      children=[
                      Shape(
                        geometry=Box(size=(0.0025,0.0125,0.125)),
                        appearance=Appearance(USE='Black'))]),
                    Transform(translation=(-0.01875,0.00325,0),
                      children=[
                      Shape(
                        geometry=Box(size=(0.0025,0.0125,0.125)),
                        appearance=Appearance(USE='Black'))])]),
                  Transform(translation=(-0.15,0,0),
                    children=[
                    Shape(
                      geometry=Box(size=(0.05,0.01,0.125)),
                      appearance=Appearance(USE='Black')),
                    Transform(translation=(0,0.00625,0),
                      children=[
                      Shape(
                        geometry=Box(size=(0.0025,0.0125,0.125)),
                        appearance=Appearance(USE='Black'))]),
                    Transform(translation=(0.01875,0.00325,0),
                      children=[
                      Shape(
                        geometry=Box(size=(0.0025,0.0125,0.125)),
                        appearance=Appearance(USE='Black'))]),
                    Transform(translation=(-0.01875,0.00325,0),
                      children=[
                      Shape(
                        geometry=Box(size=(0.0025,0.0125,0.125)),
                        appearance=Appearance(USE='Black'))])]),
                  Transform(translation=(0.2,0,0),
                    children=[
                    Shape(
                      geometry=Box(size=(0.05,0.01,0.125)),
                      appearance=Appearance(USE='Black')),
                    Transform(translation=(0,0.00625,0),
                      children=[
                      Shape(
                        geometry=Box(size=(0.0025,0.0125,0.125)),
                        appearance=Appearance(USE='Black'))]),
                    Transform(translation=(0.01875,0.00325,0),
                      children=[
                      Shape(
                        geometry=Box(size=(0.0025,0.0125,0.125)),
                        appearance=Appearance(USE='Black'))]),
                    Transform(translation=(-0.01875,0.00325,0),
                      children=[
                      Shape(
                        geometry=Box(size=(0.0025,0.0125,0.125)),
                        appearance=Appearance(USE='Black'))])]),
                  Transform(translation=(-0.2,0,0),
                    children=[
                    Shape(
                      geometry=Box(size=(0.05,0.01,0.125)),
                      appearance=Appearance(USE='Black')),
                    Transform(translation=(0,0.00625,0),
                      children=[
                      Shape(
                        geometry=Box(size=(0.0025,0.0125,0.125)),
                        appearance=Appearance(USE='Black'))]),
                    Transform(translation=(0.01875,0.00325,0),
                      children=[
                      Shape(
                        geometry=Box(size=(0.0025,0.0125,0.125)),
                        appearance=Appearance(USE='Black'))]),
                    Transform(translation=(-0.01875,0.00325,0),
                      children=[
                      Shape(
                        geometry=Box(size=(0.0025,0.0125,0.125)),
                        appearance=Appearance(USE='Black'))])])])]),
              Transform(translation=(0.025,0.125,0.19),
                children=[
                Transform(DEF='SingleTrack',
                  children=[
                  Shape(
                    geometry=Box(size=(0.05,0.01,0.125)),
                    appearance=Appearance(USE='Black')),
                  Transform(translation=(0.01875,0.00325,0),
                    children=[
                    Shape(
                      geometry=Box(size=(0.0025,0.0125,0.125)),
                      appearance=Appearance(USE='Black'))]),
                  Transform(translation=(-0.01875,0.00325,0),
                    children=[
                    Shape(
                      geometry=Box(size=(0.0025,0.0125,0.125)),
                      appearance=Appearance(USE='Black'))]),
                  Transform(translation=(0,0.00625,0),
                    children=[
                    Shape(
                      geometry=Box(size=(0.0025,0.0125,0.125)),
                      appearance=Appearance(USE='Black'))])])]),
              Group(DEF='AroundTheWheel',
                children=[
                Transform(center=(0,-0.125,0),rotation=(0,0,1,-0.4),translation=(0.225,0.125,0.19),
                  children=[
                  Transform(
                    children=[
                    Transform(USE='SingleTrack')])]),
                Transform(center=(0,-0.125,0),rotation=(0,0,1,-0.8),translation=(0.225,0.125,0.19),
                  children=[
                  Transform(
                    children=[
                    Transform(USE='SingleTrack')])]),
                Transform(center=(0,-0.125,0),rotation=(0,0,1,-1.2),translation=(0.225,0.125,0.19),
                  children=[
                  Transform(
                    children=[
                    Transform(USE='SingleTrack')])]),
                Transform(center=(0,-0.125,0),rotation=(0,0,1,-1.6),translation=(0.225,0.125,0.19),
                  children=[
                  Transform(
                    children=[
                    Transform(USE='SingleTrack')])]),
                Transform(center=(0,-0.125,0),rotation=(0,0,1,-2),translation=(0.225,0.125,0.19),
                  children=[
                  Transform(
                    children=[
                    Transform(USE='SingleTrack')])]),
                Transform(center=(0,-0.125,0),rotation=(0,0,1,-2.4),translation=(0.225,0.125,0.19),
                  children=[
                  Transform(
                    children=[
                    Transform(USE='SingleTrack')])]),
                Transform(center=(0,-0.125,0),rotation=(0,0,1,-2.8),translation=(0.225,0.125,0.19),
                  children=[
                  Transform(
                    children=[
                    Transform(USE='SingleTrack')])])])])]),
          Group(DEF='BottomRightTrack',
            children=[
            Transform(rotation=(0,0,1,3.14),
              children=[
              Group(USE='UpperRightTrack')])])]),
        Group(DEF='LeftTrack',
          children=[
          Transform(translation=(0,0,-0.2875),
            children=[
            Group(USE='RightTrack')])])]),
      Group(DEF='BoxCrawler',
        children=[
        Transform(scale=(0.95,0.8,0.95),
          children=[
          Shape(
            geometry=Box(size=(0.8,0.45,0.5)),
            appearance=Appearance(
              material=Material(diffuseColor=(0.45,0.45,0.55))))])]),
      WorldInfo(info=["null node for LOD"])])])
)

### X3D model conversion complete ###

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

print('Self-test diagnostics for CrawlerPerry2001.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 CrawlerPerry2001.py load and self-test diagnostics complete.")
