To solve this optimization problem, we need to define variables for the number of chocolate and vanilla ice cream cones sold. Let's denote these as `x` (chocolate) and `y` (vanilla). The objective function is to maximize profit, which can be represented as `2x + 1.5y`, given that each chocolate cone brings in $2 and each vanilla cone brings in $1.50.

The constraints are:
- Sell at least 30 chocolate cones: `x >= 30`
- Do not sell more than 50 chocolate cones: `x <= 50`
- Sell at least 20 vanilla cones: `y >= 20`
- Do not sell more than 60 vanilla cones: `y <= 60`
- Total items sold cannot exceed 70: `x + y <= 70`

Given these constraints and the objective function, we can formulate this problem as a linear programming problem.

```python
from gurobipy import *

# Create a new model
m = Model("Ice Cream Sales")

# Define variables for the number of chocolate and vanilla cones sold
x = m.addVar(name="chocolate_cones", lb=30, ub=50)
y = m.addVar(name="vanilla_cones", lb=20, ub=60)

# Set the objective function to maximize profit
m.setObjective(2*x + 1.5*y, GRB.MAXIMIZE)

# Add constraint for total items sold
m.addConstr(x + y <= 70, name="total_items")

# Optimize model
m.optimize()

# Print results
if m.status == GRB.OPTIMAL:
    print(f"Optimal solution: Sell {x.x} chocolate cones and {y.x} vanilla cones.")
else:
    print("No optimal solution found.")

```