To solve this linear programming optimization problem, we first need to define the decision variables, objective function, and constraints based on the given information.

Let's denote:
- \(x_d\) as the number of glass dogs made,
- \(x_c\) as the number of glass cats made.

The objective is to maximize profits. Given that each glass dog yields a profit of $50 and each glass cat yields a profit of $40, the objective function can be written as:
\[ \text{Maximize:} \quad 50x_d + 40x_c \]

Now, let's consider the constraints based on the time available for heating, molding, and cooling:

1. Heating constraint: Each glass dog requires 10 minutes of heating, and each glass cat requires 15 minutes. The total available time for heating is 1000 minutes.
\[ 10x_d + 15x_c \leq 1000 \]

2. Molding constraint: Each glass dog requires 30 minutes of molding, and each glass cat requires 20 minutes. The total available time for molding is 1500 minutes.
\[ 30x_d + 20x_c \leq 1500 \]

3. Cooling constraint: Each glass dog requires 20 minutes of cooling, and each glass cat requires 15 minutes. The total available time for cooling is 1200 minutes.
\[ 20x_d + 15x_c \leq 1200 \]

Additionally, the number of glass dogs and cats made cannot be negative:
\[ x_d \geq 0, \quad x_c \geq 0 \]

This problem can now be translated into Gurobi code in Python to find the optimal number of glass dogs and cats that maximize profits.

```python
from gurobipy import *

# Create a model
m = Model("Glass_Art")

# Decision variables
x_d = m.addVar(lb=0, vtype=GRB.CONTINUOUS, name="glass_dogs")
x_c = m.addVar(lb=0, vtype=GRB.CONTINUOUS, name="glass_cats")

# Objective function: Maximize profits
m.setObjective(50*x_d + 40*x_c, GRB.MAXIMIZE)

# Constraints
m.addConstr(10*x_d + 15*x_c <= 1000, "heating_constraint")
m.addConstr(30*x_d + 20*x_c <= 1500, "molding_constraint")
m.addConstr(20*x_d + 15*x_c <= 1200, "cooling_constraint")

# Optimize the model
m.optimize()

# Print solution
if m.status == GRB.OPTIMAL:
    print("Optimal solution found:")
    print(f"Number of glass dogs: {x_d.x}")
    print(f"Number of glass cats: {x_c.x}")
    print(f"Maximum profit: ${50*x_d.x + 40*x_c.x:.2f}")
else:
    print("No optimal solution found")
```