brainsmatics 1.1.77 → 1.1.78
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/component/3d/aichat/index.d.ts +2 -1
- package/dist/component/3d/auxiliary/index.d.ts +5 -1
- package/dist/component/3d/index.d.ts +1 -0
- package/dist/{deflate-30d1f4f0.js → deflate-60fec9f3.js} +1 -1
- package/dist/{deflate-50a01159.mjs → deflate-e1a71987.mjs} +1 -1
- package/dist/index-86f7d521.js +6288 -0
- package/dist/{index-4b0e781b.mjs → index-96cc28b0.mjs} +75638 -63106
- package/dist/index.js +1 -1
- package/dist/index.mjs +57 -56
- package/dist/{lerc-1cb58b78.mjs → lerc-edcec007.mjs} +1 -1
- package/dist/{lerc-a85714d9.js → lerc-ee296c33.js} +1 -1
- package/package.json +4 -1
- package/.dockerignore +0 -1
- package/.env.development +0 -1
- package/.env.production +0 -1
- package/.idea/workspace.xml +0 -64
- package/.opencode/skills/react/SKILL.md +0 -49
- package/.opencode/skills/three/SKILL.md +0 -82
- package/.vscode/settings.json +0 -3
- package/AGENTS.md +0 -406
- package/Dockerfile +0 -18
- package/REAMED2.md +0 -157
- package/STAM.d.ts +0 -1
- package/addPublishRules.js +0 -22
- package/bun.lock +0 -3810
- package/dist/index-26e8583c.js +0 -6206
- package/docker-compose.yml +0 -11
- package/env.d.ts +0 -7
- package/index.html +0 -13
- package/removePublishRules.js +0 -21
- package/storybook-error.log +0 -0
- package/storybook.log +0 -0
- package/tsconfig.json +0 -38
- package/vite.config.js +0 -68
|
@@ -1,82 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
description: 专注于在 React 架构下通过原生 Three.js 进行分布式场景管理和对象生命周期控制
|
|
3
|
-
tags: [threejs, webgl, react-integration, scene-management]
|
|
4
|
-
---
|
|
5
|
-
|
|
6
|
-
# Three.js Distributed Architecture Skill
|
|
7
|
-
|
|
8
|
-
## 角色定位
|
|
9
|
-
你是一个精通 Three.js 架构的专家。你擅长在 React 环境中管理复杂的 3D 场景流,能够处理“父组件初始化场景,子组件管理物体”的分布式逻辑,并确保内存管理严格符合 WebGL 要求。
|
|
10
|
-
|
|
11
|
-
## 核心准则 (分布式开发)
|
|
12
|
-
1. **单例维护**: 场景 (Scene)、渲染器 (Renderer) 和相机 (Camera) 由顶层提供(通常通过 React Context 或 Props 传递)。
|
|
13
|
-
2. **子组件职责**:
|
|
14
|
-
- 子组件不应创建渲染器,只负责创建、添加和删除其管辖内的 `Object3D`。
|
|
15
|
-
- 在 `useEffect` 的挂载阶段将物体 `scene.add(object)`。
|
|
16
|
-
- 在卸载阶段必须执行 `scene.remove(object)` 并调用 `geometry.dispose()` 和 `material.dispose()`。
|
|
17
|
-
3. **引用一致性**: 使用 `useRef` 持有 Three.js 原生对象,确保在 React 重绘时对象不被重新创建。
|
|
18
|
-
4. **数据同步**: 监听 Props 变化,在 `useEffect` 中手动更新 Three.js 对象的属性(如 `position.set()`, `material.color.set()`)。
|
|
19
|
-
|
|
20
|
-
## 推荐架构模式
|
|
21
|
-
|
|
22
|
-
### 1. 顶层共享模式 (Context)
|
|
23
|
-
建议使用 React Context 共享底层的 Three.js 实例,以便深层子组件访问。
|
|
24
|
-
|
|
25
|
-
### 2. 子组件示例 (Logic Fragment)
|
|
26
|
-
当需要编写一个负责渲染特定物体的子组件时,遵循以下结构:
|
|
27
|
-
|
|
28
|
-
```typescript
|
|
29
|
-
import React, { useEffect, useRef } from 'react';
|
|
30
|
-
import * as THREE from 'three';
|
|
31
|
-
|
|
32
|
-
interface BoxProps {
|
|
33
|
-
scene: THREE.Scene; // 从父组件或 Context 传入
|
|
34
|
-
position: [number, number, number];
|
|
35
|
-
color: string;
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
export const BoxElement: React.FC<BoxProps> = ({ scene, position, color }) => {
|
|
39
|
-
const meshRef = useRef<THREE.Mesh>();
|
|
40
|
-
|
|
41
|
-
useEffect(() => {
|
|
42
|
-
// 初始化物体
|
|
43
|
-
const geo = new THREE.BoxGeometry(1, 1, 1);
|
|
44
|
-
const mat = new THREE.MeshStandardMaterial({ color });
|
|
45
|
-
const mesh = new THREE.Mesh(geo, mat);
|
|
46
|
-
mesh.position.set(...position);
|
|
47
|
-
|
|
48
|
-
// 挂载到全局场景
|
|
49
|
-
scene.add(mesh);
|
|
50
|
-
meshRef.current = mesh;
|
|
51
|
-
|
|
52
|
-
// 销毁逻辑:必须彻底释放显存
|
|
53
|
-
return () => {
|
|
54
|
-
scene.remove(mesh);
|
|
55
|
-
geo.dispose();
|
|
56
|
-
mat.dispose();
|
|
57
|
-
};
|
|
58
|
-
}, [scene]); // 仅在场景对象变更时重新初始化
|
|
59
|
-
|
|
60
|
-
// 监听属性变化并同步到 Three.js 对象
|
|
61
|
-
useEffect(() => {
|
|
62
|
-
if (meshRef.current) {
|
|
63
|
-
meshRef.current.position.set(...position);
|
|
64
|
-
(meshRef.current.material as THREE.MeshStandardMaterial).color.set(color);
|
|
65
|
-
}
|
|
66
|
-
}, [position, color]);
|
|
67
|
-
|
|
68
|
-
return null; // 这是一个逻辑组件,不渲染任何 DOM
|
|
69
|
-
};
|
|
70
|
-
```
|
|
71
|
-
## 调试与诊断
|
|
72
|
-
1. **物体未显示**:
|
|
73
|
-
- 确认子组件是否正确执行了 scene.add()。
|
|
74
|
-
- 确认 mesh.frustumCulled 是否导致物体在相机视野外被剔除。
|
|
75
|
-
- **检查父组件的渲染循环 (requestAnimationFrame) 是否正在运行。
|
|
76
|
-
2. **内存持续增长**: 检查子组件卸载时是否遗漏了 geometry.dispose()。使用 renderer.info.memory 监控资源。
|
|
77
|
-
3. **重复添加**: 确保 scene.add 逻辑在 useEffect 中有正确的清理机制,防止 React StrictMode 下重复挂载。
|
|
78
|
-
|
|
79
|
-
## 注意事项
|
|
80
|
-
1. **计算逻辑**: 复杂的几何计算应放在 useMemo 中或单独的 worker 中,避免阻塞 React 主线程。
|
|
81
|
-
2. **渲染频率**: 不要将 Three.js 的每一帧状态同步回 React 的 State,这会导致严重的性能瓶颈。
|
|
82
|
-
3. **坐标系一致性**: 在分布式开发中,所有子组件应约定使用统一的比例尺和坐标基准。
|
package/.vscode/settings.json
DELETED
package/AGENTS.md
DELETED
|
@@ -1,406 +0,0 @@
|
|
|
1
|
-
# AGENTS.md
|
|
2
|
-
|
|
3
|
-
This file defines how agentic coding assistants should operate in this repository.
|
|
4
|
-
It is consumed by tools such as OpenCode, Cursor, Claude Code, etc.
|
|
5
|
-
|
|
6
|
-
======================================================================
|
|
7
|
-
Project Overview
|
|
8
|
-
======================================================================
|
|
9
|
-
|
|
10
|
-
Project name: brain-ui (brainsmatics)
|
|
11
|
-
|
|
12
|
-
This is a **React component library** for neuroscience data visualization, built with:
|
|
13
|
-
|
|
14
|
-
- React 18
|
|
15
|
-
- TypeScript 4.9.5
|
|
16
|
-
- Vite 4.2.0
|
|
17
|
-
- Ant Design (antd) 5.24.6 + Ant Design X (@ant-design/x) 1.1.0
|
|
18
|
-
- Three.js 0.157.0
|
|
19
|
-
- Storybook 7.0.6
|
|
20
|
-
|
|
21
|
-
The project provides reusable UI components for:
|
|
22
|
-
- **3D brain visualization** (neurons, brain atlases, regions, SWC files)
|
|
23
|
-
- **2D data viewers** (grids, thumbnails, navigation trees)
|
|
24
|
-
- **AI chat integration** (LLM-powered neuroscience assistant)
|
|
25
|
-
- **Medical imaging** (NIfTI, TIFF, GeoTIFF support)
|
|
26
|
-
|
|
27
|
-
======================================================================
|
|
28
|
-
Package Management
|
|
29
|
-
======================================================================
|
|
30
|
-
|
|
31
|
-
Preferred package manager:
|
|
32
|
-
- **pnpm** (preferred if lockfile exists - `pnpm-lock.yaml`)
|
|
33
|
-
- **npm** (if `package-lock.json` exists)
|
|
34
|
-
- **yarn** (if `yarn.lock` exists)
|
|
35
|
-
|
|
36
|
-
Do NOT introduce new dependencies unless explicitly requested.
|
|
37
|
-
|
|
38
|
-
======================================================================
|
|
39
|
-
Development / Build Commands
|
|
40
|
-
======================================================================
|
|
41
|
-
|
|
42
|
-
Install dependencies:
|
|
43
|
-
```bash
|
|
44
|
-
pnpm install
|
|
45
|
-
# or
|
|
46
|
-
npm install
|
|
47
|
-
# or
|
|
48
|
-
yarn install
|
|
49
|
-
```
|
|
50
|
-
|
|
51
|
-
Start development server:
|
|
52
|
-
```bash
|
|
53
|
-
pnpm dev
|
|
54
|
-
# or
|
|
55
|
-
npm run dev
|
|
56
|
-
```
|
|
57
|
-
|
|
58
|
-
Production build (library):
|
|
59
|
-
```bash
|
|
60
|
-
pnpm build
|
|
61
|
-
# or
|
|
62
|
-
npm run build
|
|
63
|
-
```
|
|
64
|
-
|
|
65
|
-
Preview production build:
|
|
66
|
-
```bash
|
|
67
|
-
pnpm preview
|
|
68
|
-
# or
|
|
69
|
-
npm run preview
|
|
70
|
-
```
|
|
71
|
-
|
|
72
|
-
======================================================================
|
|
73
|
-
Storybook
|
|
74
|
-
======================================================================
|
|
75
|
-
|
|
76
|
-
Run Storybook locally:
|
|
77
|
-
```bash
|
|
78
|
-
pnpm storybook
|
|
79
|
-
# or
|
|
80
|
-
npm run storybook
|
|
81
|
-
```
|
|
82
|
-
|
|
83
|
-
Build Storybook:
|
|
84
|
-
```bash
|
|
85
|
-
pnpm build-storybook
|
|
86
|
-
# or
|
|
87
|
-
npm run build-storybook
|
|
88
|
-
```
|
|
89
|
-
|
|
90
|
-
Story files should be colocated with components and named:
|
|
91
|
-
- `*.stories.tsx`
|
|
92
|
-
- `*.stories.ts`
|
|
93
|
-
|
|
94
|
-
Storybook configuration:
|
|
95
|
-
- Main config: `.storybook/main.js`
|
|
96
|
-
- Preview config: `.storybook/preview.js`
|
|
97
|
-
- Custom middleware: `.storybook/middleware.js` (for API proxying)
|
|
98
|
-
|
|
99
|
-
======================================================================
|
|
100
|
-
Project Structure
|
|
101
|
-
======================================================================
|
|
102
|
-
|
|
103
|
-
```
|
|
104
|
-
src/
|
|
105
|
-
├── component/
|
|
106
|
-
│ ├── 2d/ # 2D visualization components
|
|
107
|
-
│ │ ├── gridviewer/ # Grid-based data viewer
|
|
108
|
-
│ │ ├── navtree/ # Navigation tree component
|
|
109
|
-
│ │ ├── navigation/ # Navigation controls
|
|
110
|
-
│ │ ├── thumbnail/ # Thumbnail viewer
|
|
111
|
-
│ │ ├── distribution/ # Data distribution charts
|
|
112
|
-
│ │ ├── mulifiveiewer/ # Multi-view layout
|
|
113
|
-
│ │ ├── twoviewer/ # Dual view comparison
|
|
114
|
-
│ │ └── ...
|
|
115
|
-
│ ├── 3d/ # 3D visualization components
|
|
116
|
-
│ │ ├── functionLoop/ # AI-powered functional circuit analysis
|
|
117
|
-
│ │ ├── aichat/ # AI chat interface (@ant-design/x)
|
|
118
|
-
│ │ ├── swctree/ # SWC neuron file viewer
|
|
119
|
-
│ │ ├── modalLoader/ # 3D model loader (FBX/OBJ)
|
|
120
|
-
│ │ ├── stlLoader/ # STL file loader
|
|
121
|
-
│ │ ├── atlas/ # Brain atlas viewer
|
|
122
|
-
│ │ ├── sideBar/ # 3D viewer sidebar
|
|
123
|
-
│ │ ├── volumeAnalysis/ # Volume data analysis
|
|
124
|
-
│ │ ├── registration/ # Image registration
|
|
125
|
-
│ │ └── ...
|
|
126
|
-
│ ├── common/ # Shared UI components
|
|
127
|
-
│ │ ├── Button/
|
|
128
|
-
│ │ └── Header/
|
|
129
|
-
│ ├── types/ # TypeScript type definitions
|
|
130
|
-
│ └── util/ # Utility functions
|
|
131
|
-
│ ├── i18n.ts # Internationalization (i18next)
|
|
132
|
-
│ ├── global.ts # Global state/variables
|
|
133
|
-
│ ├── swc.ts # SWC file utilities
|
|
134
|
-
│ └── ...
|
|
135
|
-
├── stories/ # Storybook stories
|
|
136
|
-
└── assets/ # Static assets (fonts, icons)
|
|
137
|
-
```
|
|
138
|
-
|
|
139
|
-
======================================================================
|
|
140
|
-
TypeScript Rules
|
|
141
|
-
======================================================================
|
|
142
|
-
|
|
143
|
-
- Always use TypeScript (.ts / .tsx)
|
|
144
|
-
- Avoid `any` unless absolutely unavoidable
|
|
145
|
-
- Prefer explicit types for:
|
|
146
|
-
- component props
|
|
147
|
-
- public functions
|
|
148
|
-
- Use `interface` for component props and public APIs
|
|
149
|
-
- Use `type` for unions, utility types, and internal helpers
|
|
150
|
-
|
|
151
|
-
Example:
|
|
152
|
-
|
|
153
|
-
```typescript
|
|
154
|
-
interface ComponentProps {
|
|
155
|
-
value: number;
|
|
156
|
-
onChange?: (value: number) => void;
|
|
157
|
-
}
|
|
158
|
-
```
|
|
159
|
-
|
|
160
|
-
Compiler options (from tsconfig.json):
|
|
161
|
-
- Strict mode enabled (`strict: true`)
|
|
162
|
-
- Declaration files generated (`declaration: true`)
|
|
163
|
-
- Path mapping: `"brainsmatics/STAM"` → `dist/component/STAM.d.ts`
|
|
164
|
-
|
|
165
|
-
======================================================================
|
|
166
|
-
React Rules
|
|
167
|
-
======================================================================
|
|
168
|
-
|
|
169
|
-
- Use **function components only**
|
|
170
|
-
- Do NOT use class components
|
|
171
|
-
- Follow the Rules of Hooks
|
|
172
|
-
- Prefer composition over inheritance
|
|
173
|
-
- Extract reusable logic into custom hooks
|
|
174
|
-
- Avoid deeply nested JSX structures
|
|
175
|
-
|
|
176
|
-
State management:
|
|
177
|
-
- Prefer local state (`useState` / `useReducer`)
|
|
178
|
-
- Use global state sparingly (see `src/component/util/global.ts`)
|
|
179
|
-
- Use refs for mutable values that should not trigger re-render
|
|
180
|
-
|
|
181
|
-
Performance:
|
|
182
|
-
- Use `useMemo` / `useCallback` for expensive computations
|
|
183
|
-
- Avoid creating new objects/functions inside render unless required
|
|
184
|
-
|
|
185
|
-
======================================================================
|
|
186
|
-
Component Structure
|
|
187
|
-
======================================================================
|
|
188
|
-
|
|
189
|
-
Recommended component structure:
|
|
190
|
-
|
|
191
|
-
```
|
|
192
|
-
ComponentName/
|
|
193
|
-
├─ index.tsx # Main component export
|
|
194
|
-
├─ index.css # Component styles
|
|
195
|
-
├─ ComponentName.stories.tsx # Storybook stories
|
|
196
|
-
├─ types.ts # Component-specific types (optional)
|
|
197
|
-
└─ SubComponent.tsx # Child components (optional)
|
|
198
|
-
```
|
|
199
|
-
|
|
200
|
-
Rules:
|
|
201
|
-
- `index.tsx` exports the component
|
|
202
|
-
- Styles are colocated with the component
|
|
203
|
-
- Stories demonstrate common usage and edge cases
|
|
204
|
-
- Use CSS Modules for complex styling (e.g., `index.module.css`)
|
|
205
|
-
|
|
206
|
-
======================================================================
|
|
207
|
-
Ant Design (antd) Usage
|
|
208
|
-
======================================================================
|
|
209
|
-
|
|
210
|
-
- Use antd components as the primary UI building blocks
|
|
211
|
-
- Also available: **Ant Design X** (`@ant-design/x`) for AI chat interfaces
|
|
212
|
-
- `Bubble` - Chat message bubbles
|
|
213
|
-
- `Sender` - Message input
|
|
214
|
-
- `Prompts` - Prompt suggestions
|
|
215
|
-
- Avoid copying or modifying antd internal styles
|
|
216
|
-
- Prefer composition instead of overriding antd components
|
|
217
|
-
- Use `className` or `style` props for customization
|
|
218
|
-
- Avoid deep CSS selectors targeting antd internals
|
|
219
|
-
|
|
220
|
-
======================================================================
|
|
221
|
-
Three.js Usage
|
|
222
|
-
======================================================================
|
|
223
|
-
|
|
224
|
-
- Keep Three.js logic isolated from UI logic when possible
|
|
225
|
-
- Use shared global scene/camera from `src/component/util/global.ts`
|
|
226
|
-
- Avoid heavy allocations inside render loops
|
|
227
|
-
- Be mindful of GPU memory usage
|
|
228
|
-
- Always clean up resources when no longer needed:
|
|
229
|
-
```typescript
|
|
230
|
-
geometry.dispose()
|
|
231
|
-
material.dispose()
|
|
232
|
-
texture.dispose()
|
|
233
|
-
```
|
|
234
|
-
- Avoid unnecessary re-creation of:
|
|
235
|
-
- geometries
|
|
236
|
-
- materials
|
|
237
|
-
- textures
|
|
238
|
-
- Prefer memoization for expensive objects
|
|
239
|
-
|
|
240
|
-
Common Three.js imports:
|
|
241
|
-
```typescript
|
|
242
|
-
import * as THREE from "three";
|
|
243
|
-
import { GLTFLoader } from 'three/examples/jsm/loaders/GLTFLoader';
|
|
244
|
-
import { FontLoader } from 'three/examples/jsm/loaders/FontLoader';
|
|
245
|
-
import { TextGeometry } from 'three/examples/jsm/geometries/TextGeometry';
|
|
246
|
-
import { Line2 } from "three/examples/jsm/lines/Line2";
|
|
247
|
-
import { LineMaterial } from "three/examples/jsm/lines/LineMaterial";
|
|
248
|
-
import { LineGeometry } from "three/examples/jsm/lines/LineGeometry";
|
|
249
|
-
```
|
|
250
|
-
|
|
251
|
-
======================================================================
|
|
252
|
-
Internationalization (i18n)
|
|
253
|
-
======================================================================
|
|
254
|
-
|
|
255
|
-
The project uses **i18next** with react-i18next for internationalization.
|
|
256
|
-
|
|
257
|
-
Supported languages:
|
|
258
|
-
- English (`en_us`)
|
|
259
|
-
- Chinese (`zh_cn`)
|
|
260
|
-
|
|
261
|
-
Translation files:
|
|
262
|
-
- `src/component/util/en_us.json`
|
|
263
|
-
- `src/component/util/zh_cn.json`
|
|
264
|
-
|
|
265
|
-
Usage in components:
|
|
266
|
-
```typescript
|
|
267
|
-
import { change_language } from '../util/i18n';
|
|
268
|
-
|
|
269
|
-
// Component receives `t` function via props
|
|
270
|
-
interface Props {
|
|
271
|
-
t: (key: string) => string;
|
|
272
|
-
}
|
|
273
|
-
```
|
|
274
|
-
|
|
275
|
-
======================================================================
|
|
276
|
-
Key Dependencies
|
|
277
|
-
======================================================================
|
|
278
|
-
|
|
279
|
-
Core:
|
|
280
|
-
- `react` / `react-dom` (peer dependencies, >=18.0.0)
|
|
281
|
-
- `typescript` 4.9.5
|
|
282
|
-
|
|
283
|
-
UI Framework:
|
|
284
|
-
- `antd` 5.24.6
|
|
285
|
-
- `@ant-design/x` 1.1.0 (AI chat components)
|
|
286
|
-
- `@ant-design/x-markdown` 2.0.0-alpha.5
|
|
287
|
-
|
|
288
|
-
3D Visualization:
|
|
289
|
-
- `three` 0.157.0
|
|
290
|
-
- `@types/three` 0.157.2
|
|
291
|
-
|
|
292
|
-
Medical Imaging:
|
|
293
|
-
- `@itk-wasm/image-io` 1.6.0
|
|
294
|
-
- `nifti-reader-js` 0.8.0
|
|
295
|
-
- `geotiff` 2.1.3
|
|
296
|
-
- `tiff` 6.0.0
|
|
297
|
-
|
|
298
|
-
Charts & Data:
|
|
299
|
-
- `echarts` 5.5.1
|
|
300
|
-
- `react-window` 1.8.9 (virtualization)
|
|
301
|
-
|
|
302
|
-
Maps:
|
|
303
|
-
- `leaflet` 1.9.4
|
|
304
|
-
- `react-leaflet` 4.2.1
|
|
305
|
-
|
|
306
|
-
Utilities:
|
|
307
|
-
- `i18next` / `react-i18next` (internationalization)
|
|
308
|
-
- `socket.io-client` 4.8.1
|
|
309
|
-
- `markdown-it` 14.1.0
|
|
310
|
-
- `react-markdown` 10.1.0
|
|
311
|
-
- `dompurify` 3.2.5
|
|
312
|
-
|
|
313
|
-
======================================================================
|
|
314
|
-
Performance Guidelines
|
|
315
|
-
======================================================================
|
|
316
|
-
|
|
317
|
-
- Avoid unnecessary re-renders
|
|
318
|
-
- Use `useMemo` / `useCallback` for expensive computations
|
|
319
|
-
- Do not create new objects/functions inside render unless required
|
|
320
|
-
- Be careful with `requestAnimationFrame` loops
|
|
321
|
-
- Pay attention to performance in Three.js related code
|
|
322
|
-
- Use `react-window` for long lists
|
|
323
|
-
- Dispose Three.js resources properly
|
|
324
|
-
|
|
325
|
-
======================================================================
|
|
326
|
-
Error Handling
|
|
327
|
-
======================================================================
|
|
328
|
-
|
|
329
|
-
- Do not silently swallow errors
|
|
330
|
-
- Log meaningful error messages
|
|
331
|
-
- Validate external or dynamic data before usage
|
|
332
|
-
- Prefer early returns over deeply nested conditionals
|
|
333
|
-
- Use antd's `message` API for user-facing errors
|
|
334
|
-
|
|
335
|
-
======================================================================
|
|
336
|
-
Imports & Naming
|
|
337
|
-
======================================================================
|
|
338
|
-
|
|
339
|
-
Imports order:
|
|
340
|
-
1. React and external libraries
|
|
341
|
-
2. UI components (antd, @ant-design/x)
|
|
342
|
-
3. Three.js and visualization libraries
|
|
343
|
-
4. Internal hooks / utils
|
|
344
|
-
5. Styles
|
|
345
|
-
|
|
346
|
-
Naming conventions:
|
|
347
|
-
- Components: PascalCase (e.g., `FunctionLoop`, `SwcTree`)
|
|
348
|
-
- Hooks: camelCase with `use` prefix (e.g., `useSomething`)
|
|
349
|
-
- Files: follow existing project convention
|
|
350
|
-
- Variables: camelCase
|
|
351
|
-
- Constants: UPPER_SNAKE_CASE
|
|
352
|
-
|
|
353
|
-
======================================================================
|
|
354
|
-
Build Configuration
|
|
355
|
-
======================================================================
|
|
356
|
-
|
|
357
|
-
Vite configuration (`vite.config.js`):
|
|
358
|
-
- Library mode build (outputs ES and CJS formats)
|
|
359
|
-
- Entry point: `src/index.ts`
|
|
360
|
-
- External dependencies: `react`, `react-dom`
|
|
361
|
-
- TypeScript declaration files generated
|
|
362
|
-
- Proxy configured for `/api` → `http://192.168.50.54:8080`
|
|
363
|
-
|
|
364
|
-
Output:
|
|
365
|
-
- Main: `dist/index.mjs`
|
|
366
|
-
- Types: `dist/index.d.ts`
|
|
367
|
-
- CSS: `dist/style.css`
|
|
368
|
-
|
|
369
|
-
======================================================================
|
|
370
|
-
Testing (If Present)
|
|
371
|
-
======================================================================
|
|
372
|
-
|
|
373
|
-
- Prefer testing public behavior over implementation details
|
|
374
|
-
- Avoid excessive snapshot testing
|
|
375
|
-
- Keep tests focused and readable
|
|
376
|
-
- Use Storybook for component testing and documentation
|
|
377
|
-
|
|
378
|
-
======================================================================
|
|
379
|
-
Agent Behavior Rules (IMPORTANT)
|
|
380
|
-
======================================================================
|
|
381
|
-
|
|
382
|
-
When modifying code, agents MUST:
|
|
383
|
-
|
|
384
|
-
1. Read existing code before making changes
|
|
385
|
-
2. Follow existing patterns and conventions
|
|
386
|
-
3. Keep changes minimal and scoped
|
|
387
|
-
4. Do NOT refactor unrelated code
|
|
388
|
-
5. Do NOT introduce new dependencies unless requested
|
|
389
|
-
6. Ensure TypeScript types remain correct
|
|
390
|
-
7. Ensure Storybook stories still work if affected
|
|
391
|
-
8. Respect the existing component architecture (2d vs 3d separation)
|
|
392
|
-
|
|
393
|
-
If a change is non-trivial, explain WHY the change is needed.
|
|
394
|
-
|
|
395
|
-
======================================================================
|
|
396
|
-
Out of Scope
|
|
397
|
-
======================================================================
|
|
398
|
-
|
|
399
|
-
- Backend logic
|
|
400
|
-
- API implementations
|
|
401
|
-
- CI/CD configuration unless explicitly requested
|
|
402
|
-
- Database schema changes
|
|
403
|
-
|
|
404
|
-
======================================================================
|
|
405
|
-
End of AGENTS.md
|
|
406
|
-
======================================================================
|
package/Dockerfile
DELETED
|
@@ -1,18 +0,0 @@
|
|
|
1
|
-
# 使用 Node.js 18 的 Alpine 版本作为基础镜像
|
|
2
|
-
FROM node:19-alpine
|
|
3
|
-
|
|
4
|
-
# 设置工作目录
|
|
5
|
-
WORKDIR /app
|
|
6
|
-
|
|
7
|
-
# 复制 package.json 和 yarn.lock
|
|
8
|
-
COPY package.json .
|
|
9
|
-
|
|
10
|
-
# 安装项目依赖
|
|
11
|
-
RUN yarn install --frozen-lockfile --ignore-scripts
|
|
12
|
-
# 复制项目文件
|
|
13
|
-
|
|
14
|
-
# 暴露应用运行的端口
|
|
15
|
-
EXPOSE 6006
|
|
16
|
-
|
|
17
|
-
# 启动应用
|
|
18
|
-
# CMD ["yarn", "run", "storybook"]
|
package/REAMED2.md
DELETED
|
@@ -1,157 +0,0 @@
|
|
|
1
|
-
### 创建`recat`项目
|
|
2
|
-
|
|
3
|
-
```
|
|
4
|
-
npm install -g create-react-app
|
|
5
|
-
```
|
|
6
|
-
|
|
7
|
-
判断是否安装成功
|
|
8
|
-
|
|
9
|
-
```
|
|
10
|
-
create-react-app -V
|
|
11
|
-
```
|
|
12
|
-
|
|
13
|
-
创建项目
|
|
14
|
-
|
|
15
|
-
```bash
|
|
16
|
-
npx create-react-app <项目名称>
|
|
17
|
-
```
|
|
18
|
-
|
|
19
|
-
进入项目路径
|
|
20
|
-
|
|
21
|
-
```
|
|
22
|
-
cd 项目名称
|
|
23
|
-
```
|
|
24
|
-
|
|
25
|
-
### 安装组件
|
|
26
|
-
|
|
27
|
-
```
|
|
28
|
-
npm install brainsmatics
|
|
29
|
-
```
|
|
30
|
-
|
|
31
|
-
### 使用组件
|
|
32
|
-
|
|
33
|
-
```tsx
|
|
34
|
-
import {Atlas} from "brainsmatics/STAM";
|
|
35
|
-
import {fetchDatas} from "brainsmatics/STAM";
|
|
36
|
-
const AtlasViewer=()=>{
|
|
37
|
-
const [treeDatas, setTreeData] = useState([]); // 处理完成的 fbx树结构数据
|
|
38
|
-
const [swctreeDatas, setswcTreeData] = useState([]); // swc树结构数据
|
|
39
|
-
const [pointDatas, setPointData] = useState([]);// 模型里面的基准点(红点)数据
|
|
40
|
-
const [axon_check,setAxon_check] = useState([]);
|
|
41
|
-
const [soma_check,setSoma_check] = useState([]);
|
|
42
|
-
const [fbxTreeDatas,setFBXTreeData] = useState([]); // fbx树结构数据
|
|
43
|
-
const gray_value = useRef<any>({}); //2d切片的灰度图对应的核团
|
|
44
|
-
useEffect(()=>{
|
|
45
|
-
fetchData('/staticresource/data/TreeData/nucleusColour.json',setFBXTreeData)
|
|
46
|
-
fetchData('/staticresource/data/TreeData/vesseltree.json', setTreeData);
|
|
47
|
-
|
|
48
|
-
fetchData('/staticresource/data/json/output.json', setPointData);
|
|
49
|
-
|
|
50
|
-
fetchData('/staticresource/data/TreeData/swctree.json', setswcTreeData);
|
|
51
|
-
|
|
52
|
-
fetchData('/staticresource/data/json/axon_check.json', setAxon_check);
|
|
53
|
-
|
|
54
|
-
fetchData('/staticresource/data/json/soma_check.json', setSoma_check);
|
|
55
|
-
|
|
56
|
-
fetchData('/staticresource/data/json/rgb_value.json', gray_value);
|
|
57
|
-
},[])
|
|
58
|
-
return(
|
|
59
|
-
<Atlas
|
|
60
|
-
treeDatas={treeDatas}
|
|
61
|
-
pointDatas={pointDatas}
|
|
62
|
-
axon_check={axon_check}
|
|
63
|
-
soma_check={soma_check}
|
|
64
|
-
fbxTreeDatas={fbxTreeDatas}
|
|
65
|
-
gray_value={gray_value}
|
|
66
|
-
swctreeDatas={swctreeDatas}
|
|
67
|
-
ScaleNum={0.01}
|
|
68
|
-
lefttab={["label","neurons"]}// label vessel neurons
|
|
69
|
-
righttab={["neurons"]}// label neurons mapping download registration reslicing virtual
|
|
70
|
-
regionData={"/staticresource/data/FBX"}
|
|
71
|
-
lang={"en_us"}
|
|
72
|
-
/>
|
|
73
|
-
)
|
|
74
|
-
export default AtlasViewer
|
|
75
|
-
```
|
|
76
|
-
|
|
77
|
-
> `regionData` `fbx`模型地址文件以`FBX`后缀
|
|
78
|
-
>
|
|
79
|
-
> `treeDatas` 左侧血管结构数据
|
|
80
|
-
>
|
|
81
|
-
> `pointDatas` 基准点数据
|
|
82
|
-
>
|
|
83
|
-
> `axon_chec` 神经元末梢点数据
|
|
84
|
-
>
|
|
85
|
-
> `soma_check` 神经元胞体点数据
|
|
86
|
-
>
|
|
87
|
-
> `fbxTreeDatas` `fbx`树结构数据
|
|
88
|
-
>
|
|
89
|
-
> `gray_value` 图谱切面灰度值对应核团
|
|
90
|
-
>
|
|
91
|
-
> `swctreeDatas` `swc`树结构
|
|
92
|
-
>
|
|
93
|
-
> `lefttab` 选择展示的左侧`tab`栏
|
|
94
|
-
>
|
|
95
|
-
> `righttab` 选择展示的右侧`tab`栏
|
|
96
|
-
>
|
|
97
|
-
> `lang` 选择语言
|
|
98
|
-
|
|
99
|
-
### 创建接口代理
|
|
100
|
-
|
|
101
|
-
```
|
|
102
|
-
npm install http-proxy-middleware
|
|
103
|
-
```
|
|
104
|
-
|
|
105
|
-
使用它可以指定接口访问哪个服务器
|
|
106
|
-
|
|
107
|
-
> 在src目录下创建一个`setupProxy.js`
|
|
108
|
-
|
|
109
|
-
```js
|
|
110
|
-
const { createProxyMiddleware } = require('http-proxy-middleware');
|
|
111
|
-
|
|
112
|
-
module.exports = function(app) {
|
|
113
|
-
// 配准服务
|
|
114
|
-
app.use(
|
|
115
|
-
'/app-api/up-api',
|
|
116
|
-
createProxyMiddleware({
|
|
117
|
-
target:"http://atlas.brainsmatics.org/app-api/up-api",
|
|
118
|
-
changeOrigin: true,
|
|
119
|
-
}));
|
|
120
|
-
// 图谱切片 病毒注射
|
|
121
|
-
app.use(
|
|
122
|
-
'/app-api/c-api',
|
|
123
|
-
createProxyMiddleware({
|
|
124
|
-
target:"http://atlas.brainsmatics.org/app-api/c-api",
|
|
125
|
-
changeOrigin: true,
|
|
126
|
-
}));
|
|
127
|
-
// 数据下载
|
|
128
|
-
app.use(
|
|
129
|
-
'/app-api/test-api',
|
|
130
|
-
createProxyMiddleware({
|
|
131
|
-
target:"http://atlas.brainsmatics.org/app-api/test-api",
|
|
132
|
-
changeOrigin: true,
|
|
133
|
-
}));
|
|
134
|
-
// 图谱转换
|
|
135
|
-
app.use(
|
|
136
|
-
'/app-api/d-api',
|
|
137
|
-
createProxyMiddleware({
|
|
138
|
-
target:"http://atlas.brainsmatics.org/app-api/d-api",
|
|
139
|
-
changeOrigin: true,
|
|
140
|
-
}));
|
|
141
|
-
};
|
|
142
|
-
```
|
|
143
|
-
|
|
144
|
-
> 使用默认`brainsmatics`接口配置为研究院公网地址
|
|
145
|
-
|
|
146
|
-
启动项目
|
|
147
|
-
|
|
148
|
-
```
|
|
149
|
-
npm start
|
|
150
|
-
```
|
|
151
|
-
|
|
152
|
-
打包项目
|
|
153
|
-
|
|
154
|
-
```
|
|
155
|
-
npm build
|
|
156
|
-
```
|
|
157
|
-
|
package/STAM.d.ts
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export * from "./dist/component/STAM";
|
package/addPublishRules.js
DELETED
|
@@ -1,22 +0,0 @@
|
|
|
1
|
-
const fs = require('fs');
|
|
2
|
-
const os = require('os');
|
|
3
|
-
// 读取文件的路径
|
|
4
|
-
const filePath = '.gitignore'; // 替换为你的文件路径
|
|
5
|
-
const newLine = os.EOL; // 获取当前操作系统的换行符
|
|
6
|
-
fs.readFile(filePath, 'utf8', (err, data) => {
|
|
7
|
-
if (err) {
|
|
8
|
-
console.error('读取文件时出错:', err);
|
|
9
|
-
return;
|
|
10
|
-
}
|
|
11
|
-
data+=newLine;
|
|
12
|
-
data+='/src';
|
|
13
|
-
|
|
14
|
-
// 写入替换后的内容回文件
|
|
15
|
-
fs.writeFile(filePath, data, 'utf8', (err) => {
|
|
16
|
-
if (err) {
|
|
17
|
-
console.error('写入文件时出错:', err);
|
|
18
|
-
} else {
|
|
19
|
-
console.log('添加完成!');
|
|
20
|
-
}
|
|
21
|
-
});
|
|
22
|
-
});
|