Repository: MOVIBALE/Lumina-Layers Branch: main Commit: 38c1dc2eb890 Files: 410 Total size: 2.4 MB Directory structure: gitextract_1imuoy6m/ ├── .dockerignore ├── .github/ │ └── workflows/ │ └── build.yml ├── .gitignore ├── CHANGELOG.md ├── CHANGELOG_CN.md ├── Dockerfile ├── LICENSE ├── README.md ├── README_CN.md ├── api/ │ ├── __init__.py │ ├── app.py │ ├── dependencies.py │ ├── file_bridge.py │ ├── file_registry.py │ ├── routers/ │ │ ├── __init__.py │ │ ├── calibration.py │ │ ├── converter.py │ │ ├── extractor.py │ │ ├── five_color.py │ │ ├── health.py │ │ ├── lut.py │ │ ├── slicer.py │ │ └── system.py │ ├── schemas/ │ │ ├── __init__.py │ │ ├── calibration.py │ │ ├── converter.py │ │ ├── extractor.py │ │ ├── five_color.py │ │ ├── lut.py │ │ ├── responses.py │ │ ├── slicer.py │ │ └── system.py │ ├── session_store.py │ ├── worker_pool.py │ └── workers/ │ ├── __init__.py │ └── converter_workers.py ├── api_server.py ├── assets/ │ └── smart_8color_stacks.npy ├── bambu_config_template.json ├── benchmark.py ├── config.py ├── core/ │ ├── __init__.py │ ├── calibration.py │ ├── color_analyzer.py │ ├── color_matching_hue_aware.py │ ├── color_merger.py │ ├── color_replacement.py │ ├── converter.py │ ├── extractor.py │ ├── five_color_combination.py │ ├── geometry_utils.py │ ├── heightmap_loader.py │ ├── i18n.py │ ├── image_preprocessor.py │ ├── image_processing.py │ ├── isolated_pixel_cleanup.py │ ├── lut_merger.py │ ├── mesh_generators.py │ ├── naming.py │ ├── slicer.py │ ├── tray.py │ └── vector_engine.py ├── docs/ │ └── api_mapping_blueprint.md ├── frontend/ │ ├── README.md │ ├── eslint.config.js │ ├── index.html │ ├── package.json │ ├── postcss.config.js │ ├── public/ │ │ ├── hdr/ │ │ │ └── studio_small_09_1k.hdr │ │ └── test.glb │ ├── scripts/ │ │ └── generate-test-glb.mjs │ ├── src/ │ │ ├── App.css │ │ ├── App.tsx │ │ ├── __tests__/ │ │ │ ├── App.test.tsx │ │ │ ├── InteractiveModelViewer.test.ts │ │ │ ├── KeychainRing3D.test.tsx │ │ │ ├── LutColorGrid.test.ts │ │ │ ├── Scene3D.test.tsx │ │ │ ├── action-bar-always-visible.property.test.ts │ │ │ ├── action-bar-always-visible.test.ts │ │ │ ├── api-client.property.test.ts │ │ │ ├── app-tabs.test.tsx │ │ │ ├── autoPreview.test.ts │ │ │ ├── bed-size-selector.property.test.ts │ │ │ ├── calibration-hooks.property.test.ts │ │ │ ├── calibration-panel.test.tsx │ │ │ ├── calibration-store.property.test.ts │ │ │ ├── colorRemap.property.test.ts │ │ │ ├── colorSelect.property.test.ts │ │ │ ├── converter-api.test.ts │ │ │ ├── converter-store.property.test.ts │ │ │ ├── extractor-5color.property.test.ts │ │ │ ├── extractor-api.property.test.ts │ │ │ ├── extractor-canvas.test.tsx │ │ │ ├── extractor-panel.test.tsx │ │ │ ├── extractor-store.property.test.ts │ │ │ ├── five-color-store.property.test.ts │ │ │ ├── health-status.property.test.tsx │ │ │ ├── keychainRing.property.test.ts │ │ │ ├── layout.test.tsx │ │ │ ├── loading-spinner.test.tsx │ │ │ ├── lut-manager-panel.test.tsx │ │ │ ├── lut-manager-refresh.property.test.ts │ │ │ ├── lut-manager-store.property.test.ts │ │ │ ├── lutColorFilter.property.test.ts │ │ │ ├── model-centering.property.test.ts │ │ │ ├── paletteLutMerge.property.test.ts │ │ │ ├── paletteLutMerge.test.tsx │ │ │ ├── paletteOptimization.property.test.ts │ │ │ ├── paletteOptimization.test.tsx │ │ │ ├── realtimePreview.property.test.ts │ │ │ ├── realtimePreview.test.ts │ │ │ ├── reliefHeight.property.test.ts │ │ │ ├── replace-preview.property.test.ts │ │ │ ├── scaleUtils.property.test.ts │ │ │ ├── settings-store.property.test.ts │ │ │ ├── slicer.property.test.ts │ │ │ ├── stack-positions-nonoverlap.property.test.ts │ │ │ ├── tab-filter.property.test.ts │ │ │ ├── tab-switch-layout.property.test.ts │ │ │ ├── theme.property.test.ts │ │ │ ├── theme.test.tsx │ │ │ ├── ui-components.test.tsx │ │ │ ├── widget-drag-perf.property.test.ts │ │ │ ├── widget-registry-i18n.property.test.ts │ │ │ ├── widget-workspace.property.test.ts │ │ │ ├── widget-workspace.test.tsx │ │ │ └── zoomable-image.property.test.ts │ │ ├── api/ │ │ │ ├── __tests__/ │ │ │ │ └── batchApi.property.test.ts │ │ │ ├── calibration.ts │ │ │ ├── client.ts │ │ │ ├── converter.ts │ │ │ ├── extractor.ts │ │ │ ├── fiveColor.ts │ │ │ ├── lut.ts │ │ │ ├── slicer.ts │ │ │ ├── system.ts │ │ │ └── types.ts │ │ ├── components/ │ │ │ ├── AboutView.tsx │ │ │ ├── BedPlatform.tsx │ │ │ ├── CalibrationPanel.tsx │ │ │ ├── ExtractorCanvas.tsx │ │ │ ├── ExtractorPanel.tsx │ │ │ ├── FiveColorCanvas.tsx │ │ │ ├── FiveColorQueryPanel.tsx │ │ │ ├── InteractiveModelViewer.tsx │ │ │ ├── KeychainRing3D.tsx │ │ │ ├── LanguageToggle.tsx │ │ │ ├── LoadingSpinner.tsx │ │ │ ├── LutManagerPanel.tsx │ │ │ ├── ModelViewer.tsx │ │ │ ├── Scene3D.tsx │ │ │ ├── ThemeToggle.tsx │ │ │ ├── __tests__/ │ │ │ │ ├── ActionBar.batch.test.tsx │ │ │ │ ├── BasicSettings.batch.test.tsx │ │ │ │ ├── BatchFileUploader.test.tsx │ │ │ │ ├── BatchResultSummary.property.test.tsx │ │ │ │ └── BatchResultSummary.test.tsx │ │ │ ├── lightingConfig.ts │ │ │ ├── sections/ │ │ │ │ ├── ActionBar.tsx │ │ │ │ ├── AdvancedSettings.tsx │ │ │ │ ├── BasicSettings.tsx │ │ │ │ ├── BedSizeSelector.tsx │ │ │ │ ├── CloisonneSettings.tsx │ │ │ │ ├── CoatingSettings.tsx │ │ │ │ ├── KeychainLoopSettings.tsx │ │ │ │ ├── LutColorGrid.tsx │ │ │ │ ├── OutlineSettings.tsx │ │ │ │ ├── PalettePanel.tsx │ │ │ │ ├── ReliefSettings.tsx │ │ │ │ └── SlicerSelector.tsx │ │ │ ├── themeConfig.ts │ │ │ ├── ui/ │ │ │ │ ├── Accordion.tsx │ │ │ │ ├── BatchFileUploader.tsx │ │ │ │ ├── BatchResultSummary.tsx │ │ │ │ ├── Button.tsx │ │ │ │ ├── Checkbox.tsx │ │ │ │ ├── ColorModeBadge.tsx │ │ │ │ ├── CropModal.tsx │ │ │ │ ├── Dropdown.tsx │ │ │ │ ├── FullScreenModal.tsx │ │ │ │ ├── ImageUpload.tsx │ │ │ │ ├── RadioGroup.tsx │ │ │ │ ├── Slider.tsx │ │ │ │ └── ZoomableImage.tsx │ │ │ └── widget/ │ │ │ ├── ActionBarWidgetContent.tsx │ │ │ ├── AdvancedSettingsWidgetContent.tsx │ │ │ ├── BasicSettingsWidgetContent.tsx │ │ │ ├── CalibrationWidgetContent.tsx │ │ │ ├── CloisonneSettingsWidgetContent.tsx │ │ │ ├── CoatingSettingsWidgetContent.tsx │ │ │ ├── ColorWorkstation.tsx │ │ │ ├── ExtractorWidgetContent.tsx │ │ │ ├── FiveColorWidgetContent.tsx │ │ │ ├── KeychainLoopWidgetContent.tsx │ │ │ ├── LutManagerWidgetContent.tsx │ │ │ ├── OutlineSettingsWidgetContent.tsx │ │ │ ├── ReliefSettingsWidgetContent.tsx │ │ │ ├── SnapGuides.tsx │ │ │ ├── TabNavBar.tsx │ │ │ ├── WidgetHeader.tsx │ │ │ ├── WidgetPanel.tsx │ │ │ └── WidgetWorkspace.tsx │ │ ├── hooks/ │ │ │ ├── useActiveModelUrl.ts │ │ │ ├── useAutoPreview.ts │ │ │ ├── useConverterDataInit.ts │ │ │ └── useThemeConfig.ts │ │ ├── i18n/ │ │ │ ├── context.tsx │ │ │ └── translations.ts │ │ ├── index.css │ │ ├── main.tsx │ │ ├── setupTests.ts │ │ ├── stores/ │ │ │ ├── __tests__/ │ │ │ │ ├── batchStore.property.test.ts │ │ │ │ ├── batchStore.test.ts │ │ │ │ ├── converterStore.property.test.ts │ │ │ │ ├── converterStore.test.ts │ │ │ │ ├── cropStore.property.test.ts │ │ │ │ ├── cropStore.test.ts │ │ │ │ ├── slicerStore.property.test.ts │ │ │ │ └── slicerStore.test.ts │ │ │ ├── aboutStore.ts │ │ │ ├── calibrationStore.ts │ │ │ ├── converterStore.ts │ │ │ ├── extractorStore.ts │ │ │ ├── fiveColorStore.ts │ │ │ ├── lutManagerStore.ts │ │ │ ├── settingsStore.ts │ │ │ ├── slicerStore.ts │ │ │ └── widgetStore.ts │ │ ├── types/ │ │ │ └── widget.ts │ │ └── utils/ │ │ ├── __tests__/ │ │ │ ├── colorUtils.property.test.ts │ │ │ └── colorUtils.test.ts │ │ ├── colorUtils.ts │ │ ├── scaleUtils.ts │ │ └── widgetUtils.ts │ ├── tsconfig.app.json │ ├── tsconfig.json │ ├── tsconfig.node.json │ └── vite.config.ts ├── icon.icns ├── lumina_studio.spec ├── lut-npy预设/ │ ├── Aliz/ │ │ ├── PETG/ │ │ │ ├── Aliz&4色PETG&CMYW.npy │ │ │ ├── Aliz&4色PETG&RYBW.npy │ │ │ ├── Aliz&6色PETG&CMYWGK.npy │ │ │ ├── Aliz&6色PETG&RYBWGK.npy │ │ │ ├── Aliz&8色PETG.npy │ │ │ └── Aliz&PETG&5color&红-黄-蓝-白-黑-20260304.npy │ │ ├── PLA/ │ │ │ ├── Aliz&4色PLA&CMYW.npy │ │ │ ├── Aliz&4色PLA&RYBW.npy │ │ │ ├── Aliz&6色PLA&CMYWGK.npy │ │ │ ├── Aliz&6色PLA&RYBWGK.npy │ │ │ └── Aliz&8色PLA.npy │ │ └── 使用须知&开发组精校版20260402.txt │ ├── BIQU/ │ │ ├── 必趣&PLAGO&2色BW.npy │ │ ├── 必趣&PLAGO&4色RYBW.npy │ │ ├── 必趣&PLAGO&6色RYBWGK.npy │ │ └── 必趣颜色说明.txt │ ├── CooBeen/ │ │ └── RYBW-CooBeen PETG.npy │ ├── Creality/ │ │ └── RYBW-Creality Hyper PLA.npy │ ├── Custom/ │ │ ├── Bambulab&PLA&8色&红-品红-青-蓝-黄-白-绿-黑.npy │ │ ├── Bambulab&PLA&BW&白-黑.npy │ │ ├── Bambulab&PLA&CMYW&青-品红-黄-绿-白-黑.npy │ │ ├── Bambulab&PLA&RYBW&红-黄-蓝-白.npy │ │ ├── Merged_8-Color+4-Color+6-Color+4-Color+6-Color+BW_20260307_091510.npz │ │ ├── Merged_8-Color+6-Color+BW+4-Color_20260227_222117.npz │ │ └── Merged_8-Color+BW+6-Color+4-Color_20260305_213304.npz │ ├── Elegoo/ │ │ └── Elegoo_pla_RYBW.npy │ ├── Jayo/ │ │ ├── Jayo&OW_PLA+_RYBW.npy │ │ └── Readme.md │ ├── Karvax/ │ │ ├── Karvax&PLA&8色&红-品红-青-蓝-黄-白-绿-黑.npy │ │ ├── Karvax&PLA&RYBW&红-蓝-黄-白.npy │ │ └── Karvax&PLA&RYBW&红-蓝-黄-绿-白-黑.npy │ ├── LUT命名规范 LUT Naming Convention.md │ ├── R3D/ │ │ └── R3DPLA青春版RYBW-PLA哑光中国红-PLA哑光黄-PLA哑光宝石蓝-PLA哑光白.npy │ ├── Sanci/ │ │ └── PETG/ │ │ ├── 4色/ │ │ │ ├── Sanci&PETG&CMYW&粉红-黄-蓝-白.npy │ │ │ └── Sanci&PETG&RYBW&红-黄-蓝-白.npy │ │ ├── 6色/ │ │ │ └── Sanci&PETG&RYBW&红-黄-蓝-白-绿-黑.npy │ │ └── 7色/ │ │ └── Sanci&PETG&Merged&红-黄-蓝-粉-绿-黑-白&20260402_215742.npz │ ├── Snapmaker/ │ │ ├── 使用说明&开发组精校版&20260405.txt │ │ ├── 快造&2色PLA&BW.npy │ │ ├── 快造&4色PLA&B(蓝)MYW.npy │ │ └── 快造&4色PLA&RYBW.npy │ ├── XYD小明/ │ │ ├── PETG/ │ │ │ ├── XYD小明&PETG&8色&红-品红-青-蓝-黄-白-绿-黑.npy │ │ │ ├── XYD小明&PETG&CMYW&青-品红-黄-白.npy │ │ │ ├── XYD小明&PETG&CMYW&青-品红-黄-绿-白-黑.npy │ │ │ ├── XYD小明&PETG&RYBW&红-蓝-黄-白.npy │ │ │ └── XYD小明&PETG&RYBW&红-蓝-黄-绿-白-黑.npy │ │ └── PLA/ │ │ ├── XYD小明&PLA&8色&红-品红-青-克莱因蓝-黄-白-绿-黑-20260327.npy │ │ ├── XYD小明&PLA&CMYW&品红-青-黄-绿-白-黑-20260327.npy │ │ ├── XYD小明&PLA&CMYW&青-品红-黄-白-20260327.npy │ │ ├── XYD小明&PLA&RYBW&红-蓝-黄-绿-白-黑-20260331.npz │ │ └── XYD小明&PLA&RYBW&红-黄-蓝-白-20260327.npy │ ├── bambulab/ │ │ ├── Bambulab&PLA&4色&RYBW&红-蓝-黄-白.npy │ │ ├── Bambulab&PLA&8色+4色.npz │ │ ├── Bambulab&PLA&8色-New.npy │ │ ├── README.txt │ │ ├── bambulab_pla_basic_cmyw.npy │ │ ├── bambulab_pla_basic_cmyw_new.npy │ │ └── bambulab_pla_basic_rybw.npy │ ├── npy预设说明 npy explanation.txt │ ├── 天瑞/ │ │ └── 天瑞-PETG-ECO-NGYX-RYBW.npy │ ├── 必应/ │ │ ├── 必应PETGHF.npy │ │ ├── 必应plaf.npy │ │ └── 必应使用说明.txt │ ├── 瑞贝思/ │ │ ├── 2色/ │ │ │ └── 瑞贝思&PLA&BW2色&20260328.npy │ │ ├── 4色/ │ │ │ └── 瑞贝思&PLA&RYBW4色&20260328.npy │ │ └── 6色/ │ │ └── 瑞贝思&PLA&RYBW&红-蓝-黄-绿-白-黑&20260331.npz │ ├── 精亮/ │ │ ├── 精亮&PLA4色&RYBW.npy │ │ ├── 精亮&PLA6色&黑 白 品红 青 黄 绿.npy │ │ ├── 精亮&PLA6色&黑 白 黄 绿 红 蓝.npy │ │ └── 精亮&PLA8色.npy │ ├── 纵维立方/ │ │ ├── 纵维立方&4色CMYW.npy │ │ ├── 纵维立方&4色RYBW.npy │ │ ├── 纵维立方&6色CMYWGK.npy │ │ ├── 纵维立方&6色RYBWGK.npy │ │ ├── 纵维立方&7色(青色蓝色共用蓝色).npy │ │ ├── 纵维立方&8色.npy │ │ ├── 纵维立方&PLA2色&BW.npy │ │ └── 纵维立方颜色说明开发组预设.txt │ ├── 赛纳/ │ │ ├── 使用说明.txt │ │ ├── 赛纳&2色PLA&BW-白-黑.npy │ │ ├── 赛纳&4色PETG&CMYW-品红-青-黄-白.npy │ │ ├── 赛纳&4色PLA&CMYW-品红-青-黄-白.npy │ │ ├── 赛纳&4色PLA&RYBW-红-黄-蓝-白.npy │ │ ├── 赛纳&6色PLA&CMYWGK-品红-青-黄-白-绿-黑.npy │ │ ├── 赛纳&6色PLA&RYBWGK-红-黄-蓝-白-绿-黑.npy │ │ └── 赛纳&8色PLA-红-黄-蓝-品红-青-白-绿-黑.npy │ ├── 通用LUT[有色差]RYBW General for personal use.npy │ └── 魔创/ │ ├── 魔创&PETG2色.npy │ ├── 魔创&PETG4色&CMYW.npy │ ├── 魔创&PETG4色&RYBW.npy │ ├── 魔创&PETG6色&CMYWGK.npy │ ├── 魔创&PETG6色&RYBWGK.npy │ ├── 魔创&PETG8色.npy │ └── 魔创使用说明.txt ├── main.py ├── requirements.txt ├── tests/ │ ├── test_5color_merge_properties.py │ ├── test_5color_merge_unit.py │ ├── test_api_app_unit.py │ ├── test_api_routers_unit.py │ ├── test_api_schemas_properties.py │ ├── test_bed_size_properties.py │ ├── test_calibration_integration_unit.py │ ├── test_calibration_routing_properties.py │ ├── test_cleanup_output_dir_properties.py │ ├── test_clear_cache_response_properties.py │ ├── test_color_merge_map_properties.py │ ├── test_color_merge_unit.py │ ├── test_color_replace_unit.py │ ├── test_converter_batch_unit.py │ ├── test_converter_generate_unit.py │ ├── test_converter_preview_unit.py │ ├── test_converter_vector_export_unit.py │ ├── test_converter_workers_unit.py │ ├── test_crop_properties.py │ ├── test_crop_unit.py │ ├── test_extractor_integration_unit.py │ ├── test_file_bridge_properties.py │ ├── test_file_registry_clear_properties.py │ ├── test_file_registry_properties.py │ ├── test_five_color_api_unit.py │ ├── test_five_color_query_properties.py │ ├── test_health_lut_unit.py │ ├── test_heic_support_properties.py │ ├── test_heightmap_color_height_properties.py │ ├── test_heightmap_properties.py │ ├── test_heightmap_unit.py │ ├── test_heightmap_upload_unit.py │ ├── test_layout_new_tabs_unit.py │ ├── test_lut_api_properties.py │ ├── test_lut_api_unit.py │ ├── test_lut_list_properties.py │ ├── test_lut_merger_properties.py │ ├── test_mime_type_properties.py │ ├── test_naming_properties.py │ ├── test_naming_unit.py │ ├── test_palette_connected_selection_unit.py │ ├── test_preview_click_selection_unit.py │ ├── test_relief_mode_fix_properties.py │ ├── test_relief_mode_fix_unit.py │ ├── test_segmented_glb_properties.py │ ├── test_segmented_glb_unit.py │ ├── test_session_store_clear_properties.py │ ├── test_session_store_properties.py │ ├── test_session_thread_safety_properties.py │ ├── test_session_ttl_properties.py │ ├── test_settings_api_properties.py │ ├── test_settings_api_unit.py │ ├── test_slicer_properties.py │ ├── test_slicer_unit.py │ ├── test_stack_order_properties.py │ ├── test_user_replacement_list_ui_unit.py │ ├── test_vector_engine_unit.py │ ├── test_worker_pool_properties.py │ ├── test_worker_pool_unit.py │ └── verify_merge_remap.py ├── ui/ │ ├── __init__.py │ ├── callbacks.py │ ├── crop_extension.py │ ├── fivecolor_tab_v2.py │ ├── layout_new.py │ ├── palette_extension.py │ └── styles.py └── utils/ ├── __init__.py ├── bambu_3mf_writer.py ├── color_recipe_logger.py ├── helpers.py ├── lut_manager.py └── stats.py ================================================ FILE CONTENTS ================================================ ================================================ FILE: .dockerignore ================================================ __pycache__ *.pyc *.pyo *.pyd .Python env/ venv/ .venv/ pip-log.txt pip-delete-this-directory.txt .tox/ .coverage .coverage.* .cache nosetests.xml coverage.xml *.cover *.log .git .mypy_cache .pytest_cache .hypotheses ================================================ FILE: .github/workflows/build.yml ================================================ name: Build and Package Lumina Layers on: push: branches: [main] pull_request: branches: [main] workflow_dispatch: jobs: build: name: Build (${{ matrix.platform_suffix }}) runs-on: ${{ matrix.runs_on }} strategy: fail-fast: false matrix: include: - runs_on: windows-latest platform_suffix: win - runs_on: macos-latest platform_suffix: mac steps: - name: Checkout Code uses: actions/checkout@v4 with: fetch-depth: 0 fetch-tags: true - name: Set up Python uses: actions/setup-python@v5 with: python-version: '3.13' - name: Get Version and Hash shell: bash run: | VERSION=$(date +%Y%m%d) SHORT_SHA=$(git rev-parse --short=7 HEAD | cut -c1-7 || echo "0000000") BASE_NAME="Lumina-Layers-preview-$VERSION-$SHORT_SHA" ARTIFACT_NAME="${BASE_NAME}-${{ matrix.platform_suffix }}" echo "VERSION=$VERSION" >> "$GITHUB_ENV" echo "SHORT_SHA=$SHORT_SHA" >> "$GITHUB_ENV" echo "BASE_NAME=$BASE_NAME" >> "$GITHUB_ENV" echo "ARTIFACT_NAME=$ARTIFACT_NAME" >> "$GITHUB_ENV" - name: Create virtual environment (Windows) if: matrix.platform_suffix == 'win' shell: pwsh run: | python -m venv .venv .\.venv\Scripts\python.exe -m pip install --upgrade pip .\.venv\Scripts\python.exe -m pip install pyinstaller .\.venv\Scripts\python.exe -m pip install -r requirements.txt - name: Create virtual environment (macOS) if: matrix.platform_suffix == 'mac' shell: bash run: | python -m venv .venv ./.venv/bin/python -m pip install --upgrade pip ./.venv/bin/python -m pip install pyinstaller ./.venv/bin/python -m pip install -r requirements.txt - name: Validate macOS icon asset if: matrix.platform_suffix == 'mac' shell: bash run: | test -f icon.icns - name: Package Windows build if: matrix.platform_suffix == 'win' shell: pwsh run: | .\.venv\Scripts\python.exe -m PyInstaller --noconfirm --onefile ` --icon="icon.ico" ` --add-data "icon.ico;." ` --add-data "bambu_config_template.json;." ` --add-data "assets;assets" ` --collect-all "gradio" ` --collect-all "safehttpx" ` --collect-all "groovy" ` --collect-all "gradio_client" ` --collect-all "uvicorn" ` --name "${{ env.BASE_NAME }}" ` main.py - name: Package macOS build if: matrix.platform_suffix == 'mac' shell: bash run: | ./.venv/bin/python -m PyInstaller --noconfirm --windowed \ --icon "icon.icns" \ --add-data "icon.ico:." \ --add-data "bambu_config_template.json:." \ --add-data "assets:assets" \ --add-data "lut-npy预设:lut-npy预设" \ --collect-all "gradio" \ --collect-all "safehttpx" \ --collect-all "groovy" \ --collect-all "gradio_client" \ --collect-all "uvicorn" \ --name "${BASE_NAME}" \ main.py - name: Prepare Windows artifact directory if: matrix.platform_suffix == 'win' shell: pwsh run: | $targetDir = "${{ env.ARTIFACT_NAME }}" New-Item -ItemType Directory -Path "$targetDir" -Force | Out-Null $exePath = "dist/${{ env.BASE_NAME }}.exe" if (Test-Path $exePath) { Move-Item $exePath -Destination "$targetDir/" } else { Write-Error "Executable not found at $exePath" exit 1 } if (Test-Path "icon.ico") { Copy-Item -Path "icon.ico" -Destination "$targetDir/" } if (Test-Path "bambu_config_template.json") { Copy-Item -Path "bambu_config_template.json" -Destination "$targetDir/" } if (Test-Path "assets") { Copy-Item -Path "assets" -Destination "$targetDir/assets" -Recurse } if (Test-Path "lut-npy预设") { Copy-Item -Path "lut-npy预设" -Destination "$targetDir/lut-npy预设" -Recurse } - name: Prepare macOS artifact directory if: matrix.platform_suffix == 'mac' shell: bash run: | target_dir="${ARTIFACT_NAME}" app_path="dist/${BASE_NAME}.app" mkdir -p "$target_dir" if [ ! -d "$app_path" ]; then echo "App bundle not found at $app_path" >&2 exit 1 fi mv "$app_path" "$target_dir/" - name: Verify Windows artifact contents if: matrix.platform_suffix == 'win' shell: pwsh run: | $targetDir = "${{ env.ARTIFACT_NAME }}" if (-not (Test-Path "$targetDir/${{ env.BASE_NAME }}.exe")) { Write-Error "Missing executable in artifact directory" exit 1 } if (-not (Test-Path "$targetDir/icon.ico")) { Write-Error "Missing icon.ico in artifact directory" exit 1 } if (-not (Test-Path "$targetDir/bambu_config_template.json")) { Write-Error "Missing bambu_config_template.json in artifact directory" exit 1 } if (-not (Test-Path "$targetDir/assets")) { Write-Error "Missing assets directory in artifact directory" exit 1 } if (-not (Test-Path "$targetDir/lut-npy预设")) { Write-Error "Missing LUT preset directory in artifact directory" exit 1 } - name: Verify macOS artifact contents if: matrix.platform_suffix == 'mac' shell: bash run: | app_path="${ARTIFACT_NAME}/${BASE_NAME}.app" test -d "$app_path" find "$app_path" -type d -name assets | grep -q . find "$app_path" -type f -name bambu_config_template.json | grep -q . find "$app_path" -type d -name 'lut-npy预设' | grep -q . - name: Upload Artifact uses: actions/upload-artifact@v4 with: name: ${{ env.ARTIFACT_NAME }} path: ${{ env.ARTIFACT_NAME }}/ ================================================ FILE: .gitignore ================================================ # Byte-compiled / optimized / DLL files __pycache__/ *.py[codz] *$py.class # C extensions *.so # Distribution / packaging .Python build/ develop-eggs/ dist/ downloads/ eggs/ .eggs/ lib/ lib64/ parts/ sdist/ var/ wheels/ share/python-wheels/ *.egg-info/ .installed.cfg *.egg MANIFEST # PyInstaller # Usually these files are written by a python script from a template # before PyInstaller builds the exe, so as to inject date/other infos into it. *.manifest # Keep our custom spec file # *.spec # PyInstaller build outputs build/ dist/ LuminaStudio_v*/ # PyInstaller test script test_paths.py # Debug and test files run_debug.bat test.png # Release packages *.rar *.zip *.7z # Old version folders Lumina-Layers-*/ # Installer logs pip-log.txt pip-delete-this-directory.txt # Unit test / coverage reports htmlcov/ .tox/ .nox/ .coverage .coverage.* .cache nosetests.xml coverage.xml *.cover *.py.cover .hypothesis/ .pytest_cache/ cover/ .playwright-cli/ # Translations *.mo *.pot # Django stuff: *.log local_settings.py db.sqlite3 db.sqlite3-journal # Flask stuff: instance/ .webassets-cache # Scrapy stuff: .scrapy # Sphinx documentation docs/_build/ # PyBuilder .pybuilder/ target/ # Jupyter Notebook .ipynb_checkpoints # IPython profile_default/ ipython_config.py # pyenv # For a library or package, you might want to ignore these files since the code is # intended to run in multiple environments; otherwise, check them in: # .python-version # pipenv # According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. # However, in case of collaboration, if having platform-specific dependencies or dependencies # having no cross-platform support, pipenv may install dependencies that don't work, or not # install all needed dependencies. #Pipfile.lock # UV # Similar to Pipfile.lock, it is generally recommended to include uv.lock in version control. # This is especially recommended for binary packages to ensure reproducibility, and is more # commonly ignored for libraries. #uv.lock # poetry # Similar to Pipfile.lock, it is generally recommended to include poetry.lock in version control. # This is especially recommended for binary packages to ensure reproducibility, and is more # commonly ignored for libraries. # https://python-poetry.org/docs/basic-usage/#commit-your-poetrylock-file-to-version-control #poetry.lock #poetry.toml # pdm # Similar to Pipfile.lock, it is generally recommended to include pdm.lock in version control. # pdm recommends including project-wide configuration in pdm.toml, but excluding .pdm-python. # https://pdm-project.org/en/latest/usage/project/#working-with-version-control #pdm.lock #pdm.toml .pdm-python .pdm-build/ # pixi # Similar to Pipfile.lock, it is generally recommended to include pixi.lock in version control. #pixi.lock # Pixi creates a virtual environment in the .pixi directory, just like venv module creates one # in the .venv directory. It is recommended not to include this directory in version control. .pixi # PEP 582; used by e.g. github.com/David-OConnor/pyflow and github.com/pdm-project/pdm __pypackages__/ # Celery stuff celerybeat-schedule celerybeat.pid # SageMath parsed files *.sage.py # Environments .env .envrc .venv env/ venv/ ENV/ env.bak/ venv.bak/ # Spyder project settings .spyderproject .spyproject # Rope project settings .ropeproject # mkdocs documentation /site # mypy .mypy_cache/ .dmypy.json dmypy.json # Pyre type checker .pyre/ # pytype static type analyzer .pytype/ # Cython debug symbols cython_debug/ # PyCharm # JetBrains specific template is maintained in a separate JetBrains.gitignore that can # be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore # and can be added to the global gitignore or merged into this file. For a more nuclear # option (not recommended) you can uncomment the following to ignore the entire idea folder. .idea/ # Abstra # Abstra is an AI-powered process automation framework. # Ignore directories containing user credentials, local state, and settings. # Learn more at https://abstra.io/docs .abstra/ # Visual Studio Code # Visual Studio Code specific template is maintained in a separate VisualStudioCode.gitignore # that can be found at https://github.com/github/gitignore/blob/main/Global/VisualStudioCode.gitignore # and can be added to the global gitignore or merged into this file. However, if you prefer, # you could uncomment the following to ignore the entire vscode folder .vscode/ # Ruff stuff: .ruff_cache/ # PyPI configuration file .pypirc # Cursor # Cursor is an AI-powered code editor. `.cursorignore` specifies files/directories to # exclude from AI features like autocomplete and code analysis. Recommended for sensitive data # refer to https://docs.cursor.com/context/ignore-files .cursorignore .cursorindexingignore # Marimo marimo/_static/ marimo/_lsp/ __marimo__/ # Lumina Studio output files output/*.3mf output/*.glb output/*.npy output/lumina_stats.txt output/* # Gradio cache directory output/.gradio_cache/ # ========================================== # Lumina Studio Specific # ========================================== # 本地个人设置 (包含上次选择�?LUT 路径�? user_settings.json # 批量生成产生的压缩包 outputs/*.zip # 核心输出目录 (保留目录结构,忽略具体文�? outputs/*.3mf outputs/*.glb outputs/*.npy outputs/batch_*/ # 指标统计文件 lumina_stats.txt +lut-npy163623644576/Custom/*.npy .venv312/ .venv*/ # Kiro hooks .kiro/hooks/ lut-npyԤ��/Custom/*.npy # Kiro documentation and internal files (personal use only) .kiro/ # Reference projects (for development reference only) LD_ColorLayering-main/ ChromaStack-main/ # Frontend node_modules/ frontend/node_modules/ frontend/dist/ # Temporary assets assets/temp_*.npy # Local temporary files .trae/ OPTIMIZATION_LOG.md ================================================ FILE: CHANGELOG.md ================================================ # Changelog All notable changes to Lumina Studio are documented in this file. [📖 中文更新日志 / Chinese Changelog](CHANGELOG_CN.md) --- ## v1.6.8 (2026-04-30) ### Bug Fixes - **fix(color)**: Distinguished CMYW and RYBW as separate color subtypes in `infer_color_mode()` and `ColorSystem.get()` — CMYW LUTs were previously misidentified as RYBW, causing wrong slot names, wrong filament colors, and wrong corner labels in 3MF export - **fix(color)**: Preserved CMYW/RYBW subtype through the full pipeline: LUT detection → config lookup → API schemas → Gradio UI → 3MF export, ensuring Cyan/Magenta/Yellow slots are used instead of Red/Blue/Yellow - **fix(3mf)**: Fixed `bambu_3mf_writer.py` overwriting CMYW/RYBW to generic "4-Color" mode, which always fell back to RYBW color mapping - **fix(ui)**: Added CMYW and RYBW as distinct color mode options in all Gradio Radio components (converter, calibration, extractor tabs) - **fix(ui)**: Fixed `generate_board_wrapper` in Gradio UI always passing "RYBW" to calibration generator regardless of selected mode - **fix(ui)**: Fixed `