Message 1 of 1
Dim and add multileader inside polyline
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report
Hi every body,
I have a polyline, I want to automatic dimension if linesegment <18m and then add multileader to this linesegment as the picture below.
I can make dimension, but I dont know how to add multileader inside polyline. So, can any body help me to solve it?
My code is:
public static void GetLineSegment(Polyline pline)
{
acad.Document doc = acad.Application.DocumentManager.MdiActiveDocument;
Database db = doc.Database;
Editor ed = doc.Editor;
using (Transaction _tr = db.TransactionManager.StartTransaction())
{
pline.ClosedPline();
if (pline.Closed == true)
{
var nbSegments = pline.NumberOfVertices;
for (int i = 1; i < nbSegments - 2; i++)
{
if (pline.GetSegmentType(i) == SegmentType.Line)
{
var line = pline.GetLineSegmentAt(i);
if (line.Length < 18)
{
var line1 = pline.GetLineSegmentAt(i - 1);
var line2 = pline.GetLineSegmentAt(i + 1);
Polyline pl1 = new Polyline();
pl1.AddVertexAt(0, new Point2d(line1.StartPoint.X, line1.StartPoint.Y), 0, 0, 0);
pl1.AddVertexAt(0, new Point2d(line1.EndPoint.X, line1.EndPoint.Y), 0, 0, 0);
Polyline pl2 = new Polyline();
pl2.AddVertexAt(0, new Point2d(line2.StartPoint.X, line2.StartPoint.Y), 0, 0, 0);
pl2.AddVertexAt(0, new Point2d(line2.EndPoint.X, line2.EndPoint.Y), 0, 0, 0);
Point3dCollection point3DCollection = new Point3dCollection();
pl1.IntersectWith(pl2, Intersect.ExtendBoth, point3DCollection, IntPtr.Zero, IntPtr.Zero);
foreach (Point3d pt in point3DCollection)
{
var pt1 = NearPoint(pt, pl1.StartPoint, pl1.EndPoint);
var pt2 = NearPoint(pt, pl2.StartPoint, pl2.EndPoint);
var cSpace = (BlockTableRecord)_tr.GetObject(db.CurrentSpaceId, OpenMode.ForWrite);
var dal1 = new AlignedDimension(pt1, pt, pt, "", db.Dimstyle);
dal1.TransformBy(ed.CurrentUserCoordinateSystem);
cSpace.AppendEntity(dal1);
_tr.AddNewlyCreatedDBObject(dal1, true);
var dal2 = new AlignedDimension(pt2, pt, pt, "", db.Dimstyle);
dal2.TransformBy(ed.CurrentUserCoordinateSystem);
cSpace.AppendEntity(dal2);
_tr.AddNewlyCreatedDBObject(dal2, true);
}
}
}
}
if (pline.GetSegmentType(nbSegments - 1) == SegmentType.Line)
{
var lines = pline.GetLineSegmentAt(nbSegments - 1);
if (lines.Length < 18)
{
var line1 = pline.GetLineSegmentAt(nbSegments - 2);
var line2 = pline.GetLineSegmentAt(0);
Polyline pl1 = new Polyline();
pl1.AddVertexAt(0, new Point2d(line1.StartPoint.X, line1.StartPoint.Y), 0, 0, 0);
pl1.AddVertexAt(0, new Point2d(line1.EndPoint.X, line1.EndPoint.Y), 0, 0, 0);
Polyline pl2 = new Polyline();
pl2.AddVertexAt(0, new Point2d(line2.StartPoint.X, line2.StartPoint.Y), 0, 0, 0);
pl2.AddVertexAt(0, new Point2d(line2.EndPoint.X, line2.EndPoint.Y), 0, 0, 0);
Point3dCollection point3DCollection = new Point3dCollection();
pl1.IntersectWith(pl2, Intersect.ExtendBoth, point3DCollection, IntPtr.Zero, IntPtr.Zero);
foreach (Point3d pt in point3DCollection)
{
var pt1 = NearPoint(pt, pl1.StartPoint, pl1.EndPoint);
var pt2 = NearPoint(pt, pl2.StartPoint, pl2.EndPoint);
var cSpace = (BlockTableRecord)_tr.GetObject(db.CurrentSpaceId, OpenMode.ForWrite);
var dal1 = new AlignedDimension(pt1, pt, pt, "", db.Dimstyle);
dal1.TransformBy(ed.CurrentUserCoordinateSystem);
cSpace.AppendEntity(dal1);
_tr.AddNewlyCreatedDBObject(dal1, true);
var dal2 = new AlignedDimension(pt2, pt, pt, "", db.Dimstyle);
dal2.TransformBy(ed.CurrentUserCoordinateSystem);
cSpace.AppendEntity(dal2);
_tr.AddNewlyCreatedDBObject(dal2, true);
}
}
}
}
if (pline.Closed == false)
{
var nbSegments = pline.NumberOfVertices-1;
for (int i = 1; i < nbSegments - 2; i++)
{
if (pline.GetSegmentType(i) == SegmentType.Line)
{
var line = pline.GetLineSegmentAt(i);
Polyline plcanh = new Polyline();
plcanh.AddVertexAt(0, new Point2d(line.StartPoint.X, line.StartPoint.Y), 0, 0, 0);
plcanh.AddVertexAt(0, new Point2d(line.EndPoint.X, line.EndPoint.Y), 0, 0, 0);
if (line.Length < 18)
{
var line1 = pline.GetLineSegmentAt(i - 1);
var line2 = pline.GetLineSegmentAt(i + 1);
Polyline pl1 = new Polyline();
pl1.AddVertexAt(0, new Point2d(line1.StartPoint.X, line1.StartPoint.Y), 0, 0, 0);
pl1.AddVertexAt(1, new Point2d(line1.EndPoint.X, line1.EndPoint.Y), 0, 0, 0);
Polyline pl2 = new Polyline();
pl2.AddVertexAt(0, new Point2d(line2.StartPoint.X, line2.StartPoint.Y), 0, 0, 0);
pl2.AddVertexAt(1, new Point2d(line2.EndPoint.X, line2.EndPoint.Y), 0, 0, 0);
Point3dCollection point3DCollection = new Point3dCollection();
pl1.IntersectWith(pl2, Intersect.ExtendBoth, point3DCollection, IntPtr.Zero, IntPtr.Zero);
foreach (Point3d pt in point3DCollection)
{
var pt1 = NearPoint(pt, pl1.StartPoint, pl1.EndPoint);
var pt2 = NearPoint(pt, pl2.StartPoint, pl2.EndPoint);
var cSpace = (BlockTableRecord)_tr.GetObject(db.CurrentSpaceId, OpenMode.ForWrite);
var dal1 = new AlignedDimension(pt1, pt, pt, "", db.Dimstyle);
dal1.TransformBy(ed.CurrentUserCoordinateSystem);
cSpace.AppendEntity(dal1);
_tr.AddNewlyCreatedDBObject(dal1, true);
var dal2 = new AlignedDimension(pt2, pt, pt, "", db.Dimstyle);
dal2.TransformBy(ed.CurrentUserCoordinateSystem);
cSpace.AppendEntity(dal2);
_tr.AddNewlyCreatedDBObject(dal2, true);
var kc1 = pt.DistanceTo(pt1);
var kc2 = pt.DistanceTo(pt2);
pline.VeLeader(line.StartPoint.Convert2d(new Plane()),line.EndPoint.Convert2d(new Plane()),line.Length,kc1,kc2);
}
}
}
}
if (pline.GetSegmentType(nbSegments - 2) == SegmentType.Line)
{
var lines = pline.GetLineSegmentAt(nbSegments - 2);
if (lines.Length < 18)
{
var line1 = pline.GetLineSegmentAt(nbSegments - 3);
var line2 = pline.GetLineSegmentAt(nbSegments-1);
Polyline pl1 = new Polyline();
pl1.AddVertexAt(0, new Point2d(line1.StartPoint.X, line1.StartPoint.Y), 0, 0, 0);
pl1.AddVertexAt(1, new Point2d(line1.EndPoint.X, line1.EndPoint.Y), 0, 0, 0);
Polyline pl2 = new Polyline();
pl2.AddVertexAt(0, new Point2d(line2.StartPoint.X, line2.StartPoint.Y), 0, 0, 0);
pl2.AddVertexAt(1, new Point2d(line2.EndPoint.X, line2.EndPoint.Y), 0, 0, 0);
Point3dCollection point3DCollection = new Point3dCollection();
pl1.IntersectWith(pl2, Intersect.ExtendBoth, point3DCollection, IntPtr.Zero, IntPtr.Zero);
foreach (Point3d pt in point3DCollection)
{
var pt1 = NearPoint(pt, pl1.StartPoint, pl1.EndPoint);
var pt2 = NearPoint(pt, pl2.StartPoint, pl2.EndPoint);
var cSpace = (BlockTableRecord)_tr.GetObject(db.CurrentSpaceId, OpenMode.ForWrite);
var dal1 = new AlignedDimension(pt1, pt, pt, "", db.Dimstyle);
dal1.TransformBy(ed.CurrentUserCoordinateSystem);
cSpace.AppendEntity(dal1);
_tr.AddNewlyCreatedDBObject(dal1, true);
var dal2 = new AlignedDimension(pt2, pt, pt, "", db.Dimstyle);
dal2.TransformBy(ed.CurrentUserCoordinateSystem);
cSpace.AppendEntity(dal2);
_tr.AddNewlyCreatedDBObject(dal2, true);
var kc1 = pt.DistanceTo(pt1);
var kc2 = pt.DistanceTo(pt2);
pline.VeLeader(lines.StartPoint.Convert2d(new Plane()), lines.EndPoint.Convert2d(new Plane()), lines.Length, kc1, kc2);
}
}
}
}
_tr.Commit();
}
}
public static Point2d NearPoint(this Point2d p1, Point2d p2, Point2d p3)
{
return p1.GetDistanceTo(p2) < p1.GetDistanceTo(p3) ? p2 : p3;
}
public static Point3d NearPoint(this Point3d p1, Point3d p2, Point3d p3)
{
return p1.DistanceTo(p2) < p1.DistanceTo(p3) ? p2 : p3;
}
[CommandMethod("DimVat")]
public static void DimVat()
{
acad.Document doc = acad.Application.DocumentManager.MdiActiveDocument;
Database db = doc.Database;
Editor ed = doc.Editor;
TypedValue[] _tv = new TypedValue[1] { new TypedValue((int)DxfCode.Start, "LWPOLYLINE") };
SelectionFilter _ts = new SelectionFilter(_tv);
PromptSelectionOptions _op = new PromptSelectionOptions();
_op.MessageForAdding = "Chọn các Polyline";
PromptSelectionResult _ops = ed.GetSelection(_op, _ts);
if (_ops.Status != PromptStatus.OK)
return;
using (Transaction _tr = db.TransactionManager.StartTransaction())
{
foreach (ObjectId objectId in _ops.Value.GetObjectIds())
{
Polyline pline = _tr.GetObject(objectId, OpenMode.ForWrite) as Polyline;
GetLineSegment(pline);
}
//pline.Closed = false;
_tr.Commit();
}
}
public static Point2d Polarpoint(this Point2d p1, double ang, double dist)
{
return new Point2d(p1.X + dist * Math.Cos(ang), p1.Y + dist * Math.Sin(ang));
}
public static Point3d ToPoint3d(this Point2d p1)
{
return new Point3d(p1.X, p1.Y, 0);
}
public static Point2d ToPoint2d(this Point3d p1)
{
return new Point2d(p1.X, p1.Y);
}
public static void ClosedPline(this Polyline pline)
{
var sp = pline.StartPoint;
var ep = pline.EndPoint;
if (pline.Closed == false)
{
if (sp == ep)
{
pline.RemoveVertexAt(pline.NumberOfVertices);
pline.Closed = true;
}
}
}