<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:taxo="http://purl.org/rss/1.0/modules/taxonomy/" version="2.0">
  <channel>
    <title>topic Re: How to change a parameter of a placed GDL object? in Archicad C++ API</title>
    <link>https://community.graphisoft.com/t5/Archicad-C-API/How-to-change-a-parameter-of-a-placed-GDL-object/m-p/323484#M2270</link>
    <description>&lt;P&gt;So, after several brain meltdowns and some barrels of coffee, i finally managed to make it work&amp;nbsp;&lt;span class="lia-unicode-emoji" title=":winking_face:"&gt;😉&lt;/span&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;it's working!&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;LI-CODE lang="cpp"&gt;// -----------------------------------------------------------------------------
// Change boolean parameter
// -----------------------------------------------------------------------------
void Do_ChangeBoolean(const char* param_name, bool param_new_value)
{
 GSErrCode err = ACAPI_CallUndoableCommand("Place system",
 [&amp;amp;]() -&amp;gt; GSErrCode
 {
  API_Element element, mask;
  API_ElementMemo memo;
  API_ParamOwnerType paramOwner;
  API_ChangeParamType chgParam;
  API_GetParamsType getParams;
  GSErrCode err;

  // selection
  API_SelectionInfo selectionInfo;
  GS::Array&amp;lt;API_Neig&amp;gt; selectionNeigs;
  ACAPI_Selection_Get(&amp;amp;selectionInfo, &amp;amp;selectionNeigs, false, false);
  BMKillHandle((GSHandle*)&amp;amp;selectionInfo.marquee.coords);

  // if objects are selected
  if (selectionInfo.typeID != API_SelEmpty)
  {
   // loop begins
   for (const API_Neig&amp;amp; neig : selectionNeigs)
   {
    API_Elem_Head elemHead = {};
    elemHead.guid = neig.guid;
    ACAPI_Element_GetHeader(&amp;amp;elemHead);

    BNZeroMemory(&amp;amp;element, sizeof(element));
    element.header.guid = neig.guid;

    //get the element
    if (ACAPI_Element_Get(&amp;amp;element) == NoError)
    {
     if (element.header.hasMemo)
     {
      BNZeroMemory(&amp;amp;memo, sizeof(memo));
      err = ACAPI_Element_GetMemo(element.header.guid, &amp;amp;memo, APIMemoMask_AddPars);
     }
    }

    BNZeroMemory(&amp;amp;paramOwner, sizeof(API_ParamOwnerType));
    paramOwner.libInd = 0; // not library part
    paramOwner.typeID = API_ObjectID; // object element
    paramOwner.guid = element.header.guid; // guid
    BNZeroMemory(&amp;amp;getParams, sizeof(API_GetParamsType));

    err = ACAPI_Goodies(APIAny_OpenParametersID, &amp;amp;paramOwner, nullptr);
    if (err == NoError)
    {
     BNZeroMemory(&amp;amp;chgParam, sizeof(API_ChangeParamType));

     err = ACAPI_Goodies(APIAny_GetActParametersID, &amp;amp;getParams, nullptr);
     if (err == NoError)
     {
      chgParam.index = 0; // parameter index
      CHCopyC(param_name, chgParam.name); // parameter name
      chgParam.realValue = param_new_value; // parameter new value

      err = ACAPI_Goodies(APIAny_ChangeAParameterID, &amp;amp;chgParam, nullptr);
      if (err == NoError)
      {
       err = ACAPI_Goodies(APIAny_GetActParametersID, &amp;amp;getParams, nullptr);
      }
     }

     err = ACAPI_Goodies(APIAny_CloseParametersID, nullptr, nullptr);
     if (err == NoError)
     {
      element.header.typeID = API_ObjectID;
      ACAPI_ELEMENT_MASK_CLEAR(mask);
      ACAPI_ELEMENT_MASK_SETFULL(mask);
      memo.params = getParams.params;

      err = ACAPI_Element_Change(&amp;amp;element, &amp;amp;mask, &amp;amp;memo, APIMemoMask_AddPars, true);
     }
    } // openParametersID end
   } // loop ends

   // clear memory
   ACAPI_DisposeElemMemoHdls(&amp;amp;memo);
  }
  else
  {
  // if no object selected
    DG::InformationAlert("No object is selected!", "", "OK");
  }

  return NoError;
 }); // call undoable command end

 if (err != NoError)
 {
  ACAPI_WriteReport("ACAPI_Element_Change failed.", false, err);
  return;
 }
}&lt;/LI-CODE&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;</description>
    <pubDate>Thu, 02 Dec 2021 02:42:39 GMT</pubDate>
    <dc:creator>Csanyi Bence</dc:creator>
    <dc:date>2021-12-02T02:42:39Z</dc:date>
    <item>
      <title>How to change a parameter of a placed GDL object?</title>
      <link>https://community.graphisoft.com/t5/Archicad-C-API/How-to-change-a-parameter-of-a-placed-GDL-object/m-p/323023#M2268</link>
      <description>&lt;P&gt;Hello there!&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;I am newbie in Add-on development, and did some progress but seems that i am stuck now.&lt;/P&gt;
