einfacher Text / AutoCAD ObjectARX und .NET
bccad 31. Mai. 2018, 09:01

Hallo,
ich bräuchte mal kurz eure Hilfe.
Beim Einfügen eines normalen Textes wird der Breitenfaktor immer auf 1.0 gesetzt,
obwohl in der Definition der Schriftart (hier ROMANS) die Breite auf 0.8 gesetzt ist.
Wie kann ich erreichen das der Wert aus der Schriftdefinition genommen wird oder
wo kann ich das programmtechnisch 'von Hand' einstellen ?

mfg bccad

Code:

Public Class Class1
    <CommandMethod("test")>
    Public Shared Sub text()
        Dim doc As Document = _AcAp.Application.DocumentManager.MdiActiveDocument
        Dim db As Database = doc.Database
        Using tr As Transaction = db.TransactionManager.StartTransaction()
            Dim bt As BlockTable
            Dim tx As DBText = New DBText()
            bt = CType(tr.GetObject(db.BlockTableId, OpenMode.ForRead), BlockTable)
            Dim btr As BlockTableRecord = CType(tr.GetObject(bt(BlockTableRecord.ModelSpace), OpenMode.ForWrite), BlockTableRecord)
            Dim tst As TextStyleTable = CType(tr.GetObject(db.TextStyleTableId, OpenMode.ForRead, False), TextStyleTable)
            For Each id As ObjectId In tst
                If Not id.IsErased Then
                    Dim txtstyle As TextStyleTableRecord = CType(tr.GetObject(id, OpenMode.ForWrite, False), TextStyleTableRecord)
                    If String.Compare(txtstyle.Name, "ROMANS", True) = 0 Then
                        tx.TextStyleId = id
                        Exit For
                    End If
                End If
            Next
            tx.SetDatabaseDefaults()
            tx.Position = New Point3d(100, 100, 0)
            tx.Height = 5
            tx.Layer = "0"

            ' tx.??? = 0.8    'Breitenfaktor

            tx.TextString = "Hallo Welt"
            btr.AppendEntity(tx)
            tr.AddNewlyCreatedDBObject(tx, True)
            tr.Commit()
        End Using

    End Sub
End Class


Brischke 31. Mai. 2018, 09:11

(ungetestet nimm das SetDatabaseDefaults mal direkt unter die Erzeugung des Textobjekts. Damit überschreibst du ggf. die zuvor gesetzte Stil-Einstellung.

Grüße!
Holger

bccad 01. Jun. 2018, 07:52

Zitat:

(ungetestet nimm das SetDatabaseDefaults mal direkt unter die Erzeugung des Textobjekts. Damit überschreibst du ggf. die zuvor gesetzte Stil-Einstellung.


Hallo Holger,

danke für deine schnelle Antwort, aber das war es leider nicht.   

Brischke 01. Jun. 2018, 08:59

... dann würde ich an deiner Stelle erst einmal den Code säubern.
Mir fällt auf, dass du alle möglichen Objekte öffnest, den Text erzeugst, aber keines dieser Objekte wieder schließt bzw. disposed. Sowas führt zu nicht nachvollziehbaren Fehlern und auch AutoCAD-Abstürzen, auch wenn der Befehl ansich fertig ist.
Ich habe mir angewöhnt, alle Objekte innerhalb eines using-statement zu kapseln (so wie die transaction indeinem code).

Wenn es das auch nicht war, dann (ich habe gerade kein Acad zur Hand) schau mal, ob es nicht irgendeine Set-Methode gibt, mit der man den Stil zuweisen kann. Weitere Lösungsidee ist, dass der Stil erst nach der Erzeugung im Modellberich geändert wird.

Grüße!
Holger

Brischke 01. Jun. 2018, 13:04


... jetzt habe ich ein Acad zur Hand.
Den Breitenfaktor kannst du auch direkt mit der Eigenschaft WidthFactor setzen.
Eine Set-Methode für den Style gibt es nicht .. geht dann auch nur über die Eigenschaften.

Grüße!
Holger

bccad 01. Jun. 2018, 14:33

Hallo Holger,

danke, das war der entscheidende Hinweis.
Den Breitenfaktor des Textstils bekommt man aus txtstyle.XScale.
Beides zusammen ist die Lösung für mein Problem.

Code:

' tx.??? = 0.8    'Breitenfaktor ???
  tx.WidthFactor = txtstyle.XScale

mfg bccad