[CommandMethod("SANNO_1")]
public void SelectAnnotation()
{
Document doc = AcadApp.DocumentManager.MdiActiveDocument;
Database db = doc.Database;
Editor ed = doc.Editor;
PromptSelectionOptions selectionOptions = new PromptSelectionOptions();
TypedValue[] filterList = { new TypedValue((int)DxfCode.Start, "MText,Text,Dimension") };
SelectionFilter filter = new SelectionFilter(filterList);
PromptSelectionResult selectionResult = ed.GetSelection(selectionOptions, filter);
//Do nothing if selection is unsuccessful
if (selectionResult.Status != PromptStatus.OK)
return;
using (Transaction tr = db.TransactionManager.StartTransaction())
{
try
{
ObjectId[] objIds = selectionResult.Value.GetObjectIds();
foreach (ObjectId objId in objIds)
{
DBObject dbObj = (DBObject)tr.GetObject(objId, OpenMode.ForRead);
string typeName = dbObj.GetType().Name; // temp for testing
string textValue;
ed.WriteMessage("\nDBObject.GetType() : "
+ dbObj.GetType());
switch (dbObj.GetType().Name)
{
case "MText":
// probably should use ExplodeFragments here !!
// with MTextFragmentCallback
MText mText = (MText)dbObj;
textValue = mText.Text;
ed.WriteMessage("\nWe have Mtext:- Text Property = "
+ textValue);
break;
case "DBText":
DBText dText = (DBText)dbObj;
textValue = dText.TextString;
ed.WriteMessage("\nWe selected Text:- TextString Property = "
+ textValue);
break;
case "AlignedDimension":
case "RotatedDimension":
case "ArcDimension":
Dimension dimObj = (Dimension)dbObj;
// THIS NEEDS TO BE RESOLVED ..LEAVE FOR THE PROGRAMMING FAIRIES.
textValue = dimObj.DimensionText;
ed.WriteMessage("\nWe selected a Dimension :- DimensionText = "
+ textValue);
break;
}
}
}
catch (Autodesk.AutoCAD.Runtime.Exception ex)
{
ed.WriteMessage(ex.Message);
tr.Abort();
}
}
}
if(acdbOpenObject(pDim, objId, AcDb::kForWrite) == Acad::eOk) {
char* pszDimText = pDim->dimensionText();
string dimText(pszDimText);
delete[] pszDimText;
pszDimText = NULL;
if(dimText.length() > 0) {
stackText(dimText);
pDim->setDimensionText(dimText.c_str());
}
else {
dimText = textFromMeasurement(pDim);
stackText(dimText);
pDim->setDimensionText(dimText.c_str());
}
pDim->close();
}
string textFromMeasurement(AcDbDimension* pDim) {
double dblMeasurement = 0;
pDim->measurement(dblMeasurement);
char* pszDimText = new char[26];
acdbRToS(dblMeasurement,
curDoc()->database()->dimlunit(),
curDoc()->database()->dimdec(),
pszDimText);
string retVal(pszDimText);
delete[] pszDimText;
pszDimText = NULL;
return retVal;
}
Dimension oDim = (Dimension)trans.GetObject(oSS[i].ObjectId, OpenMode.ForWrite);
double dVal = oDim.Measurement;
string iValue = Math.Round(dVal, 4).ToString();
// convert to milimeters and then round to 2 decimal places
dVal = Math.Round(oCon.InchToMM(dVal), 2);
ModifyBlockAtt(oDim.DimensionText, dVal.ToString(), iValue);
This is C++, but I think you'll get the drift:Code: [Select]...............
This is C++, but I think you'll get the drift:Code: [Select]...............
So you basically reconstruct it from the Measurement Property and dimVars Chuck, yes ?
[CommandMethod("DIMMTEXT")]
public void dimmtext()
{
Document doc = acadApp.DocumentManager.MdiActiveDocument;
Editor ed = doc.Editor;
Database db = doc.Database;
PromptEntityResult res = ed.GetEntity("\nSelect dimension: ");
if (res.Status != PromptStatus.OK) return;
using (Transaction tr = db.TransactionManager.StartTransaction())
{
Dimension dim = tr.GetObject(res.ObjectId, OpenMode.ForRead, false) as Dimension;
if (dim != null)
{
ed.WriteMessage(dim.GetType().Name); //test
String str = dim.DimensionText;
if (str == "")
{
str = Math.Round(dim.Measurement, dim.Dimtdec).ToString();
}
else if (str.Contains("<>"))
{
str = Math.Round(dim.Measurement, dim.Dimtdec).ToString();
str = "Has been overridden<> Measurement=" + str;
}
//if (dim.GetType().Name.Contains("LineAngularDimension2")) // no workie
//{
// double d = Math.Round(dim.Measurement, dim.Dimtdec);
// double ang = d / Math.PI * 180.0;
// ed.WriteMessage(Converter.AngleToString(ang));
// //ed.WriteMessage("\n", Converter.AngleToString(d, AngularUnitFormat.Grads, -1));
//}
ed.WriteMessage("\nDimension text [{0}]", str);
}
tr.Commit();
}
}
switch (dbObj.GetType().Name)
{
case "MText":
//............
if(dimObj.GetType() == typeof(Dimension))
// Do something interesting here with a dimension
I'm going to have a look over the weekend Bryco ... unless someone who knows pops is and shouts beforehand.As usual, the trick is RTFM
DBObject.GetType() : Autodesk.AutoCAD.DatabaseServices.MText
Text Property = Hello Mtext World
DBObject.GetType() : Autodesk.AutoCAD.DatabaseServices.ArcDimension
DimensionText = 1045 , Measurement = 1045.02008357775
DBObject.GetType() : Autodesk.AutoCAD.DatabaseServices.AlignedDimension
DimensionText = 566 , Measurement = 566.212198720329
DBObject.GetType() : Autodesk.AutoCAD.DatabaseServices.RotatedDimension
DimensionText = 676 , Measurement = 676.204852354089
DBObject.GetType() : Autodesk.AutoCAD.DatabaseServices.MText
Text Property = Hello Mtext World
DBObject.GetType() : Autodesk.AutoCAD.DatabaseServices.DBText
We selected Text:- TextString Property = Hello Text World
DBObject.GetType() : Autodesk.AutoCAD.DatabaseServices.RotatedDimension
DimensionText = 1338 , Measurement = 1338.13021112601
DBObject.GetType() : Autodesk.AutoCAD.DatabaseServices.RotatedDimension
DimensionText = 457 , Measurement = 456.727064654551
string textValue = dimObj.FormatMeasurement(dimObj.Measurement, "");
>>>
Entity.GetType() : MText
Text Property = 1338
Entity.GetType() : MText
Text Property = 457
Entity.GetType() : MText
Text Property = 761
Entity.GetType() : RotatedDimension
DimensionText = 1338 , Measurement = 1338.13021112601
Entity.GetType() : RotatedDimension
DimensionText = PREFIX 624 SUFFIX , Measurement = 624.184381557403
Total Value = 5964
Um... don't you mean:
if( dimObj is Dimension )
MText mt = dbObj as MText;
If (mt != null) {
// Got some MText - do your mojo here.
}
DBText t = dbObj as DBText;
if (t != null) {
// Got some text - do text mojo here
}
Um... don't you mean:
if( dimObj is Dimension )
Possibly ;) I had typeof on the brain last night and in the cold light of day, I would probably actually use, in this case, 'as' instead...potentially one less cast.Code: [Select]MText mt = dbObj as MText;
If (mt != null) {
// Got some MText - do your mojo here.
}
DBText t = dbObj as DBText;
if (t != null) {
// Got some text - do text mojo here
}
Cheers,
Glenn.