The Global ARCHICAD Community

Stay informed. Get help. Share your knowledge.

Discussions about using GRAPHISOFT's tools (API DevKit) for independent software developers

Moderators: Karl Ottenstein, LaszloNagy, ejrolon, Barry Kelly, gkmethy, MOREH Tamas, Akos Somorjai, Ed Brown, Mihály Palenik, Tibor Lorántfy

Hello everyone,
What I'm trying to do is to move the dimension text (force it to the center) if its automatic position is outside. I've successfully done it, but I noticed that when I move it thru API, 'Always Readable' is disabled. I tried moving the text manually on ArchiCAD and it didn't change it.

I've also tried setting it to true whenever I change element, but it turns out it doesn't have an equivalent variable in the 'API_NoteType' struct (or I kind of missed it).

I've tried this on Dimensions, Radial Dimension, and Hatches, elements using API_NoteType.

The only changes I do on the element memo is:
memo.dimElems[].note.pos = [center]
memo.dimElems[].note.fixPos = true

Below is a copy of my code:
Code: Select allGSErrCode Dimension_MoveTextToCenter(API_Guid& i_guid) { API_ElementMemo memo; BNZeroMemory(&memo, sizeof(memo)); GSErrCode err = ACAPI_Element_GetMemo(i_guid, &memo, APIMemoMask_AdditionalPolygon); if (err != NoError) DBGPrintlnf("[" __FUNC__ "] ERROR %s - ACAPI_Element_GetMemo(APIMemoMask_AdditionalPolygon)", ErrId2Name(err)); else { bool hasChanges = false; const UInt32 nDimElem = BMGetHandleSize((GSHandle)memo.dimElems) / sizeof(API_DimElem); for (UInt32 d = 1; d < nDimElem; ++d) { auto& dimElem = (*memo.dimElems)[d]; if (dimElem.dimVal == 0) continue; auto& dimElemPrev = (*memo.dimElems)[d - 1]; if (!Dimension_MoveTextToCenter(dimElem.note, dimElem.pos, dimElemPrev.pos)) continue; double length = 0; const GSErrCode err = Any_GetTextLineLength(dimElem.note, length); if (err != NoError) { DBGPrintlnf("[Error] %s " __FUNC__ " - ACAPI_Goodies(APIAny_GetTextLineLengthID)", ErrId2Name(err)); break; } API_Coord pos; pos.x = (dimElem.pos.x + dimElemPrev.pos.x) / 2; pos.y = (dimElem.pos.y + dimElemPrev.pos.y) / 2; if (dimElem.note.noteAngle != 0) RotatePoint(pos, -dimElem.note.noteAngle); pos.x -= (length / 2); pos.y += (GetDrawingScale() / 2) / 1000; if (dimElem.note.noteAngle != 0) RotatePoint(pos, dimElem.note.noteAngle); dimElem.note.pos = pos; dimElem.note.fixPos = true; hasChanges = true; } if (err == NoError && hasChanges) { ACAPI_CallUndoableCommand("Change Memo", [&]() -> GSErrCode { err = ACAPI_Element_ChangeMemo(i_guid, APIMemoMask_AdditionalPolygon, &memo); return NoError; }); if (err == NoError) DBGPrintlnf("[" __FUNC__ "] SUCCESS ACAPI_Element_ChangeMemo"); else DBGPrintlnf("[Error] %s " __FUNC__ " - ACAPI_Element_ChangeMemo()", ErrId2Name(err)); } } ACAPI_DisposeElemMemoHdls(&memo); return err; }