[CommandMethod("Test")]
public void Test()
{
Document doc = Application.DocumentManager.MdiActiveDocument;
Database db = doc.Database;
Editor ed = doc.Editor;
// Выбор первого блока
var prOpt = new PromptEntityOptions("Выбери блок");
prOpt.SetRejectMessage("Только блок");
prOpt.AddAllowedClass(typeof(BlockReference), true);
var prRes = ed.GetEntity(prOpt);
if (prRes.Status != PromptStatus.OK)
{
ed.WriteMessage("\nПрервано пользователем.");
return;
}
// Определение угла вложенного блока относительно модели
using (var t = db.TransactionManager.StartTransaction())
{
// Выбранный блок
var blRef1 = prRes.ObjectId.GetObject(OpenMode.ForRead, false, true) as BlockReference;
// Определение блока
var btr1 = blRef1.BlockTableRecord.GetObject(OpenMode.ForRead) as BlockTableRecord;
// Пербор объектов в блоке
foreach (var idEnt in btr1)
{
// Если это вхождение блока
var blRef2 = idEnt.GetObject(OpenMode.ForRead, false, true) as BlockReference;
if (blRef2 == null) continue;
// Найти угол второго блока относительно модели используя матрицу трансформации первого блока???
Matrix3d transToModel = blRef1.BlockTransform;
double rotation2 = blRef2.Rotation;
double rotation2InModel = TransformRotation(rotation2, transToModel);
ed.WriteMessage($"\nУгол вложенного блока '{blRef2.Name}' в модели = {rotation2InModel * (180 / Math.PI)}");
}
t.Commit();
}
}
private double TransformRotation(double rotation, Matrix3d transToModel)
{
// Вот так неправильно получается
return rotation + transToModel.Translation.Convert2d(new Plane()).Angle;
}