By Adam Nagy
Creating a Sweep Feature is usually quite straight forward. However, you can run into some issues - like the one I'm going to talk about now.
If you have two sketches, one used as the Profile (Sketch2) and one used as the Path (Sketch1), then if they are connected through a sketch point then the CreatePath() function will use all the entities from both sketches and your swept surface creation will fail. Here is the debug message from the below code:
Sketch2
-4.9; 3.29922145229642; .15
-4.9; -3.29922145229644; .15
Sketch1
-4.9; -3.29922145229644; .15
-5.05; -3.29922145229644; .15
Sketch1
-5.05; -3.29922145229644; .15
-5.35; -3.29922145229644; .45
Sketch1
-5.35; -3.29922145229644; .45
-5.35; -3.29922145229644; 2.35
You'll find the same behaviour in the UI: if you're trying to select the entities for the Path first and click an entity in Sketch1, then not only the Sketch1 entities will be selected for the Path, but also the Sketch2 entity which is connected to a Sketch1 entity through a sketch point:
If I select the Profile first by clicking the Sketch2 entity, and then try to select the Path, then Inventor is clever enough not to use the Profile entity as part of the Path:
When doing things programmatically, we need to add a similar logic to our code: remove the Sketch2 entity from the Path.
The easiest way to do that is to use CreatePath() to collect all the entities for the Path, then collect from that all the entities which are inside Sketch1. Then you can call CreateSpecifiedPath() to create a path that is using the provided entities and in the order they were provided.
Note: CreateSpecifiedPath() seems to require you to pass the entities in the order you want to use them ensuring a continuous path, and providing them in the wrong order will make it fail: e.g. passing in Line1, Line3, Line2 will fail. That's why letting Inventor figure out the right order by using CreatePath() first seems to be the easiest solution.
Sub PrintPoint(p As Point)
Debug.Print Str(p.X) + "; " + Str(p.Y) + "; " + Str(p.Z)
End Sub
Sub PrintPathInfo(p As Path)
Dim pe As PathEntity
For Each pe In p
Debug.Print pe.SketchEntity.Parent.Name
PrintPoint pe.Curve.StartPoint
PrintPoint pe.Curve.EndPoint
Next
End Sub
Sub CreateSweep()
' Before running this code select first Sketch1 and then
' Sketch2 as well in the UI
Dim oDoc As PartDocument
Set oDoc = ThisApplication.ActiveDocument
Dim oCompDef As PartComponentDefinition
Set oCompDef = oDoc.ComponentDefinition
Dim oSkPath As PlanarSketch
Set oSkPath = oDoc.SelectSet(1)
Dim oSkProfile As PlanarSketch
Set oSkProfile = oDoc.SelectSet(2)
' Just to clean up after all the tests
Do While oSkProfile.Profiles.Count > 0
oSkProfile.Profiles(1).Delete
Loop
Dim oProfile As Profile
Set oProfile = oSkProfile.Profiles.AddForSurface()
Dim oPath As Path
Set oPath = oCompDef.Features.CreatePath(oSkPath.SketchLines(1))
' This might contain entities from other sketches
Debug.Print "Default Path"
Call PrintPathInfo(oPath)
' Remove unnecessary lines from it
Dim oTO As TransientObjects
Set oTO = ThisApplication.TransientObjects
Dim oColl As ObjectCollection
Set oColl = oTO.CreateObjectCollection
Dim oPathEntity As PathEntity
For Each oPathEntity In oPath
Dim oSkEntity As SketchEntity
Set oSkEntity = oPathEntity.SketchEntity
If oSkEntity.Parent Is oSkPath Then
Call oColl.Add(oSkEntity)
End If
Next
Dim oPathNew As Path
Set oPathNew = oCompDef.Features.CreateSpecifiedPath(oColl)
Debug.Print "New Path"
Call PrintPathInfo(oPathNew)
Dim oSweepDef As SweepDefinition
Set oSweepDef = oCompDef.Features.SweepFeatures.CreateSweepDefinition( _
kPathSweepType, oProfile, oPathNew, kSurfaceOperation)
Dim oSweepOne As SweepFeature
Set oSweepOne = oCompDef.Features.SweepFeatures.Add(oSweepDef)
End Sub
VBA Immediate Window with our debug strings:
Default Path
Sketch2
-4.9; 3.29922145229642; .15
-4.9; -3.29922145229644; .15
Sketch1
-4.9; -3.29922145229644; .15
-5.05; -3.29922145229644; .15
Sketch1
-5.05; -3.29922145229644; .15
-5.35; -3.29922145229644; .45
Sketch1
-5.35; -3.29922145229644; .45
-5.35; -3.29922145229644; 2.35
New Path
Sketch1
-4.9; -3.29922145229644; .15
-5.05; -3.29922145229644; .15
Sketch1
-5.05; -3.29922145229644; .15
-5.35; -3.29922145229644; .45
Sketch1
-5.35; -3.29922145229644; .45
-5.35; -3.29922145229644; 2.35
And the result: