We value your input!
Please participate in Archicad 28 Home Screen and Tooltips/Quick Tutorials survey

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

[SOLVED] How to get the Reserved status of an Attribute

Anonymous
Not applicable
Hi - how can I cn the Reserve/Lock status of an Attribute (a Surface in particular). The following code only seems to work for Elements, not Attributes.
API_LockableStatus lockableStatus = ACAPI_TeamworkControl_GetLockableStatus (attrib.header.guid);
Thanks

Paul
5 REPLIES 5
Anonymous
Not applicable
Bumping to hopefully get a reply pls.

Thanks

Paul
Tibor Lorantfy
Graphisoft Alumni
Graphisoft Alumni
Hi Paul,

Teamwork_Control example Add-On shows how to handle reservation of elements and attributes too.

Here is the solution for your problem: (copied from Teamwork_Control example Add-On)
// ---------------------------------- Types ------------------------------------ 
 
#define CitiesGuid				(APIGuidFromString ("5D8068E2-7430-4871-9D67-E06001F256A1")) 
#define CompositesGuid			(APIGuidFromString ("A36401CC-77B1-4410-BCEB-A7684706A17F")) 
#define FavoritesGuid			(APIGuidFromString ("F97013BD-662E-42a1-A749-9C73CD2D0790")) 
#define FillTypesGuid			(APIGuidFromString ("4C036A66-C2FF-4c3b-9FF4-F45A810B5F84")) 
#define LayerSettingsGuid		(ACAPI_TeamworkControl_FindLockableObjectSet ("LayerSettingsDialog")) 
#define LineTypesGuid			(APIGuidFromString ("702A8569-EA8F-4de8-900C-696980FB13D6")) 
#define MarkupStylesGuid		(APIGuidFromString ("156BCF98-CFA6-4be0-BC2C-8252D640A9FB")) 
#define SurfacesGuid			(APIGuidFromString ("5B6A4F99-C72D-4811-90A5-6D696E1AB51F")) 
#define MEPSystemsGuid			(APIGuidFromString ("258B2630-3098-48ea-8923-F712214FBDAE")) 
#define ModelViewOptionsGuid	(APIGuidFromString ("13E263C8-692B-494b-84E3-2B4BD0A77332")) 
#define OperationProfilesGuid	(APIGuidFromString ("0E6DC7E2-5AFC-4309-AB31-2A790CF57A53")) 
#define PenTablesGuid			(APIGuidFromString ("08B4B9BB-3DD6-4ea1-A084-80D80B8B7742")) 
#define ProfilesGuid			(APIGuidFromString ("4779D92D-ACFB-429d-91E5-1D585B9D2CE5")) 
#define ProjectInfoGuid			(APIGuidFromString ("D13F8A89-2AEC-4c32-B04E-85A5393F9C47")) 
#define ProjectPreferencesGuid	(ACAPI_TeamworkControl_FindLockableObjectSet ("PreferencesDialog")) 
#define ZoneCategoriesGuid		(APIGuidFromString ("B83F2FD1-0AD4-4c41-A8EB-6D7558B0A120")) 
#define BuildingMaterialsGuid	(APIGuidFromString ("50477294-5E20-4349-920B-EFC18BF54A0C")) 
 
 
// ============================================================================= 
// 
// Teamwork Reservation function for Attribute sets 
// 
// ============================================================================= 
 
