Войти
ПрограммированиеПодсказкиОбщее

Копирование текста из MAXScript Listener в GMax

Внимание! Этот документ ещё не опубликован.

Автор:

Многие знакомы с 3D редактором GMax - это бесплатный и легкий редактор, по сути - сильно облегченная версия 3ds Max.
Но, у него есть существенный минус - ограниченные возможности MAXScript Listener. Да, можно написать скрипт, который
экспортирует объекты сцены. Но, отсутствует возможность нормального сохранения результатов работы этого скрипта:
нельзя создать ни log файл, ни файловый поток. Единственный выход из ситуации - обычный Copy+Paste.
И тут опять загвоздка - текст из окна Listener'a копируется сильно урезаными кусками.

Конечно это не проблема для того, кто знаком с WinAPI:

#include <windows.h>

void ErrorMessage(string text, int code)
{
  MessageBoxA(0, text, "MAXScript Listener Capture", MB_OK | MB_ICONERROR);
  exit(code);
}

int main()
{
  HWND listener = FindWindowA(0, "MAXScript Listener");
  if (!listener)
    ErrorMessage("Listener window is not found", 1);

  HWND editor = FindWindowExA(listener, 0, "RICHEDIT", 0);
  if (!editor)
    ErrorMessage("Editor window is not found", 2);

  DWORD text_length = (DWORD)SendMessageA(editor, WM_GETTEXTLENGTH, 0, 0);
  if (!text_length)
    ErrorMessage("Nothing to copy", 3);

  char* buffer = new char[text_length+1];
  buffer[text_length-1] = 0;

  DWORD num_chars = (DWORD)SendMessageA(editor, WM_GETTEXT, text_length, (LPARAM)buffer);

  HANDLE console = GetStdHandle(STD_OUTPUT_HANDLE);
  DWORD  written = 0;
  WriteFile(console, buffer, num_chars, &written, 0);

  delete[] buffer;

  if (num_chars != written)
    ErrorMessage("Failed to write all data", 4);

  return 0;
}

Что этот код делает? Находит окно Listener'a и просто выводит его содержимое в консоль.
Используется следующим образом:
max_capture > out.txt

То есть, просто перенаправляем STDOUT в файл out.txt.

Теперь про copy+paste можно забыть.

#3D Studio MAX, #MAX Script

27 июня 2010