Script Editing - Tutorial 5 - Hole Recognition

This tutorial is an example on how you can speed up the program creation from existing 2D geometry with different machined holes.

Sample part :

In this sample part you can see different taped holes, counterbore and simple hole. We can recognize and classificate some of these diameter and associate related machining strategies.

For example , a inner circle of diameter 5mm , with an concentric arc of diameter 6mm, it represents a M6x1 tapped hole.

Or a 6.5mm inner diameter with a 10.5 outer circle, most probably it's a counterbore hole.

This time the script is composed by several functions , the necessary step are :

  • Recognize a certain feature ( tapped hole, counterbore , etc )
  • Associate a machining strategy to extracted recognized geometry
  • Process the machining strategy.

Holes Recognition script file

Now we create a new script file and call it "HolesRecognition".

#load "CommonFunctions.csx"

/// <summary>
/// This is the function you need to call from command line.
/// All the necessary sub-step are called here
/// </summary>
public void HoleRecognitionMain()
{
    //Recognize and associate strategies to geometries holes
    DefineHolesStrategies();

    //It run all the created strategy with method above
    RunStrategies();
}


/// <summary>
/// With this function, we recognize geometries as tapped holes 
/// or counterbored holes or just a simple drilled holes,
/// and we associate extracted geometries to a machining strategy
/// </summary>
public void DefineHolesStrategies()
{
    //
    // METRIC -
    if (Unit == MeasureUnit.Metric)
    {
        //TAPPED HOLES - (mm)
        AddStrategy(Extract2Diameter(5, 4.2, true), "TapStrategy");
        AddStrategy(Extract2Diameter(6, 5, true), "TapStrategy");
        AddStrategy(Extract2Diameter(8, 6.8, true), "TapStrategy");
        AddStrategy(Extract2Diameter(10, 8.5, true), "TapStrategy");
        AddStrategy(Extract2Diameter(12, 10.2, true), "TapStrategy");
        AddStrategy(Extract2Diameter(14, 12, true), "TapStrategy");
        AddStrategy(Extract2Diameter(16, 14, true), "TapStrategy");
        AddStrategy(Extract2Diameter(18, 15.5, true), "TapStrategy");
        AddStrategy(Extract2Diameter(20, 17.5, true), "TapStrategy");

        //Add here more case

        //COUNTERBORED HOLES - (mm)        
        AddStrategy(Extract2Diameter(6.5, 10.5, false), "CounterboreStrategy");
        AddStrategy(Extract2Diameter(10.5, 17, false), "CounterboreStrategy");

        //SIMPLE HOLE - (mm)
        AddStrategy(ExtractRangeDiameterValues(5, 22), "SimpleDrillStrategy");

    }

    //
    // IMPERIAL
    else if (Unit == MeasureUnit.Imperial)
    {

        // Add data in similar way as above but the dimension expressed in inch 

    }
}

/// <summary>
/// This strategy is called to create a TAPPED holes
/// machining from recognized geometries
/// </summary>
public void TapStrategy()
{
    // These is extracted geometry or selected geometries in viewport
    var geometries = GetSelectedGeometries();

    // I get thread data compatible with current geometry selection
    var threadData = GetThreadDataFromGeometry(geometries.FirstOrDefault());

    if (threadData == null) return;// No compatible thread data is found, exit from function.

    var tapDia = threadData.DiaMax;
    var predrillDia = threadData.PreDrillDia;
    var pitch = threadData.Pitch;

    var work = AddMachineWork(WorkType.Mill_Drilling);

    //Initialize machining work parameters
    work = InitWithCustomParameters(work);

    //Link geometry to work
    LinkGeometryToWork(work, geometries);

    //Define parameters  
    work.MillingParams.ThreadDescription = threadData.Description;
    work.MillingParams.ThreadPitch = pitch;
    work.MillingParams.DrillHoleDiameter = predrillDia;
    work.MillingParams.DepthDrill = tapDia * 3.5;
    work.MillingParams.DepthThread = tapDia * 2.5;

    //Create sub operation
    var centerDrillOp = work.AddSubOperation(SubOperationType.CenterDrilling);
    var drillOp = work.AddSubOperation(SubOperationType.Drilling);
    var tapOp = work.AddSubOperation(SubOperationType.Tapping);
}

