Learn to manage BIM workflows and create professional Archicad templates with the BIM Manager Program.
2005-10-12
08:51 PM
- last edited on
2023-08-07
11:33 AM
by
Doreena Deng
2005-10-27 08:23 PM
API_Elem_Head **elemHead; API_ElemTypeID typeID = API_ZombieElemID; API_ParamOwnerType paramOwner; API_ChangeParamType chgParam; API_GetParamsType getParams; API_Element element, mask; API_ElementMemo memo; GSErrCode err, err2; API_AddParType ** addPars; elemHead = (API_Elem_Head **) BMAllocateHandle (sizeof (API_Elem_Head), ALLOCATE_CLEAR, 0); BNZeroMemory (¶mOwner, sizeof (API_ParamOwnerType)); paramOwner.libInd = 0; // no library part paramOwner.typeID = API_DoorID; // Door element paramOwner.index = 0; // element default BNZeroMemory (&getParams, sizeof (APIAny_GetParamValuesID)); err = ACAPI_Goodies (APIAny_OpenParametersID, ¶mOwner, NULL); if (!err) { BNZeroMemory (&chgParam, sizeof (API_ChangeParamType)); err = ACAPI_Goodies (APIAny_GetActParametersID, &getParams, NULL); if (!err) { chgParam.index = 0; CHCopyC ("gs_detlevel_3D", chgParam.name); chgParam.strValue = "Off"; addPars = getParams.params; char parName[32]; double val = 0; long ii; long addParNum = BMGetHandleSize (reinterpret_cast (*addPars)) / sizeof (API_AddParType); char buffer [256]; for (ii = 0; ii < addParNum; ii++) { CHCopyC ((*addPars)[ii].name, buffer); ACAPI_WriteReport (buffer, false); // print name for debugging if (strncmp (parName,(*addPars)[ii].name, 8)==0) { WriteReport("Parameter Matched", parName); paramOwner.index = ii; chgParam.index = ii; } if (CHCompareCStrings ((*addPars)[ii].name, parName, CS_CaseInsensitive) == 0) { chgParam.index = ii; CHCopyC ((*addPars)[ii].name , chgParam.name); CHCopyC ("Off", chgParam.strValue); WriteReport("Parameter variables set ", buffer); break; } } err2 = ACAPI_Goodies (APIAny_ChangeAParameterID, &chgParam, NULL);
2005-10-28 10:24 AM
TomWaltz wrote:No, you haven't specified the index of the element to be modified in paramOwner.index. The documentation on API_ParamOwnerType states:
Ralph,
I used the API_ParamOwnerType documentation as a starting point, and it never mentioned the index. It makes sense, though.
Is something more like this what you were describing?:
BNZeroMemory (¶mOwner, sizeof (API_ParamOwnerType)); paramOwner.libInd = 0; // no library part paramOwner.typeID = API_DoorID; // Door element paramOwner.index = 0; // element default err = ACAPI_Goodies (APIAny_OpenParametersID, ¶mOwner, NULL);
BNZeroMemory (&getParams, sizeof (APIAny_GetActParametersID));It should be:
BNZeroMemory (&getParams, sizeof (API_GetParamsType));
2005-10-28 08:28 PM
Ralph wrote:I believe I do. That would be:
Do you know how to get the index of a selected element?
BTW, I notice the following error in your code comes from an example in the API documentation:
{ API_SelectionInfo selectionInfo; API_Neig **selNeigs = NULL; API_ElemTypeID typeID; char buffer[256]; char msgStr[256]; GSErrCode err; // ------- Check selection ------- err = ACAPI_Selection_Get (&selectionInfo, &selNeigs, false); if (err != NoError) { WriteReport_Err ("ACAPI_Selection_Get", err); return API_ZombieElemID; } index = elemHead.index; // ------- Enumerate the selection ------- for (long i = 0; i < selectionInfo.sel_nElem; i++) { typeID = Neig_To_ElemID ((*selNeigs).neigID); if (typeID != API_ZombieElemID) { sprintf (buffer, "%s #%d", ElemID_To_Name (typeID), (*selNeigs).index); WriteReport (buffer); } } return;I guess my question is whether I return the elemHead.index or the selNeigs.index?
2005-10-29 11:12 PM
// helper function template<class T> inline void ApiClearIt(T & obj) { BNZeroMemory(&obj,sizeof(T)); } GSErrCode StartElementParamsEditing( API_ElemTypeID elem_type, long elem_index ) { API_ParamOwnerType param_owner; ApiClearIt( param_owner ); param_owner.typeID = elem_type; param_owner.index = elem_index; return ACAPI_Goodies (APIAny_OpenParametersID, ¶m_owner, NULL); } GSErrCode EndParamsEditing() { return ACAPI_Goodies ( APIAny_CloseParametersID, NULL, NULL ); } GSErrCode EditParameter( const char* name, const char* value ) { API_ChangeParamType param; ApiClearIt( param ); CHCopyC( name, param.name ); param.strValue = const_cast<char*>(value); return ACAPI_Goodies ( APIAny_ChangeAParameterID, ¶m, NULL ); } GSErrCode GetParamsEdited( API_GetParamsType& params ) { return ACAPI_Goodies ( APIAny_GetActParametersID, ¶ms, NULL ); } GSErrCode UpdateElementParameters( API_ElemTypeID elem_type, long elem_index, API_AddParType** params ) { API_Element elem, mask; API_ElementMemo memo; ApiClearIt( elem ); ApiClearIt( mask ); ApiClearIt( memo ); elem.header.typeID = elem_type; elem.header.index = elem_index; memo.params = params; return ACAPI_Element_Change ( &elem, &mask, &memo, APIMemoMask_AddPars, true ); } GSErrCode ChangeElementParameter( API_ElemTypeID elem_type, long elem_index, const char* name, const char* value ) { GSErrCode err = StartElementParamsEditing( elem_type, elem_index ); if ( !err ) { err = EditParameter( name, value ); // more parameters to edit if ( !err ) { API_GetParamsType params; params.params = 0; err = GetParamsEdited( params ); if ( !err ) err = UpdateElementParameters( elem_type, elem_index, params.params ); ACAPI_DisposeAddParHdl( ¶ms.params ); } EndParamsEditing(); } return err; } GSErrCode ChangeParameterOfSelectedWinDoors( const char* pname, const char* value ) { API_SelectionInfo sel; API_Neig** neigs = 0; ApiClearIt( sel ); GSErrCode err = ACAPI_Selection_Get (&sel, &neigs, true); BMKillHandle ((GSHandle *) &sel.marquee.coords); if ( !err && neigs && sel.typeID == API_SelElems ) { GSSize count = BMGetHandleSize ((GSHandle) neigs) / sizeof (API_Neig); for ( GSSize i = 0; i<count; ++i ) { API_ElemTypeID elem_type = API_ZombieElemID; ACAPI_Goodies (APIAny_NeigIDToElemTypeID, &(*neigs).neigID, &elem_type ); if ( elem_type == API_WindowID || elem_type == API_DoorID ) { long elem_index = (*neigs).index; GSErrCode edit_err = ChangeElementParameter(elem_type,elem_index,pname,value); if ( edit_err ) err = edit_err; } } } BMKillHandle ((GSHandle *) &neigs); return err; } GSErrCode ChangeDetLevelOfSelectedWinDoors() { ACAPI_OpenUndoableSession ( "Test" ); GSErrCode err = ChangeParameterOfSelectedWinDoors( "gs_detlevel_3D", "Off" ); ACAPI_CloseUndoableSession(); return err; }
2005-10-31 05:10 PM
2005-11-01 10:33 PM
TomWaltz wrote:They are both the same thing - an index to a particular element in the Element database. The main difference between the handling of API_Elem_Head and API_Neig in this context is that the type specified in API_Neig describes not only the element type, but some specific part of that type, e.g. a point on a wall, or a reference line on a wall. That's why the type specified in the API_Neig has to be converted to an API_ElemTypeID before you can use it to find the target element.
I guess my question is whether I return the elemHead.index or the selNeigs.index?