void	ReserveOrRelease_Attributes (const API_Guid& objectSetGuid, const GS::UniString& objectSetName, bool showAlert = true) 
{ 
	bool hasCreateRight = ACAPI_TeamworkControl_HasCreateRight (objectSetGuid); 
	bool hasDeleteModifyRight = ACAPI_TeamworkControl_HasDeleteModifyRight (objectSetGuid); 
	if (!hasCreateRight && !hasDeleteModifyRight) { 
		GS::UniString reportString ("You have insufficient privileges to modify "); 
		reportString.Append (objectSetName); 
		ACAPI_WriteReport (reportString.ToCStr ().Get (), true); 
		return; 
	} 
 
	GS::UniString reportString (objectSetName); 
	GS::PagedArray<GS::UniString> conflicts; 
	API_LockableStatus lockableStatus = ACAPI_TeamworkControl_GetLockableStatus (objectSetGuid, &conflicts); 
 
	if (lockableStatus == APILockableStatus_Free) {					// Free for Reservation - let's reserve it 
		GSErrCode errCode = ACAPI_TeamworkControl_ReserveLockable (objectSetGuid, &conflicts); 
		if (errCode == NoError) 
			reportString.Append (" - Reservation succeeded"); 
		else 
			reportString.Append (" - Reservation failed"); 
 
		lockableStatus = ACAPI_TeamworkControl_GetLockableStatus (objectSetGuid, &conflicts); 
 
	} else if (lockableStatus == APILockableStatus_Editable) {		// Editable - let's release it 
		GSErrCode errCode = ACAPI_TeamworkControl_ReleaseLockable (objectSetGuid); 
		if (errCode == NoError) 
			reportString.Append (" - Release succeeded"); 
		else 
			reportString.Append (" - Release failed"); 
 
		lockableStatus = ACAPI_TeamworkControl_GetLockableStatus (objectSetGuid, &conflicts); 
	} 
 
	reportString.Append ("\n  Teamwork status: "); 
	switch (lockableStatus) { 
		case APILockableStatus_Free:			reportString.Append ("Free for Reservation"); 
												break; 
 
		case APILockableStatus_Editable:		reportString.Append ("Editable"); 
												break; 
 
		case APILockableStatus_Locked:			if (conflicts.IsEmpty ()) { 
													reportString.Append ("Locked by other member"); 
												} else { 
													reportString.Append ("Locked by "); 
													reportString.Append (conflicts[0]); 
												} 
												break; 
 
		case APILockableStatus_NotAvailable:	reportString.Append ("Not available"); 
												break; 
 
		case APILockableStatus_NotExist:		reportString.Append ("Not exist"); 
												break; 
	} 
 
	ACAPI_WriteReport (reportString.ToCStr ().Get (), showAlert); 
}		// ReserveOrRelease_Attributes 
 
 
// ----------------------------------------------------------------------------- 
// 
// Few examples to use: 
// 
// ----------------------------------------------------------------------------- 
 
ReserveOrRelease_Attributes (LayerSettingsGuid,		"Layer Settings"); 
ReserveOrRelease_Attributes (LineTypesGuid,			"Line Types"); 
ReserveOrRelease_Attributes (FillTypesGuid,			"Fill Types"); 
ReserveOrRelease_Attributes (CompositesGuid,		"Composites"); 
ReserveOrRelease_Attributes (SurfacesGuid,			"Surfaces");


Regards,
Tibor
Anonymous
Not applicable
Thanks Tibor.

I am interested in getting the reserved status of a specific Surface. I cannot see how that is possible via the API. Perhaps I am missing something.

How can ACAPI_TeamworkControl_GetLockableStatus () be used for a specific surface pls?

Thanks

Paul
Tibor Lorantfy
Graphisoft Alumni
Graphisoft Alumni
paulk wrote:
How can ACAPI_TeamworkControl_GetLockableStatus () be used for a specific surface pls?
Reservation status belongs to an Attribute set, not a specific attribute.
So it's not possible to lock only one specific attribute. Instead of that you should lock the related attribute set.

You can't lock only one specific surface on the ArchiCAD UserInterface also, can you?
Anonymous
Not applicable
Reservation status belongs to an Attribute set, not a specific attribute.
So it's not possible to lock only one specific attribute. Instead of that you should lock the related attribute set.

You can't lock only one specific surface on the ArchiCAD UserInterface also, can you?
Yes, you are right. My understanding of how reserving worked was wrong. Thank you for resolving this.

Paul