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…

Archicad C++ API
About Archicad add-on development using the C++ API.
SOLVED!

Changing elements

vdentello
Advocate

Hello! I've been struggling to make things work here.

The code builds, the command runs without trouble and I get the dialog at the end. But I get no changes to my element. can't figure out what's still missing. I've used most of the code from the examples.


I'm not using 'ACAPI_Element_Edit', cause I warns that: 

No matching function for call to 'ACAPI_Element_Edit'

 

#include "basicgeometry.h"

 

 

 

void EditWall ()
{
    API_Element            element, mask;
    API_ElementMemo        memo;
//    GSErrCode err = NoError;
    
    element = {};
    memo = {};
    
    ACAPI_Element_Get (&element);
    ACAPI_Element_GetMemo (element.header.guid, &memo);
    
    ACAPI_ELEMENT_MASK_CLEAR (mask);
    ACAPI_ELEMENT_MASK_SET (mask, API_WallType, thickness);
    element.wall.thickness = 1.0;
    
//    ACAPI_Element_Edit(&element, &mask);

    ACAPI_Element_Change (&element, &mask, &memo, 0, true);
    
    DG::InformationAlert ("Exit", "Click ok to continue", "OK");
}

 

 

 

 

Archicad User Since 2013
GDL Developer
Experimenting with API
from Brazil
1 ACCEPTED SOLUTION

Accepted Solutions
Solution

Hi Vítor,

The element.header.guid is empty since you didn't assign anything.
So both ACAPI_Element_Get and ACAPI_Element_GetMemo won't know which element to look for.
You'll have to get a guid of a wall first.

 

There are a lot of possibilities for this.

E.g. iterate through all walls with ACAPI_Element_GetElemList or get the guid from a selection with ACAPI_Selection_Get

There's a good code example for it on the linked documentation page.

 

The rest of your code seems fine for changing the wall thickness.


If you want to use ACAPI_Element_Edit you will have to pass different arguments as documented here: https://graphisoft.github.io/archicad-api-devkit/group___element.html#gaf661e412a0e3a3f6979444c67ec6...

Best,
Bernd

View solution in original post

3 REPLIES 3
Solution

Hi Vítor,

The element.header.guid is empty since you didn't assign anything.
So both ACAPI_Element_Get and ACAPI_Element_GetMemo won't know which element to look for.
You'll have to get a guid of a wall first.

 

There are a lot of possibilities for this.

E.g. iterate through all walls with ACAPI_Element_GetElemList or get the guid from a selection with ACAPI_Selection_Get

There's a good code example for it on the linked documentation page.

 

The rest of your code seems fine for changing the wall thickness.


If you want to use ACAPI_Element_Edit you will have to pass different arguments as documented here: https://graphisoft.github.io/archicad-api-devkit/group___element.html#gaf661e412a0e3a3f6979444c67ec6...

Best,
Bernd

vdentello
Advocate

It finally worked!
Another very important detail that was missing, from the beginning, was that it needs a ACAPI_CallUndoableCommand before everything, followed by a ACAPI_DisposeElemMemoHdls as it seems. Found many occurrences of this issue in the forum. I guess that should be more explicit within the first steps.

Archicad User Since 2013
GDL Developer
Experimenting with API
from Brazil
poco2013
Mentor

Another point -- for cleaner code: API_ElementMemo  is not required and should be replaced with nullptr. It's only required if your going to replace some of the attributes in the Memo structure.

Gerry

Windows 11 - Visual Studio 2022; ArchiCAD 27