License delivery maintenance is planned for Saturday, July 26, between 12:00 and 20:00 CEST. During this time, you may experience outages or limited availability across our services, including BIMcloud SaaS, License Delivery, Graphisoft ID (for customer and company management), Graphisoft Store, and BIMx Web Viewer. More details…
2018-10-19
04:35 PM
- last edited on
2022-10-05
01:36 PM
by
Daniel Kassai
GSErrCode ACAPI_Element_Change ( API_Element* element, const API_Element* mask, const API_ElementMemo* memo, UInt64 memoMask, bool withdel );so that's what i'm doing:
ACAPI_ELEMENT_MASK_CLEAR() ACAPI_ELEMENT_MASK_SET(mask, API_ObjectType, ???); //don't know what to put here changeErr = ACAPI_Element_Change(&element, objectmask; changeErr = ACAPI_Element_Change(&element, ??, &memo, ??, false); //don't know what masks to puthelp
Solved! Go to Solution.
2018-10-20 11:38 AM
API_Element mask; ACAPI_ELEMENT_MASK_SETFULL(mask); ACAPI_Element_Change(elemData, &mask, elemMemo, APIMemoMask_AddPars, true)The easiest way to change parameter values is
2018-10-20 11:38 AM
API_Element mask; ACAPI_ELEMENT_MASK_SETFULL(mask); ACAPI_Element_Change(elemData, &mask, elemMemo, APIMemoMask_AddPars, true)The easiest way to change parameter values is
2018-10-22 10:21 AM
2018-10-24 03:04 PM
void ManageSelection(void) { API_Element element, mask; API_ElementMemo memo; GSErrCode err, changeErr; API_SelectionInfo selectionInfo; API_Neig **selNeigs; int ii, nSel, j, nbParams; API_AddParType param; // Get selected elements (which are all objects from a custom library) err = ACAPI_Selection_Get(&selectionInfo, &selNeigs, false); if (err == NoError){ if (selectionInfo.typeID != API_SelEmpty){ nSel = BMGetHandleSize((GSHandle)selNeigs) / sizeof(API_Neig); API_ParamOwnerType paramOwner; API_ChangeParamType chgParam; API_GetParamsType getParams; for (ii = 0; ii < nSel && err == NoError; ii++) { //iterating on the selection BNZeroMemory(&element, sizeof(element)); //insert guid in header element.header.guid = (*selNeigs[ii]).guid; //get the element if (ACAPI_Element_Get(&element) == NoError) DBPrintf("\n\n GET_ELEMENT OK\n\n"); else DBPrintf("\n\n GET_ELEMENT NOK\n\n"); if (element.header.hasMemo) { BNZeroMemory(&memo, sizeof(memo)); err = ACAPI_Element_GetMemo(element.header.guid, &memo, APIMemoMask_AddPars); if (err == NoError) DBPrintf("\n\n GETMEMO OK\n\n"); else ErrorBeep("ACAPI_Element_GetMemo", err); } //change value of attribute N_panneau of each item in selection // start by filling the param owner BNZeroMemory(¶mOwner, sizeof(API_ParamOwnerType)); paramOwner.libInd = 0; //this should be 0 because it's not a library part, it's a placed element paramOwner.typeID = API_ObjectID; // object element paramOwner.guid = (*selNeigs[ii]).guid; // placed element guid BNZeroMemory(&getParams, sizeof(API_GetParamsType)); // Open a Library Part parameter list to edit err = ACAPI_Goodies(APIAny_OpenParametersID, ¶mOwner, nullptr); if (err == NoError) { DBPrintf("\n\n APIAny_OpenParametersID OK"); BNZeroMemory(&chgParam, sizeof(API_ChangeParamType)); // Returns the actual (edited) values of a Library Part parameter list opened to edit. err = ACAPI_Goodies(APIAny_GetActParametersID, &getParams, nullptr); if (err == NoError) { DBPrintf("\n\n APIAny_GetActParametersID OK"); CHCopyC("N_panneau", chgParam.name); //N_panneau is the parameter's name chgParam.realValue = 13.0; //setting the value to 13 instead of 11 // Changes a value in an opened Library Part parameter list err = ACAPI_Goodies(APIAny_ChangeAParameterID, &chgParam, nullptr); if (err == NoError) { DBPrintf("\n\nAPIAny_ChangeAParameterID OK"); err = ACAPI_Goodies(APIAny_GetActParametersID, &getParams, nullptr); } else DBPrintf("\n\n APIAny_ChangeAParameterID NOK\n\n"); } else DBPrintf("\n\n APIAny_GetActParametersID NOK"); err = ACAPI_Goodies(APIAny_CloseParametersID, nullptr, nullptr); if (err == NoError) { DBPrintf("\n\n APIAny_CloseParametersID OK"); element.header.typeID = API_ObjectID; ACAPI_ELEMENT_MASK_CLEAR(mask); ACAPI_ELEMENT_MASK_SETFULL(mask); memo.params = getParams.params; err = ACAPI_Element_Change(&element, &mask, &memo, APIMemoMask_AddPars, true); //the error is here, the error check prints ACAPI_Element_Change NOK if (err == NoError) DBPrintf("\n\n ACAPI_Element_Change OK"); else DBPrintf("\n\n ACAPI_Element_Change NOK %d", err); } else DBPrintf("\n\n APIAny_CloseParametersID NOK"); } else DBPrintf("\n\n APIAny_OpenParametersID NOK\n\n"); } BMKillHandle((GSHandle *)&selNeigs); } else { DBPrintf("\n\n SELECTION_EMPTY \n\n"); } } }basically i'm selecting elements in archicad then running this function
GSErrCode err = ACAPI_CallUndoableCommand ("Create text", [&] () -> GSErrCode { return ACAPI_Element_Create (&element, &memo); }); if (err != NoError) ErrorBeep ("ACAPI_Element_Create (text)", err); ACAPI_DisposeElemMemoHdls (&memo);is beyond my comprehension
2018-10-24 03:13 PM
2018-10-24 03:28 PM
2018-10-24 03:44 PM
wacim wrote:Yes, at first sight it looks correct.
First of all am I doing this right ?
wacim wrote:Yes, as Ralph said, all operations which do some kind of element database modification can be executed only from an UndoableCommand.
and does this really need an undo scope ?
wacim wrote:That example calls ACAPI_Element_ChangeDefaults function and you call ACAPI_Element_Change. That's the main difference which explains why you need an undo scope.
because I haven't seen it used in the example for APIAny_OpenParametersID here: link
wacim wrote:Don't be shocked, it's just a little lambda expression (available since C++11)
and if so what would it look like ?
because this is beyond my comprehension
Thank you for your precious help![]()
ACAPI_CallUndoableCommand ("Manage Selection", [&] () -> GSErrCode { ManageSelection (); return NoError; });
2018-10-24 04:08 PM