using System;
using System.Collections.Generic;
#if ACAD
using Autodesk.AutoCAD.ApplicationServices;
using Autodesk.AutoCAD.EditorInput;
using Autodesk.AutoCAD.Geometry;
using Autodesk.AutoCAD.GraphicsInterface;
using DbPolyline = Autodesk.AutoCAD.DatabaseServices.Polyline;
#elif BCAD
using Bricscad.ApplicationServices;
using Bricscad.EditorInput;
using Teigha.Geometry;
using Teigha.GraphicsInterface;
using DbPolyline = Teigha.DatabaseServices.Polyline;
#endif
namespace TopMecNet.Experimental
{
public class PointsPicker
{
private readonly Editor _editor;
private List<Point2d> _pickedPoints;
private Point2d _pickedPoint;
private DbPolyline _pline;
private bool _pointPicked;
public PointsPicker(Document dwg)
{
_editor = dwg.Editor;
}
public List<Point2d> PickedPoints
{
get { return _pickedPoints; }
}
public void PickPoints()
{
_pickedPoints
= new List
<Point2d
>();
// get first point
var opt
= new PromptPointOptions
("\nPick Point: "); var res = _editor.GetPoint(opt);
if (res.Status != PromptStatus.OK)
return;
_pickedPoint
= new Point2d
(res
.Value.X, res
.Value.Y); PickedPoints.Add(_pickedPoint);
_pointPicked = true;
try
{
CreateTransientGraphics();
// handling mouse cursor moving during picking
_editor.PointMonitor += _editor_PointMonitor;
// get more points
while (PickNewPoint())
{
PickedPoints.Add(_pickedPoint);
_pointPicked = true;
}
}
catch(Exception ex)
{
_editor.WriteMessage(ex.Message);
}
finally
{
ClearTransientGraphics();
// remove PointMonitor handler
_editor.PointMonitor -= _editor_PointMonitor;
}
}
private bool PickNewPoint()
{
var opt
= new PromptPointOptions
("\nPick Point: ") {AllowNone
= true}; var res = _editor.GetPoint(opt);
if (res.Status != PromptStatus.OK)
return false;
_pickedPoint
= new Point2d
(res
.Value.X, res
.Value.Y); return true;
}
private void CreateTransientGraphics()
{
_pline
= new DbPolyline
(0) {ColorIndex
= 1};
TransientManager.CurrentTransientManager.AddTransient(
_pline, TransientDrawingMode.DirectShortTerm, 128
,
new IntegerCollection
()); }
private void ClearTransientGraphics()
{
TransientManager.CurrentTransientManager.EraseTransients(TransientDrawingMode.DirectShortTerm,
128,
new IntegerCollection
());
if (_pline != null)
_pline.Dispose();
_pline = null;
}
private void UpdateTransientGraphics(Point2d dragVertex)
{
if (_pointPicked)
{
// add the picked vertex
_pline.AddVertexAt(_pline.NumberOfVertices, _pickedPoint, 0.0, 0.0, 0.0);
// add the dragging vertex
_pline.AddVertexAt(_pline.NumberOfVertices, dragVertex, 0.0, 0.0, 0.0);
}
else
{
// update the last vertex
_pline.SetPointAt(_pline.NumberOfVertices - 1, dragVertex);
}
TransientManager
.CurrentTransientManager.UpdateTransient(_pline,
new IntegerCollection
());
// wake up BricsCAD
using (var rec = _editor.GetCurrentView())
_editor.SetCurrentView(rec);
_pointPicked = false;
}
private void _editor_PointMonitor(object sender, PointMonitorEventArgs e)
{
// simulate next vertex
UpdateTransientGraphics
(new Point2d
(e
.Context.RawPoint.X, e
.Context.RawPoint.Y)); }
}
/// <summary>
/// Class TestPickPoints. ATTACH COMMAND HERE.
/// </summary>
public static class TestPickPoints
{
public static void Test()
{
var dwg = Application.DocumentManager.MdiActiveDocument;
var pointsPicker
= new PointsPicker
(dwg
); pointsPicker.PickPoints();
var points = pointsPicker.PickedPoints;
Application.DocumentManager.MdiActiveDocument.Editor.WriteMessage(string.Format("Picked {0} points.", points.Count));
}
}
}