cancel
Showing results for 
Search instead for 
Did you mean: 
EN
cancel
Showing results for 
Search instead for 
Did you mean: 
rubbcs
Contributor

Save as IFC after file is opened

Hi,

I have a process want to do:

1. Open File.pln.

2. Check File.pln is opened and save as IFC by "Do_Save_IfcFile".

3. Quit Archicad. 

 

I have followed this topic below and try to save as ifc file inside "APINotify_Open" event. 

But "Do_Save_IfcFile" throws error seems the file is not fully opened.

I am using Archicad 26. Any ways I can save as ifc after file is fully opened? Thanks a lot.

https://community.graphisoft.com/t5/Archicad-C-API/Run-a-script-when-file-is-loaded-C/m-p/268283

 

rubbcs_0-1724904696260.png

 

1 Solution

Accepted Solutions
Hiromichi Shinkawa
Graphisoft
Graphisoft

Hi,

Please try the following code to see whether you can save as ifc file:

#include	"SaveAndRestoreVariable.hpp"

#include	"ResourceIDs.h"

#define SAVEIFC			'SIFC'

// =============================================================================
//
// Main functions
//
// =============================================================================

GSErrCode __ACENV_CALL SaveIFCFunction(GSHandle /* params */, GSPtr /* resultData */, bool /* silentMode */)
{
	GSErrCode	lastErr = NoError;

	ACAPI_KeepInMemory(true);

	API_ProjectInfo		projectInfo = {};
	lastErr = ACAPI_Environment(APIEnv_ProjectID, &projectInfo);
	if (lastErr != NoError || projectInfo.untitled)
		return APIERR_NOPLAN;

	// Set the output IFC file's locations (it's beside the plan file)
	IO::Name	llName;
	projectInfo.location->GetLastLocalName(&llName);
	llName.DeleteExtension();
	llName.AppendExtension("ifc");
	projectInfo.location->SetLastLocalName(llName);

	// Get a suitable translator
	API_IFCTranslatorIdentifier firstTranslator;
	GS::Array<API_IFCTranslatorIdentifier> ifcExportTranslators;
	lastErr = ACAPI_IFC_GetIFCExportTranslatorsList (ifcExportTranslators);
	if (lastErr != NoError) {
		return APIERR_GENERAL;
	}
	else {
		if (DBVERIFY(!ifcExportTranslators.IsEmpty()))
			firstTranslator = ifcExportTranslators.GetFirst();
	}

	// Set the output parameters
	API_FileSavePars fileSave = {};
	fileSave.fileTypeID = APIFType_IfcFile;
	fileSave.file = projectInfo.location;

	// Set the output parameters for IFC
	API_SavePars_Ifc ifcPars = {};
	ifcPars.subType = API_IFC;

	ifcPars.elementsToIfcExport = API_EntireProject;
	ifcPars.translatorIdentifier = firstTranslator;
	ifcPars.elementsSet = nullptr;

	lastErr = ACAPI_Automate(APIDo_SaveID, &fileSave, &ifcPars);

	return lastErr;
}


static GSErrCode AllInputNotificationHandler(API_NotifyEventID notifID, Int32 /*param*/)
{
	if (notifID == APINotify_AllInputFinished) {
		API_ModulID mdid = {};
		mdid.developerID	= MDID_DEVELOPER_ID;
		mdid.localID		= MDID_LOCAL_ID;
		ACAPI_Command_CallFromEventLoop(&mdid, SAVEIFC, 1L, nullptr, false, nullptr);
	}

	ACAPI_KeepInMemory(true);

	return NoError;
}

// =============================================================================
//
// Required functions
//
// =============================================================================

// -----------------------------------------------------------------------------
// Dependency definitions
// -----------------------------------------------------------------------------

API_AddonType	__ACENV_CALL	CheckEnvironment (API_EnvirParams* envir)
{
	RSGetIndString (&envir->addOnInfo.name, ID_ADDON_INFO, 1, ACAPI_GetOwnResModule());
	RSGetIndString (&envir->addOnInfo.description, ID_ADDON_INFO, 2, ACAPI_GetOwnResModule());

	return APIAddon_Preload;
}		// CheckEnvironment


// -----------------------------------------------------------------------------
// Interface definitions
// -----------------------------------------------------------------------------

GSErrCode	__ACENV_CALL	RegisterInterface (void)
{
	GSErrCode err = ACAPI_Register_SupportedService(SAVEIFC, 1L);

	return err;
}		// RegisterInterface


// -----------------------------------------------------------------------------
// Called when the Add-On has been loaded into memory
// to perform an operation
// -----------------------------------------------------------------------------

GSErrCode	__ACENV_CALL Initialize	(void)
{
	GSErrCode 	err = ACAPI_Install_ModulCommandHandler(SAVEIFC, 1L, SaveIFCFunction);
	err |= ACAPI_Notify_CatchProjectEvent(APINotify_AllInputFinished, AllInputNotificationHandler);

	return err;
}		// Initialize


// -----------------------------------------------------------------------------
// FreeData
//		called when the Add-On is going to be unloaded
// -----------------------------------------------------------------------------

