To solve the given optimization problem, we first need to convert the natural language description into a symbolic representation. Let's define our variables as follows:

- $x_1$: Number of glass dogs made
- $x_2$: Number of glass cats made

The objective function is to maximize profits. Given that each glass dog brings in $50 and each glass cat brings in $40, the objective function can be represented algebraically as:

Maximize: $50x_1 + 40x_2$

The constraints based on the available time for heating, molding, and cooling are as follows:

- Heating constraint: $10x_1 + 15x_2 \leq 1000$
- Molding constraint: $30x_1 + 20x_2 \leq 1500$
- Cooling constraint: $20x_1 + 15x_2 \leq 1200$

Additionally, we have non-negativity constraints since the number of glass dogs and cats cannot be negative:

- $x_1 \geq 0$
- $x_2 \geq 0$

Thus, our symbolic representation in JSON format is:
```json
{
    'sym_variables': [('x1', 'Number of glass dogs'), ('x2', 'Number of glass cats')],
    'objective_function': 'Maximize: 50*x1 + 40*x2',
    'constraints': [
        '10*x1 + 15*x2 <= 1000',
        '30*x1 + 20*x2 <= 1500',
        '20*x1 + 15*x2 <= 1200',
        'x1 >= 0',
        'x2 >= 0'
    ]
}
```

To solve this linear programming problem using Gurobi in Python, we can use the following code:
```python
from gurobipy import *

# Create a new model
model = Model("Glass_Dogs_and_Cats")

# Add variables to the model
x1 = model.addVar(vtype=GRB.CONTINUOUS, name="glass_dogs", lb=0)
x2 = model.addVar(vtype=GRB.CONTINUOUS, name="glass_cats", lb=0)

# Set the objective function
model.setObjective(50*x1 + 40*x2, GRB.MAXIMIZE)

# Add constraints
model.addConstr(10*x1 + 15*x2 <= 1000, "heating_constraint")
model.addConstr(30*x1 + 20*x2 <= 1500, "molding_constraint")
model.addConstr(20*x1 + 15*x2 <= 1200, "cooling_constraint")

# Optimize the model
model.optimize()

# Print the results
if model.status == GRB.OPTIMAL:
    print(f"Optimal solution: {x1.varName} = {x1.x}, {x2.varName} = {x2.x}")
    print(f"Objective function value: {model.objVal}")
else:
    print("No optimal solution found")
```