Hallo liebe AutoCAD Experten
Ich entwickle gerade ein Plugin für AutoCAD, das bestimmte einzeilige MText Objekte durch attributierte Blöcke ersetzt. Als Einfügepunkt für den Block benutze ich die jeweile MText.Location. Die meisten dieser Texte haben den Einfügepunkt "Unten links" definiert, daher ist auch der Block so gestaltet (bzw. wird zur Laufzeit so erzeugt), dass die Attributreferenz danach den Text perfekt ersetzt.
Einzelne dieser MTexte haben aber, wie ich feststellen musste, ihren Einfügepunkt "Oben links" definiert - der Block wird dann natürlich um die MText.ActualHeight versetzt platziert.
Wie kann ich dieses Dilemma lösen? Wenn man in AutoCAD direkt den Einfügepunkt eines MTextes ändert, bleibt der Text ja an der bestehenden Position, lediglich der Einfügepunkt wechselt an die neue Stelle. Also passieren dabei ja mehrere Schritte:
1.) Die aktuelle Position wird gespeichert
2.) .AttachmentPoint wird geändert
3.) .Location wird geändert, so dass der MText im Endeffekt wieder am selben Platz auftaucht.
Wie kann ich dieses Verhalten mit .NET nachbilden?
Angehängt ein Testmethode wie ich den AttachmentPoint ändere...
Code:
[CommandMethod("MTextJustificationTest")]
public void MTextJustificationTest()
{
Database db = Autodesk.AutoCAD.ApplicationServices.Core.Application.DocumentManager.MdiActiveDocument.Database;
Editor ed = Autodesk.AutoCAD.ApplicationServices.Core.Application.DocumentManager.MdiActiveDocument.Editor; Point3d startPos = new Point3d();
using (Transaction tr = db.TransactionManager.StartTransaction())
{
TypedValue[] filterDxf = new TypedValue[]
{
new TypedValue((int)DxfCode.Start,"MTEXT")
};
SelectionFilter selectionFilter = new SelectionFilter(filterDxf);
PromptSelectionResult psr = ed.SelectAll(selectionFilter);
SelectionSet selectionSet = psr.Value;
foreach (var objId in psr.Value.GetObjectIds())
{
MText mText = tr.GetObject(objId, OpenMode.ForWrite) as MText;
if (mText.Attachment != AttachmentPoint.BottomLeft)
{
startPos = mText.Location;
// How to get the _real_ text position?
mText.Attachment = AttachmentPoint.BottomLeft;
}
}
tr.Commit();
}
}
Ich bin über jeden Hinweis dankbar!
lg
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP