3DCenter.ru

Здравствуйте, гость ( Вход | Регистрация )

 
Reply to this topicStart new topic
> Получение информации из .max файла
InfecteD
сообщение 14/08/2013, 23:24
Сообщение #1


Уважаемый
Иконка группы

Группа: Пользователи
Сообщений: 812
Регистрация: 08/09/2007
Пользователь №: 56 679



Привет всем !
Недавно начал изучать C# и хочу сделать простой asset manager , который будет получать пути ассетов из max файла , с возможностью менять их пути. Используя библиотеку OpenMCDF довольно просто считать ассеты из стрима "FileAssetMetadata2" (для макса 2012) , но вот когда дело доходит до изменения путей , тут начинается свистопляска.
Вот код для чтения и закидывания результата в DataGridView :
Код
        private void button1_Click(object sender, EventArgs e)
        {
            string pathToMax = Variables.Temp1;

            var dt = new DataTable("T1");
            dt.Columns.AddRange(new[] { new DataColumn("Asset Type"), new DataColumn("Asset Path"), new DataColumn("Missing"), new DataColumn("FileName") });
            var cFile = new CompoundFile(pathToMax);
            cFile.GetAllNamedEntries("FileAssetMetadata2");
            CFStream rsStream = cFile.RootStorage.GetStream("FileAssetMetadata2");
            byte[] buffer = rsStream.GetData();
            string strdata = Encoding.Unicode.GetString(buffer);
            var splitchar = new[] { '\x00' };
            string[] assetdata = strdata.Split(splitchar, strdata.Length);
            new DataGridViewRow();
            for (int i = 0; i < assetdata.Length - 4; i += 4)
            {
                string miss;
                if (File.Exists(Path.GetDirectoryName(pathToMax) + @"\" + Path.GetFileName(assetdata[i + 3])))
                {
                    miss = "Ok";
                }
                else
                {
                    miss = "Miss";
                    Miss = true;
                }
                if (Path.GetDirectoryName(assetdata[i + 3]) == "")
                {
                    string pathstring = Path.GetDirectoryName(pathToMax) + @"\" + Path.GetFileName(assetdata[i + 3]);
// ReSharper disable once CoVariantArrayConversion
                    dt.Rows.Add(new[] { assetdata[i + 1], pathstring, miss, Path.GetFileName(assetdata[i + 3]) });
                }
                else
                {
// ReSharper disable once CoVariantArrayConversion
                    dt.Rows.Add(new[] { assetdata[i + 1], assetdata[i + 3], miss, Path.GetFileName(assetdata[i + 3]) });
                }
            }
            dataGridView1.DataSource = dt;



            //Console.ReadKey();
        }


Как видите тут ничего сложного в принципе нет , читаем стрим , разделяем строку при помощи символа \x00 , и каждый 4-ый кидаем в датагрид , по пути проверяя если файл есть.

При изменении пути я придумал следующий алгоритм :
1. выбирается строка в датагриде
2. создается массив стринговский в котором ищется путь по совпадению
3. создается byte[] массив , в который записывается найденный по совпадению путь
4. в основном byte[] массиве всех ассетов находится этот созданный массив с "путем", который мы хотим заменить
5. в диалоговом окне спрашивается новый путь
6. конвертируется новый путь в byte[] попутно разделяя каждый символ HEX "00" , как в структуре (по-другому макс откажется открывать сцену)
7. заменяется в основном массиве найденный путь на новый.

Пожалуйста, поправьте если что-то не так , и я очень хотел попросить помощи у знающих , как правильно конвертировать , находить и заменять в byte[] массивах другие byte[] массивы.

Ещё я хочу сделать простую open-source библиотеку для работы с данными .max файла простейшими функциями и выложить её в открытый доступ , думаю это многим поможет.

Также я сейчас работаю над функциями, которые вытаскивают некоторые дополнительные данные, такие как
список объектов , название рендера , версия макс файла , получение наименования пользователя и компьютера сделавшего последние изменения, размер выходного рендера , кадры анимации , наименования материалов.

Спасибо заранее за помощь !

Сообщение отредактировал InfecteD - 14/08/2013, 23:26
Go to the top of the page
 
+Quote Post
InfecteD
сообщение 15/08/2013, 22:22
Сообщение #2


Уважаемый
Иконка группы

Группа: Пользователи
Сообщений: 812
Регистрация: 08/09/2007
Пользователь №: 56 679



Если кто-то разбирается в С++ , гляньте пожалуйста сюда
http://pastebin.com/LqAGSX7B
это я вытащил из 3dsmax 2012 SDk , и это вроде функция по изменению ассета в OLE.
Go to the top of the page
 
+Quote Post
InfecteD
сообщение 23/08/2013, 15:44
Сообщение #3


Уважаемый
Иконка группы

Группа: Пользователи
Сообщений: 812
Регистрация: 08/09/2007
Пользователь №: 56 679



какие все скромные smile.gif
Go to the top of the page
 
+Quote Post
Bilbo99
сообщение 02/02/2014, 04:57
Сообщение #4


Новичок
Иконка группы

Группа: Пользователи
Сообщений: 1
Регистрация: 02/02/2014
Пользователь №: 99 114



ссылка битая. Проверь.
Go to the top of the page
 
+Quote Post
Oleg rus
сообщение 16/07/2014, 00:50
Сообщение #5


Уже не новичок
Иконка группы

Группа: Пользователи
Сообщений: 19
Регистрация: 13/07/2014
Пользователь №: 102 939



А можно ли с помощью 3DMax SDK 2012 добовлять 3DS модели в сцену созданую с помощью DirectX9SDK ?
Go to the top of the page
 
+Quote Post
Bots
сообщение Системное сообщение






Fast ReplyReply to this topicStart new topic

1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 



RSS Текстовая версия Сейчас: 29/03/2024 - 13:26