fix resize group for Triangle:
:
This commit is contained in:
@@ -227,6 +227,7 @@ const EditorCanvas = () => {
|
|||||||
|
|
||||||
const scaleX = node.scaleX();
|
const scaleX = node.scaleX();
|
||||||
const scaleY = node.scaleY();
|
const scaleY = node.scaleY();
|
||||||
|
const rotation = node.rotation();
|
||||||
const newX = node.x();
|
const newX = node.x();
|
||||||
const newY = node.y();
|
const newY = node.y();
|
||||||
|
|
||||||
@@ -238,17 +239,38 @@ const EditorCanvas = () => {
|
|||||||
groupMembers.forEach((member) => {
|
groupMembers.forEach((member) => {
|
||||||
const relativeX = (member.x || 0) - oldGroupX;
|
const relativeX = (member.x || 0) - oldGroupX;
|
||||||
const relativeY = (member.y || 0) - oldGroupY;
|
const relativeY = (member.y || 0) - oldGroupY;
|
||||||
const scaledX = relativeX * scaleX;
|
|
||||||
const scaledY = relativeY * scaleY;
|
// Apply rotation
|
||||||
|
const angle = (rotation * Math.PI) / 180;
|
||||||
|
const rotatedX = relativeX * Math.cos(angle) - relativeY * Math.sin(angle);
|
||||||
|
const rotatedY = relativeX * Math.sin(angle) + relativeY * Math.cos(angle);
|
||||||
|
|
||||||
|
// Apply scale
|
||||||
|
const scaledX = rotatedX * scaleX;
|
||||||
|
const scaledY = rotatedY * scaleY;
|
||||||
|
|
||||||
|
const finalX = newX + scaledX;
|
||||||
|
const finalY = newY + scaledY;
|
||||||
|
|
||||||
// Find the Konva node for this member
|
// Find the Konva node for this member
|
||||||
const memberNode = layerRef.current?.findOne(`#${member.id}`) ||
|
const memberNode = layerRef.current?.findOne(`#${member.id}`) ||
|
||||||
layerRef.current?.findOne(`#masked-${member.id}`);
|
layerRef.current?.findOne(`#masked-${member.id}`);
|
||||||
if (memberNode) {
|
if (memberNode) {
|
||||||
memberNode.x(newX + scaledX);
|
// برای AbstractShape و TriangleShape که از مرکز استفاده میکنند، باید موقعیت را تنظیم کنیم
|
||||||
memberNode.y(newY + scaledY);
|
if (member.type === "rectangle" && (member.shapeType === "triangle" || member.shapeType === "abstract")) {
|
||||||
|
// موقعیت در store گوشه بالا-چپ است، اما در render از مرکز استفاده میشود
|
||||||
|
const w = (member.width || 100) * scaleX;
|
||||||
|
const h = (member.height || 100) * scaleY;
|
||||||
|
memberNode.x(finalX + w / 2);
|
||||||
|
memberNode.y(finalY + h / 2);
|
||||||
|
} else {
|
||||||
|
memberNode.x(finalX);
|
||||||
|
memberNode.y(finalY);
|
||||||
|
}
|
||||||
|
|
||||||
memberNode.width((member.width || 100) * scaleX);
|
memberNode.width((member.width || 100) * scaleX);
|
||||||
memberNode.height((member.height || 100) * scaleY);
|
memberNode.height((member.height || 100) * scaleY);
|
||||||
|
memberNode.rotation((member.rotation || 0) + rotation);
|
||||||
memberNode.scaleX(1);
|
memberNode.scaleX(1);
|
||||||
memberNode.scaleY(1);
|
memberNode.scaleY(1);
|
||||||
}
|
}
|
||||||
@@ -344,18 +366,30 @@ const EditorCanvas = () => {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// برای مثلث و abstract، x و y مرکز است
|
// برای مثلث و abstract، x و y در store گوشه بالا-چپ است اما در render مرکز استفاده میشود
|
||||||
if (originalMember.type === "rectangle" && (originalMember.shapeType === "triangle" || originalMember.shapeType === "abstract")) {
|
if (originalMember.type === "rectangle" && (originalMember.shapeType === "triangle" || originalMember.shapeType === "abstract")) {
|
||||||
const cx = m.x || 0;
|
// محاسبه مرکز از گوشه بالا-چپ
|
||||||
const cy = m.y || 0;
|
const cx = (m.x || 0) + w / 2;
|
||||||
|
const cy = (m.y || 0) + h / 2;
|
||||||
const rot = ((m.rotation || 0) * Math.PI) / 180;
|
const rot = ((m.rotation || 0) * Math.PI) / 180;
|
||||||
|
|
||||||
// محاسبه چهار گوشه rectangle با rotation
|
// برای abstract، از radius واقعی استفاده کن (0.85 * baseRadius)
|
||||||
|
// برای triangle، از radius واقعی استفاده کن (min(width, height) / 2)
|
||||||
|
let actualRadius: number;
|
||||||
|
if (originalMember.shapeType === "abstract") {
|
||||||
|
const baseRadius = Math.min(w / 2, h / 2);
|
||||||
|
actualRadius = baseRadius * 0.85;
|
||||||
|
} else {
|
||||||
|
// triangle
|
||||||
|
actualRadius = Math.min(w / 2, h / 2);
|
||||||
|
}
|
||||||
|
|
||||||
|
// محاسبه چهار گوشه با استفاده از radius واقعی
|
||||||
const corners = [
|
const corners = [
|
||||||
{ x: -w / 2, y: -h / 2 },
|
{ x: -actualRadius, y: -actualRadius },
|
||||||
{ x: w / 2, y: -h / 2 },
|
{ x: actualRadius, y: -actualRadius },
|
||||||
{ x: w / 2, y: h / 2 },
|
{ x: actualRadius, y: actualRadius },
|
||||||
{ x: -w / 2, y: h / 2 },
|
{ x: -actualRadius, y: actualRadius },
|
||||||
];
|
];
|
||||||
|
|
||||||
corners.forEach((corner) => {
|
corners.forEach((corner) => {
|
||||||
@@ -371,6 +405,21 @@ const EditorCanvas = () => {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// برای arrow و line، x و y نقطه شروع است و width/height نقطه پایان است
|
||||||
|
if (originalMember.type === "arrow" || originalMember.type === "line") {
|
||||||
|
const startX = m.x || 0;
|
||||||
|
const startY = m.y || 0;
|
||||||
|
const endX = m.width || 0;
|
||||||
|
const endY = m.height || 0;
|
||||||
|
|
||||||
|
// برای arrow و line، bounding box از نقطه شروع تا نقطه پایان است
|
||||||
|
minX = Math.min(minX, startX, endX);
|
||||||
|
minY = Math.min(minY, startY, endY);
|
||||||
|
maxX = Math.max(maxX, startX, endX);
|
||||||
|
maxY = Math.max(maxY, startY, endY);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
// برای سایر اشکال، x و y گوشه بالا-چپ است
|
// برای سایر اشکال، x و y گوشه بالا-چپ است
|
||||||
const cx = (m.x || 0) + w / 2;
|
const cx = (m.x || 0) + w / 2;
|
||||||
const cy = (m.y || 0) + h / 2;
|
const cy = (m.y || 0) + h / 2;
|
||||||
|
|||||||
@@ -771,18 +771,30 @@ export const useEditorStore = create<EditorStoreType>((set, get) => {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// برای مثلث و abstract، x و y مرکز است
|
// برای مثلث و abstract، x و y در store گوشه بالا-چپ است اما در render مرکز استفاده میشود
|
||||||
if (obj.type === "rectangle" && (obj.shapeType === "triangle" || obj.shapeType === "abstract")) {
|
if (obj.type === "rectangle" && (obj.shapeType === "triangle" || obj.shapeType === "abstract")) {
|
||||||
const cx = obj.x || 0;
|
// محاسبه مرکز از گوشه بالا-چپ
|
||||||
const cy = obj.y || 0;
|
const cx = (obj.x || 0) + w / 2;
|
||||||
|
const cy = (obj.y || 0) + h / 2;
|
||||||
const rot = ((obj.rotation || 0) * Math.PI) / 180;
|
const rot = ((obj.rotation || 0) * Math.PI) / 180;
|
||||||
|
|
||||||
// محاسبه چهار گوشه rectangle با rotation
|
// برای abstract، از radius واقعی استفاده کن (0.85 * baseRadius)
|
||||||
|
// برای triangle، از radius واقعی استفاده کن (min(width, height) / 2)
|
||||||
|
let actualRadius: number;
|
||||||
|
if (obj.shapeType === "abstract") {
|
||||||
|
const baseRadius = Math.min(w / 2, h / 2);
|
||||||
|
actualRadius = baseRadius * 0.85;
|
||||||
|
} else {
|
||||||
|
// triangle
|
||||||
|
actualRadius = Math.min(w / 2, h / 2);
|
||||||
|
}
|
||||||
|
|
||||||
|
// محاسبه چهار گوشه با استفاده از radius واقعی
|
||||||
const corners = [
|
const corners = [
|
||||||
{ x: -w / 2, y: -h / 2 },
|
{ x: -actualRadius, y: -actualRadius },
|
||||||
{ x: w / 2, y: -h / 2 },
|
{ x: actualRadius, y: -actualRadius },
|
||||||
{ x: w / 2, y: h / 2 },
|
{ x: actualRadius, y: actualRadius },
|
||||||
{ x: -w / 2, y: h / 2 },
|
{ x: -actualRadius, y: actualRadius },
|
||||||
];
|
];
|
||||||
|
|
||||||
corners.forEach((corner) => {
|
corners.forEach((corner) => {
|
||||||
@@ -798,6 +810,21 @@ export const useEditorStore = create<EditorStoreType>((set, get) => {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// برای arrow، x و y نقطه شروع است و width/height نقطه پایان است
|
||||||
|
if (obj.type === "arrow" || obj.type === "line") {
|
||||||
|
const startX = obj.x || 0;
|
||||||
|
const startY = obj.y || 0;
|
||||||
|
const endX = obj.width || 0;
|
||||||
|
const endY = obj.height || 0;
|
||||||
|
|
||||||
|
// برای arrow و line، bounding box از نقطه شروع تا نقطه پایان است
|
||||||
|
minX = Math.min(minX, startX, endX);
|
||||||
|
minY = Math.min(minY, startY, endY);
|
||||||
|
maxX = Math.max(maxX, startX, endX);
|
||||||
|
maxY = Math.max(maxY, startY, endY);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
// برای سایر اشکال، x و y گوشه بالا-چپ است
|
// برای سایر اشکال، x و y گوشه بالا-چپ است
|
||||||
const cx = (obj.x || 0) + w / 2;
|
const cx = (obj.x || 0) + w / 2;
|
||||||
const cy = (obj.y || 0) + h / 2;
|
const cy = (obj.y || 0) + h / 2;
|
||||||
|
|||||||
Reference in New Issue
Block a user