Hi guys, I'm trying to implement a .fbx or .abc import logic in a c++ plugin and i have encountered some strange errors.
I use ImportFromFile() function and it seems to work until some point. It recognises what file to import but cant crashes wile doing it. In .abc the code opens the Alembic Import Options but then after clicking import is says "Improper file format", when doing the same thing but with .fbx it just gives a blank error. The code also has a result check implemented that shows me that the file was imported successfully (when it certainly was not). Additionally when using CanImportFile() instead of ImportFromFile() it throws out FALSE so it cant even import those files. Here is the whole code. I'll add that it needs to be done in C++ as it will be a part of the bigger plugin so doing it in the maxScript is a no go. I also tried to implement this logic as a maxScript insert but it just did nothing. Surely I have to be doing something wrong, but I can't seem to find what.
Thanks for help guys and gals!
#include "ObjectImporter.h"
#include "ui_plugin_form.h"
#include "qmessagebox.h"
#include "qobject.h"
#include "maxscript\maxscript.h"
#include "maxscript\macros\define_instantiation_functions.h"
#define ObjectImporter_CLASS_ID Class_ID(0x859e8ae4, 0x6b2b1e41)
using namespace MAXScript;
class ObjectImporter : public UtilityObj, public QObject
{
public:
IUtil* iu;
Interface* ip;
// Constructor/Destructor
ObjectImporter();
virtual ~ObjectImporter();
void DeleteThis() override {}
void BeginEditParams(Interface* ip, IUtil* iu) override;
void EndEditParams(Interface* ip, IUtil* iu) override;
virtual void Init(HWND hWnd);
virtual void Destroy(HWND hWnd);
// Singleton access
static ObjectImporter* GetInstance()
{
static ObjectImporter theObjectImporter;
return &theObjectImporter;
}
private:
void ImportFromPath(const wchar_t* filePath);
void ImportFileFromMaxscript(const MCHAR* filePath);
QWidget* widget;
Ui::PluginRollup ui;
};
class ObjectImporterClassDesc : public ClassDesc2
{
public:
int IsPublic() override { return TRUE; }
void* Create(BOOL /*loading = FALSE*/) override { return ObjectImporter::GetInstance(); }
const TCHAR* ClassName() override { return GetString(IDS_CLASS_NAME); }
const TCHAR* NonLocalizedClassName() override { return _T("ObjectImporter"); }
SClass_ID SuperClassID() override { return UTILITY_CLASS_ID; }
Class_ID ClassID() override { return ObjectImporter_CLASS_ID; }
const TCHAR* Category() override { return GetString(IDS_CATEGORY); }
const TCHAR* InternalName() override { return _T("ObjectImporter"); } // Returns fixed parsable name (scripter-visible name)
HINSTANCE HInstance() override { return hInstance; } // Returns owning module handle
};
ClassDesc2* GetObjectImporterDesc()
{
static ObjectImporterClassDesc ObjectImporterDesc;
return &ObjectImporterDesc;
}
//--- ObjectImporter -------------------------------------------------------
ObjectImporter::ObjectImporter()
: iu(nullptr)
{
}
ObjectImporter::~ObjectImporter()
{
}
void ObjectImporter::BeginEditParams(Interface* ip, IUtil* iu)
{
this->iu = iu;
this->ip = ip;
widget = new QWidget;
ui.setupUi(widget);
// We can connect UI signals here using Qt Functor syntax
QObject::connect(ui.pushButton, &QPushButton::clicked, this, [this]
{
ImportFromPath(_T("D:\\projects\\\3dsMax\\res\\ConeABC.abc"));
});
ip->AddRollupPage(*widget, L"Plug-in Rollup");
}
void ObjectImporter::EndEditParams(Interface* ip, IUtil*)
{
this->iu = nullptr;
ip->DeleteRollupPage(*widget);
}
void ObjectImporter::Init(HWND /*handle*/)
{
}
void ObjectImporter::Destroy(HWND /*handle*/)
{
}
void ObjectImporter::ImportFromPath(const wchar_t* filePath)
{
int result = ip->ImportFromFile(filePath, FALSE);
if(result != IO_OK)
{
MessageBox(GetCOREInterface()->GetMAXHWnd(), _T("Error importing file."), _T("Import Error"), MB_OK | MB_ICONERROR);
}
else
{
MessageBox(GetCOREInterface()->GetMAXHWnd(), _T("File imported successfully."), _T("Import Successful"), MB_OK | MB_ICONINFORMATION);
}
}
void ObjectImporter::ImportFileFromMaxscript(const MCHAR* filePath)
{
std::wstring scriptMessage = L"importFile ";
std::wstring endMessage = L" #noPrompt";
scriptMessage += filePath;
scriptMessage += endMessage;
const wchar_t* scriptMessageChar = scriptMessage.c_str();
ExecuteMAXScriptScript(scriptMessageChar, MAXScript::ScriptSource::DynamicAlways, FALSE);
ip->LoadFromFile(filePath);
}
Can't find what you're looking for? Ask the community or share your knowledge.