Spaces:
Sleeping
Sleeping
| """ | |
| Grid layout generation functionality. | |
| """ | |
| import xml.etree.ElementTree as ET | |
| from loguru import logger | |
| def create_grid_layout(svg_files, output_path, rows, cols): | |
| """ | |
| Create a single SVG file with grid layout of all SVG files. | |
| Args: | |
| svg_files (list): List of SVG file paths | |
| output_path (str): Path where the grid layout SVG will be saved | |
| rows (int): Number of rows in grid | |
| cols (int): Number of columns in grid | |
| Returns: | |
| str: Path to the created grid SVG file | |
| """ | |
| if not svg_files: | |
| logger.warning("No SVG files provided") | |
| return None | |
| try: | |
| # Create root SVG element | |
| svg = ET.Element('svg') | |
| svg.set('xmlns', 'http://www.w3.org/2000/svg') | |
| # Calculate grid dimensions | |
| cell_width = 200 # Default cell width | |
| cell_height = 200 # Default cell height | |
| padding = 50 # Padding between cells | |
| grid_width = cols * (cell_width + padding) - padding | |
| grid_height = rows * (cell_height + padding) - padding | |
| # Set SVG dimensions | |
| svg.set('width', str(grid_width)) | |
| svg.set('height', str(grid_height)) | |
| svg.set('viewBox', f'0 0 {grid_width} {grid_height}') | |
| # Add each SVG file to the grid | |
| for idx, svg_file in enumerate(svg_files): | |
| if idx >= rows * cols: # Skip if exceeds grid size | |
| break | |
| try: | |
| # Calculate position in grid | |
| row = idx // cols | |
| col = idx % cols | |
| x = col * (cell_width + padding) | |
| y = row * (cell_height + padding) | |
| # Create group for this SVG | |
| g = add_svg_to_grid(svg, svg_file, x, y, cell_width, cell_height) | |
| if g is None: | |
| continue | |
| except Exception as e: | |
| logger.error(f"Error processing {svg_file}: {str(e)}") | |
| continue | |
| # Save the grid layout SVG | |
| tree = ET.ElementTree(svg) | |
| tree.write(output_path) | |
| logger.info(f"Grid layout SVG saved to {output_path}") | |
| return output_path | |
| except Exception as e: | |
| logger.error(f"Error creating grid layout: {str(e)}") | |
| return None | |
| def add_svg_to_grid(root_svg, svg_file, x, y, cell_width, cell_height): | |
| """ | |
| Add an SVG file to the grid layout. | |
| Args: | |
| root_svg (Element): Root SVG element | |
| svg_file (str): Path to SVG file to add | |
| x (float): X position in grid | |
| y (float): Y position in grid | |
| cell_width (float): Width of grid cell | |
| cell_height (float): Height of grid cell | |
| Returns: | |
| Element: Created group element or None on failure | |
| """ | |
| try: | |
| # Read SVG file | |
| tree = ET.parse(svg_file) | |
| source_root = tree.getroot() | |
| # Create group for this SVG | |
| g = ET.SubElement(root_svg, 'g') | |
| g.set('transform', f'translate({x},{y})') | |
| # Get viewBox from original SVG | |
| viewBox = source_root.get('viewBox') | |
| if viewBox: | |
| # Extract dimensions from viewBox | |
| vb_parts = viewBox.split() | |
| if len(vb_parts) == 4: | |
| orig_width = float(vb_parts[2]) | |
| orig_height = float(vb_parts[3]) | |
| # Calculate scale to fit in cell | |
| scale_x = cell_width / orig_width | |
| scale_y = cell_height / orig_height | |
| scale = min(scale_x, scale_y) | |
| # Update transform with scaling | |
| g.set('transform', f'translate({x},{y}) scale({scale})') | |
| # Copy all elements from original SVG | |
| for child in source_root: | |
| g.append(child) | |
| return g | |
| except Exception as e: | |
| logger.error(f"Error adding SVG to grid: {str(e)}") | |
| return None | |