Add LeaderNote to Dimension using the API

Add LeaderNote to Dimension using the API

AlexFielder
Advisor Advisor
828 Views
6 Replies
Message 1 of 7

Add LeaderNote to Dimension using the API

AlexFielder
Advisor
Advisor

Hi all,

 

This is a problem I just came upon whilst working on a customer addin. Using c# I am attempting to add a leader note like this:

 

2017-12-18 17_50_17-Autodesk Inventor Professional 2017.png

 

The part I am struggling with is accessing the start/end of the dimension line I wish to attach to.

 

Here is the code I have for this and the line that errors is in red:

 

private static void AddUniqueHoleCountsToDrawingView(Sheet drawingSheet, DrawingView baseView)
        {
            LeaderNotes leaderNotes = drawingSheet.DrawingNotes.LeaderNotes;
            double initialSpacing = 2;
            double spacingLeft = 1;
            double spacingRight = spacingLeft;

            foreach (LinearGeneralDimension item in UniqueYDimensions)
            {
                ObjectCollection leaderPoints = ThisApplication.TransientObjects.CreateObjectCollection();
                Line2d dimLine = item.DimensionLine;

                double[] startPoint = new double[2];
                double[] endPoint = new double[2];

                dimLine.Evaluator.GetEndPoints(ref startPoint, ref endPoint);
                Point2d dimLineStart = TransGeom.CreatePoint2d(startPoint[0], startPoint[1]);
                Point2d dimLineEnd = TransGeom.CreatePoint2d(endPoint[0], endPoint[1]);
                Point2d leaderNoteElbow = null;
                Point2d leaderNotePosn = null;

                if (dimLineStart.Y < dimLineEnd.Y) //left?
                {
                    if (spacingLeft == 1)
                    {
                        leaderNoteElbow = TransGeom.CreatePoint2d(dimLineStart.Y - initialSpacing, dimLineStart.X);
                        leaderNotePosn = TransGeom.CreatePoint2d(leaderNoteElbow.Y, leaderNoteElbow.X + 2); 
                    }
                    else
                    {
                        leaderNoteElbow = TransGeom.CreatePoint2d(dimLineStart.Y - initialSpacing - spacingLeft, dimLineStart.X);
                        leaderNotePosn = TransGeom.CreatePoint2d(leaderNoteElbow.Y, leaderNoteElbow.X + 2);
                        spacingLeft++;
                    }
                    leaderPoints.Add(dimLineStart);
                    leaderPoints.Add(leaderNoteElbow);
                    leaderPoints.Add(leaderNotePosn);
                }
                else
                {
                    if (spacingRight == 1)
                    {
                        leaderNoteElbow = TransGeom.CreatePoint2d(dimLineEnd.Y - initialSpacing, dimLineEnd.X);
                        leaderNotePosn = TransGeom.CreatePoint2d(leaderNoteElbow.Y, leaderNoteElbow.X - 2); 
                    }
                    else
                    {
                        leaderNoteElbow = TransGeom.CreatePoint2d(dimLineEnd.Y - initialSpacing - spacingRight, dimLineEnd.X);
                        leaderNotePosn = TransGeom.CreatePoint2d(leaderNoteElbow.Y, leaderNoteElbow.X - 2);
                        spacingRight++;
                    }
                    leaderPoints.Add(dimLineEnd);
                    leaderPoints.Add(leaderNoteElbow);
                    leaderPoints.Add(leaderNotePosn);
                }
                LeaderNote newLeader = leaderNotes.Add(leaderPoints, "# Unique Holes");

            }
        }

There don't seem to be ANY other posts that deal with dimensions in this way that I can find, so perhaps someone from Autodesk can help?

 

Thanks,

 

Alex.

0 Likes
Accepted solutions (1)
829 Views
6 Replies
Replies (6)
Message 2 of 7

JaneFan
Autodesk
Autodesk

Hello Alex, 

 

Please try to change Line2d to LineSegment. 




Jane Fan
Inventor/Fusion QA Engineer
Message 3 of 7

AlexFielder
Advisor
Advisor

Hi @JaneFan

 

Changing the type to LineSegment didn't work, but changing it to dynamic does.

 

My next question is this; the leaders get placed, but two things are wrong with my code above:

 

  1. The leader isn't attached to the geometry so when the view moves, the leadernotes do not.
  2. The text that gets placed ends up at the same position as the arrow point, not as intended below the dimension (as per my screenshot above)

