Hot News:

Mit Unterstützung durch:

  Foren auf CAD.de (alle Foren)
  AutoCAD ObjectARX und .NET
  Layout Eigenschaften ändern - sind aber ReadOnly

Antwort erstellen  Neues Thema erstellen
CAD.de Login | Logout | Profil | Profil bearbeiten | Registrieren | Voreinstellungen | Hilfe | Suchen

Anzeige:

Darstellung des Themas zum Ausdrucken. Bitte dann die Druckfunktion des Browsers verwenden. | Suche nach Beiträgen nächster neuer Beitrag | nächster älterer Beitrag
  
Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für Autodesk Produkte
Autor Thema:  Layout Eigenschaften ändern - sind aber ReadOnly (2934 mal gelesen)
veydan
Mitglied



Sehen Sie sich das Profil von veydan an!   Senden Sie eine Private Message an veydan  Schreiben Sie einen Gästebucheintrag für veydan

Beiträge: 252
Registriert: 29.05.2008

AutoCAD/Mechanical 2009, Inventor 2009

erstellt am: 06. Mrz. 2009 10:06    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities

hallo!
Ich habe folgendes Problem.
Ich möchte in einer Funktion der ich einen layoutnamen übergebe bestimmte Eigenschaften ändern.
Hier mal der Code:

Code:

Dim myDWG As ApplicationServices.Document
        Dim myDB As DatabaseServices.Database
        Dim myTransMan As DatabaseServices.TransactionManager
        Dim myTrans As DatabaseServices.Transaction

        myDWG = ApplicationServices.Application.DocumentManager.MdiActiveDocument
        myDB = myDWG.Database
        myTransMan = myDWG.TransactionManager
        myTrans = myTransMan.StartTransaction

        Dim myBT As DatabaseServices.BlockTable
        Dim myBTR As DatabaseServices.BlockTableRecord
        Dim myBTRE As DatabaseServices.SymbolTableEnumerator
        Dim myLM As DatabaseServices.LayoutManager
        Dim myLayout As DatabaseServices.Layout
        Dim myLayouts As New ArrayList
        Dim myBTRs As New ArrayList
     
        Dim newEnt As DatabaseServices.Entity
        Dim myEnt As DatabaseServices.Entity
        Dim myEnum As DatabaseServices.BlockTableRecordEnumerator
        Dim NewBTR As DatabaseServices.BlockTableRecord

        myBT = myDB.BlockTableId.GetObject(DatabaseServices.OpenMode.ForWrite)
        myBTRE = myBT.GetEnumerator
        myLM = DatabaseServices.LayoutManager.Current
        While myBTRE.MoveNext
            myBTR = myBTRE.Current.GetObject(DatabaseServices.OpenMode.ForWrite)
            If myBTR.IsLayout Then
                myLayout = myBTR.LayoutId.GetObject(DatabaseServices.OpenMode.ForWrite)
                If UCase(myLayout.LayoutName) = UCase(LayoutName) Then
                    heir sollten den die eigenschaften verändert werden
                    myLayout.UseStandardScale = True geht aber nicht, da sie readonly sind. Wie kann ich auf diese Werte zugreifen?
                End If
            End If
        End While

        myTrans.Commit()
        myDWG.Editor.Regen()
        myTrans.Dispose()
        myTransMan.Dispose()


Hier sind mal ein paar bsp die ich einstellen möchte
PaperUnits = AcPlotPaperUnits.acMillimeters
StandardScale = AcPlotScale.acScaleToFit
ScaleLineweights = True
PlotType = AcPlotType.acWindow
PlotOrigin = MinPoint
SetWindowToPlot(MinPoint, MaxPoint)
PlotType = AcPlotType.acLayout

mfg

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP


Ex-Mitglied

erstellt am: 06. Mrz. 2009 10:19    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat

Hi,

ich kann Dir jetzt (leider) auf die schnelle keine Antwort geben, müsste ich erst nachbauen, geht sich jetzt leider nicht aus. Ich kann aber eine Empfehlung mitgeben aus Erfahrungen, die ich rund um Layout und Plot gemacht habe:

Einstellungen (obige betreffend), die über Managed-Access durchgeführt werden, werden oft nicht 1:1 während Code-Ablauf mitgeführt, sondern oft erst nach Ablauf des Codes, das ist so vergleichbar, wie bei normalen Elementen das TransAction.Commit die Elemente erst 'nachregeneriert', so ist das mit Layout-/Ploteinstellungen, die erst, wenn Dein Code zu Ende ist (und beim Plotten ist das erst NACH dem Plotten), erst dann werden die zuvor eingestellten Parameter regeneriert. Mir ist es da leider zu oft passiert, dass trotz TransAction.Commit und trotz DocumentLock.Dispose der Erfolg (richtiger Plot) nicht gelungen ist.

Das Handling über Managed-Access hat ja eigentlich auch nur dann Vorteile, wenn Du in Bezug auf Performance oder in Bezug auf Benutzereingriff während des Zeichnens 'ins AutoCAD hinein' willst. Für Layout-Einrichtung oder für Plotten arbeite ich über COM (bzw. die Autodesk.AutoCAD.Interop Assembly). Da arbeiten die Einstellungsänderung sofort und sind auch einfacher zu handeln.

Vielleicht hilft's, wenn nicht lass es mich wissem, dann geh ich Deinen Code (voraussichtlich) am WoEnde durch.

- alfred -

------------------
www.hollaus.at

veydan
Mitglied



Sehen Sie sich das Profil von veydan an!   Senden Sie eine Private Message an veydan  Schreiben Sie einen Gästebucheintrag für veydan

Beiträge: 252
Registriert: 29.05.2008

AutoCAD/Mechanical 2009, Inventor 2009

erstellt am: 06. Mrz. 2009 10:28    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities

Eigentlich ist es für mich kein Problem, wenn es erst später passiert.
Grund warum ich es umschreibe ist mein kleines Programm dass ich jetzt auf Com Basis habe.
Es konvertiert mir Zeichnungen auf einen Standard wie ich ihn brauche.
Sprich Rahmen, SK tausch auf einen Standard, Attributemapping, Linienstärken konvertieren, Layouteinstellungen,Layer Konvertierungen usw.

Wenn die Ploteinstellung erst nach der Konvertierung übernommen wird wäre das für mich kein Problem, da ich ja nicht direkt im Code drucke.

Ich erhoffe mir durch das umprogrammieren auf .NET dass es A viel schneller ist (auch wenn eine Zeichnung jetzt auch nur ca 3-7 Sekunden dauert mit allen Einstellungen) und B, dass ich in Zukunft auf Funktionen daraus zurückgreifen kann, falls ich sie mal brauche.

also wäre das für mich glaube ich kein Problem oder?

mfg

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP


Ex-Mitglied

erstellt am: 06. Mrz. 2009 10:35    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat

Hi,

Zitat:
Original erstellt von veydan:
Ich erhoffe mir durch das umprogrammieren auf .NET dass es A viel schneller ist (auch wenn eine Zeichnung jetzt auch nur ca 3-7 Sekunden dauert mit allen Einstellungen) und B, dass ich in Zukunft auf Funktionen daraus zurückgreifen kann, falls ich sie mal brauche.

also wäre das für mich glaube ich kein Problem oder?


...nein, kein Problem, nur ist die Performace beim Layout-Erstellen schon mal durch AutoCAD selbst 'im Eimer' und solange Du nicht auf tausende Elemente im Layout zurückgreifst, dann bringt's in bezug auf Geschwindigkeit nix.

Und dann stehe ich an dem Punkt der Überlegung, wieviel Zeilen brauche ich zum Schreiben und wie fehleranfällig kann es werden. Mit COM (schätzungsweise) nicht mal die Hälfte der Zeilen (weil ich mir alles rund um Transaction, Enumerator, ... ersparen kann) und damit bin ich auch beim Schreiben entsprechend schneller unterwegs, ohne dass Qualität oder Performance darunter leidet. ==> Sind halt meine Gedanken dazu   

