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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +7 -0
- data/README.md +9 -3
- data/RELEASING.md +3 -3
- data/docs/README.md +1 -0
- data/docs/artifacts.md +19 -2
- data/docs/bambu-studio.md +2 -0
- data/docs/color-model.md +2 -0
- data/docs/command.md +23 -5
- data/docs/config.md +30 -3
- data/docs/getting-started.md +5 -3
- data/docs/tiling.md +132 -0
- data/docs/troubleshooting.md +12 -0
- data/lib/lithop/calibration/export.rb +21 -8
- data/lib/lithop/cli/calibration.rb +3 -1
- data/lib/lithop/cli/image_options.rb +41 -2
- data/lib/lithop/cli.rb +8 -1
- data/lib/lithop/export/color_metadata.rb +55 -0
- data/lib/lithop/export/generation.rb +117 -20
- data/lib/lithop/export/job.rb +30 -16
- data/lib/lithop/export/metadata.rb +48 -3
- data/lib/lithop/export/planning.rb +97 -0
- data/lib/lithop/export/print_readme.rb +22 -4
- data/lib/lithop/export/result.rb +26 -4
- data/lib/lithop/formats/three_mf/bambu_metadata.rb +111 -24
- data/lib/lithop/formats/three_mf/model_writer.rb +245 -23
- data/lib/lithop/formats/three_mf/part_writer.rb +14 -6
- data/lib/lithop/formats/three_mf.rb +8 -5
- data/lib/lithop/image/pipeline.rb +17 -0
- data/lib/lithop/job_directory.rb +41 -0
- data/lib/lithop/job_execution.rb +250 -0
- data/lib/lithop/layer_structure.rb +11 -0
- data/lib/lithop/mesh/box_geometry.rb +41 -0
- data/lib/lithop/mesh/column_geometry.rb +2 -2
- data/lib/lithop/mesh/geometry.rb +21 -13
- data/lib/lithop/model/layer_region_model.rb +24 -0
- data/lib/lithop/reference_three_mf.rb +17 -1
- data/lib/lithop/settings.rb +116 -1
- data/lib/lithop/settings_file.rb +10 -4
- data/lib/lithop/tiling.rb +126 -0
- data/lib/lithop/version.rb +1 -1
- data/lib/lithop.rb +4 -0
- data/sig/lithop.rbs +77 -2
- metadata +6 -1
data/lib/lithop/settings.rb
CHANGED
|
@@ -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
|
data/lib/lithop/settings_file.rb
CHANGED
|
@@ -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
|
data/lib/lithop/version.rb
CHANGED
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: (
|
|
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.
|
|
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
|