cancel
Showing results for 
Search instead for 
Did you mean: 
cancel
Showing results for 
Search instead for 
Did you mean: 

The 2025 Technology Preview Program is now live. Join today!

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

How to read/edit/change/copy neig for drawings or the equivalent sub-elements identified by neig?

AllanP
Expert

Working in Archicad 25

I am creating new drawings on a layout based on an old drawing on a layout, but with a different navigator item.

(in the example i just linked it to a different view map item of the same detail to see what isn't/is copied)

 

newElement.header.typeID = API_DrawingID;
newElement = oldElement;
newElement.drawing.drawingGuid = newNavItem.guid;

API_ElementMemo memo;
BNZeroMemory(&memo, sizeof(API_ElementMemo));
err = ACAPI_Element_GetMemo(oldGuid, &memo, APIMemoMask_DrawingData);
err = ACAPI_Element_Create(&newElement, &memo);
ACAPI_DisposeElemMemoHdls(&memo);

 

the neig items/equivalent sub-element of the new drawing are different from the old drawing.

 

AllanP_0-1756338824039.png

 

(P.S. the neig  definition images are missing from the online documentation for Archicad 28, so no-one can tell what they refer to unless you have old copies of the developer documentation)

 

AllanP_4-1756339216193.png

 

AllanP_3-1756339190021.png

 

Missing images

 

AllanP_1-1756338958165.png

 

How do i copy Nieg settings or equivalent sub-element from one drawing and apply them to another drawing

 

The ElementHead_To_Neig only sets the NeigID to APINeig_DrawingCenter

 

AllanP_2-1756339041765.png

 

How do i access/change/update  the APINeig_DrawingTitle[3] field or the equivalent sub-element setting for the position of the drawing title?

 

The only example i have been able to find that even mentions the neig, but doesn't try to change any of the sub-element related to the neig equivalent sub-element.

 

Is this just not possible to move the drawing title, or even get the drawing title location from another drawing?

 

/*----------------------------------------------------------**
** Insert a new node into the clicked poly edge **
**----------------------------------------------------------*/

static void Do_Poly_InsertNode(void)
{
API_ElementMemo memo;
API_Neig neig;
API_ElemTypeID idElem;
API_Coord3D begC;
API_EdgeTrim edgeTrim;
Int32 nodeInd;
GSErrCode err;

if (!ClickAnElem("Click an edge to insert new node", API_ZombieElemID, &neig, nullptr, nullptr, &begC)) {
GiveMessage("Please click a polygon node", true);
return;
}

if (neig.neigID != APINeig_CeilOn && neig.neigID != APINeig_RoofOn) {
GiveMessage("Please click a ceil or roof edge", true);
return;
}

idElem = Neig_To_ElemID(neig.neigID);
err = ACAPI_Element_GetMemo(neig.guid, &memo);
if (err) {
GiveMessage_Err("ACAPI_Element_GetMemo", err);
return;
}

nodeInd = neig.inIndex + 1;
err = ACAPI_Goodies(APIAny_InsertPolyNodeID, &memo, &nodeInd, (API_Coord*)(&begC));
if (!err) {
switch (idElem) {
case API_SlabID:
//* nothing to do
break;
case API_RoofID:
if (memo.edgeTrims != nullptr && *memo.edgeTrims != nullptr) {
//* insert edgeTrim rec; [neig.inIndex]
}
break;
default:
return; //* never got there
}
err = ACAPI_Element_ChangeMemo(neig.guid, APIMemoMask_Polygon, &memo);
if (err)
GiveMessage_Err("ACAPI_Element_ChangeMemo", err);
}
else
GiveMessage_Err("APIAny_InsertPolyNodeID", err);

ACAPI_DisposeElemMemoHdls(&memo);
return;
}
I have been using ArchiCAD continually since ArchiCAD 4.5
Member of Architalk since 2003, but missed the migration to Graphisoft. Melbourne, Australia
1 REPLY 1
Hiromichi Shinkawa
Graphisoft
Graphisoft

Hi, I'd suggest you to modify two places of your code for dealing with drawing local placement issue:

err = ACAPI_Element_GetMemo(oldGuid, &memo, APIMemoMask_Polygon); // only need polygon info.

After created a new drawing element, force to change pos:

API_Element mask;

ACAPI_ELEMENT_MASK_CLEAR(mask);

ACAPI_ELEMENT_MASK_SET(mask, API_DrawingType, pos);
newElement.drawing.pos	= element.drawing.pos;

err = ACAPI_Element_Change (&newElement, &mask, nullptr, 0, true);

Also, you can change newElement.drawing.name parameter for drawing title.

(Sorry I didn't check AC25, it should work on latest version)

HTH.