- alfred -

------------------
www.hollaus.at

[Diese Nachricht wurde von a.n. am 11. Mrz. 2009 editiert.]

veydan
Mitglied



Sehen Sie sich das Profil von veydan an!   Senden Sie eine Private Message an veydan  Schreiben Sie einen Gästebucheintrag für veydan

Beiträge: 252
Registriert: 29.05.2008

AutoCAD/Mechanical 2009, Inventor 2009

erstellt am: 12. Mrz. 2009 08:36    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities

ja, auch wenn es mehr Codezeilen sind, die Zukunft ist wohl .NET und wenn dann mache ich gleich alles so.

Weißt du wo ich etwas finden kann wie ich die Layouteigenschaften bzgl Drucken verändern kann?
Denn auch wenn ich ein neues erstelle sind diese Eigenschaften ReadOnly.

mfg

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP


Ex-Mitglied

erstellt am: 12. Mrz. 2009 10:43    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat

Hi,

schau mal das hier an, da sind auch viel Erklärungen und auch weiterführende Links.

- alfred -

------------------
www.hollaus.at

veydan
Mitglied



Sehen Sie sich das Profil von veydan an!   Senden Sie eine Private Message an veydan  Schreiben Sie einen Gästebucheintrag für veydan

Beiträge: 252
Registriert: 29.05.2008

AutoCAD/Mechanical 2009, Inventor 2009

erstellt am: 12. Mrz. 2009 13:35    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities

kann mal jemand den code probieren?
bei mir werden die Einstellungen nicht übernommen...

Code:
 
Dim myDB As DatabaseServices.Database
        Dim myTransMan As DatabaseServices.TransactionManager
        Dim myTrans As DatabaseServices.Transaction
        Dim mydwg As Document
        mydwg = ApplicationServices.Application.DocumentManager.MdiActiveDocument
        myDB = mydwg.Database
        myTransMan = mydwg.TransactionManager
        myTrans = myTransMan.StartTransaction

        Dim myBT As DatabaseServices.BlockTable
        Dim myBTR As DatabaseServices.BlockTableRecord
        Dim myBTRE As DatabaseServices.SymbolTableEnumerator
        Dim myLM As DatabaseServices.LayoutManager
        Dim myLayout As DatabaseServices.Layout
        Dim myLayouts As New ArrayList
        Dim myBTRs As New ArrayList
        Dim ext As Boolean = False
        Dim minpoint As Point2d = New Point2d(0, 0)
        Dim maxpoint As Point2d = New Point2d(420, 297)
        Dim wind As Extents2d = New Extents2d(minpoint, maxpoint)

        myBT = myDB.BlockTableId.GetObject(DatabaseServices.OpenMode.ForWrite)
        myBTRE = myBT.GetEnumerator
        myLM = DatabaseServices.LayoutManager.Current
        Using myTrans
            While myBTRE.MoveNext
                myBTR = myBTRE.Current.GetObject(DatabaseServices.OpenMode.ForWrite)
                If myBTR.IsLayout Then
                    myLayout = myBTR.LayoutId.GetObject(DatabaseServices.OpenMode.ForWrite)
                    If myLayout.LayoutName = "Layout1" Then
                        Dim pi As PlottingServices.PlotInfo = New PlottingServices.PlotInfo()
                        Dim ps As PlotSettings = New PlotSettings(myLayout.ModelType)
                        Dim coll As Collections.Specialized.StringCollection
                        pi.Layout = myBTR.LayoutId
                        ps.CopyFrom(myLayout)
                        Dim medianame As String = ""
                        Dim psv As PlotSettingsValidator = PlotSettingsValidator.Current

                        psv.SetPlotPaperUnits(ps, PlotPaperUnit.Millimeters)
                        psv.SetStdScaleType(ps, StdScaleType.ScaleToFit)
                        psv.SetUseStandardScale(ps, True)
                        psv.SetPlotWindowArea(ps, wind)
                        psv.SetPlotType(ps, PlotType.Window)
                        psv.SetPlotWindowArea(ps, wind)
                        psv.SetPlotOrigin(ps, minpoint)
                        psv.SetPlotWindowArea(ps, wind)

                        coll = psv.GetCanonicalMediaNameList(ps)
                        For Each medname In coll
                            If ext = False Then
                                psv.SetCanonicalMediaName(ps, medname)
                            Else
                                Exit For
                            End If
                            If Abs(420 - Round(ps.PlotPaperSize.X)) < 10 And Abs(297 - Round(ps.PlotPaperSize.Y)) < 10 Then
                                medianame = medname
                                ext = True
                            End If
                        Next
                        psv.SetPlotConfigurationName(ps, "DWF6 ePlot.pc3", medianame)

                        pi.OverrideSettings = ps
                        Dim piv As PlottingServices.PlotInfoValidator = New PlottingServices.PlotInfoValidator()
                        piv.MediaMatchingPolicy = PlottingServices.MatchingPolicy.MatchEnabled
                        piv.Validate(pi)
                    End If
                End If
            End While
            myTrans.Commit()
            mydwg.Editor.Regen()
        End Using
        myTrans.Dispose()
        myTransMan.Dispose()


Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP


