lithop 0.1.0 → 0.2.0

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.
Files changed (44) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +7 -0
  3. data/README.md +9 -3
  4. data/RELEASING.md +3 -3
  5. data/docs/README.md +1 -0
  6. data/docs/artifacts.md +19 -2
  7. data/docs/bambu-studio.md +2 -0
  8. data/docs/color-model.md +2 -0
  9. data/docs/command.md +23 -5
  10. data/docs/config.md +30 -3
  11. data/docs/getting-started.md +5 -3
  12. data/docs/tiling.md +132 -0
  13. data/docs/troubleshooting.md +12 -0
  14. data/lib/lithop/calibration/export.rb +21 -8
  15. data/lib/lithop/cli/calibration.rb +3 -1
  16. data/lib/lithop/cli/image_options.rb +41 -2
  17. data/lib/lithop/cli.rb +8 -1
  18. data/lib/lithop/export/color_metadata.rb +55 -0
  19. data/lib/lithop/export/generation.rb +117 -20
  20. data/lib/lithop/export/job.rb +30 -16
  21. data/lib/lithop/export/metadata.rb +48 -3
  22. data/lib/lithop/export/planning.rb +97 -0
  23. data/lib/lithop/export/print_readme.rb +22 -4
  24. data/lib/lithop/export/result.rb +26 -4
  25. data/lib/lithop/formats/three_mf/bambu_metadata.rb +111 -24
  26. data/lib/lithop/formats/three_mf/model_writer.rb +245 -23
  27. data/lib/lithop/formats/three_mf/part_writer.rb +14 -6
  28. data/lib/lithop/formats/three_mf.rb +8 -5
  29. data/lib/lithop/image/pipeline.rb +17 -0
  30. data/lib/lithop/job_directory.rb +41 -0
  31. data/lib/lithop/job_execution.rb +250 -0
  32. data/lib/lithop/layer_structure.rb +11 -0
  33. data/lib/lithop/mesh/box_geometry.rb +41 -0
  34. data/lib/lithop/mesh/column_geometry.rb +2 -2
  35. data/lib/lithop/mesh/geometry.rb +21 -13
  36. data/lib/lithop/model/layer_region_model.rb +24 -0
  37. data/lib/lithop/reference_three_mf.rb +17 -1
  38. data/lib/lithop/settings.rb +116 -1
  39. data/lib/lithop/settings_file.rb +10 -4
  40. data/lib/lithop/tiling.rb +126 -0
  41. data/lib/lithop/version.rb +1 -1
  42. data/lib/lithop.rb +4 -0
  43. data/sig/lithop.rbs +77 -2
  44. metadata +6 -1
@@ -13,10 +13,13 @@ module Lithop
13
13
  validate_color_model!
14
14
  validate_layout_profile!
15
15
  validate_grid!
16
+ validate_tiles!
16
17
  validate_layer_structure!
18
+ validate_z_parts!
17
19
  validate_advanced_layer_structure!
18
20
  validate_margins!
19
21
  validate_image_placement!
22
+ validate_image_adjustments!
20
23
  validate_nozzle_diameter!
21
24
  validate_mesh_limit!
22
25
  end
@@ -73,6 +76,55 @@ module Lithop
73
76
  raise ConfigurationError, "grid_columns and grid_rows must be positive integers or null"
74
77
  end
75
78
 
