using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Multicad;
using Multicad.AplicationServices;
using Multicad.Runtime;
using Multicad.DatabaseServices;
using Multicad.DataServices;
using Multicad.Geometry;
using Multicad.CustomObjectBase;
using System.ComponentModel;
namespace CustomObject_Rebar
{
[CustomEntity(typeof(Rebar),
"6B5A3569-E4BF-485A-ABFE-0C90E4ACD9D1",
"Rebar",
"RebarEntity")]
[Serializable]
class Rebar : McCustomBase
{
private List<Point3d> _pntList = new List<Point3d> {};
private int _d = 10; // диаметр
private double _d_op = 10; // диаметр оправки
//Создание
public Rebar()
{
}
//Параметры в таблице свойств
[DisplayName("Диаметр")]
[Description("Диаметр арматуры")]
[Category("Rebar")]
public int D
{
get
{
return _d;
}
set
{
if (!TryModify()) return;
_d = value;
}
}
[DisplayName("Длина")]
[Description("Длина арматуры")]
[Category("Rebar")]
public Double L
{
get
{
Polyline3d pl = new Polyline3d(_pntList);
return pl.Length;
}
set
{
}
}
[DisplayName("Оправка")]
[Description("Диаметр оправки, указывается в единицах диаметра. т.е ")]
[Category("Rebar")]
public double OP
{
get
{
return _d_op;
}
set
{
if (!TryModify()) return;
_d_op = value;
}
}
//Перерисовка
public override void OnDraw(GeometryBuilder dc)
{
dc.Clear();
Polyline3d pol = new Polyline3d();
foreach (Point3d i in _pntList)
{
pol.Vertices.AddVertex(i);
}
for (int i = 0; i < pol.Vertices.Count;i++ )
{
pol.Vertices.MakeFilletAtVertex(i,_d_op);
}
dc.Color = McDbEntity.ByObject;
List<Polyline3d> polOffPlus = pol.GetTrimmedOffset(_d / 2);
Polyline3d pol_p = new Polyline3d();
foreach(Polyline3d p in polOffPlus)
{
pol_p.AddGeometry(p);
}
dc.DrawPolyline(pol_p);
List<Polyline3d> polOffNega = pol.GetTrimmedOffset(_d / -2);
Polyline3d pol_n = new Polyline3d();
foreach (Polyline3d p in polOffNega)
{
pol_n.AddGeometry(p);
}
dc.DrawPolyline(pol_n);
}
//Трансформация
public override void OnTransform(Matrix3d tfm)
{
if (!TryModify()) return;
for (int i = 0; i < _pntList.Count;i++ )
{
_pntList[i] = _pntList[i].TransformBy(tfm);
}
}
//ручки
public override List<Point3d> OnGetGripPoints()
{
return _pntList;
}
//Движение ручек
public override void OnMoveGripPoints(List<int> indexes, Vector3d offset, bool isStretch)
{
if (!TryModify()) return;
foreach (int i in indexes)
{
_pntList[i] += offset;
}
}
//Добавление в чертеж
public override hresult PlaceObject(PlaceFlags lInsertType)
{
InputJig jig = new InputJig();
InputResult res;
while (true)
{
res = jig.GetPoint("Select point:");
if (res.Result != InputResult.ResultCode.Normal)
{
_pntList.RemoveAt(_pntList.Count - 1);
return hresult.e_Fail;
}
if (!_pntList.Contains(res.Point))
{
_pntList.Add(res.Point);
}
DbEntity.AddToCurrentDocument();
jig.ExcludeObject(ID);
_pntList.Add(res.Point);
jig.MouseMove = (s, a) =>
{
TryModify();
_pntList[_pntList.Count - 1] = a.Point;
DbEntity.Update();
};
}
return hresult.s_Ok;
}
}
}