Ex-Mitglied

erstellt am: 12. Mrz. 2009 18:24    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat

Hi,

ich hab mal was probiert, hat bei mir auf diese Art funktioniert, kann aber für nichts da eine Garantie abgeben !!

Code:
            Dim myLayout As DatabaseServices.Layout = CType(myTrans.GetObject(myBTR.LayoutId, DatabaseServices.OpenMode.ForWrite, False, False), DatabaseServices.Layout)
            If UCase(myLayout.LayoutName) = UCase(LayoutName) Then
              myLM.CurrentLayout = LayoutName

              Dim tPltSettings As DatabaseServices.PlotSettings = New DatabaseServices.PlotSettings(False)

              Dim tPSV As DatabaseServices.PlotSettingsValidator = DatabaseServices.PlotSettingsValidator.Current
              tPSV.RefreshLists(myLayout)

              tPSV.SetPlotConfigurationName(myLayout, "DWF6 ePlot.pc3", "ISO_A4_(297.00_x_210.00_mm)") 'leerschritte muessen durch '_' ersetzt werden
              tPSV.SetCanonicalMediaName(myLayout, "ISO_A4_(297.00_x_210.00_mm)")
              tPSV.SetPlotPaperUnits(myLayout, DatabaseServices.PlotPaperUnit.Millimeters)
              tPSV.SetPlotType(myLayout, Autodesk.AutoCAD.DatabaseServices.PlotType.Layout)
              tPSV.SetUseStandardScale(myLayout, False)
              tPSV.SetStdScaleType(myLayout, DatabaseServices.StdScaleType.ScaleToFit)

              tPSV.RefreshLists(myLayout)
            End If


Hoffentlich funktionierts bei Dir auch so 

- alfred -

------------------
www.hollaus.at

veydan
Mitglied



Sehen Sie sich das Profil von veydan an!   Senden Sie eine Private Message an veydan  Schreiben Sie einen Gästebucheintrag für veydan

Beiträge: 252
Registriert: 29.05.2008

AutoCAD/Mechanical 2009, Inventor 2009

erstellt am: 13. Mrz. 2009 07:56    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities

ok jetzt funktioniert es.

Etwas komisch, da der PlotSettingsValidator ein PlotSettings Objekt erwartet, genau so wie ich es gemacht habe.
Da funktionierte es aber nicht.

gibt man das Layout an so wie du, funktioniert es.

Es hilft auch nicht, wenn ich meinen Code hernehme und das Layout auf Current setze, bzw am Ende auch noch tPSV.RefreshLists(myLayout) schreibe.