79
+ def validate_tiles!
80
+ validate_tile_count!
81
+ validate_tile_layout!
82
+ validate_tile_grid!
83
+
84
+ if tile_count > columns * rows
85
+ raise ConfigurationError, "tile layout must leave at least one XY cell in every tile"
86
+ end
87
+
88
+ return if resolved_tile_columns <= columns && resolved_tile_rows <= rows
89
+
90
+ raise ConfigurationError, "tile layout must leave at least one XY cell in every tile"
91
+ end
92
+
93
+ def validate_tile_count!
94
+ return if tile_count.is_a?(Integer) && tile_count.positive?
95
+
96
+ raise ConfigurationError, "tile_count must be a positive integer"
97
+ end
98
+
99
+ def validate_tile_layout!
100
+ return if Settings::TILE_LAYOUTS.include?(tile_layout)
101
+
102
+ raise ConfigurationError, "tile_layout must be one of: #{Settings::TILE_LAYOUTS.join(", ")}"
103
+ end
104
+
105
+ def validate_tile_grid!
106
+ unless tile_layout == "grid"
107
+ return if tile_rows.nil? && tile_columns.nil?
108
+
109
+ raise ConfigurationError, "tile_rows and tile_columns may only be set for grid layout"
110
+ end
111
+ unless tile_rows.is_a?(Integer) && tile_rows.positive? &&
112
+ tile_columns.is_a?(Integer) && tile_columns.positive?
113
+ raise ConfigurationError, "tile_rows and tile_columns must be positive integers for grid layout"
114
+ end
115
+ return if tile_rows * tile_columns == tile_count
116
+
117
+ raise ConfigurationError, "tile_rows times tile_columns must equal tile_count"
118
+ end
119
+
120
+ def validate_z_parts!
121
+ raise ConfigurationError, "separate_z_parts must be a boolean" unless [true, false].include?(separate_z_parts)
122
+ unless color_region_parts.is_a?(Integer) && color_region_parts.positive? &&
123
+ color_region_parts <= color_layer_count
124
+ raise ConfigurationError, "color_region_parts must be an integer from 1 to color_layer_count"
125
+ end
126
+ end
127
+
76
128
  def validate_layer_structure!
77
129
  return if Settings::COLOR_LAYER_COUNTS.include?(color_layer_count)
78
130
 
@@ -128,6 +180,15 @@ module Lithop
128
180
  raise ConfigurationError, "crop_scale must be a finite number greater than 0 and at most 1"
129
181
  end
130
182
 
183
+ def validate_image_adjustments!
184
+ %i[brightness contrast saturation].each do |key|
185
+ value = public_send(key)
186
+ next if value.is_a?(Numeric) && value.finite? && value.between?(-100.0, 100.0)
187
+
188
+ raise ConfigurationError, "#{key} must be a finite percentage from -100 to 100"
189
+ end
190
+ end
191
+
131
192
  def validate_nozzle_diameter!
132
193
  return if Settings::NOZZLE_DIAMETERS.include?(nozzle_diameter)
133
194
 
@@ -174,6 +235,7 @@ module Lithop
174
235
  COLOR_LAYER_COUNTS = [4, 5, 7].freeze
175
236
  LAYOUT_PROFILES = ["standard"].freeze
176
237
  IMAGE_FITS = %w[cover contain].freeze
238
+ TILE_LAYOUTS = %w[auto columns rows grid].freeze
177
239
  PIGMENTS = %i[cyan magenta yellow].freeze
178
240
  MINIMUM_TOP_WHITE_LAYERS = LayerStructure::MINIMUM_TOP_WHITE_LAYERS
