using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Autodesk.AutoCAD.ApplicationServices;
//using Autodesk.AutoCAD.ApplicationServices.Application;
using Autodesk.AutoCAD.DatabaseServices;
using Autodesk.AutoCAD.EditorInput;
using Autodesk.AutoCAD.Geometry;
using Autodesk.AutoCAD.Runtime;
[assembly: CommandClass(typeof(TrackLineCreator.GetGeometryParametersModel))]
namespace TrackLineCreator
{
public class Data
{
public string Name { get; set; }
public Point3d Center { get; set; }
public double A { get; set; }
public double Jx { get; set; }
public double Wx { get; set; }
public double Jy { get; set; }
public double Wy { get; set; }
}
public static class GetGeometryParametersModel
{
public static List<Data> Datas { get; set; } = new List<Data>();
public static bool IsSearchName { get; set; } = true;
[CommandMethod("ppp")]
public static void Do()
{
var doc = Application.DocumentManager.MdiActiveDocument;
var db = doc.Database;
var ed = doc.Editor;
var types = new List<TypedValue> { new TypedValue((int)DxfCode.Start, "REGION") };
var filter = new SelectionFilter(types.ToArray());
var pso = new PromptSelectionOptions
{
MessageForAdding = $"Выберите области{(IsSearchName ? " и наименования" : "")} для добавления их в набор",
MessageForRemoval = $"Выберите области{(IsSearchName ? " и наименования" : "")}, подлежащие удалению из набора",
SingleOnly = false,
RejectObjectsFromNonCurrentSpace = true,
AllowDuplicates = false
};
var psr = ed.GetSelection(pso, filter);
if (psr.Status != PromptStatus.OK)
{
ed.WriteMessage("Ничего не выбрано. Выполнение команды прервано\n");
return;
}
Datas.Clear();
var textList = new List<(string, Point3d)>();
using (var ms = db.CurrentSpaceId.Open(OpenMode.ForRead) as BlockTableRecord)
{
foreach (var textId in ms)
{
if (textId.ObjectClass != RXObject.GetClass(typeof(DBText))) continue;
using (var text = textId.Open(OpenMode.ForRead) as DBText)
{
textList.Add((text.TextString, text.Position));
}
}
}
foreach (var regionId in psr.Value.GetObjectIds())
{
if (regionId.ObjectClass != RXObject.GetClass(typeof(Region))) continue;
using (var region = regionId.Open(OpenMode.ForRead) as Region)
{
Point3d origin1 = Point3d.Origin;
Vector3d xAxis = Vector3d.XAxis;
Vector3d yAxis = Vector3d.YAxis;
var centroid = region.AreaProperties(ref origin1, ref xAxis, ref yAxis).Centroid;
var center = new Point3d(centroid.X, centroid.Y, 0);
var smallReg = region.GetTransformedCopy(Matrix3d.Scaling(1 / 10d, center)) as Region;
smallReg.TransformBy(Matrix3d.Displacement(center.GetVectorTo(Point3d.Origin)));
RegionAreaProperties regProp = smallReg.AreaProperties(ref origin1, ref xAxis, ref yAxis);
var x1 = Math.Abs(smallReg.GeometricExtents.MinPoint.X);
var x2 = Math.Abs(smallReg.GeometricExtents.MaxPoint.X);
var y1 = Math.Abs(smallReg.GeometricExtents.MinPoint.Y);
var y2 = Math.Abs(smallReg.GeometricExtents.MaxPoint.Y);
var data = new Data
{
Name = "noname",
Center = center,
A = regProp.Area,
Jx = regProp.MomentsOfInertia.X,
Jy = regProp.MomentsOfInertia.Y,
Wx = Math.Round(regProp.MomentsOfInertia.X / Math.Max(y1, y2), 4, MidpointRounding.AwayFromZero),
Wy = Math.Round(regProp.MomentsOfInertia.Y / Math.Max(x1, x2), 4, MidpointRounding.AwayFromZero)
};
foreach (var text in textList)
{
if (text.Item2.X < region.GeometricExtents.MinPoint.X) continue;
if (text.Item2.X > region.GeometricExtents.MaxPoint.X) continue;
if (text.Item2.Y < region.GeometricExtents.MinPoint.Y) continue;
if (text.Item2.Y > region.GeometricExtents.MaxPoint.Y) continue;
data.Name = text.Item1;
break;
}
Datas.Add(data);
}
}
ed.WriteMessage("Наименование\tA\tJx\tWx\tJy\tWy\n");
foreach (var data in Datas)
{
ed.WriteMessage($"{data.Name}\t{data.A}\t{data.Jx}\t{data.Wx}\t{data.Jy}\t{data.Wy}\n");
}
}
}
}