M: allow single operand synthesis
This commit is contained in:
parent
a919cf6baa
commit
93f2e772f6
|
@ -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) {
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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 })
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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) => {
|
||||||
|
setInsertPosition({ x: defaultX, y: defaultY });
|
||||||
setInitialInputs(inputs);
|
setInitialInputs(inputs);
|
||||||
setPositions(positions);
|
setPositions(positions);
|
||||||
setCreateCallback(() => callback);
|
setCreateCallback(() => callback);
|
||||||
setShowCreateOperation(true);
|
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) {
|
||||||
|
|
Loading…
Reference in New Issue
Block a user