.NET
Reply
Topic Options
- Subscribe to RSS Feed
- Mark Topic as New
- Mark Topic as Read
- Float this Topic to the Top
- Bookmark
- Subscribe
- Printer Friendly Page
Offset polyline by pick point on side like autocad
Options
- Mark as New
- Bookmark
- Subscribe
- Subscribe to RSS Feed
- Highlight
- Email to a Friend
- Report Inappropriate Content
179 Views, 3 Replies
02-03-2013 05:32 PM
Hi pro,
Please let me know how to offset a opened polyline by pick point on side of opened polyline.
Thanks,
Solved! Go to Solution.
Re: Offset polyline by pick point on side like autocad
Options
- Mark as New
- Bookmark
- Subscribe
- Subscribe to RSS Feed
- Highlight
- Email to a Friend
- Report Inappropriate Content
02-04-2013 02:16 AM in reply to:
xdbk07
With minimum error checking. Only as idea.
using System;
using Autodesk.AutoCAD.Runtime;
using Autodesk.AutoCAD.ApplicationServices;
using Autodesk.AutoCAD.DatabaseServices;
using Autodesk.AutoCAD.Geometry;
using Autodesk.AutoCAD.EditorInput;
[assembly: CommandClass(typeof(Rivilis.CurveUtils))]
namespace Rivilis
{
public class CurveUtils
{
[CommandMethod("OffsetCurve", CommandFlags.Modal)]
public static void OffsetCurve()
{
Document doc = Application.DocumentManager.MdiActiveDocument;
Editor ed = doc.Editor;
PromptDoubleResult resValueOff = ed.GetDistance("\nOffset value: ");
if (resValueOff.Status != PromptStatus.OK) return;
PromptPointResult resPointOff = ed.GetPoint("\nOffset side: ");
if (resPointOff.Status != PromptStatus.OK) return;
PromptEntityOptions prCurv = new PromptEntityOptions("\nSelect curve: ");
prCurv.SetRejectMessage("not a Curve");
prCurv.AddAllowedClass(typeof(Curve),false);
PromptEntityResult resCurv = ed.GetEntity(prCurv);
if (resCurv.Status != PromptStatus.OK) return;
using (Transaction tr = doc.TransactionManager.StartTransaction()) {
Curve curve = tr.GetObject(resCurv.ObjectId, OpenMode.ForRead) as Curve;
if (curve != null) {
BlockTableRecord btr = tr.GetObject(curve.BlockId, OpenMode.ForWrite) as BlockTableRecord;
if (btr != null) {
Point3d pDir = (Point3d)(Application.GetSystemVariable("VIEWDIR") );
if (pDir != null) {
Point3d pWCS = resPointOff.Value.TransformBy(ed.CurrentUserCoordi nateSystem);
double offset = IsRightDirection(curve, pWCS, pDir.GetAsVector()) ? resValueOff.Value : -resValueOff.Value;
DBObjectCollection curvCols = curve.GetOffsetCurves(offset);
foreach (DBObject obj in curvCols) {
Curve subCurv = obj as Curve;
if (subCurv != null) {
btr.AppendEntity(subCurv);
tr.AddNewlyCreatedDBObject(subCurv, true);
}
}
}
}
}
tr.Commit();
}
}
// Detect side of point
public static bool IsRightDirection(Curve pCurv, Point3d p, Vector3d vDir)
{
Vector3d vNormal = Vector3d.ZAxis;
if (pCurv.IsPlanar) {
Plane plane = pCurv.GetPlane();
vNormal = plane.Normal;
p = p.Project(plane, vDir);
}
Point3d pNear = pCurv.GetClosestPointTo(p, true);
Vector3d vSide = p - pNear;
Vector3d vDeriv = pCurv.GetFirstDerivative(pNear);
if (vNormal.CrossProduct(vDeriv).DotProduct(vSide) < 0.0)
return true;
else
return false;
}
}
}
Re: Offset polyline by pick point on side like autocad
Options
- Mark as New
- Bookmark
- Subscribe
- Subscribe to RSS Feed
- Highlight
- Email to a Friend
- Report Inappropriate Content
02-04-2013 03:34 AM in reply to:
Alexander.Rivilis
Nice solution
Hats off
Cheers ![]()
_____________________________________
C6309D9E0751D165D0934D0621DFF27919
C6309D9E0751D165D0934D0621DFF27919
Re: Offset polyline by pick point on side like autocad
Options
- Mark as New
- Bookmark
- Subscribe
- Subscribe to RSS Feed
- Highlight
- Email to a Friend
- Report Inappropriate Content
02-05-2013 12:05 AM in reply to:
Alexander.Rivilis




