3 weeks ago
- last edited
3 weeks ago
by
Laszlo Nagy
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.
(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)
Missing images
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
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;
}
a week ago
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.