public class NavisworksTransform
{
private DocumentControl _documentControl;
public NavisworksTransform()
{
ApplicationControl.ApplicationType = ApplicationType.MultipleDocument;
ApplicationControl.Initialize();
ApplicationControl.CloseFileAfterLoad = true;
}
public void SetNewCoordinates(string path, string savePath,
List<NewCoordinates> newCoordinateList, bool isSingleFile = true)
{
_documentControl = new DocumentControl();
_documentControl.SetAsMainDocument();
if (!_documentControl.Document.TryOpenFile(path))
{
throw new Exception($"Не удалось открыть файл {path}");
}
var doc = _documentControl.Document;
System.Console.WriteLine($"\nПроисходит изменение модели {doc.FileName}");
var model = doc.Models.First();
string fileName = model.FileName;
NewCoordinates coordinates = newCoordinateList
.FirstOrDefault(x => fileName.Contains(x.Building));
if (coordinates != null)
{
var newCoordinates = UnitConverter.ConvertUnit(coordinates.XYZ, coordinates.XYZUnits, model);
var newAngle = UnitConverter.ConvertUnit(coordinates.RotXYZ, coordinates.RotXYZUnits);
ModelItemCollection newSelection = new ModelItemCollection();
newSelection.Add(model.RootItem);
_documentControl.Document.CurrentSelection.CopyFrom(newSelection);
MoveModel(doc, newCoordinates);
RotateModel(doc, newAngle[0], new[] { 1, 0, 0 });
RotateModel(doc, newAngle[1], new[] { 0, 1, 0 });
RotateModel(doc, newAngle[2], new[] { 0, 0, 1 });
if (isSingleFile)
{
doc.SaveFile(savePath);
System.Console.WriteLine($"Модель успешно изменена и сохранена по следующему пути {savePath}");
}
else
{
string concatPath = savePath + "\\" + Path.GetFileName(doc.FileName);
doc.SaveFile(concatPath);
System.Console.WriteLine($"Модель успешно изменена и сохранена по следующему пути {concatPath}");
}
}
else
{
System.Console.WriteLine($"В файле JSON не удалось найти имя соответствующее следующей модели {fileName}." +
$"\nДанный файл будет пропущен");
}
}
public void NavisworksTerminate()
{
_documentControl.Document.Clear();
_documentControl.Dispose();
ApplicationControl.Terminate();
}
private void MoveModel(Document doc, double[] moveStep)
{
ModelItemCollection coll = doc.CurrentSelection.SelectedItems;
if (coll.Count == 0)
return;
Vector3D oNewVector3d = new Vector3D(moveStep[0], moveStep[1], moveStep[2]);
Transform3D oNewOverrideTrans = Transform3D.CreateTranslation(oNewVector3d);
doc.Models.OverridePermanentTransform(coll, oNewOverrideTrans, true);
}
private void RotateModel(Document doc, double angle, int[] axis)
{
ModelItemCollection coll = doc.CurrentSelection.SelectedItems;
if (coll.Count == 0)
return;
Point3D oCenterP = coll.BoundingBox().Center;
Vector3D oMoveBackToOrig = new Vector3D(-oCenterP.X, -oCenterP.Y, -oCenterP.Z);
Transform3D oMoveBackToOrigM = Transform3D.CreateTranslation(oMoveBackToOrig);
UnitVector3D odeltaA = new UnitVector3D(axis[0], axis[1], axis[2]);
Rotation3D delta = new Rotation3D(odeltaA, angle);
Transform3D oNewOverrideTrans = new Transform3D(delta);
Transform3D oFinalM = Transform3D.Multiply(oMoveBackToOrigM, oNewOverrideTrans);
oFinalM = Transform3D.Multiply(oFinalM, oMoveBackToOrigM.Inverse());
doc.Models.OverridePermanentTransform(coll, oFinalM, true);
}
}