My guess is 1) needs a GeometryIntent.

 

As for 2) I'm not 100% sure the points are in the correct position, but is there something else I'm missing?

 

Thanks,

 

Alex.

0 Likes
Message 4 of 7

AlexFielder
Advisor
Advisor

So here's where I am at:

 

private static void AddUniqueHoleCountsToDrawingView(Sheet drawingSheet, DrawingView baseView)
        {
            try
            {
                GeneralDimensions genDims = drawingSheet.DrawingDimensions.GeneralDimensions;
                LeaderNotes leaderNotes = drawingSheet.DrawingNotes.LeaderNotes;
                double initialSpacing = 2;
                double spacingLeft = 0;
                double spacingRight = 0;

                foreach (LinearGeneralDimension item in UniqueYDimensions)
                {
                    ObjectCollection leaderPoints = RadialHoles.m_InventorApp.TransientObjects.CreateObjectCollection();
                    dynamic dimLine = item.DimensionLine;

                    Point2d dimLineStart = (Point2d)dimLine.StartPoint;
                    Point2d dimLineEnd = (Point2d)dimLine.EndPoint;

                    Point2d leaderNoteElbow = null;
                    Point2d leaderNotePosn = null;
                    GeometryIntent leaderIntent = null;
                    Point2d viewCentre = baseView.Center;
                    if (dimLineStart.X < viewCentre.X)
                    {
                        if (spacingLeft == 0)
                        {
                            leaderNoteElbow = TransGeom.CreatePoint2d(dimLineStart.X, dimLineStart.Y - initialSpacing);
                            leaderNotePosn = TransGeom.CreatePoint2d(leaderNoteElbow.X + 2, leaderNoteElbow.Y);
                            spacingLeft += 1;
                        }
                        else
                        {
                            leaderNoteElbow = TransGeom.CreatePoint2d(dimLineStart.X, dimLineStart.Y - initialSpacing - spacingLeft);
                            leaderNotePosn = TransGeom.CreatePoint2d(leaderNoteElbow.X + 2, leaderNoteElbow.Y);
                            spacingLeft += 1;
                        }
                        leaderPoints.Add(leaderNotePosn);
                        leaderPoints.Add(leaderNoteElbow);
                        leaderIntent = drawingSheet.CreateGeometryIntent(item, dimLineStart);
                        leaderPoints.Add(leaderIntent);
                    }
                    else
                    {
                        if (spacingRight == 0)
                        {
                            leaderNoteElbow = TransGeom.CreatePoint2d(dimLineStart.X, dimLineStart.Y - initialSpacing);
                            leaderNotePosn = TransGeom.CreatePoint2d(leaderNoteElbow.X - 2, leaderNoteElbow.Y);
                            spacingRight += 1;
                        }
                        else
                        {
                            leaderNoteElbow = TransGeom.CreatePoint2d(dimLineStart.X, dimLineStart.Y - initialSpacing - spacingRight);
                            leaderNotePosn = TransGeom.CreatePoint2d(leaderNoteElbow.X - 2, leaderNoteElbow.Y);
                            spacingRight += 1;
                        }
                        leaderPoints.Add(leaderNotePosn);
                        leaderPoints.Add(leaderNoteElbow);
                        leaderIntent = drawingSheet.CreateGeometryIntent(item, dimLineStart);
                        leaderPoints.Add(leaderIntent);
                    }
                    AttributeSet dimAttSet = item.AttributeSets[1];
                    Inventor.Attribute numHoles = dimAttSet["UniqueHoleCount"];
                    Inventor.Attribute holeSize = dimAttSet["UniqueHoleSize"];
                    LeaderNote newLeader = leaderNotes.Add(leaderPoints, numHoles.Value + " HOLES ");

                }
            }
            catch (Exception ex)
            {
                log.Error(ex.Message, ex);
            }
        }

This is mostly working, my next question is how can I place the diameter symbol using the API in the line highlighted in Red above?

 

Thanks,

 

Alex.

0 Likes
Message 5 of 7

JaneFan
Autodesk
Autodesk

Hello Alex, 

 

For 1) Yes, GeometryIntent is needed. 

For 2) There should be a setting for LeaderStyle like DimensionTextOrientation in API, as that of in UI. But I didn't find the correct property, will consult with the relative engineers and get back to you later.

