Examples
Basic SVG Generation
From CDL String
from crystal_renderer import generate_cdl_svg
# Simple octahedron
generate_cdl_svg("cubic[m3m]:{111}", "octahedron.svg")
# Diamond-like truncated octahedron
generate_cdl_svg(
"cubic[m3m]:{111}@1.0 + {100}@1.3",
"diamond.svg",
show_axes=True
)
# Quartz prism with rhombohedron
generate_cdl_svg(
"trigonal[-3m]:{10-10}@1.0 + {10-11}@0.8",
"quartz.svg"
)
From Geometry
from crystal_geometry import cdl_string_to_geometry
from crystal_renderer import generate_geometry_svg
# Generate geometry
geom = cdl_string_to_geometry("cubic[m3m]:{111}@1.0 + {100}@1.3")
# Render with custom colors
generate_geometry_svg(
geom.vertices,
geom.faces,
"custom.svg",
face_color='#81D4FA',
edge_color='#0277BD'
)
Customizing Appearance
View Angles
from crystal_renderer import generate_cdl_svg
cdl = "cubic[m3m]:{111}"
# Different viewing angles
generate_cdl_svg(cdl, "view1.svg", elev=30, azim=-45) # Standard view
generate_cdl_svg(cdl, "view2.svg", elev=0, azim=0) # Front view
generate_cdl_svg(cdl, "view3.svg", elev=90, azim=0) # Top view
generate_cdl_svg(cdl, "view4.svg", elev=15, azim=-30) # Low angle
Display Options
from crystal_renderer import generate_cdl_svg
cdl = "cubic[m3m]:{111}@1.0 + {100}@1.3"
# With axes and grid
generate_cdl_svg(
cdl, "with_axes.svg",
show_axes=True,
show_grid=True
)
# Color by form
generate_cdl_svg(
cdl, "colored.svg",
color_by_form=True
)
# With face labels
generate_cdl_svg(
cdl, "labeled.svg",
face_labels=True
)
Custom Colors
from crystal_renderer import generate_geometry_svg
from crystal_geometry import cdl_string_to_geometry
geom = cdl_string_to_geometry("cubic[m3m]:{111}")
# Custom face and edge colors
generate_geometry_svg(
geom.vertices,
geom.faces,
"ruby.svg",
face_color='#E91E63', # Ruby red
edge_color='#880E4F' # Dark red edges
)
# Emerald green
generate_geometry_svg(
geom.vertices,
geom.faces,
"emerald.svg",
face_color='#4CAF50',
edge_color='#1B5E20'
)
3D Export
STL for 3D Printing
from crystal_geometry import cdl_string_to_geometry
from crystal_renderer import export_stl
# Generate geometry
geom = cdl_string_to_geometry("cubic[m3m]:{111}@1.0 + {100}@1.3")
# Export binary STL (smaller file)
export_stl(geom.vertices, geom.faces, "crystal.stl", binary=True)
# Export ASCII STL (human-readable)
export_stl(geom.vertices, geom.faces, "crystal_ascii.stl", binary=False)
glTF for Web/AR
from crystal_geometry import cdl_string_to_geometry
from crystal_renderer import export_gltf
geom = cdl_string_to_geometry("cubic[m3m]:{111}")
# Basic export
export_gltf(geom.vertices, geom.faces, "model.gltf")
# With custom color and name
export_gltf(
geom.vertices,
geom.faces,
"diamond.gltf",
color=(0.5, 0.7, 0.9, 0.8), # Light blue, semi-transparent
name="diamond_crystal"
)
Raster Output
PNG Export
from crystal_renderer import generate_cdl_svg, convert_svg_to_raster
# First generate SVG
generate_cdl_svg("cubic[m3m]:{111}", "crystal.svg")
# Convert to PNG
convert_svg_to_raster("crystal.svg", "crystal.png", scale=2.0)
Direct Raster Generation
from crystal_renderer import generate_with_format, generate_cdl_svg
# Generate PNG directly
generate_with_format(
generator_func=generate_cdl_svg,
output_path="crystal.png",
output_format="png",
cdl_string="cubic[m3m]:{111}",
show_axes=True
)
# Generate JPG
generate_with_format(
generator_func=generate_cdl_svg,
output_path="crystal.jpg",
output_format="jpg",
cdl_string="cubic[m3m]:{111}"
)
Info Panels
Adding Property Panels
from crystal_renderer import generate_cdl_svg
# With FGA-style info panel
properties = {
'name': 'Diamond',
'chemistry': 'C',
'hardness': '10',
'ri': '2.417',
'sg': '3.52',
'dispersion': '0.044'
}
generate_cdl_svg(
"cubic[m3m]:{111}@1.0 + {110}@0.2",
"diamond_info.svg",
info_panel=properties,
show_axes=True
)
Integration with mineral-database
from mineral_database import get_mineral, get_info_properties
from crystal_renderer import generate_cdl_svg
# Get mineral data
mineral = get_mineral('ruby')
props = get_info_properties('ruby', 'fga')
# Render with info panel
generate_cdl_svg(
mineral.cdl,
"ruby_info.svg",
info_panel=props
)
Working with Colors
Color Schemes
from crystal_renderer import (
AXIS_COLOURS,
HABIT_COLOURS,
FORM_COLORS,
get_element_colour
)
# Axis colors
print(f"a-axis: {AXIS_COLOURS['a']}") # Red
print(f"b-axis: {AXIS_COLOURS['b']}") # Green
print(f"c-axis: {AXIS_COLOURS['c']}") # Blue
# System colors
print(f"Cubic: {HABIT_COLOURS['cubic']}")
print(f"Hexagonal: {HABIT_COLOURS['hexagonal']}")
# Element colors (for atomic structures)
print(f"Carbon: {get_element_colour('C')}")
print(f"Silicon: {get_element_colour('Si')}")
from crystal_renderer import generate_cdl_svg
# Color each form differently
generate_cdl_svg(
"cubic[m3m]:{111}@1.0 + {100}@1.3 + {110}@0.5",
"multi_form.svg",
color_by_form=True # Each form gets distinct color
)
Batch Processing
Rendering Multiple Minerals
from mineral_database import list_presets, get_preset
from crystal_renderer import generate_cdl_svg
# Render all cubic minerals
for preset_id in list_presets('cubic')[:10]:
preset = get_preset(preset_id)
generate_cdl_svg(
preset['cdl'],
f"output/{preset_id}.svg",
show_axes=True
)
print(f"Rendered {preset_id}")
Gallery Generation
from mineral_database import list_presets, get_preset, get_info_properties
from crystal_renderer import generate_cdl_svg
import os
# Create output directory
os.makedirs("gallery", exist_ok=True)
# Generate gallery
for preset_id in list_presets()[:20]:
preset = get_preset(preset_id)
props = get_info_properties(preset_id, 'compact')
generate_cdl_svg(
preset['cdl'],
f"gallery/{preset_id}.svg",
info_panel=props,
elev=25,
azim=-40
)
Full Pipeline Example
from mineral_database import get_mineral
from cdl_parser import parse_cdl
from crystal_geometry import cdl_to_geometry
from crystal_renderer import (
generate_geometry_svg,
export_stl,
export_gltf
)
# Get mineral data
mineral = get_mineral('garnet')
print(f"Processing: {mineral.name}")
# Parse CDL
desc = parse_cdl(mineral.cdl)
print(f"System: {desc.system}, Forms: {len(desc.forms)}")
# Generate geometry
geom = cdl_to_geometry(desc)
print(f"Vertices: {len(geom.vertices)}, Faces: {len(geom.faces)}")
# Export to multiple formats
generate_geometry_svg(
geom.vertices,
geom.faces,
f"{mineral.id}.svg",
face_color='#E57373' # Garnet red
)
export_stl(
geom.vertices,
geom.faces,
f"{mineral.id}.stl"
)
export_gltf(
geom.vertices,
geom.faces,
f"{mineral.id}.gltf",
color=(0.9, 0.3, 0.3, 1.0),
name=mineral.name
)
print(f"Exported SVG, STL, and glTF for {mineral.name}")