printer_models.py 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154
  1. """Printer model normalization utilities.
  2. Converts 3MF printer model names (e.g., "Bambu Lab X1 Carbon") to
  3. normalized short names (e.g., "X1C") that match database storage.
  4. """
  5. # Map from 3MF printer_model strings to normalized short names
  6. PRINTER_MODEL_MAP = {
  7. "Bambu Lab X1 Carbon": "X1C",
  8. "Bambu Lab X1": "X1",
  9. "Bambu Lab X1E": "X1E",
  10. "Bambu Lab P1S": "P1S",
  11. "Bambu Lab P1P": "P1P",
  12. "Bambu Lab P2S": "P2S",
  13. "Bambu Lab A1": "A1",
  14. "Bambu Lab A1 Mini": "A1 Mini",
  15. "Bambu Lab A1 mini": "A1 Mini",
  16. "Bambu Lab H2D": "H2D",
  17. "Bambu Lab H2D Pro": "H2D Pro",
  18. "Bambu Lab H2C": "H2C",
  19. "Bambu Lab H2S": "H2S",
  20. }
  21. # Map from printer_model_id (internal codes in slice_info.config) to short names
  22. # These are the codes Bambu Studio uses internally
  23. PRINTER_MODEL_ID_MAP = {
  24. # X1 series
  25. "C11": "X1C",
  26. "C12": "X1",
  27. "C13": "X1E",
  28. # P1 series
  29. "P1P": "P1P",
  30. "P1S": "P1S",
  31. # P2 series
  32. "P2S": "P2S",
  33. # A1 series
  34. "A11": "A1",
  35. "A12": "A1 Mini",
  36. "N1": "A1",
  37. "N2S": "A1 Mini",
  38. "A04": "A1 Mini",
  39. # H2 series (Office/H series)
  40. "O1D": "H2D",
  41. "O1E": "H2D Pro", # Some devices report O1E
  42. "O2D": "H2D Pro", # Some devices report O2D
  43. "O1C": "H2C",
  44. "O1S": "H2S",
  45. }
  46. # Rod/rail type classification for maintenance tasks.
  47. # Carbon rods: X1, P1, P2S series (CoreXY with carbon fiber rods)
  48. # Linear rails: A1, H2 series (linear rail motion system)
  49. # Values must be uppercase with spaces stripped for normalized comparison.
  50. CARBON_ROD_MODELS = frozenset(
  51. [
  52. # Display names (uppercase, no spaces)
  53. "X1",
  54. "X1C",
  55. "X1E",
  56. "P1P",
  57. "P1S",
  58. "P2S",
  59. # Internal codes
  60. "C11", # X1C
  61. "C12", # X1
  62. "C13", # X1E
  63. "N7", # P2S
  64. ]
  65. )
  66. LINEAR_RAIL_MODELS = frozenset(
  67. [
  68. # Display names (uppercase, no spaces)
  69. "A1",
  70. "A1MINI",
  71. "H2D",
  72. "H2DPRO",
  73. "H2C",
  74. "H2S",
  75. # Internal codes
  76. "N1", # A1
  77. "N2S", # A1 Mini
  78. "A04", # A1 Mini (alternate)
  79. "A11", # A1
  80. "A12", # A1 Mini
  81. "O1D", # H2D
  82. "O1E", # H2D Pro
  83. "O2D", # H2D Pro (alternate)
  84. "O1C", # H2C
  85. "O1S", # H2S
  86. ]
  87. )
  88. def get_rod_type(model: str | None) -> str | None:
  89. """Return the rod/rail type for a printer model.
  90. Returns:
  91. "carbon" for X1/P1/P2S series (carbon fiber rods),
  92. "linear_rail" for A1/H2 series (linear rails),
  93. None for unknown models.
  94. """
  95. if not model:
  96. return None
  97. normalized = model.strip().upper().replace(" ", "").replace("-", "")
  98. if normalized in CARBON_ROD_MODELS:
  99. return "carbon"
  100. if normalized in LINEAR_RAIL_MODELS:
  101. return "linear_rail"
  102. return None
  103. def normalize_printer_model_id(model_id: str | None) -> str | None:
  104. """Convert printer_model_id (internal code) to normalized short name.
  105. Args:
  106. model_id: The printer_model_id from slice_info.config (e.g., "C11", "O1D")
  107. Returns:
  108. Normalized short name (e.g., "X1C", "H2D") or the original ID if unknown.
  109. """
  110. if not model_id:
  111. return None
  112. # Check known mappings
  113. if model_id in PRINTER_MODEL_ID_MAP:
  114. return PRINTER_MODEL_ID_MAP[model_id]
  115. # Return original if unknown (might already be a short name)
  116. return model_id
  117. def normalize_printer_model(raw_model: str | None) -> str | None:
  118. """Convert 3MF printer_model to normalized short name.
  119. Args:
  120. raw_model: The printer_model string from 3MF metadata
  121. (e.g., "Bambu Lab X1 Carbon")
  122. Returns:
  123. Normalized short name (e.g., "X1C") or None if input is empty.
  124. Unknown models have "Bambu Lab " prefix stripped.
  125. """
  126. if not raw_model:
  127. return None
  128. # Check known mappings first
  129. if raw_model in PRINTER_MODEL_MAP:
  130. return PRINTER_MODEL_MAP[raw_model]
  131. # Strip "Bambu Lab " prefix for unknown models
  132. stripped = raw_model.replace("Bambu Lab ", "").strip()
  133. return stripped or None