I need to save some data for each block reference and then with reactors update block attributes using that saved data and geometric properties of that block. For instance, one block attribute contains X coordinate, prefix text, suffix text and coordinate precision. Each time the block is moved, the program needs to update X coordinate.
Sp, what should I use: xData or something else?
Solved! Go to Solution.
Solved by Alexander.Rivilis. Go to Solution.
Hi,
>> Each time the block is moved, the program needs to update X coordinate.
I don't know what AutoCAD-version you are using, but why don't you use the built-in fields in attributes (>>>details<<<)? If you add a field into the attribute that grabs the insertion-X from your blockreference everything is done without any programming!
- alfred -
Unless you must support very old versions of AutoCAD, I would use a field and let AutoCAD do the work. Otherwise, xdata would be fine if your data is always very small. If there's a potential for using up all the xdata space, an extension dictionary would be the next choice.
Відповідь корисна? Клікніть на "ВПОДОБАЙКУ" цім повідомленням! | Do you find the posts helpful? "LIKE" these posts!
Находите сообщения полезными? Поставьте "НРАВИТСЯ" этим сообщениям!
На ваше запитання відповіли? Натисніть кнопку "ПРИЙНЯТИ РІШЕННЯ" | Have your question been answered successfully? Click "ACCEPT SOLUTION" button.
На ваш вопрос успешно ответили? Нажмите кнопку "УТВЕРДИТЬ РЕШЕНИЕ"
Alexander Rivilis / Александр Ривилис / Олександр Рівіліс
Programmer & Teacher & Helper / Программист - Учитель - Помощник / Програміст - вчитель - помічник
Facebook | Twitter | LinkedIn
Thank you.
But this doesn't work (it raises FATAL ERROR dialog in AutoCAD):
void modified(const AcDbObject* dbObj) { AcDbObject *pBlkRef; ErrorStatus err = acdbOpenObject(pBlkRef, dbObj->objectId(), AcDb::kForWrite); if (err != eOk) { pBlkRef->close(); return; } err = acdbEvaluateFields(dbObj->objectId(), AcDbField::kAutomatic); if (err != eOk) { pBlkRef->close(); return; } pBlkRef->close(); }
OK I realized what's the problem.
The reactor's modified() function is called when object->close() function is invoked. So acdbEvaluateFields() throws eWasNotified. But I need to call acdbEvaluateFields() from the modified() function. I also tried with objectClosed() method - the same story...
Does somebody have a clue how can I solve this?
What about:
void modified(const AcDbObject* dbObj) { acdbEvaluateFields(dbObj->objectId(), AcDbField::kAutomatic); }
?
IMHO. This is not the best place to call acdbEvaluateFields. I would prefer to use a command-reactor (for example, commandEnded). modified-reactor can collect AcDbObjectId of modified objects in order to call acdbEvaluateFields in command-reactor.
Відповідь корисна? Клікніть на "ВПОДОБАЙКУ" цім повідомленням! | Do you find the posts helpful? "LIKE" these posts!
Находите сообщения полезными? Поставьте "НРАВИТСЯ" этим сообщениям!
На ваше запитання відповіли? Натисніть кнопку "ПРИЙНЯТИ РІШЕННЯ" | Have your question been answered successfully? Click "ACCEPT SOLUTION" button.
На ваш вопрос успешно ответили? Нажмите кнопку "УТВЕРДИТЬ РЕШЕНИЕ"
Alexander Rivilis / Александр Ривилис / Олександр Рівіліс
Programmer & Teacher & Helper / Программист - Учитель - Помощник / Програміст - вчитель - помічник
Facebook | Twitter | LinkedIn
The problem was that you cannot call acdbEvaluateFields() when closing the object. I had to remember which object was edited in an editor reactor and then in commandEnded() funciton call acdbEvaluateFields().
@Anonymous wrote:
The problem was that you cannot call acdbEvaluateFields() when closing the object. I had to remember which object was edited in an editor reactor and then in commandEnded() funciton call acdbEvaluateFields().
Now OK?
Відповідь корисна? Клікніть на "ВПОДОБАЙКУ" цім повідомленням! | Do you find the posts helpful? "LIKE" these posts!
Находите сообщения полезными? Поставьте "НРАВИТСЯ" этим сообщениям!
На ваше запитання відповіли? Натисніть кнопку "ПРИЙНЯТИ РІШЕННЯ" | Have your question been answered successfully? Click "ACCEPT SOLUTION" button.
На ваш вопрос успешно ответили? Нажмите кнопку "УТВЕРДИТЬ РЕШЕНИЕ"
Alexander Rivilis / Александр Ривилис / Олександр Рівіліс
Programmer & Teacher & Helper / Программист - Учитель - Помощник / Програміст - вчитель - помічник
Facebook | Twitter | LinkedIn
Yes.
Though I have one more question. Can I somehow make persistent editor reactor that would load with the concrete DWG file?
No.
Відповідь корисна? Клікніть на "ВПОДОБАЙКУ" цім повідомленням! | Do you find the posts helpful? "LIKE" these posts!
Находите сообщения полезными? Поставьте "НРАВИТСЯ" этим сообщениям!
На ваше запитання відповіли? Натисніть кнопку "ПРИЙНЯТИ РІШЕННЯ" | Have your question been answered successfully? Click "ACCEPT SOLUTION" button.
На ваш вопрос успешно ответили? Нажмите кнопку "УТВЕРДИТЬ РЕШЕНИЕ"
Alexander Rivilis / Александр Ривилис / Олександр Рівіліс
Programmer & Teacher & Helper / Программист - Учитель - Помощник / Програміст - вчитель - помічник
Facebook | Twitter | LinkedIn