Beispiel #1
0
        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);
            }
        }
Beispiel #2
0
        //int n = 0;//TEST
        public override int Execute(params string[] parameters)
        {
            //n = 0;//TEST

            Win.MessageBoxResult result = Win.MessageBox.Show("Начать выгрузку 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;
                        if (!String.IsNullOrEmpty(docPath))
                        {
                            fbxPath = Path.GetDirectoryName(docPath);
                        }

                        DocumentModels docModels = doc.Models;
                        ModelItemEnumerableCollection rootItems = docModels.RootItems;
                        ExportByLayers(rootItems, fbxPath, docModels, FBXplugin);

                        Win.MessageBox.Show("Готово", "Готово", Win.MessageBoxButton.OK, Win.MessageBoxImage.Information);
                    }
                }
                catch (Exception ex)
                {
                    CommonException(ex, "Ошибка при экспорте в FBX по слоям");
                }
            }

            return(0);
        }
Beispiel #3
0
        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);
        }
Beispiel #4
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);
        }
Beispiel #5
0
        /// <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);
                }
            }
            //}
        }