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

Let's denote:
- $x$ as the number of modern violins produced,
- $y$ as the number of baroque violins produced.

The objective is to maximize profits. Given that a modern violin gives a profit of $150 and a baroque violin gives a profit of $200, the total profit can be represented by the function:
\[ \text{Profit} = 150x + 200y \]

Now, let's define the constraints based on the available time for woodworking and assembling:

1. Woodworking time constraint: A modern violin takes 5 hours, and a baroque violin takes 4 hours of woodworking time. The total available woodworking time per day is 150 hours.
\[ 5x + 4y \leq 150 \]

2. Assembling time constraint: A modern violin takes 3.5 hours, and a baroque violin takes 5 hours of assembling time. The total available assembling time per day is 200 hours.
\[ 3.5x + 5y \leq 200 \]

Additionally, we have non-negativity constraints since the number of violins cannot be negative:
\[ x \geq 0 \]
\[ y \geq 0 \]

To solve this problem using Gurobi in Python, we will use the following code:

```python
from gurobipy import *

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

# Define variables
x = m.addVar(lb=0, vtype=GRB.CONTINUOUS, name="modern_violins")
y = m.addVar(lb=0, vtype=GRB.CONTINUOUS, name="baroque_violins")

# Set the objective function: Maximize profits
m.setObjective(150*x + 200*y, GRB.MAXIMIZE)

# Add constraints
m.addConstr(5*x + 4*y <= 150, "woodworking_time")
m.addConstr(3.5*x + 5*y <= 200, "assembling_time")

# Optimize the model
m.optimize()

# Print the results
if m.status == GRB.OPTIMAL:
    print("Optimal solution found:")
    print(f"Modern violins: {x.x}")
    print(f"Baroque violins: {y.x}")
    print(f"Total profit: ${150*x.x + 200*y.x:.2f}")
else:
    print("No optimal solution found")
```