Move and Rotate: Incorrect rotation of curves when endpoints are not selected

In my pattern constructions, I use the “Move and Rotate” tool frequently, To avoid creating duplicate points, I often move and rotate curves without their start and end points. This worked without any problems up to version 2025.12.31.2232 (Jan 1, 2026).

After updating to version 2026.10.26.146, this has become a Major Problem

The curves are still translated correctly. However, since the Origin Point was not moved along with the curve, the rotation is now performed around its original position rather than its translated position. I can correct this manually by changing the Origin Point, but many of my existing construction templates have become so distorted that it is almost impossible to identify where the problem originated..

Could there be a solution to this problem?

Hi @Dina

I know we fixed an issue with the tool not rotatng properly… which seems to introduced another error. :roll_eyes:

Can you provide some screencaps or a pattern that has the issue… or better yet a sample pattern that illustrates the tool working and not working?

Thank you. It’s late now, tomorrow morning I‘ll try to provide a sample.

Here is a very simple example: Drawn in version 2025.12.31.2232

Opened in version 2026.10.26.146 Simple example.sm2d (2,8 KB) No size chart is needed.

It’s very strange. It’s taking the rotation formula and adding it to the angle formula:

Thanks @Dina

I’ll take a look ater today.

Could be. I didn’t do the recent fix. I checked to make to make sure it was fixing the issue it was supposed to and not for any regressions. :roll_eyes:

Here is a pattern example, made with 2025.12.31.2232 Jan 1, 2026:
Original example copy.sm2d (174,4 KB) Gr36-46 multi.smms (2,7 KB)

And here is the same file manually fixed in 2026.10.26.146: manually fixed pattern example.sm2d (174,2 KB) I have manually adjusted the reference points.

Because the rotation takes place around the original reference point, not around the one that resulted from the displacement.

Because there is no destination origin ‘point’ to rotate about. Curves do have a start and end point… and somehow we are going to have to subsitute the curve’s start point with the destination origin point if it does not exist.

I would suggest to not fix all you existing patterns, because when we fix the issue it’s just going to break your patterns again. I would only fix a copy of the pattern.

I’m glad there’s hope for a fix! Of course I make copies for manual interventions. I initially only did them to understand what is going on. Thanks for the heads-up!

Here’s exactlly what is happening… if I can explain it:

QPointF VToolMove::findRotationOrigin(const QVector<quint32> &objectIds, const VContainer *data, qreal calcLength,
                                  qreal calcAngle, quint32 originPointId)
{
    if (originPointId != NULL_ID)
    {
        const QPointF rotationOrigin = static_cast<QPointF>(*data->    GeometricObject<VPointF>(originPointId));
        if (!objectIds.contains(originPointId))
        {
            return rotationOrigin;
        }

objectIds is a list of the selected objects… normaly a pointId, curveId, pointId… since there are no points there is just the curveId. Also passed to to the routine is the originPointId. First thing that is checked for is the originPointId NULL… if so we use the center of the group of selected objects. If not null we get the graphic object of the origin point… the “rotationOrigin”.. Here’s where is falls apart without including the origin point in the selection… we check is the originpointId contained in the list of objectIds? No… because the list only conatins the curveId, so just the rotationOrigin is returned and never moved… which would happen right after:

 // A selected rotation point that is also moved must remain the pivot after the move.
 QLineF move(rotationOrigin, QPointF(rotationOrigin.x() + calcLength, rotationOrigin.y()));
 move.setAngle(calcAngle);
 return move.p2();

I think the solution should be to just move and return the rotationOrigin regardless if it is included in the selected objects. Just like the center point is NOT a selected object.

So it just becomes:

    const QPointF rotationOrigin = static_cast<QPointF>(*data->GeometricObject<VPointF>(originPointId));

    // A selected rotation point that is also moved must remain the pivot after the move.
    QLineF move(rotationOrigin, QPointF(rotationOrigin.x() + calcLength, rotationOrigin.y()));
    move.setAngle(calcAngle);
    return move.p2();