Получение информации из .max файла |
Home· Статьи · Вакансии · Чертежи · 3D Галерея · 2D Галерея · Форум · Форум Realtime | Реклама |  Конкурсы | RAR Award | Правила |
Здравствуйте, гость ( Вход | Регистрация )
Получение информации из .max файла |
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 |
|
|
15/08/2013, 22:22
Сообщение
#2
|
|
Уважаемый Группа: Пользователи Сообщений: 812 Регистрация: 08/09/2007 Пользователь №: 56 679 |
Если кто-то разбирается в С++ , гляньте пожалуйста сюда
http://pastebin.com/LqAGSX7B это я вытащил из 3dsmax 2012 SDk , и это вроде функция по изменению ассета в OLE. |
|
|
23/08/2013, 15:44
Сообщение
#3
|
|
Уважаемый Группа: Пользователи Сообщений: 812 Регистрация: 08/09/2007 Пользователь №: 56 679 |
какие все скромные
|
|
|
02/02/2014, 04:57
Сообщение
#4
|
|
Новичок Группа: Пользователи Сообщений: 1 Регистрация: 02/02/2014 Пользователь №: 99 114 |
ссылка битая. Проверь.
|
|
|
16/07/2014, 00:50
Сообщение
#5
|
|
Уже не новичок Группа: Пользователи Сообщений: 19 Регистрация: 13/07/2014 Пользователь №: 102 939 |
А можно ли с помощью 3DMax SDK 2012 добовлять 3DS модели в сцену созданую с помощью DirectX9SDK ?
|
|
|
Bots |
Системное сообщение
|
|
|
|
|
Текстовая версия | Сейчас: 25/04/2024 - 09:34 |