Table of Contents
Motivation #
Civil 3D offers API to create an Alignment via the Alignment.Create
static method. Interestingly, even though it takes in a LabelSetId
as a constructor parameter, but it doesn’t expose the parameter. Which is really unfortunate.
The workaround – extension method #
So we need to write our own extension method for it. Based on Norman Yuan’s idea on a forum post, here’s the implementation.
public static AlignmentLabelSetStyle GetLabelSet(this Alignment alignment,
CivilDocument civilDoc, Transaction ts)
{
foreach (ObjectId labelGroupId in alignment.GetAlignmentLabelGroupIds())
{
var labelGroup = ts.GetObject<AlignmentLabelGroup>(labelGroupId);
foreach (var alignmentLabelSetStyleId in civilDoc.Styles.LabelSetStyles.AlignmentLabelSetStyles)
{
var alignmentLabelSetStyle = ts.GetObject<AlignmentLabelSetStyle>(alignmentLabelSetStyleId);
foreach (var labelSetItem in alignmentLabelSetStyle)
{
if (labelSetItem.LabelStyleName == labelGroup.StyleName
&& SameLabelType(labelSetItem.LabelStyleType, labelGroup.LabelType))
{
return alignmentLabelSetStyle;
}
}
}
}
return null;
}
//this is unfortunate but I haven't find a more elegant way to map the two different LabelType
private static bool SameLabelType(LabelStyleType labelStyleType, LabelType labelType)
{
switch (labelType)
{
case LabelType.SurfaceContour:
return labelStyleType == LabelStyleType.SurfaceContour;
case LabelType.AlignmentMajorStation:
return labelStyleType == LabelStyleType.AlignmentMajorStation;
case LabelType.AlignmentMinorStation:
return labelStyleType == LabelStyleType.AlignmentMinorStation;
case LabelType.AlignmentGeometryPoint:
return labelStyleType == LabelStyleType.AlignmentGeometryPoint;
case LabelType.AlignmentProfileGeometryPoint:
return labelStyleType == LabelStyleType.AlignmentProfileGeometryPoint;
case LabelType.AlignmentStationEquation:
return labelStyleType == LabelStyleType.AlignmentStationEquation;
case LabelType.AlignmentDesignSpeed:
return labelStyleType == LabelStyleType.AlignmentDesignSpeed;
case LabelType.AlignmentSuperelevationCriticalPoints:
return labelStyleType == LabelStyleType.AlignmentSuperelevationCriticalPoints;
case LabelType.AlignmentStationOffset:
return labelStyleType == LabelStyleType.AlignmentStationOffset;
case LabelType.AlignmentCurve:
return labelStyleType == LabelStyleType.AlignmentCurve;
case LabelType.AlignmentSpiral:
return labelStyleType == LabelStyleType.AlignmentSpiral;
case LabelType.AlignmentTangentIntersection:
return labelStyleType == LabelStyleType.AlignmentTangentIntersection;
case LabelType.AlignmentPointOfIntersection:
return labelStyleType == LabelStyleType.AlignmentPointOfIntersection;
case LabelType.ProfileMajorStation:
return labelStyleType == LabelStyleType.ProfileMajorStation;
case LabelType.ProfileMinorStation:
return labelStyleType == LabelStyleType.ProfileMinorStation;
case LabelType.ProfileHorizontalGeometryPoint:
return labelStyleType == LabelStyleType.ProfileHorizontalGeometryPoint;
case LabelType.ProfileGradeBreaks:
return labelStyleType == LabelStyleType.ProfileGradeBreaks;
case LabelType.ProfileLine:
return labelStyleType == LabelStyleType.ProfileLine;
case LabelType.ProfileCrestCurve:
return labelStyleType == LabelStyleType.ProfileCrestCurve;
case LabelType.ProfileSagCurve:
return labelStyleType == LabelStyleType.ProfileSagCurve;
case LabelType.ProfileViewDepth:
return labelStyleType == LabelStyleType.ProfileViewDepth;
case LabelType.SectionViewOffsetElevation:
return labelStyleType == LabelStyleType.SectionViewOffsetElevation;
case LabelType.SectionMajorOffset:
return labelStyleType == LabelStyleType.SectionMajorOffset;
case LabelType.SectionMinorOffset:
return labelStyleType == LabelStyleType.SectionMinorOffset;
case LabelType.SectionGradeBreak:
return labelStyleType == LabelStyleType.SectionGradeBreak;
case LabelType.SectionSegment:
return labelStyleType == LabelStyleType.SectionSegment;
case LabelType.ViewFrame:
return labelStyleType == LabelStyleType.ViewFrame;
case LabelType.SectionCorridorPoint:
return labelStyleType == LabelStyleType.SectionCorridorPoint;
default:
return false;
}
}
You can just call alignment.GetLabelSet(civilDoc, ts).ObjectId
to get the ObjectId
for the LabelSetId
.