Files
UVtools/Scripts/010 Editor/ctb.bt
T
Tiago Conceição 069c521d72 v2.29.0
- **File formats:**
   - (Add) Transition layer count to the supported files and auto compute transition time on corresponding layers in software mode
   - (Add) `HaveTransitionLayers`, `TransitionLayersType`, `BottomLayers`, `NormalLayers`, `TransitionLayers`, `TsmcLayers` properties
   - (Add) Layer: `IsTransitionLayer` property
   - (Add) SL1: Keyword `TransitionLayerCount_xxx` - Sets the number of transition layers
   - (Improvement) CTB, PHZ, FDG: Implement the `ModifiedTimestampMinutes` field, it was the MysteriousId before as an unknown field
   - (Fix) CWS: Open in partial mode will cause an exception and prevent file from load
- **CCode:**
   - (Add) Allow inverse lifts to work as an retract
   - (Fix) Parsing of WaitTimeAfterLift was incorrect when lacking a lift sequence
   - (Fix) Layers lacking an exposure time was defaulting to global time, now defaults to 0
   - (Fix) Layers without a LED ON (M106) was setting `LightPWM` to the max value (255), now defaults to 0
- **Tools:**
   - **Timelapse:**
      - (Add) Information: Raise Layer count equivalence
      - (Add) Information: Additional lifts to be generated
      - (Add) Option: Ensure the last layer - If enabled, it will generate an obligatory layer to cover the last layer
      - (Improvement) Optimize lift for virtual layer mode, allowing set a slow and fast lift / retract by using another virtual layyer to emulate a lift
      - (Improvement) Allow to define slow and fast speed for virtual layer mode even if TSMC isn't supported
   - (Add) Fade exposure time: Setting 'Disable firmware transition layers' - Attempt to disable firmware strict transition layers in favor of this tool
   - (Add) Calibration tests: Attempt to auto disable the firmware transifiton layers
   - (Change) Edit print parameters: Allow set `BottomLiftHeight` and `LiftHeight` to 0mm
- **UI:**
   - (Improvement) Disallow drop files into UI when is processing data / disabled and prevent crashing from that action
   - (Improvement) Information tab visibility and MinHeight for data grids
   - (Improvement) Hide/show GCode tab when necessary (dependent on file format)
   - (Improvement) The 'save as' will show the new file into 'Open recent' files
- **PrusaSlicer printers:**
   - (Add) Elegoo Jupiter
   - (Add) EPAX X1 4KS
   - (Add) EPAX DX1 Pro
   - (Add) EPAX DX10 Pro 5K
   - (Add) EPAX DX10 Pro 8K
   - (Add) EPAX E10 8K
   - (Add) EPAX X133 6K
2022-02-21 05:15:55 +00:00

218 lines
8.8 KiB
Plaintext

