Learn to manage BIM workflows and create professional Archicad templates with the BIM Manager Program.
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