Kudos to @Curtis_Waguespack for gettting a solid start to the code.
@paul... careful what you wish for and how you word it... 
Note, the code below is in VBA so it was easier to code and can be added to a keyboard shortcut easily.
Also Note, you can see it has mod values based on plate thickness so it automatically figures out the size (I don't know of many laser cutters who would cut holes too much smaller than plate thickness, so I just made the diam slightly larger as default.
Note: It does all of the internal edge loops. So if you have internal edges that don't meet at 90, it will dogbone those too. To fix it if you run into issues with that, you can always edit the hole feature and "un-click" the points you don't want dogbones and it should remove them and their fillets without error.
Good luck!
Sub Main()
Dim oSheetMetalDoc As PartDocument
Set oSheetMetalDoc = ThisApplication.ActiveEditDocument
Dim oCompDef As SheetMetalComponentDefinition
Set oCompDef = oSheetMetalDoc.ComponentDefinition
Dim oSheetMetalFeatures As SheetMetalFeatures
Set oSheetMetalFeatures = oCompDef.Features
Dim oThickness As Double
oThickness = 0
On Error Resume Next
oThickness = oCompDef.Parameters("Thickness").Value
If oThickness = 0 Then
MsgBox ("Thickness not found in Params!" & vbLf & vbLf & "Please manually enter!")
oThickness = InputBox("Enter plate thickness in mm" & vbLf & vbLf & "[This will be used to calculate dogbone diam]", "iLogic", "0.5")
End If
On Error GoTo 0
If oThickness = 0 Then
Exit Sub
End If
oDogBoneDiamPercentOfThickness = 1.125
oFilletPercentOfDiam = 0.25
oDiam = oDogBoneDiamPercentOfThickness * oThickness
oFilletSize = oFilletPerCentOfDiam & "*" & oDiam
Dim oFace As Face
Do
Set oFace = ThisApplication.CommandManager.Pick(SelectionFilterEnum.kPartFaceFilter, "Select the top FACE")
Loop While oFace Is Nothing
Dim oRoughDogBoneSketch As Sketch
Set oRoughDogBoneSketch = oCompDef.Sketches.Add(oFace, False)
Dim oEdge As Edge
Dim oEdgeLoop As EdgeLoop
Dim oSketchPointCollection As ObjectCollection
Set oSketchPointCollection = ThisApplication.TransientObjects.CreateObjectCollection
On Error Resume Next
For Each oEdgeLoop In oFace.EdgeLoops
If oEdgeLoop.IsOuterEdgeLoop = False Then
For Each oEdge In oEdgeLoop.Edges
Set oHole1 = Nothing
Set oHole2 = Nothing
Set oHole1 = oRoughDogBoneSketch.AddByProjectingEntity(oEdge.StartVertex)
Set oHole2 = oRoughDogBoneSketch.AddByProjectingEntity(oEdge.StopVertex)
If Not oHole1 Is Nothing Then
oSketchPointCollection.Add oHole1
End If
If Not oHole2 Is Nothing Then
oSketchPointCollection.Add oHole2
End If
Next
End If
Next
On Error GoTo 0
Dim oSketchPlacementDefinition As SketchHolePlacementDefinition
Set oSketchPlacementDefinition = oCompDef.Features.HoleFeatures.CreateSketchPlacementDefinition(oSketchPointCollection)
Call oCompDef.Features.HoleFeatures.AddDrilledByThroughAllExtent(oSketchPlacementDefinition, oDiam, kPositiveExtentDirection)
'AddFillets
Dim oCircleEdges As EdgeCollection
Set oCircleEdges = ThisApplication.TransientObjects.CreateEdgeCollection
Dim oCircFace As Face
Dim oCircEdge As Edge
On Error Resume Next
For Each oEdgeLoop In oFace.EdgeLoops
If oEdgeLoop.IsOuterEdgeLoop = False Then
For Each oEdge In oEdgeLoop.Edges
If oEdge.GeometryType = kCircularArcCurve Then
For Each oCircFace In oEdge.Faces
If oCircFace.SurfaceType = kCylinderSurface Then
For Each oCircEdge In oCircFace.Edges
If oCircEdge.CurveType <> kCircleCurve Then
oCircleEdges.Add oCircEdge
End If
Next
End If
Next
End If
Next
End If
Next
On Error GoTo 0
Call oCompDef.Features.FilletFeatures.AddSimple(oCircleEdges, oFilletSize)
End Sub
--------------------------------------
Did you find this reply helpful ? If so please use the 'Accept as Solution' or 'Like' button below.