//------------------------------------------------
//--- 010 Editor v8.0.1 Binary Template
//
// File: ctb, cbddlp, photon
// Authors: Tiago Conceição
//------------------------------------------------
LittleEndian();
struct HEADER {
uint Magic <fgcolor=cBlack, bgcolor=cRed>;
uint Version <fgcolor=cBlack, bgcolor=cRed>;
float BedSizeX <fgcolor=cBlack, bgcolor=cRed>;
float BedSizeY <fgcolor=cBlack, bgcolor=cRed>;
float BedSizeZ <fgcolor=cBlack, bgcolor=cRed>;
uint Unknown1 <fgcolor=cBlack, bgcolor=cRed>;
uint Unknown2 <fgcolor=cBlack, bgcolor=cRed>;
float TotalHeightMilimeter <fgcolor=cBlack, bgcolor=cRed>;
float LayerHeightMilimeter <fgcolor=cBlack, bgcolor=cRed>;
float LayerExposureSeconds <fgcolor=cBlack, bgcolor=cRed>;
float BottomExposureSeconds <fgcolor=cBlack, bgcolor=cRed>;
float LightOffDelay <fgcolor=cBlack, bgcolor=cRed>;
uint BottomLayersCount <fgcolor=cBlack, bgcolor=cRed>;
uint ResolutionX <fgcolor=cBlack, bgcolor=cRed>;
uint ResolutionY <fgcolor=cBlack, bgcolor=cRed>;
uint PreviewLargeOffsetAddress <fgcolor=cBlack, bgcolor=cRed>;
uint LayersDefinitionOffsetAddress <fgcolor=cBlack, bgcolor=cRed>;
uint LayerCount <fgcolor=cBlack, bgcolor=cRed>;
uint PreviewSmallOffsetAddress <fgcolor=cBlack, bgcolor=cRed>;
uint PrintTime <fgcolor=cBlack, bgcolor=cRed>;
uint ProjectorType <fgcolor=cBlack, bgcolor=cRed>;
uint PrintParametersOffsetAddress <fgcolor=cBlack, bgcolor=cRed>;
uint PrintParametersSize <fgcolor=cBlack, bgcolor=cRed>;
uint AntiAliasLevel <fgcolor=cBlack, bgcolor=cRed>;
ushort LightPWM <fgcolor=cBlack, bgcolor=cRed>;
ushort BottomLightPWM <fgcolor=cBlack, bgcolor=cRed>;
uint EncryptionKey <fgcolor=cBlack, bgcolor=cRed>;
uint SlicerOffset <fgcolor=cBlack, bgcolor=cRed>;
uint SlicerSize <fgcolor=cBlack, bgcolor=cRed>;
} header;
struct PREVIEW {
uint ResolutionX <fgcolor=cBlack, bgcolor=cRed>;
uint ResolutionY <fgcolor=cBlack, bgcolor=cRed>;
uint ImageOffset <fgcolor=cBlack, bgcolor=cRed>;
uint ImageLength <fgcolor=cBlack, bgcolor=cRed>;
uint Unknown1 <fgcolor=cBlack, bgcolor=cRed>;
uint Unknown2 <fgcolor=cBlack, bgcolor=cRed>;
uint Unknown3 <fgcolor=cBlack, bgcolor=cRed>;
uint Unknown4 <fgcolor=cBlack, bgcolor=cRed>;
ubyte Data[ImageLength] <fgcolor=cBlack, bgcolor=cYellow>;
};
struct PRINT_PARAMETERS {
float BottomLiftHeight <fgcolor=cBlack, bgcolor=cRed>;
float BottomLiftSpeed <fgcolor=cBlack, bgcolor=cRed>;
float LiftHeight <fgcolor=cBlack, bgcolor=cRed>;
float LiftSpeed <fgcolor=cBlack, bgcolor=cRed>;
float RetractSpeed <fgcolor=cBlack, bgcolor=cRed>;
float VolumeMl <fgcolor=cBlack, bgcolor=cRed>;
float WeightG <fgcolor=cBlack, bgcolor=cRed>;
float CostDollars <fgcolor=cBlack, bgcolor=cRed>;
float BottomLightOffDelay <fgcolor=cBlack, bgcolor=cRed>;
float LightOffDelay <fgcolor=cBlack, bgcolor=cRed>;
uint BottomLayerCount <fgcolor=cBlack, bgcolor=cRed>;
uint Padding1 <fgcolor=cBlack, bgcolor=cRed>;
uint Padding2 <fgcolor=cBlack, bgcolor=cRed>;
uint Padding3 <fgcolor=cBlack, bgcolor=cRed>;
uint Padding4 <fgcolor=cBlack, bgcolor=cRed>;
};
struct SLICER_INFO {
float BottomLiftDistance2 <fgcolor=cBlack, bgcolor=cRed>;
float BottomLiftSpeed2 <fgcolor=cBlack, bgcolor=cRed>;
float LiftHeight2 <fgcolor=cBlack, bgcolor=cRed>;
float LiftSpeed2 <fgcolor=cBlack, bgcolor=cRed>;
float RetractHeight2 <fgcolor=cBlack, bgcolor=cRed>;
float RetractSpeed2 <fgcolor=cBlack, bgcolor=cRed>;
float RestTimeAfterLift <fgcolor=cBlack, bgcolor=cRed>;
uint MachineNameAddress <fgcolor=cBlack, bgcolor=cRed>;
uint MachineNameSize <fgcolor=cBlack, bgcolor=cRed>;
uint PerLayerSettings <fgcolor=cBlack, bgcolor=cRed, format=hex>; // 0/8 for cbddlp files, 0xF (15) for ctb files, 0x2000000F (536870927) for v3 ctb and 1073741839 for v4 ctb files to allow per layer parameters
uint TimestampMinutes <fgcolor=cBlack, bgcolor=cRed>;
uint AntiAliasLevel <fgcolor=cBlack, bgcolor=cRed>;
uint SoftwareVersion <fgcolor=cBlack, bgcolor=cRed, format=hex>; // ctb v3 = 17171200 | ctb v4 pro = 16777216
float RestTimeAfterRetract <fgcolor=cBlack, bgcolor=cRed>;
float RestTimeAfterLift2 <fgcolor=cBlack, bgcolor=cRed>;
uint TransitionLayerCount <fgcolor=cBlack, bgcolor=cRed>;
uint PrintParametersV4Address <fgcolor=cBlack, bgcolor=cRed>;
uint Padding2 <fgcolor=cBlack, bgcolor=cRed>;
uint Padding3 <fgcolor=cBlack, bgcolor=cRed>;
if(MachineNameAddress > 0 && MachineNameSize > 0)
{
char MachineName[MachineNameSize] <fgcolor=cBlack, bgcolor=cRed>;
}
};
if(header.PreviewLargeOffsetAddress > 0)
{
FSeek(header.PreviewLargeOffsetAddress);
PREVIEW previewLarge <fgcolor=cBlack, bgcolor=cYellow>;
}
if(header.PreviewSmallOffsetAddress > 0)
{
FSeek(header.PreviewSmallOffsetAddress);
PREVIEW previewSmall <fgcolor=cBlack, bgcolor=cYellow>;
}
if(header.PrintParametersOffsetAddress > 0){
FSeek(header.PrintParametersOffsetAddress);
PRINT_PARAMETERS parameters <fgcolor=cBlack, bgcolor=cYellow>;
}
if(header.SlicerOffset > 0){
FSeek(header.SlicerOffset);
SLICER_INFO SlicerInfo <fgcolor=cBlack, bgcolor=cYellow>;
}
if(header.Version >= 4)
{
FSeek(SlicerInfo.PrintParametersV4Address);
struct PRINT_PARAMETERS_V4
{
float BottomRetractSpeed <fgcolor=cWhite, bgcolor=cBlue>;
float BottomRetractSpeed2 <fgcolor=cWhite, bgcolor=cBlue>;
uint Padding1 <fgcolor=cWhite, bgcolor=cBlue>;
float Four1 <fgcolor=cWhite, bgcolor=cBlue>; // 4?
uint Padding2 <fgcolor=cWhite, bgcolor=cBlue>;
float Four2 <fgcolor=cWhite, bgcolor=cBlue>; // 4?
float RestTimeAfterRetract <fgcolor=cWhite, bgcolor=cBlue>;
float RestTimeAfterLift <fgcolor=cWhite, bgcolor=cBlue>;
float RestTimeBeforeLift <fgcolor=cWhite, bgcolor=cBlue>;
float BottomRetractHeight2 <fgcolor=cWhite, bgcolor=cBlue>;
float Unknown1 <fgcolor=cWhite, bgcolor=cBlue>; // 2955.996 or uint:1161347054 but changes
uint Unknown2 <fgcolor=cWhite, bgcolor=cBlue>; // 73470 but changes
uint Unknown3 <fgcolor=cWhite, bgcolor=cBlue>; // 5?
uint LastLayerIndex <fgcolor=cWhite, bgcolor=cBlue>; // LayerCount-1
uint Padding3 <fgcolor=cWhite, bgcolor=cBlue>;
uint Padding4 <fgcolor=cWhite, bgcolor=cBlue>;
uint Padding5 <fgcolor=cWhite, bgcolor=cBlue>;
uint Padding6 <fgcolor=cWhite, bgcolor=cBlue>;
uint DisclaimerAddress <fgcolor=cWhite, bgcolor=cBlue>;
uint DisclaimerLength <fgcolor=cWhite, bgcolor=cBlue>; // 320
ubyte Reserved[384] <fgcolor=cYellow, bgcolor=cBlue>;
} printParametersV4;
FSeek(printParametersV4.DisclaimerAddress);
char DisclaimerText[printParametersV4.DisclaimerLength] <fgcolor=cBlack, bgcolor=cYellow>;;
}
struct LAYER_DATA {
float LayerPositionZ <fgcolor=cBlack, bgcolor=cRed>;
float LayerExposure <fgcolor=cBlack, bgcolor=cRed>;
float LightOffSeconds <fgcolor=cBlack, bgcolor=cRed>;
uint DataAddress <fgcolor=cBlack, bgcolor=cRed>;
uint DataSize <fgcolor=cBlack, bgcolor=cRed>;
uint Unknown1 <fgcolor=cBlack, bgcolor=cRed>;
uint TableSize <fgcolor=cBlack, bgcolor=cRed>;
uint Unknown3 <fgcolor=cBlack, bgcolor=cRed>;
uint Unknown4 <fgcolor=cBlack, bgcolor=cRed>;
};
struct LAYER_DATAEX {
LAYER_DATA LayerData <fgcolor=cBlack, bgcolor=cRed>;
uint TotalSize <fgcolor=cBlack, bgcolor=cRed>;
float LiftHeight <fgcolor=cBlack, bgcolor=cRed>;
float LiftSpeed <fgcolor=cBlack, bgcolor=cRed>;
float LiftHeight2 <fgcolor=cBlack, bgcolor=cRed>;
float LiftSpeed2 <fgcolor=cBlack, bgcolor=cRed>;
float RetractSpeed <fgcolor=cBlack, bgcolor=cRed>;
float RetractHeight2 <fgcolor=cBlack, bgcolor=cRed>;
float RetractSpeed2 <fgcolor=cBlack, bgcolor=cRed>;
float RestTimeBeforeLift <fgcolor=cBlack, bgcolor=cRed>;
float RestTimeAfterLift <fgcolor=cBlack, bgcolor=cRed>;
float RestTimeAfterRetract <fgcolor=cBlack, bgcolor=cRed>;
float LightPWM <fgcolor=cBlack, bgcolor=cRed>;
};
typedef struct(int size) {
ubyte layerDataBlock[size] <fgcolor=cBlack, bgcolor=cGreen>;
} LAYER_RLE;
FSeek(header.LayersDefinitionOffsetAddress);
struct LAYERS {
local int aa;
local int i;
local uint currentPos;
local uint aaLevel = Max(1, header.AntiAliasLevel);
for( aa = 0; aa < aaLevel; aa++)
{
for( i = 0; i < header.LayerCount; i++ ){
LAYER_DATA layerData <fgcolor=cBlack, bgcolor=cYellow>;
currentPos = FTell();
if(header.Version >= 3)
{
FSeek(layerData.DataAddress - 84);
LAYER_DATAEX layerDataEx;
}
FSeek(layerData.DataAddress);
LAYER_RLE layerRLE(layerData.DataSize);
FSeek(currentPos);
}
}
} layers;