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?