Message 1 of 11
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report
Hello Forum,
is it possible to highlight a part of a polyline in someway?
Thank you.
Solved! Go to Solution.
Hello Forum,
is it possible to highlight a part of a polyline in someway?
Thank you.
Solved! Go to Solution.
Try thsi code
[CommandMethod("Segh")]
public void SegmentHighLight()
{
Document doc = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument;
Editor ed = doc.Editor;
Database db = doc.Database;
PromptEntityOptions peo = new PromptEntityOptions("\nSelect the segment to copy: ");
peo.SetRejectMessage("\nYou have to select polyline only!");
peo.AllowNone = false;
peo.AllowObjectOnLockedLayer = false;
peo.AddAllowedClass(typeof(Polyline), true);
PromptEntityResult per = ed.GetEntity(peo);
if (per.Status != PromptStatus.OK) return;
ObjectId objId = per.ObjectId;
if (!objId.ObjectClass.IsDerivedFrom( RXClass.GetClass(typeof(Polyline))))
{
ed.WriteMessage(
"\nYou didn't select a lwpline, please try again...\n");
return;
}
try
{
using (Transaction tr = db.TransactionManager.StartTransaction())
{
Polyline pline = tr.GetObject(objId, OpenMode.ForRead, false) as Polyline;
if (pline != null)
{
BlockTableRecord btr = tr.GetObject(db.CurrentSpaceId, OpenMode.ForWrite, false) as BlockTableRecord;
Point3d pickPt = pline.GetClosestPointTo((Point3d)per.PickedPoint, false);
double param = pline.GetParameterAtPoint(pickPt);
int num = (int)param + 1;
ObjectId[] subentIds = { };
FullSubentityPath[] ips = pline.GetSubentityPathsAtGraphicsMarker(SubentityType.Edge, num, pickPt, Matrix3d.Identity, 1, subentIds);
pline.Highlight(ips[0], true);
}
tr.Commit();
}
}
catch (System.Exception ex)
{
ed.WriteMessage(ex.Message + "\n" + ex.StackTrace);
}
finally
{
ed.WriteMessage("Pokey");
}
}
~'J'~
Hi, ty for the response.
If I try your code, get an error at the following line:
pline.Highlight(ips[0], true);
Error:
eNotApplicable at Autodesk.AutoCAD.DatabaseServices.Entity.Highlight(FullSubentityPath subId, Boolean highlightAll)
Trying to find out what it might be but no luck so far.
I tested code on A2010, it's a reason maybe
Here is another way, see maybe it will working on your release
using Autodesk.AutoCAD.ApplicationServices;
using Autodesk.AutoCAD.DatabaseServices;
using Autodesk.AutoCAD.EditorInput;
using Autodesk.AutoCAD.Runtime;
using Autodesk.AutoCAD.Geometry;
using Autodesk.AutoCAD.GraphicsInterface;
using Autodesk.AutoCAD.Colors;
//_____________________________________//
[CommandMethod("colseg")]
public void ColoredSegment()
{
Document doc = Application.DocumentManager.MdiActiveDocument;
Database db = doc.Database;
Editor ed = doc.Editor;
PromptEntityOptions peo = new PromptEntityOptions("\nSelect Segment of Polyline:");
peo.SetRejectMessage("\nMust be a Polyline!");
peo.AddAllowedClass(typeof(Autodesk.AutoCAD.DatabaseServices.Polyline), false);
PromptEntityResult per = ed.GetEntity(peo);
if (per.Status != PromptStatus.OK)
return;
Transaction tr = db.TransactionManager.StartTransaction();
Autodesk.AutoCAD.DatabaseServices.Polyline pl = new Autodesk.AutoCAD.DatabaseServices.Polyline();
IntegerCollection ic = new IntegerCollection();
using (tr)
{
Autodesk.AutoCAD.DatabaseServices.Polyline pline = tr.GetObject(per.ObjectId, OpenMode.ForRead) as Autodesk.AutoCAD.DatabaseServices.Polyline;
if (pline != null)
{
BlockTableRecord btr = (BlockTableRecord)tr.GetObject(pline.OwnerId, OpenMode.ForWrite);
double bulg = 0;
Point3d picked = pline.GetClosestPointTo((Point3d)per.PickedPoint, false);
double par = pline.GetParameterAtPoint(picked);
int m = (int)par;
Point2dCollection verts = new Point2dCollection(2);
SegmentType stype = pline.GetSegmentType(m);
if (stype == SegmentType.Arc)
{
CircularArc2d arc = pline.GetArcSegment2dAt(m);
bulg = pline.GetBulgeAt(m);
verts.Add(arc.StartPoint);
verts.Add(arc.EndPoint);
}
else if (stype == SegmentType.Line)
{
LineSegment2d ln = pline.GetLineSegment2dAt(m);
verts.Add(ln.StartPoint);
verts.Add(ln.EndPoint);
bulg = 0;
}
pl.AddVertexAt(0, verts[0], bulg, 0, 0);
pl.AddVertexAt(1, verts[1], 0, 0, 0);
pl.ColorIndex = 121;
ObjectIdCollection ids = new ObjectIdCollection();
btr.AppendEntity(pl);
tr.AddNewlyCreatedDBObject(pl, true);
verts = new Point2dCollection();
if (pl != null)
{
TransientManager tm = TransientManager.CurrentTransientManager;
tm.AddTransient(pl, TransientDrawingMode.Highlight, 128, ic);
}
}
if (pl != null)
{
pl.Erase();
pl.Dispose();// optional, might be removed
}
tr.Commit();
// pause for user input only
string key = ed.GetString("\nPress any key: ").StringResult;
TransientManager.CurrentTransientManager.EraseTransient(pline, ic);
}
}
~'J'~
Hi, that works, thanks a lot!
One question tho, if I leave out the "EraseTransient" line at the end, it still disapears after I regenerate. Why should I call it?
I'll try and see if I can get the other one to work.
I did it machinally, though it is no problem
to keep them inside, but who knows?
Of course, if you need to display a segment
in the work time, then don't remove,
See you,
~'J'~
Was wondering if anyone has a VB.net version of this code. I am having some difficulty modifying it from C#.
Please let me know if you can.
I have recently posted an article on this similar topic, showing a similar solution (using Transient Graphics to highlight part/segment of a polyline). But in my case, it is to highlight a segment when mouse cursor hover a polyline. I thought it may also be helpful/useful for your need.
https://drive-cad-with-code.blogspot.com/2019/02/visually-select-segment-of-polyline.html
Unfortunately, the code is also in C#. As @_gile suggested, you can find one of the online .NET code converter to easily convert the code to VB.NET.