The Global ARCHICAD Community

Stay informed. Get help. Share your knowledge.

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

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

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 all
GSErrCode 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));
		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))

			double length = 0;
			const GSErrCode err = Any_GetTextLineLength(dimElem.note, length);
			if (err != NoError)
				DBGPrintlnf("[Error] %s " __FUNC__ " - ACAPI_Goodies(APIAny_GetTextLineLengthID)", ErrId2Name(err));

			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));
	return err;
sznagy wrote:
Wed Jan 30, 2019 6:44 pm

Could you specify the version of ArchiCAD you are using?
that was ArchiCAD 22 3006 INT FULL

I've recently updated to 5009 and tested again, still same output, the 'always readable' turns off.
sznagy wrote:
Mon Feb 04, 2019 5:37 pm
Yes, it is indeed a bug. I made an entry for it. Let me know if this is a great deal for the project, and we will do our best to fix it.
Thank you, and yes it is important as we are creating lots of dimensions and it will be quite a hassle for our users to turn each back on manually.