11// MIT License
22//
3- // Copyright (c) 2023 Digital-Production-Aachen
3+ // Copyright (c) 2025 Digital-Production-Aachen
44//
55// Permission is hereby granted, free of charge, to any person obtaining a copy
66// of this software and associated documentation files (the "Software"), to deal
@@ -59,6 +59,10 @@ message JobParameters {
5959 repeated double shielding_gas_directions = 2 ;
6060 //vector of main direction of a material feed (e.g. powder coater, powder feed, extrusion nozzle) (xy or xyz)
6161 repeated double material_feed_directions = 3 ;
62+ //bounds of the scan fields associated with the respective laser_index found in vector blocks data
63+ repeated AxisAlignedBox2D scan_field_bounds = 5 ;
64+ //map of additional proprietary parameters
65+ map <string ,Part.ProcessStrategy.ProprietaryParam > additional_parameters = 4 ;
6266}
6367
6468//Parameters controlling the tool (e.g. laser beam) behaviour
@@ -85,7 +89,8 @@ message MarkingParams {
8589
8690 //marking mode switches between normal marking and skywriting modes
8791 MarkingMode marking_mode = 10 ;
88-
92+ CornerBlendMode blend_mode = 28 ;
93+
8994 //Parameters for marking without Skywriting
9095 float jump_delay_in_us = 11 ;
9196 float laser_off_delay_in_us = 12 ;
@@ -96,9 +101,17 @@ message MarkingParams {
96101 //Parameters for marking with Skywriting
97102 float time_lag_in_us = 16 ;
98103 float laser_on_shift_in_us = 17 ;
104+ //limit angle to switch from polygon delay to skywriting [degrees]
99105 float limit = 18 ;
100106 float n_prev_in_us = 19 ;
101107 float n_post_in_us = 20 ;
108+ //maximum allowed deviation from the setpoint mark path to optimize scanner dynamics by "cutting corners"
109+ //Only applies in CornerBlendMode.SWIFT_BLENDING_MAXIMIZE_SPEED and
110+ //Synonyms: radial tolerance
111+ float corner_tolerance = 29 ;
112+ //minimum mark speed to guaranty by scanner dynamics
113+ //mark speed may be reduced down between laser_speed_in_mm_per_s and minimum_mark_speed when "cutting corners"
114+ float minimum_mark_speed = 30 ;
102115
103116 //Parameters for marking with Wobble
104117 float wob_frequency_in_hz = 21 ;
@@ -119,6 +132,31 @@ message MarkingParams {
119132 SKY_1 = 1 ;
120133 SKY_2 = 2 ;
121134 SKY_3 = 3 ;
135+ //Controls Sky Writing jerk-limited based on a lookahead simulation of scanner dynamics.
136+ //manual skywriting params (n_prev_in_us, n_post_in_us, time_lag_in_us, laser_on_shift_in_us, limit, polygon_delay_in_us) are ignored
137+ //Synonyms: BlendMode (ScanLab), ScanPack (Novanta)
138+ SKYWRITING_LOOKAHEAD = 4 ;
139+ }
140+
141+ enum CornerBlendMode {
142+ //Uses the angle given by "limit" to choose between executing polygon delay or skywriting.
143+ //When skywriting is not performed, a delay of length polygon_delay_in_us is inserted.
144+ LIMIT_ANGLE_POLYGON_DELAY = 0 ;
145+ //Keeps the marking speed constant to the speed defined in laser_speed_in_mm_per_s.
146+ //Then optimizes the accuracy to be as close to the setpoint geometry as scanner dynamics allow.
147+ //If the corner_tolerance cannot be fulfilled, the behaviour depends on the skywriting mode.
148+ //If skywriting is DYNAMIC_LOOKAHEAD, a skywriting motion is inserted. If skywriting mode is NO_SKY, a dynamics violation is triggered.
149+ SWIFT_BLENDING_CONSTANT_SPEED = 1 ;
150+ //Utilizes scanner dynamics lookahead to maximize the speed of the scanning process.
151+ //Guaranties that the corner_tolerance is fulfilled.
152+ //Maximizes the scanning speed possibly beyond the limits of minimum_mark_speed and laser_speed_in_mm_per_s.
153+ //Does not insert sky writing-like motions, instead decelerates as needed on the trajectory. Ignores marking_mode.
154+ SWIFT_BLENDING_MAXIMIZE_SPEED = 2 ;
155+ //Utilizes scanner dynamics lookahead to maximize the accuracy of the scanning process.
156+ //Guaranties that the minimum_mark_speed is fulfilled.
157+ //If the corner_tolerance cannot be fulfilled, the behaviour depends on the skywriting mode.
158+ //If skywriting is DYNAMIC_LOOKAHEAD, a skywriting motion is inserted. If skywriting mode is NO_SKY, a dynamics violation is triggered.
159+ BEST_ACCURACY_MIN_MARK_SPEED = 3 ;
122160 }
123161
124162 enum WobbleMode {
@@ -228,7 +266,11 @@ message Part {
228266 //generic definition of proprietary parameters descriptor
229267 message ProprietaryParam {
230268 string param_name = 1 ;
231- double param_value = 2 ;
269+ oneof parameter_value {
270+ double param_value = 2 ;
271+ string param_string = 4 ;
272+ bytes param_blob = 5 ;
273+ }
232274 string param_description = 3 ;
233275 }
234276
@@ -374,14 +416,16 @@ message VectorBlock {
374416 ExposurePause exposure_pause = 10 ;
375417 LineSequenceParaAdapt line_sequence_para_adapt = 11 ;
376418 HatchesParaAdapt _hatchParaAdapt = 12 ;
377- CubicBezierHatches cubic_bezier_hatches = 13 ;
378- QuadraticBezierHatches quadratic_bezier_hatches = 14 ;
379- CubicBezierSpline cubic_bezier_spline = 15 ;
380- QuadraticBezierSpline quadratic_bezier_spline = 16 ;
381- CubicBezierHatches3D cubic_bezier_hatches_3d = 17 ;
382- QuadraticBezierHatches3D quadratic_bezier_hatches_3d = 18 ;
383- CubicBezierSpline3D cubic_bezier_spline_3d = 19 ;
384- QuadraticBezierSpline3D quadratic_bezier_spline_3d = 20 ;
419+ CubicBezierHatches cubic_bezier_hatches = 13 ;
420+ QuadraticBezierHatches quadratic_bezier_hatches = 14 ;
421+ CubicBezierSpline cubic_bezier_spline = 15 ;
422+ QuadraticBezierSpline quadratic_bezier_spline = 16 ;
423+ CubicBezierHatches3D cubic_bezier_hatches_3d = 17 ;
424+ QuadraticBezierHatches3D quadratic_bezier_hatches_3d = 18 ;
425+ CubicBezierSpline3D cubic_bezier_spline_3d = 19 ;
426+ QuadraticBezierSpline3D quadratic_bezier_spline_3d = 20 ;
427+
428+ SynchronizationBlock sync_block = 21 ;
385429 }
386430
387431 //key used in Job/markingParamsMap
@@ -424,7 +468,22 @@ message VectorBlock {
424468 AxisAlignedBox2D bounds = 6 ;
425469 //Optional metadata defining a preferred 32bit RGBA color to render the vector data of this vector block in a viewer.
426470 //int32 is interpreted as byte[4] with byte[0] = red, byte[1] = green, byte[2] = blue, byte[3] = alpha
427- int32 display_color = 7 ; }
471+ int32 display_color = 7 ;
472+
473+ //---these fields can be used by simulation software to write detailed exposure times into the OVF structure---
474+
475+ //internal execution time of the vector block, including block internal delays and skywriting
476+ //this time stays constant when the vector block is translated/rotated, excludes jump_to_time_in_s
477+ //the full execution time is the sum of exposure_time_in_s and jump_to_time_in_s
478+ double exposure_time_in_s = 8 ;
479+ //jump time from the end position of the previous vector block to the start position of this vector block
480+ //this time changes when the vector block is translated/rotated
481+ //the full execution time is the sum of exposure_time_in_s and jump_to_time_in_s
482+ double jump_to_time_in_s = 9 ;
483+ //time the laser power was on
484+ //can be used to calculate productive time percentage and theoretical energy input (multiply with laser_power_in_w)
485+ double laser_on_time_in_s = 10 ;
486+ }
428487
429488 // ProcessMetaData for LPBF
430489 message LPBFMetadata {
@@ -589,28 +648,43 @@ message VectorBlock {
589648 //Pause the exposure procedure. This can be necessary e.g. for thermal reasons,
590649 //or for syncing mulitple laser scanner units, preventing overlap or smoke interaction.
591650 message ExposurePause {
651+ //static wait time in the exposure
592652 uint64 pause_in_us = 1 ;
593653 }
594-
595- //A LineSequence with additional adaption of one laser parameter along the vectors.
596- //Each point consists of (x,y,parameterValue) for 2D.
597- //The parameterValue is the goal value that will be reached at the end of the vector,
654+
655+ //Synchronization block for multi laser scanner unit systems.
656+ //Creates dynamic dependencies between multiple lasers exposure orders that shall be enforced by the machine controller in real time.
657+ message SynchronizationBlock {
658+ //The SynchronizationBlock references another vector block to wait on in the same workplane by index.
659+ //Exposure of the laser of SynchronizationBlock (referenced by laser_index) will pause and not continue
660+ //until the block referenced by vector_block_index_to_wait_on has been fully executed.
661+ //Caution must be taken to not create cyclic synchronization dependencies, which would cause a deadlock.
662+ int32 vector_block_index_to_wait_on = 1 ;
663+ }
664+
665+ //A LineSequence with additional adaption of one or more laser parameters along the vectors.
666+ //Each point consists of (x,y,parameterValue1,parameterValue2...) for 2D.
667+ //The parameter field defines which parameter values are contained inside points_with_paras.
668+ //The count of the parameter field defines how many floats define parameters (and which) after x and y.
669+ //Each parameterValue is the goal value that will be reached at the end of the vector,
598670 //scaling linear along the vector. The goal gets priority and overwrites settings of the
599- //parameter set.
671+ //marking parameter set. All other values are still statically set as defined in the marking parameter set.
600672 message LineSequenceParaAdapt {
601673 repeated float points_with_paras = 1 ; // len % 3 == 0, len >= 3
602674
603- AdaptedParameter parameter = 2 ;
675+ repeated AdaptedParameter parameter = 2 ;
604676 enum AdaptedParameter {
605677 LASER_POWER_IN_W = 0 ;
606678 LASER_FOCUS_SHIFT_IN_MM = 1 ;
607- //for Q-Switch only
608679 LASER_PULSE_LENGTH_IN_US = 2 ;
609680 LASER_PULSE_REPITION_RATE_IN_HZ = 3 ;
681+ LASER_SPEED_IN_MM_PER_S = 4 ;
610682 }
611683 }
612684
613685 //A hatch divided into a line sequence with adaption parameter
686+ //this vector block type saves significant amounts of vector block meta data
687+ //compared to writing every hatch as its own LineSequenceParaAdapt block
614688 message HatchesParaAdapt {
615689 repeated LineSequenceParaAdapt hatchAsLinesequence = 1 ;
616690 }
0 commit comments