To solve this optimization problem, we first need to define the decision variables and the constraints based on the given information.

Let's denote:
- $x$ as the number of pairs of earrings produced.
- $y$ as the number of watches produced.

The objective function, which represents the total profit, can be written as $45x + 70y$, since each pair of earrings contributes $45 to the profit and each watch contributes $70.

Now, let's consider the constraints:
1. The heating machine is available for at most 14 hours. Given that it takes 2 hours on the heating machine to make a pair of earrings and 3.5 hours to make a watch, we can write this constraint as $2x + 3.5y \leq 14$.
2. The polishing machine is available for at most 10 hours. Since it takes 1.5 hours on the polishing machine to make a pair of earrings and 2 hours to make a watch, this constraint can be expressed as $1.5x + 2y \leq 10$.

Additionally, we have non-negativity constraints since the number of pairs of earrings and watches produced cannot be negative: $x \geq 0$ and $y \geq 0$.

To find the optimal production schedule that maximizes profit, we need to solve this linear programming problem. Here is how you can represent it in Gurobi using Python:

```python
from gurobipy import *

# Create a new model
m = Model("Gem Store Production")

# Define the decision variables
x = m.addVar(lb=0, vtype=GRB.CONTINUOUS, name="Earrings")
y = m.addVar(lb=0, vtype=GRB.CONTINUOUS, name="Watches")

# Set the objective function: maximize profit
m.setObjective(45*x + 70*y, GRB.MAXIMIZE)

# Add constraints
m.addConstr(2*x + 3.5*y <= 14, name="Heating Machine")
m.addConstr(1.5*x + 2*y <= 10, name="Polishing Machine")

# Optimize the model
m.optimize()

# Print the results
if m.status == GRB.OPTIMAL:
    print(f"Optimal production: {x.varName} = {x.x}, {y.varName} = {y.x}")
    print(f"Maximum profit: ${m.objVal:.2f}")
else:
    print("No optimal solution found")
```