To solve this optimization problem, we first need to define the decision variables, the objective function, and the constraints.

Let's denote:
- \(G\) as the number of sets of general purpose vessels produced,
- \(P\) as the number of sets of pharmaceutical vessels produced,
- \(Pr\) as the number of sets of pressure vessels produced.

The objective is to maximize profit. The profit per set from selling each type of vessel is given as $2000 for general purpose, $3000 for pharmaceutical, and $4500 for pressure vessels. Thus, the total profit can be represented as:
\[ 2000G + 3000P + 4500Pr \]

The constraints are based on the availability of iron ore and zinc ore:
- For iron ore: \(3.5G + 4P + 2Pr \leq 120\)
- For zinc ore: \(2G + 5P + 3.5Pr \leq 70\)

Additionally, we cannot produce a negative number of vessels, so:
- \(G \geq 0\), \(P \geq 0\), and \(Pr \geq 0\).

Now, let's translate this into Gurobi code in Python:

```python
from gurobipy import *

# Create a new model
m = Model("Vessel_Production")

# Define the decision variables
G = m.addVar(name='General_Purpose_Vessels', vtype=GRB.CONTINUOUS, lb=0)
P = m.addVar(name='Pharmaceutical_Vessels', vtype=GRB.CONTINUOUS, lb=0)
Pr = m.addVar(name='Pressure_Vessels', vtype=GRB.CONTINUOUS, lb=0)

# Define the objective function
m.setObjective(2000*G + 3000*P + 4500*Pr, GRB.MAXIMIZE)

# Add constraints
m.addConstr(3.5*G + 4*P + 2*Pr <= 120, name='Iron_Ore_Constraint')
m.addConstr(2*G + 5*P + 3.5*Pr <= 70, name='Zinc_Ore_Constraint')

# Optimize the model
m.optimize()

# Print the results
for v in m.getVars():
    print(f"{v.varName}: {v.x}")

print(f"Objective Value: {m.objVal}")
```