## Problem Description and Formulation

The problem is a classic example of a linear programming problem. The glass artist wants to maximize his profits by producing the optimal number of glass dogs and cats given the constraints on heating, molding, and cooling times.

Let's define the decision variables:
- \(x\): the number of glass dogs to produce
- \(y\): the number of glass cats to produce

The objective function to maximize profit is:
\[ \text{Maximize:} \quad 50x + 40y \]

The constraints based on the available times for each process are:
- Heating: \(10x + 15y \leq 1000\)
- Molding: \(30x + 20y \leq 1500\)
- Cooling: \(20x + 15y \leq 1200\)
- Non-negativity: \(x \geq 0, y \geq 0\)

## Gurobi Code

To solve this problem using Gurobi in Python, we will use the Gurobi Python API. First, ensure you have Gurobi installed in your Python environment. You can install it via pip if you have the Gurobi license and the Gurobi solver installed on your machine.

```python
import gurobi as gp

# Create a new model
model = gp.Model("glass_art")

# Define the variables
x = model.add_var(name="glass_dogs", lb=0, vtype=gp.GRB.INTEGER)
y = model.add_var(name="glass_cats", lb=0, vtype=gp.GRB.INTEGER)

# Define the objective function
model.set_objective(gp.LinExpr(50 * x + 40 * y), gp.GRB.MAXIMIZE)

# Add constraints
model.add_constr(10 * x + 15 * y <= 1000, name="heating")
model.add_constr(30 * x + 20 * y <= 1500, name="molding")
model.add_constr(20 * x + 15 * y <= 1200, name="cooling")

# Optimize the model
model.optimize()

# Print the results
if model.status == gp.GRB.OPTIMAL:
    print(f"Optimal solution: x = {x.varValue}, y = {y.varValue}")
    print(f"Max Profit: ${50*x.varValue + 40*y.varValue}")
else:
    print("No optimal solution found")
```