&lt;P&gt;I successfully invoked a 32400 type floating palette, where i placed a button, which should change a specified parameter of placed GDL object(s) written by me. (The GDL objects function well, i want to write an addon to speed up the planning process -&amp;gt; modify the parameter from the outside!).&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;the function call with the button click event (main.cpp):&lt;/P&gt;
&lt;LI-CODE lang="cpp"&gt;void Palette::ButtonClicked(const DG::ButtonClickEvent&amp;amp; ev)
{
// --- Place ---
if (ev.GetSource() == &amp;amp;placeButton)
{
Do_PlaceSystem();
}&lt;/LI-CODE&gt;
&lt;P&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;/P&gt;
&lt;P&gt;the function (main.cpp):&lt;/P&gt;
&lt;LI-CODE lang="cpp"&gt;void Do_PlaceSystem()
{
API_Element element, mask;
API_ElementMemo memo;
API_ParamOwnerType paramOwner;
API_ChangeParamType chgParam;
API_GetParamsType getParams;
//GSErrCode err;

// selection
API_SelectionInfo selectionInfo;
GS::Array&amp;lt;API_Neig&amp;gt; selectionNeigs;
ACAPI_Selection_Get(&amp;amp;selectionInfo, &amp;amp;selectionNeigs, false, false);
BMKillHandle((GSHandle*)&amp;amp;selectionInfo.marquee.coords);

// get guids
GS::Array&amp;lt;API_Guid&amp;gt; selectedElements;

GSErrCode err = ACAPI_CallUndoableCommand("Place system",
[&amp;amp;]() -&amp;gt; GSErrCode
  {
  // if objects are selected
  if (selectionInfo.typeID != API_SelEmpty)
    {
    // loop begins
    for (const API_Neig&amp;amp; neig : selectionNeigs)
      {
      API_Elem_Head elemHead = {};
      elemHead.guid = neig.guid; 
      ACAPI_Element_GetHeader(&amp;amp;elemHead);

      BNZeroMemory(&amp;amp;paramOwner, sizeof(API_ParamOwnerType));
      paramOwner.libInd = 0; // not library part
      paramOwner.typeID = API_ObjectID; // object element
      paramOwner.guid = neig.guid; // guid
      // show guid / type of paramOwner: its working..
      DG::InformationAlert(APIGuidToString(paramOwner.guid), "", "OK");


      BNZeroMemory(&amp;amp;getParams, sizeof(API_GetParamsType));

      err = ACAPI_Goodies(APIAny_OpenParametersID, &amp;amp;paramOwner, nullptr);
      if (err == NoError)
      {
        BNZeroMemory(&amp;amp;chgParam, sizeof(API_ChangeParamType));

        err = ACAPI_Goodies(APIAny_GetActParametersID, &amp;amp;getParams, nullptr);
        if (err == NoError)
        {
           chgParam.index = 0; // parameter index
           CHCopyC("bOrganizeAnchors", chgParam.name); // parameter name
           chgParam.realValue = 1.0; // parameter new value
           // show name and value: its working..
           DG::InformationAlert((chgParam.name), "", "OK");
           DG::InformationAlert(GS::ValueToUniString(chgParam.realValue), "", "OK");


           err = ACAPI_Goodies(APIAny_ChangeAParameterID, &amp;amp;chgParam, nullptr);
           if (err == NoError)
           {
              err = ACAPI_Goodies(APIAny_GetActParametersID, &amp;amp;getParams, nullptr);
              // TODO
              // show if its successful: its NOT working...
              DG::InformationAlert("APIAny_GetActParametersID is OK!", "", "OK");
              // ERROR is here, its never reaches this part of the code
           }
         }
         err = ACAPI_Goodies(APIAny_CloseParametersID, nullptr, nullptr);
         // in the examples there's no " err = ... "
         // if there's no " err = ..." crashes all the time...
       }

       if (err == NoError)
       {
         // show if its successful: its working
         DG::InformationAlert("APIAny_CloseParametersID is OK!", "", "OK");

         BNZeroMemory(&amp;amp;element, sizeof(API_Element));
         BNZeroMemory(&amp;amp;memo, sizeof(API_ElementMemo));

         element.header.typeID = API_ObjectID;
         ACAPI_ELEMENT_MASK_CLEAR(mask);
         ACAPI_ELEMENT_MASK_SETFULL(mask);
         memo.params = getParams.params;

         err = ACAPI_Element_Change(&amp;amp;element, &amp;amp;mask, &amp;amp;memo, APIMemoMask_AddPars, true);
         if (err == NoError)
         {
            // show if its successful: its not working..
            DG::InformationAlert("ACAPI_Element_Change is OK!", "", "OK");
         }
      }
     } // loop ends

     // clear memory
     ACAPI_DisposeElemMemoHdls(&amp;amp;memo);
   }
   else
   {
     // if no object selected
     DG::InformationAlert("No object is selected!", "", "OK");
   }

   return NoError;
   }); // call undoable command end

  if (err != NoError)
  {
    ACAPI_WriteReport("ACAPI_Element_Change failed.", false, err);
    return;
  }

  // this is a must
  //ACAPI_DisposeElemMemoHdls(&amp;amp;memo);
}&lt;/LI-CODE&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;There are several questions:&lt;/P&gt;
&lt;P&gt;-where to place the callundoablecommand? its better like it is now, its better in the event call? If i place it in the event call, how do i use&amp;nbsp;ACAPI_DisposeElemMemoHdls(&amp;amp;memo);?&lt;/P&gt;
&lt;P&gt;-the parameter of the GDL object is a boolean, however there are another parameters too (integers) i want to change later with another function. Which command is the best? I am trying to do that with ACAPI_Element_Change and tried&amp;nbsp; ACAPI_Element_ChangeParameter too but none of these seems to work :S&lt;/P&gt;
&lt;P&gt;-The GDL script runs til end if i change a parameter of a placed obejct? I am asking this, because this parameter ("bOrganizeAnchors") is triggering another bool parameter in the parameter script of the GDL too.. Do i have to change both or 1 is enough?&lt;/P&gt;
&lt;P&gt;-the error is somewhere around the&amp;nbsp;err = ACAPI_Goodies(APIAny_GetActParametersID, &amp;amp;getParams, nullptr);...&amp;nbsp; it never reaches that part of the code and i dont know why...&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Thank you for your help!&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;</description>
      <pubDate>Fri, 26 Nov 2021 19:47:45 GMT</pubDate>
      <guid>https://community.graphisoft.com/t5/Archicad-C-API/How-to-change-a-parameter-of-a-placed-GDL-object/m-p/323023#M2268</guid>
      <dc:creator>Csanyi Bence</dc:creator>
      <dc:date>2021-11-26T19:47:45Z</dc:date>
    </item>
    <item>
      <title>Re: How to change a parameter of a placed GDL object?</title>
      <link>https://community.graphisoft.com/t5/Archicad-C-API/How-to-change-a-parameter-of-a-placed-GDL-object/m-p/323477#M2269</link>
      <description>&lt;P&gt;Hi Bence,&lt;/P&gt;
&lt;P&gt;If your program execution won't reach GetActParameters, it means that ChangeAParameter call returned with an error. These error values are designed to give you a vague sense of what the problem is. See here:&amp;nbsp;&lt;A href="https://archicadapi.graphisoft.com/documentation/error-codes" target="_blank"&gt;https://archicadapi.graphisoft.com/documentation/error-codes&lt;/A&gt;.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Regarding the placement of UndoableCommand call: you should place it so that everything you want to make undoable is in its scope. There are no other strict rules, do whichever is more readable for you.&lt;/P&gt;</description>
      <pubDate>Mon, 29 Nov 2021 09:15:58 GMT</pubDate>
      <guid>https://community.graphisoft.com/t5/Archicad-C-API/How-to-change-a-parameter-of-a-placed-GDL-object/m-p/323477#M2269</guid>
      <dc:creator>akomporday</dc:creator>
      <dc:date>2021-11-29T09:15:58Z</dc:date>
    </item>
    <item>
      <title>Re: How to change a parameter of a placed GDL object?</title>
      <link>https://community.graphisoft.com/t5/Archicad-C-API/How-to-change-a-parameter-of-a-placed-GDL-object/m-p/323484#M2270</link>
      <description>&lt;P&gt;So, after several brain meltdowns and some barrels of coffee, i finally managed to make it work&amp;nbsp;&lt;span class="lia-unicode-emoji" title=":winking_face:"&gt;😉&lt;/span&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;it's working!&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;LI-CODE lang="cpp"&gt;// -----------------------------------------------------------------------------
// Change boolean parameter
// -----------------------------------------------------------------------------
void Do_ChangeBoolean(const char* param_name, bool param_new_value)
{
 GSErrCode err = ACAPI_CallUndoableCommand("Place system",
 [&amp;amp;]() -&amp;gt; GSErrCode
 {
  API_Element element, mask;
  API_ElementMemo memo;
  API_ParamOwnerType paramOwner;
  API_ChangeParamType chgParam;
  API_GetParamsType getParams;
  GSErrCode err;

  // selection
  API_SelectionInfo selectionInfo;
  GS::Array&amp;lt;API_Neig&amp;gt; selectionNeigs;
  ACAPI_Selection_Get(&amp;amp;selectionInfo, &amp;amp;selectionNeigs, false, false);
  BMKillHandle((GSHandle*)&amp;amp;selectionInfo.marquee.coords);

  // if objects are selected
  if (selectionInfo.typeID != API_SelEmpty)
  {
   // loop begins
   for (const API_Neig&amp;amp; neig : selectionNeigs)
   {
    API_Elem_Head elemHead = {};
    elemHead.guid = neig.guid;
    ACAPI_Element_GetHeader(&amp;amp;elemHead);

    BNZeroMemory(&amp;amp;element, sizeof(element));
    element.header.guid = neig.guid;

    //get the element
    if (ACAPI_Element_Get(&amp;amp;element) == NoError)
    {
     if (element.header.hasMemo)
     {
      BNZeroMemory(&amp;amp;memo, sizeof(memo));
      err = ACAPI_Element_GetMemo(element.header.guid, &amp;amp;memo, APIMemoMask_AddPars);
     }
    }

    BNZeroMemory(&amp;amp;paramOwner, sizeof(API_ParamOwnerType));
    paramOwner.libInd = 0; // not library part
    paramOwner.typeID = API_ObjectID; // object element
    paramOwner.guid = element.header.guid; // guid
    BNZeroMemory(&amp;amp;getParams, sizeof(API_GetParamsType));

    err = ACAPI_Goodies(APIAny_OpenParametersID, &amp;amp;paramOwner, nullptr);
    if (err == NoError)
    {
     BNZeroMemory(&amp;amp;chgParam, sizeof(API_ChangeParamType));

     err = ACAPI_Goodies(APIAny_GetActParametersID, &amp;amp;getParams, nullptr);
     if (err == NoError)
     {
      chgParam.index = 0; // parameter index
      CHCopyC(param_name, chgParam.name); // parameter name
      chgParam.realValue = param_new_value; // parameter new value

      err = ACAPI_Goodies(APIAny_ChangeAParameterID, &amp;amp;chgParam, nullptr);
      if (err == NoError)
      {
       err = ACAPI_Goodies(APIAny_GetActParametersID, &amp;amp;getParams, nullptr);
      }
     }

     err = ACAPI_Goodies(APIAny_CloseParametersID, nullptr, nullptr);
     if (err == NoError)
     {
      element.header.typeID = API_ObjectID;
      ACAPI_ELEMENT_MASK_CLEAR(mask);
      ACAPI_ELEMENT_MASK_SETFULL(mask);
      memo.params = getParams.params;

      err = ACAPI_Element_Change(&amp;amp;element, &amp;amp;mask, &amp;amp;memo, APIMemoMask_AddPars, true);
     }
    } // openParametersID end
   } // loop ends

   // clear memory
   ACAPI_DisposeElemMemoHdls(&amp;amp;memo);
  }
  else
  {
  // if no object selected
    DG::InformationAlert("No object is selected!", "", "OK");
  }

  return NoError;
 }); // call undoable command end

 if (err != NoError)
 {
  ACAPI_WriteReport("ACAPI_Element_Change failed.", false, err);
  return;
 }
}&lt;/LI-CODE&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;</description>
      <pubDate>Thu, 02 Dec 2021 02:42:39 GMT</pubDate>
      <guid>https://community.graphisoft.com/t5/Archicad-C-API/How-to-change-a-parameter-of-a-placed-GDL-object/m-p/323484#M2270</guid>
      <dc:creator>Csanyi Bence</dc:creator>
      <dc:date>2021-12-02T02:42:39Z</dc:date>
    </item>
  </channel>
</rss>

