同步仿真框架并接入AMESim气动组件

This commit is contained in:
huojiarong committed 2026-07-30 03:53:10 +00:00
1 parent 420bafeb4e
commit db4bdb4b70
109 files changed
+26920 -420

No files matched your search

+4257 -279
View File
File diff suppressed because it is too large. Load diff
+53
View File
@@ -0,0 +1,53 @@
import { useLayoutEffect } from "react";
import { useReactFlow, useStore } from "@xyflow/react";
type AutoFitViewProps = {
enabled?: boolean;
expectedNodeCount: number;
minZoom?: number;
padding?: number;
requestKey: number | string;
};
export function AutoFitView({
enabled = true,
expectedNodeCount,
minZoom = 0.1,
padding = 0.18,
requestKey,
}: AutoFitViewProps) {
const expectedNodesAreMeasured = useStore((state) => {
if (expectedNodeCount <= 0 || state.nodeLookup.size !== expectedNodeCount) {
return false;
}
for (const node of state.nodeLookup.values()) {
if (
!node.measured.width ||
!node.measured.height ||
node.measured.width <= 0 ||
node.measured.height <= 0
) {
return false;
}
}
return true;
});
const { fitView } = useReactFlow();
useLayoutEffect(() => {
if (!enabled || !expectedNodesAreMeasured) {
return;
}
void fitView({ duration: 0, minZoom, padding });
}, [
enabled,
expectedNodesAreMeasured,
fitView,
minZoom,
padding,
requestKey,
]);
return null;
}
File diff suppressed because it is too large. Load diff
+43
View File
@@ -0,0 +1,43 @@
export type WorkspaceView = "modeling" | "results";
type WorkspaceViewTabsProps = {
activeView: WorkspaceView;
hasResults: boolean;
hasUnreadResults?: boolean;
onViewChange: (view: WorkspaceView) => void;
};
export function WorkspaceViewTabs({
activeView,
hasResults,
hasUnreadResults = false,
onViewChange,
}: WorkspaceViewTabsProps) {
return (
<div aria-label="工作区视图" className="workspace-view-tabs" role="tablist">
<button
aria-selected={activeView === "modeling"}
className={activeView === "modeling" ? "active" : ""}
onClick={() => onViewChange("modeling")}
role="tab"
type="button"
>
建模
</button>
<button
aria-label={hasUnreadResults ? "结果,有新的仿真结果" : "结果"}
aria-selected={activeView === "results"}
className={activeView === "results" ? "active" : ""}
onClick={() => onViewChange("results")}
role="tab"
title={hasUnreadResults ? "有新的仿真结果" : undefined}
type="button"
>
结果
{hasResults && hasUnreadResults ? (
<span aria-hidden="true" className="result-available-dot" />
) : null}
</button>
</div>
);
}
+1982 -76
View File
File diff suppressed because it is too large. Load diff