The code sample below implements many of the significant functions which can be used for annotation scaling. For further information, please check the ObjectARX Reference Guide.
void CAnnotationApp::adskAnnotationScalingaddAnnoEnt()
{
AcGePoint3d insPnt;
// pick a point on screen for the object
int res = acedGetPoint(NULL, _T("\nPick point for object : "), asDblArray(insPnt));
// if ok
if (res == RTNORM)
{
Acad::ErrorStatus es;
// lets carry out the process to try and create a custom scale of 1:22
// first, get the current drawing
AcDbDatabase *dwg = curDoc()->database();
// create my annotation scale object, may as well set it to the current scale in case my scale is already set
AcDbAnnotationScale *myAnnotationScale = dwg->cannoscale();
// also create one on the stack so we don't have to worry about deleting it later (addContext makes a copy of the passed pointer)
AcDbAnnotationScale scale;
// what scale are we set too?
AcDbAnnotationScale *curScale = dwg->cannoscale();
AcString curScaleName;
// get the name of the scale
curScale->getName(curScaleName);
// if we are not already set to my 1:22 scale then we need to add it
if (_tcscmp(curScaleName, _T("MyScale 1:22")))
{
// next get the objectContextManager
AcDbObjectContextManager *contextManager = dwg-
>objectContextManager(); // if ok
if (contextManager)
{
// now get the Annotation Scaling context collection (named ACDB_ANNOTATIONSCALES_COLLECTION)
AcDbObjectContextCollection* const contextCollection = contextManager->contextCollection(ACDB_ANNOTATIONSCALES_COLLECTION);
// if ok
if (contextCollection)
{
// if it doesn't exist, then lets set it up
myAnnotationScale = &scale;
myAnnotationScale->setName(_T("MyScale 1:22"));
myAnnotationScale->setPaperUnits(1);
myAnnotationScale->setDrawingUnits(22);
// lets check to see if we already have this scale context in the context manager
bool alreadyHasContext = contextCollection->hasContext(_T("MyScale 1:22"));
// if not
if (!alreadyHasContext)
{
// add the new context
es = contextCollection->addContext(myAnnotationScale);
}
// now set the current dwg annotation scale to the newly created scale context 1:22, not a requirement
es = dwg->setCannoscale(myAnnotationScale);
}
}
}
// next, create a new instance of my custom object, this is derived from AcDbText so that means the
// Annotation Context framework is already implemented for us
AcDbObjectPointer<asdkMyAnnotativeObject> ent;
ent.create();
// set the properties for it
ent->setDatabaseDefaults();
ent->setPosition(insPnt);
// set the AcDbText height, because we are derived from AcDbText
// the Annotation framework is already in place
ent->setHeight(1);
ent->setTextString(_T("AcDbText Derived Annotative Text - Scales automatically"));
// now set my own Text height, this will show how to utilise the Annotation
// framework - see the worldDraw/viewportDraw of the custom entity
ent->setMyTextHeight(1);
ent->setMyTextString(_T("My Custom Object Text - code implemented to handle scaling Framework"));
// now add to the current space, open it for write
AcDbBlockTableRecordPointer curSpace(curDoc()->database()->currentSpaceId(), AcDb::kForWrite);
// if ok
if (curSpace.openStatus() == Acad::eOk)
curSpace->appendAcDbEntity(ent);
// now add to the entity
AcDbAnnotativeObjectPE *annotationPE = ACRX_PE_PTR(ent, AcDbAnnotativeObjectPE);
// if ok
if (annotationPE)
{
// now get the Object Context PEX
AcDbObjectContextInterface *objectContextInterface = ACRX_PE_PTR(ent, AcDbObjectContextInterface);
// if ok
if (objectContextInterface)
{
// set it to be annotative
es = annotationPE->setAnnotative(ent, true);
// add My scale context to the list of contexts es = objectContextInterface->addContext(ent, *myAnnotationScale);
}
// all done!
}
}
}