public class RotatedDimensionAddStrategy : IDimensionAddStrategy
{
private readonly Viewport _viewport;
[DllImport("acad.exe", CallingConvention = CallingConvention.Cdecl, EntryPoint = "?acedSetCurrentVPort@@YA? AW4ErrorStatus@Acad@@PEBVAcDbViewport@@@Z")]
private static extern int acedSetCurrentVPort(IntPtr acDbVport);
[DllImport("acad.exe", CallingConvention = CallingConvention.Cdecl, EntryPoint = "?acedSetCurrentVPort@@YA?AW4ErrorStatus@Acad@@H@Z")]
private static extern int acedSetCurrentVPort(int acDbVportNumber);
/// <summary>
/// Initializes a new instance of the <see cref="RotatedDimensionAddStrategy"/> class.
/// </summary>
/// <param name="viewport">The viewport.</param>
public RotatedDimensionAddStrategy(Viewport viewport)
{
this._viewport = viewport;
}
/// <summary>
/// Adds the dimensions.
/// </summary>
/// <param name="dimensionLines">The dimension lines.</param>
public void AddDimensions(List<DimensionLine> dimensionLines)
{
if (dimensionLines == null || dimensionLines.Count == 0)
{
return;
}
using (Transaction transaction = Active.Database.TransactionManager.StartTransaction())
{
BlockTableRecord ms = Active.Database.ModelSpace(OpenMode.ForWrite);
List
<ObjectId
> dimensions
= new List
<ObjectId
>();
Matrix3d worldToView = this._viewport.GetModelToPaperTransform();
Vector3d viewDirection = this._viewport.ViewDirection.GetNormal();
RotatedDimensionBuilder dimensionBuilder
= new RotatedDimensionBuilder
(viewDirection,
25,
this._viewport
.CustomScale);
foreach (DimensionLine dimensionLine in dimensionLines)
{
dimensionBuilder.CreateDimensions(dimensionLine);
if (dimensionBuilder.Dimensions.Count > 0)
{
foreach (RotatedDimension dimension in dimensionBuilder.Dimensions)
{
dimensions.Add(ms.AppendEntity(dimension));
transaction.AddNewlyCreatedDBObject(dimension, true);
}
}
}
Viewport viewport = this._viewport.ObjectId.OpenAs<Viewport>();
if (dimensions.Count > 0)
{
SelectionSet selectionSet = SelectionSet.FromObjectIds(dimensions.ToArray());
ObjectId
[] viewPortSelection
= new ObjectId
[1]; viewPortSelection[0] = this._viewport.ObjectId;
SelectionSet viewportSelectionSet = SelectionSet.FromObjectIds(viewPortSelection);
Active.Editor.Command("MSPACE", viewportSelectionSet);
while (Active.Editor.CurrentViewportObjectId != viewport.ObjectId)
{
//acedSetCurrentVPort(viewport.Number);
acedSetCurrentVPort(viewport.UnmanagedObject);
}
Active.Editor.Command("CHSPACE", selectionSet, "");
}
transaction.Commit();
}
}
}