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:
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.
Solved! Go to Solution.
Solved by AlexFielder. Go to Solution.
Hello Alex,
Please try to change Line2d to LineSegment.
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:
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.
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.
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.
Hi @AlexFielder,
Sorry that API doesn't support setting the leader text orientation for now as UI does.
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.
Can't find what you're looking for? Ask the community or share your knowledge.