To solve this problem, we will first define the variables and parameters involved. Let's denote:

- $x_c$ as the number of cars produced,
- $x_b$ as the number of bikes produced.

The parameters are:
- Engineering time per car: 3 hours,
- Engineering time per bike: 1 hour,
- Steel required per vehicle (both cars and bikes): 30 kg,
- Total steel available per week: 1000 kg,
- Total engineering time available per week: 400 hours,
- Profit per car: $5000,
- Profit per bike: $1000.

The objective is to maximize profit, which can be represented as $5000x_c + 1000x_b$.

The constraints are:
1. Steel availability: $30x_c + 30x_b \leq 1000$,
2. Engineering time availability: $3x_c + x_b \leq 400$,
3. Non-negativity constraints: $x_c \geq 0$, $x_b \geq 0$.

Now, let's write the Gurobi code to solve this linear programming problem:

```python
from gurobipy import *

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

# Define variables
x_c = m.addVar(vtype=GRB.CONTINUOUS, name="cars_produced")
x_b = m.addVar(vtype=GRB.CONTINUOUS, name="bikes_produced")

# Set the objective function: Maximize profit
m.setObjective(5000*x_c + 1000*x_b, GRB.MAXIMIZE)

# Add constraints
m.addConstr(30*x_c + 30*x_b <= 1000, "steel_availability")
m.addConstr(3*x_c + x_b <= 400, "engineering_time_availability")
m.addConstr(x_c >= 0, "non_negativity_cars")
m.addConstr(x_b >= 0, "non_negativity_bikes")

# Optimize the model
m.optimize()

# Print the results
if m.status == GRB.OPTIMAL:
    print(f"Optimal solution found: Produce {x_c.x} cars and {x_b.x} bikes.")
    print(f"Maximum profit: ${m.objVal}")
else:
    print("No optimal solution found. The model is likely infeasible or unbounded.")
```