Updated external db sync to handle spool types and new color hex format

This commit is contained in:
Donkie
2024-05-20 22:39:08 +02:00
parent 5dcc28aa98
commit 52c52bcfd8
5 changed files with 105 additions and 10 deletions

View File

@@ -18,7 +18,14 @@ export function FilamentImportModal(props: {
const filamentOptions = const filamentOptions =
externalFilaments.data?.map((item) => { externalFilaments.data?.map((item) => {
return { return {
label: formatFilamentLabel(item.name, item.diameter, item.manufacturer, item.material, item.weight), label: formatFilamentLabel(
item.name,
item.diameter,
item.manufacturer,
item.material,
item.weight,
item.spool_type
),
value: item.id, value: item.id,
item: item, item: item,
}; };

View File

@@ -10,6 +10,14 @@ import { IFilament } from "./model";
export async function createFilamentFromExternal(externalFilament: ExternalFilament): Promise<IFilament> { export async function createFilamentFromExternal(externalFilament: ExternalFilament): Promise<IFilament> {
const vendor = await getOrCreateVendorFromExternal(externalFilament.manufacturer); const vendor = await getOrCreateVendorFromExternal(externalFilament.manufacturer);
let color_hex = undefined;
if (externalFilament.color_hex) {
color_hex = externalFilament.color_hex;
} else if (externalFilament.color_hexes && externalFilament.color_hexes.length > 0) {
// TODO: Support for multi-color filaments
color_hex = externalFilament.color_hexes[0];
}
const body: Omit<IFilament, "id" | "registered" | "extra"> & { vendor_id: number } = { const body: Omit<IFilament, "id" | "registered" | "extra"> & { vendor_id: number } = {
name: externalFilament.name, name: externalFilament.name,
material: externalFilament.material, material: externalFilament.material,
@@ -18,7 +26,7 @@ export async function createFilamentFromExternal(externalFilament: ExternalFilam
diameter: externalFilament.diameter, diameter: externalFilament.diameter,
weight: externalFilament.weight, weight: externalFilament.weight,
spool_weight: externalFilament.spool_weight || undefined, spool_weight: externalFilament.spool_weight || undefined,
color_hex: externalFilament.color_hex, color_hex: color_hex,
settings_extruder_temp: externalFilament.extruder_temp || undefined, settings_extruder_temp: externalFilament.extruder_temp || undefined,
settings_bed_temp: externalFilament.bed_temp || undefined, settings_bed_temp: externalFilament.bed_temp || undefined,
external_id: externalFilament.id, external_id: externalFilament.id,

View File

@@ -3,7 +3,7 @@ import { formatLength, formatWeight } from "../../utils/parsing";
import { getAPIURL } from "../../utils/url"; import { getAPIURL } from "../../utils/url";
import { ISpool } from "./model"; import { ISpool } from "./model";
import { IFilament } from "../filaments/model"; import { IFilament } from "../filaments/model";
import { useGetExternalDBFilaments } from "../../utils/queryExternalDB"; import { SpoolType, useGetExternalDBFilaments } from "../../utils/queryExternalDB";
import { useMemo } from "react"; import { useMemo } from "react";
export async function setSpoolArchived(spool: ISpool, archived: boolean) { export async function setSpoolArchived(spool: ISpool, archived: boolean) {
@@ -28,7 +28,8 @@ export function formatFilamentLabel(
diameter: number, diameter: number,
vendorName?: string, vendorName?: string,
material?: string, material?: string,
weight?: number weight?: number,
spoolType?: SpoolType
): string { ): string {
const portions = []; const portions = [];
if (vendorName) { if (vendorName) {
@@ -43,6 +44,9 @@ export function formatFilamentLabel(
if (weight) { if (weight) {
extras.push(formatWeight(weight)); extras.push(formatWeight(weight));
} }
if (spoolType) {
extras.push(spoolType.charAt(0).toUpperCase() + spoolType.slice(1) + " spool");
}
return `${portions.join(" - ")} (${extras.join(", ")})`; return `${portions.join(" - ")} (${extras.join(", ")})`;
} }
@@ -89,7 +93,14 @@ export function useGetFilamentSelectOptions() {
const data = const data =
externalFilaments.data?.map((item) => { externalFilaments.data?.map((item) => {
return { return {
label: formatFilamentLabel(item.name, item.diameter, item.manufacturer, item.material, item.weight), label: formatFilamentLabel(
item.name,
item.diameter,
item.manufacturer,
item.material,
item.weight,
item.spool_type
),
value: item.id, value: item.id,
weight: item.weight, weight: item.weight,
spool_weight: item.spool_weight || undefined, spool_weight: item.spool_weight || undefined,

View File

@@ -1,6 +1,27 @@
import { useQuery, useMutation, useQueryClient } from "@tanstack/react-query"; import { useQuery, useMutation, useQueryClient } from "@tanstack/react-query";
import { getAPIURL } from "./url"; import { getAPIURL } from "./url";
export enum SpoolType {
PLASTIC = "plastic",
CARDBOARD = "cardboard",
METAL = "metal",
}
export enum Finish {
MATTE = "matte",
GLOSSY = "glossy",
}
export enum MultiColorDirection {
COAXIAL = "coaxial",
LONGITUDINAL = "longitudinal",
}
export enum Pattern {
MARBLE = "marble",
SPARKLE = "sparkle",
}
export interface ExternalFilament { export interface ExternalFilament {
id: string; id: string;
manufacturer: string; manufacturer: string;
@@ -8,11 +29,18 @@ export interface ExternalFilament {
material: string; material: string;
density: number; density: number;
weight: number; weight: number;
spool_weight: number | null; spool_weight?: number;
spool_type?: SpoolType;
diameter: number; diameter: number;
color_hex: string; color_hex?: string;
extruder_temp: number | null; color_hexes?: string[];
bed_temp: number | null; extruder_temp?: number;
bed_temp?: number;
finish?: Finish;
multi_color_direction?: MultiColorDirection;
pattern?: Pattern;
translucent: boolean;
glow: boolean;
} }
export interface ExternalMaterial { export interface ExternalMaterial {

View File

@@ -3,6 +3,7 @@
import datetime import datetime
import logging import logging
import os import os
from enum import Enum
from pathlib import Path from pathlib import Path
from typing import Optional from typing import Optional
@@ -21,6 +22,27 @@ cache_storage = hishel.AsyncFileStorage()
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
class SpoolType(Enum):
PLASTIC = "plastic"
CARDBOARD = "cardboard"
METAL = "metal"
class Finish(Enum):
MATTE = "matte"
GLOSSY = "glossy"
class MultiColorDirection(Enum):
COAXIAL = "coaxial"
LONGITUDINAL = "longitudinal"
class Pattern(Enum):
MARBLE = "marble"
SPARKLE = "sparkle"
class ExternalFilament(BaseModel): class ExternalFilament(BaseModel):
id: str = Field(description="A unique ID for this filament.", example="polymaker_pla_polysonicblack_1000_175") id: str = Field(description="A unique ID for this filament.", example="polymaker_pla_polysonicblack_1000_175")
manufacturer: str = Field(description="Filament manufacturer.", example="Polymaker") manufacturer: str = Field(description="Filament manufacturer.", example="Polymaker")
@@ -29,10 +51,29 @@ class ExternalFilament(BaseModel):
density: float = Field(description="Density in g/cm3.", example=1.23) density: float = Field(description="Density in g/cm3.", example=1.23)
weight: float = Field(description="Net weight of a single spool.", example=1000) weight: float = Field(description="Net weight of a single spool.", example=1000)
spool_weight: Optional[float] = Field(default=None, description="Weight of an empty spool.", example=140) spool_weight: Optional[float] = Field(default=None, description="Weight of an empty spool.", example=140)
spool_type: Optional[SpoolType] = Field(description="Type of spool.", example=SpoolType.PLASTIC)
diameter: float = Field(description="Filament in mm.", example=1.75) diameter: float = Field(description="Filament in mm.", example=1.75)
color_hex: str = Field(description="Filament color code in hex format.", example="2c3232") color_hex: Optional[str] = Field(
default=None,
description="Filament color code in hex format, for single-color filaments.",
example="2c3232",
)
color_hexes: Optional[list[str]] = Field(
default=None,
description="For multi-color filaments. List of hex color codes in hex format.",
example=["2c3232", "5f5f5f"],
)
extruder_temp: Optional[int] = Field(default=None, description="Extruder/nozzle temperature in °C.", example=210) extruder_temp: Optional[int] = Field(default=None, description="Extruder/nozzle temperature in °C.", example=210)
bed_temp: Optional[int] = Field(default=None, description="Bed temperature in °C.", example=50) bed_temp: Optional[int] = Field(default=None, description="Bed temperature in °C.", example=50)
finish: Optional[Finish] = Field(default=None, description="Finish of the filament.", example=Finish.MATTE)
multi_color_direction: Optional[MultiColorDirection] = Field(
default=None,
description="Direction of multi-color filaments.",
example=MultiColorDirection.COAXIAL,
)
pattern: Optional[Pattern] = Field(default=None, description="Pattern of the filament.", example=Pattern.MARBLE)
translucent: bool = Field(default=False, description="Whether the filament is translucent.")
glow: bool = Field(default=False, description="Whether the filament is glow-in-the-dark.")
class ExternalFilamentsFile(BaseModel): class ExternalFilamentsFile(BaseModel):