179
241
  DEFAULTS = {
@@ -188,12 +250,21 @@ module Lithop
188
250
  crop_position_x: 0.5,
189
251
  crop_position_y: 0.5,
190
252
  crop_scale: 1.0,
253
+ brightness: 0.0,
254
+ contrast: 0.0,
255
+ saturation: 0.0,
191
256
  minimum_thickness: 1.0,
192
257
  maximum_thickness: 2.14689422,
193
258
  pixel_size: 0.22,
194
259
  color_pixel_size: nil,
195
260
  grid_columns: 637,
196
261
  grid_rows: 473,
262
+ tile_count: 1,
263
+ tile_layout: "auto",
264
+ tile_rows: nil,
265
+ tile_columns: nil,
266
+ separate_z_parts: false,
267
+ color_region_parts: 3,
197
268
  first_layer_height: 0.1,
198
269
  layer_height: 0.1,
199
270
  base_white_layers: 2,
@@ -232,6 +303,7 @@ module Lithop
232
303
  end
233
304
 
234
305
  validate_physical_minimum!
306
+ validate_separated_top_white!
235
307
  end
236
308
 
237
309
  def without_default_grid(values)
@@ -250,6 +322,18 @@ module Lithop
250
322
  def pixel_size_x = width.fdiv(columns)
251
323
  def pixel_size_y = height.fdiv(rows)
252
324
 
325
+ def resolved_tile_shape
326
+ case tile_layout
327
+ when "columns" then [1, tile_count]
328
+ when "rows" then [tile_count, 1]
329
+ when "grid" then [tile_rows, tile_columns]
330
+ else automatic_tile_shape
331
+ end
332
+ end
333
+
334
+ def resolved_tile_rows = resolved_tile_shape.fetch(0)
335
+ def resolved_tile_columns = resolved_tile_shape.fetch(1)
336
+
253
337
  def estimated_triangles
254
338
  (4 * columns * rows) + (4 * (columns + rows))
255
339
  end
@@ -288,8 +372,39 @@ module Lithop
288
372
  effective_color_pixel_size: effective_color_pixel_size,
289
373
  effective_minimum_thickness: effective_minimum_thickness,
290
374
  effective_maximum_thickness: effective_maximum_thickness,
291
- columns: columns, rows: rows, pixel_size_x: pixel_size_x, pixel_size_y: pixel_size_y
375
+ columns: columns, rows: rows, pixel_size_x: pixel_size_x, pixel_size_y: pixel_size_y,
376
+ resolved_tile_rows: resolved_tile_rows, resolved_tile_columns: resolved_tile_columns
292
377
  )
293
378
  end
379
+
380
+ private
381
+
382
+ def automatic_tile_shape
383
+ factors = factor_shapes.map do |row_count, column_count|
384
+ tile_width = width.fdiv(column_count)
385
+ tile_height = height.fdiv(row_count)
386
+ [[Math.log(tile_width.fdiv(tile_height)).abs, -column_count], [row_count, column_count]]
387
+ end
388
+ feasible = factors.select do |_score, (row_count, column_count)|
389
+ row_count <= rows && column_count <= columns
390
+ end
391
+ (feasible.empty? ? factors : feasible).min_by(&:first).last
392
+ end
393
+
394
+ def factor_shapes
395
+ (1..Math.sqrt(tile_count).floor).flat_map do |row_count|
396
+ next [] unless (tile_count % row_count).zero?
397
+
398
+ column_count = tile_count / row_count
399
+ row_count == column_count ? [[row_count, column_count]] : [[row_count, column_count], [column_count, row_count]]
400
+ end
401
+ end
402
+
403
+ def validate_separated_top_white!
404
+ return unless separate_z_parts
405
+ return if effective_minimum_thickness > layer_structure.color_region_end
406
+
407
+ raise ConfigurationError, "separate_z_parts requires a positive top White thickness"
408
+ end
294
409
  end
295
410
  end
@@ -26,10 +26,7 @@ module Lithop
26
26
 
27
27
  validate_keys!(data, expanded)
28
28
  validate_schema!(data, expanded)
29
- values = data.except("schema_version").transform_keys(&:to_sym)
30
- values[:color_model] = values[:color_model].downcase if values[:color_model].is_a?(String)
31
- values[:image_fit] = values[:image_fit].downcase if values[:image_fit].is_a?(String)
32
- values[:layout_profile] = values[:layout_profile].downcase if values[:layout_profile].is_a?(String)
29
+ values = normalize_values(data.except("schema_version").transform_keys(&:to_sym))
33
30
  Result.new(path: expanded, values:)
34
31
  rescue JSON::ParserError => e
35
32
  raise ConfigurationError, "settings file is not valid JSON: #{expanded}: #{e.message}"
