diff --git a/LuaLibs/AddManData.lua b/LuaLibs/AddManData.lua index 5356af9..cf73435 100644 --- a/LuaLibs/AddManData.lua +++ b/LuaLibs/AddManData.lua @@ -10,30 +10,30 @@ require( 'EgtBase') EgtOutLog( ' AddManData started', 1) --------------------------------------------------------------------- -SLICE_LAYER = "Slice" -CONTOUR_GRP = "Crv" -OUTER_CRV = "OuterCrv" -PATH_GRP = "Path" -SOLID_GRP = "Solid" -TOOLPATH_GRP = "ToolPath" -LAYER_SRF = "LayerSurf" -SHELL_CRV = "Shell" -EXTRA_SHELL_CRV = "ExtraShell" -INFILL_CRV = "Infill" -COASTING_CRV = "Coasting" -WIPE_CRV = "Wipe" -LEAD_IN_CRV = "LeadIn" -LEAD_OUT_CRV = "LeadOut" -LINK_CRV = "Link" -FRAME_PART = "FramePart" -START_GEOM = "Start" -TOT_SHELL_TRIM_SURF = "TotalShellSurfForTrim" -SHELL_SURF = "ShellSurf" -COARSE_TRIM_SURF = "CoarseTrimSurf" -TRIM_SURF_LOOP = "TrimSurfLoop" -SURF_LOOP = "SurfLoop" -LOOP_GRP = "LoopGrp" -DIR_ARROW = "Arrow" +SLICE_LAYER = 'Slice' +CONTOUR_GRP = 'Crv' +OUTER_CRV = 'OuterCrv' +PATH_GRP = 'Path' +SOLID_GRP = 'Solid' +TOOLPATH_GRP = 'ToolPath' +LAYER_SRF = 'LayerSurf' +SHELL_CRV = 'Shell' +EXTRA_SHELL_CRV = 'ExtraShell' +INFILL_CRV = 'Infill' +COASTING_CRV = 'Coasting' +WIPE_CRV = 'Wipe' +LEAD_IN_CRV = 'LeadIn' +LEAD_OUT_CRV = 'LeadOut' +LINK_CRV = 'Link' +FRAME_PART = 'FramePart' +START_GEOM = 'Start' +TOT_SHELL_TRIM_SURF = 'TotalShellSurfForTrim' +SHELL_SURF = 'ShellSurf' +COARSE_TRIM_SURF = 'CoarseTrimSurf' +TRIM_SURF_LOOP = 'TrimSurfLoop' +SURF_LOOP = 'SurfLoop' +LOOP_GRP = 'LoopGrp' +DIR_ARROW = 'Arrow' MIN_LEN = 0.1 MIN_AREA = 0.01 @@ -41,190 +41,193 @@ MIN_RIBS_LEN = 2 MIN_INFILL_LEN = 2 -- Parametri di lavorazione -SEC_DEFAULT = "Default" -KEY_PARAMS = "Params" -KEY_CALC_SOLIDS = "CalcSolids" -KEY_SPIRAL_VASE = "SpiralVase" +SEC_DEFAULT = 'Default' +KEY_PARAMS = 'Params' +KEY_CALC_SOLIDS = 'CalcSolids' +KEY_SPIRAL_VASE = 'SpiralVase' KEY_SPIRAL_VASE_LEN = 'SpiralVaseLen' KEY_SPIRAL_VASE_INTERP_LEN = 'SpiralVaseInterpLen' -KEY_SLICING_TYPE = "SlicingType" -KEY_SLICE_STEP = "StrandH" -KEY_SHELLS_NBR = "StrandCount" -KEY_STRAND = "StrandW" -KEY_INNER_STRAND = "InnerStrandW" -KEY_STRAND_OVERLAP = "StrandOverlap" -KEY_OFFSET_SLICE = "Offset" -KEY_SP_OFFSET_ON_SLICE = "StartPointOffsetOnSlice" -KEY_STRAND_ORDER = "StrandOrder" -KEY_PRINT_ORDER = "PrintOrder" -KEY_PRINT_DIRECTION = "Direction" -KEY_TYPE = "Type" -KEY_LINK_TYPE = "LinkType" -KEY_LINK_PARAM = "LinkParam" -KEY_LINK_ZUP = "LinkZup" -KEY_SPEED = "Speed" -KEY_FEED = "Feed" -KEY_EXT_FEED = "ExtFeed" -KEY_INT_FEED = "IntFeed" -KEY_INFILL_FEED = "InfillFeed" -KEY_LEAD_IN_FEED = "LeadInFeed" -KEY_LEAD_OUT_FEED = "LeadOutFeed" -KEY_SUPPORT_FEED = "SupportFeed" -KEY_G0_FEED = "G0Feed" -KEY_MATERIAL = "Material" -KEY_LEAD_IN_TYPE = "LeadIn" -KEY_LEAD_IN_TANG_DIST = "LeadInTangDist" -KEY_LEAD_IN_ORTHO_DIST = "LeadInOrthoDist" -KEY_LEAD_OUT_TYPE = "LeadOut" -KEY_LEAD_OUT_TANG_DIST= "LeadOutTangDist" -KEY_LEAD_OUT_ORTHO_DIST= "LeadOutOrthoDist" -KEY_OFFSET_LEAD_POINT = "OffsetLeadPoint" -KEY_COASTING_LEN = "CoastingLen" -KEY_COASTING_FEED = "CoastingFeed" -KEY_WIPE_LEN = "WipeLen" -KEY_WIPE_DIR = "WipeDir" -KEY_WIPE_FEEDPU = "WipeFeedPu" -KEY_TOOL_DIAM = "ToolDiam" +KEY_SLICING_TYPE = 'SlicingType' +KEY_SLICE_STEP = 'StrandH' +KEY_SHELLS_NBR = 'StrandCount' +KEY_STRAND = 'StrandW' +KEY_INNER_STRAND = 'InnerStrandW' +KEY_STRAND_OVERLAP = 'StrandOverlap' +KEY_OFFSET_SLICE = 'Offset' +KEY_SP_OFFSET_ON_SLICE = 'StartPointOffsetOnSlice' +KEY_STRAND_ORDER = 'StrandOrder' +KEY_PRINT_ORDER = 'PrintOrder' +KEY_PRINT_DIRECTION = 'Direction' +KEY_TYPE = 'Type' +KEY_LINK_TYPE = 'LinkType' +KEY_LINK_PARAM = 'LinkParam' +KEY_LINK_ZUP = 'LinkZup' +KEY_SPEED = 'Speed' +KEY_FEED = 'Feed' +KEY_EXT_FEED = 'ExtFeed' +KEY_INT_FEED = 'IntFeed' +KEY_INFILL_FEED = 'InfillFeed' +KEY_LEAD_IN_FEED = 'LeadInFeed' +KEY_LEAD_OUT_FEED = 'LeadOutFeed' +KEY_SUPPORT_FEED = 'SupportFeed' +KEY_G0_FEED = 'G0Feed' +KEY_MATERIAL = 'Material' +KEY_LEAD_IN_TYPE = 'LeadIn' +KEY_LEAD_IN_TANG_DIST = 'LeadInTangDist' +KEY_LEAD_IN_ORTHO_DIST = 'LeadInOrthoDist' +KEY_LEAD_OUT_TYPE = 'LeadOut' +KEY_LEAD_OUT_TANG_DIST= 'LeadOutTangDist' +KEY_LEAD_OUT_ORTHO_DIST= 'LeadOutOrthoDist' +KEY_OFFSET_LEAD_POINT = 'OffsetLeadPoint' +KEY_COASTING_LEN = 'CoastingLen' +KEY_COASTING_FEED = 'CoastingFeed' +KEY_WIPE_LEN = 'WipeLen' +KEY_WIPE_DIR = 'WipeDir' +KEY_WIPE_FEEDPU = 'WipeFeedPu' +KEY_TOOL_DIAM = 'ToolDiam' KEY_MAX_STRANDH_FACTOR = 'MaxStrandHFactor' KEY_MIN_STRANDH_FACTOR = 'MinStrandHFactor' -- Solid Fill -KEY_FLOOR_NBR = "FloorCount" -KEY_FLOOR_TYPE = "FloorType" -KEY_CEIL_NBR = "CeilCount" -KEY_CEIL_TYPE = "CeilType" -KEY_FILL_TYPE = "FillType" +KEY_FLOOR_NBR = 'FloorCount' +KEY_FLOOR_TYPE = 'FloorType' +KEY_CEIL_NBR = 'CeilCount' +KEY_CEIL_TYPE = 'CeilType' +KEY_FILL_TYPE = 'FillType' -- Infill -KEY_INFILL_STRAND = "InfillStrandW" -KEY_INFILL_TYPE = "InfillType" -KEY_INFILL_DENSITY = "InfillDensity" -KEY_INFILL_LINK = "InfillLink" -KEY_INFILL_OVERLAP = "InfillOverlap" -KEY_INFILL_GRID_OVERLAP = "InfillGridOverlap" -KEY_INFILL_DIR = "InfillDirection" -KEY_INFILL_OFFSET_X = "InfillOffsetX" -KEY_INFILL_OFFSET_Y = "InfillOffsetY" -KEY_INFILL_COASTING = "InfillCoasting" -KEY_INFILL_WIPE = "InfillWipe" -KEY_INFILL_WIPE_DIR = "InfillWipeDir" +KEY_INFILL_STRAND = 'InfillStrandW' +KEY_INFILL_TYPE = 'InfillType' +KEY_INFILL_DENSITY = 'InfillDensity' +KEY_INFILL_LINK = 'InfillLink' +KEY_INFILL_OVERLAP = 'InfillOverlap' +KEY_INFILL_GRID_OVERLAP = 'InfillGridOverlap' +KEY_INFILL_DIR = 'InfillDirection' +KEY_INFILL_OFFSET_X = 'InfillOffsetX' +KEY_INFILL_OFFSET_Y = 'InfillOffsetY' +KEY_INFILL_COASTING = 'InfillCoasting' +KEY_INFILL_WIPE = 'InfillWipe' +KEY_INFILL_WIPE_DIR = 'InfillWipeDir' -- Ribs -KEY_RIBS_STRAND = "RibsStrandW" -KEY_RIBS_TYPE = "RibsType" -KEY_LIMIT_UNBDD_RIBS = "LimitUnboundedRibsWithSolid" -KEY_RIBS_OVERLAP = "RibsOverlap" +KEY_RIBS_STRAND = 'RibsStrandW' +KEY_RIBS_TYPE = 'RibsType' +KEY_LIMIT_UNBDD_RIBS = 'LimitUnboundedRibsWithSolid' +KEY_RIBS_OVERLAP = 'RibsOverlap' KEY_RIBS_STRAND_OVERLAP = 'RibsStrandOverlap' -KEY_RIBS_SHELLS_NBR = "RibsStrandCount" -KEY_RIBS_LINK = "RibsLink" -KEY_RIBS_INVERT_DIR = "RibsInvertDirection" -KEY_RIBS_INVERT_ORDER = "RibsInvertOrder" -KEY_RIBS_LEAD_IN_INVERT = "RibsLeadInInvert" -KEY_RIBS_LEAD_IN_LEN = "RibsLeadInLen" -KEY_RIBS_LEAD_OUT_INVERT = "RibsLeadOutInvert" -KEY_RIBS_LEAD_OUT_LEN = "RibsLeadOutLen" -KEY_RIBS_LEAD_OUT_COASTING = "RibsLeadOutCoasting" -KEY_RIBS_LEAD_OUT_WIPE = "RibsLeadOutWipe" -KEY_RIBS_LEAD_OUT_WIPE_DIR = "RibsLeadOutWipeDir" -KEY_RIBS_INTERS = "RibsHaveIntersections" -KEY_RIBS_SPECIAL_CASE = "RibsSpecialCase" -KEY_SPLIT_ORDER = "SplitOrder" -KEY_SPLIT_AFTER_TRIM = "RibsSplitAfterTrim" -KEY_SPLIT_AFTER_TRIM_ORDER = "RibsSplitAfterTrimOrder" -KEY_SPLIT_AFTER_TRIM_TOT = "RibsSplitAfterTrimTot" -KEY_SPLIT_ID = "SplitId" -KEY_START_RIB = "StartRib" -KEY_ORIGINAL_RIB = "OriginalRib" -KEY_LOOP_RIB = "LoopRib" -KEY_RIBS_USER_LINK = "RibWithUserLink" -KEY_RIBS_USER_LINK_SAME_SIDE = "RibUserLinkOnSameSide" -KEY_RIBS_USER_LINK_CCW = "RibUserLinkCCW" -KEY_RIBS_USER_LINK_ORDER = "RibUserLinkOrder" -KEY_RIBS_USER_LINK_TOT = "RibsUserLinkParts" -KEY_RIBS_INVERT_STRAND_ORDER = "RibsInvertStrandOrder" -KEY_RIBS_MERGE_WITH_SHELLS = "RibsMergeWithShell" -KEY_INVERT_RIBS_MERGED_SHELL_LINK = "InvertRibsMergedShellMainLink" -KEY_RIBS_LEAD_FILLET = "RibsLeadFillet" -KEY_RIBS_LINK_FILLET = "RibsLinkFillet" +KEY_RIBS_SHELLS_NBR = 'RibsStrandCount' +KEY_RIBS_LINK = 'RibsLink' +KEY_RIBS_INVERT_DIR = 'RibsInvertDirection' +KEY_RIBS_INVERT_ORDER = 'RibsInvertOrder' +KEY_RIBS_LEAD_IN_INVERT = 'RibsLeadInInvert' +KEY_RIBS_LEAD_IN_LEN = 'RibsLeadInLen' +KEY_RIBS_LEAD_OUT_INVERT = 'RibsLeadOutInvert' +KEY_RIBS_LEAD_OUT_LEN = 'RibsLeadOutLen' +KEY_RIBS_LEAD_OUT_COASTING = 'RibsLeadOutCoasting' +KEY_RIBS_LEAD_OUT_WIPE = 'RibsLeadOutWipe' +KEY_RIBS_LEAD_OUT_WIPE_DIR = 'RibsLeadOutWipeDir' +KEY_RIBS_INTERS = 'RibsHaveIntersections' +KEY_RIBS_SPECIAL_CASE = 'RibsSpecialCase' +KEY_SPLIT_ORDER = 'SplitOrder' +KEY_SPLIT_AFTER_TRIM = 'RibsSplitAfterTrim' +KEY_SPLIT_AFTER_TRIM_ORDER = 'RibsSplitAfterTrimOrder' +KEY_SPLIT_AFTER_TRIM_TOT = 'RibsSplitAfterTrimTot' +KEY_SPLIT_ID = 'SplitId' +KEY_START_RIB = 'StartRib' +KEY_ORIGINAL_RIB = 'OriginalRib' +KEY_LOOP_RIB = 'LoopRib' +KEY_RIBS_USER_LINK = 'RibWithUserLink' +KEY_RIBS_USER_LINK_SAME_SIDE = 'RibUserLinkOnSameSide' +KEY_RIBS_USER_LINK_CCW = 'RibUserLinkCCW' +KEY_RIBS_USER_LINK_ORDER = 'RibUserLinkOrder' +KEY_RIBS_USER_LINK_TOT = 'RibsUserLinkParts' +KEY_RIBS_INVERT_STRAND_ORDER = 'RibsInvertStrandOrder' +KEY_RIBS_MERGE_WITH_SHELLS = 'RibsMergeWithShell' +KEY_INVERT_RIBS_MERGED_SHELL_LINK = 'InvertRibsMergedShellMainLink' +KEY_RIBS_LEAD_FILLET = 'RibsLeadFillet' +KEY_RIBS_LINK_FILLET = 'RibsLinkFillet' -- Regioni con diverso numero di passate -KEY_SHELL_NBR_DIFF = "ShellNbrDifference" -KEY_SHELL_NBR_COASTING = "ShellNbrCoasting" -KEY_SHELL_NBR_WIPE = "ShellNbrWipe" -KEY_SHELL_NBR_WIPE_DIR = "ShellNbrWipeDir" -KEY_EXTRA_SHELL_COASTING = "ExtraShellCoasting" -KEY_EXTRA_SHELL_WIPE = "ExtraShellWipe" -KEY_EXTRA_SHELL_WIPE_DIR = "ExtraShellWipeDir" +KEY_SHELL_NBR_DIFF = 'ShellNbrDifference' +KEY_SHELL_NBR_COASTING = 'ShellNbrCoasting' +KEY_SHELL_NBR_WIPE = 'ShellNbrWipe' +KEY_SHELL_NBR_WIPE_DIR = 'ShellNbrWipeDir' +KEY_EXTRA_SHELL_COASTING = 'ExtraShellCoasting' +KEY_EXTRA_SHELL_WIPE = 'ExtraShellWipe' +KEY_EXTRA_SHELL_WIPE_DIR = 'ExtraShellWipeDir' -- Solidi ausiliari -KEY_AUX_SOLIDS_STRAND = "AuxSolidsStrandW" -KEY_AUX_SOLIDS_SHELLS_NBR = "AuxSolidsStrandCount" -KEY_AUX_SOLIDS_OVERLAP = "AuxSolidsOverlap" -KEY_AUX_SOLIDS_INFILL = "AuxSolidsInfill" -KEY_AUX_SOLIDS_PRINT_ORDER = "AuxSolidsStrandOrder" -KEY_AUX_SOLIDS_LINK_TYPE = "AuxSolidsLinkType" -KEY_AUX_SOLIDS_LINK_PARAM = "AuxSolidsLinkParam" -KEY_AUX_SOLIDS_SP_OFFSET = "AuxSolidsStartPointOffsetOnSlice" -KEY_AUX_SOLIDS_LP_OFFSET = "AuxSolidsOffsetLeadPoint" -KEY_AUX_SOLIDS_INFILL_LINK = "AuxSolidsInfillLink" -KEY_AUX_SOLIDS_DENSITY = "AuxSolidsDensity" -KEY_AUX_SOLIDS_DIR = "AuxSolidsDirection" -KEY_AUX_SOLIDS_OFFSET_X = "AuxSolidsOffsetX" -KEY_AUX_SOLIDS_OFFSET_Y = "AuxSolidsOffsetY" -KEY_AUX_SOLIDS_GRID_OVERLAP = "AuxSolidsGridOverlap" -KEY_AUX_SOLIDS_COASTING_LEN = "AuxSolidsCoastingLen" -KEY_AUX_SOLIDS_WIPE_LEN = "AuxSolidsWipeLen" -KEY_AUX_SOLIDS_WIPE_DIR = "AuxSolidsWipeDir" +KEY_AUX_SOLIDS_STRAND = 'AuxSolidsStrandW' +KEY_AUX_SOLIDS_SHELLS_NBR = 'AuxSolidsStrandCount' +KEY_AUX_SOLIDS_OVERLAP = 'AuxSolidsOverlap' +KEY_AUX_SOLIDS_INFILL = 'AuxSolidsInfill' +KEY_AUX_SOLIDS_PRINT_ORDER = 'AuxSolidsStrandOrder' +KEY_AUX_SOLIDS_LINK_TYPE = 'AuxSolidsLinkType' +KEY_AUX_SOLIDS_LINK_PARAM = 'AuxSolidsLinkParam' +KEY_AUX_SOLIDS_SP_OFFSET = 'AuxSolidsStartPointOffsetOnSlice' +KEY_AUX_SOLIDS_LP_OFFSET = 'AuxSolidsOffsetLeadPoint' +KEY_AUX_SOLIDS_INFILL_LINK = 'AuxSolidsInfillLink' +KEY_AUX_SOLIDS_DENSITY = 'AuxSolidsDensity' +KEY_AUX_SOLIDS_DIR = 'AuxSolidsDirection' +KEY_AUX_SOLIDS_OFFSET_X = 'AuxSolidsOffsetX' +KEY_AUX_SOLIDS_OFFSET_Y = 'AuxSolidsOffsetY' +KEY_AUX_SOLIDS_GRID_OVERLAP = 'AuxSolidsGridOverlap' +KEY_AUX_SOLIDS_COASTING_LEN = 'AuxSolidsCoastingLen' +KEY_AUX_SOLIDS_WIPE_LEN = 'AuxSolidsWipeLen' +KEY_AUX_SOLIDS_WIPE_DIR = 'AuxSolidsWipeDir' -- Parametri di macchina -SEC_3DPRINTING = "3dPrinting" -KEY_HORIZ_EXTR = "HorizExtrusion" -KEY_COEFF_X = "CoeffX" -KEY_COEFF_Y = "CoeffY" -KEY_SPEED_MIN = "SpeedMin" -KEY_SPEED_MAX = "SpeedMax" +SEC_3DPRINTING = '3dPrinting' +KEY_HORIZ_EXTR = 'HorizExtrusion' +KEY_COEFF_X = 'CoeffX' +KEY_COEFF_Y = 'CoeffY' +KEY_SPEED_MIN = 'SpeedMin' +KEY_SPEED_MAX = 'SpeedMax' KEY_FEED_MAX = 'FeedMax' KEY_LINEAR_APPROX = 'LinearApprox' KEY_LINEAR_TOL = 'LinearTol' -- Altre chiavi -KEY_MAX_H = "SlicingHeight" -KEY_MAX_SLICES_NBR = "MaxSlicesNumber" -KEY_SLICE_NBR = "SliceNbr" -KEY_SLICE_DIR = "SliceDir" -KEY_SLICE_POS = "SlicePos" -KEY_SLICE_DELTAZ = "DeltaZ" -KEY_ZIG_ZAG_INFILL = "ZigZagInfill" -KEY_ZIG_ZAG_DIR = "ZigZagDir" -KEY_INVERTED_CRV = "InvertedCrv" -KEY_CLOSED_CRV = "ClosedCrv" -KEY_ASSOCIATED_SURF = "AssociatedSurf" -KEY_ASSOCIATED_CRVS = "AssociatedCrvs" -KEY_ORIGINAL_SURF = "OriginalSurf" -KEY_HAS_SOLIDS = "Solids" -KEY_BOX_MIN_Z = "PartBoxMinZ" -KEY_ORIGINAL_START_POINT = "OriginalStartPoint" -KEY_FIRST_SOLID_LAY = "FirstSolidLay" -KEY_LAST_SOLID_LAY = "LastSolidLay" -KEY_ASSOCIATED_TP_CRV = "AssociatedToolPathCrv" -KEY_ASSOCIATED_P_CRV = "AssociatedPathCrv" -KEY_INTERNAL_SRF_LOOP = "InternalSrfLoop" -KEY_PREV_CRV = "PrevCrv" -KEY_NEXT_CRVS = "NextCrvs" -KEY_CRV_STRAND = "CurveStrand" -KEY_LAYER_CNT = "LayerCnt" -KEY_CRV_OFFSET = "CurveOffset" -KEY_ORIG_REF = "Orig" -KEY_WIPE_ON_CRV = "WipeOnCrv" +KEY_MAX_H = 'SlicingHeight' +KEY_MAX_SLICES_NBR = 'MaxSlicesNumber' +KEY_SLICE_NBR = 'SliceNbr' +KEY_SLICE_DIR = 'SliceDir' +KEY_SLICE_POS = 'SlicePos' +KEY_SLICE_DELTAZ = 'DeltaZ' +KEY_ZIG_ZAG_INFILL = 'ZigZagInfill' +KEY_ZIG_ZAG_DIR = 'ZigZagDir' +KEY_INVERTED_CRV = 'InvertedCrv' +KEY_CLOSED_CRV = 'ClosedCrv' +KEY_ASSOCIATED_SURF = 'AssociatedSurf' +KEY_ASSOCIATED_CRVS = 'AssociatedCrvs' +KEY_ORIGINAL_SURF = 'OriginalSurf' +KEY_HAS_SOLIDS = 'Solids' +KEY_BOX_MIN_Z = 'PartBoxMinZ' +KEY_ORIGINAL_START_POINT = 'OriginalStartPoint' +KEY_FIRST_SOLID_LAY = 'FirstSolidLay' +KEY_LAST_SOLID_LAY = 'LastSolidLay' +KEY_ASSOCIATED_TP_CRV = 'AssociatedToolPathCrv' +KEY_ASSOCIATED_P_CRV = 'AssociatedPathCrv' +KEY_INTERNAL_SRF_LOOP = 'InternalSrfLoop' +KEY_PREV_CRV = 'PrevCrv' +KEY_NEXT_CRVS = 'NextCrvs' +KEY_CRV_STRAND = 'CurveStrand' +KEY_LAYER_CNT = 'LayerCnt' +KEY_CRV_OFFSET = 'CurveOffset' +KEY_ORIG_REF = 'Orig' +KEY_WIPE_ON_CRV = 'WipeOnCrv' KEY_FEED_COEFF = 'FeedCoeff' KEY_ENTITY_NAME = 'EntityName' +KEY_MULTIPLANAR_MAX_H = 'MultiplanarMaxH' +KEY_MULTIPLANAR_MIN_H = 'MultiplanarMinH' -SLICING_TYPE = { +SLICING_TYPE = { VERTICAL = 1, DEG45_X = 2, DEG45_Y = 3, HORIZONTAL = 4, MULTIPLANAR = 5, + MULTIPLANAR_DEG45 = 6, } TYPE = { @@ -298,21 +301,21 @@ RIB_TYPE = { } --------------------------------------------------------------------- -TABLE = "Table" -PART = "Part" -ORIGINAL_SOLID = "OriginalSolid" -PRINT_SOLID = "PrintSolid" -LAY_MACH_START = "MachStart" -LAY_RIBS = "Ribs" -LAY_AUX_SOLIDS = "AuxSolids" -LAY_SHELL_NBR = "ShellNumber" -LAY_AUX = "Aux" -SPINE_CURVE = "Spine" -LAY_FRAME = "Frame" +TABLE = 'Table' +PART = 'Part' +ORIGINAL_SOLID = 'OriginalSolid' +PRINT_SOLID = 'PrintSolid' +LAY_MACH_START = 'MachStart' +LAY_RIBS = 'Ribs' +LAY_AUX_SOLIDS = 'AuxSolids' +LAY_SHELL_NBR = 'ShellNumber' +LAY_AUX = 'Aux' +SPINE_CURVE = 'Spine' +LAY_FRAME = 'Frame' VIEWPARAMS = 'ViewParams' IMPORTED_SOLID = 'ImportedSolid' RESULT_READ_PROG = 'ResultReadProg' -LAY_EXPORT = "ExportLayer" +LAY_EXPORT = 'ExportLayer' KEY_PART_ON_TABLE = 'PartOnTable' KEY_RESULT = 'Result' @@ -359,39 +362,39 @@ SLICE_ADV_TYPE = { } --------------------------------------------------------------------- -RIBS_GRP = "Ribs" -RIBS_CRV = "Rib" -RIBS_LOOP_GRP = "RibsLoops" +RIBS_GRP = 'Ribs' +RIBS_CRV = 'Rib' +RIBS_LOOP_GRP = 'RibsLoops' -SHELL_NBR_GRP = "ShellNbrRegions" -SHELL_NBR_CRV = "ShellNbrRegion" -SHELL_NBR_SURF = "ShellNbrSurf" +SHELL_NBR_GRP = 'ShellNbrRegions' +SHELL_NBR_CRV = 'ShellNbrRegion' +SHELL_NBR_SURF = 'ShellNbrSurf' -AUX_SOLIDS_GRP = "AuxSolids" -AUX_SOLIDS_INFILL_GRP = "InfillAuxSolids" -AUX_SOLIDS_CRV = "AuxSolid" -AUX_SOLIDS_INFILL_CRV = "InfillAuxSolid" -AUX_SOLIDS_SRF = "SrfAuxSolid" +AUX_SOLIDS_GRP = 'AuxSolids' +AUX_SOLIDS_INFILL_GRP = 'InfillAuxSolids' +AUX_SOLIDS_CRV = 'AuxSolid' +AUX_SOLIDS_INFILL_CRV = 'InfillAuxSolid' +AUX_SOLIDS_SRF = 'SrfAuxSolid' -INFILL_GRP = "Infill" -INFILL_CRV = "InfillCrv" +INFILL_GRP = 'Infill' +INFILL_CRV = 'InfillCrv' --------------------------------------------------------------------- -- parametri calcolo tempi, F ed S -LAY_TFSCALC = "TFSCalc" -KEY_TMIN = "TMin" -KEY_TTRG = "TTrg" -KEY_TMAX = "TMax" -KEY_FMIN = "FMin" -KEY_FTRG = "FTrg" -KEY_FMAX = "FMax" -KEY_TCUR = "TCur" -KEY_FCUR = "FCur" -KEY_LENGTH = "Length" -KEY_SLICEID = "SliceId" -KEY_MASS = "PrintMass" -KEY_MF = "MF" -KEY_TOTAREA = "TotArea" +LAY_TFSCALC = 'TFSCalc' +KEY_TMIN = 'TMin' +KEY_TTRG = 'TTrg' +KEY_TMAX = 'TMax' +KEY_FMIN = 'FMin' +KEY_FTRG = 'FTrg' +KEY_FMAX = 'FMax' +KEY_TCUR = 'TCur' +KEY_FCUR = 'FCur' +KEY_LENGTH = 'Length' +KEY_SLICEID = 'SliceId' +KEY_MASS = 'PrintMass' +KEY_MF = 'MF' +KEY_TOTAREA = 'TotArea' --------------------------------------------------------------------- return AddManData diff --git a/LuaLibs/CalcPaths.lua b/LuaLibs/CalcPaths.lua index 359eb2f..5e418eb 100644 --- a/LuaLibs/CalcPaths.lua +++ b/LuaLibs/CalcPaths.lua @@ -4344,7 +4344,7 @@ function CalcPaths.Exec( nPartId) s_nCurrIdx = nIdx - if nSlicingType == SLICING_TYPE.MULTIPLANAR then + if nSlicingType == SLICING_TYPE.MULTIPLANAR or nSlicingType == SLICING_TYPE.MULTIPLANAR_DEG45 then s_vtSlicing = EgtGetInfo( vLayIds[nIdx], KEY_SLICE_DIR, 'v') end diff --git a/LuaLibs/CalcSlices.lua b/LuaLibs/CalcSlices.lua index e5e6831..4573b55 100644 --- a/LuaLibs/CalcSlices.lua +++ b/LuaLibs/CalcSlices.lua @@ -56,7 +56,7 @@ local function ComputeSlicingData( vIds, vtSlicing, dSliceStep, dMaxH, nMaxSlice end --------------------------------------------------------------------- -local function ComputeMultiplanarSlicingData( dSliceStep, nMaxSlicesNbr) +local function ComputeMultiplanarSlicingData( dSliceStep, nMaxSlicesNbr, nSlicingType) -- le direzioni e i valori di slicing sono le normali e i punti che definiscono i piani di slicing e vengono calcolati sulla curva "Spine" -- recupero la curva guida ( è la prima nel gruppo aux con info NameEntity = Spine oppure quella con nome Spine) @@ -76,24 +76,25 @@ local function ComputeMultiplanarSlicingData( dSliceStep, nMaxSlicesNbr) EgtOutBox( "No spine for multiplanar slicing", 'Error', 'ERROR') return nil end - - -- verifico che la spina parta nell'origine con direzione Z_AX - local ptS = EgtSP( nSpineId, GDB_ID.ROOT) - local vtS = EgtSV( nSpineId, GDB_ID.ROOT) - if abs( ptS:getZ()) > GEO.EPS_SMALL then - EgtOutLog( 'Error : spine does not start on table') - EgtOutBox( "Spine not valid for multiplanar slicing", 'Error', 'ERROR') - return nil - elseif not AreSameVectorApprox( vtS, Z_AX()) then - EgtOutLog( 'Error : spine start direction is not vertical') - EgtOutBox( "Spine not valid for multiplanar slicing", 'Error', 'ERROR') - return nil + + if nSlicingType == SLICING_TYPE.MULTIPLANAR then + -- verifico che la spina parta nell'origine con direzione Z_AX + local ptS = EgtSP( nSpineId, GDB_ID.ROOT) + local vtS = EgtSV( nSpineId, GDB_ID.ROOT) + if abs( ptS:getZ()) > GEO.EPS_SMALL then + EgtOutLog( 'Error : spine does not start on table') + EgtOutBox( "Spine not valid for multiplanar slicing", 'Error', 'ERROR') + return nil + elseif not AreSameVectorApprox( vtS, Z_AX()) then + EgtOutLog( 'Error : spine start direction is not vertical') + EgtOutBox( "Spine not valid for multiplanar slicing", 'Error', 'ERROR') + return nil + end end local vSlicingDir = {} local vSlicingPnt = {} -- ciclo sulla curva - local nCnt = 0 local dCrvLen = EgtCurveLength( nSpineId) for i = 0, nMaxSlicesNbr - 1 do local dCurrLen = i * dSliceStep @@ -101,12 +102,18 @@ local function ComputeMultiplanarSlicingData( dSliceStep, nMaxSlicesNbr) break end local dU = EgtCurveParamAtLength( nSpineId, dCurrLen) - vSlicingDir[i+1] = EgtUV( nSpineId, dU, -1, GDB_ID.ROOT) + local vtTang = EgtUV( nSpineId, dU, -1, GDB_ID.ROOT) + if nSlicingType == SLICING_TYPE.MULTIPLANAR_DEG45 then + local vtOrth = VectorFromRotated( vtTang, Z_AX(), -90) + vtTang:rotate( vtOrth, 45) + end + vSlicingDir[i+1] = vtTang vSlicingPnt[i+1] = EgtUP( nSpineId, dU, GDB_ID.ROOT) end return vSlicingPnt, vSlicingDir end + -------------------------------------------------------------------- local function ComputeMaxH( vIds, vtSlicing, dSliceStep) @@ -842,7 +849,7 @@ local function SlicingNoSolid( nRibsLay, nSlicingType, dMaxH, dSliceStep, vSlici local dDeltaZ = EgtIf( i == 1, DELTAZ, 0) local ptSlicing local vtSlicing - if nSlicingType == SLICING_TYPE.MULTIPLANAR then + if nSlicingType == SLICING_TYPE.MULTIPLANAR or nSlicingType == SLICING_TYPE.MULTIPLANAR_DEG45 then vtSlicing = vtSlicing[i] ptSlicing = vSlicingVal[i] else @@ -857,7 +864,7 @@ local function SlicingNoSolid( nRibsLay, nSlicingType, dMaxH, dSliceStep, vSlici local nResultLay = SliceStm( vIds, nLayId, vtSlicing, ptSlicing, TYPE.RIB, RIBS_CRV, RIBS_GRP, tabParams) -- se slicing multplanare verifico altezza massima - if nSlicingType == SLICING_TYPE.MULTIPLANAR and dMaxH < GEO.INFINITO then + if ( nSlicingType == SLICING_TYPE.MULTIPLANAR or nSlicingType == SLICING_TYPE.MULTIPLANAR_DEG45) and dMaxH < GEO.INFINITO then local b3Box = EgtGetBBoxGlob( nResultLay, GDB_BB.STANDARD) local ptMax = b3Box:getMax() + dSliceStep * vtSlicing if ptMax:getZ() > dMaxH + GEO.EPS_SMALL then @@ -928,9 +935,10 @@ local function VerifyMultiPlanarStrand() end -- ciclo sui piani di slicing calcolati - local vtSlicePrev = EgtGetInfo( vLayers[1], KEY_SLICE_DIR, 'v') - local ptSlicePrev = EgtGetInfo( vLayers[1], KEY_SLICE_POS, 'p') + dSliceStep * vtSlicePrev - for i = 2, #vLayers do + local vtSlicePrev = V_NULL() + local ptSlicePrev = ORIG() + local bFirst = true + for i = 1, #vLayers do -- recupero il piano corrente local vtSlice = EgtGetInfo( vLayers[i], KEY_SLICE_DIR, 'v') @@ -954,25 +962,41 @@ local function VerifyMultiPlanarStrand() local vAuxSolidsCrv = EgtGetNameInGroup( nAuxSolidsGrp, AUX_SOLIDS_CRV .. '*') or {} EgtJoinTables( vCrvs, vAuxSolidsCrv) - -- verifico la distanza dal piano precedente lungo vtSlice - for j = 1, #vCrvs do - local _, dE = EgtCurveDomain( vCrvs[j]) - for dU = 0, dE do - local ptCurr = EgtUP( vCrvs[j], dU, GDB_ID.ROOT) + dSliceStep * vtSlice - local dDist = ( ptCurr - ptSlicePrev) * vtSlicePrev / dCosAng - if dDist < dMinStrand - GEO.EPS_SMALL or dDist > dMaxStrand + GEO.EPS_SMALL then - EgtOutLog( 'Error on layer ' .. EgtNumToString( i) .. ' : strand height (' .. EgtNumToString( dDist) .. ') outside valid range (' .. EgtNumToString( dMinStrand) .. - ' - ' .. EgtNumToString( dMaxStrand) .. ')') - EgtOutBox( 'Strand height value ' .. EgtNumToString( dDist) .. ' in layer ' .. EgtNumToString( i) .. ' is outside valid range (' .. EgtNumToString( dMinStrand) .. - ' - ' .. EgtNumToString( dMaxStrand) .. ')', 'Error', 'ERROR') - return false + if #vCrvs > 0 and not bFirst then + -- verifico la distanza dal piano precedente lungo vtSlice + local dMinDist = GEO.INFINITO + local dMaxDist = - GEO.INFINITO + for j = 1, #vCrvs do + local _, dE = EgtCurveDomain( vCrvs[j]) + for dU = 0, dE do + local ptCurr = EgtUP( vCrvs[j], dU, GDB_ID.ROOT) + dSliceStep * vtSlice + local dDist = ( ptCurr - ptSlicePrev) * vtSlicePrev / dCosAng + if dDist < dMinStrand - GEO.EPS_SMALL or dDist > dMaxStrand + GEO.EPS_SMALL then + EgtOutLog( 'Error on layer ' .. EgtNumToString( i) .. ' : strand height (' .. EgtNumToString( dDist) .. ') outside valid range (' .. EgtNumToString( dMinStrand) .. + ' - ' .. EgtNumToString( dMaxStrand) .. ')') + EgtOutBox( 'Strand height value ' .. EgtNumToString( dDist) .. ' in layer ' .. EgtNumToString( i) .. ' is outside valid range (' .. EgtNumToString( dMinStrand) .. + ' - ' .. EgtNumToString( dMaxStrand) .. ')', 'Error', 'ERROR') + return false + end + + if dDist < dMinDist then + dMinDist = dDist + end + if dDist > dMaxDist then + dMaxDist = dDist + end end end + EgtSetInfo( vLayers[i], KEY_MULTIPLANAR_MAX_H, dMaxDist) + EgtSetInfo( vLayers[i], KEY_MULTIPLANAR_MIN_H, dMinDist) end -- aggiorno per layer successivo vtSlicePrev = vtSlice ptSlicePrev = ptSlice + if #vCrvs > 0 then + bFirst = false + end end return true @@ -983,7 +1007,7 @@ local function SlicingWithSolid( nStmId, nSlicingType, dMaxH, vSlicingVal, vSlic -- calcolo delle intersezioni local nLayId, nCnt - if nSlicingType ~= SLICING_TYPE.MULTIPLANAR then + if nSlicingType ~= SLICING_TYPE.MULTIPLANAR and nSlicingType ~= SLICING_TYPE.MULTIPLANAR_DEG45 then if EgtProcessEvents( 1, 0) == 1 then return false end nLayId, nCnt = EgtParPlanesSurfTmInters( ORIG(), vSlicingDir[1], vSlicingVal, nStmId, s_nPartId, GDB_RT.GLOB, TOLER) if EgtProcessEvents( 100, 0) == 1 then return false end @@ -1008,7 +1032,7 @@ local function SlicingWithSolid( nStmId, nSlicingType, dMaxH, vSlicingVal, vSlic local dDeltaZ = EgtIf( nLayCnt == 1, DELTAZ, 0) local ptSlicing local vtSlicing - if nSlicingType == SLICING_TYPE.MULTIPLANAR then + if nSlicingType == SLICING_TYPE.MULTIPLANAR or nSlicingType == SLICING_TYPE.MULTIPLANAR_DEG45 then -- nel caso multiplanare sono i dati di slicing vtSlicing = vSlicingDir[nLayCnt] ptSlicing = vSlicingVal[nLayCnt] @@ -1053,12 +1077,6 @@ local function SlicingWithSolid( nStmId, nSlicingType, dMaxH, vSlicingVal, vSlic local vClosedId = {} local vOpenId = {} nId = EgtGetFirstInGroup( nLayId) - - -- se slicing del solido aggiorno i valori dei layer estremi che lo contengono - if nId then - if not nFirstSolidLay then nFirstSolidLay = nLayCnt end - nLastSolidLay = nLayCnt - end while nId do if EgtGetType( nId) == GDB_TY.GEO_POINT or EgtGetType( nId) == GDB_TY.SRF_MESH then @@ -1139,6 +1157,11 @@ local function SlicingWithSolid( nStmId, nSlicingType, dMaxH, vSlicingVal, vSlic local nSurfFR, nSrfNbr = EgtSurfFlatRegion( nLayId, vClosedId) if nSurfFR then + + -- se slicing del solido valido aggiorno i valori dei layer estremi che lo contengono + if not nFirstSolidLay then nFirstSolidLay = nLayCnt end + nLastSolidLay = nLayCnt + -- verifico orientamento della normale local vtN = EgtSurfFrNormVersor( nSurfFR, GDB_ID.ROOT) if AreOppositeVectorApprox( vtN, vtSlicing) then @@ -1230,6 +1253,7 @@ local function SlicingWithSolid( nStmId, nSlicingType, dMaxH, vSlicingVal, vSlic EgtOutLog( 'Error : hole in solid (layer '.. EgtNumToString( nLayCnt) ..') - CalcSlices') table.insert( s_vErr, nLayCnt) end + else local bErr = true @@ -1281,7 +1305,7 @@ local function SlicingWithSolid( nStmId, nSlicingType, dMaxH, vSlicingVal, vSlic local bSpiralVase = EgtGetInfo( s_nPartId, KEY_SPIRAL_VASE, 'b') or false if not bSpiralVase then -- infill - if nSlicingType ~= SLICING_TYPE.MULTIPLANAR then + if nSlicingType ~= SLICING_TYPE.MULTIPLANAR and nSlicingType ~= SLICING_TYPE.MULTIPLANAR_DEG45 then PrepareInfill( nStmId, vSlicingDir[1]) end if EgtProcessEvents( EgtIf( PRINT, 100, 0) + ( nCnt + 6) / nCounterTot * 100, 0) == 1 then return false end @@ -1294,7 +1318,7 @@ local function SlicingWithSolid( nStmId, nSlicingType, dMaxH, vSlicingVal, vSlic -- solidi ausiliari local nAuxSolidsLay = EgtGetFirstNameInGroup( s_nPartId, LAY_AUX_SOLIDS) SlicingExtraObjects( nAuxSolidsLay, TYPE.AUX_SOLID, AUX_SOLIDS_CRV, AUX_SOLIDS_GRP) - if nSlicingType ~= SLICING_TYPE.MULTIPLANAR then + if nSlicingType ~= SLICING_TYPE.MULTIPLANAR and nSlicingType ~= SLICING_TYPE.MULTIPLANAR_DEG45 then PrepareAuxSolidsInfill( nAuxSolidsLay, vSlicingDir[1]) end if EgtProcessEvents( EgtIf( PRINT, 100, 0) + ( nCnt + 12) / nCounterTot * 100, 0) == 1 then return false end @@ -1332,7 +1356,7 @@ local function SlicingWithSolid( nStmId, nSlicingType, dMaxH, vSlicingVal, vSlic end -- se multiplanare verifico strand massimo e minimo - if nSlicingType == SLICING_TYPE.MULTIPLANAR then + if nSlicingType == SLICING_TYPE.MULTIPLANAR or nSlicingType == SLICING_TYPE.MULTIPLANAR_DEG45 then if not VerifyMultiPlanarStrand() then return false end @@ -1361,7 +1385,7 @@ function CalcSlices.Exec( nPartId, nStmId) vtSlicing = VectorFromSpherical( 1, 45, dHorAng) elseif nSlicingType == SLICING_TYPE.HORIZONTAL then vtSlicing = X_AX() - elseif nSlicingType == SLICING_TYPE.MULTIPLANAR then + elseif nSlicingType == SLICING_TYPE.MULTIPLANAR or nSlicingType == SLICING_TYPE.MULTIPLANAR_DEG45 then -- la direzione può cambiare da un piano all'altro vtSlicing = Z_AX() end @@ -1409,8 +1433,8 @@ function CalcSlices.Exec( nPartId, nStmId) local dMaxH = ComputeMaxH( vRefIds, vtSlicing, dSliceStep) local vSlicingVal = {} local vSlicingDir = {} - if nSlicingType == SLICING_TYPE.MULTIPLANAR then - vSlicingVal, vSlicingDir = ComputeMultiplanarSlicingData( dSliceStep, nMaxSlicesNbr) + if nSlicingType == SLICING_TYPE.MULTIPLANAR or nSlicingType == SLICING_TYPE.MULTIPLANAR_DEG45 then + vSlicingVal, vSlicingDir = ComputeMultiplanarSlicingData( dSliceStep, nMaxSlicesNbr, nSlicingType) else vSlicingVal, vSlicingDir = ComputeSlicingData( vRefIds, vtSlicing, dSliceStep, dMaxH, nMaxSlicesNbr) end diff --git a/LuaLibs/CalcToolPath.lua b/LuaLibs/CalcToolPath.lua index 446a9b8..8fcd853 100644 --- a/LuaLibs/CalcToolPath.lua +++ b/LuaLibs/CalcToolPath.lua @@ -96,25 +96,33 @@ local function AddZCorrection( LayerParams) local nSlicingType = EgtGetInfo( s_nPartId, KEY_SLICING_TYPE, 'i') -- 1) correzione per il pezzo - local dHBox = EgtGetInfo( s_nPartId, KEY_BOX_MIN_Z, 'i') or 0 + local dHBox = EgtGetInfo( s_nPartId, KEY_BOX_MIN_Z, 'd') or 0 local dCorrZ = 0 -- se slicing multiplanare vtSlicing cambia ad ogni layer quindi la correzione deve essere calcolata sul singolo layer - if nSlicingType == SLICING_TYPE.MULTIPLANAR then + if nSlicingType == SLICING_TYPE.MULTIPLANAR or nSlicingType == SLICING_TYPE.MULTIPLANAR_DEG45 then + for i = 1, #vLayIds do -- calcolo i valori legati a vtSlicing per il layer corrente local vtSlicing = EgtGetInfo( vLayIds[i], KEY_SLICE_DIR, 'v') local dNxy = sqrt( vtSlicing:getX() * vtSlicing:getX() + vtSlicing:getY() * vtSlicing:getY()) local dNz = vtSlicing:getZ() - -- altezza necessaria per lo strand non serve perchè l'altezza viene adattata lungo il percorso - -- altezza necessaria per il tool - local dHTool = LayerParams.dTDiam / 2 * dNxy - -- altezza disponibile local b3Layer = ComputeToolPathBox( vLayIds[i]) - local dHDisp = b3Layer:getMin():getZ() - max( dHBox, 0) - - local dCurrCorrZ = max( 0, dHTool - dHDisp) - dCorrZ = max( dCorrZ, dCurrCorrZ) + if not b3Layer:isEmpty() then + -- altezza necessaria per lo strand + local dHStrand = 0 + if nSlicingType == SLICING_TYPE.MULTIPLANAR_DEG45 then + -- nel caso multiplanar con partenza verticale l'altezza necessaria per lo strand non serve perchè l'altezza viene adattata lungo il percorso + -- nel caso multiplanar 45° si considera come altezza strand quella settata nei parametri visto che varia lungo il percorso ( euristico) + dHStrand = 0.5 * LayerParams.dStrand * dNxy + LayerParams.dLayHeight * dNz + end + -- altezza necessaria per il tool + local dHTool = LayerParams.dTDiam / 2 * dNxy + -- altezza disponibile + local dHDisp = b3Layer:getMin():getZ() - max( dHBox, 0) + local dCurrCorrZ = max( 0, max( dHStrand, dHTool) - dHDisp) + dCorrZ = max( dCorrZ, dCurrCorrZ) + end end -- se slicing standard la correzione può essere calcolata sull'intero pezzo @@ -150,13 +158,13 @@ local function AddZCorrection( LayerParams) -- 2) correzione per i wipe -- altezza minima necessaria per i wipe. Se slicing multiplanare l'altezza minima per il wipe cambia ad ogni layer, altrimenti è un valore comune local dHMinWipe - if nSlicingType ~= SLICING_TYPE.MULTIPLANAR then + if nSlicingType ~= SLICING_TYPE.MULTIPLANAR and nSlicingType ~= SLICING_TYPE.MULTIPLANAR_DEG45 then local dNxy = sqrt( LayerParams.vtSlicing:getX() * LayerParams.vtSlicing:getX() + LayerParams.vtSlicing:getY() * LayerParams.vtSlicing:getY()) dHMinWipe = LayerParams.dTDiam / 2 * dNxy + max( dHBox, 0) + s_dHSafeWipe end for i = 1, #vLayIds do - if nSlicingType == SLICING_TYPE.MULTIPLANAR then + if nSlicingType == SLICING_TYPE.MULTIPLANAR or nSlicingType == SLICING_TYPE.MULTIPLANAR_DEG45 then local vtSlicing = EgtGetInfo( vLayIds[i], KEY_SLICE_DIR, 'v') local dNxy = sqrt( vtSlicing:getX() * vtSlicing:getX() + vtSlicing:getY() * vtSlicing:getY()) dHMinWipe = LayerParams.dTDiam / 2 * dNxy + max( dHBox, 0) + s_dHSafeWipe @@ -2333,7 +2341,7 @@ local function SpiralVaseFull( vLayIds, LayerParams) -- gestione speciale dei primi layers per gestione dell'altezza e feed local nSlicingType = EgtGetInfo( s_nPartId, KEY_SLICING_TYPE, 'i') - if nSlicingType == SLICING_TYPE.MULTIPLANAR then + if nSlicingType == SLICING_TYPE.MULTIPLANAR or nSlicingType == SLICING_TYPE.MULTIPLANAR_DEG45 then return SpiralVaseFullMultiPlanar( vLayIds, LayerParams) end @@ -2749,7 +2757,7 @@ local function SpiralVasePartial( vLayIds, LayerParams) -- la continuità tra i layers viene risolta sul tratto finale del layer percedente local nSlicingType = EgtGetInfo( s_nPartId, KEY_SLICING_TYPE, 'i') - if nSlicingType == SLICING_TYPE.MULTIPLANAR then + if nSlicingType == SLICING_TYPE.MULTIPLANAR or nSlicingType == SLICING_TYPE.MULTIPLANAR_DEG45 then return SpiralVasePartialMultiPlanar( vLayIds, LayerParams) end @@ -2960,7 +2968,7 @@ function CalcToolPath.Exec( nPartId) s_nCurrIdx = nIdx - if nSlicingType == SLICING_TYPE.MULTIPLANAR then + if nSlicingType == SLICING_TYPE.MULTIPLANAR or nSlicingType == SLICING_TYPE.MULTIPLANAR_DEG45 then LayerParams.vtSlicing = EgtGetInfo( vLayIds[nIdx], KEY_SLICE_DIR, 'v') end diff --git a/LuaLibs/RunCalcSolids.lua b/LuaLibs/RunCalcSolids.lua index d5b991a..003e25b 100644 --- a/LuaLibs/RunCalcSolids.lua +++ b/LuaLibs/RunCalcSolids.lua @@ -26,6 +26,7 @@ local function GetLayerParamsForSolidCalc( nPartId) LayerParams.dLayHeight = EgtGetInfo( nPartId, KEY_SLICE_STEP, 'd') LayerParams.vtSlicing = EgtGetInfo( nPartId, KEY_SLICE_DIR, 'v') or EgtGetInfo( nPartId, 'SlicingDir', 'v') LayerParams.dStrand = EgtGetInfo( nPartId, KEY_STRAND, 'd') + LayerParams.vtCorr = EgtGetInfo( nPartId, KEY_MOVED_PART2, 'v') or V_NULL() return LayerParams end @@ -427,21 +428,21 @@ end -------------------------------------------------------------------- ------------------------- MULTIPLANAR ------------------------------ -------------------------------------------------------------------- -local function CreateMultiPlanarSolids( vIds, nSolidGrpId, LayerParams, nLayerId) +local function CreateMultiPlanarSolids( vIds, nSolidGrpId, LayerParams, nLayerId, bFirst) -- creo solidi standard con spessore massimo ammesso ( tranne nel primo layer che viene fatto ad altezza costante) local nSliceNbr = EgtGetInfo( nLayerId, KEY_SLICE_NBR, 'i') - local dH = EgtIf( nSliceNbr == 1, LayerParams.dLayHeight, s_dMultiPlanarH) + local dH = EgtIf( bFirst, LayerParams.dLayHeight, s_dMultiPlanarH) for i = 1, #vIds do CreateSolidFromCurve( vIds[i], nSolidGrpId, LayerParams, nSliceNbr, dH) end -- deformo i solidi per rispettare l'altezza reale della passata - if nSliceNbr > 1 then - local ptSlicing = EgtGetInfo( nLayerId, KEY_SLICE_POS, 'p') + LayerParams.vtSlicing * LayerParams.dLayHeight + if not bFirst then + local ptSlicing = EgtGetInfo( nLayerId, KEY_SLICE_POS, 'p') + LayerParams.vtSlicing * LayerParams.dLayHeight + LayerParams.vtCorr local nPrevLayerId = EgtGetPrev( nLayerId) - local vtSlicingPrev = EgtGetInfo( nPrevLayerId, KEY_SLICE_DIR, 'v') - local ptSlicingPrev = EgtGetInfo( nPrevLayerId, KEY_SLICE_POS, 'p') + vtSlicingPrev * LayerParams.dLayHeight + local vtSlicingPrev = EgtGetInfo( nPrevLayerId, KEY_SLICE_DIR, 'v') + local ptSlicingPrev = EgtGetInfo( nPrevLayerId, KEY_SLICE_POS, 'p') + vtSlicingPrev * LayerParams.dLayHeight + LayerParams.vtCorr local dCosAng = vtSlicingPrev * LayerParams.vtSlicing local vSolids = EgtGetAllInGroup( nSolidGrpId) @@ -463,11 +464,11 @@ local function CreateMultiPlanarSolids( vIds, nSolidGrpId, LayerParams, nLayerId end --------------------------------------------------------------------- -local function CreatePartialSpiralVaseMultiPlanarSolids( vIds, nSolidGrpId, LayerParams, nLayerId) +local function CreatePartialSpiralVaseMultiPlanarSolids( vIds, nSolidGrpId, LayerParams, nLayerId, bFirst) -- 1) le prime curve sono solidi multiplanari standard for i = 1, #vIds - 1 do - CreateMultiPlanarSolids( { vIds[i]}, nSolidGrpId, LayerParams, nLayerId) + CreateMultiPlanarSolids( { vIds[i]}, nSolidGrpId, LayerParams, nLayerId, bFirst) end -- 2) l'ultima curva è il tratto che si alza fino al layer successivo @@ -478,7 +479,7 @@ local function CreatePartialSpiralVaseMultiPlanarSolids( vIds, nSolidGrpId, Laye -- appiattisco la curva ( proiezione obliqua sul piano corrente lungo vtSlicing del piano successivo) local nNextLayerId = EgtGetNext( nLayerId) local vtSlicingNext = EgtGetInfo( nNextLayerId, KEY_SLICE_DIR, 'v') - local ptSlicing = EgtGetInfo( nLayerId, KEY_SLICE_POS, 'p') + LayerParams.dLayHeight * LayerParams.vtSlicing + local ptSlicing = EgtGetInfo( nLayerId, KEY_SLICE_POS, 'p') + LayerParams.dLayHeight * LayerParams.vtSlicing + LayerParams.vtCorr local nProjCrv = EgtCopyGlob( vIds[#vIds], nGrpTmp) local _, dE = EgtCurveDomain( nProjCrv) for dU = 0, dE do @@ -549,11 +550,11 @@ local function CreatePartialSpiralVaseMultiPlanarSolids( vIds, nSolidGrpId, Laye local nSliceNbr = EgtGetInfo( nLayerId, KEY_SLICE_NBR, 'i') if nSliceNbr == 1 then vtSlicingPrev = LayerParams.vtSlicing - ptSlicingPrev = ptSlicing - LayerParams.dLayHeight * LayerParams.vtSlicing + ptSlicingPrev = EgtGetInfo( nLayerId, KEY_SLICE_POS, 'p') + LayerParams.vtCorr else local nPrevLayId = EgtGetPrev( nLayerId) vtSlicingPrev = EgtGetInfo( nPrevLayId, KEY_SLICE_DIR, 'v') - ptSlicingPrev = EgtGetInfo( nPrevLayId, KEY_SLICE_POS, 'p') + vtSlicingPrev * LayerParams.dLayHeight + ptSlicingPrev = EgtGetInfo( nPrevLayId, KEY_SLICE_POS, 'p') + vtSlicingPrev * LayerParams.dLayHeight + LayerParams.vtCorr end local dCosAng = vtSlicingPrev * LayerParams.vtSlicing @@ -596,12 +597,12 @@ end local function CreateFullSpiralVaseMultiPlanarSolids( vIds, nSolidGrpId, LayerParams, nLayerId) local nSliceNbr = EgtGetInfo( nLayerId, KEY_SLICE_NBR, 'i') - local ptSlicing = EgtGetInfo( nLayerId, KEY_SLICE_POS, 'p') + LayerParams.dLayHeight * LayerParams.vtSlicing + local ptSlicing = EgtGetInfo( nLayerId, KEY_SLICE_POS, 'p') + LayerParams.dLayHeight * LayerParams.vtSlicing + LayerParams.vtCorr -- recupero il piano precedente e il suo toolpath local nPrevLayerId = EgtGetPrev( nLayerId) local vtSlicingPrev = EgtGetInfo( nPrevLayerId, KEY_SLICE_DIR, 'v') - local ptSlicingPrev = EgtGetInfo( nPrevLayerId, KEY_SLICE_POS, 'p') + LayerParams.dLayHeight * vtSlicingPrev + local ptSlicingPrev = EgtGetInfo( nPrevLayerId, KEY_SLICE_POS, 'p') + LayerParams.dLayHeight * vtSlicingPrev + LayerParams.vtCorr local dCosAng = vtSlicingPrev * LayerParams.vtSlicing local nPrevCrvGrp = EgtGetFirstNameInGroup( nPrevLayerId, CONTOUR_GRP .. '*') local nPrevTPathGrp = EgtGetFirstNameInGroup( nPrevCrvGrp, TOOLPATH_GRP) @@ -715,8 +716,8 @@ local function CreateFullSpiralVaseMultiPlanarSolidsLastLayer( vIds, nSolidGrpId local nPrevLayerId = EgtGetPrev( EgtGetPrev( nLayerId)) local vtSlicingPrev = EgtGetInfo( nPrevLayerId, KEY_SLICE_DIR, 'v') - local ptSlicingPrev = EgtGetInfo( nPrevLayerId, KEY_SLICE_POS, 'p') + vtSlicingPrev * LayerParams.dLayHeight - local ptSlicing = EgtGetInfo( nLayerId, KEY_SLICE_POS, 'p') + LayerParams.vtSlicing * LayerParams.dLayHeight + local ptSlicingPrev = EgtGetInfo( nPrevLayerId, KEY_SLICE_POS, 'p') + vtSlicingPrev * LayerParams.dLayHeight + LayerParams.vtCorr + local ptSlicing = EgtGetInfo( nLayerId, KEY_SLICE_POS, 'p') + LayerParams.vtSlicing * LayerParams.dLayHeight + LayerParams.vtCorr local dCosAng = vtSlicingPrev * LayerParams.vtSlicing -- 1) curva shell @@ -828,12 +829,13 @@ function RunCalcSolids.Exec() local LayerParams = GetLayerParamsForSolidCalc( nPartId) -- se slicing multiplanare considero come altezza standard quella massima ammessa - if nSlicingType == SLICING_TYPE.MULTIPLANAR then + if nSlicingType == SLICING_TYPE.MULTIPLANAR or nSlicingType == SLICING_TYPE.MULTIPLANAR_DEG45 then local sMachIni = EgtGetCurrMachineDir() .. '\\' .. EgtGetCurrMachineName() .. '.ini' local dMaxFactor = EgtGetNumberFromIni( '3dPrinting', KEY_MAX_STRANDH_FACTOR, 2, sMachIni) s_dMultiPlanarH = min( dMaxFactor, 5) * LayerParams.dLayHeight end + local bFirst = true for nIdx = 1, #vLayIds do -- flag di interruzione perchè trovati solidi già ok @@ -860,81 +862,84 @@ function RunCalcSolids.Exec() local vIds = EgtGetAllInGroup( nTPathGrpId) - -- slicing multiplanare - if nSlicingType == SLICING_TYPE.MULTIPLANAR then - LayerParams.vtSlicing = EgtGetInfo( vLayIds[nIdx], KEY_SLICE_DIR, 'v') - - if LayerParams.bSpiralVase then - local dTransitionLen = EgtGetInfo( nPartId, KEY_SPIRAL_VASE_LEN, 'd') or 0 - -- a) spiral vase completo ( con transizione in altezza su tutto il layer) - if dTransitionLen < GEO.EPS_SMALL then - if nIdx == 1 then - -- il primo layer va gestito come uno spiral vase con transizione parziale ( curva a quota costante e ultimo tratto che si alza) - CreatePartialSpiralVaseMultiPlanarSolids( vIds, nSolidGrpId, LayerParams, vLayIds[nIdx]) - elseif nIdx == #vLayIds then - -- gestione speciale per lead out e coasting - CreateFullSpiralVaseMultiPlanarSolidsLastLayer( vIds, nSolidGrpId, LayerParams, vLayIds[nIdx]) + if #vIds > 0 then + -- slicing multiplanare + if nSlicingType == SLICING_TYPE.MULTIPLANAR or nSlicingType == SLICING_TYPE.MULTIPLANAR_DEG45 then + LayerParams.vtSlicing = EgtGetInfo( vLayIds[nIdx], KEY_SLICE_DIR, 'v') + + if LayerParams.bSpiralVase then + local dTransitionLen = EgtGetInfo( nPartId, KEY_SPIRAL_VASE_LEN, 'd') or 0 + -- a) spiral vase completo ( con transizione in altezza su tutto il layer) + if dTransitionLen < GEO.EPS_SMALL then + if bFirst then + -- il primo layer va gestito come uno spiral vase con transizione parziale ( curva a quota costante e ultimo tratto che si alza) + CreatePartialSpiralVaseMultiPlanarSolids( vIds, nSolidGrpId, LayerParams, vLayIds[nIdx], bFirst) + elseif nIdx == #vLayIds then + -- gestione speciale per lead out e coasting + CreateFullSpiralVaseMultiPlanarSolidsLastLayer( vIds, nSolidGrpId, LayerParams, vLayIds[nIdx]) + else + CreateFullSpiralVaseMultiPlanarSolids( vIds, nSolidGrpId, LayerParams, vLayIds[nIdx]) + end + + -- b) spiral vase con transizione parziale else - CreateFullSpiralVaseMultiPlanarSolids( vIds, nSolidGrpId, LayerParams, vLayIds[nIdx]) + if nIdx == #vLayIds then + -- ultimo layer è un multiplanare standard perchè non ha tratto finale che si alza + CreateMultiPlanarSolids( vIds, nSolidGrpId, LayerParams, vLayIds[nIdx], false) + else + CreatePartialSpiralVaseMultiPlanarSolids( vIds, nSolidGrpId, LayerParams, vLayIds[nIdx], bFirst) + end end - - -- b) spiral vase con transizione parziale + -- c) multiplanare standard else - if nIdx == #vLayIds then - -- ultimo layer è un multiplanare standard perchè non ha tratto finale che si alza - CreateMultiPlanarSolids( vIds, nSolidGrpId, LayerParams, vLayIds[nIdx]) + CreateMultiPlanarSolids( vIds, nSolidGrpId, LayerParams, vLayIds[nIdx], bFirst) + end + + -- slicing standard spiral vase + elseif LayerParams.bSpiralVase then + -- i tratti di ingresso, uscita e quelli a quota costante vanno gestiti singolarmente, quelli a quota variabile vanno concatenati + local vChainedIds = {} + local vTmpIds = {} + for i = 1, #vIds do + local sName = EgtGetName( vIds[i]) + local dDelta = ( EgtEP( vIds[i], GDB_ID.ROOT) - EgtSP( vIds[i], GDB_ID.ROOT)) * LayerParams.vtSlicing + if abs( dDelta) < GEO.EPS_SMALL or sName == LEAD_IN_CRV or sName == LEAD_OUT_CRV or sName == COASTING_CRV or sName == WIPE_CRV then + -- inserisco il gruppo di tratti da concatenare e lo resetto + if #vTmpIds > 0 then + table.insert( vChainedIds, vTmpIds) + vTmpIds = {} + end + -- inserisco la curva singola corrente + table.insert( vChainedIds, { vIds[i]}) else - CreatePartialSpiralVaseMultiPlanarSolids( vIds, nSolidGrpId, LayerParams, vLayIds[nIdx]) + table.insert( vTmpIds, vIds[i]) end end - -- c) multiplanare standard + -- inserisco ultimo gruppo + if #vTmpIds > 0 then + table.insert( vChainedIds, vTmpIds) + end + + for i = 1, #vChainedIds do + if #vChainedIds[i] == 1 then + CreateSolidFromCurve( vChainedIds[i][1], nSolidGrpId, LayerParams, nSliceNbr) + else + local nNewCrv = EgtCurveCompo( nSolidGrpId, vChainedIds[i], false) + local dStrand = EgtGetInfo( vChainedIds[i][1], KEY_CRV_STRAND, 'd') or LayerParams.dStrand + EgtSetInfo( nNewCrv, KEY_CRV_STRAND, dStrand) + EgtSetInfo( nNewCrv, KEY_TYPE, TYPE.OUTER_SHELL) + CreateSolidFromCurve( nNewCrv, nSolidGrpId, LayerParams, nSliceNbr) + EgtErase( nNewCrv) + end + end + + -- slicing standard else - CreateMultiPlanarSolids( vIds, nSolidGrpId, LayerParams, vLayIds[nIdx]) - end - - -- slicing standard spiral vase - elseif LayerParams.bSpiralVase then - -- i tratti di ingresso, uscita e quelli a quota costante vanno gestiti singolarmente, quelli a quota variabile vanno concatenati - local vChainedIds = {} - local vTmpIds = {} - for i = 1, #vIds do - local sName = EgtGetName( vIds[i]) - local dDelta = ( EgtEP( vIds[i], GDB_ID.ROOT) - EgtSP( vIds[i], GDB_ID.ROOT)) * LayerParams.vtSlicing - if abs( dDelta) < GEO.EPS_SMALL or sName == LEAD_IN_CRV or sName == LEAD_OUT_CRV or sName == COASTING_CRV or sName == WIPE_CRV then - -- inserisco il gruppo di tratti da concatenare e lo resetto - if #vTmpIds > 0 then - table.insert( vChainedIds, vTmpIds) - vTmpIds = {} - end - -- inserisco la curva singola corrente - table.insert( vChainedIds, { vIds[i]}) - else - table.insert( vTmpIds, vIds[i]) + for i = 1, #vIds do + CreateSolidFromCurve( vIds[i], nSolidGrpId, LayerParams, nSliceNbr) end end - -- inserisco ultimo gruppo - if #vTmpIds > 0 then - table.insert( vChainedIds, vTmpIds) - end - - for i = 1, #vChainedIds do - if #vChainedIds[i] == 1 then - CreateSolidFromCurve( vChainedIds[i][1], nSolidGrpId, LayerParams, nSliceNbr) - else - local nNewCrv = EgtCurveCompo( nSolidGrpId, vChainedIds[i], false) - local dStrand = EgtGetInfo( vChainedIds[i][1], KEY_CRV_STRAND, 'd') or LayerParams.dStrand - EgtSetInfo( nNewCrv, KEY_CRV_STRAND, dStrand) - EgtSetInfo( nNewCrv, KEY_TYPE, TYPE.OUTER_SHELL) - CreateSolidFromCurve( nNewCrv, nSolidGrpId, LayerParams, nSliceNbr) - EgtErase( nNewCrv) - end - end - - -- slicing standard - else - for i = 1, #vIds do - CreateSolidFromCurve( vIds[i], nSolidGrpId, LayerParams, nSliceNbr) - end + bFirst = false end else bSolidsOk = true diff --git a/LuaLibs/RunPrepareExport.lua b/LuaLibs/RunPrepareExport.lua index f79e687..0d3abc5 100644 --- a/LuaLibs/RunPrepareExport.lua +++ b/LuaLibs/RunPrepareExport.lua @@ -197,7 +197,7 @@ function RunPrepareExport.Exec() EgtSetStatus( nDestGrp, GDB_ST.OFF) -- se multiplanare o spiral vase esporto direttamente i solidi altrimenti esporto le curve che verranno estruse nel visualizzatore - if nSlicingType == SLICING_TYPE.MULTIPLANAR or bSpiralVase then + if nSlicingType == SLICING_TYPE.MULTIPLANAR or nSlicingType == SLICING_TYPE.MULTIPLANAR_DEG45 or bSpiralVase then GetSolids( vSlices[i], nDestGrp) else CalcCurves( vSlices[i], nDestGrp, vtSlicing, dStrandBase) diff --git a/Version.lua b/Version.lua index cbba749..17845d7 100644 --- a/Version.lua +++ b/Version.lua @@ -1,4 +1,4 @@ -- Version.lua by Egaltech s.r.l. 2026/03/23 -- Gestione della versione di 3dPrinting -VERSION = '3.1c3' \ No newline at end of file +VERSION = '3.1d1' \ No newline at end of file