RevitCommandId _linkRevitCommandId = null;
public Result OnStartup(UIControlledApplication application)
{
if (existTDMS())
{
_linkRevitCommandId = RevitCommandId.LookupPostableCommandId(PostableCommand.LinkRevit);
if (_linkRevitCommandId.CanHaveBinding)
{
AddInCommandBinding commandBinding = application.CreateAddInCommandBinding(_linkRevitCommandId);
commandBinding.Executed += CommandBinding_Executed;
}
}
}
private void CommandBinding_Executed(object sender, Autodesk.Revit.UI.Events.ExecutedEventArgs e)
{
TDMS.TDMSApplication tdmsApplication = null;
initTDMS(ref tdmsApplication);
if (tdmsApplication != null)
{
TDMS.TDMSSelectObjectDlg dialog = tdmsApplication.Dialogs.SelectObjectDlg;
dialog.ParentWindow = System.Diagnostics.Process.GetCurrentProcess().MainWindowHandle.ToInt32();
if (dialog.Show())
{
Document document = (sender as UIApplication).ActiveUIDocument.Document;
string fileFullName = document.PathName;
Regex regex = new Regex(_alxdOptions.PathPattern, RegexOptions.IgnoreCase);
MatchCollection matches = regex.Matches(fileFullName);
if (matches.Count < 1)
return;
if (matches[0].Groups.Count < 4)
return;
string documentGUID = matches[0].Groups[2].Value;
TDMS.TDMSObject selectedObject = dialog.Objects[0];
if (selectedObject.GUID == documentGUID)
{
TaskDialog.Show("Предупреждение", string.Format("Выбран объект текущего файла. Файл не может ссылаться сам на себя!\nОбъект: {0}", selectedObject.Description));
}
else
{
Transaction tr = null;
try
{
tdmsApplication.Commands["CMD_REVIT_OPEN_HOOK"].Execute(selectedObject);
string selectedFile = tdmsApplication.Dictionary.Item("ALXDINTERCEPT");
if (string.IsNullOrEmpty(selectedFile))
TaskDialog.Show("Предупреждение", string.Format("Невозможно подготовить файлы для открытия у объекта!\nОбъект: {0}", selectedObject.Description));
else
{
if (HasRevitLinkByFilename(document, selectedFile))
TaskDialog.Show("Предупреждение", string.Format("Файл выбранного объекта уже вставлен в модель!\nФайл: {0}", selectedFile));
else
{
tr = new Transaction((sender as UIApplication).ActiveUIDocument.Document);
tr.Start("Add revit link from TDMS");
ModelPath mp = ModelPathUtils.ConvertUserVisiblePathToModelPath(selectedFile);
RevitLinkOptions rlo = new RevitLinkOptions(false);
var linkType = RevitLinkType.Create(document, mp, rlo);
var instance = RevitLinkInstance.Create(document, linkType.ElementId);
tr.Commit();
}
}
}
catch (Exception ex)
{
if (tr != null)
tr.RollBack();
TaskDialog.Show("Ошибка", ex.Message);
}
}
}
}
}
private bool existTDMS()
{
return Type.GetTypeFromProgID(_tdmsProgId) != null;
}
private void initTDMS(ref TDMS.TDMSApplication tdmsApplication)
{
Type tdmsType = Type.GetTypeFromProgID(_tdmsProgId);
if (tdmsType == null)
{
TaskDialog.Show("Предупреждение", "Внимание! Невозможно корректно сохранить файл в TDMS, т.к. система TDMS не обнаружена на этом компьютере!", TaskDialogCommonButtons.Ok);
return;
}
try
{
tdmsApplication = (TDMS.TDMSApplication)Microsoft.VisualBasic.Interaction.GetObject("", _tdmsProgId);
tdmsApplication.Visible = true;
}
catch
{
if (TaskDialog.Show("Предупреждение", "Внимание! Невозможно корректно сохранить файл в TDMS, т.к. система TDMS не обнаружена на этом компьютере!", TaskDialogCommonButtons.Yes & TaskDialogCommonButtons.No) == TaskDialogResult.Yes)
{
try
{
tdmsApplication = (TDMS.TDMSApplication)System.Activator.CreateInstance(tdmsType, true);
tdmsApplication.Visible = true;
}
catch
{
tdmsApplication = null;
TaskDialog.Show("Предупреждение", "Внимание! Сдача файлов в TDMS прервана, т.к. систему TDMS не удалось открыть!", TaskDialogCommonButtons.Ok);
return;
}
}
else
{
tdmsApplication = null;
return;
}
}
}
public bool HasRevitLinkByFilename(Document doc, string linkFileName)
{
FilteredElementCollector collector = new FilteredElementCollector(doc);
collector.OfClass(typeof(RevitLinkInstance));
foreach (Element elem in collector)
if ((elem as RevitLinkInstance).GetLinkDocument().PathName.ToLower().CompareTo(linkFileName.ToLower()) == 0)
{
collector.Dispose();
return true;
}
collector.Dispose();
return false;
}