@@ -37,6 +34,15 @@ module Lithop
37
34
  raise ConfigurationError, "could not read settings file: #{expanded}: #{e.message}"
38
35
  end
39
36
 
37
+ def normalize_values(values)
38
+ values[:color_model] = values[:color_model].downcase if values[:color_model].is_a?(String)
39
+ values[:image_fit] = values[:image_fit].downcase if values[:image_fit].is_a?(String)
40
+ values[:layout_profile] = values[:layout_profile].downcase if values[:layout_profile].is_a?(String)
41
+ values[:tile_layout] = values[:tile_layout].downcase if values[:tile_layout].is_a?(String)
42
+ values
43
+ end
44
+ private_class_method :normalize_values
45
+
40
46
  def validate_keys!(data, path)
41
47
  unknown = data.keys - ALLOWED_KEYS
42
48
  return if unknown.empty?
@@ -0,0 +1,126 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Lithop
4
+ # Resolves a deterministic tile grid on existing XY cell boundaries.
5
+ class TileLayout
6
+ Tile = Data.define(
7
+ :id, :row, :column, :row_start, :row_end, :column_start, :column_end,
8
+ :x_min, :x_max, :y_min, :y_max
9
+ ) do
10
+ def width = x_max - x_min
11
+ def height = y_max - y_min
12
+ def offset = { x: x_min, y: y_min }
13
+ def bounds = { x_min:, x_max:, y_min:, y_max: }
14
+ end
15
+
16
+ attr_reader :rows, :columns, :tiles
17
+
18
+ def initialize(settings)
19
+ @settings = settings
20
+ @rows = settings.resolved_tile_rows
21
+ @columns = settings.resolved_tile_columns
22
+ @tiles = build_tiles.freeze
23
+ end
24
+
25
+ private
26
+
27
+ def build_tiles
28
+ row_spans = partition(@settings.rows, rows)
29
+ column_spans = partition(@settings.columns, columns)
30
+ row_spans.each_with_index.flat_map do |(row_start, row_end), row|
31
+ column_spans.each_with_index.map do |(column_start, column_end), column|
32
+ Tile.new(
33
+ id: format("tile_r%<row>02d_c%<column>02d", row: row + 1, column: column + 1),
34
+ row: row + 1,
35
+ column: column + 1,
36
+ row_start:, row_end:, column_start:, column_end:,
37
+ x_min: @settings.x_boundaries.fetch(column_start),
38
+ x_max: @settings.x_boundaries.fetch(column_end),
39
+ y_min: (@settings.height - @settings.y_boundaries.fetch(row_end)).round(9),
40
+ y_max: (@settings.height - @settings.y_boundaries.fetch(row_start)).round(9)
41
+ )
42
+ end
43
+ end
44
+ end
45
+
46
+ def partition(cell_count, part_count)
47
+ size, remainder = cell_count.divmod(part_count)
48
+ start = 0
49
+ Array.new(part_count) do |index|
50
+ finish = start + size + (index < remainder ? 1 : 0)
51
+ [start, finish].tap { start = finish }
52
+ end
53
+ end
54
+ end
55
+
56
+ # Presents one rectangular subset of a material model in tile-local coordinates.
57
+ class TileMaterialModel
58
+ attr_reader :columns, :rows, :x_boundaries, :y_boundaries, :z_boundaries, :cells
59
+
60
+ def initialize(model:, tile:)
61
+ @columns = tile.column_end - tile.column_start
62
+ @rows = tile.row_end - tile.row_start
63
+ @x_boundaries = local_boundaries(model.x_boundaries, tile.column_start, tile.column_end)
64
+ @y_boundaries = local_boundaries(model.y_boundaries, tile.row_start, tile.row_end)
65
+ @z_boundaries = model.z_boundaries
66
+ @cells = slice_cells(model, tile).freeze
67
+ end
68
+
69
+ def materials = @materials ||= cells.flat_map(&:materials).uniq.freeze
70
+
71
+ private
72
+
73
+ def local_boundaries(boundaries, first, last)
74
+ origin = boundaries.fetch(first)
75
+ boundaries[first..last].map { |value| (value - origin).round(9) }.freeze
76
+ end
77
+
78
+ def slice_cells(model, tile)
79
+ (tile.row_start...tile.row_end).flat_map do |row|
80
+ offset = (row * model.columns) + tile.column_start
81
+ model.cells.slice(offset, columns)
82
+ end
83
+ end
84
+ end
85
+
86
+ # Writes a physical-size overview of the tile IDs and assembled placement.
87
+ module TileLayoutSVG
88
+ module_function
89
+
90
+ def write(path, settings:, layout:)
91
+ File.write(path, document(settings:, layout:))
92
+ end
93
+
94
+ def document(settings:, layout:)
95
+ rectangles = layout.tiles.map { |tile| tile_element(settings, tile) }.join("\n")
96
+ <<~SVG
97
+ <?xml version="1.0" encoding="UTF-8"?>
98
+ <svg xmlns="http://www.w3.org/2000/svg" width="#{settings.width}mm" height="#{settings.height}mm"
99
+ viewBox="0 0 #{settings.width} #{settings.height}">
100
+ <rect width="#{settings.width}" height="#{settings.height}" fill="#fff" stroke="#000" stroke-width="0.4"/>
101
+ #{rectangles}
102
+ </svg>
103
+ SVG
104
+ end
105
+
106
+ def tile_element(settings, tile)
107
+ y = settings.height - tile.y_max
108
+ font_size = [[tile.width, tile.height].min * 0.12, 5.0].min
109
+ center_x = tile.x_min + (tile.width / 2.0)
110
+ center_y = y + (tile.height / 2.0)
111
+ <<~SVG.chomp
112
+ <g>
113
+ <rect x="#{tile.x_min}" y="#{y}" width="#{tile.width}" height="#{tile.height}"
114
+ fill="none" stroke="#333" stroke-width="0.25"/>
115
+ <text x="#{center_x}" y="#{center_y - (font_size * 0.6)}"
116
+ font-family="sans-serif" font-size="#{font_size}" text-anchor="middle"
117
+ dominant-baseline="middle">#{tile.id}</text>
118
+ <text x="#{center_x}" y="#{center_y + (font_size * 0.6)}"
119
+ font-family="sans-serif" font-size="#{font_size * 0.72}" text-anchor="middle"
120
+ dominant-baseline="middle">#{tile.width.round(3)} × #{tile.height.round(3)} mm</text>
121
+ </g>
122
+ SVG
123
+ end
124
+ private_class_method :tile_element
125
+ end
126
+ end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Lithop
4
- VERSION = "0.1.0"
4
+ VERSION = "0.2.0"
5
5
  end