GSErrCode __ACENV_CALL	FreeData (void)
{
	return NoError;
}		// FreeData

HTH.

Go to post

4 Replies 4
Hiromichi Shinkawa
Graphisoft
Graphisoft

Hi,

I'm afraid you cannot call ifc save function during the file opening operation. I'd suggest you to try APINotify_AllInputFinished.

HTH.

rubbcs
Contributor

Thanks for your suggestion. I have tried "APINotify_AllInputFinished" but still fail with "APIERR_BADWINDOW" message.

rubbcs_0-1725010252559.png

 

Hiromichi Shinkawa
Graphisoft
Graphisoft

Hi,

Please try the following code to see whether you can save as ifc file:

#include	"SaveAndRestoreVariable.hpp"

#include	"ResourceIDs.h"

#define SAVEIFC			'SIFC'

// =============================================================================
//
// Main functions
//
// =============================================================================

GSErrCode __ACENV_CALL SaveIFCFunction(GSHandle /* params */, GSPtr /* resultData */, bool /* silentMode */)
{
	GSErrCode	lastErr = NoError;

	ACAPI_KeepInMemory(true);

	API_ProjectInfo		projectInfo = {};
	lastErr = ACAPI_Environment(APIEnv_ProjectID, &projectInfo);
	if (lastErr != NoError || projectInfo.untitled)
		return APIERR_NOPLAN;

	// Set the output IFC file's locations (it's beside the plan file)
	IO::Name	llName;
	projectInfo.location->GetLastLocalName(&llName);
	llName.DeleteExtension();
	llName.AppendExtension("ifc");
	projectInfo.location->SetLastLocalName(llName);

	// Get a suitable translator
	API_IFCTranslatorIdentifier firstTranslator;
	GS::Array<API_IFCTranslatorIdentifier> ifcExportTranslators;
	lastErr = ACAPI_IFC_GetIFCExportTranslatorsList (ifcExportTranslators);
	if (lastErr != NoError) {
		return APIERR_GENERAL;
	}
	else {
		if (DBVERIFY(!ifcExportTranslators.IsEmpty()))
			firstTranslator = ifcExportTranslators.GetFirst();
	}

	// Set the output parameters
	API_FileSavePars fileSave = {};
	fileSave.fileTypeID = APIFType_IfcFile;
	fileSave.file = projectInfo.location;

	// Set the output parameters for IFC
	API_SavePars_Ifc ifcPars = {};
	ifcPars.subType = API_IFC;

	ifcPars.elementsToIfcExport = API_EntireProject;
	ifcPars.translatorIdentifier = firstTranslator;
	ifcPars.elementsSet = nullptr;

	lastErr = ACAPI_Automate(APIDo_SaveID, &fileSave, &ifcPars);

	return lastErr;
}


static GSErrCode AllInputNotificationHandler(API_NotifyEventID notifID, Int32 /*param*/)
{
	if (notifID == APINotify_AllInputFinished) {
		API_ModulID mdid = {};
		mdid.developerID	= MDID_DEVELOPER_ID;
		mdid.localID		= MDID_LOCAL_ID;
		ACAPI_Command_CallFromEventLoop(&mdid, SAVEIFC, 1L, nullptr, false, nullptr);
	}

	ACAPI_KeepInMemory(true);

	return NoError;
}

// =============================================================================
//
// Required functions
//
// =============================================================================

// -----------------------------------------------------------------------------
// Dependency definitions
// -----------------------------------------------------------------------------

API_AddonType	__ACENV_CALL	CheckEnvironment (API_EnvirParams* envir)
{
	RSGetIndString (&envir->addOnInfo.name, ID_ADDON_INFO, 1, ACAPI_GetOwnResModule());
	RSGetIndString (&envir->addOnInfo.description, ID_ADDON_INFO, 2, ACAPI_GetOwnResModule());

	return APIAddon_Preload;
}		// CheckEnvironment


// -----------------------------------------------------------------------------
// Interface definitions
// -----------------------------------------------------------------------------

GSErrCode	__ACENV_CALL	RegisterInterface (void)
{
	GSErrCode err = ACAPI_Register_SupportedService(SAVEIFC, 1L);

	return err;
}		// RegisterInterface


// -----------------------------------------------------------------------------
// Called when the Add-On has been loaded into memory
// to perform an operation
// -----------------------------------------------------------------------------

GSErrCode	__ACENV_CALL Initialize	(void)
{
	GSErrCode 	err = ACAPI_Install_ModulCommandHandler(SAVEIFC, 1L, SaveIFCFunction);
	err |= ACAPI_Notify_CatchProjectEvent(APINotify_AllInputFinished, AllInputNotificationHandler);

	return err;
}		// Initialize


// -----------------------------------------------------------------------------
// FreeData
//		called when the Add-On is going to be unloaded
// -----------------------------------------------------------------------------

GSErrCode __ACENV_CALL	FreeData (void)
{
	return NoError;
}		// FreeData

HTH.

rubbcs
Contributor

It's work. Thank you so much.

Didn't find the answer?

Check other topics in this Forum

Back to Forum

Read the latest accepted solutions!

Accepted Solutions

Start a new conversation!