ss.png




Jane Fan
Inventor/Fusion QA Engineer
0 Likes
Message 6 of 7

JaneFan
Autodesk
Autodesk

Hi @AlexFielder

 

Sorry that API doesn't support setting the leader text orientation for now as UI does. 




Jane Fan
Inventor/Fusion QA Engineer
0 Likes
Message 7 of 7

AlexFielder
Advisor
Advisor
Accepted solution

Hi @JaneFan,

 

Thanks for looking this up for me; the text alignment is (for my needs) taken care of by the direction of the nearest nodes in the LeaderNote.

 

As far as the solution is concerned, this is what I ended up with:

 

private static void AddUniqueHoleCountsToDrawingView(Sheet drawingSheet, DrawingView baseView)
        {
            try
            {
                GeneralDimensions genDims = drawingSheet.DrawingDimensions.GeneralDimensions;
                LeaderNotes leaderNotes = drawingSheet.DrawingNotes.LeaderNotes;
                double initialSpacing = 2;
                double spacingLeft = 0;
                double spacingRight = 0;

                foreach (LinearGeneralDimension item in UniqueYDimensions)
                {
                    ObjectCollection leaderPoints = RadialHoles.m_InventorApp.TransientObjects.CreateObjectCollection();
                    dynamic dimLine = item.DimensionLine;

                    Point2d dimLineStart = (Point2d)dimLine.StartPoint;
                    Point2d dimLineEnd = (Point2d)dimLine.EndPoint;

                    Point2d leaderNoteElbow = null;
                    Point2d leaderNotePosn = null;
                    GeometryIntent leaderIntent = null;
                    Point2d viewCentre = baseView.Center;
                    if (dimLineStart.X < viewCentre.X)
                    {
                        if (spacingLeft == 0)
                        {
                            leaderNoteElbow = TransGeom.CreatePoint2d(dimLineStart.X, dimLineStart.Y - initialSpacing);
                            leaderNotePosn = TransGeom.CreatePoint2d(leaderNoteElbow.X + 2, leaderNoteElbow.Y);
                            spacingLeft += 1;
                        }
                        else
                        {
                            leaderNoteElbow = TransGeom.CreatePoint2d(dimLineStart.X, dimLineStart.Y - initialSpacing - spacingLeft);
                            leaderNotePosn = TransGeom.CreatePoint2d(leaderNoteElbow.X + 2, leaderNoteElbow.Y);
                            spacingLeft += 1;
                        }
                        leaderPoints.Add(leaderNotePosn);
                        leaderPoints.Add(leaderNoteElbow);
                        leaderIntent = drawingSheet.CreateGeometryIntent(item, dimLineStart);
                        leaderPoints.Add(leaderIntent);
                    }
                    else
                    {
                        if (spacingRight == 0)
                        {
                            leaderNoteElbow = TransGeom.CreatePoint2d(dimLineStart.X, dimLineStart.Y - initialSpacing);
                            leaderNotePosn = TransGeom.CreatePoint2d(leaderNoteElbow.X - 2, leaderNoteElbow.Y);
                            spacingRight += 1;
                        }
                        else
                        {
                            leaderNoteElbow = TransGeom.CreatePoint2d(dimLineStart.X, dimLineStart.Y - initialSpacing - spacingRight);
                            leaderNotePosn = TransGeom.CreatePoint2d(leaderNoteElbow.X - 2, leaderNoteElbow.Y);
                            spacingRight += 1;
                        }
                        leaderPoints.Add(leaderNotePosn);
                        leaderPoints.Add(leaderNoteElbow);
                        leaderIntent = drawingSheet.CreateGeometryIntent(item, dimLineStart);
                        leaderPoints.Add(leaderIntent);
                    }
                    AttributeSet dimAttSet = item.AttributeSets[1];
                    Inventor.Attribute numHoles = dimAttSet["UniqueHoleCount"];
                    Inventor.Attribute holeSize = dimAttSet["UniqueHoleSize"];
                    //AttributeSet dimAttSet = ;
                    LeaderNote newLeader = leaderNotes.Add(leaderPoints, numHoles.Value + " HOLES Ø" + holeSize.Value);

                }
            }
            catch (Exception ex)
            {
                log.Error(ex.Message, ex);
            }

Thanks again,

 

Alex.

0 Likes