Inventor Customization

Distinguished Contributor
Posts: 370
Registered: ‎07-12-2007
Message 1 of 3 (403 Views)
Accepted Solution

Automated Create sketch blocks

403 Views, 2 Replies
01-23-2013 08:55 PM

Hey there.


Can someone please give me a couple of pointers in creating a named sketch block (in an ipt) containing entities that I have created in the same sub?

Oh, and I'm doing this from Excel, in Inventor 2010.


What I have:


Function CreateUncutTagSketchBlock()
Dim IVApp As Inventor.Application
Dim oDoc As Document
Dim oCompDef As ComponentDefinition
Dim oSketch As Sketch
Dim oTG As TransientGeometry
Dim FileName As String
Dim Coords(1 To 10) As Point2d
Dim oSketchCircle As Circle2d
Dim oSketchArcs(1 To 2) As Arc2d
Dim oSketchLines(1 To 2) As SketchLine
Dim oSketchBlockDef As SketchBlockDefinition

Dim oArc As SketchEntity
Dim oLine As SketchEntity
Dim oCirc As SketchEntity

Dim dRadius As Double
Dim icounter As Integer
Dim oSketchObjects As ObjectCollection
Set IVApp = GetObject(, "Inventor.Application")
Set oDoc = IVApp.ActiveDocument
FileName = oDoc.FullFileName

dRadius = 2.5

'On Error Resume Next
If oDoc.DocumentType = kPartDocumentObject Then
    'If oDoc.SketchActive = True Then 'check to ensure you have a sketch active
        Set oCompDef = oDoc.ComponentDefinition ' Set a reference to the component definition.
        Set oSketch = oCompDef.Sketches.Item(oCompDef.Sketches.Count)
        'Set oSketchBlockDef = oDoc.ComponentDefinition.SketchBlockDefinitions.Add("UncutTag") ', oSketchObjects)
        Set oTG = IVApp.TransientGeometry
        Set Coords(1) = oTG.CreatePoint2d(0, 0) 'Circle centre  (All co-ordinates in cm)
        Set Coords(2) = oTG.CreatePoint2d(0, 2.5) 'point on circle circumference
        Set Coords(3) = oTG.CreatePoint2d(-0.1, 2.2) ' Cutout: top left
        Set Coords(4) = oTG.CreatePoint2d(0.1, 2.2) ' Cutout: top right
        Set Coords(5) = oTG.CreatePoint2d(0.1, 1.8) ' Cutout: bottom right
        Set Coords(6) = oTG.CreatePoint2d(-0.1, 1.8) ' Cutout: bottom left
        Set Coords(7) = oTG.CreatePoint2d(-0.1, 2) ' Cutout: Left Arc centre
        Set Coords(8) = oTG.CreatePoint2d(0.1, 2) ' Cutout: Right Arc centre
        Set oTG = IVApp.TransientGeometry
        Call oSketch.SketchCircles.AddByCenterRadius(oTG.CreatePoint2d(0, 0), dRadius)
        With oSketch.SketchLines
            Set oSketchLines(1) = .AddByTwoPoints(Coords(3), Coords(4))
            Set oSketchLines(2) = .AddByTwoPoints(Coords(5), Coords(6))
        End With
        Call oSketch.SketchArcs.AddByCenterStartEndPoint(Coords(7), Coords(3), Coords(6), True)
        Call oSketch.SketchArcs.AddByCenterStartEndPoint(Coords(8), Coords(4), Coords(5), False)
        Set oSketchObjects = IVApp.TransientObjects.CreateObjectCollection
        For Each oArc In oSketch.SketchArcs
            Call oSketchObjects.Add(oArc)
        For Each oLine In oSketch.SketchLines
            Call oSketchObjects.Add(oLine)
        For Each oCirc In oSketch.SketchCircles
            Call oSketchObjects.Add(oCirc)
        Call oSketch.SketchBlocks("UncutTag").Add(oSketchObjects)
        Call oDoc.ComponentDefinition.SketchBlockDefinitions.Add("UncutTag", oSketchObjects)
        'Call oSketch.SketchBlocks.AddByDefinition("UncutTag", oSketchObjects)
        ' test insertion/placement
    'End If
End If

Set IVApp = Nothing
Set oDoc = Nothing
End Function

 Please note that i've also taken a shortcut with the arcs, and the circle. I did try to create them using the same naming convention as the lines, but... I failed to implement it successfully.


Also, I can not quite figure out how to constrain all the start/end points together.


Any help you can give me will be greatly appreciated.



This is my signature, not part of my post.
ADN Support Specialist
Posts: 467
Registered: ‎06-02-2009
Message 2 of 3 (370 Views)

Re: Automated Create sketch blocks

01-31-2013 01:13 AM in reply to: robmatthews

Hi Rob,


Below is a VBA sample that illustrates how to work with sketch blocks.


For your second questions, concerning the coincident constraints, the easiest way is to create SketchPoints out of the transient Point2d, then use those as input when you create sketch entities instead of passing directly the transient points. That way Inventor will automatically create a coincident constraint between the sketch entities, because they share the same SketchPoint object.


