BIM Coordinator Program (INT) April 22, 2024

Find the next step in your career as a Graphisoft Certified BIM Coordinator!

Archicad C++ API
About Archicad add-on development using the C++ API.

How to show/hide an element using C++

Anonymous
Not applicable
Hi

I want to show/hide an element using C++ code.
Is there a way to do that.

Thanks in advance.
4 REPLIES 4
Tibor Lorantfy
Graphisoft Alumni
Graphisoft Alumni
Hi,

You can hide an element by moving that to a hidden layer.
Here is an example code for this:
short		Create_HidddenLayer (void); 
 
// ----------------------------------------------------------------------------- 
// Hides an element with moving to a hidden layer 
// ----------------------------------------------------------------------------- 
 
GSErrCode	Hide_Element (const API_Guid& guid) 
{ 
	API_Element		element, mask; 
	GSErrCode		err = NoError; 
 
	BNZeroMemory (&element, sizeof (API_Element)); 
	element.header.guid = guid; 
 
	err = ACAPI_Element_Get (&element); 
	if (err != NoError) { 
		WriteReport_Err ("ACAPI_Element_Get failed.", err); 
		return err; 
	} 
 
	ACAPI_ELEMENT_MASK_CLEAR (mask); 
	ACAPI_ELEMENT_MASK_SET (mask, API_Elem_Head, layer); 
 
	element.header.layer = Create_HidddenLayer (); 
	if (element.header.layer == -1) 
		return Error; 
 
	return ACAPI_Element_Change (&element, &mask, NULL, 0, true); 
} 
 
// ----------------------------------------------------------------------------- 
//  Create a hidden layer 
// ----------------------------------------------------------------------------- 
 
short		Create_HidddenLayer (void) 
{ 
	API_Attribute	attrib; 
	GSErrCode		err = NoError; 
 
	BNZeroMemory (&attrib, sizeof (API_Attribute)); 
	attrib.header.typeID = API_LayerID; 
	attrib.header.flags  = APILay_Hidden; 
	strcpy (attrib.header.name, "Example_HiddenLayer"); 
 
	err = ACAPI_Attribute_Create (&attrib, NULL); 
	if (err == APIERR_ATTREXIST) { 
		WriteReport_Alert ("The layer already exists."); 
		return attrib.header.index; 
	} 
	if (err != NoError) { 
		WriteReport_Err ("Unable to create layer.", err); 
		return -1; 
	} 
 
	return attrib.header.index; 
}

Showing an element could be done the same way (move back to original layer for example).
I hope this is useful for you.

Regards,
Tibor
Anonymous
Not applicable
Tibor wrote:
Hi,

You can hide an element by moving that to a hidden layer.
Here is an example code for this:
short		Create_HidddenLayer (void); 
 
// ----------------------------------------------------------------------------- 
// Hides an element with moving to a hidden layer 
// ----------------------------------------------------------------------------- 
 
GSErrCode	Hide_Element (const API_Guid& guid) 
{ 
	API_Element		element, mask; 
	GSErrCode		err = NoError; 
 
	BNZeroMemory (&element, sizeof (API_Element)); 
	element.header.guid = guid; 
 
	err = ACAPI_Element_Get (&element); 
	if (err != NoError) { 
		WriteReport_Err ("ACAPI_Element_Get failed.", err); 
		return err; 
	} 
 
	ACAPI_ELEMENT_MASK_CLEAR (mask); 
	ACAPI_ELEMENT_MASK_SET (mask, API_Elem_Head, layer); 
 
	element.header.layer = Create_HidddenLayer (); 
	if (element.header.layer == -1) 
		return Error; 
 
	return ACAPI_Element_Change (&element, &mask, NULL, 0, true); 
} 
 
// ----------------------------------------------------------------------------- 
//  Create a hidden layer 
// ----------------------------------------------------------------------------- 
 
short		Create_HidddenLayer (void) 
{ 
	API_Attribute	attrib; 
	GSErrCode		err = NoError; 
 
	BNZeroMemory (&attrib, sizeof (API_Attribute)); 
	attrib.header.typeID = API_LayerID; 
	attrib.header.flags  = APILay_Hidden; 
	strcpy (attrib.header.name, "Example_HiddenLayer"); 
 
	err = ACAPI_Attribute_Create (&attrib, NULL); 
	if (err == APIERR_ATTREXIST) { 
		WriteReport_Alert ("The layer already exists."); 
		return attrib.header.index; 
	} 
	if (err != NoError) { 
		WriteReport_Err ("Unable to create layer.", err); 
		return -1; 
	} 
 
	return attrib.header.index; 
}

Showing an element could be done the same way (move back to original layer for example).
I hope this is useful for you.

Regards,
Tibor

Thank you for the help.
It creates hidden layer and code goes without any errors but the element does not disappear.

I'm calling the function by the following way
API_Guid apiGuid; 
	APIGuid2GSGuid (apiGuid).ConvertFromString("9C046988-FF12-406C-AFFF-DCDB0FAD4986");

	Hide_Element(apiGuid);
Please advice.
Tibor Lorantfy
Graphisoft Alumni
Graphisoft Alumni
ggiloyan wrote:
Thank you for the help.
It creates hidden layer and code goes without any errors but the element does not disappear.

I'm calling the function by the following way
API_Guid apiGuid;  
	APIGuid2GSGuid (apiGuid).ConvertFromString("9C046988-FF12-406C-AFFF-DCDB0FAD4986"); 
 
	Hide_Element(apiGuid); 


Please advice.

Did you used ACAPI_CallUndoableCommand?
Are you sure that this Guid is valid?

I tested this way and it worked for me:
// -----------------------------------------------------------------------------  
//  Hides clicked element 
// -----------------------------------------------------------------------------  
 
GSErrCode	Hide_Clicked_Element (void) 
{ 
	API_Guid	guid; 
 
	if (!ClickAnElem ("Click an elem to hide", API_ZombieElemID, NULL, NULL, &guid)) { 
		WriteReport_Alert ("No element was clicked"); 
		return Error; 
	} 
 
	return ACAPI_CallUndoableCommand ("Hide element", 
		[&] () -> GSErrCode { 
			return Hide_Element (guid); 
		}); 
}

ClickAnElem can be found in APICommon.c (so need to include APICommon.h).
Ralph Wessel
Mentor
Tibor wrote:
Did you used ACAPI_CallUndoableCommand?
Probably worth mentioning that ACAPI_CallUndoableCommand is only applicable to AC19. For earlier version you want to bound the call with ACAPI_OpenUndoableSession and ACAPI_CloseUndoableSession.
Ralph Wessel BArch
Learn and get certified!