## Step 1: Define the symbolic variables
Let's define the symbolic variables for the problem:
- $x_1$ represents the number of standing tables.
- $x_2$ represents the number of dining tables.

## Step 2: Translate the objective function into symbolic notation
The profit made on a standing table is $45, and the profit on a dining table is $95. The objective function to maximize the total monthly profit is:
\[ \text{Maximize:} \quad 45x_1 + 95x_2 \]

## 3: Translate the constraints into symbolic notation
The constraints based on the given hours available for each process are:
- Producing the parts: $2x_1 + 4x_2 \leq 6000$
- Assembling the parts: $2.5x_1 + x_2 \leq 3000$
- Polishing the tables: $2x_1 + 1.5x_2 \leq 4500$
Also, $x_1 \geq 0$ and $x_2 \geq 0$ because the number of tables cannot be negative.

## 4: Provide the symbolic representation of the problem
The symbolic representation is:
```json
{
'sym_variables': [('x1', 'standing tables'), ('x2', 'dining tables')],
'objective_function': '45*x1 + 95*x2',
'constraints': [
    '2*x1 + 4*x2 <= 6000',
    '2.5*x1 + x2 <= 3000',
    '2*x1 + 1.5*x2 <= 4500',
    'x1 >= 0',
    'x2 >= 0'
]
}
```

## 5: Write the Gurobi code to solve the problem
```python
import gurobi

def solve_optimization_problem():
    # Create a new model
    model = gurobi.Model()

    # Define the variables
    x1 = model.addVar(lb=0, name="standing_tables")
    x2 = model.addVar(lb=0, name="dining_tables")

    # Define the objective function
    model.setObjective(45 * x1 + 95 * x2, gurobi.GRB.MAXIMIZE)

    # Define the constraints
    model.addConstr(2 * x1 + 4 * x2 <= 6000, name="parts_production")
    model.addConstr(2.5 * x1 + x2 <= 3000, name="parts_assembly")
    model.addConstr(2 * x1 + 1.5 * x2 <= 4500, name="tables_polishing")

    # Optimize the model
    model.optimize()

    # Print the solution
    if model.status == gurobi.GRB.OPTIMAL:
        print("Optimal solution found.")
        print(f"Number of standing tables: {x1.varValue}")
        print(f"Number of dining tables: {x2.varValue}")
        print(f"Maximum profit: {model.objVal}")
    else:
        print("No optimal solution found.")

solve_optimization_problem()
```