####################################################################################################
#
# Invoking X3D model self-test:
#
#   $ python SelectableTextTransparentBox.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.
#
####################################################################################################

from x3d import *

newModel=X3D(profile='Immersive',version='3.3',
  head=head(
    children=[
    meta(content='SelectableTextTransparentBox.x3d',name='title'),
    meta(content='Display Anchor-linked instructions as Text and include transparent Box to simplify user selection. Authors can change the Material transparency value to view the Box, which helps when resizing it to fit the Text.',name='description'),
    meta(content='Don Brutzman',name='creator'),
    meta(content='9 February 2014',name='created'),
    meta(content='30 August 2025',name='modified'),
    meta(content='SelectableText design pattern is available using Shape customizer in X3D-Edit.',name='info'),
    meta(content='SelectableTextExampleOutput.png',name='Image'),
    meta(content='https://www.web3d.org/x3d/tools/X3D-Edit/images/ShapeCustomizer.png',name='Image'),
    meta(content='https://x3dgraphics.com',name='reference'),
    meta(content='https://www.web3d.org/x3d/content/examples/X3dResources.html',name='reference'),
    meta(content='https://www.web3d.org/x3d/content/examples/X3dForAdvancedModeling/UserExperienceUX/SelectableTextTransparentBox.x3d',name='identifier'),
    meta(content='X3D-Edit, https://www.web3d.org/x3d/tools/X3D-Edit',name='generator'),
    meta(content='../license.html',name='license')]),
  Scene=Scene(
    children=[
    WorldInfo(title='SelectableTextTransparentBox.x3d'),
    Background(skyColor=[(0,0.333333,0.66667)]),
    Anchor(description='select text to view scene',url=["../HelloWorld.x3d","https://www.web3d.org/x3d/content/examples/X3dForAdvancedModeling/HelloWorld.x3d","../HelloWorld.wrl","https://www.web3d.org/x3d/content/examples/X3dForAdvancedModeling/HelloWorld.wrl"],
      children=[
      Shape(
        geometry=Text(string=["Users can easily select Text","when a transparent Box is","overlaid behind it.","","Select this anchored text box","to see HelloWorld.x3d model"],
          #  Text string "" means to skip a line, each quoted string is rendered on a separate line. 
          fontStyle=FontStyle(justify=["MIDDLE","MIDDLE"],size=0.75,style_='BOLD')),
        appearance=Appearance(
          material=Material(diffuseColor=(1,0.9,0.4)))),
      #  Invisible box behind text makes user selection (and mouse-over hovering for tooltips) easier. 
      Shape(
        geometry=Box(size=(10,4,0.1)),
        appearance=Appearance(
          #  Change Material transparency='0.8' to see and adjust the size of the Box in order to fit the Text. 
          material=Material(transparency=1)))])])
) # X3D model complete

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

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