 |
CLIP Score: 30.11
from AIDL import *
def sofa(
seat_width: float = 5*feet,
seat_depth: float = 2*feet,
backrest_height: float = 1*foot,
armrest_width: float = 6*inches,
detail_gap: float = 2*inches
):
"""
Creates an aerial view of a sofa with simple rectangular shapes for the seat,
backrest, and armrests. Optional engraved details for seat cushions.
"""
sofa = Solid()
# Create the seat of the sofa
seat = Solid()
sofa.seat = seat
seat.rectangle = Rectangle((0,0), seat_width, seat_depth)
# Create the backrest
backrest = Solid(shift=(0, (seat_depth/2) - backrest_height/2))
sofa.backrest = backrest
backrest.rectangle = Rectangle((0,0), seat_width + 2*armrest_width, backrest_height)
# Create the left armrest
left_armrest = Solid(shift=(-seat_width/2 - armrest_width/2, 0))
sofa.left_armrest = left_armrest
left_armrest.rectangle = Rectangle((0, 0), armrest_width, seat_depth)
# Create the right armrest
right_armrest = Solid(shift=(seat_width/2 + armrest_width/2, 0))
sofa.right_armrest = right_armrest
right_armrest.rectangle = Rectangle((0, 0), armrest_width, seat_depth)
# Create engraved details on the seat (like cushion divides)
details = Drawing()
sofa.details = details
# Drawing lines representing the cushion divides
num_cushions = 3
details.lines = []
for i in range(1, num_cushions):
x_offset = -seat_width/2 + i * (seat_width / num_cushions)
details.lines.append(Line((x_offset, -seat_depth/2 + detail_gap), (x_offset, seat_depth/2 - detail_gap)))
return sofa
with AIDL_2D:
model = sofa()
print(model.Solve())
model.Render()
|
Please write an AIDL program to generate a aerial view of sofa
Sure, let's start by breaking down the components for an aerial view of a sofa into simple geometric shapes. Typically, a sofa seen from above can be represented by a few rectangles for the seat, back, and armrests. Here's a step-by-step plan:
1. **Seat**: A large rectangle representing the main seating area.
2. **Backrest**: A smaller rectangle on one side representing the backrest.
3. **Armrests**: Two smaller rectangles on either side of the seat representing the armrests.
4. **Detailing/Drawing**: Any additional engravings or lines that represent the cushion divides or decorative elements.
Let's create the corresponding AIDL program:
```python
from AIDL import *
def sofa(
seat_width: float = 5*feet,
seat_depth: float = 2*feet,
backrest_height: float = 1*foot,
armrest_width: float = 6*inches,
detail_gap: float = 2*inches
):
"""
Creates an aerial view of a sofa with simple rectangular shapes for the seat,
backrest, and armrests. Optional engraved details for seat cushions.
"""
sofa = Solid()
# Create the seat of the sofa
seat = Solid()
sofa.seat = seat
seat.rectangle = Rectangle((0,0), seat_width, seat_depth)
# Create the backrest
backrest = Solid(shift=(0, (seat_depth/2) - backrest_height/2))
sofa.backrest = backrest
backrest.rectangle = Rectangle((0,0), seat_width + 2*armrest_width, backrest_height)
# Create the left armrest
left_armrest = Solid(shift=(-seat_width/2 - armrest_width/2, 0))
sofa.left_armrest = left_armrest
left_armrest.rectangle = Rectangle((0, 0), armrest_width, seat_depth)
# Create the right armrest
right_armrest = Solid(shift=(seat_width/2 + armrest_width/2, 0))
sofa.right_armrest = right_armrest
right_armrest.rectangle = Rectangle((0, 0), armrest_width, seat_depth)
# Create engraved details on the seat (like cushion divides)
details = Drawing()
sofa.details = details
# Drawing lines representing the cushion divides
num_cushions = 3
for i in range(1, num_cushions):
x_offset = -seat_width/2 + i * (seat_width / num_cushions)
details_line = Line((x_offset, -seat_depth/2 + detail_gap), (x_offset, seat_depth/2 - detail_gap))
details.add(f"detail_line_{i}", details_line)
return sofa
with AIDL_2D:
model = sofa()
print(model.Solve())
model.Render()
```
### Explanation:
1. **Base Structure**: I created a `Solid` node named `sofa`.
2. **Seat**: A `Solid` node named `seat` containing a `Rectangle`.
3. **Backrest**: Another `Solid` node named `backrest`, shifted up relative to the seat.
4. **Armrests**: Two `Solid` nodes named `left_armrest` and `right_armrest`, shifted to the sides.
5. **Details**: A `Drawing` node named `details` that adds `Line` objects to represent cushion divides on the seat.
Let me know if you need any further modifications or additions!
Traceback (most recent call last):
File "/net/projects/ranalab/jz/aidl/AIDL/generation/backend.py", line 21, in dumbrun
exec(code, env)
File "", line 51, in
File "", line 46, in sofa
File "/net/projects/ranalab/jz/aidl/AIDL/structure.py", line 1242, in __getattr__
return self.bb.__getattribute__(name)
AttributeError: 'BoundingBox' object has no attribute 'add'
It looks like there was an error related to the incorrect use of the `add` method on the structure object. Let's correct that by directly assigning the drawing detail lines properly.
Here is a revised version:
```python
from AIDL import *
def sofa(
seat_width: float = 5*feet,
seat_depth: float = 2*feet,
backrest_height: float = 1*foot,
armrest_width: float = 6*inches,
detail_gap: float = 2*inches
):
"""
Creates an aerial view of a sofa with simple rectangular shapes for the seat,
backrest, and armrests. Optional engraved details for seat cushions.
"""
sofa = Solid()
# Create the seat of the sofa
seat = Solid()
sofa.seat = seat
seat.rectangle = Rectangle((0,0), seat_width, seat_depth)
# Create the backrest
backrest = Solid(shift=(0, (seat_depth/2) - backrest_height/2))
sofa.backrest = backrest
backrest.rectangle = Rectangle((0,0), seat_width + 2*armrest_width, backrest_height)
# Create the left armrest
left_armrest = Solid(shift=(-seat_width/2 - armrest_width/2, 0))
sofa.left_armrest = left_armrest
left_armrest.rectangle = Rectangle((0, 0), armrest_width, seat_depth)
# Create the right armrest
right_armrest = Solid(shift=(seat_width/2 + armrest_width/2, 0))
sofa.right_armrest = right_armrest
right_armrest.rectangle = Rectangle((0, 0), armrest_width, seat_depth)
# Create engraved details on the seat (like cushion divides)
details = Drawing()
sofa.details = details
# Drawing lines representing the cushion divides
num_cushions = 3
details.lines = []
for i in range(1, num_cushions):
x_offset = -seat_width/2 + i * (seat_width / num_cushions)
details.lines.append(Line((x_offset, -seat_depth/2 + detail_gap), (x_offset, seat_depth/2 - detail_gap)))
return sofa
with AIDL_2D:
model = sofa()
print(model.Solve())
model.Render()
```
### Explanation of Changes:
- Instead of using the `add` method, we directly create a list `details.lines` and append each `Line` object to this list.
- This approach ensures that each line has a unique name, avoiding issues with attribute assignment.
Please give this version a try and let me know if you encounter any other issues!
|