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

#293039
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; }
Attachments
DimensionText_AlwaysReadable_Disabled.PNG