using Autodesk.AutoCAD.DatabaseServices;
using Autodesk.AutoCAD.EditorInput;
using Autodesk.AutoCAD.Geometry;
using System.Collections.Generic;
using CivilNetwork;
using System.Windows.Forms;
using System.Linq;
using System;
namespace Function
{
public class TypeBorderJig : DrawJig
{
//переменные из настроек
private double per = CivilNetwork.Properties.Settings.Default.typeBoxHeight;
private double theight = CivilNetwork.Properties.Settings.Default.typeTextHeight;
private bool inBlock = CivilNetwork.Properties.Settings.Default.block;
private bool rlBorder = CivilNetwork.Properties.Settings.Default.rlBorder;
private bool duBorder = CivilNetwork.Properties.Settings.Default.duBorder;
//списко элементов области данных для отрисовки и последующей вставки в чертеж
private List<Entity> finalEnt = new List<Entity>();
//класс в котором хранится строка с типом покрытия передаваемая из формы
StringLink _stringLink = new StringLink();
//эдитор
readonly Editor ed = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument.Editor;
//шаг процесса в работе
private int currentFactornumber = 1;
//точка полученная из эдитора джига
private Point3d _visiblePoint = new Point3d();
//точка полученная из обычного эдитора
private Point3d _computedPoint = new Point3d();
//окончательный вариант точки, используемый в работе
private Point3d _currentPoint = new Point3d();
//сохраняемая точка
private Point3d _savePoint = new Point3d();
//исходная трасса
private Curve _cur;
//список с точками и метками на трассе
private List<(Point3d gpoint, (Point3d tppoint, string pok, double angle))> _data = new List<(Point3d gpoint, (Point3d tppoint, string pok, double angle))> ();
//списко точек и текстов меток на трассе для отрисовки
private List<Entity> _ent = new List<Entity> ();
//переменная для использования обычного эдитора
private bool _pm = false;
//переменная для хранения положения области
private Point3d _position = new Point3d();
//результат для возврата
private PromptResult _res;
public PromptResult Drow(
Curve curve,
bool pm
)
{
_cur = curve;
_pm = pm;
if (_pm) ed.PointMonitor += new PointMonitorEventHandler(ed_PointMonitor);
AddPoint(_cur.EndPoint);
PromptResult jigRes;
while (true)
{
jigRes = ed.Drag(this);
if (jigRes.Status == PromptStatus.Cancel)
{
if (currentFactornumber == 3)
{
//отмена
return jigRes;
}
if (currentFactornumber == 4)
{
//созхраняем объекты в базе данных
AddFinalEntToDatabase();
return jigRes;
}
//переходим к следующему шагу
else currentFactornumber++;
}
if (jigRes.Status == PromptStatus.OK)
{
if (currentFactornumber == 1)
{
//добавляем точки
AddPoint(_currentPoint);
}
if (currentFactornumber == 2)
{
//изменяем типы
AddType();
}
if (currentFactornumber == 3)
{
//фиксируем объекты в выбранном месте и переходим к следующему шагу
_res = jigRes;
_position = _currentPoint;
currentFactornumber++;
_stringLink.SetMenu(true);
}
if (currentFactornumber == 4)
{
//редактируем объекты
Red();
}
}
//отмена
if (jigRes.Status == PromptStatus.Keyword && currentFactornumber == 4) return _res;
}
}
void ed_PointMonitor(object sender, PointMonitorEventArgs e)
{
if (e.Context.PointComputed && (e.Context.History & PointHistoryBits.ObjectSnapped) > 0)
_computedPoint = e.Context.ObjectSnappedPoint;
else
_computedPoint = e.Context.ComputedPoint;
}
protected override SamplerStatus Sampler(JigPrompts prompts)
{
JigPromptPointOptions jigOpts = new JigPromptPointOptions();
switch (currentFactornumber)
{
case 1:
{
jigOpts.Message = "\nВыберите точки изменения типов покрытий (Повторный выбор уберет точку, Esc - закончить выбор): ";
break;
}
case 2:
{
jigOpts.SetMessageAndKeywords("\nВыберите типы покрытий на заданных интервалах(закончить установку - Esc, вернуться к установке точек - [R]):", "R");
break;
}
case 3:
{
jigOpts.SetMessageAndKeywords("\nВыберите точку вставки (Перейти к редактированию - Esc, вернуться к выбору покрытий - [R]:", "R");
break;
}
case 4:
{
jigOpts.SetMessageAndKeywords("\nОтредактируйте если требуется(оставить в чертеже - Esc, вернуться к установке места вставки покрытий - R, завершить программу - S [R/S]:", "R S");
break;
}
default: break;
}
jigOpts.UserInputControls =
UserInputControls.Accept3dCoordinates |
UserInputControls.NoZeroResponseAccepted;
var jigRes = prompts.AcquirePoint(jigOpts);
if (jigRes.Status == PromptStatus.Keyword)
{
if (jigRes.StringResult == "R")
{
if (finalEnt.Count > 0) finalEnt.Clear();
currentFactornumber--;
if (currentFactornumber < 4) _stringLink.SetMenu(false);
}
return SamplerStatus.NoChange;
}
var pt = jigRes.Value;
if (_pm) _visiblePoint = _computedPoint;
else _visiblePoint = pt;
if (_savePoint == pt)
{
_savePoint = pt;
return SamplerStatus.NoChange;
}
_savePoint = pt;
_currentPoint = _visiblePoint;
if (jigRes.Status == PromptStatus.OK)
return SamplerStatus.OK;
return SamplerStatus.Cancel;
}
protected override bool WorldDraw(Autodesk.AutoCAD.GraphicsInterface.WorldDraw draw)
{
foreach (Entity e in _ent)
{
draw.Geometry.Draw(e);
}
switch (currentFactornumber)
{
case 1:
{
break;
}
case 2:
{
break;
}
case 3:
{
CreateFinalEnt(_currentPoint);
foreach (Entity e in finalEnt)
{
draw.Geometry.Draw(e);
}
break;
}
case 4:
{
foreach (Entity e in finalEnt)
{
draw.Geometry.Draw(e);
}
break;
}
default: break;
}
return true;
}
private void Red()
{
if (_currentPoint.Y > _position.Y && _currentPoint.Y < (_position.Y + per) && _currentPoint.X > _position.X && _currentPoint.X < (_position.X + _cur.GetLength()))
{
for (int i = 0; i < _data.Count; i++)
{
(Point3d gpoint, (Point3d tppoint, string pok, double angle)) current = _data[i];
double distL;
double distR = _data[i].gpoint.Z0().DistanceTo(_cur.StartPoint.Z0());
double cdist = _currentPoint.X - _position.X;
if (i == 0) distL = 0;
else distL = _data[i - 1].gpoint.Z0().DistanceTo(_cur.StartPoint.Z0());
if (cdist > distL && cdist < distR)
{
_stringLink.SetString(current.Item2.pok);
_stringLink.SetangleChange(false);
//запуск формы
GetType gt = new GetType(_stringLink);
DialogResult dr = gt.ShowDialog();
//DialogResult dr = Autodesk.AutoCAD.ApplicationServices.Application.ShowModalDialog(gt);
if (dr == DialogResult.OK)
{
current.Item2.pok = _stringLink.GetString();
if (string.IsNullOrEmpty(current.Item2.pok)) current.Item2.angle = 0;
else
{
if (_stringLink.GetangleChange())
{
if (current.Item2.angle == 0) current.Item2.angle = Math.PI / 2;
else current.Item2.angle = 0;
}
}
_data[i] = current;
CreateEntities();
CreateFinalEnt(_position);
}
break;
}
}
}
}
private void AddType()
{
double mindist = 0.2;
int ci = -1;
(Point3d gpoint, (Point3d tppoint, string pok, double angle)) closest = _data[0];
for (int i = 0; i < _data.Count; i++)
{
(Point3d gpoint, (Point3d tppoint, string pok, double angle)) current = _data[i];
double dist = current.Item2.tppoint.Z0().DistanceTo(_currentPoint.Z0());
if (dist < mindist)
{
mindist = dist;
closest = current;
ci = i;
}
}
if (ci >= 0)
{
_stringLink.SetString(closest.Item2.pok);
//запуск формы
GetType gt = new GetType(_stringLink);
DialogResult dr = gt.ShowDialog();
if (dr == DialogResult.OK)
{
closest.Item2.pok = _stringLink.GetString();
_data[ci] = closest;
CreateEntities();
}
}
}
}
}