diff --git a/rsconcept/frontend/src/components/info/TooltipOperation.tsx b/rsconcept/frontend/src/components/info/TooltipOperation.tsx
index acb6c9bc..3e704cb9 100644
--- a/rsconcept/frontend/src/components/info/TooltipOperation.tsx
+++ b/rsconcept/frontend/src/components/info/TooltipOperation.tsx
@@ -72,6 +72,11 @@ function TooltipOperation({ node, anchor }: TooltipOperationProps) {
КС не принадлежит ОСС
) : null}
+ {node.data.operation.is_consolidation ? (
+
+ Ромбовидный синтез
+
+ ) : null}
{node.data.operation.title ? (
Название:
diff --git a/rsconcept/frontend/src/models/OssLoader.ts b/rsconcept/frontend/src/models/OssLoader.ts
index dd00e791..b865dadf 100644
--- a/rsconcept/frontend/src/models/OssLoader.ts
+++ b/rsconcept/frontend/src/models/OssLoader.ts
@@ -62,6 +62,7 @@ export class OssLoader {
this.graph.topologicalOrder().forEach(operationID => {
const operation = this.operationByID.get(operationID)!;
const schema = this.items.find(item => item.id === operation.result);
+ operation.is_consolidation = this.inferConsolidation(operationID);
operation.is_owned = !schema || (schema.owner === this.oss.owner && schema.location === this.oss.location);
operation.substitutions = this.oss.substitutions.filter(item => item.operation === operationID);
operation.arguments = this.oss.arguments
@@ -70,6 +71,19 @@ export class OssLoader {
});
}
+ private inferConsolidation(operationID: OperationID): boolean {
+ const inputs = this.graph.expandInputs([operationID]);
+ if (inputs.length === 0) {
+ return false;
+ }
+ const ancestors = [...inputs];
+ inputs.forEach(input => {
+ ancestors.push(...this.graph.expandAllInputs([input]));
+ });
+ const unique = new Set(ancestors);
+ return unique.size < ancestors.length;
+ }
+
private calculateStats(): IOperationSchemaStats {
const items = this.oss.items;
return {
diff --git a/rsconcept/frontend/src/models/oss.ts b/rsconcept/frontend/src/models/oss.ts
index ae0f7137..5d8e9ded 100644
--- a/rsconcept/frontend/src/models/oss.ts
+++ b/rsconcept/frontend/src/models/oss.ts
@@ -37,6 +37,7 @@ export interface IOperation {
result: LibraryItemID | null;
is_owned: boolean;
+ is_consolidation: boolean; // aka 'diamond synthesis'
substitutions: ICstSubstituteEx[];
arguments: OperationID[];
}
diff --git a/rsconcept/frontend/src/pages/LibraryPage/TableLibraryItems.tsx b/rsconcept/frontend/src/pages/LibraryPage/TableLibraryItems.tsx
index 4dd86b03..cbdfba8a 100644
--- a/rsconcept/frontend/src/pages/LibraryPage/TableLibraryItems.tsx
+++ b/rsconcept/frontend/src/pages/LibraryPage/TableLibraryItems.tsx
@@ -148,7 +148,7 @@ function TableLibraryItems({ items, resetQuery, folderMode, toggleFolderMode }:
{
when: (item: ILibraryItem) => item.item_type === LibraryItemType.OSS,
style: {
- backgroundColor: colors.bgGreen50
+ color: colors.fgGreen
}
}
],
diff --git a/rsconcept/frontend/src/pages/ManualsPage/items/HelpConceptOSS.tsx b/rsconcept/frontend/src/pages/ManualsPage/items/HelpConceptOSS.tsx
index bf7940a3..5ea58e4d 100644
--- a/rsconcept/frontend/src/pages/ManualsPage/items/HelpConceptOSS.tsx
+++ b/rsconcept/frontend/src/pages/ManualsPage/items/HelpConceptOSS.tsx
@@ -1,24 +1,37 @@
+import { IconOSS, IconPredecessor } from '@/components/Icons';
import LinkTopic from '@/components/ui/LinkTopic';
import { HelpTopic } from '@/models/miscellaneous';
function HelpConceptOSS() {
return (
-
+
Операционная схема синтеза
Работа со сложными предметными областями требует многократного{' '}
для построения целевых понятий. Последовательность
- синтезов концептуальных схем задается с помощью Операционной схемы синтеза (ОСС) в форме Графа синтеза.
+ синтезов задается с помощью{' '}
+
+ Операционной схемы синтеза (ОСС)
+ {' '}
+ и отображается в форме .
Отдельные операции в рамках ОСС задаются таблицами отождествлений понятий из синтезируемых схем. Таким
- образом в каждой КС разделяются на
- наследованные, отождествленные и дописанные.
+ образом в каждой КС разделяются на исходные
+ (дописанные), наследованные, отождествленные (удаляемые).
Портал поддерживает сквозные изменения в рамках ОСС. Изменения, внесенные в исходные концептуальные схемы
автоматически проносятся через граф синтеза (путем обновления наследованных конституент). Формальные определения
- наследованных конституент можно редактировать только путем изменения исходных конституент.
+ наследованных конституент можно редактировать только путем изменения{' '}
+
+ исходных конституент.
+
+
+
+ Ромбовидным синтезом называется операция, где используются КС, имеющие общих предков. При таком синтезе
+ могут возникать дубликаты и неоднозначности в результате. Необходимо внимательно формировать таблицу
+ отождествлений, добавляя дублирующиеся понятия из синтезируемых схем.
);
diff --git a/rsconcept/frontend/src/pages/ManualsPage/items/HelpConceptSynthesis.tsx b/rsconcept/frontend/src/pages/ManualsPage/items/HelpConceptSynthesis.tsx
index 595ad14b..22f0509b 100644
--- a/rsconcept/frontend/src/pages/ManualsPage/items/HelpConceptSynthesis.tsx
+++ b/rsconcept/frontend/src/pages/ManualsPage/items/HelpConceptSynthesis.tsx
@@ -40,8 +40,8 @@ function HelpConceptSynthesis() {
- Для управления совокупностью синтезов используются операционные схемы синтеза. В данный момент этот
- функционал еще не реализован в Портале.
+ Для управления совокупностью синтезов используются{' '}
+ .
);
diff --git a/rsconcept/frontend/src/pages/ManualsPage/items/HelpLibrary.tsx b/rsconcept/frontend/src/pages/ManualsPage/items/HelpLibrary.tsx
index c95465fd..622a99c6 100644
--- a/rsconcept/frontend/src/pages/ManualsPage/items/HelpLibrary.tsx
+++ b/rsconcept/frontend/src/pages/ManualsPage/items/HelpLibrary.tsx
@@ -5,18 +5,28 @@ import {
IconFolderEmpty,
IconFolderOpened,
IconFolderTree,
+ IconOSS,
+ IconRSForm,
IconSearch,
IconShow,
IconSortAsc,
IconSortDesc
} from '@/components/Icons';
+import { useConceptOptions } from '@/context/ConceptOptionsContext';
function HelpLibrary() {
+ const { colors } = useConceptOptions();
return (
Библиотека схем
-
В библиотеке собраны концептуальные схемы, эксплицированные в родоструктурном аппарате
+
+ В библиотеке собраны системы определений (КС)
и
+ операционные схемы синтеза (ОСС).
+
+
+ зеленым текстом выделены ОСС
+
клик по строке - переход к редактированию схемы
Ctrl + клик по строке откроет схему в новой вкладке
Фильтры атрибутов три позиции: да/нет/не применять
diff --git a/rsconcept/frontend/src/pages/ManualsPage/items/HelpOssGraph.tsx b/rsconcept/frontend/src/pages/ManualsPage/items/HelpOssGraph.tsx
index d76d3cb5..7752220c 100644
--- a/rsconcept/frontend/src/pages/ManualsPage/items/HelpOssGraph.tsx
+++ b/rsconcept/frontend/src/pages/ManualsPage/items/HelpOssGraph.tsx
@@ -1,4 +1,5 @@
import {
+ IconAlert,
IconAnimation,
IconAnimationOff,
IconConnect,
@@ -23,7 +24,7 @@ import { HelpTopic } from '@/models/miscellaneous';
function HelpOssGraph() {
return (
-
Граф синтеза
+
Граф синтеза
Настройка графа
@@ -50,7 +51,10 @@ function HelpOssGraph() {
Клик на операцию – выделение
Esc – сбросить выделение
- Двойной клик – редактирование
+ Двойной клик – переход к связанной
+
+
+ Редактирование операции
Новая операция
@@ -73,7 +77,7 @@ function HelpOssGraph() {
Сохранить положения
- Сохранить в формат SVG
+ Сохранить в SVG
@@ -82,9 +86,12 @@ function HelpOssGraph() {
Контекстное меню
- Переход к связанной{' '}
+ Статус связанной{' '}
+
+
+
Создать пустую КС для загрузки
diff --git a/rsconcept/frontend/src/pages/OssPage/EditorOssGraph/InputNode.tsx b/rsconcept/frontend/src/pages/OssPage/EditorOssGraph/InputNode.tsx
index 4c019f35..ac63fd96 100644
--- a/rsconcept/frontend/src/pages/OssPage/EditorOssGraph/InputNode.tsx
+++ b/rsconcept/frontend/src/pages/OssPage/EditorOssGraph/InputNode.tsx
@@ -21,11 +21,12 @@ function InputNode(node: OssNodeInternal) {
<>
-
+
}
noHover
- title='Связанная КС'
+ noPadding
+ title={hasFile ? 'Связанная КС' : 'Нет связанной КС'}
hideTitle={!controller.showTooltip}
onClick={() => {
handleOpenSchema();
diff --git a/rsconcept/frontend/src/pages/OssPage/EditorOssGraph/NodeContextMenu.tsx b/rsconcept/frontend/src/pages/OssPage/EditorOssGraph/NodeContextMenu.tsx
index af936100..9e866b26 100644
--- a/rsconcept/frontend/src/pages/OssPage/EditorOssGraph/NodeContextMenu.tsx
+++ b/rsconcept/frontend/src/pages/OssPage/EditorOssGraph/NodeContextMenu.tsx
@@ -105,7 +105,7 @@ function NodeContextMenu({
= window.innerWidth - PARAMETER.ossContextMenuWidth}>
}
disabled={controller.isProcessing}
onClick={handleEditOperation}
@@ -113,7 +113,7 @@ function NodeContextMenu({
{operation.result ? (
}
disabled={controller.isProcessing}
diff --git a/rsconcept/frontend/src/pages/OssPage/EditorOssGraph/OperationNode.tsx b/rsconcept/frontend/src/pages/OssPage/EditorOssGraph/OperationNode.tsx
index 5b928104..1e5c8b14 100644
--- a/rsconcept/frontend/src/pages/OssPage/EditorOssGraph/OperationNode.tsx
+++ b/rsconcept/frontend/src/pages/OssPage/EditorOssGraph/OperationNode.tsx
@@ -1,6 +1,6 @@
import { Handle, Position } from 'reactflow';
-import { IconRSForm } from '@/components/Icons';
+import { IconAlert, IconRSForm } from '@/components/Icons';
import TooltipOperation from '@/components/info/TooltipOperation';
import MiniButton from '@/components/ui/MiniButton.tsx';
import Overlay from '@/components/ui/Overlay';
@@ -22,15 +22,31 @@ function OperationNode(node: OssNodeInternal) {
<>
-
+
}
+ icon={
+
+ }
noHover
- title='Связанная КС'
+ noPadding
+ title={hasFile ? 'Связанная КС' : 'Нет связанной КС'}
hideTitle={!controller.showTooltip}
onClick={handleOpenSchema}
disabled={!hasFile}
/>
+ {node.data.operation.is_consolidation ? (
+ }
+ disabled
+ noPadding
+ noHover
+ title='Внимание! Ромбовидный синтез'
+ hideTitle={!controller.showTooltip}
+ />
+ ) : null}
{!node.data.operation.is_owned ? (
diff --git a/rsconcept/frontend/src/pages/OssPage/EditorOssGraph/OssFlow.tsx b/rsconcept/frontend/src/pages/OssPage/EditorOssGraph/OssFlow.tsx
index c35ce23a..00d72463 100644
--- a/rsconcept/frontend/src/pages/OssPage/EditorOssGraph/OssFlow.tsx
+++ b/rsconcept/frontend/src/pages/OssPage/EditorOssGraph/OssFlow.tsx
@@ -299,9 +299,13 @@ function OssFlow({ isModified, setIsModified }: OssFlowProps) {
(event: CProps.EventMouse, node: OssNode) => {
event.preventDefault();
event.stopPropagation();
- handleEditOperation(Number(node.id));
+ if (node.data.operation.result) {
+ controller.openOperationSchema(Number(node.id));
+ } else {
+ handleEditOperation(Number(node.id));
+ }
},
- [handleEditOperation]
+ [handleEditOperation, controller.openOperationSchema]
);
function handleKeyDown(event: React.KeyboardEvent) {
diff --git a/rsconcept/frontend/src/pages/RSFormPage/EditorRSFormCard/EditorLibraryItem.tsx b/rsconcept/frontend/src/pages/RSFormPage/EditorRSFormCard/EditorLibraryItem.tsx
index 443919ac..b6daa4b0 100644
--- a/rsconcept/frontend/src/pages/RSFormPage/EditorRSFormCard/EditorLibraryItem.tsx
+++ b/rsconcept/frontend/src/pages/RSFormPage/EditorRSFormCard/EditorLibraryItem.tsx
@@ -89,16 +89,14 @@ function EditorLibraryItem({ item, isModified, controller }: EditorLibraryItemPr
/>
{accessLevel >= UserLevel.OWNER ? (
-
-
- controller.promptEditors()}
- icon={}
- disabled={isModified || controller.isProcessing}
- />
-
+
+ controller.promptEditors()}
+ icon={}
+ disabled={isModified || controller.isProcessing}
+ />
) : null}