data/lib/lithop.rb CHANGED
@@ -13,17 +13,21 @@ require_relative "lithop/layer_structure"
13
13
  require_relative "lithop/settings"
14
14
  require_relative "lithop/settings_file"
15
15
  require_relative "lithop/job_directory"
16
+ require_relative "lithop/job_execution"
16
17
  require_relative "lithop/instrumentation"
17
18
  require_relative "lithop/model/thickness"
18
19
  require_relative "lithop/model/palette"
19
20
  require_relative "lithop/model/material_display_map"
20
21
  require_relative "lithop/model/filament_profile"
21
22
  require_relative "lithop/model/material_model"
23
+ require_relative "lithop/model/layer_region_model"
24
+ require_relative "lithop/tiling"
22
25
  require_relative "lithop/image/placement"
23
26
  require_relative "lithop/image/svg_loader"
24
27
  require_relative "lithop/image/pipeline"
25
28
  require_relative "lithop/image/preview"
26
29
  require_relative "lithop/mesh/geometry"
30
+ require_relative "lithop/mesh/box_geometry"
27
31
  require_relative "lithop/mesh/voxel_topology"
28
32
  require_relative "lithop/mesh/voxel_geometry"
29
33
  require_relative "lithop/mesh/column_topology"
data/sig/lithop.rbs CHANGED
@@ -22,12 +22,21 @@ module Lithop
22
22
  attr_reader crop_position_x: Numeric
