To solve the optimization problem described, we first need to convert the natural language description into a symbolic representation. This involves defining variables for the quantities of interest (in this case, the number of apple and orange smoothies made), formulating an objective function that represents the total profit, and expressing the constraints on the system in terms of these variables.

Let's define:
- $x_1$ as the number of apple smoothies made,
- $x_2$ as the number of orange smoothies made.

The objective is to maximize profit. Given that each apple smoothie yields a profit of $3.5 and each orange smoothie yields a profit of $4.5, the objective function can be written as:
\[ \text{Maximize:} \quad 3.5x_1 + 4.5x_2 \]

The constraints are based on the time availability of the cutting and blending machines:
- Each apple smoothie requires 6 minutes on the cutting machine and 3 minutes on the blending machine.
- Each orange smoothie requires 5 minutes on the cutting machine and 2 minutes on the blending machine.
- Both machines are available for at most 500 minutes per day.

Thus, the constraints can be formulated as:
\[ \begin{align*}
6x_1 + 5x_2 &\leq 500 \quad \text{(Cutting machine time constraint)} \\
3x_1 + 2x_2 &\leq 500 \quad \text{(Blending machine time constraint)}
\end{align*} \]
Additionally, we have non-negativity constraints since the number of smoothies cannot be negative:
\[ x_1 \geq 0, \quad x_2 \geq 0 \]

In symbolic notation with natural language descriptions, this can be represented as:
```json
{
    'sym_variables': [('x1', 'number of apple smoothies'), ('x2', 'number of orange smoothies')],
    'objective_function': '3.5*x1 + 4.5*x2',
    'constraints': ['6*x1 + 5*x2 <= 500', '3*x1 + 2*x2 <= 500', 'x1 >= 0', 'x2 >= 0']
}
```

Now, let's write the Gurobi code in Python to solve this optimization problem:

```python
from gurobipy import *

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

# Define variables
x1 = m.addVar(lb=0, vtype=GRB.CONTINUOUS, name="apple_smoothies")
x2 = m.addVar(lb=0, vtype=GRB.CONTINUOUS, name="orange_smoothies")

# Set objective function
m.setObjective(3.5*x1 + 4.5*x2, GRB.MAXIMIZE)

# Add constraints
m.addConstr(6*x1 + 5*x2 <= 500, "cutting_machine_time")
m.addConstr(3*x1 + 2*x2 <= 500, "blending_machine_time")

# Optimize model
m.optimize()

# Print results
if m.status == GRB.OPTIMAL:
    print("Optimal solution found:")
    print(f"Number of apple smoothies: {x1.x}")
    print(f"Number of orange smoothies: {x2.x}")
    print(f"Maximum profit: ${3.5*x1.x + 4.5*x2.x:.2f}")
else:
    print("No optimal solution found")
```