Public Sub CreateBlocks(doc As PartDocument)

    Dim tg As TransientGeometry
    Set tg = ThisApplication.TransientGeometry

    'Create 1st sketch block definition.
    Dim def1 As SketchBlockDefinition
    Set def1 = doc.ComponentDefinition.SketchBlockDefinitions.Add("Block1")

    'Draw the shape of this part as sketch geometry, (a rectangle with circles at the ends).
    Call def1.SketchLines.AddAsTwoPointRectangle(tg.CreatePoint2d(0, 0), tg.CreatePoint2d(12, 3))
    Call def1.SketchCircles.AddByCenterRadius(tg.CreatePoint2d(1.5, 1.5), 0.5)
    Call def1.SketchCircles.AddByCenterRadius(tg.CreatePoint2d(10.5, 1.5), 0.5)

    'Create 2nd sketch block definition.
    Dim def2 As SketchBlockDefinition
    Set def2 = doc.ComponentDefinition.SketchBlockDefinitions.Add("Block2")

    'Draw the shape of this part as sketch geometry, (a square, with a circle in the middle).
    Call def2.SketchLines.AddAsTwoPointRectangle(tg.CreatePoint2d(0, 0), tg.CreatePoint2d(4, 4))
    Call def2.SketchCircles.AddByCenterRadius(tg.CreatePoint2d(2, 2), 0.5)

End Sub

Public Sub DemoSketchBlocks()

    Dim doc As PartDocument
    Set doc = ThisApplication.ActiveDocument
    Dim tg As TransientGeometry
    Set tg = ThisApplication.TransientGeometry

    CreateBlocks doc
    'Create a new part sketch based on XY Workplane
    Dim sketch As PlanarSketch
    Set sketch = doc.ComponentDefinition.Sketches.Add( _
    Dim def1 As SketchBlockDefinition
    Set def1 = doc.ComponentDefinition.SketchBlockDefinitions("Block1")

    Dim def2 As SketchBlockDefinition
    Set def2 = doc.ComponentDefinition.SketchBlockDefinitions("Block2")

    'Add one instance of Block1 and 2 instances of Block2
    Dim blk1 As SketchBlock
    Set blk1 = sketch.SketchBlocks.AddByDefinition( _
        def1, tg.CreatePoint2d(0, 0))
    Dim blk2 As SketchBlock
    Set blk2 = sketch.SketchBlocks.AddByDefinition( _
        def2, tg.CreatePoint2d(2, 5))
    Dim blk3 As SketchBlock
    Set blk3 = sketch.SketchBlocks.AddByDefinition( _
        def2, tg.CreatePoint2d(10, 5))

    Dim baseCircle1 As SketchCircle
    Set baseCircle1 = blk1.GetObject(def1.SketchCircles(1))
    Dim baseCircle2 As SketchCircle
    Set baseCircle2 = blk1.GetObject(def1.SketchCircles(2))

    Dim square1Circle As SketchCircle
    Set square1Circle = blk2.GetObject(def2.SketchCircles(1))
    Dim square2Circle As SketchCircle
    Set square2Circle = blk3.GetObject(def2.SketchCircles(1))

    'Add coincident constraints between the circle center points.
    Call sketch.GeometricConstraints.AddCoincident( _
        baseCircle1.CenterSketchPoint, square1Circle.CenterSketchPoint)
    Call sketch.GeometricConstraints.AddCoincident( _
        baseCircle2.CenterSketchPoint, square2Circle.CenterSketchPoint)

    'Ground the center point of one of the circle.
    Call sketch.GeometricConstraints.AddGround(baseCircle1.CenterSketchPoint)
End Sub



Philippe Leefsma
Developer Technical Services
Autodesk Developer Network

Distinguished Contributor
Posts: 370
Registered: ‎07-12-2007
Message 3 of 3 (349 Views)

Re: Automated Create sketch blocks

02-03-2013 03:21 PM in reply to: philippe.leefsma

Thank you, that has given me the pointers I needed, in both cases.


For the co-incident constraints, what I ended up doing was starting and finishing the lines from the start and end points of the arcs, rather than re-using the transient geometry points that I had created.


That is:

        Call oSketchBlockDef.SketchArcs.AddByCenterStartEndPoint(Coords(7), Coords(3), Coords(6), True)
        Call oSketchBlockDef.SketchArcs.AddByCenterStartEndPoint(Coords(8), Coords(4), Coords(5), False)
        Call oSketchBlockDef.SketchLines.AddByTwoPoints(oSketchBlockDef.SketchArcs(1).StartSketchPoint, oSketchBlockDef.SketchArcs(2).EndSketchPoint)
        Call oSketchBlockDef.SketchLines.AddByTwoPoints(oSketchBlockDef.SketchArcs(2).StartSketchPoint, oSketchBlockDef.SketchArcs(1).EndSketchPoint)



An example like you pasted, Philippe, would be very beneficial in the help files, which is very lacking in real-world examples for sketch-blocks.


This is my signature, not part of my post.

You are not logged in.

Log into access your profile, ask and answer questions, share ideas and more. Haven't signed up yet? Register

Welcome to the new Autodesk Community!
If this is your first visit, click here to get started and make the most of the Community. Let us know what you think of the new experience in the Community Feedback Forum.

Need installation help?

Start with some of our most frequented solutions to get help installing your software.

Ask the Community

Inventor Exchange Apps

Created by the community for the community, Autodesk Exchange Apps for Autodesk Inventor helps you achieve greater speed, accuracy, and automation from concept to manufacturing.

Connect with Inventor