23
23
  attr_reader crop_position_y: Numeric
24
24
  attr_reader crop_scale: Numeric
25
+ attr_reader brightness: Numeric
26
+ attr_reader contrast: Numeric
27
+ attr_reader saturation: Numeric
25
28
  attr_reader minimum_thickness: Numeric
26
29
  attr_reader maximum_thickness: Numeric
27
30
  attr_reader pixel_size: Numeric
28
31
  attr_reader color_pixel_size: Numeric?
29
32
  attr_reader grid_columns: Integer?
30
33
  attr_reader grid_rows: Integer?
34
+ attr_reader tile_count: Integer
35
+ attr_reader tile_layout: String
36
+ attr_reader tile_rows: Integer?
37
+ attr_reader tile_columns: Integer?
38
+ attr_reader separate_z_parts: bool
39
+ attr_reader color_region_parts: Integer
31
40
  attr_reader first_layer_height: Numeric
32
41
  attr_reader layer_height: Numeric
33
42
  attr_reader base_white_layers: Integer
@@ -52,6 +61,9 @@ module Lithop
52
61
  def fitted_grid?: () -> bool
53
62
  def pixel_size_x: () -> Float
54
63
  def pixel_size_y: () -> Float
64
+ def resolved_tile_shape: () -> [Integer, Integer]
65
+ def resolved_tile_rows: () -> Integer
66
+ def resolved_tile_columns: () -> Integer
55
67
  def estimated_triangles: () -> Integer
56
68
  def triangle_limit_message: (String label, Integer triangle_count) -> String
57
69
  def x_boundaries: () -> Array[Numeric]
@@ -61,6 +73,33 @@ module Lithop
61
73
  def to_h: () -> Hash[Symbol, untyped]
62
74
  end
63
75
 
76
+ class TileLayout
77
+ class Tile < Data
78
+ attr_reader id: String
79
+ attr_reader row: Integer
80
+ attr_reader column: Integer
81
+ attr_reader row_start: Integer
82
+ attr_reader row_end: Integer
83
+ attr_reader column_start: Integer
84
+ attr_reader column_end: Integer
85
+ attr_reader x_min: Numeric
86
+ attr_reader x_max: Numeric
87
+ attr_reader y_min: Numeric
88
+ attr_reader y_max: Numeric
89
+
90
+ def width: () -> Numeric
91
+ def height: () -> Numeric
92
+ def offset: () -> Hash[Symbol, Numeric]
93
+ def bounds: () -> Hash[Symbol, Numeric]
94
+ end
95
+
96
+ attr_reader rows: Integer
97
+ attr_reader columns: Integer
98
+ attr_reader tiles: Array[Tile]
99
+
100
+ def initialize: (Settings settings) -> void
101
+ end
102
+
64
103
  class Palette
65
104
  class Recipe < Data
66
105
  attr_reader cyan: Integer
@@ -186,7 +225,14 @@ module Lithop
186
225
  attr_reader patch_count: Integer
187
226
  end
188
227
 
189
- def initialize: (settings: Settings, project_dir: String, ?clock: untyped, ?random: untyped) -> void
228
+ def initialize: (
229
+ settings: Settings,
230
+ project_dir: String,
231
+ ?job_progress: untyped,
232
+ ?clock: untyped,
233
+ ?random: untyped,
234
+ ?job_id: String?
235
+ ) -> void
190
236
  def call: () -> Result
191
237
  end
192
238
  end
@@ -243,6 +289,11 @@ module Lithop
243
289
  class Part < Data