also das Plottsettings Objekt ist irgendwie überflüssig.(kann in deinem Code auch auskommentiert werden).

mfg

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP


Ex-Mitglied

erstellt am: 13. Mrz. 2009 10:49    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat

HI, 
Zitat:
also das Plottsettings Objekt ist irgendwie überflüssig.(kann in deinem Code auch auskommentiert werden).
Ja, kannst Du natürlich von meinem Entfernen, hab ich nur zum Spielen gebraucht, war dann ein wenig unter Zeitdruck und hab das vergessen rauszulöschen.

Hauptsache es funkt, - alfred -

------------------
www.hollaus.at

veydan
Mitglied



Sehen Sie sich das Profil von veydan an!   Senden Sie eine Private Message an veydan  Schreiben Sie einen Gästebucheintrag für veydan

Beiträge: 252
Registriert: 29.05.2008

AutoCAD/Mechanical 2009, Inventor 2009

erstellt am: 15. Apr. 2010 08:52    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities

hallo!
jetzt muss ich diesen thread wieder rausholen...

wenn ich die layouteinstellungen verändern will bekomme ich bei dieser Zeile:

Code:

  PSV.SetPlotConfigurationName(ps, PlotDevName, MedName)


den Error eInvalidInput

Hier wie ich zu den anderen Werten komme:

Code:

Dim ps As DatabaseServices.PlotSettings = New DatabaseServices.PlotSettings(False)
Dim pi As New PlottingServices.PlotInfo()
pi.Layout = La.ObjectId 'la ist das aktuelle Layout

Dim PSV As DatabaseServices.PlotSettingsValidator = DatabaseServices.PlotSettingsValidator.Current
                            PSV.RefreshLists(La)

medianames = PSV.GetCanonicalMediaNameList(ps) 'Diese Liste laufe ich dann durch und setzte jeweils den Wert
PlotDevName  ist Adobe PDF, der ist sicher enthalten, da ich dass auch abprüfe.                   


was hat ACAD dagegen, dass ich diese Werte veränder?
und was genau gibt dieser Boolean Parameter an(true oder false)
Dim ps As DatabaseServices.PlotSettings = New DatabaseServices.PlotSettings(False)

mfg

Edit:
Ich weiß jetzt warum es den Fehler gibt, in meinem Beispiel setzte ich Adobe PDF als Drucker, dieser hat aber keines der Formate die ich in meiner medianames Liste habe.
Wie bekomme ich also die medianames für einen speziellen Drucker?

und welche Liste bekomme ich jetzt? Werte sind u.a: User256,User43,B4(JIS),... sagt euch das etwas?


Edit2:
Kann jemand probieren, ob er ein Plotfenster setzen kann?
Wenn ich den Plottyp auf Fenster umstelle, bekomme ich eInvalidInput...

Code:

PSV.SetPlotType(La, Autodesk.AutoCAD.DatabaseServices.PlotType.Window)
PSV.SetPlotWindowArea(La, PlotWindow)
PSV.SetPlotCentered(La, True)
PSV.SetPlotOrigin(La, New Geometry.Point2d(0, 0))

PSV.SetPlotType(La, Autodesk.AutoCAD.DatabaseServices.PlotType.Layout)           



[Diese Nachricht wurde von veydan am 15. Apr. 2010 editiert.]

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

Anzeige.:

Anzeige: (Infos zum Werbeplatz >>)

Darstellung des Themas zum Ausdrucken. Bitte dann die Druckfunktion des Browsers verwenden. | Suche nach Beiträgen

nächster neuerer Beitrag | nächster älterer Beitrag
Antwort erstellen


Diesen Beitrag mit Lesezeichen versehen ... | Nach anderen Beiträgen suchen | CAD.de-Newsletter

Administrative Optionen: Beitrag schliessen | Archivieren/Bewegen | Beitrag melden!

Fragen und Anregungen: Kritik-Forum | Neues aus der Community: Community-Forum

(c)2023 CAD.de | Impressum | Datenschutz