M: allow single operand synthesis

This commit is contained in:
Ivan 2024-09-16 19:38:24 +03:00
parent a919cf6baa
commit 93f2e772f6
5 changed files with 57 additions and 55 deletions

View File

@ -45,7 +45,7 @@ function DlgCreateOperation({ hideWindow, oss, onCreate, initialInputs }: DlgCre
if (alias === '') { if (alias === '') {
return false; return false;
} }
if (activeTab === TabID.SYNTHESIS && inputs.length === 1) { if (activeTab === TabID.SYNTHESIS && inputs.length === 0) {
return false; return false;
} }
if (activeTab === TabID.INPUT && !attachedID) { if (activeTab === TabID.INPUT && !attachedID) {

View File

@ -50,7 +50,7 @@ function NodeContextMenu({
} }
const argumentIDs = controller.schema.graph.expandInputs([operation.id]); const argumentIDs = controller.schema.graph.expandInputs([operation.id]);
if (!argumentIDs || argumentIDs.length < 2) { if (!argumentIDs || argumentIDs.length < 1) {
return false; return false;
} }

View File

@ -24,7 +24,7 @@ import { useConceptOptions } from '@/context/ConceptOptionsContext';
import { useOSS } from '@/context/OssContext'; import { useOSS } from '@/context/OssContext';
import useLocalStorage from '@/hooks/useLocalStorage'; import useLocalStorage from '@/hooks/useLocalStorage';
import { OssNode } from '@/models/miscellaneous'; import { OssNode } from '@/models/miscellaneous';
import { OperationID, OperationType } from '@/models/oss'; import { OperationID } from '@/models/oss';
import { PARAMETER, storage } from '@/utils/constants'; import { PARAMETER, storage } from '@/utils/constants';
import { errors } from '@/utils/labels'; import { errors } from '@/utils/labels';
@ -132,48 +132,11 @@ function OssFlow({ isModified, setIsModified }: OssFlowProps) {
return; return;
} }
let target = { x: 0, y: 0 };
const positions = getPositions(); const positions = getPositions();
if (positions.length == 0) { const target = flow.project({ x: window.innerWidth / 2, y: window.innerHeight / 2 });
target = flow.project({ x: window.innerWidth / 2, y: window.innerHeight / 2 });
} else if (inputs.length <= 1) {
let inputsNodes = positions.filter(pos =>
controller.schema!.items.find(
operation => operation.operation_type === OperationType.INPUT && operation.id === pos.id
)
);
if (inputsNodes.length > 0) {
inputsNodes = positions;
}
const maxX = Math.max(...inputsNodes.map(node => node.position_x));
const minY = Math.min(...inputsNodes.map(node => node.position_y));
target.x = maxX + 180;
target.y = minY;
} else {
const inputsNodes = positions.filter(pos => inputs.includes(pos.id));
const maxY = Math.max(...inputsNodes.map(node => node.position_y));
const minX = Math.min(...inputsNodes.map(node => node.position_x));
const maxX = Math.max(...inputsNodes.map(node => node.position_x));
target.x = Math.ceil((maxX + minX) / 2 / PARAMETER.ossGridSize) * PARAMETER.ossGridSize;
target.y = maxY + 100;
}
let flagIntersect = false;
do {
flagIntersect = positions.some(
position =>
Math.abs(position.position_x - target.x) < PARAMETER.ossMinDistance &&
Math.abs(position.position_y - target.y) < PARAMETER.ossMinDistance
);
if (flagIntersect) {
target.x += PARAMETER.ossMinDistance;
target.y += PARAMETER.ossMinDistance;
}
} while (flagIntersect);
controller.promptCreateOperation({ controller.promptCreateOperation({
x: target.x, defaultX: target.x,
y: target.y, defaultY: target.y,
inputs: inputs, inputs: inputs,
positions: positions, positions: positions,
callback: () => flow.fitView({ duration: PARAMETER.zoomDuration }) callback: () => flow.fitView({ duration: PARAMETER.zoomDuration })

View File

@ -76,7 +76,7 @@ function ToolbarOssGraph({
} }
const argumentIDs = controller.schema.graph.expandInputs([selectedOperation.id]); const argumentIDs = controller.schema.graph.expandInputs([selectedOperation.id]);
if (!argumentIDs || argumentIDs.length < 2) { if (!argumentIDs || argumentIDs.length < 1) {
return false; return false;
} }

View File

@ -36,8 +36,8 @@ import { errors, information } from '@/utils/labels';
import { RSTabID } from '../RSFormPage/RSTabs'; import { RSTabID } from '../RSFormPage/RSTabs';
export interface ICreateOperationPrompt { export interface ICreateOperationPrompt {
x: number; defaultX: number;
y: number; defaultY: number;
inputs: OperationID[]; inputs: OperationID[];
positions: IOperationPosition[]; positions: IOperationPosition[];
callback: (newID: OperationID) => void; callback: (newID: OperationID) => void;
@ -221,19 +221,58 @@ export const OssEditState = ({ selected, setSelected, children }: OssEditStatePr
[model] [model]
); );
const promptCreateOperation = useCallback(({ x, y, inputs, positions, callback }: ICreateOperationPrompt) => { const promptCreateOperation = useCallback(
setInsertPosition({ x: x, y: y }); ({ defaultX, defaultY, inputs, positions, callback }: ICreateOperationPrompt) => {
setInitialInputs(inputs); setInsertPosition({ x: defaultX, y: defaultY });
setPositions(positions); setInitialInputs(inputs);
setCreateCallback(() => callback); setPositions(positions);
setShowCreateOperation(true); setCreateCallback(() => callback);
}, []); setShowCreateOperation(true);
},
[]
);
const handleCreateOperation = useCallback( const handleCreateOperation = useCallback(
(data: IOperationCreateData) => { (data: IOperationCreateData) => {
const target = insertPosition;
if (data.item_data.operation_type === OperationType.INPUT) {
let inputsNodes = positions.filter(pos =>
model.schema!.items.find(
operation => operation.operation_type === OperationType.INPUT && operation.id === pos.id
)
);
if (inputsNodes.length > 0) {
inputsNodes = positions;
}
const maxX = Math.max(...inputsNodes.map(node => node.position_x));
const minY = Math.min(...inputsNodes.map(node => node.position_y));
target.x = maxX + PARAMETER.ossDistanceX;
target.y = minY;
} else {
const argNodes = positions.filter(pos => data.arguments!.includes(pos.id));
const maxY = Math.max(...argNodes.map(node => node.position_y));
const minX = Math.min(...argNodes.map(node => node.position_x));
const maxX = Math.max(...argNodes.map(node => node.position_x));
target.x = Math.ceil((maxX + minX) / 2 / PARAMETER.ossGridSize) * PARAMETER.ossGridSize;
target.y = maxY + PARAMETER.ossDistanceY;
}
let flagIntersect = false;
do {
flagIntersect = positions.some(
position =>
Math.abs(position.position_x - target.x) < PARAMETER.ossMinDistance &&
Math.abs(position.position_y - target.y) < PARAMETER.ossMinDistance
);
if (flagIntersect) {
target.x += PARAMETER.ossMinDistance;
target.y += PARAMETER.ossMinDistance;
}
} while (flagIntersect);
data.positions = positions; data.positions = positions;
data.item_data.position_x = insertPosition.x; data.item_data.position_x = target.x;
data.item_data.position_y = insertPosition.y; data.item_data.position_y = target.y;
model.createOperation(data, operation => { model.createOperation(data, operation => {
toast.success(information.newOperation(operation.alias)); toast.success(information.newOperation(operation.alias));
if (createCallback) { if (createCallback) {