| | | Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für Autodesk Produkte | | | | PNY bietet das umfangreichste Ökosystem von B2B als auch B2C-Lösungen für IT-Akteure auf dem Markt, eine Pressemitteilung
|
Autor
|
Thema: Layout Eigenschaften ändern - sind aber ReadOnly (3051 mal gelesen)
|
veydan Mitglied
Beiträge: 252 Registriert: 29.05.2008 AutoCAD/Mechanical 2009, Inventor 2009
|
erstellt am: 06. Mrz. 2009 10:06 <-- editieren / zitieren --> Unities abgeben:
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 / zitieren -->
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
Beiträge: 252 Registriert: 29.05.2008 AutoCAD/Mechanical 2009, Inventor 2009
|
erstellt am: 06. Mrz. 2009 10:28 <-- editieren / zitieren --> Unities abgeben:
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 / zitieren -->
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
Beiträge: 252 Registriert: 29.05.2008 AutoCAD/Mechanical 2009, Inventor 2009
|
erstellt am: 12. Mrz. 2009 08:36 <-- editieren / zitieren --> Unities abgeben:
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 / zitieren -->
Hi, schau mal das hier an, da sind auch viel Erklärungen und auch weiterführende Links. - alfred - ------------------ www.hollaus.at |
veydan Mitglied
Beiträge: 252 Registriert: 29.05.2008 AutoCAD/Mechanical 2009, Inventor 2009
|
erstellt am: 12. Mrz. 2009 13:35 <-- editieren / zitieren --> Unities abgeben:
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 / zitieren -->
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
Beiträge: 252 Registriert: 29.05.2008 AutoCAD/Mechanical 2009, Inventor 2009
|
erstellt am: 13. Mrz. 2009 07:56 <-- editieren / zitieren --> Unities abgeben:
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 / zitieren -->
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
Beiträge: 252 Registriert: 29.05.2008 AutoCAD/Mechanical 2009, Inventor 2009
|
erstellt am: 15. Apr. 2010 08:52 <-- editieren / zitieren --> Unities abgeben:
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 eInvalidInputHier 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 LayoutDim 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 >>)
|