244
290
  attr_reader material: Symbol
245
291
  attr_reader triangles: Enumerable[untyped]
292
+ attr_reader name: String?
293
+ attr_reader region: String?
294
+ attr_reader build_z_offset: Numeric
295
+
296
+ def initialize: (material: Symbol, triangles: Enumerable[untyped], ?name: String?, ?region: String?, ?build_z_offset: Numeric) -> void
246
297
  end
247
298
 
248
299
  class Result < Data
@@ -266,6 +317,28 @@ module Lithop
266
317
  attr_reader object_count: Integer
267
318
  end
268
319
 
320
+ class JobCancelled < Error
321
+ end
322
+
323
+ class JobExecution
324
+ class Progress < Data
325
+ attr_reader job_id: String
326
+ attr_reader state: String
327
+ attr_reader phase: String
328
+ attr_reader percent: Float
329
+ attr_reader message: String
330
+ attr_reader updated_at: String
331
+ end
332
+
333
+ attr_reader job_id: String
334
+ attr_reader status_path: String
335
+
336
+ def initialize: (project_dir: String, job_id: String, ?progress: untyped, ?clock: untyped) -> void
337
+ def call: [A] () { (JobExecution) -> A } -> A
338
+ def progress: (phase: String | Symbol, percent: Numeric, message: String) -> void
339
+ def self.request_cancel: (project_dir: String, job_id: String, ?clock: untyped) -> String
340
+ end
341
+
269
342
  class Export
270
343
  class CalibrationInput < Data
271
344
  attr_reader profile: Calibration::Profile
@@ -278,9 +351,11 @@ module Lithop
278
351
  ?input_settings_path: String?,
279
352
  ?calibration: CalibrationInput?,
280
353
  ?progress: untyped,
354
+ ?job_progress: untyped,
281
355
  ?instrumentation: untyped,
282
356
  ?clock: untyped,
283
- ?random: untyped
357
+ ?random: untyped,
358
+ ?job_id: String?
284
359
  ) -> void
285
360
  def call: (String input_path) -> ExportResult
286
361
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: lithop
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - ogom
@@ -73,6 +73,7 @@ files:
73
73
  - docs/command.md
74
74
  - docs/config.md
75
75
  - docs/getting-started.md
76
+ - docs/tiling.md
76
77
  - docs/troubleshooting.md
77
78
  - lib/lithop.rb
78
79
  - lib/lithop/calibration/export.rb
@@ -108,7 +109,9 @@ files:
108
109
  - lib/lithop/image/svg_loader.rb
109
110
  - lib/lithop/instrumentation.rb
110
111
  - lib/lithop/job_directory.rb
112
+ - lib/lithop/job_execution.rb
111
113
  - lib/lithop/layer_structure.rb
114
+ - lib/lithop/mesh/box_geometry.rb
112
115
  - lib/lithop/mesh/column_geometry.rb
113
116
  - lib/lithop/mesh/column_topology.rb
114
117
  - lib/lithop/mesh/geometry.rb
@@ -116,6 +119,7 @@ files:
116
119
  - lib/lithop/mesh/voxel_geometry.rb
117
120
  - lib/lithop/mesh/voxel_topology.rb
118
121
  - lib/lithop/model/filament_profile.rb
122
+ - lib/lithop/model/layer_region_model.rb
119
123
  - lib/lithop/model/material_display_map.rb
120
124
  - lib/lithop/model/material_model.rb
121
125
  - lib/lithop/model/palette.rb
@@ -124,6 +128,7 @@ files:
124
128
  - lib/lithop/sampling_grid.rb
125
129
  - lib/lithop/settings.rb
126
130
  - lib/lithop/settings_file.rb
131
+ - lib/lithop/tiling.rb
127
132
  - lib/lithop/version.rb
128
133
  - sig/lithop.rbs
129
134
  homepage: https://github.com/ogom/lithop