/// <summary>
/// This strategy is called to create a COUNTERBORED holes
/// machining from recognized geometries.
/// </summary>
public void CounterboreStrategy()
{
    // These is extracted geometry or selected geometries in viewport
    var geometries = GetSelectedGeometries();

    // The geometries should be list of a couples of circles, rappresenting 
    // the outer and the inner diameter of the counterbore machining. 

    var firstCoupleOfDiameter = geometries.FirstOrDefault();

    if (firstCoupleOfDiameter.Count() != 2)
        return;

    //By convention the first circle is the bigger.
    var circleMax = firstCoupleOfDiameter.OfType<Circle>().OrderBy(c => c.Radius).First();
    var circleMin = firstCoupleOfDiameter.OfType<Circle>().OrderByDescending(c => c.Radius).First();

    var work = AddMachineWork(WorkType.Mill_Drilling);

    //Initialize machining work parameters
    work = InitWithCustomParameters(work);

    //Link geometry to work
    LinkGeometryToWork(work, geometries);

    var innerDia = circleMin.Radius * 2;
    var outerDia = circleMax.Radius * 2;

    //Define parameters  
    work.MillingParams.DrillHoleDiameter = innerDia;
    work.MillingParams.DepthDrill = innerDia * 5;
    work.MillingParams.DepthCounterbore = outerDia;

    //Create sub operation
    var centerDrillOp = work.AddSubOperation(SubOperationType.CenterDrilling);
    var drillOp = work.AddSubOperation(SubOperationType.Drilling);

    //
    // If the counterbore diameter is big, i use a roughing cycle with endmill
    if (Unit == MeasureUnit.Metric && outerDia > 16)
    {
        var endMillCounterboreOp = work.AddSubOperation(SubOperationType.Roughing);
        endMillCounterboreOp.Tool = FindRotaryTool(ToolType.MillType_EndMill, 10);

    }
    else if (Unit == MeasureUnit.Imperial && outerDia > 0.6)
    {
        var endMillCounterboreOp = work.AddSubOperation(SubOperationType.Roughing);
        endMillCounterboreOp.Tool = FindRotaryTool(ToolType.MillType_EndMill, 0.4);

    }
    else
    {
        //If the counterbore outerdia is less than 16mm or 0.6inch , i use a counterbore tool
        var counterBoreOp = work.AddSubOperation(SubOperationType.Counterbore);
    }

}

/// <summary>
/// This strategy is called to create a SIMPLE DRILLED holes
/// machining from recognized geometries.
/// </summary>
public void SimpleDrillStrategy()
{
    var geometries = GetSelectedGeometries();

    //From geometry recognizer function, i get all circles grouped by diameter.
    //For every different diameter i create a different machining work

    foreach (var groupedByDiameter in geometries)
    {
        // I get the first circle of the group to obtain the diameter value.
        var firstCircle = groupedByDiameter.FirstOrDefault() as Circle;

        if (firstCircle == null) continue;

        var diameterValue = firstCircle.Radius * 2;

        var work = AddMachineWork(WorkType.Mill_Drilling);

        LinkGeometryToWork(work, groupedByDiameter);

        work.MillingParams.DrillHoleDiameter = diameterValue;
        work.MillingParams.DepthDrill = diameterValue * 5;

        var centerDrillOp = work.AddSubOperation(SubOperationType.CenterDrilling);
        var drillOp = work.AddSubOperation(SubOperationType.Drilling);

        drillOp.Tool = FindRotaryTool(ToolType.DrillType_Drill, diameterValue);
    }
}

Once the script is launched , this will be the project status, 15 operations are created automatically.

Note :

The effective holes depths must be adjusted manually , since there is no way to extract this information from a 2D drawing.

results matching ""

    No results matching ""