 |
CLIP Score: 28.43
from AIDL import *
def stained_glass_window(
width: float = 24*inches,
height: float = 36*inches,
frame_thickness: float = 2*inches,
num_rows: int = 4,
num_cols: int = 3,
pattern_diameter: float = 4*inches):
"""
Model a simple rectangular stained glass window with a pattern on the central glass panel.
The window is divided into a grid with num_rows x num_cols glass pieces.
"""
# Define the root structure (window frame)
window_frame = Solid()
# Define the glass panels and dividers
glass_panels = Solid()
dividers = Solid()
window_frame.glass_panels = glass_panels
window_frame.dividers = dividers
# Define the engravings (optional)
patterns = Drawing()
window_frame.patterns = patterns
# Calculate the dimensions of each glass panel
panel_width = (width - (num_cols - 1) * frame_thickness) / num_cols
panel_height = (height - (num_rows - 1) * frame_thickness) / num_rows
# Define the window frame geometry
window_frame.frame = RoundedRectangle((0, 0), width, height, frame_thickness / 2)
# Define the individual glass panels
glass_panels.panels = []
for row in range(num_rows):
for col in range(num_cols):
x = (col * (panel_width + frame_thickness)) - width / 2 + panel_width / 2
y = (row * (panel_height + frame_thickness)) - height / 2 + panel_height / 2
panel = RoundedRectangle((x, y), panel_width, panel_height, corner_radius=frame_thickness / 4)
glass_panels.panels.append(panel)
# Define the dividers between the glass panels
dividers.horizontal_lines = []
dividers.vertical_lines = []
for row in range(1, num_rows):
y = (row * (panel_height + frame_thickness)) - height / 2
line = Line((-width / 2, y), (width / 2, y))
dividers.horizontal_lines.append(line)
for col in range(1, num_cols):
x = (col * (panel_width + frame_thickness)) - width / 2
line = Line((x, -height / 2), (x, height / 2))
dividers.vertical_lines.append(line)
# Add a circular pattern to the central glass panel
center_row = num_rows // 2
center_col = num_cols // 2
center_x = (center_col * (panel_width + frame_thickness)) - width / 2 + panel_width / 2
center_y = (center_row * (panel_height + frame_thickness)) - height / 2 + panel_height / 2
patterns.circle = Circle((center_x, center_y), pattern_diameter / 2)
# Return the root structure
return window_frame
with AIDL_2D:
model = stained_glass_window()
print(model.Solve())
model.Render()
|
Please write an AIDL program to generate a stained glass window
Sure, let's start by outlining the structures and their hierarchical relationships for a stained glass window. Here's a high-level plan:
1. **Window Frame (Solid)**: The outer frame of the window.
2. **Glass Panel (Solid)**: The individual stained glass pieces.
3. **Dividers (Solid)**: Metal or lead dividers (came) that hold the glass pieces together.
4. **Patterns (Drawing)**: Engraved patterns on the glass (optional).
For simplicity, let's design a rectangular stained glass window with a grid of smaller rectangular glass pieces and include a pattern in the center glass piece.
### Step 1: Define the Structures and Hierarchical Relationships
```python
from AIDL import *
def stained_glass_window(
width: float = 24*inches,
height: float = 36*inches,
frame_thickness: float = 2*inches,
num_rows: int = 4,
num_cols: int = 3,
pattern_diameter: float = 4*inches):
"""
Model a simple rectangular stained glass window with a pattern on the central glass panel.
The window is divided into a grid with num_rows x num_cols glass pieces.
"""
# Define the root structure (window frame)
window_frame = Solid()
# Define the glass panels and dividers
glass_panels = Solid()
dividers = Solid()
window_frame.glass_panels = glass_panels
window_frame.dividers = dividers
# Define the engravings (optional)
patterns = Drawing()
glass_panels.patterns = patterns
# Calculate the dimensions of each glass panel
panel_width = (width - (num_cols - 1) * frame_thickness) / num_cols
panel_height = (height - (num_rows - 1) * frame_thickness) / num_rows
# Define the window frame geometry
window_frame.frame = RoundedRectangle((0, 0), width, height, frame_thickness / 2)
# Define the individual glass panels
glass_panels.panels = []
for row in range(num_rows):
for col in range(num_cols):
panel = RoundedRectangle(
((col * (panel_width + frame_thickness)) - width / 2 + panel_width / 2,
(row * (panel_height + frame_thickness)) - height / 2 + panel_height / 2),
panel_width,
panel_height,
corner_radius=frame_thickness / 4
)
glass_panels.panels.append(panel)
# Define the dividers between the glass panels
dividers.horizontal_lines = []
dividers.vertical_lines = []
for row in range(1, num_rows):
y = (row * (panel_height + frame_thickness)) - height / 2
line = Line((-width / 2, y), (width / 2, y))
dividers.horizontal_lines.append(line)
for col in range(1, num_cols):
x = (col * (panel_width + frame_thickness)) - width / 2
line = Line((x, -height / 2), (x, height / 2))
dividers.vertical_lines.append(line)
# Add a circular pattern to the central glass panel
center_panel_idx = (num_rows // 2) * num_cols + (num_cols // 2)
center_panel = glass_panels.panels[center_panel_idx]
patterns.circle = Circle(center_panel.center, pattern_diameter / 2)
# Return the root structure
return window_frame
with AIDL_2D:
model = stained_glass_window()
print(model.Solve())
model.Render()
```
### Explanation:
1. **Window Frame**:
- A rounded rectangle representing the outer frame.
2. **Glass Panels**:
- A grid of rounded rectangles representing individual glass panels.
3. **Dividers**:
- Horizontal and vertical lines representing the dividers (came) between the glass panels.
4. **Patterns**:
- A circle pattern engraved on the central glass panel.
### Notes:
- The grid of glass panels is determined by `num_rows` and `num_cols`.
- The size of each glass panel is calculated based on the total window dimensions and the frame thickness.
- An optional pattern (a circle) is added to the central glass panel.
- Adjust the parameters (e.g., `num_rows`, `num_cols`, `pattern_diameter`) to customize the window design.
Would you like to add more details or constraints to the design? Feel free to guide me through any specific requirements you have for the stained glass window.
Traceback (most recent call last):
File "/net/projects/ranalab/jz/aidl/AIDL/generation/backend.py", line 21, in dumbrun
exec(code, env)
File "", line 71, in
File "/net/projects/ranalab/jz/aidl/AIDL/structure.py", line 966, in Solve
self._compile()
File "/net/projects/ranalab/jz/aidl/AIDL/structure.py", line 729, in _compile
self._compile_recursive()
File "/net/projects/ranalab/jz/aidl/AIDL/structure.py", line 784, in _compile_recursive
next_group = child._compile_recursive(path + [name], self, next_group)
File "/net/projects/ranalab/jz/aidl/AIDL/structure.py", line 801, in _compile_recursive
child._compile(
File "/net/projects/ranalab/jz/aidl/AIDL/geometry.py", line 110, in _compile
geo._compile(path + [name], structure_parent, self, group, parent_geos, parent_constraints, parent_params, parent_expressions)
File "/net/projects/ranalab/jz/aidl/AIDL/geometry.py", line 113, in _compile
raise GeoInMultipleStructures([GeoAndStructures(self, [structure_parent, self._parent_structure])])
AIDL.feedback.GeoInMultipleStructures: []
It looks like there's an error in the geometry assignment. The issue seems to be arising from a geometry object being assigned to more than one structure, which is not permitted.
Let's correct the program by ensuring that each geometric object is uniquely associated with a single structure. I'll also simplify the geometry assignment and constraints to avoid potential conflicts.
### Corrected Program
```python
from AIDL import *
def stained_glass_window(
width: float = 24*inches,
height: float = 36*inches,
frame_thickness: float = 2*inches,
num_rows: int = 4,
num_cols: int = 3,
pattern_diameter: float = 4*inches):
"""
Model a simple rectangular stained glass window with a pattern on the central glass panel.
The window is divided into a grid with num_rows x num_cols glass pieces.
"""
# Define the root structure (window frame)
window_frame = Solid()
# Define the glass panels and dividers
glass_panels = Solid()
dividers = Solid()
window_frame.glass_panels = glass_panels
window_frame.dividers = dividers
# Define the engravings (optional)
patterns = Drawing()
window_frame.patterns = patterns
# Calculate the dimensions of each glass panel
panel_width = (width - (num_cols - 1) * frame_thickness) / num_cols
panel_height = (height - (num_rows - 1) * frame_thickness) / num_rows
# Define the window frame geometry
window_frame.frame = RoundedRectangle((0, 0), width, height, frame_thickness / 2)
# Define the individual glass panels
glass_panels.panels = []
for row in range(num_rows):
for col in range(num_cols):
x = (col * (panel_width + frame_thickness)) - width / 2 + panel_width / 2
y = (row * (panel_height + frame_thickness)) - height / 2 + panel_height / 2
panel = RoundedRectangle((x, y), panel_width, panel_height, corner_radius=frame_thickness / 4)
glass_panels.panels.append(panel)
# Define the dividers between the glass panels
dividers.horizontal_lines = []
dividers.vertical_lines = []
for row in range(1, num_rows):
y = (row * (panel_height + frame_thickness)) - height / 2
line = Line((-width / 2, y), (width / 2, y))
dividers.horizontal_lines.append(line)
for col in range(1, num_cols):
x = (col * (panel_width + frame_thickness)) - width / 2
line = Line((x, -height / 2), (x, height / 2))
dividers.vertical_lines.append(line)
# Add a circular pattern to the central glass panel
center_row = num_rows // 2
center_col = num_cols // 2
center_x = (center_col * (panel_width + frame_thickness)) - width / 2 + panel_width / 2
center_y = (center_row * (panel_height + frame_thickness)) - height / 2 + panel_height / 2
patterns.circle = Circle((center_x, center_y), pattern_diameter / 2)
# Return the root structure
return window_frame
with AIDL_2D:
model = stained_glass_window()
print(model.Solve())
model.Render()
```
### Explanation of Corrections:
1. **Unique Geometry Assignment**: Ensured each geometric object is uniquely associated with a single structure.
2. **Accurate Positioning**: Fixed the calculation of positions to avoid placing the same geometry in multiple structures.
Try running this corrected program to see if it resolves the issue. If you encounter any further issues or have additional requirements, please let me know!
|