Browse Source

Implement forward kernel pass

Copied from CuraEngine's C++ implementation.

Contributes to issue CURA-5561.
Ghostkeeper 6 years ago
parent
commit
944bf70eb5
1 changed files with 30 additions and 1 deletions
  1. 30 1
      50_inst_per_sec.py

+ 30 - 1
50_inst_per_sec.py

@@ -443,6 +443,17 @@ class CommandBuffer:
             kernel_commands[0] = cmd
             self.reverse_pass_kernel(kernel_commands[0], kernel_commands[1], kernel_commands[2])
 
+        #Third pass: Forward kernel.
+        kernel_commands = [None, None, None]
+        for cmd in self._all_commands:
+            if cmd.estimated_exec_time_in_ms >= 0:
+                continue #Not a movement command.
+            kernel_commands[2] = kernel_commands[1]
+            kernel_commands[1] = kernel_commands[0]
+            kernel_commands[0] = cmd
+            self.forward_pass_kernel(kernel_commands[0], kernel_commands[1], kernel_commands[2])
+        self.forward_pass_kernel(kernel_commands[1], kernel_commands[2], None)
+
         for idx, cmd in enumerate(self._all_commands):
             cmd_count += 1
             if idx > cmd0_idx or idx == 0:
@@ -475,7 +486,7 @@ class CommandBuffer:
                                                        "cmd_count": cmd_count,
                                                        "time_in_ms": total_frame_time_in_ms})
 
-    def reverse_pass_kernel(self, previous: Command, current: Command, next: Command):
+    def reverse_pass_kernel(self, previous: Optional[Command], current: Optional[Command], next: Optional[Command]) -> None:
         if not previous:
             return
 
@@ -494,6 +505,24 @@ class CommandBuffer:
                 current._entry_speed = current._max_entry_speed
             current._recalculate = True
 
+    def forward_pass_kernel(self, previous: Optional[Command], current: Optional[Command], next: Optional[Command]) -> None:
+        if not previous:
+            return
+
+        #If the previous command is an acceleration command, but it is not long
+        #enough to complete the full speed change within the command, we need to
+        #adjust the entry speed accordingly. Entry speeds have already been
+        #reset, maximised and reverse planned by the reverse planner. If nominal
+        #length is set, max junction speed is guaranteed to be reached. No need
+        #to recheck.
+        if not previous._nominal_length:
+            if previous._entry_speed < current._entry_speed:
+                entry_speed = min(current._entry_speed, calc_max_allowable_speed(-previous._acceleration, previous._entry_speed, previous._distance))
+
+                if current._entry_speed != entry_speed:
+                    current._entry_speed = entry_speed
+                    current._recalculate = True
+
     def to_file(self, file_name: str) -> None:
         all_lines = [str(c) for c in self._all_commands]
         with open(file_name, "w", encoding = "utf-8") as f: