private void ExportFbx(string displayName) { PluginRecord FBXPluginrecord = Autodesk.Navisworks.Api.Application.Plugins.FindPlugin("NativeExportPluginAdaptor_LcFbxExporterPlugin_Export.Navisworks"); if (FBXPluginrecord != null) { if (!FBXPluginrecord.IsLoaded) { FBXPluginrecord.LoadPlugin(); } string[] pa = { exportPath + "/" + displayName.Replace("=", "#").Replace("/", "#") + ".fbx" }; #region way 1: by base class of plugin //Plugin FBXplugin = // FBXPluginrecord.LoadedPlugin as Plugin; //FBXplugin.GetType().InvokeMember("Execute", // System.Reflection.BindingFlags.InvokeMethod, // null, FBXplugin, pa); #endregion //way 2: by specific class of export plugin NativeExportPluginAdaptor FBXplugin = FBXPluginrecord.LoadedPlugin as NativeExportPluginAdaptor; FBXplugin.Execute(pa); } }
/// <summary> /// Нужно пройти по дереву до уровня слоев и затем выполнять выгрузку /// Слои раскладывать по папкам в соответствии с названиями файлов и вложенностью файлов /// </summary> /// <param name="items"></param> private void ExportByLayers(ModelItemEnumerableCollection items, string fbxPath, DocumentModels docModels, NativeExportPluginAdaptor FBXplugin) { //if (n < 20)//TEST //{ int n = 0; foreach (ModelItem item in items) { //Скрывать все кроме текущего элемента docModels.SetHidden(items, true); docModels.SetHidden(new List <ModelItem> { item }, false); //item.is //Нужно проверить, что у объекта нет свойства путь к источнику DataProperty sourceProp = item.PropertyCategories.FindPropertyByName("LcOaNode", "LcOaPartitionSourceFilename"); if (sourceProp == null) { //Выполнять выгрузку if (!Directory.Exists(fbxPath)) { Directory.CreateDirectory(fbxPath); } string name = item.DisplayName; if (String.IsNullOrEmpty(name))//Если у объекта нет имени, то подставить цифру { name = n.ToString(); n++; } name = name + ".fbx"; name = Common.Utils.GetSafeFilename(name); string fileName = Path.Combine(fbxPath, name); if (!File.Exists(fileName)) { FBXplugin.Execute(fileName); } //n++;//TEST } else { //Дополнить путь выгрузки новой папкой string name = item.DisplayName; name = Common.Utils.GetSafeFilename(name); name = Path.GetFileNameWithoutExtension(name); string fbxPathToChildren = Path.Combine(fbxPath, name); //Рекурсивный вызов ExportByLayers(item.Children, fbxPathToChildren, docModels, FBXplugin); } } //} }
public override int Execute(params string[] parameters) { Win.MessageBoxResult result = Win.MessageBoxResult.Yes; if (ManualUse) { result = Win.MessageBox.Show("Перед экспортом FBX, нужно скрыть те элементы модели, которые не нужно экспортировать. " + "А так же нужно настроить параметры экспорта в FBX на экспорт ЛИБО В ФОРМАТЕ ASCII, ЛИБО В ДВОИЧНОМ ФОРМАТЕ ВЕРСИИ НЕ НОВЕЕ 2018. " + "Рекомендуется так же отключить экспорт источников света и камер. " + "\n\nНачать выгрузку FBX?", "Выгрузка FBX", Win.MessageBoxButton.YesNo); } if (result == Win.MessageBoxResult.Yes) { try { PluginRecord FBXPluginrecord = Application.Plugins. FindPlugin("NativeExportPluginAdaptor_LcFbxExporterPlugin_Export.Navisworks"); if (FBXPluginrecord != null) { if (!FBXPluginrecord.IsLoaded) { FBXPluginrecord.LoadPlugin(); } NativeExportPluginAdaptor FBXplugin = FBXPluginrecord.LoadedPlugin as NativeExportPluginAdaptor; Document doc = Application.ActiveDocument; string fbxPath = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments); string docPath = doc.FileName; string defFBXFileName = ""; if (!String.IsNullOrEmpty(docPath)) { fbxPath = Path.GetDirectoryName(docPath); defFBXFileName = Path.GetFileNameWithoutExtension(docPath) + ".fbx"; } //Указание пользователем имени файла для fbx string fbxFullFileName = null; if (ManualUse) { WinForms.SaveFileDialog sFD = new WinForms.SaveFileDialog(); sFD.InitialDirectory = fbxPath; sFD.Filter = "fbx files (*.fbx)|*.fbx"; sFD.FilterIndex = 1; sFD.RestoreDirectory = true; if (!String.IsNullOrWhiteSpace(defFBXFileName)) { sFD.FileName = defFBXFileName; } sFD.Title = "Укажите файл для записи fbx"; if (sFD.ShowDialog() == WinForms.DialogResult.OK) { fbxFullFileName = sFD.FileName; } } else { fbxFullFileName = FBXSavePath; FileAttributes attr = File.GetAttributes(fbxFullFileName); if (attr.HasFlag(FileAttributes.Directory)) { //добавить имя файла fbxFullFileName = Path.Combine(fbxFullFileName, FBXFileName); } } if (!String.IsNullOrEmpty(fbxFullFileName)) { string notEditedDirectory = Path.Combine(Path.GetDirectoryName(fbxFullFileName), "NotEdited"); if (!Directory.Exists(notEditedDirectory)) { Directory.CreateDirectory(notEditedDirectory); } string notEditedFileName = Path.Combine(notEditedDirectory, Path.GetFileName(fbxFullFileName)); if (ManualUse) { BusyIndicatorHelper.ShowBusyIndicator(); BusyIndicatorHelper.SetMessage("Стандартный экспорт FBX"); } if (FBXplugin.Execute(notEditedFileName) == 0)//Выполнить экспорт в FBX { if (ManualUse) { BusyIndicatorHelper.SetMessage("Редактирование FBX"); } bool isASCII = IsASCIIFBXFile(notEditedFileName); if (isASCII || GetBinaryVersionNum(notEditedFileName) <= 7500) { //Прочитать модель, составить очередь имен для подстановки в FBX Queue <FBX.NameReplacement> replacements = new Queue <FBX.NameReplacement>(); DocumentModels docModels = doc.Models; ModelItemEnumerableCollection rootItems = docModels.RootItems; //if (rootItems.Count() > 1) //{ // //Если в Navis несколько корневых узлов (как в nwf), // //то один узел в самом начале FBX должен быть пропущен // //Там появится узел Environment // replacements.Enqueue(new FBX.NameReplacement()); //} ComApi.InwOpState3 oState = ComApiBridge.ComApiBridge.State; NameReplacementQueue(rootItems, replacements, oState); if (rootItems.Count() == 1) { //Обозначить, что первый узел имеет ненадежное имя. //В FBX оно всегда - Environment, а в Navis - имя открытого файла //replacements.Peek().OldNameTrustable = false; //Если корневой узел один, то убрать его из списка. Его не будет в FBX replacements.Dequeue(); } //Первый узел в списке замены должен обязательно иметь верное имя //(в начале списка могут быть с пустым значением, которые отключены в Navis) while (!replacements.Peek().OldNameTrustable) { replacements.Dequeue(); } //Отредактировать FBX FBX.ModelNamesEditor fbxEditor = null; if (IsASCIIFBXFile(notEditedFileName)) { fbxEditor = new FBX.ASCIIModelNamesEditor(notEditedFileName, replacements); } else /*if (GetBinaryVersionNum(sFD.FileName) <= 7500)*/ { fbxEditor = new FBX.BinaryModelNamesEditor(notEditedFileName, replacements); } fbxEditor.FbxFileNameEdited = fbxFullFileName; fbxEditor.EditModelNames(); if (ManualUse) { BusyIndicatorHelper.CloseBusyIndicator(); Win.MessageBox.Show("Файл FBX с отредактированными именами моделей - " + fbxEditor.FbxFileNameEdited, "Готово", Win.MessageBoxButton.OK, Win.MessageBoxImage.Information); } } else { throw new Exception("Неподдерживаемый формат FBX"); } } else { throw new Exception("При экспорте FBX из NavisWorks произошли ошибки"); } if (ManualUse) { //на всякий случай BusyIndicatorHelper.CloseBusyIndicator(); } } } } catch (Exception ex) { CommonException(ex, "Ошибка при экспорте в FBX из Navis"); } } return(0); }
public override int Execute(params string[] parameters) { Win.MessageBoxResult result = Win.MessageBox.Show("Перед экспортом FBX, нужно скрыть те элементы модели, которые не нужно экспортировать. " + "А так же нужно настроить параметры экспорта в FBX на экспорт в формате ASCII" + "\n\nНачать выгрузку FBX?", "Выгрузка FBX", Win.MessageBoxButton.YesNo); if (result == Win.MessageBoxResult.Yes) { try { //ComApi.InwOpState3 oState = ComApiBridge.ComApiBridge.State; PluginRecord FBXPluginrecord = Application.Plugins. FindPlugin("NativeExportPluginAdaptor_LcFbxExporterPlugin_Export.Navisworks"); if (FBXPluginrecord != null) { if (!FBXPluginrecord.IsLoaded) { FBXPluginrecord.LoadPlugin(); } NativeExportPluginAdaptor FBXplugin = FBXPluginrecord.LoadedPlugin as NativeExportPluginAdaptor; Document doc = Application.ActiveDocument; string fbxPath = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments); string docPath = doc.FileName; string defFBXFileName = ""; if (!String.IsNullOrEmpty(docPath)) { fbxPath = Path.GetDirectoryName(docPath); defFBXFileName = Path.GetFileNameWithoutExtension(docPath) + ".fbx"; } //Указание пользователем имени файла для fbx WinForms.SaveFileDialog sFD = new WinForms.SaveFileDialog(); sFD.InitialDirectory = fbxPath; sFD.Filter = "fbx files (*.fbx)|*.fbx"; sFD.FilterIndex = 1; sFD.RestoreDirectory = true; if (!String.IsNullOrWhiteSpace(defFBXFileName)) { sFD.FileName = defFBXFileName; } sFD.Title = "Укажите файл для записи fbx"; if (sFD.ShowDialog() == WinForms.DialogResult.OK) { //Выполнить экспорт в FBX if (0 == FBXplugin.Execute(sFD.FileName)) { if (IsASCIIFBXFile(sFD.FileName)) { DocumentModels docModels = doc.Models; ModelItemEnumerableCollection rootItems = docModels.RootItems; string editedFBXFileName = Common.Utils .GetNonExistentFileName(Path.GetDirectoryName(sFD.FileName), Path.GetFileNameWithoutExtension(sFD.FileName) + "_Edited", "fbx"); fBXCurrObjLine = null; using (StreamWriter sw = new StreamWriter(editedFBXFileName)) { using (StreamReader sr = new StreamReader(sFD.FileName)) { OverwriteFBX(rootItems, sw, sr, false); //Дописать FBX до конца sw.Write(sr.ReadToEnd()); } } Win.MessageBox.Show("Готово", "Готово", Win.MessageBoxButton.OK, Win.MessageBoxImage.Information); } else { //FBX не ASCII throw new Exception("FBX не в формате ASCII"); } } else { //Ошибки при экспорте throw new Exception("Возникли ошибки при экспорте FBX"); } } } } catch (Exception ex) { CommonException(ex, "Ошибка при экспорте в FBX"); } } return(0); }