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